Skip to content

Exercise published SDK signal clients and cold workflow authors - #415

Draft
rmcdaniel wants to merge 8 commits into
mainfrom
rust-325-sdk-signal-cold-replay
Draft

rmcdaniel wants to merge 8 commits into
mainfrom
rust-325-sdk-signal-cold-replay

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Oct 11, 2026 •

Copy link
Copy Markdown
Member

Adds nine published PHP/Python/Rust signal-client and workflow-author combinations. The original worker registers its signal declaration before the PHP observer starts the run; two separate client processes send identical exact Avro payloads, and three cold author processes preserve both accepted command identities and the full original history through completion.

Each adapter uses its published SDK's ordinary instance-current-run API. The reader requires the published HTTP 202 signal acceptance, retains Python's absent client receipt, and binds actual process, registration, claim and fenced completion receipts to the original run. Canonical embedded direct-signal histories remain intact with SDK transport explicitly inapplicable. The separate manifest preserves the timer/child tuple and resource envelopes; all six database jobs reuse one SDK build and clean their own isolated resources.

Validation: 57 signal guard models and all 4,479 reader tests pass; PHP recorder 5 tests/24 assertions, syntax/AST/format/shell and Docker isolation policy/72 regressions pass. The frozen SDK preparation passes exact package/source/member hashes. Corrected-source all-six runtime qualification and independent official record/wire inspection remain pending. No performance or broader signal-policy claim.

Part of #325. Reviewed scope. Published HTTP 202 contract correction.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Draft #415 is open at 4efccc9155accb2cdbef3e0e5e495e8cfc448221, tree 6194e8a0e7b6ce0e9d447f0428aed873e608681f, after integrating #413 main 8709feb28f1b85853de1d9ad15152d961860926f. Rust subtree remains 6a64e0c8c8305babe8a2d419998ee54d4adaa064; the integration changes no Rust/shared harness, worker, fixture or reader sources.

Shared Server fixtures 38174375337, PHP/source 38174375266 and boundaries are running. Local source/model checks pass; actual new SDK compilation, durable signals, all-six comparison and independent official artifact/wire inspection remain pending. No runtime pass or merge is claimed. The frozen prior tuple/envelopes and earlier fixtures are unchanged. Next: qualify this exact integrated source and its real runner/artifacts, then merge/main-verify/clean up after the coordinated release window completes.

@rmcdaniel

Copy link
Copy Markdown
Member Author

The exact #415 SDK preparation passes and is independently inspected. Candidate 4efccc9155accb2cdbef3e0e5e495e8cfc448221 and actual runner cabc9ce0927b1d86de89ae1551aed3a0eaaaaea2 share tree 6194e8a0e7b6ce0e9d447f0428aed873e608681f; the runner has expected #413-main/candidate parents.

Official sdk-direction-adapters artifact 11714804496 matches API, uploader and download: 10,947,133 bytes, SHA256 f65af64df3e84c5879f0110135c3f678863c27641c9691d6c4cfe72499aa3302. All 297 original manifest member hashes, nine retained thin byte comparisons and seven current worker source hashes pass. Actual package identity confirms Python 2.5.4/commit 86cfced48a3938b41d707f26eea1ff098e07ffcb and Rust 3.4.4/commit 6f316506de136ebaa7124cdfd011f656b355192a, with unchanged frozen package archive hashes.

This establishes actual adapter compilation and provenance. The observed warm Rust adapter build is 7.47 seconds; it is not a cold-toolchain or runtime performance result. All six runtime jobs and normal PHP/source are still running. Actual completed signals, receipts, histories and full sidecar inspection remain pending. Thin receipts/logs are retained; the downloaded prep ZIP is being removed, with no dependency tree/binary extraction retained. Main landing remains coordinated through #413's release/publication window.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Integrated General #414 main 18c6aa72a01cdaedeb7fea08eaea5079c8c1e494. Current head e89978d487e4bdb2ff6f966358bca993701c131d, tree bcaad7208929df7276d6bf7a6ddcb28529d3aa98. The integration changes only the owning Nexus published-artifact inspection script; Rust subtree 6a64e0c8c8305babe8a2d419998ee54d4adaa064, all shared harness/worker/fixture/reader sources and frozen signal tuple/envelopes remain unchanged.

The superseded Shared run 38174375337 is now confirmed completed/cancelled across all six runtime jobs. Its actual SDK compilation/provenance and PHP/source 38174375266 (2,685 tests/61,266 assertions, six existing deprecations/one skip) pass; those earlier source receipts are retained. No completed signal matrix pass is claimed from the cancelled run.

Current all-six Shared 38175422080, PHP/source 38175422109 and boundaries are running. Next: qualify this exact integrated source, inspect its official runtime records/full sidecars and resource limits, then merge/main-verify/clean up after General's release-window completion. No competing Nexus/Waterline implementation or performance claim.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Current e89978d487e4bdb2ff6f966358bca993701c131d SDK preparation is independently inspected. Actual runner b17a1b31797fb54e7d7c5714d4e34a91812be63d has expected #414-main/candidate parents and the same bcaad7208929df7276d6bf7a6ddcb28529d3aa98 tree.

Official artifact 11715921566 matches API/uploader/download: 10,947,131 bytes / SHA256 0fdf18f2bd7442790a5d41911b223665edc7d20218c6c40adb38f40e2583da95. All 297 original member hashes, nine retained thin byte comparisons and seven current worker source hashes pass. Compared with the prior qualified prep manifest, only runner-revision and install/build log hashes change; actual Python dependency files, package identities, Cargo lock, worker sources and Rust worker binary SHA256 85b91d9ebbda8145a72a6965a798ce5595da639d0c79305212400c8076efe8b9 are unchanged. Warm adapter compile 7.36 seconds is not cold/performance evidence. The full prep ZIP is being removed without extracting dependency trees/binaries.

Current all-six runtime/source qualification continues. General reports Server 2.6.0/Helm publication, published SDK lifecycle and four Compose checks passed at #413, and has cleared an otherwise-qualified #415 landing while its final #416 optional workload-deadline qualification proceeds. No completed signal matrix pass or merge is claimed; current main must still be integrated before exact-source acceptance.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Final integration head 09c5b9f9efceefcaf25696b8b12653158446e910, tree 69b20ddc072399f972758502e032ee7f74f016c5, includes General #416 main e56c9a994cbb1902859f49a9b697dc3be9294f54. Rust subtree remains 6a64e0c8c8305babe8a2d419998ee54d4adaa064; published worker sources, fixture definitions, tuple and resource envelopes are unchanged.

Reviewed projection correction 4ea7721b7 removes an HTTP-only process-count assertion from the common embedded/HTTP comparison metadata. Embedded execution remains explicitly SDK-transport-inapplicable. All actual HTTP guards still require five distinct SDK processes, three original-run workflow claims/fenced completions, two distinct signal receipts, the separate observer and unchanged full prefixes/types. No event, payload, identity or receipt expectation is relaxed. Local 56 signal models and all 4,478 reader models pass again after the correction.

Current Shared 38176142913 and PHP/source 38176142956 run on this exact source; both boundaries pass. Superseded e899 Shared 38175422080 is confirmed cancelled across all six runtime jobs. Its prep/provenance pass (297 member hashes/nine thin comparisons/seven sources, unchanged Rust binary); PHP/source 38175422109 passes 2,685 tests/61,262 assertions, six existing deprecations/one skip. Those receipts remain historical, not current runtime acceptance. Earlier 4ef matrix cancellation is also retained.

General reports its source work complete after #416, with no further Server landing planned unless actual inspection finds a defect, and explicitly clears a qualified #415 merge. Next: complete current all-six/source and independent official record/full-wire/resource inspection, merge, verify main and clean task resources. Actual new signal matrix qualification and merge remain pending; no performance or broader-policy claim.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Current #415 head 09c5b9f9efceefcaf25696b8b12653158446e910 / tree 69b20ddc072399f972758502e032ee7f74f016c5 integrates final #416 main. Actual runner aeddf5647984eb9111460ccd0f9ef39c275fb413 has the same tree and expected main/candidate parents.

SDK preparation in Shared 38176142913 passes. Official artifact 11716235292 matches API, uploader and downloaded bytes: 10,947,132 bytes, SHA-256 abd9d7868e34b4d9a03f9c92e637dc6d395d32881c76422d3c2e60f10e8f4dca. All 297 manifest member hashes, nine retained metadata byte comparisons and seven current worker-source hashes pass. Frozen Python 2.5.4 and Rust 3.4.4 identities pass. The Rust worker binary is unchanged from the earlier source builds; the warm adapter compilation took 6.69 seconds, with no cold-build or runtime performance claim. Full prep ZIP is removed after verification; dependencies and executable were not extracted.

PHP/source 38176142956 passes: 2,685 tests / 61,262 assertions, six existing deprecations and one skip. Boundaries pass. The common projection now describes the two distinct identical signals and exact typed completion across all targets; the HTTP-only three-cold-author/process guards remain fully enforced. All 56 signal models and 4,478 reader models pass after that reporting correction.

All six current runtime jobs remain in progress. Earlier 4ef and e899 runtime runs were cancelled after main/source changed; their successful SDK/source checks are retained, without a completed signal-runtime qualification claim.

@rmcdaniel

Copy link
Copy Markdown
Member Author

The first actual #415 runtime failure is a reader defect: the new SDK signal guard and its positive models assumed HTTP 201, but the frozen published Server 2.5.20 signal contract returns HTTP 202 Accepted (ServerWorkflowControlPlane), as does the native signal_current endpoint. Official SQLite artifact 11716114003 matches API/uploader/download: 59,600,566 bytes, SHA-256 ff12e7ce6d8b7268ab3b55e7353e8553665c7ae484bc9ee84565025519f4ddf9.

Its first PHP/PHP case retains all five actual process sidecars and completes the original run with the full 13-event inventory, two distinct accepted signal commands and exact typed int64 9007199254740993 result; both signal receipts are HTTP 202. The record remains product-fail with its original 202 !== 201 error. No completed all-direction/all-six signal pass is claimed.

Contract decision: require exactly 202 for normal accepted signal submissions; keep registration/start 201 and claim/completion 200. Correct the positive models and add a mutation refusing an invented 201 signal status. Preserve all process, run/history, distinct identity, lease/fencing and typed Avro guards. No Server or SDK behavior change is justified by this discrepancy. Retain the failed observations unchanged, then requalify the corrected reader and current source.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Corrected #415 head 4621e287415a258f9698591961d24fab004af6d8 / tree 7d418aedf61d3155dc7f547824c2a5210311d6b4 is pushed and includes final #416 main. The new reader requires exactly the published HTTP 202 signal acceptance and rejects 201; registration/start and claim/completion guards remain unchanged. Shared 38177682271, PHP/source 38177682252 and boundaries are running.

All 57 signal models and all 4,479 reader tests pass, along with a diagnostic recheck of the original failed PHP observation. Its original failed label and 202 !== 201 error are preserved. Independent inspection binds all five actual phase sidecars to the one PHP/PHP observation, its original run, actual worker/client outputs, complete traffic and accepted receipts. All 37 selected official ZIP members and compressed roundtrip hashes pass; useful failed raw evidence is retained.

Earlier 09c5 Shared 38176142913 completes with all six runtime jobs failed; all six full logs, artifact identities and completion records are retained. SDK preparation and PHP/source pass on that earlier head. The first actual PHP case completes its full 13 events and exact typed result, then the erroneous reader rejects HTTP 202. This diagnostic is one original PHP case, not all-direction or native runtime qualification. Contract decision.

Fresh all-six qualification and independent complete signal record/wire inspection remain pending. No signal merge or performance claim.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Current corrected head 4621e287415a258f9698591961d24fab004af6d8 and actual runner bf77028399d2ab447ce71411e914edc2f5147910 share tree 7d418aedf61d3155dc7f547824c2a5210311d6b4 with the expected #416 main/candidate parents.

SDK prep 114583418793 in Shared 38177682271 passes. Official artifact 11716497345 matches API/uploader/download: 10,947,136 bytes, SHA-256 7eba809d1de7125c4d82789721c6dd2d9a167de5d6acbc37612ca7849e2670cc. All 297 original member hashes, nine retained metadata byte comparisons and seven current worker-source hashes pass. Frozen Python 2.5.4/Rust 3.4.4 identities pass; the Rust worker binary is unchanged. Warm adapter compilation took 7.98 seconds, without a cold-build or runtime-performance claim. Full prep ZIP is removed after verification; dependencies/binary were not extracted.

All six corrected-source runtime jobs are in progress, with no completed signal qualification yet. General's #417 consumer harness change is coordinated at #417 (comment); integrate final main before acceptance if it lands.

@rmcdaniel

Copy link
Copy Markdown
Member Author

The corrected signal reader's current run encountered a separate frozen-baseline failure before reaching the signal profile. Official SQLite artifact 11717181052 matches API/uploader/download: 6,491,397 bytes, SHA-256 78bdbad393f6b9d33de1fd9caf6de8c46e01acf9da273ecd144f12ec284221cc.

The older PHP SDK 2.2.6 patch-insertion-activity-completed case receives one HTTP 503 backend_lock_pressure / retry_after_seconds: 1 while polling its cold replacement. The next poll succeeds, but uses a different poll_request_id. The original workflow still completes with the full six expected events. The record remains failed with all other observed I/O succeeds; the complete original ZIP and decoded job log are retained. This is not a corrected-reader signal failure, and it does not establish the same behavior in the newer SDK tuple.

I will keep the frozen baseline assertions, resource envelopes and failure evidence unchanged. General's final #417 main is now available; integrate it and run exact-source qualification again. Further recurring baseline pressure would need its own contract and fault-budget investigation, rather than permitting arbitrary failed requests in this cohort.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Final General #417 main f0eaf0540509248251ed8fd325f239f47a5f6c40 is integrated locally as 41733ce81aef6efe9495435a210e9dee409823b8, tree e3ab4367e386e44c64c88429a93957dad248a31e; Rust subtree remains 6a64e0c8c8305babe8a2d419998ee54d4adaa064. The only added main diff is General's eight-line consumer-observer harness correction. The integrated head is not pushed yet: five jobs on the corrected reader source remain active, so let them finish and retain their useful runtime evidence before the final exact-source run.

Corrected-reader head 4621 SDK preparation and PHP/source pass; PHP reports 2,685 tests/61,266 assertions, six existing deprecations and one skip. SQLite failed in an older frozen Server 2.5.14/PHP SDK 2.2.6 patch baseline before signals, as documented in #415 (comment). Its unchanged failure is also handed to General at #417 (comment). No fixture guard, frozen artifact or resource envelope change is made to suppress it. All-direction/all-six signal qualification remains pending.

@rmcdaniel

Copy link
Copy Markdown
Member Author

The corrected HTTP-202 source reaches the signal profile on PostgreSQL 17. Official artifact 11717072249 matches API/uploader/download: 78,892,964 bytes, SHA-256 68db11ee8899894c96318da60588e941164a81dc60886b6419499194505fe9e8. PHP and canonical embedded each record all nine directions passing. Native records six passing PHP/Python-author directions, then signal-sdk-rust-php fails at the original Rust author's fenced completion: HTTP 422 unsupported_request_field for its ordinary open_condition_wait.condition_wait_occurrence_id. Only StartAccepted and WorkflowStarted are committed; the original run remains pending. The original failed native record and full wires remain unchanged.

The frozen Rust 3.4.4 worker actually authors rust:condition-wait:0 and rust:condition-wait:1. Published PHP Server 2.5.20 accepts that optional nullable string field and retains each nonempty authored value unchanged in ConditionWaitOpened and its matching ConditionWaitSatisfied; PHP's nine complete cases prove cold replay with those original identities. PHP/Python authors omit the field. Native currently whitelists only key/fingerprint, causing a real compatibility gap.

Contract decision: accept the published optional nullable string occurrence field, reject non-string non-null values before any task/history mutation, omit null/empty occurrence values from stored wait payloads as PHP does, and preserve each authored nonempty occurrence through opening, restart/claimed history and satisfaction. Strengthen the signal reader to require the actual frozen Rust occurrence IDs on both authored waits and their matched resolutions, with corrupt/reused/missing identity regressions. Add a native database/HTTP regression for cold replay and duplicate/stale completion fences. Keep the SDKs, shared fixture event inventories, distinct signal/command identities and exact typed payload/result guards unchanged. No schema migration is needed: native stores and resolves waits from the original history payload.

Integrate General's final #417 main with this scoped native correction, then run fresh source and all-six qualification. Full signal, broader condition policy, performance and cutover remain unqualified.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants