667 Commits
Author SHA1 Message Date
zeekayandHanzo Dev e0c8182042 store: shards may keep their rows on a shared SQL server
TASKSD_STORE=sql keeps every shard's rows in one table, tasks_kv, on the
hanzoai/sql server TASKSD_SQL_ADDR names (its ZAP listener), so a process running
the engine keeps nothing on disk and any process can take its place. A shard is
(principal, ns), the same value it always was; its rows are a fileKV in its own
SQLite file or an sqlKV in the table, behind one rows interface. Keys are bytea
compared as bytes, so a scan walks keys in exactly a shard file's order whatever
the server's collation; each value is sealed (AES-256-GCM) under the key a shard
file of the same tenant and namespace derives from the master, bound to its shard
and key, so the server holds only ciphertext. A shared store refuses to open
without a master key.

Copy moves every shard from one manager to another a page at a time, leaves the
destination holding the source's rows and no others, and proves each shard by
count and a SHA-256 over its rows in key order. SQLite stays the default; nothing
changes for a deployment that sets nothing.

Proved against a hanzoai/sql test server: scans equal a file shard's for UTF-8,
DEL and prefix-boundary keys; the server holds no plaintext; a crashed engine
recovers a workflow mid-activity from the table into a fresh data directory, the
activity running exactly once.

Co-authored-by: Hanzo Dev <[email protected]>
2026-10-03 19:03:47 -07:00
zeekayandHanzo Dev b808c06ebc Forward the request target a caller actually named
Hanzo CI/CD / cicd (push) Failing after 7m26s
CI/CD / cicd (push) Failing after 7m27s
An adapted net/http handler was handed a request with an empty
RequestURI, so anything that routes or logs on the target saw "/" and
answered for a path nobody asked for. The pin carries the fix.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-17 05:59:06 -07:00
zeekayandHanzo Dev a5460ed12e Say which method each registration answers
Hanzo CI/CD / cicd (push) Failing after 6m22s
CI/CD / cicd (push) Failing after 6m23s
A registration that is not a typed operation is spelled Raw now, with the method
named, so opting out of the typed model reads as what it is.

The zip this pins also states the wire explicitly, which matters more than the
version gap suggests: JSON semantics follow the toolchain, so the older pin
answered with different bodies than the code was written against once the
builder moved.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-17 04:26:51 -07:00
zeekayandHanzo Dev 435c0eb107 Build on Go 1.27
Hanzo CI/CD / cicd (push) Failing after 5m41s
CI/CD / cicd (push) Failing after 5m42s
1.27 is the released toolchain and the tree already compiles clean on it, so
the go directive names it. Nothing here depends on a 1.27 language feature
yet; this is the floor moving, which is what makes generic methods, the wider
type inference and promoted-field struct literals available to the code that
wants them next.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-16 18:40:12 -07:00
zeekayandHanzo Dev 6b231e7f05 go 1.26.8
One toolchain across the estate. The tree carried 1.26.0, .1, .3, .4 and .5
at once, so which compiler built a binary depended on which repo it came
from.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 23:55:44 -07:00
zeekay 86301446c5 the engine hands a composer a zip app, not a handler
A composer had one way to mount the engine: take HTTPHandler and adapt it,
which puts sixty-odd operations behind one opaque wildcard the composing
router cannot see into. Surface registers them as real routes, so
app.Use(engine.Surface()) puts every address in the composed router and in
every projection that reads it.

Both renderings reach the same functions -- a call in, an answer out --
so the two transports cannot describe one operation differently, and
HTTPHandler is unchanged for callers that have it.

The wire is held by a test rather than by intent.
TestSurfaceAnswersWhatTheMuxAnswers drives the same requests through both
and compares status, body, Content-Type and Location. It replaced a probe
that printed the two answers and asserted nothing, and the first thing it
found was real: http.ServeMux tidies a path with an empty or dot segment
and redirects to the tidied form before matching, so /namespaces//workflows
was a redirect through the mux and a 404 here. The wildcard answers that
redirect now, with the body http.Redirect writes and only for the methods
it writes one for.
2026-08-25 13:19:08 -07:00
zeekayandHanzo Dev cdca774661 One derived key, no wrapping
tasks generated a DEK per shard, wrapped it under a KEK derived from the
master, and stored the wrapped blob beside the database — so it also needed an
upgrade path to rewrap, a principal vocabulary to derive against, and tests
for all of it. hanzoai/cek derives the key from the master and the namespace
instead. Nothing is stored, so there is nothing to wrap, rewrap, or upgrade.

dek.go, principal.go and upgrade.go are gone with the tests that pinned them:
they proved properties of a scheme that no longer exists, not properties the
store still has to hold.

That also unpins hanzoai/sqlite, which deleted the DEK API in v0.5.0. tasks
now builds against it, which is what proves the migration is complete rather
than merely compiling.

Databases written under the old scheme will not open under the new
derivation. There are no customers and no data to preserve.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-02 09:45:33 -07:00
zeekayandHanzo Dev e6989b9dc4 deps: platform authority is membership of the reserved org (authz v1.10.29)
PlatformSudo read the HOME org, so every real operator was denied: an operator is
anchored in a brand org where they bill and do ordinary work, and holds the
reserved org as a further membership. The anchor and the authority are different
questions.

This is what made the reserved org unreachable in practice — nobody could cut a
release or reach an admin surface — while the predicate read as though it were
working.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 17:14:56 -07:00
zeekayandHanzo Dev 4cd9de6fed tasks: the namespace org comes from the subject's membership, not the app's
authz v1.10.26: the `owner` claim carries the org of the APPLICATION a token was
minted through, so reading it as the subject's org made a person's durable state —
engine.As(Org(...)) scopes the store by it — follow whichever app they signed in
through. It is the first entry of the signed membership set now.

A token stating no org gets none, with no fallback, so tasksd refuses it when
identity is required rather than scoping a namespace to an app-selected value.

Also edge.Inject→Apply and edge.Mint→Render: minting is issuing authority and only
IAM does that.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 10:34:02 -07:00
zeekayandHanzo Dev e3636baf8e tasks: the trusted issuer is a set, and an empty entry is not one
TASKSD_WHITELABEL_ISSUERS adds the brands this tasksd accepts tokens from beyond
the primary, each of which signs its own. Adding one is configuration.

The sharp edge is the empty entry: splitting an UNSET env var yields one empty
string, and an empty trusted issuer would match a token that carries no `iss` at
all. Entries are trimmed and dropped, pinned by
TestIssuerAllowlistDropsEmptyEntries — which builds the verifier through the same
code path production uses, so the guard is tested where it runs rather than in
isolation.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 05:20:14 -07:00
zeekayandHanzo Dev f927109617 tasks: retire the fourth reader of one contract
pkg/auth held 190 lines of JWKS cache and JWT verification — a fourth independent
reading of what an IAM token means — and it had two defects the shared reader does
not:

  it verified against EVERY key in the published set and took the first that
  worked, so a token naming kid A was accepted on a signature from key B. Naming a
  key is what `kid` is for.

  its issuer comparison was CONDITIONAL on the configured issuer being non-empty,
  so an unset TASKSD_JWT_ISSUER did not fail closed — it accepted tokens from any
  issuer.

It also stripped only the four names it reads. Every other minted header —
X-User-IsAdmin and X-User-Permissions (the platform and money signals),
X-User-Owner, X-Billing-Account-Id, X-Scope, X-Workspace-Id, and the retired names
— passed through from the client untouched. tasksd terminates identity itself (its
ingress routes straight to the Service), so nothing upstream was deleting them
either. Restoring the four-name strip turns
TestRequireIdentity_StripsTheWholeEstateSet red on seven forged headers.

And it had NO machine predicate at all, so an admin-org client_credentials token
arrived as a person. It now reads the membership set, like the rest of the estate.

What remains is the part that is genuinely tasksd's: which environment variables
the policy comes from. The audience stays optional and that is deliberate rather
than an oversight — IAM sets `aud` to the requesting CLIENT (RFC 8707), and tasksd
is not a client id, so it pins the issuer and the signing keys instead.

Both transports now answer "which org does this act in" with the same function,
Claims.EffectiveOrg(""), rather than the HTTP path reading `owner` and the ZAP path
reading it separately.

Cost, measured: 342 linked packages and an 18.3 MB binary, DOWN from 345 and
18.6 MB — dropping go-jose more than paid for the leaf, and tasks links ZERO zip
packages because the edge names no transport. go-jose is gone from the module
entirely; the tests now mint with golang-jwt, the library IAM signs with.

Rebased onto 12 upstream commits: kept their ServeGated(addr string) signature,
their engine.As(Org(...)) rename, their dependency versions, and the LLM.md fact
about explicit project/user isolation. Their only change to the deleted jwt.go was
a comment naming hanzo.id, which the replacement already says.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 05:14:00 -07:00
zeekayandHanzo Dev 1555bd8f5a deps: pin zap v1.2.7
Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 19:43:15 -07:00
zeekayandHanzo Dev 679ae61163 feat(transport): address the engine and the SDK, so both can use a socket
The engine took a PORT and the SDK an Options.HostPort, so neither end
could use a unix socket for traffic that never leaves the host. The
field name was not the only obstacle: luxfi/zap bound net.Listen("tcp",
":port") and reached a peer with net.DialTimeout("tcp", addr), so a path
was refused at the dialer with "missing port in address" and could not
be bound at all. That is fixed upstream (luxfi/zap Address + Network);
this pins the commit until it is tagged.

EmbedConfig.Address, Embedded.Address, ServeGated(addr) and
client.Options.Address each take ONE address, because a port is a detail
of one transport rather than a thing every listener has. A path binds or
dials a unix socket; anything else is host:port.

TestDialRequiresHostPort became TestDialRequiresAddress: Dial needs an
address, and asserts a socket path is refused for being absent rather
than for being portless. TestE2E_UnixSocket runs a real workflow over a
socket end to end, and TestE2E_UnixSocketRebind proves the socket is
unlinked on stop so a restart binds cleanly.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 16:27:19 -07:00
zeekayandHanzo Dev b4529923c1 feat(store): principal-addressed shards, created on demand, encrypted at rest
The store addressed a shard by (org, namespace) and only the root org's
`default` namespace existed, so anything else had to be declared before
it could be used and there was no way to isolate a project or a user.
Shards also had no way to be keyed, so tasks was the one Hanzo store
writing tenant state in the clear.

Both are the same missing value, so both are one change.

Principal is the tenant that owns a shard: an org, optionally narrowed
to a project and a user. It serves the two places tenancy is decided, so
they cannot disagree — the shard's directory
(<data>/<org>/<project>/<user>/<ns>.db, each unset leg written "_") and
the key its DEK is wrapped under. The fixed-depth encoding is injective,
so a project and a user of the same name are different tenants, and the
KEK chain master -> org -> project -> user gives each of them a key
contained in the one it narrows.

Namespaces come into existence on first use (engine.namespace), the way
their shards already did. ValidName is the one rule every name that
becomes a path segment passes through, so a namespace can no longer
escape or alias a directory.

EmbedConfig.MasterKey opens every shard encrypted: each file carries a
DEK of its own, wrapped for its principal and bound to a random file id
in a sidecar beside it, so rotating the master rewraps sidecars and
never rewrites ciphertext, and moving the data directory is harmless.
A keyed shard is ciphertext on every build — hanzoai/sqlite v0.4.0 uses
the live libsqlcipher codec when one is linked and its pure-Go SQLCipher
envelope when one is not — so there is nothing here to branch on. On the
envelope a shard is sealed at checkpoint/close rather than per commit,
which is what Shard.Checkpoint and the manager's sweep bound.

replication.Frame and migration.Job carry the canonical principal string
instead of an org, so a frame lands in the directory its principal names.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 16:16:39 -07:00
zeekayandHanzo Dev 2de84d773e chore(go): bump go directive to 1.26.5
Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 16:17:27 -07:00
zeekay 706aeb7411 refactor(replication): move quasar driver to its own package (base sheds consensus)
hanzoai/base transitively pulled github.com/luxfi/consensus solely through
pkg/tasks → replication (quasar.go, the only consensus importer). That made
base — and every base consumer — vulnerable to the recurring luxfi/consensus
force-moved-tag / vanished-geth supply-chain rot, for a driver base never uses.

Make Quasar replication optional by isolating it:
- Add Kind() + a unified Stats(accepted,rejected,timeouts) to the Replicator
  interface so embed.go introspects drivers through the interface, never a
  concrete type.
- Move quasar.go (+ its test) into a new pkg/tasks/replication/quasar package
  that imports the interface package; the consensus dependency now lives ONLY
  there. Only cmd/tasksd imports it.
- pkg/tasks → replication now has ZERO consensus in its dep graph
  (`go list -deps ./pkg/tasks | grep consensus` = 0), so base sheds it via Go
  1.17+ module-graph pruning.

Also unbreak tasks' own consensus: v1.22.85 → v1.36.3 (geth v1.16.73 was a
vanished revision; v1.36.3 floors the valid unified luxfi stack). Non-quasar
packages build + test green CGO-off; the quasar package builds in CI (its
consensus→secp256k1 CGO can't compile in this sandbox — environmental).
2026-07-17 16:36:18 -07:00
6f6a6460ab chore(tasks): rip all gRPC + protobuf — ZAP-native only (HIP-0114) (#12)
Complete the documented 2026-04-26 native-ZAP migration whose deletion
was left incomplete. The engine (cmd/tasksd), SDK (pkg/sdk) and
in-process server (pkg/tasks) are already 100% ZAP-native with zero
real go.temporal.io / google.golang.org/grpc / protobuf imports; the
only residual gRPC+Temporal footprint was dead porting scaffolding:

- rm proto/ — 55 vendored Temporal .proto (4 gRPC service defs +
  message shapes), zero generated .pb.go, zero Go references.
- rm cmd/tools/ — 4 Temporal-porting tools (genrpcwrappers,
  genroutingkeyextractor, getproto, check-dependencies); the only
  files importing google.golang.org/grpc + go.temporal.io/{api,server}.
- go mod tidy — drops go.temporal.io/api, go.temporal.io/server,
  google.golang.org/grpc, grpc-gateway entirely (zero grpc/protobuf
  direct or transitive in go.mod).
- CI: remove orphaned proto jobs (linters.yml lint-protos/lint-api,
  check-release-dependencies.yml) that ran deleted tools / missing
  make targets.
- LLM.md: scrub stale gRPC transport claims -> ZAP :9999 / HTTP :7243.

Transport is luxfi/zap on :9999. go build ./... , go vet, go test all green.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-07 16:42:41 -07:00
zeekay 48beecff40 feat(tasks): embeddable identity + single sqlite driver for in-proc mount
Enables mounting the Tasks server natively inside the unified hanzoai/cloud
binary (HIP-0106) without a JWT re-validation hop or a duplicate sqlite driver.

- auth.WithIdentity injects an already-validated identity (org/user/email)
  into the handler context — the in-process twin of RequireIdentity's mint
  step, for an embedder that terminates the IAM trust boundary at its gateway
  before the request reaches Tasks.
- store opens through github.com/hanzoai/sqlite (the one Hanzo sqlite driver)
  instead of blank-importing modernc directly, so a Tasks store embedded in
  the cloud binary shares the single "sqlite" driver registration rather than
  double-registering it and panicking at init. WAL/pragmas move to explicit
  schemaSQL so they apply on both cgo and !cgo backends.
2026-07-03 15:49:58 -07:00
zeekayandHanzo Dev cc7a80f1cd deps: pin go.temporal.io/server v1.32.0-157.0 (fork base); finish temporal-fork rip; ui/dist embed placeholder
Co-authored-by: Hanzo Dev <[email protected]>
2026-06-30 16:10:51 -07:00
zeekay 4fcc600c64 chore: bump luxfi/database v1.19.3 2026-06-25 13:10:32 -07:00
zeekay ec931d13dd build(deps): drop dead zap-proto/go dependency
The require github.com/zap-proto/go v1.0.0-rc1 had zero imports in the
module (no .go file references it). Removed from go.mod and go.sum.
2026-06-21 01:26:59 -07:00
zeekay 8473a2c8ca deps: bump Go to 1.26.4 across go.mod, Dockerfiles, GH Actions
Workspace-wide sync. luxfi/node already shipped on 1.26.4 in v1.30.6
(commit 121aca1fa9); this is the cross-repo catch-up.
2026-06-07 12:12:47 -07:00
zeekay 279dc75477 deps: bump github.com/zap-proto/go to v1.0.0-rc1
Canonical bootstrap (commit f123708 series). Replaces the v0.2.x
prototype lineage with the v1.x runtime.
2026-06-07 11:29:26 -07:00
zeekay 6b89892286 merge: upstream/main (preserve Hanzo brand, 494 commits)
# Conflicts:
#	.github/workflows/build-and-publish.yml
#	AGENTS.md
#	AGENTS.md~upstream_main
#	api/adminservice/v1/request_response.go-helpers.pb.go
#	api/adminservice/v1/request_response.pb.go
#	api/adminservice/v1/service.pb.go
#	api/adminservice/v1/service_grpc.pb.go
#	api/adminservicemock/v1/service_grpc.pb.mock.go
#	api/archiver/v1/message.pb.go
#	api/batch/v1/request_response.pb.go
#	api/checksum/v1/message.pb.go
#	api/deployment/v1/message.go-helpers.pb.go
#	api/deployment/v1/message.pb.go
#	api/enums/v1/replication.go-helpers.pb.go
#	api/enums/v1/replication.pb.go
#	api/enums/v1/task.go-helpers.pb.go
#	api/enums/v1/task.pb.go
#	api/errordetails/v1/message.go-helpers.pb.go
#	api/errordetails/v1/message.pb.go
#	api/historyservice/v1/request_response.go-helpers.pb.go
#	api/historyservice/v1/request_response.pb.go
#	api/historyservice/v1/service.pb.go
#	api/historyservice/v1/service_grpc.pb.go
#	api/historyservicemock/v1/service_grpc.pb.mock.go
#	api/matchingservice/v1/request_response.pb.go
#	api/matchingservice/v1/service.pb.go
#	api/persistence/v1/chasm.pb.go
#	api/persistence/v1/executions.go-helpers.pb.go
#	api/persistence/v1/executions.pb.go
#	api/persistence/v1/workflow_mutable_state.pb.go
#	api/replication/v1/message.pb.go
#	api/routing/v1/extension.pb.go
#	api/schedule/v1/message.pb.go
#	api/taskqueue/v1/message.go-helpers.pb.go
#	api/taskqueue/v1/message.pb.go
#	chasm/component.go
#	chasm/component_mock.go
#	chasm/context.go
#	chasm/context_mock.go
#	chasm/engine.go
#	chasm/engine_mock.go
#	chasm/field.go
#	chasm/field_test.go
#	chasm/lib/activity/activity.go
#	chasm/lib/activity/activity_tasks.go
#	chasm/lib/activity/activity_test.go
#	chasm/lib/activity/config.go
#	chasm/lib/activity/frontend.go
#	chasm/lib/activity/fx.go
#	chasm/lib/activity/gen/activitypb/v1/activity_state.pb.go
#	chasm/lib/activity/gen/activitypb/v1/request_response.go-helpers.pb.go
#	chasm/lib/activity/gen/activitypb/v1/request_response.pb.go
#	chasm/lib/activity/gen/activitypb/v1/service.pb.go
#	chasm/lib/activity/gen/activitypb/v1/service_client.pb.go
#	chasm/lib/activity/gen/activitypb/v1/service_grpc.pb.go
#	chasm/lib/activity/handler.go
#	chasm/lib/activity/library.go
#	chasm/lib/activity/proto/v1/activity_state.proto
#	chasm/lib/activity/proto/v1/request_response.proto
#	chasm/lib/activity/proto/v1/service.proto
#	chasm/lib/activity/proto/v1/tasks.proto
#	chasm/lib/activity/statemachine.go
#	chasm/lib/activity/statemachine_test.go
#	chasm/lib/activity/validator.go
#	chasm/lib/activity/validator_test.go
#	chasm/lib/buf.yaml
#	chasm/lib/callback/component.go
#	chasm/lib/callback/config.go
#	chasm/lib/callback/fx.go
#	chasm/lib/callback/invocable_internal.go
#	chasm/lib/callback/invocable_outbound.go
#	chasm/lib/callback/library.go
#	chasm/lib/callback/proto/v1/message.proto
#	chasm/lib/callback/proto/v1/tasks.proto
#	chasm/lib/callback/request.go
#	chasm/lib/callback/request_test.go
#	chasm/lib/callback/tasks.go
#	chasm/lib/callback/tasks_test.go
#	chasm/lib/nexusoperation/cancellation.go
#	chasm/lib/nexusoperation/cancellation_statemachine.go
#	chasm/lib/nexusoperation/config.go
#	chasm/lib/nexusoperation/fx.go
#	chasm/lib/nexusoperation/gen/nexusoperationpb/v1/operation.go-helpers.pb.go
#	chasm/lib/nexusoperation/gen/nexusoperationpb/v1/operation.pb.go
#	chasm/lib/nexusoperation/gen/nexusoperationpb/v1/tasks.go-helpers.pb.go
#	chasm/lib/nexusoperation/gen/nexusoperationpb/v1/tasks.pb.go
#	chasm/lib/nexusoperation/library.go
#	chasm/lib/nexusoperation/metrics.go
#	chasm/lib/nexusoperation/operation.go
#	chasm/lib/nexusoperation/operation_statemachine.go
#	chasm/lib/nexusoperation/proto/v1/operation.proto
#	chasm/lib/nexusoperation/proto/v1/tasks.proto
#	chasm/lib/scheduler/backfiller.go
#	chasm/lib/scheduler/backfiller_tasks.go
#	chasm/lib/scheduler/backfiller_tasks_test.go
#	chasm/lib/scheduler/config.go
#	chasm/lib/scheduler/export_test.go
#	chasm/lib/scheduler/fx.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/message.go-helpers.pb.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/message.pb.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/request_response.go-helpers.pb.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/request_response.pb.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/service.pb.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/service_client.pb.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/service_grpc.pb.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/tasks.go-helpers.pb.go
#	chasm/lib/scheduler/gen/schedulerpb/v1/tasks.pb.go
#	chasm/lib/scheduler/generator.go
#	chasm/lib/scheduler/generator_tasks.go
#	chasm/lib/scheduler/generator_tasks_test.go
#	chasm/lib/scheduler/handler.go
#	chasm/lib/scheduler/handler_test.go
#	chasm/lib/scheduler/helper_test.go
#	chasm/lib/scheduler/invoker.go
#	chasm/lib/scheduler/invoker_execute_task_test.go
#	chasm/lib/scheduler/invoker_process_buffer_task_test.go
#	chasm/lib/scheduler/invoker_tasks.go
#	chasm/lib/scheduler/library.go
#	chasm/lib/scheduler/migration/migration.go
#	chasm/lib/scheduler/migration/migration_test.go
#	chasm/lib/scheduler/proto/v1/message.proto
#	chasm/lib/scheduler/proto/v1/request_response.proto
#	chasm/lib/scheduler/proto/v1/service.proto
#	chasm/lib/scheduler/proto/v1/tasks.proto
#	chasm/lib/scheduler/scheduler.go
#	chasm/lib/scheduler/scheduler_idle_tasks_test.go
#	chasm/lib/scheduler/scheduler_tasks.go
#	chasm/lib/scheduler/scheduler_test.go
#	chasm/lib/scheduler/spec_processor.go
#	chasm/lib/tests/gen/testspb/v1/service.pb.go
#	chasm/lib/tests/handler.go
#	chasm/lib/tests/library.go
#	chasm/lib/tests/payload.go
#	chasm/lib/tests/proto/v1/message.proto
#	chasm/lib/tests/proto/v1/request_response.proto
#	chasm/lib/tests/proto/v1/service.proto
#	chasm/lib/tests/tasks.go
#	chasm/lib/workflow/fx.go
#	chasm/lib/workflow/library.go
#	chasm/lib/workflow/workflow.go
#	chasm/library_core.go
#	chasm/ms_pointer.go
#	chasm/nexus_operation_processor.go
#	chasm/node_backend_mock.go
#	chasm/ref.go
#	chasm/ref_test.go
#	chasm/registrable_component.go
#	chasm/registrable_task.go
#	chasm/registry.go
#	chasm/registry_test.go
#	chasm/search_attribute.go
#	chasm/search_attribute_test.go
#	chasm/statemachine.go
#	chasm/task.go
#	chasm/task_mock.go
#	chasm/test_component_test.go
#	chasm/test_library_test.go
#	chasm/test_task_test.go
#	chasm/test_var_test.go
#	chasm/tree.go
#	chasm/tree_test.go
#	chasm/visibility.go
#	chasm/visibility_manager.go
#	chasm/visibility_manager_mock.go
#	chasm/visibility_test.go
#	chasm/visibility_value.go
#	chasm/visibility_value_test.go
#	chasm/workflow.go
#	client/admin/client_gen.go
#	client/admin/metric_client.go
#	client/admin/metric_client_gen.go
#	client/admin/retryable_client_gen.go
#	client/frontend/client_gen.go
#	client/frontend/metric_client.go
#	client/frontend/metric_client_gen.go
#	client/frontend/retryable_client_gen.go
#	client/history/client_gen.go
#	client/history/metric_client.go
#	client/history/metric_client_gen.go
#	client/history/retryable_client_gen.go
#	client/matching/README.md
#	client/matching/client.go
#	client/matching/client_gen.go
#	client/matching/loadbalancer.go
#	client/matching/metric_client.go
#	client/matching/metric_client_gen.go
#	cmd/tools/genrpcwrappers/main.go
#	cmd/tools/getproto/files.go
#	cmd/tools/getproto/main.go
#	common/api/metadata.go
#	common/archiver/README.md
#	common/archiver/gcloud/connector/client.go
#	common/archiver/provider/provider.go
#	common/archiver/provider/provider_mock.go
#	common/archiver/s3store/history_archiver.go
#	common/archiver/s3store/history_archiver_test.go
#	common/archiver/s3store/mocks/generate.go
#	common/archiver/s3store/mocks/s3api.go
#	common/archiver/s3store/util.go
#	common/archiver/s3store/visibility_archiver.go
#	common/archiver/s3store/visibility_archiver_test.go
#	common/authorization/authorizer.go
#	common/authorization/claim_mapper.go
#	common/authorization/default_authorizer.go
#	common/authorization/default_jwt_claim_mapper.go
#	common/authorization/default_token_key_provider.go
#	common/authorization/interceptor.go
#	common/authorization/interceptor_test.go
#	common/authorization/roles.go
#	common/cluster/metadata.go
#	common/cluster/metadata_test.go
#	common/config/config.go
#	common/config/config_template_embedded.yaml
#	common/config/persistence.go
#	common/config/persistence_test.go
#	common/constants.go
#	common/contextutil/metadata.go
#	common/contextutil/metadata_test.go
#	common/dynamicconfig/constants.go
#	common/dynamicconfig/shared_constants.go
#	common/enums/defaults.go
#	common/headers/caller_info.go
#	common/headers/headers.go
#	common/headers/version_checker.go
#	common/log/tag/values.go
#	common/log/zap_logger.go
#	common/membership/ringpop/factory.go
#	common/membership/ringpop/monitor.go
#	common/membership/ringpop/service_resolver.go
#	common/membership/ringpop/test_cluster.go
#	common/metrics/config.go
#	common/metrics/metric_defs.go
#	common/metrics/tags.go
#	common/metrics/tally_metrics_handler.go
#	common/metrics/tally_metrics_handler_test.go
#	common/metrics/task_queues.go
#	common/namespace/namespace.go
#	common/namespace/nsregistry/registry.go
#	common/namespace/nsregistry/registry_test.go
#	common/namespace/nsregistry/registry_watch_test.go
#	common/namespace/nsreplication/replication_task_executor.go
#	common/namespace/nsreplication/replication_task_executor_test.go
#	common/namespace/nsreplication/transmission_task_handler.go
#	common/namespace/nsreplication/transmission_task_handler_test.go
#	common/namespace/registry.go
#	common/namespace/registry_mock.go
#	common/namespace/replication_resolver.go
#	common/namespace/replication_resolver_test.go
#	common/nexus/callback_token.go
#	common/nexus/endpoint_registry.go
#	common/nexus/endpoint_registry_test.go
#	common/nexus/failure.go
#	common/nexus/failure_test.go
#	common/nexus/link_converter.go
#	common/nexus/link_converter_test.go
#	common/nexus/nexustest/server.go
#	common/nexus/payload_serializer.go
#	common/nexus/payload_serializer_test.go
#	common/payload/payload.go
#	common/payload/payload_test.go
#	common/payloads/payloads.go
#	common/persistence/cassandra/matching_task_store_queue.go
#	common/persistence/cassandra/matching_task_store_user_data.go
#	common/persistence/cassandra/matching_task_store_v1.go
#	common/persistence/cassandra/matching_task_store_v2.go
#	common/persistence/cassandra/queue_v2_store.go
#	common/persistence/data_interfaces.go
#	common/persistence/faultinjection/cluster_metadata_store_gen.go
#	common/persistence/faultinjection/data_store_factory.go
#	common/persistence/faultinjection/execution_store_gen.go
#	common/persistence/faultinjection/fault_generator.go
#	common/persistence/faultinjection/gowrap_template
#	common/persistence/faultinjection/metadata_store_gen.go
#	common/persistence/faultinjection/method_fault_generator.go
#	common/persistence/faultinjection/nexus_endpoint_store_gen.go
#	common/persistence/faultinjection/queue_gen.go
#	common/persistence/faultinjection/queue_v2_gen.go
#	common/persistence/faultinjection/shard_store_gen.go
#	common/persistence/faultinjection/store_fault_generator.go
#	common/persistence/faultinjection/task_store_gen.go
#	common/persistence/persistence_interface.go
#	common/persistence/persistencetest/queues.go
#	common/persistence/persistencetest/queues_test.go
#	common/persistence/serialization/codec.go
#	common/persistence/serialization/codec_test.go
#	common/persistence/serialization/serializer.go
#	common/persistence/serialization/task_serializers.go
#	common/persistence/serialization/task_serializers_test.go
#	common/persistence/sql/sqlplugin/mysql/session/session.go
#	common/persistence/sql/sqlplugin/mysql/visibility.go
#	common/persistence/sql/sqlplugin/postgresql/driver/interface.go
#	common/persistence/sql/sqlplugin/postgresql/driver/pgx.go
#	common/persistence/sql/sqlplugin/postgresql/driver/pq.go
#	common/persistence/sql/sqlplugin/postgresql/plugin.go
#	common/persistence/sql/sqlplugin/postgresql/session/session.go
#	common/persistence/sql/sqlplugin/sqlite/driver.go
#	common/persistence/sql/sqlplugin/sqlite/plugin.go
#	common/persistence/task_manager.go
#	common/persistence/tests/postgresql_test.go
#	common/persistence/tests/postgresql_test_util.go
#	common/persistence/tests/util.go
#	common/persistence/tests/visibility_persistence_suite.go
#	common/persistence/visibility/chasm_visibility_manager.go
#	common/persistence/visibility/chasm_visibility_manager_test.go
#	common/persistence/visibility/manager/visibility_manager.go
#	common/persistence/visibility/manager/visibility_manager_mock.go
#	common/persistence/visibility/store/elasticsearch/client/aws.go
#	common/persistence/visibility/store/elasticsearch/query_interceptors.go
#	common/persistence/visibility/store/elasticsearch/query_interceptors_test.go
#	common/persistence/visibility/store/elasticsearch/visibility_store.go
#	common/persistence/visibility/store/elasticsearch/visibility_store_read_test.go
#	common/persistence/visibility/store/query/converter.go
#	common/persistence/visibility/store/query/converter_test.go
#	common/persistence/visibility/store/sql/query_converter_legacy.go
#	common/persistence/visibility/store/sql/query_converter_legacy_test.go
#	common/persistence/visibility/store/sql/visibility_store.go
#	common/persistence/visibility/store/util.go
#	common/persistence/visibility/store/visibility_store.go
#	common/persistence/visibility/store/visibility_store_mock.go
#	common/persistence/visibility/visibility_manager_dual.go
#	common/persistence/visibility/visibility_manager_impl.go
#	common/persistence/visibility/visibility_manager_rate_limited.go
#	common/persistence/visibility/visiblity_manager_metrics.go
#	common/primitives/task_queues.go
#	common/quotas/clocked_rate_limiter.go
#	common/quotas/dynamic_rate_limiter_impl.go
#	common/quotas/priority_rate_limiter_impl.go
#	common/quotas/rate_burst.go
#	common/resource/fx.go
#	common/rpc/encryption/fixedTLSConfigProvider.go
#	common/rpc/encryption/local_store_tls_provider.go
#	common/rpc/encryption/tls_config_test.go
#	common/rpc/interceptor/dc_redirection_policy.go
#	common/rpc/interceptor/health_check.go
#	common/rpc/interceptor/logtags/admin_service_server_gen.go
#	common/rpc/interceptor/logtags/history_service_server_gen.go
#	common/rpc/interceptor/logtags/workflow_service_server_gen.go
#	common/rpc/interceptor/namespace_handover.go
#	common/rpc/interceptor/namespace_rate_limit.go
#	common/rpc/interceptor/namespace_validator.go
#	common/rpc/interceptor/namespace_validator_test.go
#	common/rpc/interceptor/rate_limit.go
#	common/rpc/interceptor/redirection.go
#	common/rpc/interceptor/redirection_test.go
#	common/rpc/interceptor/request_error_handler.go
#	common/rpc/interceptor/routing_key_interceptor_test.go
#	common/rpc/interceptor/service_error_interceptor.go
#	common/rpc/interceptor/service_error_interceptor_test.go
#	common/rpc/rpc.go
#	common/rpc/test/http_test.go
#	common/rpc/test/rpc_localstore_tls_test.go
#	common/searchattribute/encode.go
#	common/searchattribute/encode_test.go
#	common/searchattribute/manager.go
#	common/searchattribute/mapper.go
#	common/searchattribute/mapper_test.go
#	common/searchattribute/name_type_map.go
#	common/searchattribute/name_type_map_test.go
#	common/searchattribute/sadefs/encode_value.go
#	common/searchattribute/sadefs/encode_value_test.go
#	common/searchattribute/sadefs/util.go
#	common/searchattribute/search_attirbute.go
#	common/searchattribute/stringify.go
#	common/searchattribute/stringify_test.go
#	common/searchattribute/system_provider.go
#	common/searchattribute/test_provider.go
#	common/searchattribute/validator.go
#	common/serviceerror/convert.go
#	common/tasks/interleaved_weighted_round_robin_test.go
#	common/testing/historyrequire/history_require.go
#	common/testing/mockapi/workflowservicemock/v1/service_grpc.pb.mock.go
#	common/testing/mocksdk/client_mock.go
#	common/testing/protorequire/require.go
#	common/testing/testhooks/hooks.go
#	common/testing/testhooks/test_impl.go
#	common/testing/testlogger/testlogger.go
#	common/testing/testvars/test_vars.go
#	common/tqid/task_queue_id.go
#	common/tqid/task_queue_id_test.go
#	common/tqid/task_queue_validator.go
#	common/util/util.go
#	common/util/wildcard.go
#	common/worker_versioning/version_membership_cache.go
#	common/worker_versioning/worker_versioning.go
#	common/worker_versioning/worker_versioning_test.go
#	components/callbacks/config.go
#	components/callbacks/config_test.go
#	components/callbacks/request.go
#	components/callbacks/request_test.go
#	components/nexusoperations/config.go
#	components/nexusoperations/executors_test.go
#	components/nexusoperations/fx.go
#	components/nexusoperations/workflow/commands.go
#	components/nexusoperations/workflow/commands_test.go
#	config/development-cluster-a.yaml
#	config/development-cluster-b.yaml
#	config/development-cluster-c.yaml
#	config/dynamicconfig/development-cass.yaml
#	config/dynamicconfig/development-sql.yaml
#	config/dynamicconfig/development-xdc.yaml
#	develop/docker-compose/docker-compose.yml
#	develop/docker-compose/grafana/provisioning/tempo/tempo.yaml
#	develop/github/docker-compose.yml
#	docker/docker-bake.hcl
#	docker/targets/admin-tools.Dockerfile
#	docker/targets/server.Dockerfile
#	docs/Makefile
#	docs/_assets/matching-context.d2
#	docs/_assets/retries.d2
#	docs/architecture/chasm.md
#	docs/architecture/nexus.md
#	docs/development/macos/cassandra.md
#	docs/development/testing.md
#	proto/internal/buf.yaml
#	proto/internal/temporal/server/api/adminservice/v1/request_response.proto
#	proto/internal/temporal/server/api/adminservice/v1/service.proto
#	proto/internal/temporal/server/api/archiver/v1/message.proto
#	proto/internal/temporal/server/api/batch/v1/request_response.proto
#	proto/internal/temporal/server/api/checksum/v1/message.proto
#	proto/internal/temporal/server/api/cli/v1/message.proto
#	proto/internal/temporal/server/api/clock/v1/message.proto
#	proto/internal/temporal/server/api/cluster/v1/message.proto
#	proto/internal/temporal/server/api/common/v1/api_category.proto
#	proto/internal/temporal/server/api/common/v1/dlq.proto
#	proto/internal/temporal/server/api/deployment/v1/message.proto
#	proto/internal/temporal/server/api/enums/v1/cluster.proto
#	proto/internal/temporal/server/api/enums/v1/common.proto
#	proto/internal/temporal/server/api/enums/v1/fairness_state.proto
#	proto/internal/temporal/server/api/enums/v1/nexus.proto
#	proto/internal/temporal/server/api/enums/v1/predicate.proto
#	proto/internal/temporal/server/api/enums/v1/replication.proto
#	proto/internal/temporal/server/api/enums/v1/task.proto
#	proto/internal/temporal/server/api/enums/v1/workflow.proto
#	proto/internal/temporal/server/api/enums/v1/workflow_task_type.proto
#	proto/internal/temporal/server/api/errordetails/v1/message.proto
#	proto/internal/temporal/server/api/health/v1/message.proto
#	proto/internal/temporal/server/api/history/v1/message.proto
#	proto/internal/temporal/server/api/historyservice/v1/request_response.proto
#	proto/internal/temporal/server/api/historyservice/v1/service.proto
#	proto/internal/temporal/server/api/matchingservice/v1/request_response.proto
#	proto/internal/temporal/server/api/matchingservice/v1/service.proto
#	proto/internal/temporal/server/api/metrics/v1/message.proto
#	proto/internal/temporal/server/api/namespace/v1/message.proto
#	proto/internal/temporal/server/api/persistence/v1/chasm.proto
#	proto/internal/temporal/server/api/persistence/v1/chasm_visibility.proto
#	proto/internal/temporal/server/api/persistence/v1/cluster_metadata.proto
#	proto/internal/temporal/server/api/persistence/v1/executions.proto
#	proto/internal/temporal/server/api/persistence/v1/history_tree.proto
#	proto/internal/temporal/server/api/persistence/v1/hsm.proto
#	proto/internal/temporal/server/api/persistence/v1/namespaces.proto
#	proto/internal/temporal/server/api/persistence/v1/nexus.proto
#	proto/internal/temporal/server/api/persistence/v1/predicates.proto
#	proto/internal/temporal/server/api/persistence/v1/queue_metadata.proto
#	proto/internal/temporal/server/api/persistence/v1/queues.proto
#	proto/internal/temporal/server/api/persistence/v1/task_queues.proto
#	proto/internal/temporal/server/api/persistence/v1/tasks.proto
#	proto/internal/temporal/server/api/persistence/v1/update.proto
#	proto/internal/temporal/server/api/persistence/v1/workflow_mutable_state.proto
#	proto/internal/temporal/server/api/replication/v1/message.proto
#	proto/internal/temporal/server/api/routing/v1/extension.proto
#	proto/internal/temporal/server/api/schedule/v1/message.proto
#	proto/internal/temporal/server/api/taskqueue/v1/message.proto
#	proto/internal/temporal/server/api/testservice/v1/request_response.proto
#	proto/internal/temporal/server/api/testservice/v1/service.proto
#	proto/internal/temporal/server/api/token/v1/message.proto
#	proto/internal/temporal/server/api/workflow/v1/message.proto
#	service/frontend/admin_handler.go
#	service/frontend/admin_handler_test.go
#	service/frontend/configs/quotas.go
#	service/frontend/configs/quotas_test.go
#	service/frontend/errors.go
#	service/frontend/fx.go
#	service/frontend/fx_test.go
#	service/frontend/health_check_test.go
#	service/frontend/namespace_handler.go
#	service/frontend/namespace_handler_test.go
#	service/frontend/nexus_completion_http_handler.go
#	service/frontend/nexus_handler.go
#	service/frontend/nexus_handler_test.go
#	service/frontend/nexus_operation_http_handler.go
#	service/frontend/nexus_operation_http_handler_test.go
#	service/frontend/operator_handler.go
#	service/frontend/operator_handler_test.go
#	service/frontend/service.go
#	service/frontend/workflow_handler.go
#	service/frontend/workflow_handler_second_test.go
#	service/frontend/workflow_handler_test.go
#	service/fx.go
#	service/history/api/command_attr_validator.go
#	service/history/api/command_attr_validator_test.go
#	service/history/api/create_workflow_util.go
#	service/history/api/describeworkflow/api.go
#	service/history/api/get_workflow_util.go
#	service/history/api/multioperation/api.go
#	service/history/api/namespace.go
#	service/history/api/pauseactivity/api.go
#	service/history/api/pollupdate/api_test.go
#	service/history/api/queryworkflow/api.go
#	service/history/api/recordactivitytaskstarted/api.go
#	service/history/api/recordactivitytaskstarted/api_test.go
#	service/history/api/recordworkflowtaskstarted/api.go
#	service/history/api/removesignalmutablestate/api.go
#	service/history/api/resetactivity/api.go
#	service/history/api/resetworkflow/api.go
#	service/history/api/respondactivitytaskcanceled/api.go
#	service/history/api/respondactivitytaskcompleted/api.go
#	service/history/api/respondactivitytaskfailed/api.go
#	service/history/api/respondactivitytaskfailed/api_test.go
#	service/history/api/respondworkflowtaskcompleted/api.go
#	service/history/api/respondworkflowtaskcompleted/api_test.go
#	service/history/api/respondworkflowtaskcompleted/workflow_task_completed_handler.go
#	service/history/api/respondworkflowtaskcompleted/workflow_task_completed_handler_test.go
#	service/history/api/respondworkflowtaskfailed/api.go
#	service/history/api/signalwithstartworkflow/api.go
#	service/history/api/signalwithstartworkflow/convert.go
#	service/history/api/signalwithstartworkflow/signal_with_start_workflow.go
#	service/history/api/signalwithstartworkflow/signal_with_start_workflow_test.go
#	service/history/api/signalworkflow/api.go
#	service/history/api/startworkflow/api.go
#	service/history/api/unpauseactivity/api.go
#	service/history/api/updateactivityoptions/api.go
#	service/history/api/updateactivityoptions/api_test.go
#	service/history/api/updateworkflow/api.go
#	service/history/api/updateworkflowoptions/api.go
#	service/history/api/updateworkflowoptions/api_test.go
#	service/history/api/verifychildworkflowcompletionrecorded/api.go
#	service/history/api/verifyfirstworkflowtaskscheduled/api_test.go
#	service/history/api/worker_versioning_util.go
#	service/history/api/workflow_id_dedup.go
#	service/history/api/workflow_id_dedup_test.go
#	service/history/archival_queue_factory_test.go
#	service/history/chasm_engine.go
#	service/history/chasm_engine_test.go
#	service/history/chasm_task_util.go
#	service/history/configs/config.go
#	service/history/configs/quotas.go
#	service/history/consts/const.go
#	service/history/deletemanager/delete_manager.go
#	service/history/deletemanager/delete_manager_test.go
#	service/history/fx.go
#	service/history/handler.go
#	service/history/history_engine.go
#	service/history/history_engine2_test.go
#	service/history/history_engine_factory.go
#	service/history/history_engine_test.go
#	service/history/history_test.go
#	service/history/historybuilder/event_factory.go
#	service/history/historybuilder/event_store.go
#	service/history/historybuilder/history_builder.go
#	service/history/historybuilder/history_builder_categorization_test.go
#	service/history/historybuilder/history_builder_test.go
#	service/history/interfaces/chasm_tree.go
#	service/history/interfaces/chasm_tree_mock.go
#	service/history/interfaces/mutable_state.go
#	service/history/interfaces/mutable_state_mock.go
#	service/history/interfaces/shard_context.go
#	service/history/interfaces/shard_context_mock.go
#	service/history/interfaces/workflow_context.go
#	service/history/interfaces/workflow_context_mock.go
#	service/history/ndc/events_reapplier_test.go
#	service/history/ndc/transaction_manager.go
#	service/history/ndc/transaction_manager_existing_workflow.go
#	service/history/ndc/transaction_manager_existing_workflow_test.go
#	service/history/ndc/transaction_manager_new_workflow.go
#	service/history/ndc/transaction_manager_new_workflow_test.go
#	service/history/ndc/workflow.go
#	service/history/ndc/workflow_mock.go
#	service/history/ndc/workflow_resetter.go
#	service/history/ndc/workflow_resetter_test.go
#	service/history/ndc/workflow_state_replicator_test.go
#	service/history/ndc_standby_task_util.go
#	service/history/ndc_task_util.go
#	service/history/outbound_queue_active_task_executor.go
#	service/history/outbound_queue_active_task_executor_test.go
#	service/history/outbound_queue_factory.go
#	service/history/outbound_queue_standby_task_executor.go
#	service/history/outbound_queue_standby_task_executor_test.go
#	service/history/queue_factory_base.go
#	service/history/queue_factory_base_test.go
#	service/history/queues/active_standby_executor.go
#	service/history/queues/active_standby_executor_test.go
#	service/history/queues/dlq_writer.go
#	service/history/queues/dlq_writer_test.go
#	service/history/queues/executable.go
#	service/history/queues/executable_factory.go
#	service/history/queues/executable_mock.go
#	service/history/queues/executable_test.go
#	service/history/queues/grouper.go
#	service/history/queues/metrics.go
#	service/history/queues/metrics_test.go
#	service/history/queues/priority_assigner.go
#	service/history/queues/queue_base.go
#	service/history/queues/queue_immediate.go
#	service/history/queues/queue_immediate_test.go
#	service/history/queues/reader.go
#	service/history/queues/scheduler.go
#	service/history/queues/speculative_workflow_task_timeout_queue.go
#	service/history/replication/ack_manager.go
#	service/history/replication/dlq_writer.go
#	service/history/replication/dlq_writer_test.go
#	service/history/replication/executable_sync_versioned_transition_task.go
#	service/history/replication/executable_task.go
#	service/history/replication/executable_task_converter.go
#	service/history/replication/executable_task_mock.go
#	service/history/replication/executable_task_tool_box.go
#	service/history/replication/executable_verify_versioned_transition_task.go
#	service/history/replication/fx.go
#	service/history/replication/metrics.go
#	service/history/replication/progress_cache.go
#	service/history/replication/progress_cache_test.go
#	service/history/replication/raw_task_converter.go
#	service/history/replication/raw_task_converter_test.go
#	service/history/replication/stream_receiver.go
#	service/history/replication/stream_receiver_monitor.go
#	service/history/replication/stream_receiver_monitor_test.go
#	service/history/replication/stream_sender.go
#	service/history/replication/task_processor.go
#	service/history/replication/task_processor_manager.go
#	service/history/replication/task_processor_manager_test.go
#	service/history/replication/task_processor_test.go
#	service/history/service.go
#	service/history/shard/context_factory.go
#	service/history/shard/context_impl.go
#	service/history/shard/context_test.go
#	service/history/shard/context_testutil.go
#	service/history/shard/controller_test.go
#	service/history/shard/fx.go
#	service/history/tasks/chasm_task.go
#	service/history/tasks/delete_workflow_execution_stage.go
#	service/history/tasks/predicates.go
#	service/history/tasks/state_machine_task.go
#	service/history/tasks/task.go
#	service/history/tasks/task_mock.go
#	service/history/tasks/utils.go
#	service/history/timer_queue_active_task_executor.go
#	service/history/timer_queue_active_task_executor_test.go
#	service/history/timer_queue_standby_task_executor.go
#	service/history/timer_queue_standby_task_executor_test.go
#	service/history/timer_queue_task_executor_base.go
#	service/history/timer_queue_task_executor_base_test.go
#	service/history/transfer_queue_active_task_executor.go
#	service/history/transfer_queue_active_task_executor_test.go
#	service/history/transfer_queue_factory.go
#	service/history/transfer_queue_standby_task_executor.go
#	service/history/transfer_queue_standby_task_executor_test.go
#	service/history/visibility_queue_factory.go
#	service/history/visibility_queue_task_executor.go
#	service/history/visibility_queue_task_executor_test.go
#	service/history/worker_versioning_util.go
#	service/history/workflow/activity.go
#	service/history/workflow/cache/cache.go
#	service/history/workflow/command_handler.go
#	service/history/workflow/context.go
#	service/history/workflow/fx.go
#	service/history/workflow/metrics.go
#	service/history/workflow/metrics_test.go
#	service/history/workflow/mutable_state_impl.go
#	service/history/workflow/mutable_state_impl_restart_activity_test.go
#	service/history/workflow/mutable_state_impl_test.go
#	service/history/workflow/mutable_state_rebuilder.go
#	service/history/workflow/mutable_state_rebuilder_test.go
#	service/history/workflow/noop_chasm_tree.go
#	service/history/workflow/retry.go
#	service/history/workflow/task_generator.go
#	service/history/workflow/task_generator_mock.go
#	service/history/workflow/task_generator_provider.go
#	service/history/workflow/task_generator_test.go
#	service/history/workflow/task_refresher.go
#	service/history/workflow/timer_sequence.go
#	service/history/workflow/update/abort_reason.go
#	service/history/workflow/update/errors_failures.go
#	service/history/workflow/update/export_test.go
#	service/history/workflow/update/store.go
#	service/history/workflow/update/store_mock_test.go
#	service/history/workflow/update/update.go
#	service/history/workflow/update/update_test.go
#	service/history/workflow/update/validation.go
#	service/history/workflow/util.go
#	service/history/workflow/workflow_task_state_machine.go
#	service/history/workflow/workflow_test/mutable_state_impl_test.go
#	service/matching/backlog_manager_test.go
#	service/matching/config.go
#	service/matching/configs/quotas.go
#	service/matching/counter/cmsketch.go
#	service/matching/counter/cmsketch_test.go
#	service/matching/counter/hybrid.go
#	service/matching/db.go
#	service/matching/fair_backlog_manager.go
#	service/matching/fair_task_reader.go
#	service/matching/forwarder.go
#	service/matching/fx.go
#	service/matching/handler.go
#	service/matching/handler_test.go
#	service/matching/matcher.go
#	service/matching/matcher_data.go
#	service/matching/matcher_data_test.go
#	service/matching/matching_engine.go
#	service/matching/matching_engine_test.go
#	service/matching/physical_task_queue_key.go
#	service/matching/physical_task_queue_key_test.go
#	service/matching/physical_task_queue_manager.go
#	service/matching/physical_task_queue_manager_interface.go
#	service/matching/physical_task_queue_manager_mock.go
#	service/matching/physical_task_queue_manager_test.go
#	service/matching/pri_backlog_manager.go
#	service/matching/pri_forwarder.go
#	service/matching/pri_matcher.go
#	service/matching/pri_matcher_test.go
#	service/matching/pri_task_reader.go
#	service/matching/task.go
#	service/matching/task_queue_partition_manager.go
#	service/matching/task_queue_partition_manager_test.go
#	service/matching/task_tracker.go
#	service/matching/task_tracker_test.go
#	service/matching/task_validation.go
#	service/matching/user_data_manager.go
#	service/matching/user_data_manager_test.go
#	service/matching/workers/registry.go
#	service/matching/workers/registry_impl.go
#	service/matching/workers/registry_impl_test.go
#	service/matching/workers/registry_test.go
#	service/matching/workers/worker_query_engine.go
#	service/matching/workers/worker_query_engine_test.go
#	service/worker/batcher/activities.go
#	service/worker/batcher/activities_test.go
#	service/worker/deletenamespace/deleteexecutions/activities.go
#	service/worker/deletenamespace/deleteexecutions/workflow_test.go
#	service/worker/deletenamespace/fx.go
#	service/worker/dummy/workflow.go
#	service/worker/fx.go
#	service/worker/migration/activities.go
#	service/worker/migration/activities_test.go
#	service/worker/migration/force_replication_workflow.go
#	service/worker/migration/force_replication_workflow_test.go
#	service/worker/migration/fx.go
#	service/worker/migration/handover_workflow.go
#	service/worker/migration/handover_workflow_test.go
#	service/worker/scheduler/activities.go
#	service/worker/scheduler/activities_test.go
#	service/worker/scheduler/workflow.go
#	service/worker/workerdeployment/activities.go
#	service/worker/workerdeployment/client.go
#	service/worker/workerdeployment/fx.go
#	service/worker/workerdeployment/util.go
#	service/worker/workerdeployment/util_test.go
#	service/worker/workerdeployment/version_activities.go
#	service/worker/workerdeployment/version_workflow.go
#	service/worker/workerdeployment/version_workflow_test.go
#	service/worker/workerdeployment/workflow.go
#	service/worker/workerdeployment/workflow_test.go
#	temporal/fx.go
#	temporal/server_option.go
#	temporal/server_options.go
#	tests/acquire_shard_test.go
#	tests/activity_api_batch_reset_test.go
#	tests/activity_api_batch_unpause_test.go
#	tests/activity_api_batch_update_options_test.go
#	tests/activity_api_pause_test.go
#	tests/activity_api_reset_test.go
#	tests/activity_api_rules_test.go
#	tests/activity_api_update_test.go
#	tests/activity_test.go
#	tests/add_tasks_test.go
#	tests/admin_test.go
#	tests/advanced_visibility_test.go
#	tests/archival_test.go
#	tests/callbacks_migration_test.go
#	tests/callbacks_test.go
#	tests/cancel_workflow_test.go
#	tests/chasm_test.go
#	tests/child_workflow_test.go
#	tests/client_data_converter_test.go
#	tests/client_misc_test.go
#	tests/continue_as_new_test.go
#	tests/describe_test.go
#	tests/dlq_test.go
#	tests/links_test.go
#	tests/max_buffered_event_test.go
#	tests/namespace_interceptor_test.go
#	tests/namespace_test.go
#	tests/nexus_api_test.go
#	tests/nexus_api_validation_test.go
#	tests/nexus_endpoint_test.go
#	tests/nexus_test_base.go
#	tests/nexus_workflow_test.go
#	tests/pause_workflow_execution_test.go
#	tests/premature_eos_test.go
#	tests/priority_fairness_test.go
#	tests/purge_dlq_tasks_api_test.go
#	tests/query_workflow_test.go
#	tests/relay_task_test.go
#	tests/schedule_migration_test.go
#	tests/schedule_test.go
#	tests/signal_workflow_test.go
#	tests/sizelimit_test.go
#	tests/stickytq_test.go
#	tests/task_queue_stats_test.go
#	tests/task_queue_test.go
#	tests/testcore/context.go
#	tests/testcore/dynamic_config_overrides.go
#	tests/testcore/functional_test_base.go
#	tests/testcore/matching_behavior.go
#	tests/testcore/onebox.go
#	tests/testcore/shard_salt.txt
#	tests/testcore/test_cluster.go
#	tests/testcore/test_cluster_pool.go
#	tests/testcore/test_env.go
#	tests/transient_task_test.go
#	tests/update_workflow_sdk_test.go
#	tests/update_workflow_test.go
#	tests/user_metadata_test.go
#	tests/user_timers_test.go
#	tests/versioning_3_test.go
#	tests/versioning_test.go
#	tests/worker_deployment_test.go
#	tests/worker_deployment_version_test.go
#	tests/workflow_alias_search_attribute_test.go
#	tests/workflow_buffered_events_test.go
#	tests/workflow_delete_execution_test.go
#	tests/workflow_failures_test.go
#	tests/workflow_memo_test.go
#	tests/workflow_task_reported_problems_test.go
#	tests/workflow_test.go
#	tests/workflow_timer_test.go
#	tests/workflow_visibility_test.go
#	tests/xdc/base.go
#	tests/xdc/chasm_test.go
#	tests/xdc/failover_test.go
#	tests/xdc/history_replication_dlq_test.go
#	tests/xdc/history_replication_signals_and_updates_test.go
#	tests/xdc/nexus_request_forwarding_test.go
#	tests/xdc/nexus_state_replication_test.go
#	tests/xdc/stream_based_replication_test.go
#	tests/xdc/visibility_test.go
#	tools/elasticsearch/handler.go
#	tools/elasticsearch/main.go
#	tools/elasticsearch/tasks.go
#	tools/flakereport/flakereport.go
#	tools/flakereport/github.go
#	tools/flakereport/slack.go
#	tools/flakereport/types.go
#	tools/flakereport/writer.go
#	tools/tdbg/chasm_registry.go
#	tools/tdbg/commands.go
#	tools/tdbg/flags.go
#	tools/tdbg/task_queue_commands.go
#	tools/tdbg/task_queue_commands_test.go
#	tools/tdbg/tdbg_commands.go
#	tools/tdbg/util.go
#	tools/testrunner/junit.go
#	tools/testrunner/junit_test.go
#	tools/testrunner/log.go
#	tools/testrunner/log_test.go
#	tools/testrunner/testdata/junit-alerts-output.xml
#	tools/testrunner/testdata/junit-crash-output.xml
#	tools/testrunner/testdata/junit-empty.xml
#	tools/testrunner/testdata/junit-timeout-output.xml
#	tools/testrunner/testrunner.go
#	tools/testrunner/testrunner_test.go
2026-06-02 10:02:39 -07:00
Alvin HuangandGitHub b18ce1745b Update to API v1.62.13 (#10429)
## What changed?
update api version to tagged release
2026-05-29 15:41:51 -04:00
Prathyush PVandGitHub 638fc6db67 Update modernc.org/sqlite to v1.51.0 and remove connection workaround (#10427)
## What changed?
Bumped `modernc.org/sqlite` to v1.51.0 and removed the custom
`Driver`/`conn` wrapper in `sqlite/driver.go` that implemented
`ResetSession()` and `IsValid()`.

## Why?
The wrapper existed to stop `database/sql` from discarding the single
in-memory connection on a context-cancelled transaction (which lost the
whole database). v1.51.0 fixes this upstream — in-memory connections now
stay usable after interruption ([cznic/sqlite
c1d418e](https://gitlab.com/cznic/sqlite/-/commit/c1d418e0de38d2757c5d0faa6ab569fdf6acdf03))
— so the workaround is redundant.

## How did you test it?
- [x] built
- [x] covered by existing tests

`TestSQLiteTransactionContextCancellation` (the in-memory cancellation
regression test) and the rest of the SQLite persistence suite pass.
2026-05-29 19:13:00 +00:00
sammandGitHub 032496b3ee Adds StateSizeBytes to DescribeNexusOperation (#10423)
## What changed?
Add StateSizeBytes to NexusOperationInfo set to ApproximateStateSize
## Why?
Enables storage estimations

## How did you test it?
- [ ] built
- [ ] run locally and tested manually
- [x] covered by existing tests
- [x] added new unit test(s)
- [ ] added new functional test(s)
2026-05-29 16:43:40 +00:00
Kent GruberandGitHub 830f9dd163 Bump Go toolchain to 1.26.3 and thrift to 0.23.0 (security patch) (#10395)
Bumps Go from 1.26.2 to 1.26.3 to resolve scanner findings for 4 Go
stdlib CVEs:

- **CVE-2026-42499** — `net/mail` `consumePhrase` quadratic complexity
- **CVE-2026-39820** — `net/mail` `consumeComment` quadratic complexity
- **CVE-2026-33811** — `net` `LookupCNAME` double-free with cgo resolver
- **CVE-2026-39836** — `net` `Dial`/`LookupPort` panic on NUL byte
(Windows-only)

None are practically exploitable against Temporal Server (no `net/mail`
usage, `CGO_ENABLED=0`, Linux containers), but the Go version in the
binary triggers customer vulnerability scanners.

Also bumps `github.com/apache/thrift` from 0.22.0 → 0.23.0 (ref #10202).
2026-05-27 13:17:40 -04:00
Fred TzengandGitHub 3e1ffa12e4 expose SDK name and version on DescribeActivityExecution (#10333)
## What changed?
- Added `sdk_name`/`sdk_version` to `ActivityAttemptState and
`ActivityExecutionInfo` (via the companion api PR).
- Added `chasm.Context.RequestHeader(key) string` so transitions can
read inbound gRPC metadata directly.
- `TransitionStarted` stamps `client-name`/`client-version` onto the
attempt; `buildActivityExecutionInfo` expose them through
`DescribeActivityExecution`. Overwritten per attempt.
- Consolidated the scattered `TestDescribeActivityExecution_*` methods
into one parent with parallel subtests.

## Why?
Standalone Activities had no way to convey which SDK ran a given
activity. The SDK already sends `client-name`/`client-version` on every
poll and `headers.Propagate` carries them to history, so the only
missing piece was a way for the CHASM transition to read them.

`RequestHeader(key)` is intentionally narrow: gRPC metadata lives in the
Go context under an unexported key that `chasm.Context.Value()` can't
reach. A single-purpose accessor for inbound transport metadata captures
what we need without opening that door.

## How did you test it?
- [X] built
- [X] run locally and tested manually
- [X] covered by existing tests
- [X] added new unit test(s)
- [X] added new functional test(s)
2026-05-22 21:50:44 +00:00
94b3a93216 Implement SignalWithStart as a system nexus endpoint (#9833)
## What changed?
This PR adds `SignalWithStartWorkflowExecution` as a synchronous Nexus
operation exposed via `__temporal_system endpoint`, allowing workflows
to signal-with-start other workflows through the CHASM Nexus operation
framework.

Key changes:
- `chasm/lib/workflow/nexus_service.go`: `workflowServiceNexusHandler`
implements the `SignalWithStartWorkflowExecution` Nexus sync operation
by resolving the namespace and delegating to the History service. A
`SignalWithStartOperationProcessor` handles input enrichment (namespace,
request ID, links) and routing via CHASM's
`NexusOperationProcessorResult`.
- `chasm/lib/workflow/library.go` — library now holds the
`workflowServiceNexusHandler`, the workflow `Config`, the SA mapper
provider, and the SA validator. `newLibrary` (used by fx) takes those
dependencies, while the public `NewLibrary` keeps its old signature for
external callers. Adds `NexusServices()` so the library registers its
Nexus service via CHASM.
- `chasm/lib/workflow/validator.go`: `RequestValidator` consolidates the
`SignalWithStartWorkflowExecution` validation logic (previously inlined
in `WorkflowHandler`) into a reusable, injectable struct. This same
validator is used by both the frontend handler and the new CHASM
processor.
- common/dynamicconfig/constants.go — adds
`EnableSignalWithStartFromWorkflow` (namespace-scoped, default false).
- `service/frontend/workflow_handler.go`: Removed the `SignalWithStart`
validation block
- `service/history/fx.go`: Provides a `HistoryServiceServerProvider` so
the CHASM workflow library can call the history handler directly.
- `temporal/fx.go`: Removes the now-redundant `ChasmLibraryOptions`
grouping; each service module registers its own CHASM libraries.
- `components/nexusoperations/workflow/commands.go`: `NotFound` and
`InvalidArgument` errors during Nexus command handling are now surfaced
as workflow task failures instead of being treated as transient handler
errors.
- `common/payloads`: Adds `EncodeSingle`, `MustEncodeSingle`, and
`MustEncode` helpers used in tests.
- `cmd/tools/getproto`: Adds support for nexus-proto-annotations proto
imports.
- `tests/signal_with_start_from_workflow_test.go`: Functional test suite
covering the happy path, duplicate detection, conflict policies, and
validation rejection for the new Nexus operation.


## Why?
This functionality is one of our most requested GitHub issues.

## How did you test it?
- [X] built
- [X] run locally and tested manually
- [ ] covered by existing tests
- [X] added new unit test(s)
- [X] added new functional test(s)

## Potential risks
The history service now directly exposes a `HistoryServiceServer`
interface via `fx` for injection into the CHASM workflow library. This
tight coupling between the CHASM workflow library and the history
handler could complicate future layering — callers outside the history
service should not adopt this pattern. The feature is gated by
`history.enableSignalWithStartFromWorkflow` for rollout.

---------

Co-authored-by: Roey Berman <[email protected]>
2026-05-20 21:49:35 +00:00
0e39d20cd8 Callback for workflow update support (#9614)
## What changed?
Added support for Nexus workflow update completion callbacks via CHASM.
This allows a Nexus caller to be notified when a workflow update
completes by attaching completion callbacks to the update request.

## Why?

Nexus operations that target workflow updates need a way to receive
completion notifications. Without this, a Nexus caller that sends an
update has no async mechanism to learn when the update finishes.
Completion callbacks enable the same async notification pattern that
already exists for workflow-level Nexus operations.

## How did you test it?
- [ ] built
- [x] run locally and tested manually
- [ ] covered by existing tests
- [x] added new unit test(s)
- [x] added new functional test(s)

## Potential risks
Touches speculative workflow updates, they are always hard to reason
about. Tried to compensate with lots of test coverage.

Note: Needs this API PR
https://github.com/temporalio/api/pull/742/changes

---

> [!NOTE]
> **High Risk**
> Touches workflow update state machine and mutable state event handling
to persist/trigger per-update callbacks, including close/retry/reset
paths, which is complex and can affect correctness of update outcomes
and callback delivery.
> 
> **Overview**
> Adds **workflow update completion callbacks** via CHASM so Nexus
callers can register callbacks on `UpdateWorkflowExecution` and have
them fired on update completion or workflow close.
> 
> This introduces a `WorkflowUpdate` CHASM component with new
`UpdateState` protobuf (including persisted `rejection_failure`), stores
update callbacks under `Workflow.Updates`, and extends callback
processing to handle *update-level* callbacks on update completion,
rejection (including reset/reapply), and on run transitions
(retry/timeout/continue-as-new) where update callbacks must fire even if
workflow-level callbacks are inherited.
> 
> It also adds dynamic config gates/limits
(`EnableWorkflowUpdateCallbacks`, `MaxCallbacksPerUpdateID`), updates
`DescribeWorkflow` to surface update callback triggers, extends mutable
state/history builder APIs to carry per-update callback options in
`WorkflowExecutionOptionsUpdated`, and adds `Update.AttachCallbacks`
logic to persist/flush callbacks (including buffering while `stateSent`,
request-id dedup, and stricter validation requiring `request_id` when
callbacks are present).
> 
> <sup>Reviewed by [Cursor Bugbot]() for commit
4484fee104d73344ef5370c468008440c7df1c6a. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>

---------

Co-authored-by: long-nt-tran <[email protected]>
2026-05-19 18:31:15 -04:00
Pasha FateevandGitHub 25ef1b2a67 Bump go.temporal.io/api to v1.62.12 (#10293)
## Summary

Replace the pseudo-version pin of `go.temporal.io/api` with the
freshly-tagged `v1.62.12`. This is a prerequisite for cutting cloud
release 3.156, which requires all OSS dependencies to be on tagged
versions (runbook step 2).

## Details
- `v1.62.12` tags api-go commit
`0a978d4fd72ccadc7666d7f19aa6df9b335b3133` — the same commit the
previous pseudo-version pinned
(`v1.62.12-0.20260511225354-0a978d4fd72c`).
- No source code changes — the module content is identical (the
`/go.mod` h1 hash didn't change in go.sum, only the version-identifier
hash).
- Tag created via `temporalio/api`'s `create-release.yml` workflow.

## Test plan
- [x] `go mod tidy` clean
- [ ] CI passes
2026-05-15 23:14:12 +00:00
Stephan BehnkeandGitHub 3e4fd2fb44 Add standalone Nexus operation namespace capability (#10206)
## What changed?

Add standalone Nexus operation namespace capability
2026-05-15 17:34:54 +00:00
zeekay e61c98608b deps: luxfi/crypto v1.19.0 2026-05-13 12:02:38 -07:00
zeekay 8fb2c40f01 go.mod: bump go directive to 1.26.3 (security advisory) 2026-05-12 21:26:57 -07:00
3b0c43fbd0 Add stubs for new activity execution APIs (#10158)
## What
Bump `go.temporal.io/api` and add stubs for newly added
`PauseActivityExecution`, `UnpauseActivityExecution`,
`ResetActivityExecution`, and `UpdateActivityExecutionOptions` APIs.

## Why
temporalio/api#743 added these RPCs to
`WorkflowServiceClient`/`WorkflowServiceServer`. Without stubs, any
branch bumping api-go fails to build.

## How did you test it?
`go build ./...` passes.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-05-01 22:55:51 +00:00
Vladyslav SimonenkoandGitHub 0108c8072d DescribeNamespace with weak consistency (#10103)
## What changed?
Added server-side handling for the new `weak_consistency` flag on
`DescribeNamespaceRequest` (proto change in
https://github.com/temporalio/api/pull/775). When the flag is set,
`DescribeNamespace` is served from the in-memory namespace registry,
bypassing the metadata store. When unset, behavior is unchanged.

## Why?
`DescribeNamespace` currently always reads through to the persistence
store. The new field lets clients opt into eventually-consistent reads
where read-after-write semantics aren't required, while preserving the
existing strong-consistency contract for operator/admin callers (default
behavior unchanged).

## How did you test it?
- [X] built
- [X] added new unit test(s)
- [X] added new functional test(s)

## Potential risks
- Eventual consistency on when weak_consistency is set. A namespace
created within the registry's refresh interval may return
`NamespaceNotFound` even though it exists in persistence.
2026-04-30 17:10:26 +00:00
zeekay 45bd80a26d feat(tasks): v3.9.0 — distributed engine: per-NS SQLite shards + PQ consensus + sticky routing
Architecture
  One SQLite shard per (org, namespace) under <DataDir>/<org>/<ns>.db
  with WAL mode, single writer, 5s busy timeout. Replaces the prior
  shared memdb/zapdb store. Shard manager opens/caches/idle-evicts;
  prefix scans, namespace isolation, and cross-restart durability all
  proven by tests.

Replication (post-quantum, native)
  New pkg/tasks/replication/ exposes a Replicator interface with two
  drivers:
    local  — single-node passthrough (default for embedded/dev)
    quasar — wraps github.com/luxfi/consensus NewPQ (BLS + Corona
             dual-threshold). On every WAL-affecting op the shard
             builds a Frame, calls Propose, awaits Decision, applies
             on Accept. Followers receive accepted frames via the
             same Subscribe path so every node converges.

Sticky task-queue routing
  New pkg/tasks/routing/ — rendezvous-style smallest-hash leader
  election keyed by SHA-256(shard|taskQueue|seed). OnChange fan-out
  re-hashes on cluster membership change. Dispatcher consults Router
  before accepting subscriptions and forwards non-leader requests.

Namespace migration
  New pkg/tasks/migration/ — lock → checkpoint → copy → unlock with
  a job lifecycle (pending|locking|copying|replaying|released|failed).
  CLI: `tasksd migrate --org <id> --namespace <name> --to <node>`.
  HTTP: POST /v1/tasks/namespaces/{ns}/migrate.

New env / flags
  --data / TASKSD_DATA_DIR        shard root (./tasks-data)
  --replicator / TASKSD_REPLICATOR local | quasar (default local)
  --node-id / TASKSD_NODE_ID      stable id (required for quasar)
  --validators / TASKSD_VALIDATORS CSV host:port
  --validator-key / TASKSD_VALIDATOR_KEY (reserved for PQ key path)
  TASKSD_STORE                    sqlite | memory (default sqlite)

New routes
  GET  /v1/tasks/cluster
  GET  /v1/tasks/cluster/health
  POST /v1/tasks/namespaces/{ns}/migrate

UI bundle (synced)
  Cluster page with status / validators / shards / leader-map.
  NamespaceDetail "Migrate to node" button gated by
  canWriteNamespace + cluster.enabled. MigrationDialog enforces
  typed-name confirmation. Sidebar Cluster nav hidden when running
  single-node.

Tests
  +33 backend tests (store: 11, replication: 10, routing: 5,
  migration: 3, cluster routes: 2, store factory: 2). All packages
  PASS with -race; go vet clean.
  +13 UI tests (effectiveHealth: 6, canSubmitMigration: 4,
  useCluster: 3). 169 total UI tests, 1 pre-existing skip.

Migration v3.8.x → v3.9.0
  Fresh-data startup. zapdb backend dropped. Operators drain old
  cluster, snapshot for archival, deploy v3.9.0 with new --data
  directory. To enable HA, scale to 3+ replicas with --replicator
  quasar and matching --node-id / --validators.
2026-04-30 00:09:39 -07:00
zeekay 1444d61c56 feat(tasks): v3.7.0 — multi-tenant hardening, durable store, full inverse-options, 13 new endpoints
Security (red-team pass)
  - ZAP wire handlers were org-blind: every opcode bypassed WithOrg
    and used the unscoped engine. Patched: zapHandlers takes a
    JWTValidator; per-request engine is scoped to claims.Owner.
    TASKSD_REQUIRE_IDENTITY enforces validation in production.
  - /v1/tasks/mcp tools/call ran on the unscoped engine — patched
    to use auth.OrgID(r.Context()).
  - /v1/tasks/events SSE fan-out was global; events now stamp OrgID
    via engine.emit(ev) and the SSE handler filters per-request org.
  - AddSearchAttribute rejected reserved/system names (WorkflowId,
    ExecutionStatus, TaskQueue, *StartTime, Temporal*).
  - Path-traversal guards on every {ns}/{id} URL slot (validIdent +
    validPathSegment).
  - dispatcher.queries map is now bounded (4096 entries, 5m TTL,
    drop-oldest on overflow) — closes a DoS via silent worker.

Durability
  - newStoreFromEnv selects memdb (default) or zapdb via
    TASKSD_STORE=zapdb. Survives restart; covered by
    TestStore_ZapdbPersistsAcrossOpen.

Inverse-of-options
  - RevokeIdentity, DeleteNexusEndpoint, RemoveSearchAttribute,
    DeprecateNamespace, DeleteDeploymentVersion, UnsetCurrent.
  - Schedule full update + trigger + matching-times.

13 new HTTP routes
  GET    /v1/tasks/settings
  DELETE /v1/tasks/namespaces/{ns}
  POST   /v1/tasks/namespaces/{ns}/schedules/{id}            (full update)
  POST   /v1/tasks/namespaces/{ns}/schedules/{id}/trigger
  GET    /v1/tasks/namespaces/{ns}/schedules/{id}/matching-times
  POST   /v1/tasks/namespaces/{ns}/deployments/{name}/set-current
  DELETE /v1/tasks/namespaces/{ns}/deployments/{name}/versions/{buildId}
  GET    /v1/tasks/namespaces/{ns}/archival
  GET    /v1/tasks/namespaces/{ns}/workflows/{id}/executions
  GET    /v1/tasks/namespaces/{ns}/task-queues/{q}/partitions
  GET    /v1/tasks/namespaces/{ns}/workers/{identity}
  DELETE /v1/tasks/namespaces/{ns}/nexus/{id}
  DELETE /v1/tasks/namespaces/{ns}/identities/{email}
  DELETE /v1/tasks/namespaces/{ns}/search-attributes/{name}

Tests
  go test ./pkg/tasks/... -race -count=1 → PASS, +22 new tests
  (cross-org keyspace isolation, query non-widening, reserved attrs,
  pendingQuery bounds, TTL eviction, Identifier validation, persistence
  cross-restart). go vet clean.

UI bundle (synced)
  Canonical Hanzo H mark in HanzoMark.tsx replaces stylized H rectangle.
  useSettings() hook gates write actions when namespaceWriteDisabled,
  archival/heartbeats/advanced-visibility flags. New inverse buttons
  (worker stop, identity revoke, search-attr delete, deployment unset,
  batch terminate confirm).
2026-04-29 18:11:13 -07:00
zeekay fdb4067b4c feat(auth): JWT validation against IAM JWKS, strip+mint identity
tasksd is now self-sufficient multi-tenant: no gateway dependency
required. Every inbound request has client-supplied X-Org-Id /
X-User-Id / X-User-Email stripped unconditionally; if Authorization:
Bearer <jwt> is present, the token is validated against the configured
JWKS (TASKSD_JWKS_URL), checked against issuer/audience, and identity
headers are minted from validated claims.

Closes the spoofable-identity hole on tasks-api.hanzo.ai: any request
with a self-set X-Org-Id previously passed through and got that org's
scoped engine.

Env:
  TASKSD_JWKS_URL       e.g. https://hanzo.id/.well-known/jwks
  TASKSD_JWT_ISSUER     e.g. https://hanzo.id
  TASKSD_JWT_AUDIENCE   optional
  TASKSD_REQUIRE_IDENTITY=true  rejects unauthenticated requests
2026-04-28 23:31:09 -07:00
7380fed152 Wire worker_commands namespace capability (#10084)
## What
Wire the new `worker_commands` namespace capability to the existing
`WorkerCommandsEnabled` dynamic config flag.

Also bumped the API version.

## Why
SDKs need this capability to know when to create the implicit control
task queue and poller for receiving worker commands
(temporalio/api#771).

## How did you test it?
Unit tests

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-04-27 21:31:07 +00:00
zeekay 30e70000eb feat: native engine + @hanzo/ui shell (full Temporal Cloud parity)
Engine (pkg/tasks):
- store.go     — KV layer over luxfi/database memdb (snapshot-and-iterate
                 list to avoid RWMutex upgrade deadlock)
- types.go     — wire types: Namespace, WorkflowExecution, Schedule,
                 BatchOperation, Deployment, NexusEndpoint, Identity
- engine.go    — domain ops: register/list/describe ns; start/list/
                 describe/cancel/terminate/signal workflow; create/list/
                 describe/delete/pause/unpause schedule; start/list/
                 describe batch; create/list deployment; create/list
                 nexus endpoint; grant/list identity; cron sweeper goroutine
- embed.go     — every ZAP opcode (0x0060-0x0090) + every HTTP route
                 dispatches through the same model funcs; no drift

HTTP surface (browser-only JSON shim, ZAP is the canonical wire):
  GET    /v1/tasks/namespaces
  POST   /v1/tasks/namespaces
  GET    /v1/tasks/namespaces/{ns}
  GET    /v1/tasks/namespaces/{ns}/workflows
  POST   /v1/tasks/namespaces/{ns}/workflows
  GET    /v1/tasks/namespaces/{ns}/workflows/{id}
  POST   /v1/tasks/namespaces/{ns}/workflows/{id}/cancel
  POST   /v1/tasks/namespaces/{ns}/workflows/{id}/terminate
  POST   /v1/tasks/namespaces/{ns}/workflows/{id}/signal
  GET    /v1/tasks/namespaces/{ns}/schedules
  POST   /v1/tasks/namespaces/{ns}/schedules
  GET    /v1/tasks/namespaces/{ns}/schedules/{id}
  DELETE /v1/tasks/namespaces/{ns}/schedules/{id}
  POST   /v1/tasks/namespaces/{ns}/schedules/{id}/pause
  POST   /v1/tasks/namespaces/{ns}/schedules/{id}/unpause
  GET    /v1/tasks/namespaces/{ns}/batches
  POST   /v1/tasks/namespaces/{ns}/batches
  GET    /v1/tasks/namespaces/{ns}/batches/{id}
  GET    /v1/tasks/namespaces/{ns}/deployments
  POST   /v1/tasks/namespaces/{ns}/deployments
  GET    /v1/tasks/namespaces/{ns}/nexus
  POST   /v1/tasks/namespaces/{ns}/nexus
  GET    /v1/tasks/namespaces/{ns}/identities
  POST   /v1/tasks/namespaces/{ns}/identities

UI (full Temporal Cloud parity):
- @hanzo/ui primitives in src/components/ui/{button,card,tabs,badge,
  alert,dialog,input,label,skeleton,dropdown-menu}.tsx — same shadcn
  pattern @hanzo/ui itself uses; CSS tokens from @hanzo/ui design system
- App.tsx: sidebar layout (Workflows/Schedules/Batches/Deployments/
  Namespaces/Nexus/Support) with top bar (UTC clock, theme toggle,
  account chip, ns indicator, embedded badge)
- pages/Namespaces.tsx + pages/NamespaceDetail.tsx — list + detail w/
  Overview+Identities tabs, Region/Retention/APS cards, Connect
  dropdown showing ZAP+HTTP endpoints with copy buttons, Active badge
- pages/Workflows.tsx — list + Start Workflow dialog (real POST)
- pages/WorkflowDetail.tsx — execution details
- pages/Schedules.tsx — list w/ cron / interval describe
- pages/Batches.tsx — list + Start Batch dialog (operation enum)
- pages/Deployments.tsx — list of worker version series
- pages/Nexus.tsx — list of cross-ns endpoints
- pages/Support.tsx — 4 cards linking to docs / GitHub / health
- ThemeToggle (light/dark, persisted), UTCClock (live ticker),
  AccountChip (popover w/ identity + sign out)

Binary: 7.5 MB. Workflow execution semantics (deterministic replay of
user code) still pending — engine records state and tracks history len
on signals, but does NOT run user-supplied workflow goroutines yet.
Worker SDK runtime is the next phase.
2026-04-26 22:18:42 -07:00
zeekay aa83a0a1d2 rip: delete temporal fork — native ZAP-only tasksd
Goes from 135 MB binary with 1153 files importing go.temporal.io and 224
importing google.golang.org/grpc to a 10 MB native binary with ZERO of
either.

Deleted:
- tasks/, tasktests/, service/, chasm/, client/, api/, proto/, tools/
- cmd/tools/, components/, docker/
- schema/{cassandra,elasticsearch,mysql,postgresql,sqlite}/
- 40 tainted common/ subdirs + 7 top-level common files
- tests/testutils (no longer referenced after surviving deps drop common)

New cmd/tasksd (~100 lines) boots tasks.Embed (zap.Node) + http.Server.
New pkg/tasks/embed.go registers ZAP handlers for the SDK opcode surface
(0x0060-0x00A5). Workflow handlers return a 501 "not yet implemented"
envelope; native engine lands behind this contract.

Build:  go build ./cmd/tasksd → 10 MB
Vet:    go vet ./... → clean
Boot:   tasksd --zap-port 9999 --http :7243
Probes: /healthz, /v1/tasks/health → 200
UI:     /_/tasks/, / → 200 (embedded Vite bundle)
ZAP:    _tasks._tcp on :9999 (mDNS disabled; direct connect)

go.mod: tidy. No go.temporal.io. No google.golang.org/grpc.
2026-04-26 14:06:21 -07:00
feiyangandGitHub 0601cbfe26 time-skipping propagation (#10013)
## What changed and Why?

Paired with [api
change](https://github.com/temporalio/api/pull/770/changes)

Define the default time-skipping propagation behavior for current
features: continue-as-new (CAN), child workflows, retry, and reset.

**Group 1 — Inherit both from the current execution:**

- Continue-as-new (CAN): inherits the current config and accumulated
skipped duration; the configured bound is shared across both the
inherited skipped duration and any duration skipped by the new run.
- Child workflows: same behavior as CAN

This design is because CAN is a technical reason to start a new run of
current run, so logically they can be viewed as a same "run". For Child
WFs they can be viewed as an extension of previous workflows or separate
workflows, and in either case, they shall inherit the skipped duration
so that the virtual time doesn't rewind back, and the default behavior
is designed to treat them as an extension of the parent and share the
config. We only consider adding new config to provide flexibility on
demand.

**Group 2 — Inherit from a specific point in history:**

- Retry: inherits the config and skipped duration recorded in the
StartWorkflowExecutionEvent of the current workflow, since retry is
defined as restarting execution from that event
- Cron: same with Retry

**Group3 -- Both inherit from a specific point and catch up of config
change to current**
- Reset: retains the current time-skipping config, since reset is
designed to replay all events up to the reset point and apply any
UpdateWorkflowExecutionOptions changes made after that point — with no
option to exclude them (covered by tests only)


## How did you test it?
- [x] built
- [x] run locally and tested manually
- [x] covered by existing tests
- [x] added new unit test(s)
- [x] added new functional test(s)
2026-04-24 19:51:50 +00:00
Chris St. PierreandGitHub 8ac3d89aa0 Update to API v1.62.11 (#10056)
## What changed?

Update to latest `go.temporal.io/api` release

## Why?

Prepare for releases

## How did you test it?
- [ ] built
- [ ] run locally and tested manually
- [ ] covered by existing tests
- [ ] added new unit test(s)
- [ ] added new functional test(s)
2026-04-24 14:08:14 -05:00
Fred TzengandGitHub f8e2ad0e24 Add start delay support for standalone activities (#10008)
## What changed?
Added StartDelay support for standalone activities, mirroring the
existing WithStartDelay behavior on StartWorkflowExecution.
   
- New start_delay field on ActivityState proto to persist the delay for
retry deadline calculations.
- TransitionScheduled defers the ActivityDispatchTask and extends
ScheduleToStart and ScheduleToClose timeout timers by the delay
duration. StartToClose and Heartbeat timeouts are unaffected.
- Validation rejects negative durations; nil/zero means no delay.
- Changed hasEnoughTimeForRetry to include start delay in the
ScheduleToClose deadline: ScheduleTime + StartDelay +
ScheduleToCloseTimeout. Without this, retries were rejected prematurely
by StartDelay seconds.

## Why?
Start delay is required for standalone activities to support deferred
execution: scheduling work to run after a specified delay. This is a
core capability that workflow start delay already provides, and
standalone activities need parity.

## How did you test it?
- [X] built
- [X] run locally and tested manually
- [X] covered by existing tests
- [X] added new unit test(s)
- [X] added new functional test(s)
2026-04-24 10:56:06 -07:00
Stephan Behnke d1416bf492 Nexus Standalone: assorted post-merge cleanup 2026-04-23 22:49:17 -07:00
Stephan BehnkeandGitHub 67fc8ae8b0 Stub Nexus Standalone APIs (#10042)
WISOTT
2026-04-23 20:28:17 +00:00
zeekay 5c1ed02cfc feat(sdk/activity): native call-site helpers, zero upstream deps
Implements pkg/sdk/activity: GetInfo, GetLogger, RecordHeartbeat plus the
Scope / NewContext / FromContext contract that workers use to inject a
per-task execution context.

- Info, WorkflowExecution types matching the caller surface in
  base/commerce/ta (no upstream type aliases).
- Scope is worker-owned; exposes Logger, HeartbeatSink, and a
  goroutine-safe Heartbeats() inspector for tests.
- Context key is a private distinct-type struct (collision + impersonation
  safe).
- GetInfo returns a deep copy (TaskToken []byte copied) -- activity code
  cannot mutate the scope's stored token.
- RecordHeartbeat defensive-copies caller details before capture and
  forwards to the worker's HeartbeatSink (luxfi/zap transport at that layer).
- Nil-safe fail-closed defaults: GetLogger -> log.Noop, GetInfo -> zero,
  RecordHeartbeat -> no-op when ctx carries no scope.

Tests cover round-trip, TaskToken isolation, nil scope paths, logger field
propagation (asserts JSON output contains bound fields), sink forwarding,
defensive copy, concurrent heartbeat recording, and Heartbeats() snapshot
independence. All 14 tests pass under -race.

Imports: stdlib + github.com/luxfi/log only. Zero go.temporal.io, zero
google.golang.org/grpc.
2026-04-23 10:30:06 -07:00
zeekay cad381cde2 feat: kill gRPC-Gateway — gofiber + /v1/tasks/* only
External HTTP surface is now one path prefix: /v1/tasks/*. The
runtime.ServeMux + JSON-over-gRPC transcoding layer is gone.
Browsers get JSON here because they have to; every other caller
uses the ZAP binary transport on :9652 (_tasks-sdk._tcp).

Backend:
  - service/frontend/http_api_server.go rewritten around gofiber
    v3. Four read routes wired directly to WorkflowHandler
    methods via Go function calls — no gRPC codec, no inline
    client conn, no grpc-gateway registration:
      GET /v1/tasks/healthz
      GET /v1/tasks/namespaces
      GET /v1/tasks/namespaces/:ns/workflows
      GET /v1/tasks/namespaces/:ns/workflows/:id
      GET /v1/tasks/namespaces/:ns/schedules
    Embedded SPA catches everything else for client-routed deep
    links.
  - fx.go: operatorHandler, grpcServerOptions.UnaryInterceptors,
    *mux.Router kept as accepted-but-unused until the fx graph
    can be pruned (next commit). No runtime dependency on them.
  - Response marshalling: protojson.MarshalOptions. The request
    and response types are still go.temporal.io/api protos; task
    #41 replaces them with ZAP schemas end-to-end.

UI:
  - Every fetch URL flips /api/v1/ → /v1/tasks/.
  - @hanzogui/lucide-icons-2 → lucide-react. The hanzo-gui
    package was pulling react-native transitively and Vite 8 /
    rolldown chokes on Flow syntax. lucide-react is the same
    icon set, pure React, no native shim.
  - vite.config.ts proxies /v1/tasks → :7234 so the SPA can use
    relative URLs in dev.

Verified: /v1/tasks/namespaces returns "default" namespace over
the gofiber path with gRPC-Gateway unloaded from the binary.
2026-04-23 09:54:12 -07:00