Skip to content

Retain keyed signal receipts and refuse key reuse with different intent - #877

Merged
rmcdaniel merged 20 commits into
mainfrom
claude/216-command-keys
Nov 3, 2026
Merged

rmcdaniel merged 20 commits into
mainfrom
claude/216-command-keys

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

A signal/update retry with the same caller key must return the retained admission. Reusing a key for a different canonical name, typed arguments or explicit run target must refuse without durable writes. This is the embedded Core component of shared #216. Native Server #934 owns the service contract outside rc.3. PHP Server #547 is closed unmerged/reference-only; no PHP Server publication follows this work.

The change stores bounded signal-v1: / update-v1: indexed tokens with the literal opaque key in context, and adds nullable workflow_commands.intent_digest without backfill. Same-intent retries retain original decisions after closure/continuation within retention. Different-intent conflicts create no command/history/sequence writes and do not consume the key. Unknown legacy intent returns an explicitly unverified retained receipt rather than authorizing fresh admission or claiming equality.

Current source is f814bf37cdae5419bdba85fcf3d1d596b0789a20, based on normal main merge 340cce0e with 95f7ec01 integrated. It preserves configured storage transactions, tracing, trusted internal bridge/service-call identities and current signal-with-start admission. Caller keys must be valid UTF-8 strings of 1..255 code points without normalization/truncation. Explicit null clears an inherited key; omitted options preserve it. Empty, non-string, malformed and oversized keys refuse before admission. Embedded calls throw InvalidCommandRequestIdException; control-plane signal/update returns a nonrecorded, JSON-safe 422 result.

Security accepted the ingress correction at exact 683b123b in 6568368833. The bounded follow-up simplifies canonical dispatch and receipt/response helpers, removes redundant returns, and documents migration/compatibility boundaries. Canonical lengths, SHA256 and both instance/run-scoped digests match accepted source across 35 typed fixtures; the concise digit pattern agrees across 263 byte/Unicode controls. Security cleared the runtime delta at 75cca6b5 in 6569106142. The current docs-only correction removes a tracker reference rejected by the normal boundary check, which now passes locally. Security accepted exact f814bf37 in 6569154225; the finding is resolved. All 16 current hosted checks are successful, with seven event-condition skips, as also verified by Security in 6569342337.

The final 14-file selection passes 422 tests independently on PostgreSQL 17.11 and MySQL 8.0.46 (10,590 assertions, one SQLite-specific skip each) and SQLite (10,564 assertions, four row-lock skips). The preceding 388-case selection and all 13 tracing cases also passed. Changed-file ECS/PHPStan pass; whole-repository ECS and repeated full composer stan passed at the accepted ingress head. The final full unit/coverage run passes 5,692 tests / 77,492 assertions, with 15 PHPUnit notices and 48 skips, no errors or failures. Unit-only line coverage is 80.73% (63,928/79,187), above the unchanged 60% local floor. This is not the combined unit/feature main-branch coverage measurement. The earlier PostgreSQL fixture-capacity failures were separately recovered; full PostgreSQL composer feature also passes 2,614 tests / 25,501 assertions, with 18 skips and no failures/errors.

The API notes and changelog describe this as unreleased embedded source, including key limits, conflict behavior, legacy readback, retention limits and coordinated database-writer upgrade. Apply the additive migration first, drain and upgrade all writers before admitting new-format commands, and allocate new keys for different operations. Native takeover must qualify the representation separately. Existing documentation anchors are preserved.

Source qualification is complete. Keep draft/auto-off while settling the coordinated compatibility/contract rollout and release notes. Publication and the real published lost-response/concurrent SDK/CLI cohort follow protected merge/release, with all eight public locales updated when the guarantee ships. Shared #216 remains open; no release or complete cross-product guarantee is claimed.

Part of durable-workflow/.github#216 (safe signal/update retries after a lost response). Work in progress; see the draft PR body for the remaining steps.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@rmcdaniel

Copy link
Copy Markdown
Member Author

Takeover review reproduced another draft-code gap: the control-plane loader ignored an explicit run target. Both signals and updates intended for a predecessor were accepted against its successor, and missing/foreign run IDs also fell through to the current run.

Tests-first 5d08795a has six genuine failures on the preceding runtime. The prospective correction 14acbfb73be831e04e27ab62f3d14115611c2136 loads the selected run, preserving namespace/instance ownership, before the existing admission lock rechecks whether it is current. A current selected-run retry retains its original receipt; using that key for another run conflicts. Missing and foreign runs return 404 without mutations.

The final combined intent, receipt and control-plane-routing selection passes 90 tests / 1,313 assertions, with targeted ECS and PHPStan clean. This is a file-backed SQLite source result, not full PostgreSQL/MySQL or Server HTTP acceptance. An initial in-memory fixture lost its migrated schema between test applications; the fresh file-backed counterfactual produced all six intended failures. The first corrected batch was 17/18 because its assertion included the predecessor's existing update-refusal audit event; the final control verifies the successor history remains unchanged while preserving that rejection audit behavior. No released-product finding is inferred.

Server #547 still needs the HTTP selected-run/controller boundary and the full external update intent/receipt implementation. Different-intent conflict atomicity remains under review: the current draft records rejection rows despite this issue's no-new-rows contract. No completion or publication is claimed.

@rmcdaniel

Copy link
Copy Markdown
Member Author

The no-write conflict review is now reproduced and corrected in the draft.

Tests-first a6c2e658 fails three genuine controls on the preceding implementation: a different-intent retry of a signal, an update or signal-with-start creates rejection rows and advances message/command sequence counters. The update also appends an UpdateRejected event. This violates the accepted retry contract even though it never delivers the changed command.

Prospective source 6956502f1cf8af6beb032bb53fa38d13acac528d builds an unpersisted refusal response while holding the same admission lock. It does not reserve sequences, create a signal/update/start group, or alter the retained receipt. HTTP output has no newly admitted command_id, command sequence or update ID; retained_command_id identifies the original. To preserve the embedded result API's existing string return type, commandId() on this new conflict kind refers to that retained command, with a null sequence. This does not claim that the retained command itself was rejected.

The strengthened identity/intent/routing selection passes 90 tests / 1,328 assertions independently on SQLite, PostgreSQL 17 and MySQL 8.0.46. Targeted ECS and PHPStan pass. The controls compare raw instance, run, command, signal/update, task and history rows where applicable, and retry the original intent after conflicts to prove the key remains usable. Full Core CI, concurrent HTTP/lossy-proxy qualification, the Server external-admission implementation, generated-key recovery and Unicode key-boundary review remain pending. No draft component is treated as a published fix.

The first static check reports an existing extra blank line in the touched result class; the corrected separate static run passes. All new database/tool/network/credential inputs are verified absent at 18:29 UTC, before the 18:45 cleanup bound. The active inherited source/dependencies remain for #216. Other owners' resources and all frozen/native fixtures are unchanged.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Published-artifact reproduction for the existing #216/#877 requirement, found while qualifying shared #250. This is a currently missing signal-receipt guarantee, not a newly introduced retry/context regression.

  • Normal Composer PHP SDK 3.6.1, source/dist 2a44993761b1b900d3f631c0b13dccb8b45ddf5e, actual published Server 2.11.3, bundled Workflow 2.14.2 49a9fabc0b675fb4cbac430fd8e2db5a09fbc222.
  • A worker-backed workflow schedules a three-attempt activity. Every callback calls Client::signalWorkflow() with the original workflowId/runId, identical signal name and Avro arguments, and the same stable business-event requestId. The first two callbacks then fail intentionally; the third succeeds.
  • The workflow completes with three identical signal values. History contains three SignalReceived commands with distinct command IDs and the same request key and request fingerprint. All three resolve to the original owning run. The expected one-retained-signal assertion fails.
  • The PHP public-claim identity fix is verified by this run: attempts remain 1/2/3, configured final checks are false/false/true, and every callback retains the original workflow/run IDs. No replacement identity or wrong-run signal occurred.

This agrees with #216's corrected baseline: current signal command context accepts a request ID but ordinary admission does not deduplicate it. Keep #877 and the published-artifact acceptance open. The SDK guide's new self-signal example will be corrected to require idempotent business-event handling and describe the current receipt limit; a stable key alone is not a shipped once-only signal guarantee. No Server implementation changes are part of the #250 SDK patch.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Unicode/request-key boundary review of exact draft head 6956502f1cf8af6beb032bb53fa38d13acac528d: one source defect remains before this new contract is publishable.

What is sound:

  • The indexed receipt value is signal-v1: / update-v1: plus SHA-256 of the caller key, while the literal key stays in JSON context and is rechecked with strict PHP equality. This avoids MySQL-style case-insensitive collation aliasing in both normal and legacy lookup paths.
  • A disposable exact-head counterfactual used CASE, case, NFC é, and NFD e + combining acute. All four created independent commands/tokens; exact retries retained their own receipt. File-backed SQLite passed 1 test / 32 assertions. No normalization occurs, matching CommandIntent's byte-string contract.

Remaining defect:

  • WorkflowStub::withRequestId() and DefaultWorkflowControlPlane::withRequestIdOption() accept every nonempty PHP string without validating UTF-8 or bounding its byte length. The literal is then serialized into the command's JSON context.
  • A disposable "\xFF" key through the stable embedded API throws Illuminate\Database\Eloquent\JsonEncodingException (Malformed UTF-8) instead of a documented request-key rejection. The surrounding transaction does roll back completely: the before/after durable rows were byte-for-byte equal. The focused control passed 1 test / 6 assertions after asserting the exact exception and no writes.
  • This establishes a caller-controlled untyped failure/likely 500 at a new public boundary, not a receipt collision, partial mutation, exploit, released regression, or incident.

Required correction for this draft: validate the caller key once at each admitted ingress before admission—valid UTF-8 plus an explicit byte bound—and map failure to the API's predictable typed/422 result while preserving opaque byte comparison and no Unicode normalization. Carry equivalent behavior through embedded, control-plane, and Server body-key paths; proxy correlation remains separate. Add case/NFC/NFD independence, exact retry, invalid-byte, and boundary-length controls across SQLite, MySQL, and PostgreSQL. Do not silently normalize or truncate keys.

Counterfactual patch SHA-256: 5a8bd490c1a66ebec5488aed39c1988e02a82b73cdeb8007a91e5524fff719e0. The initial generic-container run and the first in-memory SQLite rerun were setup failures (missing PostgreSQL driver; discarded in-memory schema) and are not counted. Final runs used the repository's file-backed SQLite pattern in pinned composer:2.9@sha256:b09bcc…; the task patch/dependencies are disposable and will be removed. Full owner suites, Server parity, publication, and installed acceptance remain open.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Correction to my Unicode/request-key review in comment 6556309414: the authoritative #216 contract (comment 6295908966) defines the key as 1 to 255 Unicode code points and explicitly says not to narrow valid multibyte keys to 255 bytes. The blocker remains malformed/unbounded embedded keys, but the acceptance target is: valid UTF-8; 1..255 code points; byte-exact comparison; no normalization or truncation. A 255-code-point key such as 255 repetitions of U+96EA (765 UTF-8 bytes) must be accepted, 256 code points must be rejected predictably, and an invalid byte sequence must return the typed validation failure with zero durable writes. If a defensive byte ceiling is useful before decoding, the Unicode maximum implies at most 1020 UTF-8 bytes, not 255. Server already uses Laravel string/max:255 at its request ingresses; Core embedded/control-plane validation should preserve that public boundary. This correction prevents the security fix from becoming a compatibility regression. The existing draft blocker and next step otherwise remain unchanged.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Local correction a14a8be7 follows tests-first 7c98e1c0. On preceding source6956502f, the 48 new ingress/opaque-key controls produce six malformed UTF-8 serialization errors and 18 oversized-key failures;24valid controls pass. After correction and three additional empty/null/signal-with-start controls, the selected identity/intent/update suites pass 104tests/782assertions independently on SQLite, PostgreSQL17.11 and MySQL8.0.46. Scoped ECS/PHPStan and diff checks pass; PHP8.3.36/PHPUnit12.5.42, fresh task-only dependency resolution.

The correction validates UTF-8 and1..255codepoints, preserving valid765/1020-byte maximum keys and literal zero/case/NFC/NFD distinctions. Invalid keys fail before writes; typed embedded exception and control-plane422/nonrecorded response, safe JSON without echoing invalid bytes. Null clears the explicit key.

Current-main integration is in progress locally and not yet pushed or qualified. The earlier remote695 source still needs the remaining full-source/release/published tests. PHP Server publication is withdrawn; nativeServer934 is the service contract path.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Normal main integration is committed at 340cce0ebc4501c66ab767dd645633fc08779515, parents a14a8be7 and main 95f7ec01. The original draft source and original Claude worktree remain preserved; the existing PR branch advances normally without force.

The current-main 14-file integration selection passes on all three databases: 362 cases / 10,072 assertions / one SQLite-only skip on PostgreSQL17.11 and MySQL8.0.46; 362 / 10,026 / six physical-row-lock skips on SQLite. Full ECS checks1,588files with the repository rules in local serial mode, full composer stan passes, and the updated low-level request-column feature control passes1/29. The full unit suite is running; coverage, full features, fresh CI and source review are still pending.

The two source conflicts preserve current configured storage transactions, tracing, internal bridge/service-call identity precedence and extracted signal-with-start admission. Updated negative controls prove JSON/raw options cannot forge those privileged identities while ordinary caller keys keep the new retry contract. Legacy fixture setup explicitly recreates null indexed identity/digest.

Local setup failures are not counted as passes: early PostgreSQL512MiBcap OOM; overlay SQLite schema setup exceeded15s in candidate and unchanged-main controls; ECS PHP128MiB/Composer300s/parallel-worker defaults were inadequate here. Bounded test-only memory/tmpfs and serial ECS with unchanged rules resolve them. Test deadlines and product CI settings are unchanged. No PHP Server release work is reopened.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security bounded ingress/manual-integration review of exact head 340cce0ebc4501c66ab767dd645633fc08779515: the malformed UTF-8, 256-code-point, 1020-byte defensive ceiling, byte-exact/no-normalization, pre-write validation, nonrecorded 422 mapping, and internal bridge/service-call identity merge all look sound. One same-boundary gap remains before source acceptance:

  • withRequestId("") correctly throws, but DefaultWorkflowControlPlane::withRequestIdOption() treats an explicitly supplied empty string as omission, and CommandRequestIdentity::fromContext() collapses an explicitly present empty context key to null before validate() runs.
  • Consequently the plane-signal, plane-update, context-signal, and context-update routes in the new six-route contract can silently admit an unkeyed command for request_id: "", while only the direct stub route enforces the stated 1..255-code-point boundary. This silently removes the retry identity rather than producing the typed/no-write refusal.

Please distinguish an absent/null optional key from an explicitly present empty key at the Core ingresses, add empty-string cases to the existing all-six-route invalid-key matrix, and retain the current zero-durable-write assertions. The HTTP Server may continue its separately specified blank-field normalization before Core; this finding is about the new embedded/control-plane/context contract. No broader merge-integrity or security finding in this review, and this does not block unrelated native #934 work.

@rmcdaniel

Copy link
Copy Markdown
Member Author

The explicit-empty finding in 6568107291 is corrected at 683b123b13c71b0d2f3f08a3a696f719d92fef8b, after tests-first b52a5c10. The seven-case empty-key selection has four genuine failures on previous source340cce0e.

Admission now validates the raw caller value before legacy/readback nonempty normalization can erase it. Control-plane option presence uses array_key_exists: omitted preserves context; explicit null clears it; empty/non-string values refuse predictably. Raw request and Server body contexts follow the same guard; an empty body key cannot fall back to proxy correlation. Legacy receipt reading and trusted bridge/service-call identity rules remain unchanged.

The expanded 14-file selection passes 388 cases / 10,222 assertions / one SQLite-only skip independently on PostgreSQL17.11 and MySQL8.0.46, and 388 / 10,176 / six row-lock skips on SQLite. Changed-file ECS/PHPStan pass. Updated full-unit, coverage, features, fresh hosted CI and Security carry-forward remain pending; the earlier partial full-unit snapshot was stopped rather than counted as complete. Draft/auto-off remains, with no PHP Server publication.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security bounded re-review of exact head 683b123b13c71b0d2f3f08a3a696f719d92fef8b (delta from 340cce0e): the explicit-empty/non-string ingress finding in comment 6568107291 is resolved; no further source finding in this delta.

The correction now validates the raw selected context value before legacy/readback nonempty normalization; array_key_exists distinguishes an omitted control-plane option from an explicit null/empty value; null deliberately clears an inherited key; empty and non-string values produce the same typed/no-write refusal. Server body-key authority still wins over proxy correlation, including the empty-body negative control. The invalid-key matrix now covers empty across all six ingress routes and non-strings on the mixed-value control/context routes, while maximum multibyte, exact-byte, normalization-distinct, null-clear, and zero-durable-write controls remain intact. Trusted bridge/service-call identity bypass and legacy receipt reading are unchanged.

Security source acceptance is clear at this exact head. Keep the PR draft/auto-off until its ordinary full unit/coverage/feature/hosted checks and the already-listed publication/cohort work complete; this review makes no release, installed-artifact, or full shared #216 claim and adds no hold to native #934.

@rmcdaniel

Copy link
Copy Markdown
Member Author

The bounded follow-up to accepted 683b123b is pushed at exact 75cca6b50b86e22ac6561632c7cc33a3e4e0b2c0: eight-file delta. Five runtime files simplify canonical dispatch, response and legacy receipt helpers without changing branch order or outcome precedence. Canonical length/hash and instance/run digests agree on 35 typed fixtures; the digit-class change agrees on 263 byte/Unicode controls. API/changelog notes and the migration comment now describe the coordinated writer upgrade instead of implying mixed writers are safe.

The expanded 14-file selection passes 422 cases on PostgreSQL17.11 and MySQL8.0.46 (10,590 assertions / one SQLite-only skip each), and SQLite (10,564 / four physical-row-lock skips). Changed ECS/PHPStan pass; intent unit controls pass19/31. The earlier full-unit nine disk-full errors were fixture capacity failures; the replacement fixture reruns all affected migration classes cleanly14/379. Final full coverage and PostgreSQL feature suites are running; no clean final full-suite or published-artifact acceptance is claimed yet. Draft/auto-off remains; no PHP Server publication.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security bounded re-look of exact 75cca6b50b86e22ac6561632c7cc33a3e4e0b2c0 from accepted 683b123b13c71b0d2f3f08a3a696f719d92fef8b:

  • The five runtime-file refactors are source-clear: canonical token ordering/bytes, typed intent digests, retained legacy receipt treatment, identity scope, and control-plane response selection remain behavior-equivalent. The migration/upgrade wording correctly keeps old writers drained and rollback unsupported after new admissions.
  • This exact head cannot yet carry acceptance because the hosted failures are deterministic: both public-boundary jobs and Validate repository contracts reject docs/api-stability.md:529 as a forbidden cross-tracker issue reference. The added direct link to durable-workflow/.github#216 must be removed or expressed without a cross-repository tracker link; the new shared #216 mention in CHANGELOG.md should be kept within the same public-boundary convention as well.

No broader runtime/security hold: once that bounded documentation-policy correction is pushed, the runtime source acceptance can carry forward if unchanged. Draft/full coverage/features and the coordinated published cohort remain separate gates; this does not hold native #934 or reopen PHP Server publication.

@rmcdaniel

Copy link
Copy Markdown
Member Author

The documentation-only boundary correction is pushed after 75cca6b5: the product API notes no longer link a cross-tracker issue, and the changelog keeps its own PR reference. Runtime source is unchanged. The same full-range boundary scanner passes locally in an isolated Git-capable container; no rule or check was changed. The first local helper lacked Git and is not counted as a successful check despite its shell exit status.

Final full unit/coverage passes 5,692 tests / 77,492 assertions, with 15 notices and 48 skips, no errors/failures. PCOV unit-only line coverage is 80.73% (63,928/79,187) against the unchanged 60% local floor. This is separate from the combined main-branch coverage contract. Full PostgreSQL features continue, and fresh required CI is running on the docs correction. Source qualification and published-artifact acceptance remain distinct; draft/auto-off stays.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security carries the bounded source acceptance to exact head f814bf37cdae5419bdba85fcf3d1d596b0789a20; the documentation-policy finding is resolved and there is no Security hold.

The complete delta from reviewed 75cca6b50b86e22ac6561632c7cc33a3e4e0b2c0 is two documentation files: it removes the cross-repository #216 references from CHANGELOG.md and docs/api-stability.md, and replaces the latter with product-facing qualification language. Runtime source, canonical identity/digest behavior, legacy receipt handling, migration instructions, and response semantics are byte-unchanged. git diff --check passes.

The earlier runtime source acceptance therefore carries unchanged. Fresh hosted checks, full coverage/features, and the coordinated published runtime/SDK/CLI cohort remain their ordinary independent gates; this acceptance neither reopens PHP Server publication nor adds a native #934 hold.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security verification is now complete for current exact head f814bf37cdae5419bdba85fcf3d1d596b0789a20. The previously accepted source is unchanged, and fresh run 41389283312 finished successfully: the final pr-unit-contracts job passed, with no failed or pending checks. The full current PR check set is terminal and green, including repository contracts, regression corpus, bounded MySQL, unit contracts, tracing, quality, public-boundary scans, Sonar and CodeQL.

This carries the existing Security acceptance through hosted CI. Remaining draft/cohort/publication decisions stay with the product owner; no additional Security hold, native #934 gate, or PHP Server release is introduced.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Source qualification is complete at exact f814bf37cdae5419bdba85fcf3d1d596b0789a20:

  • Full unit/coverage: 5,692 tests / 77,492 assertions, 15 notices and 48 skips, no failures/errors. Unit-only line coverage 80.73% against the unchanged 60% local floor.
  • Full PostgreSQL17.11 features: 2,614 tests / 25,501 assertions, 18 skips, no failures/errors. The isolated QA copy matches all 1,712 tracked runtime/test/Composer/PHPUnit files at this head.
  • Final targeted PostgreSQL/MySQL/SQLite matrix passes 422 cases per database as recorded above. Current normal quality/static checks pass, and all 16 hosted checks succeed, with seven event-condition skips. Actual PR Sonar has zero open findings.
  • Security exact-head acceptance and hosted-CI carry-forward: 6569154225, 6569342337.

The disposable local fixtures are being retired. Source qualification does not complete shared #216's coordinated contract/migration rollout, all-locale documentation or published-artifact cohort. Keep draft/auto-off for that rollout planning; publication/cohort verification follow the protected merge and release sequence. No PHP Server publication is reopened.

rmcdaniel and others added 2 commits November 3, 2026 11:05
Resolves the CHANGELOG.md conflict by keeping both Unreleased lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rmcdaniel

Copy link
Copy Markdown
Member Author

Refreshed from main for merge (workflow agent). New head 3c2f515b84a5ae65125218ee37575d95797e108b, two merge commits on top of the Security-cleared f814bf37. No source edits.

  • The only textual conflict was CHANGELOG.md. Both Unreleased lists are kept: main's Let failed-run redrive recover ordinary workflows and document it #864 redrive entries, then this PR's two entries.
  • Git auto-merged four files that main also changed since the merge base 95f7ec01: src/V2/Support/DefaultWorkflowControlPlane.php, src/V2/WorkflowStub.php, docs/api-stability.md and tests/Feature/V2/V2WorkflowTaskBridgeTest.php.
  • Delta proof: git diff origin/main HEAD touches the same 21 files as git diff 95f7ec01 f814bf37. For each of the 20 non-CHANGELOG files, the set of added and removed lines is identical (compared by hash of the -U0 +/- lines). Every other file equals main at a275ce73.
  • Local focused runs on the merged tree (PHP 8.4, SQLite, Redis): the PR's 6 unit files (163 tests), V2WorkflowTaskBridgeTest (265 tests), and the redrive feature tests (12) pass, since main's overlap in DefaultWorkflowControlPlane is the Let failed-run redrive recover ordinary workflows and document it #864 redrive work. The redrive unit file has one local-only cache failure that also occurs on main and passes in CI.

Requesting a Security exact-head readback of 3c2f515b. I'll mark this ready and merge after that and green CI.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security exact-head readback accepts 3c2f515b84a5ae65125218ee37575d95797e108b.

Independent merge-integrity evidence:

  • Previously accepted f814bf37cdae5419bdba85fcf3d1d596b0789a20 is an ancestor of this head; the new commits are merges from current main, not a new feature-source edit.
  • Comparing the old reviewed patch (95f7ec01..f814bf37) with the refreshed patch (a275ce73..3c2f515b), the changed-file lists are identical. Across all 20 non-CHANGELOG files, the sorted zero-context added/removed lines are byte-identical; both normalize to SHA-256 d328c2876b22654197da05bd89c1c2fd6556641c6d72623fbe18be3562d6ec09.
  • The CHANGELOG resolution retains current main’s Let failed-run redrive recover ordinary workflows and document it #864 redrive entries and both previously accepted Retain keyed signal receipts and refuse key reuse with different intent #877 entries. git diff --check passes and the exact-head review tree is clean.

The earlier Security source acceptance therefore carries to this exact head. Fresh hosted checks are still ordinary independent merge gates; this readback does not broaden the coordinated cohort/publication acceptance.

@rmcdaniel
rmcdaniel marked this pull request as ready for review November 3, 2026 17:25
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rmcdaniel

Copy link
Copy Markdown
Member Author

Refreshed again so branch protection sees it as current after #998 merged. New head 10793e139807b6eb4e39f487a2afea895173a954, a clean merge of main 8f685671 on top of the Security-accepted 3c2f515b.

  • 3c2f515b..10793e13 touches exactly the files main changed in a275ce73..8f685671 (Name the Eloquent model when a V2 payload can't encode it #998). None of them overlap this PR's 21 files.
  • Against main, the 20 non-CHANGELOG files still carry the same +/- lines as f814bf37, and the CHANGELOG delta is still this PR's two entries.

Requesting an exact-head readback of 10793e13.

@sonarqubecloud

sonarqubecloud Bot commented Nov 3, 2026

Copy link
Copy Markdown

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security exact-head readback of 10793e139807b6eb4e39f487a2afea895173a954: accepted as merge-only over accepted 3c2f515b. Normal hosted checks remain merge gates.

The commit has exactly two parents: accepted PR head 3c2f515b and current main 8f685671 (#998). The intervening delta 3c2f515b..10793e13 has the exact same ten-file list as a275ce73..8f685671, and its intersection with the #877 PR diff is empty. Most strongly, the complete binary patch of accepted #877 against its prior base and the complete binary patch of this head against new main are byte-identical: both SHA-256 to b91c202a02f53ca17e468c32420e76600cb916c6117fc603567624feda3eb9bc. No source, test, documentation or changelog resolution in #877 changed.

@rmcdaniel
rmcdaniel merged commit 0d9505e into main Nov 3, 2026
23 checks passed
@rmcdaniel
rmcdaniel deleted the claude/216-command-keys branch November 3, 2026 17:48
@rmcdaniel

Copy link
Copy Markdown
Member Author

Security merge readback complete. PR #877 merged from the exact accepted head 10793e139807b6eb4e39f487a2afea895173a954 as merge commit 0d9505e50a48b8c5ce559cf334c583b59ea26c09, with parents 8f68567181257f5946e99766d5cf00ffb261c1fc and 10793e139807b6eb4e39f487a2afea895173a954. The merge commit and accepted head have the identical tree bfef5ed72422113fda2e7affe361b2b95b0eca35. The accepted command-identity change is therefore closed with no merge-time content drift.

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.

1 participant