Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 07 Oct 03:13
· 303 commits to develop since this release
f314b4c

cleat 0.4.0

See the CHANGELOG for full details.

Downloads

cleat and cleat-gen: Linux and macOS, amd64 + arm64.

cleat-worker: Linux only (amd64 + arm64). The worker requires CGO for
the wasmtime runtime, so there is no cross-compiled macOS build. On macOS,
install it from source with

go install github.com/cleat-team/cleat/cmd/cleat-worker@latest

or use the Docker image. Every published cleat-worker binary is executed
with --verify-backend before release.

Changelog

  • f314b4c Release v0.4.0
  • fdf9285 build(deps): Bump the go-minor-and-patch group across 1 directory with 7 updates (#3158)
  • 7abb69a build(deps): bump actions/download-artifact from 7 to 8 (#2836)
  • f906e8e build(deps): bump actions/setup-go from 6 to 7 (#2092)
  • 1a70425 build(deps): bump actions/setup-go from 6 to 7 (#2835)
  • c9483c5 build(deps): bump azure/setup-helm from 4 to 5 (#2837)
  • ae57678 build(deps): bump the go-minor-and-patch group across 1 directory with 5 updates (#2600)
  • 0765f80 build(deps-dev): Bump the web-toolchain group across 1 directory with 2 updates (#3157)
  • e496b98 build(deps-dev): bump @sveltejs/vite-plugin-svelte (#2599)
  • b39a9c5 build(deps-dev): bump brace-expansion in /packages/cleat-as (#2752)
  • 4aed654 build(deps-dev): bump fast-uri from 3.1.6 to 3.1.8 in /packages/cleat-as (#2611)
  • 76d4fb8 build(deps-dev): bump the web-toolchain group across 1 directory with 3 updates (#2598)
  • 0ec0ffd chore(ci): Test Python 3.12 and 3.13 are required checks, and 3.10/3.11 say why not (#2580)
  • f1c3825 chore(release): back-merge main into develop after v0.3.2 (cleat#2058) (#2499)
  • cec3791 chore(release): back-merge main into develop — lineage, after the first was squashed (cleat#2058) (#2500)
  • a8b6bc0 chore(release): fold CHANGELOG and bump SDK manifests to 0.4.0 (cleat#3181) (#3182)
  • 25cbe0d ci(multi-db): add check-skip-budget steps to multi-db-ci.yml (part of cleat#2444) (#2686)
  • ea7b9b3 ci(plugin-harness): upload Layer 3 -- Multi-DB's test-report.json (cleat#2661) (#2682)
  • 6270200 ci(scripts): guard the documentation surfaces against the bare @cleat_entry form (cleat#3119) (#3125)
  • 30a75ed ci(tier1-gate): skip tier1-coverage/engine/rest entirely on merge_group (#2766)
  • e3c9b46 docs(auth): anchor the CodeQL disposition on the rule id, not an alert number (#2593)
  • e8f7f5b docs(changelog): fold [Unreleased] into 0.3.0, and stop citing deleted migrations (#2558)
  • 7485400 docs(changelog): scheduledbackup's DSN migration previously worked, not failed silently (#2765)
  • 7c5f7d8 docs(claude): a title/body-only PR edit no longer cancels its in-flight run (#2785)
  • 49c73f7 docs(claude): the -p 1 rule has a second reason, recorded (#2507)
  • 8e7739a docs(claude): the body-edit rule does not extend to a merged PR (#2502)
  • 5dd08b6 docs(cleat-worker): record the deferral decision for knownBrokenPluginDown repairs (cleat#2739) (#2768)
  • 70026bc docs(cmd): the schema-sidecar comments cite a test file that has never existed (#2990)
  • 2c09cf3 docs(cmd/cleat,engine): the SDK submodule is tagged, so the "never been tagged" claims are history (cleat#3078) (#3084)
  • df05834 docs(cmd/cleat-worker): the list-filter enumeration is CALLER-SETTABLE filters (cleat#3019) (#3052)
  • 1958fc6 docs(contributing): raise engine test timeouts to match measured reality (cleat#2252) (#2832)
  • f55a6ee docs(contributor): a verify step's duration is the reading its conclusion cannot give (#2451)
  • cf4e313 docs(debug-workflows): the watch-mode exit list had two conditions that are not exits (cleat#3027) (#3088)
  • f8b7141 docs(deploy-workflows): the lock file is not maintained by hand (cleat#3027) (#3030)
  • d0b69f2 docs(deploy-workflows): three dead links, a byte count, and the rollback pin (cleat#3027) (#3089)
  • e146f32 docs(durable-calls,worker-config): give the MySQL time_zone pin a concrete DSN syntax (#2935)
  • 46394c9 docs(engine): claimWorkflowsOnce's doc comment is #1926-stale (cleat#2780) (#2784)
  • 89f84dc docs(examples): all three DBOS ports pin 5.2.11, and two files still said otherwise (#3043)
  • 7065700 docs(examples): fix stale Saga compensation-error comment (cleat#2519) (#2713)
  • 6f87432 docs(examples): fix third-party-plugin's header contradicting its own ABI-layer comment (#2843)
  • 0abd027 docs(examples): re-base DX_COMPARISON's DBOS column onto the functional API (#3021)
  • 336b516 docs(examples): stop DX_COMPARISON.md stating closed gaps as open, and two DBOS contradictions (cleat#2996) (#3017)
  • 76609e9 docs(operations): a cleat deploy registers a definition for one tenant (#2719)
  • 1e79a05 docs(plan): give the component out-pointer state its own heading (§3.267) (#3061)
  • 9311fd5 docs(playbook): the ingest route's event type is a header (#2563)
  • aee5780 docs(playbooks): the B2B "one binary" claim is a product story, not a process count (cleat#2670) (#2953)
  • 9d98685 docs(playbooks): the routes hitch point names plugin.Router, not *http.ServeMux (#2514)
  • 1db7e35 docs(plugin): SecretOnlyFields covers input only -- document what protects output (cleat#2587) (#2594)
  • 7c15e2a docs(plugin): cite cleat#1611 on the three oauthprovider trace-debt entries (#2823)
  • 0ba61d9 docs(plugin): correct a stale "SQL Server does not have admin.plugin_tables" claim, audit its readers (cleat#2238) (#2816)
  • 76c4728 docs(plugin-security),plugin: the registry IS populated, and the claim it is not is load-bearing in two places (#3093)
  • 0ff0109 docs(plugins): fix RegisterRoutes example signature (cleat#2619) (#2707)
  • 5c2092e docs(plugins): fix stale Environment block, add a wrong-field guard (#2844)
  • 311dce7 docs(plugins): fix use-plugins.md's rejected err.Error() construct (cleat#2516) (#2790)
  • 9087d35 docs(plugins): the tenant-isolation docs named a table and a function that do not exist (#3082)
  • 128f2a5 docs(python-sdk): the README's examples use the preferred decorator form (cleat#3015) (#3116)
  • 8db5c1d docs(python-sdk,migration): use the parenthesised @cleat_entry form at the sites a reader copies (cleat#3115) (#3118)
  • 3cea6d2 docs(quick-start): audit corrections from running the guide (cleat#3027) (#3066)
  • 69a0ca7 docs(reference): state both mysql:// failure shapes, and what the tools now do (cleat#3067) (#3074)
  • c5e67dc docs(release): homebrew-bump has two failures, only one of which is a rotation (cleat#2498) (#2504)
  • 8395ac2 docs(release): read the enqueue from the queue, not from the command's output (#2537)
  • 6bf43b4 docs(release): read the queue as a queue, and what its refs and runs mean (#2557)
  • 6dfbcb5 docs(release): the back-merge flip precedes the ENQUEUE, not the merge (#2503)
  • 4e237d6 docs(release-process): point version-string check at the SDK agreement script (cleat#2454) (#2715)
  • 03a68ad docs(rotate-payload-encryption-key): cleat#2311 is fixed, and this section rests on it (cleat#3027) (#3092)
  • ca3ddda docs(sdk): the compatibility rule for cleat/pluginclients (cleat#2597) (#2671)
  • 9b43d9d docs(signals-and-human-loop): repair the AwaitSignals examples, and un-exclude the doc (cleat#3079) (#3094)
  • b0ea5cb docs(test-workflows): join the one example a join can fix, and name the two it cannot (#3104)
  • d73e9eb docs(test-workflows): join the workflow goroutine instead of sleeping at it (#3096)
  • 34b5ee7 docs(test-workflows): paraphrase the harness comment, don't quote a sentence of it (cleat#3098) (#3130)
  • eb76d34 docs(test-workflows): the timeout pair is blocked on the released SDK, not the harness (cleat#3098) (#3126)
  • d9d7b3d docs(test-workflows): two published examples did not compile (cleat#3027) (#3086)
  • b24ba16 docs(testdata): the pytyped fixture said the bare @cleat_entry form was broken; #2985 fixed it (#3014)
  • eba04ea docs(tiers): fix stale formal-specs entry — TLC does run (#2709)
  • 555cfa4 docs(use-plugins): the install path is unwired, and the bundled/installed split was inverted (cleat#3027) (#3085)
  • de62867 docs(worker): fix a false claim that BatchHeartbeat is still live (#2781)
  • 0809c59 docs(worker-config): give MySQL's --db example the bare DSN form, not mysql:// (#2961)
  • 953dfbf docs(workstream): R11 — routing is two acts, and the coordinator is not the lane (cleat#3007) (#3037)
  • 86e60e0 docs(workstream): the clone's git identity is a placeholder and only the CLA notices (#2495)
  • 5cd0667 docs(workstream): the clone's identity is no longer a placeholder (#2556)
  • 1776da3 docs(workstream): the shared-files table names the skip-ledger directory, not only the single file (#2981)
  • 6f4d42b docs(your-first-workflow): the walkthrough does not run as written (cleat#3027) (#3068)
  • d502242 docs+ci: guard the DBOS pair's README line counts against its own counter (#2623)
  • 4519c32 examples: build the ai-agent-platform scenario, and fix the two defects it found (#2574)
  • b15272e examples: run the integration-hub scenario on MySQL and SQL Server too (#2560) (#2566)
  • 43068c6 examples: run the integration-hub scenario, with its app and its page (#2552)
  • 63f24b3 examples: run the order-lifecycle scenario on MySQL and SQL Server, not just PostgreSQL (#2560) (#2565)
  • 41f1855 feat(agentworkflow): a budget ceiling, tenant echo and artifact write (cleat#3022, part A) (#3025)
  • 95c4be3 feat(agentworkflow): a configurable tool-error mode and an approval-gate tool kind (cleat#3022, part B) (#3029)
  • 2682ddf feat(auditlog): close record_event's AtLeastOnce residual by default (cleat#2618) (#2624)
  • fd9584d feat(auditlog): convert record_event to plugin.RegisterTyped, add its typed client (#2712)
  • c306b19 feat(auditlog): record_event host function for cleat#2534 Stage 2 (#2616)
  • ee3c5c9 feat(auth,cmd): an operator credential confined to /api/admin/* (cleat#2169) (#2982)
  • 5af2f9f feat(auth,engine,cleatctl): per-tenant operator opt-in for the public exposure class (cleat#1986) (#3148)
  • 22b73e7 feat(auth,plugin): a tenant-lifecycle capability grant, and its first use (#2590)
  • fa8ce33 feat(backendkit): a method for a plugin's own HTTP routes (#2562)
  • 00af795 feat(catalogdiff): compare column collation on every dialect (cleat#2882) (#3121)
  • f53b693 feat(ci): a claim about a required check must name it, and the claim is then tested (#2530)
  • dc82445 feat(ci): a job restricted away from pull requests must say why (#2531)
  • 2a02ab1 feat(ci): advisory check for a PR that declares no closing reference (cleat#1962) (#3180)
  • e957224 feat(ci): check that a client generated from /api/openapi.json refuses a misspelled call (cleat#2972) (#2986)
  • 2cd2948 feat(ci): check the playbooks' live "still to build" claims against the tracker (cleat#2603) (#3109)
  • feea90a feat(ci): guard against a local package's package-lock.json drifting from its package.json (#2585)
  • 512edac feat(ci): guard that every Lint job step carries the if: always()/wrapper shape (#2912)
  • e76f09f feat(ci): guard that every MSSQL MERGE carries HOLDLOCK or a recorded exemption (#2909)
  • 2827d47 feat(ci): wire check-sdk-version-agreement.py --self-test into Lint (cleat#3184) (#3186)
  • de221b9 feat(cleat)!: ship the agent loop as a workflow (cleat#1983) (#2979)
  • 44701fe feat(cleat): a saga publishes its own query state (cleat#2627 half i) (#2951)
  • 9beb8ca feat(cleat-worker): declarative ambiguity resolution via --ambiguity-lookup (#2891)
  • 85243ea feat(cleat/agentworkflow): a declarative tool can map its own arguments (cleat#3169) (#3174)
  • 7f82b16 feat(cleat/agentworkflow): the approval gate reports that it is waiting (cleat#3170) (#3172)
  • 1c7752c feat(cmd/cleat,wasm): a workflow declares its exposure class in source (cleat#1986 slice 2c-i) (#3031)
  • 032f21b feat(cmd/cleat-mcp): expose deployed workflows as MCP tools, gated by the exposure classes (#3011)
  • 9a8708f feat(cmd/cleat-worker): an internal workflow definition is not reachable over HTTP (cleat#1986 slice 2b) (#3002)
  • 6236d22 feat(cmd/cleat-worker): wire the reaper to cleat#2196's veto channel (4/4) (#2946)
  • 976346a feat(cmd/cleat-worker): worker-to-worker auth + /internal/holds listener (cleat#2196) (#2934)
  • fe21eea feat(cmd/cleat-worker,docs): an operator credential can act on a named tenant (cleat#2169) (#3012)
  • 287e9d2 feat(docs): a guard for documented calls that name a method which does not exist (#2529)
  • 2309f86 feat(engine): StaleHolderReaper -- list and exclude-on-reclaim for stale runs (cleat#2196, 1/4) (#2926)
  • 7811095 feat(engine): a blocking durable wait for external events (cleat#2998) (#3049)
  • 7719033 feat(engine): pod addressability for reaper-to-worker veto channel (cleat#2196) (#2930)
  • c6f0ee8 feat(engine): workflow_defs gets a closed exposure class (cleat#1986, slice 1) (#2888)
  • 681b337 feat(engine,build): typed invocation part 1 — JSON Schema emitter + storage (cleat#1980) (#2892)
  • 14ab08d feat(engine,cmd): the deploy paths honour a source-declared exposure class (cleat#1986 slice 2c-ii) (#3033)
  • e593e3d feat(engine,cmd): validate start input against the definition's schema (cleat#1981) (#2927)
  • 795f325 feat(engine,cmd): wire the tenant public-exposure opt-in into enforcement (cleat#1986) (#3154)
  • b9f0e81 feat(engine,cmd/cleat-worker): exclude internal definitions in the query, not after paging (cleat#3009) (#3016)
  • c66ecac feat(engine,cmd/cleat-worker): same-key idempotency replay for ambiguous calls (#2911)
  • 07bf078 feat(engine,cmd/cleatctl): carry a definition's exposure class through the stores (cleat#1986) (#2989)
  • 4573d1b feat(eventtriggers): add Keys to awaitEventInput and correlate the claim query (cleat#2625 P1 read side) (#2668)
  • e93c099 feat(eventtriggers): key slots and correlation groundwork (P1 of event routing design) (#2646)
  • ddd991f feat(examples): DBOS pair for the integration-hub wedge -- a boundary DBOS does not have (#2621)
  • e06aed8 feat(examples): executed DBOS counterpart for order-lifecycle (cleat#2597) (#2607)
  • 73d70f1 feat(examples): run the order-lifecycle scenario end to end in CI (#2512) (#2523)
  • a41365c feat(examples): the b2b-saas-control-plane DBOS counterpart, run end to end (cleat#2681) (#2954)
  • b6fb97b feat(examples): the b2b-saas-control-plane scenario, run end to end (#2716)
  • 1679470 feat(examples): the wedge -- a tenant's own uploaded step, and its sandbox refusal (cleat#2597) (#2617)
  • fa1bf57 feat(examples/ai-agent-platform): migrate onto the shipped agent workflow (#3176)
  • 85dafe1 feat(hooks): refuse a push whose branch name is outside the six prefixes (#3013)
  • 0cfe41e feat(integration-hub): a bilateral infinite-loop tenant behaviour (cleat#2628) (#2638)
  • 39711bb feat(migrations): MySQL and SQL Server get a least-privilege cleat_app login (cleat#2203) (#2929)
  • 40e7d94 feat(plugin): add Step and RunID to plugin.CallContext (#2618)
  • 5dc0429 feat(plugin): declare every plugin.ForTenant call site (cleat#2164) (#2738)
  • 0603359 feat(plugin): typed plugin clients, replacing hand-written JSON around PluginCall (#2657)
  • 0b64a11 feat(python-sdk,cmd/cleat): JSON Schema emitter for Python entry points (cleat#2914) (#2933)
  • 68632ee feat(python-sdk,engine): Python exposure declaration, @cleat_entry(expose=...) (cleat#1986) (#3147)
  • 79da4b4 feat(scheduledbackup): implement plugin.HasHealth, driven by DSN-unavailable attempts (#2764)
  • 8677be2 feat(tenantlifecycle): tenant-scoped trial-status route for cleat#2534 Stage 3 (#2683)
  • db7ce2d feat(webhookingest): adopt correlated await via eventtriggers' P1 mechanism (cleat#2649) (#2697)
  • 9bdda3a feat(webhookingest): retire signal_workflow_id/signal_name (cleat#2689) (#2833)
  • baf3be6 feat(worker): give sharded deployments a per-shard reserved heartbeat pool (#2925)
  • cd392ad feat(worker): serve GET /api/openapi.json from the deployed entry-point schemas (cleat#2913) (#2971)
  • f8ff5b2 fix(auditlog): settle() waited for the loss count, not for the host to be told (#2571) (#2578)
  • cafb1a4 fix(auditlog): the chain hashes metadata as the database stores it, not as supplied (#2591)
  • df8b2ba fix(backendkit): classifyError exposes the upstream status, so 4xx stops flattening to 502 (cleat#2718) (#2810)
  • b927400 fix(blobstore): admin.drop_tenant left dropped tenants' blob_content ref_count stuck forever (cleat#2250) (#2872)
  • 99e3834 fix(blobstore): blobPut enforces max_blob_size, not just PUT /blobs (cleat#2275) (#2723)
  • 41ecc40 fix(blobstore): match backend case-insensitively; refuse unknown values (#2824)
  • 3d3a6e7 fix(blobstore): retry on MSSQL deadlock in the stale-refs sweep (cleat#2303) (#2827)
  • c1a98ea fix(catalogdiff): mssql comparator compares a FOREIGN KEY's actions and trust bit (#2732)
  • 370007b fix(ci): EXPRESSION_ALLOWLIST keys on expression text, not step position (cleat#2797) (#2809)
  • 805f469 fix(ci): Lint job runs every guard, even when an earlier one fails (#2896)
  • 6b872cf fix(ci): a curly quote fails the lint job in Python sources; Go is out of scope, and why (cleat#2987) (#2988)
  • 587fbfd fix(ci): anchor the goreleaser dist rule so the embedded bundle stays committable (#2509)
  • 3817689 fix(ci): cap the jobs that hung in #2862, raise tier1-rest's eaten buffer (#2879)
  • bd693b9 fix(ci): check-skip-budget.sh rejects shifted ledger lines and resolves suffix/named-line overlap (#2753)
  • e129091 fix(ci): check-workflow-concurrency.sh no longer confuses a build input with a trigger (#2734)
  • 3b15681 fix(ci): closing-reference regex no longer flags a paren-wrapped #N (cleat#2800) (#2807)
  • 58b13b9 fix(ci): detect a negated closing keyword that still closes the issue it names (cleat#2436) (#2703)
  • d8b255e fix(ci): gate check-plan-references.py's full mode, with a shrink-only baseline (#3054)
  • 455e6a0 fix(ci): guard a cluster-only skip-ledger line for an engine/ test (cleat#2158) (#2771)
  • f9105b3 fix(ci): point the skip-budget overflow error at the overlap fix it needs (cleat#3159) (#3160)
  • 9062b25 fix(ci): python-sdk release artifacts had no unique suffix at all (#2889)
  • e8e1548 fix(ci): run CI on PRs whose base is a release branch (cleat#2483) (#2492)
  • b94b146 fix(ci): share the on: trigger parse between two workflow guards (#2893)
  • 03c12fe fix(ci): the coverage floor names the package it scores, and two jobs stop overclaiming (#2494)
  • 4af39cb fix(ci): the coverage job runs with the database its floors were calibrated against (#2508)
  • a4174c1 fix(ci): the docs-method guard no longer assumes an open paren (#2548)
  • e3e420e fix(ci): the integration-hub restart tells compose to act, instead of waiting on a read that can be wrong (cleat#2965) (#2970)
  • 84da780 fix(ci): tier-1 log upload no longer fails the gate on a network hiccup (#2846)
  • ddeb0d9 fix(ci): tier-2 log upload no longer fails the required gate on a network hiccup (#2848)
  • d5d8535 fix(ci): tier1 shard logs collide under one filename once merged (cleat#2877) (#2884)
  • 551f18d fix(ci): tier1-push-failure-notifier dedups per run+attempt, not per run (#2907)
  • 2746770 fix(ci): tier1-push-failure-notifier scopes per-shard log selection to each shard's own highest attempt (#2905)
  • 0ff4798 fix(ci): upload-artifact names keyed only on github.sha will 409 on a re-run (#2875)
  • 787b59d fix(ci): upload-artifact names keyed only on run_id will 409 on a re-run (#2861)
  • 092067a fix(cleat): a saga that succeeds after a failed one clears the earlier failure keys (cleat#2967) (#3162)
  • 752f433 fix(cleat): name the WASM artifact after cleat.yaml's name:, not the entry point or source file (#2692)
  • a070834 fix(cleat-worker): anchor /livez recovery grace on the last known-good call (#2728)
  • 0f2e82f fix(cleat-worker): log the API address the socket actually bound, not the configured one (cleat#3136) (#3137)
  • a9a42b0 fix(cleat-worker): log the bound address for --pprof-addr and --internal-addr too (cleat#3139) (#3141)
  • bffecfc fix(cleatctl): backup history shows a NULL config_id as '-', not the zero UUID (#2730)
  • 6ec4929 fix(cleatctl): check-db detects a superseded, unpinned SECURITY DEFINER function overload (cleat#2449) (#2702)
  • 1ca8883 fix(cleatctl): inline-statement guard migrates tenant_quota and tenant_trials (#2727)
  • ff9391e fix(cleatctl): mssqlPostureOf consults admin.rls_predicate_form, not just membership (cleat#2760) (#2808)
  • 340a862 fix(cleattest): record plugin calls in the history the call assertions read (#2546)
  • 1985855 fix(cleattest): sequence repeated OnPluginCall(...).Return() calls (#2606)
  • 69de7b3 fix(cli): plugin install and list said nothing about the plugin never running (#2724)
  • c2a8864 fix(closure): E008 catches interface dispatch through a field or a call result (cleat#2799) (#2801)
  • b7775e5 fix(closure): E008 names the call and a column, not just the line (cleat#2516) (#2791)
  • 221d09e fix(cmd/cleat): bind-then-log the fullstack scaffold's proxy, close the last cleat#3131 site (#3145)
  • 1d2aa5a fix(cmd/cleat): deploy reads the entry-point-schema sidecar cleat build writes (#3151)
  • 1d9561d fix(cmd/cleat): discover the quick-start tests' worker port from its log (cleat#3131) (#3140)
  • 553abe9 fix(cmd/cleat): fail loudly on a cleat.yaml that isn't valid YAML at all (#2858)
  • 4287b88 fix(cmd/cleat): hold each reserved TCP port across the other picks, release before the bind (cleat#3122) (#3128)
  • 35b13e6 fix(cmd/cleat): let docker allocate the fullstack test's ports, and read back what it bound (cleat#3131) (#3135)
  • f1229ae fix(cmd/cleat): metadata's WorkflowName no longer carries a .wasm suffix (#2849)
  • c99ab12 fix(cmd/cleat): the documented-invocation scan read .py sources raw, so a docstring escape became a shell token (cleat#2984) (#3020)
  • 32fab2e fix(cmd/cleat): unify entry_points: schema and check it against the build (cleat#2698) (#2812)
  • 35bca49 fix(cmd/cleat-mcp): log the address the socket actually bound, not --addr (#3161)
  • 19f7cc5 fix(cmd/cleat-mcp): tasks/cancel never worked -- no request body, worker needs one (cleat#1982) (#3149)
  • f77539c fix(cmd/cleat-worker): GET /api/schedules hides an internal definition's name (cleat#3001) (#3120)
  • 5d0c898 fix(cmd/cleat-worker): a definition-not-found 404 names the workflow (#3167)
  • d017980 fix(cmd/cleat-worker): migrations-outside-repo test no longer hardcodes a port (cleat#3143) (#3146)
  • 15cd3a7 fix(cmd/cleat-worker): remove the duplicate authResolver build (#2694)
  • 76ddef9 fix(cmd/cleat-worker): scope runIsFenced to the execution's generation (cleat#2956) (#2977)
  • e05d062 fix(cmd/cleat-worker): the eight routes that never verified their target now answer not-found (#3038)
  • 8ce6ae5 fix(cmd/cleat-worker): the fence cancels only the generation it judged (cleat#2942) (#2950)
  • 97d779a fix(cmd/cleat-worker,engine): a stopped run is released, not failed (cleat#2942) (#2957)
  • dedd605 fix(cmd/cleatctl): deploy stamps the version it assigns into the binary (#2945)
  • a0a8c06 fix(cmd/cleatctl): refuse a mysql:// DSN before the driver sees it (cleat#2962) (#3064)
  • 79d0971 fix(cmd/cleatctl): wire the deploy dedup guard, normalising workflow_version (cleat#2947) (#3050)
  • 0146a08 fix(compose): the dev MySQL healthcheck probed the socket, not TCP (#2577)
  • b7ab545 fix(conformance): the binding table's control could not fail, and now can (cleat#2542) (#2570)
  • 6417bf5 fix(deploy): the SQL Server app-role script reported success when it had failed (cleat#2939) (#2948)
  • 97dfb66 fix(docs): 42 more migrations/postgres/NNN citations the rebaseline deleted (cleat#2725) (#2772)
  • 79f10fb fix(docs): README's Quick Start could not reach done (cleat#2788) (#2798)
  • 9b4be4c fix(docs): error-codes.md names three methods that do not exist — and the guard now reaches prose (#2561)
  • 927603c fix(docs): exercise docs/tutorials/quick-start.md in CI (cleat#2802) (#2841)
  • 3771a47 fix(docs): playbook citations of migrations the rebaseline deleted (#2726)
  • a87b510 fix(engine): ConsumeSignal wraps DELETE+increment in one MSSQL transaction (cleat#2758) (#2778)
  • 615659d fix(engine): MSSQL reap/stall-shape queries no longer overflow past ~24.86 days (#2751)
  • f28b2a1 fix(engine): MoveToDeadLetterQueue now preserves the final failing replay's query state (#2662)
  • be5c0e2 fix(engine): PG OpenIsolatedStore matches OpenStore; key RLS exemption by statement, not line (#2741)
  • 44f0bff fix(engine): a WASI-policy trap no longer reports as a false success (#2613)
  • 0c317c0 fix(engine): assert the concurrency-key reap by key, not by table-wide count (cleat#2922) (#2960)
  • df3490e fix(engine): batch-flush gate follow-ups from #2355's review (#2685)
  • 83222fc fix(engine): checkSecretOnlyFields matches raw JSON bytes, catching an escaped reference ResolveSecretRefs could never resolve (cleat#2336) (#2923)
  • f5c56c5 fix(engine): choose run ids that cover every shard, so the sharded-heartbeat test cannot flake (cleat#2963) (#2964)
  • 0b4b14e fix(engine): classify DB-originated finalize errors into CleatError (cleat#2805) (#2829)
  • a74fd43 fix(engine): close the reclaim-race window in the per-step event fence (cleat#2244) (#2815)
  • 18a0821 fix(engine): correct three stale migration-history comments in schema_bootstrap_test.go (cleat#2417) (#2710)
  • 44b4492 fix(engine): delete the three baselined MSSQL error classifiers (cleat#2792) (#2804)
  • 6cae18b fix(engine): enforce API-key expiry on PostgresStore/MySQLStore/MSSQLStore (#2921)
  • 7db8326 fix(engine): guard and fix MSSQLStore.WithTenant plain reads (cleat#2210) (#2756)
  • 489c484 fix(engine): promise and update settlement wakes a running workflow (cleat#3171) (#3175)
  • 190f9f9 fix(engine): raise MySQL finalize's retry budget from 8 to 16 (cleat#2033) (#2919)
  • e62410d fix(engine): record event_awaiters.id's MySQL asymmetry as compensated (#2856)
  • c9e8891 fix(engine): remove a dead OR tenant_id IS NULL clause on MSSQL (cleat#2635) (#2706)
  • e8cdef6 fix(engine): scope the drop-tenant ratchet past plugin-registered tables (cleat#2959) (#3156)
  • c992976 fix(engine): the UUID-projection guard prescribed the form that ships the bug (cleat#2983) (#2994)
  • 181a8f4 fix(engine): the stale-holder tests pass a zero margin, not a 1ns one (cleat#3032) (#3034)
  • e05286d fix(engine,auth,cmd/cleatctl): require LOWER on MSSQL UUID projections (cleat#2993) (#3008)
  • 0a285de fix(engine,cmd/cleat-worker): a keyless worker refuses to start once payload encryption has ever been enabled (cleat#2324) (#2924)
  • cc0f83e fix(engine,cmd/cleat-worker): routing rule deletion is scoped by workflow name (cleat#3168) (#3177)
  • d83a633 fix(engine,plugins): assess and close 11 of 12 MSSQL MERGE HOLDLOCK candidates (#2917)
  • dfb5981 fix(engine/testutil): derive the MSSQL plain-predicate replay list instead of hardcoding it (cleat#3173) (#3178)
  • d718ea2 fix(eventstore): hot-stream appends serialize on a per-stream row lock instead of retrying (#2885)
  • fc8e0d4 fix(eventtriggers): PublishEvent rejects invalid JSON before the INSERT (#2680)
  • 3173a81 fix(eventtriggers): SQL Server claim no longer locks every candidate it examines (#2869)
  • 478752c fix(eventtriggers): awaitEvent marshals its output before committing the claim (cleat#2654) (#2665)
  • 3a0066b fix(eventtriggers): await_event reads oldest-first and claims atomically (cleat#2641) (#2645)
  • e34949a fix(eventtriggers): enter the cross-tenant bypass before migration backfills on TenantScoped tables (#2862)
  • 41019fc fix(eventtriggers): give TestV8BackfillPreservesTheOldSweepSelection/mssql its own database (#2874)
  • 4c47933 fix(eventtriggers): replace idx_ingested_events_correlate with a processed-excluding index (cleat#2669) (#2675)
  • 6271813 fix(eventtriggers): retryEvent's dispatch bookkeeping no longer shares a flag with the awaiter backstop claim (cleat#2663) (#2822)
  • b2f1ac4 fix(eventtriggers): the legacy-replay test calls real functions instead of hand-copying them (cleat#2664) (#2684)
  • 61b34de fix(examples): bump the two older DBOS ports onto the SDK the third one uses (#2958)
  • 94f109f fix(examples): distinguish a worker that never restarted from one that is not ready yet (#2803)
  • 8831dbe fix(examples): regenerate widget-store-as's stale package-lock.json (#2584)
  • 6be41eb fix(examples): the DBOS order-lifecycle pair was not equally scoped (cleat#2997) (#3035)
  • b6de717 fix(githooks): validate Claude-Stream with git's own trailer parser (cleat#2588) (#2634)
  • 49c6d24 fix(jobqueue): restore task_queue.payload NOT NULL on MySQL (cleat#2282) (#2721)
  • 04a9ea0 fix(llm): a model absent from the price table is no longer priced as a mid-range one (cleat#2572) (#2586)
  • 58b7231 fix(make): tools-go's version check uses GNU-only grep -oP (cleat#2583) (#2605)
  • 70bbea1 fix(makefile): make setup's own next-steps recommend two broken commands (#2581)
  • a8af24d fix(migration): catalogdiff compares MSSQL security policies, triggers, schemas and roles (#2865)
  • 617f2b7 fix(monitoring): counter HELP/TYPE lines must name the actual sample (#2814)
  • 32275fc fix(monitoring,cmd/cleat-worker): /metrics does not render an internal definition's name (cleat#3001) (#3123)
  • 0d2a875 fix(oauthprovider): a typed-nil hostResolver defeats the --require-host-match guard (#2688)
  • a5f30f9 fix(order-lifecycle): guard the page's vocabulary, which nothing executed (#3105)
  • 9a0b84d fix(plugin): RegisterTyped rejects an unknown request field (cleat#2660) (#2676)
  • 29f59d0 fix(plugin): a field's type can reference a defined type, not just inline it (#2806)
  • 3fd0a91 fix(plugin): detect plugin.json manifest drift from real Go types (cleat#2656) (#2775)
  • 276bf24 fix(plugin): harden the total-coverage ledger scanners past CallExpr.Fun (cleat#2740) (#2773)
  • 6ff666b fix(plugin): stop three tree-scanning guards from reading assertGoCompiles' scratch dir (cleat#2811) (#2818)
  • 19f6c98 fix(plugin): wrap RunDownMigrations Phase 2 in a per-version transaction (#2859)
  • caad605 fix(plugingen): Go backend generates FuncRegistry registration code, not a broken caller client (#2783)
  • 11987f2 fix(plugins): guard 10 unsafe MySQL CREATE/DROP INDEX migrations, slice 1 (cleat#2880) (#2910)
  • 4cbd37c fix(plugins): guard 11 unsafe MySQL ADD/DROP COLUMN migrations (cleat#2880) (#2900)
  • 49ab3dc fix(plugins): guard 11 unsafe MySQL CREATE/DROP INDEX migrations, slice 2 (cleat#2880) (#2916)
  • 210310a fix(plugins/kvstore): fix two concurrent-write races in upsertKV/handlePut (MSSQL HOLDLOCK, MySQL status code) (#2903)
  • 6075d4a fix(plugins/scheduledbackup): TestNextRun_Feb29NonLeapYear can now fail (#2851)
  • 6840595 fix(python-sdk): _from_dict builds kwargs from init's signature, so a required InitVar is passable (cleat#2940) (#3057)
  • 53bcb7d fix(python-sdk): a payload the constructor takes nothing from is refused, not dropped (cleat#3058) (#3060)
  • ad23259 fix(python-sdk): record plugin calls in the history the call assertions read (#2568)
  • 87a1364 fix(python-sdk): refuse an assertion over a plugin name that can never match (cleat#2567) (#2579)
  • f13d4f9 fix(python-sdk): the bare @cleat_entry form registers under a name (cleat#2976) (#2985)
  • a3127de fix(ratelimiter): a spent bucket refused the PUT that would raise it (#2559)
  • 64ebc9f fix(reaper): a persistent stall-probe failure now trips the chronically-skipped alarm (cleat#2193) (#2735)
  • 4287ea7 fix(release): the AssemblyScript package set moves to 0.4.0
  • 96275d9 fix(scenario): stop when the worker is gone, and dump the logs that show why (#2564)
  • 21daf28 fix(scheduledbackup): warn when the CLI writes a config the backup will fail to reach (#2763)
  • ba6ebd4 fix(scripts): a closing keyword in a code span is inert and says nothing (cleat#3028) (#3047)
  • ab261d9 fix(scripts): a closing phrase inside quotation marks is cited text, not this body's attempt (cleat#3095) (#3101)
  • f65d470 fix(scripts): a missing PR_NUMBER no longer exits with a finding's status (#3023)
  • 88dc2c9 fix(scripts): an emphasised closing keyword is a closing attempt (cleat#3102) (#3110)
  • 657bc25 fix(scripts): an uncompilable pattern is UNMEASURED, not a pass (cleat#3103) (#3107)
  • 550bb41 fix(scripts): attribute the last five test-go/commands skips and lock the ratchet (cleat#2928) (#2943)
  • 808e7ca fix(scripts): check-dbos-pair-loc.py now checks the integration-hub wedge pair (#2749)
  • 09cd598 fix(scripts): check-dbos-pair-loc.py's self-test now runs the real producer (cleat#2633) (#2637)
  • cc7367b fix(scripts): check-plan-references.py resolves §N.M citations into other documents' own namespaces (#2868)
  • 6a093c3 fix(scripts): check-plugin-table-namespace.py strips comments before matching (#2693)
  • 21a96cf fix(scripts): check-skips.sh cross-checks skip-baseline.txt against the runtime ledger (#2761)
  • e7fac82 fix(scripts): doc-comment guard keys a method on (receiver, name), not bare name (#2774)
  • b5e370a fix(scripts): exclude a test fixture from check-sdk-version-agreement discovery (cleat#3183) (#3185)
  • 3f08fd8 fix(scripts): migration-citation guard covers mysql/mssql and bare-number citations (cleat#2817) (#2819)
  • becdb86 fix(scripts): name every test in multi-db's two UNATTRIBUTED remainders (#2863)
  • 2aca774 fix(scripts): sum behaviour assertions on both sides of the DBOS pair tables (#3040)
  • 51aa105 fix(scripts): the DBOS pair counter's fixtures are checked against the program (#3044)
  • 2a7f9c8 fix(scripts): the Python surface check compares the two sets, not just each count to its own document (#2576)
  • 05b97fc fix(scripts): the doc-comment guard reads a lone argument as "use the defaults" (cleat#2479) (#2582)
  • 74b27bc fix(scripts): the negated closing-reference wrapper asserts its own usage (cleat#3024) (#3045)
  • 5101eeb fix(scripts): wait for the field each B2B assertion reads, not a neighbour of it (cleat#2966) (#3133)
  • 2ec848d fix(slacknotify): the leftover-key WARN said "no effect", but its presence gates the boot (#3070)
  • 328933c fix(testdata): delete a runbook carrying a plaintext database credential (#2640)
  • 9540c74 fix(tests): two multi-dialect loops continue past a missing backend with no skip event (#2883)
  • f693b38 fix(testutil): MSSQLAdminDB's self-heal now sees live callers across processes (#2899)
  • 4317658 fix(testutil): self-heal a leftover MSSQL admin predicate on schema setup (#2855)
  • 28c3823 fix(tier2-gate): eventtriggers legacy-replay dialect test gets a zero skip budget (#2864)
  • 276a694 fix(wasm): refuse a workflow import staging cannot satisfy (#2667)
  • a32c27d fix(wasm): the section walk desynchronised on every custom section, losing or inventing imports (#3076)
  • e42266a fix(wasm,python-sdk): recognize WASM Component Model binaries in metadata read/write (#2941)
  • 58c8ed8 fix(webhookingest): guard v3/v4/v7's MySQL ALTER TABLE, re-run the newest plugin migration not the first (#2881)
  • ff6c58f fix(webhookingest): the MySQL idempotency test skipped silently with no CLEAT_TEST_MYSQL (cleat#2887) (#3144)
  • b8d5ba3 fix(worker): a failed run's published query state reaches FailWorkflow (#2648)
  • 21ff717 fix: correct stale comments describing #1926's retired cross-tenant claim (#2769)
  • 78c15d3 fix: stop naming a migration file the 0.3.0 compaction deleted (#2555)
  • b642b5f fix: struct parameters bind by parameter name — five places said they bind by field (#2543)
  • 9232c71 refactor(migration): share BaselineFiles between the drift test and verify.go (cleat#2472) (#2722)
  • 394b7c0 test(auditlog): add SQL Server counterpart for cross-tenant RLS isolation (cleat#2714) (#2840)
  • 14ed288 test(ci): the Python matrix covers 3.13, the newest version the package claims (#2462)
  • 7b3c34a test(cleat): every root require must name the same version (cleat#2497) (#2505)
  • 63738bb test(cleat-worker): assert the three list filters that reached the store unasserted (cleat#3053) (#3059)
  • fe64c9a test(cleat-worker): exhaustive arithmetic sweep of the reaper recovery gate invariant (#2744)
  • 216b74c test(cleat-worker): the document lists a Go and a Python fixture workflow (cleat#1980 item 2) (#3005)
  • 6571fdf test(cleatctl): a Python fixture workflow deploys with a schema (cleat#1980 item 1, Python half) (#3000)
  • c9301fc test(cleatctl): the sidecar cleat build writes is the one deploy reads (cleat#1980 item 1) (#2991)
  • 2c036f1 test(cleattest): WaitForParked — the drain precondition the harness documented but never provided (cleat#3091) (#3124)
  • 3c02943 test(cmd/cleat): a Gradle wrapper fetch failure names itself instead of reading as a manifest failure (cleat#3039) (#3055)
  • c471833 test(cmd/cleat): compile the how-to pages' snippets, one file per block (cleat#3097) (#3113)
  • e89a416 test(cmd/cleat): compile the template SOURCE against the tree (cleat#3100) (#3106)
  • 2815b0d test(cmd/cleat): compile the tutorials' Go snippets, and check their links (cleat#3072) (#3080)
  • c131d80 test(cmd/cleat): one home for the build-refusal tests' two checks, and disjoint failure text (cleat#3075) (#3077)
  • eab6f54 test(cmd/cleat): rename the README guard to say what it actually covers (#2789)
  • 91a70ea test(cmd/cleat): the Rust and AS absence-arms assert the build reached the stage (cleat#3063) (#3071)
  • 0daa427 test(cmd/cleat): the absence-arms assert the build reached the checker (cleat#3056) (#3062)
  • c2330c8 test(cmd/cleat): the scaffold helper can go now that the SDK submodule is tagged (cleat#3083) (#3099)
  • 9f39254 test(cmd/cleat-mcp): close cleat#1982's clause 1 for real -- real binaries, real database, no fake (cleat#1982) (#3153)
  • 483b46a test(cmd/cleat-worker): boot the worker on :0 and read the bound API address, not freePort (cleat#3138) (#3142)
  • 3a23fbe test(cmd/cleat-worker): drain the local claim queue rather than trust a fixed limit (#2736)
  • 2847220 test(cmd/cleat-worker): pin start-input validation against the schema cleat build emits, Go and Python (cleat#1981) (#2975)
  • b763b6e test(engine): SQL Server retention-sweep concurrent-writer p99 latency harness (#2746)
  • f7fd5c5 test(engine): TestReapStaleInstances asserted nothing a stopped reaper fails (#3046)
  • d50c015 test(engine): demonstrate the mssql#2139 retry loop recovers from a transient (cleat#3117) (#3179)
  • 394bb46 test(engine): fix RLS gap in TestARetiredSecretStopsResolvingAndSetSecretRevivesIt's cleanup (#2731)
  • ddaef0a test(engine): re-measure the mssql#2139 latency bound per attempt, failing only if every one exceeds it (#3129)
  • e773969 test(engine): widen isDialectSensitiveTestFile beyond literal sql.Open (cleat#2286) (#2720)
  • aeb2d26 test(mssql): cover the five statements only review's probe ever ran (#3108)
  • 858fc95 test(oauthprovider): a real-DB arm proving identityAllowed's tenant scoping (cleat#2378) (#2825)
  • c4a6db7 test(scheduledbackup): backupDSN is fetched fresh, not cached (#2762)
  • a8e1ed6 test(testdata): delete clew-lifecycle's tests, which assert the opposite of the code (#2592)
  • 3762b34 test(testutil): add tenant_secrets and its siblings to the cleanup table lists (#2687)
  • 368befb test(wasm): cover a root-module workflow importing a non-SDK root package (#2674)
  • 4f719b8 tools: a committed job-log fetch helper (cleat#3132) (#3134)