Skip to content

fix(prism): preserve purpose intent in local Run groups - #581

Merged
lukemaj merged 3 commits into
mainfrom
fix/377-local-run-group-purpose
Oct 20, 2026
Merged

lukemaj merged 3 commits into
mainfrom
fix/377-local-run-group-purpose

Conversation

@lukemaj

@lukemaj lukemaj commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

What: PR #581 now carries the unchanged local Run-group purpose repair on exact current main c3557ef.
Why: The previously approved ca634bb candidate predated main's #580 and #578 changes and did not establish combined-current-main proof.
So what: The parent runs both fresh whole-head reviews and current CI on fddb446; this separate PR still requires its own human merge approval.

Refs #377. Local implicit Run groups discarded explicit purpose intent while single delegation preserved it. The repair carries the optional envelope through the existing group command and member admission, and applies existing intent conflict validation to both committed-group fast replay and native receipt replay. Omitted legacy calls stay warned unscoped; matching retries keep first admitted identities and purpose.

Parent-authorized mechanical rebase onto exact c3557ef338fce173285b40149fa3c19e49b52e86 is complete without conflicts. Head fddb44686f415d33805993c890058cac40dfeb50, tree d852f83ec4b96c988010c1ca27dbb349ca2ed8c8. Checkpoint checkpoint/581-before-main-c355-ca634bb preserves old ca634bb. All three range-diff entries are =, and complete task stable patch ID remains 286ba0f193b4ab642de1b9111d6dc43ae699b9df. No source/test semantic delta or lost incoming main feature.

Current proof uses pinned Node24.13.1/pnpm11.10.0 and the new frozen lock after offline ignore-scripts setup: 139 tests passed across RunGroups26, nearby91 and map22. Command: pnpm exec vp test run apps/server/src/mcp/RunGroups.integration.test.ts apps/server/src/orchestration-v2/ExecutionPurpose.integration.test.ts apps/server/src/mcp/OrchestratorMcpService.test.ts packages/contracts/src/orchestrationV2.test.ts packages/contracts/src/executionPurpose.test.ts apps/server/src/issues/featureMap.test.ts.

Current server/contracts pnpm exec tsc-rs --noEmit --incremental false -p <workspace>/tsconfig.json, scoped lint/format/diff/inventory and full fork-stack/metadata checks pass. The retained unrelated layerUnavailable warning remains. This is affected feedback, not combined-current-main CI acceptance.

The unchanged actual registered-tool/Prism/SQLite/effect-worker fixture asserts persisted member/child purposes, parent A versus chip B, explicit overrides, selection, deliberate/legacy inheritance, unchanged single controls, immutable replay and BOTH conflict owners. Stale-selection zero-start refusal proves purpose admission; later-member adapter rejection proves atomic rollback, not a fabricated later-member purpose-only failure. Fake provider/probe leaves and injected provider scope are fixture limits; no real provider/credential HTTP or Live Verification claim.

Historical red remains source-before proof on original f3a399d only: nine intended failures and seventeen passing controls; historical matching green26/26. No new-main red was repeated or claimed. Both Sol MEDIUM and Opus5.5 MEDIUM approved frozen ca634bb with no findings; those verdicts do not transfer to this new head. Parent owns BOTH fresh whole-head reviews, current CI and separate merge approval.

Canonical #377 handoff records exact commands, Warsaw timestamps, patch/source/runtime/input hashes, checksums and dispositions. New records: /home/luke/.local/state/chromeria-377-local-group-20261020/currentmain-c355; old evidence/manifest remain unchanged. New manifest SHA-256 d119209f7274c3a58b4c5b886cd7a73f35e6559faac8c61075a4a9be5924939d. Source clean; no versions, unrelated work, nested review/status writes, main/integration writes, merge, deployment or Observer action. #379/#386 dependencies remain unchanged until parent acceptance.

Original upstream search and finite policy qualification remain in qualification; this is fork admission repair, not an upstream port.

Requirements and who asked: User's existing #377 purpose policy and parent-directed exact-c355 mechanical rebase with current proof.
Deleted: New ownership policy/architecture, remote groups/completion, cross-kind arbitration, UI, Observer, versions, other workspaces and historical-red repetition.
Bottleneck: Existing group intent/replay omissions, then missing combined-current-main proof.
Checked myself: Live refs/checkpoint, full relevant incoming diffs, equal task/incoming patch identities and range-diff, actual offline patched dependencies, current139 tests, scoped checks and lease-protected push.

Implemented by GPT-6.1 Sol, MEDIUM reasoning, Codex harness.

@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 20.9 KiB 20.9 KiB 0 B (0.0%) 29.3 KiB ✅
Codex Live turn messages 2 2 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB +31 B (+0.6%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB +31 B (+2.6%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.2 KiB 21.2 KiB +41 B (+0.2%) 29.3 KiB ✅
Claude Live turn messages 1 2 +1 (+100.0%) 8 ✅

Baseline: c3557ef · PR result: fddb446 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Sol MEDIUM approves PR #581 at exact head ca634bbda46110767bcf67b8e9eba54e90b8751a, with no actionable findings in the complete eight-file candidate.
Why: Intent now reaches every member through existing admission and both replay owners reject conflicting intent before effects.
So what: Opus5.5 MEDIUM whole-head review, current CI and separate main-merge approval remain required; combined review status stays pending.

Parent read the entire report and accepts its coverage/limits. Inventory precision: 17 red-pass cases comprise 15 pre-existing tests plus two newly added controls; they must not all be described as unchanged. Same final test still discriminates nine intended failures and 26 passing fixed cases. New main has advanced to c3557ef (including #580 and separately approved #578); the reviewed source head is frozen, and current-base compatibility/CI remain parent-owned before readiness.

Full independent report follows unchanged.

PR #581 independent whole-head review, round 1

Verdict: APPROVE. No supported actionable correctness finding remains in the inspected eight-file candidate and its relevant admission/replay consumers. This verdict covers the finite local Run-group purpose repair only. It does not clear merging: the separate Opus 5.5 MEDIUM whole-head review, current CI and explicit approval for this main-target PR remain with the parent.

Reviewer: GPT-6.1 Sol through the Codex harness, explicitly requested MEDIUM. The runtime context identifies this model/harness and medium configuration; I make no claim about hidden internal effort. I did not author the implementation, dispatch another agent, execute tests or publish review/status content.

Frozen identity and boundaries

  • Read-only source workspace: /home/luke/.t3/worktrees/chromeria/fix-377-local-run-group-purpose.
  • Initial and final HEAD: ca634bbda46110767bcf67b8e9eba54e90b8751a.
  • Initial and final tree: 8a9a5140735122587dab25ec493ef35a9d57e2d0.
  • Base: f3a399d40c252730b02b7022b627763f7add91b0; verified base tree 7cbb439a2fcaf6b20d2c7d7b597e98c44eebb0cb.
  • Initial and final git status --porcelain=v1: empty, including untracked files.
  • Complete cumulative diff: eight files, +400/-5; independently computed SHA-256 f9b23d6dfb7edc559d0779c269afb3b9dafc56fcf6a23ddc1143703fd2822e2a.
  • Exclusive final scratch directory was created successfully with plain mkdir before any review output. All saved review output is under /home/luke/.local/state/chromeria-379-proof/581-ca634-review/sol.

No source/index/ref write, checkout/fetch/switch/reset/pull, new worktree, install, provider/dev-server/browser/device process, live database or credential access occurred. GitHub reads used gh issue view and gh pr view. The product-required PR association tool linked #581 to this thread and the final list confirmed it; no purpose-delivery declaration was supplied by this review. No GitHub Issue/PR/comment/status/review mutation occurred. The parent owns publication of this report unchanged and review status.

Findings and dispositions

No required fixes or optional speculative changes are proposed.

  1. O1, dropped local group intent: cleared. Public OrchestratorMcpDelegateTaskInput already decodes optional PurposeIntent; the registered delegate_task handler calls delegateTaskOrRunGroup. The changed service assembly at OrchestratorMcpService.ts:2038 carries the envelope, and the changed internal group schema at orchestrationV2.ts:3382 retains it. dispatchDelegatedTaskGroupRequest at Orchestrator.ts:7770 destructures only members/groupId and spreads the shared envelope into every single-member request. Existing admission resolves actual parentRunId, explicit reference, selection revision or deliberate unscoped before child construction, stores intent/purpose on each app-owned subagent, initializes child selection, and supplies the same resolved purpose to the child run. Parent run A is independent of mutable selection B. Omission still reaches the existing legacy-unscoped resolver and warning, without inferring inheritance from the chip.

  2. Committed-group fast replay bypass: cleared. At OrchestratorMcpService.ts:1954, every retained member's original intent is compared with the retry envelope using the established equality helper. Undefined differs from inherit/reference/unscoped; a mismatch returns orchestration_error with the existing intent_reused message before waiting, reading child results or constructing another group. Matching replay returns the committed identities before current Prism resolution or selection admission. runGroupMembers selects all app-owned members by immutable group id, without excluding cancelled/terminal members or consulting child deletion state. Child deletion does not remove the parent subagent record. Legacy records with absent intent therefore match absent-intent retries and cannot be relabelled by adding explicit intent. Existing result-read limitations for unavailable/deleted children are unchanged; this PR does not claim lifecycle repair.

  3. Native command-receipt bypass: cleared. Adding the group type at Orchestrator.ts:13137 reaches the existing accepted-receipt validation, after rejected-receipt and thread-conflict handling but before new planning/outbox work. The first app-owned subagent.updated event is the first group member emitted before its child-message events. Every member receives the same shared intent, so this event is a valid original-intent witness for all members produced by this owner. Historical groups lacking intent remain absent-intent witnesses. Matching receipt replay returns original stored events; changed intent raises existing PurposeAdmissionError(intent_reused). The unchanged command-thread mapping locks group admission on its parent. Cross-kind arbitration remains explicitly outside this repair.

  4. Atomicity and proof adjustment: accepted within the stated boundary. Each member appends to one command's temporary event/effect arrays; only a successful complete plan reaches EventSink.commitCommand, whose transaction commits events, projections, receipt and effect outbox together before publication. The later-member ghost-adapter case reaches member 2 after member 1 has built a purpose-bearing child and effects, then proves no persisted first child, parent subagent/event or provider start after drain. Stale selection separately refuses the whole group with zero starts. These are distinct admission and batch-rollback discriminators. I do not require a fabricated member-2-only purpose error: one shared intent and serialized parent selection cannot naturally produce that condition here.

Whole-diff coverage

Changed file Inspected coverage
apps/server/src/mcp/OrchestratorMcpService.ts Complete diff; surrounding group selection, assembly, committed replay, single fallback, status/wait/cancel and group-load consumers. Existing equality/error owners traced.
apps/server/src/mcp/RunGroups.integration.test.ts Complete diff and entire fixture/test file, including all existing controls. Real registered MCP tool, native injected scope, Prism selection, real orchestration/SQLite/effect worker, deterministic provider leaves and event-driven waits inspected.
apps/server/src/orchestration-v2/Orchestrator.ts Complete diff; parent command mapping/lock, single-member purpose resolution and emitted events, group expansion, receipt validation, temporary plan arrays and commit path. Relevant projection and EventSink consumers read.
packages/contracts/src/orchestrationV2.ts Complete diff and surrounding internal command schemas/server union, public delegate input and PurposeIntent variants/equality. Optional legacy compatibility checked.
apps/server/src/testUtils/shardWeights.json Complete diff; new 18.8 weight corresponds to the expanded integration suite, with fork ownership metadata included.
docs/fork-features.md Complete diff and related feature ownership: shard weights owned by Run groups, regression file shared with execution-purpose, #581 reference added.
docs/map.md Complete diff; #377 stays primary, #581 is a secondary open PR reference for execution-purpose.
scripts/fork-upstream-edits.txt Complete diff; shard-weight path added to the existing allowlist.

No UI, client, provider-adapter, grant, remote-group/completion, schedule, version or deployment change is present. The shared backend path serves callers across clients; no client surface update is required by this delta. Existing Run selection, explicit single target, kit/mode limits, cancellation, wake and status controls remain in the suite.

Retained proof independently inspected

Evidence root: /home/luke/.local/state/chromeria-377-local-group-20261020.

I read the manifest/bindings/final check records and inspected decisive raw failure output and runner summaries, green output, nearby/map output, compiler/lint/format and fork metadata output. I independently hashed all 46 manifest entries: eight final changed files, two runtime files and 36 retained evidence files, with zero mismatches. hash-verification.json records every comparison; complete.diff holds the exact reviewed cumulative diff. Metadata suffixes leave production and regression-test hashes equal to the green inputs.

  • Same regression file SHA-256 e51e6e5a1330abf7ae3a1db1cdac45982c4ab6b60686b212035bc09760ea7e00 for red and green, with baseline/fixed production hashes bound separately. Node 24.13.1 and pnpm 11.10.0 runtime bytes match the manifest.
  • red-exact.log: 9 failed / 17 passed on exact baseline production, start 14:04:04 Warsaw on 20 October. Failures discriminate four explicit-intent variants becoming legacy, both replay bypasses, two lost parent provenance cases and stale-selection acceptance. The native receipt failure shows success returned where the test required rejection; these are product assertions, not the earlier invalid fixture setup.
  • green-exact.log: 26 passed, start 14:04:27 Warsaw; bindings record process start 14:04:26.448482+02:00 and exit 0 at 14:04:47.431246+02:00. No skipped cases reported.
  • Precise control count: the unchanged baseline file contains 15 pre-existing tests. The 17 passing red cases comprise those 15 plus the newly added legacy-omission and late-adapter-rollback controls. Calling all 17 unchanged controls would overstate the source inventory; this does not invalidate red/green discrimination.
  • nearby-proof.log: four files / 91 passed. final-map-test.log: 22 passed. Thus 139 passing affected tests are supported, not a whole-suite merge gate.
  • Final check records bind cache-off server/contracts typechecks, scoped lint/format, diff/inventory and fork metadata checks to their inputs with exit 0. The retained unrelated layerUnavailable warning and Effect suggestions are visible. Final metadata/map/fork-stack output supports the metadata-only suffix. I did not rerun any check.

The fixture calls the registered MCP tool with an injected provider invocation scope. It exercises production handlers, Prism and local admission with real SQLite/effects, while mocking unrelated services and provider/probe leaves. This is not real bearer HTTP admission, a real provider execution, full native credentials coverage, Live Verification or a production observation. New waits subscribe to persisted events or drain the effect worker; the added cases introduce no sleep/poll/timeout/skip to force a pass. Assertions observe persisted member/child purpose, exact parent identity and unchanged event/run inventories, rather than only call wiring.

Inputs and limits

Read the canonical operations router and review method, impact analysis, verification, orchestration/bounded delegation and Elon algorithm references; Great Library README; project AGENTS, CONTRIBUTING, root glossary, Effect guidance and bundled Effect LLMS guidance. Healthy hook supplied complete current direction and preferences. Read the finite original worker brief and local canonical handoff in full, PR body and complete eight-file diff, #377 body/narrow finding/canonical handoff and relevant original purpose policy in parent Observer #58, including its linked policy decision record. GitHub snapshots are retained in this scratch directory. The #386 source finding was read as prior context, not treated as a cleared code verdict.

Large combined reads produced truncation; focused reads recovered the required brief, glossary, Effect guidance, policy decision and decisive source/proof portions. I did not reread every historical comment, private original design artifact or linked historical log, nor every byte of repetitive migration/compiler/fork-stack output. Hash verification proves retained bytes match their manifest, not that the historical processes were independently witnessed. No unread input was needed to resolve a supported finding within this finite repair.

Whole-head means the complete candidate diff was reviewed, including metadata suffixes, with relevant reachable consumers. It does not mean a line-by-line audit of all unchanged large modules, every adapter/client, broader #377 policy/UI acceptance, remote work, cross-kind concurrency or accounting correctness. No runtime falsifier was necessary for an unresolved actionable finding. CI state was not assessed or cleared. No author clearance was reused, and this verdict cannot substitute for the separately required Opus review or merge approval.

Elon record

Requirements and who asked: User's read-only whole-head review brief and finite #377 repair require preserved local member purpose, immutable same-kind retries, legacy compatibility and honest proof limits, supporting truthful Drafter execution under the Objective.
Deleted: New policy/architecture, cross-kind arbitration, fabricated later-member purpose errors, duplicate test execution, nested agents and deployment/accounting claims.
Bottleneck: Three existing omission points: group command/schema carry, service fast replay and native receipt replay.
Checked myself: Frozen source before/after, complete eight-file diff and relevant admission/receipt/commit consumers, registered fixture/oracles, retained red/green failures and summaries, all 46 hash bindings and metadata suffix identity.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Opus5.5 MEDIUM also approves PR #581 at frozen head ca634bbda46110767bcf67b8e9eba54e90b8751a.
Why: The complete eight-file repair preserves member intent, both replay checks and batch atomicity without a supported actionable finding.
So what: Both old-head code reviews are complete; main advanced, so the author will align the branch and refresh proof/CI before fresh exact-head reviews and separate merge approval.

Parent read the full report and accepts its finite coverage with the stated limits. Sol's independent whole-head approval covers the same candidate. Parent has separately read the owning policy/body, CONTRIBUTING, glossary, full original handoff and all46 bound manifest entries; Opus did not independently repeat all those reads and does not claim it did. The report's current-base hunk analysis is source feedback, not a combined runtime or CI proof.

Current main is c3557ef338fce173285b40149fa3c19e49b52e86, containing #580 and #578 beyond the old f3a399d base. Parent directs a bounded author-owned linear rebase, preserving ca634bb and the unchanged semantic patch. New head requires its own current proof/CI and BOTH exact-head reviews. No merge or dependency clearance is authorized by this old-head verdict.

Full Opus report follows unchanged.

PR #581 independent whole-head review, round 1 (Opus 5.5)

Verdict: APPROVE. I found no supported actionable correctness finding in the eight-file candidate or in the admission, replay and commit consumers it reaches. This verdict covers only the finite local Run-group purpose repair. It does not clear the merge: current-base CI and explicit human approval to merge into main remain with the parent.

Reviewer: Claude Opus 5.5 (claude-opus-5-5) in the Claude Agent harness. MEDIUM is the requested app configuration; I make no claim about internal effort beyond that. I did not author the implementation, dispatch nested agents, run tests, install anything or write to GitHub.

Frozen identity

  • Read-only source workspace: /home/luke/.t3/worktrees/chromeria/fix-377-local-run-group-purpose.
  • HEAD before and after review: ca634bbda46110767bcf67b8e9eba54e90b8751a. Tree before and after: 8a9a5140735122587dab25ec493ef35a9d57e2d0.
  • Base f3a399d40c252730b02b7022b627763f7add91b0, with base tree verified as 7cbb439a2fcaf6b20d2c7d7b597e98c44eebb0cb.
  • git status --porcelain=v1 was empty (0 lines) before and after.
  • Cumulative diff base..head: 8 files, +400/-5, SHA-256 f9b23d6dfb7edc559d0779c269afb3b9dafc56fcf6a23ddc1143703fd2822e2a. I computed this independently and it matches.
  • Scratch directory: /home/luke/.local/state/chromeria-379-proof/581-ca634-review/opus55. It was created with a plain exclusive mkdir that succeeded. This report is its only output.

No checkout, fetch, switch, reset, pull, source edit, index write or ref write happened. I created no worktree. I did not touch canonical main or the user's scripts/__pycache__. I ran no providers, dev servers, browsers or devices, and accessed no live DB or credentials. I made no GitHub reads or writes either. The PR body and Issue content came from the retained pr.md, the handoff and the brief, not from a live forge read.

Mechanism review and dispositions

  1. O1, local group dropped intent: cleared.

    • OrchestratorMcpService.ts:2041 now carries purposeIntent into delegated_task.group.request only when it is defined.
    • The internal schema at orchestrationV2.ts:3383 declares Schema.optional(PurposeIntent), so it survives server-command decoding. Groups persisted without the field still decode, so old receipts stay compatible.
    • dispatchDelegatedTaskGroupRequest at Orchestrator.ts:7779 destructures only members and groupId. The rest, including intent, is spread into each per-member delegated_task.request.
    • Each member then goes through the existing ExecutionPurpose.resolvePurposeIntent. That call gets intent, the parent's current purposeSelection, and inheritance built from executionPurposeOf(parentRun) with provenance {parent_run, threadId, runId: parentRun.id}.
    • The member stores both purpose and purposeIntent, and the child thread's purposeSelection is set to the resolved scope.
    • The inherit path is bound to the actual run A, not to the mutable chip B.
    • Omitting intent still reaches the existing legacy-unscoped resolver, and the service still emits the legacy warning, which the test asserts. No inheritance is inferred.
  2. Committed-group fast replay: cleared.

    • At OrchestratorMcpService.ts:1954, a non-empty committed group compares every member with purposeIntentsEqual. That check runs before wait/read and before any Prism, selection or dispatch work.
    • purposeIntentsEqual (executionPurpose.ts:146) treats undefined as equal only to undefined. So "omitted" and "inherit" never alias. A legacy group with no stored intent replays only for a retry that also omits it, so explicit intent cannot relabel it after the fact.
    • Members come from runGroupMembers, which keeps every app-owned record with the group id regardless of status. Cancelled or terminal members are still compared.
    • The error code orchestration_error and the PurposeAdmissionError({reason: "intent_reused"}) message reuse the existing owner. No new route or code was added.
    • A matching retry after the chip moves returns before selection admission, so the first admitted identity stays fixed. The test asserts unchanged event sequence, subagent count and child run records.
  3. Native command receipt: cleared.

    • Orchestrator.ts:13137 adds the group type to the existing accepted-receipt intent check. It runs after the rejected-receipt and thread-conflict checks (canReplayCommandReceipt), so those behave as before. It runs before admissionResult, and receipt replay creates no new outbox or provider work.
    • The witness is the first app-owned subagent.updated event in the stored events. That is member 0, and every member gets the same shared intent, so this one witness is valid for the whole group. Historical intent-less groups yield an undefined witness, consistent with the fast-path semantics.
    • Matching replay returns the original storedEvents. The test asserts replay.storedEvents equals first.storedEvents and that changed intent fails with PurposeAdmissionError intent_reused.
  4. Atomicity, under the accepted bounded adjustment.

    • Members append into one command's events/effects Refs. providerAdapters.get fails for member 2's ghost Color only after member 1 has fully built its purpose-bearing child, events and effects.
    • Nothing reaches the commit, so the test asserts unchanged parent sequence, zero subagents, a missing first child projection and zero provider starts after drain.
    • Separately, a stale selection (expectedRevision: 0) refuses the whole group with zero starts.
    • These two tests discriminate different things: batch rollback and purpose admission. I agree that a member-2-only purpose failure cannot arise naturally, because the intent is shared and parent state is read once per serialized command. I do not require a fabricated one, and I do not waive atomicity.
  5. Current-base interaction (live main c3557ef338): no semantic overlap found.

    • git diff f3a3..c3557ef changes Orchestrator.ts only in the transportRecovery metadata spread (around line 3427) and the run.interrupt recovery-stop branch (around line 12866). Neither touches the receipt validation at 13137, group expansion or delegated-task admission.
    • orchestrationV2.ts gains transportRecovery fields away from line 3383.
    • docs/fork-features.md, docs/map.md and scripts/fork-upstream-edits.txt change in different sections or lines. Map line PZ versus the candidate's EP; fork-upstream-edits around line 487 versus the candidate's line 516.
    • I inferred textual non-overlap from hunk positions. I did not run a merge, because that would write objects. The retained red/green proof is old-base proof only and must not be presented as tested against combined current main. Current-base CI stays with the parent.

Proof inspection

Evidence directory: /home/luke/.local/state/chromeria-377-local-group-20261020.

  • The regression file at HEAD hashes to e51e6e5a1330abf7ae3a1db1cdac45982c4ab6b60686b212035bc09760ea7e00, which matches the bound red/green input.
  • red-exact.log: Tests 9 failed | 17 passed (26). The nine failures are exactly the four explicit-intent variants, fast replay, native receipt, the two unscoped-inheritance cases and stale selection.
  • The base test file has 15 it(...) definitions. So the 17 passing tests are 15 pre-existing tests plus the two new controls (legacy-omission each-case and the late-adapter rollback). Not 17 unchanged tests.
  • green-exact.log: 26 passed. nearby-proof.log: 91 passed. final-map-test.log: 22 passed. Total: 139 passing affected tests. That is affected-test feedback, not the full merge gate.
  • The test file has no sleep, setTimeout, .skip or TestClock. Waits use waitForProjection on persisted state and the effect-worker drain.
  • Assertions check persisted member and child-run purpose, exact parent-run provenance, the warning text, event-sequence and inventory invariance, and receipt event equality. They test behavior, not wiring.
  • Fixture limit: the registered MCP tool is called with the fixture's injected provider invocation scope. Real Prism Run=2 and real Orchestrator/SQLite/effect worker run, with provider leaves faked. This is not real bearer HTTP admission or real provider execution.
  • I did not re-hash all 46 manifest entries. I relied on the parent's zero-mismatch verification plus my own direct hash of the diff and the test file. I did not read every compiler, lint or fork log.

Whole-diff coverage

File Coverage
apps/server/src/mcp/OrchestratorMcpService.ts Full diff. Read the whole runGroupMethods.delegateTaskOrRunGroup and loadRunGroup, and traced runGroupMembers.
apps/server/src/orchestration-v2/Orchestrator.ts Full diff. Read the receipt-replay block (13090-13200), group expansion (7769-7790) and the delegated-request purpose resolution and subagent construction (7480-7600).
packages/contracts/src/orchestrationV2.ts Full diff. Read purposeIntentsEqual in executionPurpose.ts.
apps/server/src/mcp/RunGroups.integration.test.ts Full diff of all added tests and the withParent change. I did not reread the unchanged pre-existing fixture body line by line.
apps/server/src/testUtils/shardWeights.json Full diff (new 18.8 entry).
docs/fork-features.md Full diff. Run-groups upstreamFiles and execution-purpose PR/shared-file additions are consistent.
docs/map.md Full diff. EP adds secondary PR #581 and #377 stays primary.
scripts/fork-upstream-edits.txt Full diff. The shard-weight path is allowlisted under the #377 heading.

The diff has no UI, client, adapter, grant, remote-group, completion, schedule, version or deploy change. The broader #377 UI and policy decisions, cross-kind arbitration (#386) and #379 consumption stay outside and are not closed by this PR. I did not audit unchanged large modules, other adapters or clients line by line.

Inputs read

  • Canonical operations router, code-review procedure and review method.
  • The Great Library README.
  • Project AGENTS (in context).
  • The original worker brief and canonical handoff, in full.
  • The dispatch brief, including the prior Sol report.

Not read live: the #377 body and comments, the #386 Sol report file, CONTRIBUTING and the root GLOSSARY. None was needed to resolve a mechanism in this finite repair.

Elon record

Requirements and who asked: The parent's whole-head review brief for #581, under the finite #377 repair. It requires preserved local group intent, immutable same-kind replay at both owners, legacy compatibility and honest proof limits, in service of truthful Drafter execution.
Deleted: Test reruns, nested agents, fabricated member-2 purpose failures, merge-tree object writes and new policy demands.
Bottleneck: Three omission points: group command carry, service fast replay and native receipt replay.
Checked myself: Frozen identity before and after, the diff hash, full non-test and test diffs, the relevant consumers above, purpose equality semantics, current-main hunk positions for the candidate files, red/green/nearby/map log summaries, the baseline test count and the test-file hash.

@lukemaj
lukemaj force-pushed the fix/377-local-run-group-purpose branch from ca634bb to fddb446 Compare October 20, 2026 12:35
@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Sol MEDIUM approves exact current head fddb446 with no actionable findings.
Why: Its fresh whole-candidate review covered the complete diff and current-main consumers.
So what: The full report follows unchanged; Opus 5.5 MEDIUM and separate human merge approval remain required.

PR #581 independent whole-candidate review, round 2

Verdict: APPROVE. I found no supported actionable correctness finding in the complete current eight-file diff and the relevant reachable admission, replay, purpose, atomic-commit and incoming recovery consumers inspected. This is a new review of fddb44686f415d33805993c890058cac40dfeb50, not a transferred approval of ca634bb or a delta-only recheck. It covers the finite local Run-group purpose repair; it does not approve merge, broader #377 acceptance, purpose accounting, or #379/#386 dependency clearance.

Reviewer: GPT-6.1 Sol through Codex, requested MEDIUM. The supplied runtime identifies this model, harness and medium configuration; no hidden-effort claim is made. I did not author the implementation or run nested delegation.

Exact candidate and boundaries

  • Exclusive read-only source workspace: /home/luke/.t3/worktrees/chromeria/fix-377-local-run-group-purpose.
  • Initial and final HEAD: fddb44686f415d33805993c890058cac40dfeb50.
  • Initial and final tree: d852f83ec4b96c988010c1ca27dbb349ca2ed8c8.
  • Exact base: c3557ef338fce173285b40149fa3c19e49b52e86.
  • Initial and final git status --porcelain=v1: empty, including untracked files.
  • Complete base-to-head diff: eight files, +400/-5. Independently computed SHA-256: c65fc288cf86086f3e83e47ea5d0110b6c0bc44853311c033cb3be8cfa681aae.
  • Final scratch was created successfully by plain exclusive mkdir: /home/luke/.local/state/chromeria-379-proof/581-fddb-review/sol. All saved review outputs are there, including complete.diff, hash-verification.json, historical-bindings-verification.json, range-diff.txt and read-only forge snapshots.

No source, index or ref writes, checkout/switch/fetch/reset/pull, new worktree, test execution, installation, provider/dev-server process, browser/device action, live database or credential access occurred. GitHub reads used gh pr view and gh issue view; no GitHub Issue/PR/comment/review/status writes occurred. The required app PR association linked #581 and its final list confirmed it, without a purposeDelivery argument. Parent owns publication of this report unchanged and review status.

Findings and dispositions

No required fixes, speculative optional changes or unresolved reachable code findings are proposed.

  1. Intent carry and actual parent identity: cleared on this candidate. packages/contracts/src/orchestratorMcp.ts:187 already accepts optional PurposeIntent, and the registered handler calls delegateTaskOrRunGroup. The service at OrchestratorMcpService.ts:2041 now carries the envelope into the group command, whose internal schema at orchestrationV2.ts:3388 retains it. Orchestrator.ts:7773 expands members by removing only members and groupId, then spreading the shared command into each single-member request. Member fields cannot override purpose intent. Existing delegated admission finds the exact parentRunId, validates its node and active/stopping state, and resolves explicit reference, selection, inherit or unscoped through ExecutionPurpose.resolvePurposeIntent before child event construction. Inheritance uses executionPurposeOf(parentRun) and exact parent-run provenance, independently of mutable chip B. Each subagent retains intent and resolved purpose, child selection starts from the resolved scope, and purposeSource supplies the same purpose to its first run. Omission still resolves legacy-unscoped with the existing warning. No new inference or policy is introduced.

  2. Committed-group fast replay: cleared. At OrchestratorMcpService.ts:1954, every retained committed member is compared with the retry's intent before wait/read, Prism resolution, selection admission or dispatch. purposeIntentsEqual distinguishes absence from inherit/reference/unscoped/selection. The established PurposeAdmissionError(intent_reused) message is returned as orchestration_error. Matching replay returns original task identities before reading the changed selection, including a now-stale selection revision. loadRunGroup and runGroupMembers retain all parent-owned group members without filtering cancelled/terminal status or child deletion. Projection deletion updates the deleted thread rather than deleting its parent's subagent row. Legacy absent-intent records therefore replay for omission and reject explicit relabelling. Existing result-reading behavior when a child is unavailable is unchanged and is not lifecycle repair.

  3. Native receipt replay: cleared. Orchestrator.ts:13161 includes group commands in the existing accepted-receipt intent validation. Rejected receipts and thread conflicts still take their earlier paths. The first app-owned subagent.updated event precedes child message events, so it witnesses the original shared group intent; every group member gets that same intent. The stored event is meaningful for both modern and legacy groups. A mismatch fails before admission, planning, commit/outbox work or provider start; matching replay returns the original stored events. Parent thread mapping and serialized dispatch retain their existing owner. Cross-kind request arbitration remains outside this repair and is not claimed solved.

  4. Atomic all-or-none admission: cleared within the approved proof distinction. Group members append to one command's temporary event/effect arrays. Only a successful complete plan reaches EventSink.commitCommand; its transaction reserves/upserts the receipt, applies events/projections and enqueues outbox effects together, then publishes/notifies after commit. A member-2 adapter rejection occurs after member 1 has constructed its purpose-bearing child/events/effects, but prevents any of them reaching commit. The test checks zero parent subagents, unchanged event sequence, missing first-child projection and zero starts after drain. Stale selection separately proves purpose refusal before starts. One shared intent and serialized parent selection cannot naturally produce a member-2-only purpose failure, so I accept the two discriminators separately and do not require a fabricated purpose failure or waive atomicity.

  5. Incoming fix(prism): retry provider network failures until recovery #580/fix(web): preserve Escape focus over closing menus #578 interaction: no actionable conflict found. I read the relevant incoming diffs and current surrounding recovery owners, not only hunk positions. Transport-wait metadata and recovery Stop handling do not replace group intent admission or receipt validation. Recovery commands name their original source run; continuationPurposeRunId includes forkPrismRetryOfRunId, and dispatch resolves immutable source-run purpose rather than the mutable chip. Recovery hooks gate retry admission and preserve continuation identity; cancellation/retirement guards stay on the existing commit path. Group admission still validates the exact active parent under its parent lock. The new BaseUI patch is a web hover-close guard and has no server purpose consumer. Frozen lock/workspace/patch hashes and installed ESM/CJS files match the current manifest. I do not claim a complete independent audit or runtime proof of transport recovery or menu focus.

Whole-diff coverage ledger

Changed file Inspected coverage and disposition
apps/server/src/mcp/OrchestratorMcpService.ts Complete diff; full group route, fallback, selection/dispatch assembly, committed replay, load/read/wait/status/cancel paths; established error and equality owners. No finding.
apps/server/src/mcp/RunGroups.integration.test.ts Complete diff and fixture; added persisted-purpose, parent provenance, replay, refusal and rollback oracles; existing single/group/kit/mode/cancel/wake/status controls read. No finding.
apps/server/src/orchestration-v2/Orchestrator.ts Complete diff; exact parent lookup, purpose resolution, subagent/child events, member expansion, command mapping/lock, receipt replay, plan-to-commit path; incoming metadata/Stop and recovery-source purpose seams. No finding.
packages/contracts/src/orchestrationV2.ts Complete diff and surrounding internal command schema/union; public delegate schema and PurposeIntent/equality/resolver traced. Optional legacy compatibility retained.
apps/server/src/testUtils/shardWeights.json Complete diff; 18.8 suite weight and ownership consistent with expanded regression suite.
docs/fork-features.md Complete diff; Run-group shard-weight ownership, execution-purpose shared regression file and PR reference consistent; incoming recovery/menu entries preserved.
docs/map.md Complete diff; #377 remains primary and #581 is a secondary PR reference. Incoming Prism references preserved.
scripts/fork-upstream-edits.txt Complete diff; shard-weight path allowlisted under the existing purpose repair; incoming menu pin entry retained.

This backend delta changes the registered local agent entry point and shared admission. It adds no UI/client control, provider adapter, capability/grant, remote group/completion path, schedule, version or deployment. No separate client surface change is required for these three existing backend omission points.

Proof inspected, not re-executed

Current evidence root: /home/luke/.local/state/chromeria-377-local-group-20261020/currentmain-c355.

I read its handoff, manifest, topology, checks and range-diff records; inspected affected-test output, setup, typecheck diagnostics, lint/format, inventory and fork-check evidence relevant to the claims. I independently hashed all 33 current manifest entries with zero mismatches: task source, frozen dependency inputs, installed package/runtime files and retained records/logs. hash-verification.json contains every comparison. Independently executed read-only git range-diff shows all three entries equal. These establish byte/patch identity, not independent witnessing of historical processes.

  • affected-tests.log contains Test Files 6 passed (6) and Tests 139 passed (139), start 14:33:54 Warsaw, duration 34.29s on 20 October. Bound command/process interval is 14:33:50.817156 to 14:34:28.569370 +02:00, exit 0, on exact fddb/c355.
  • The six named files comprise RunGroups 26, nearby 91 and map 22 cases. No skipped count is reported. This is current affected feedback, not full CI acceptance or a complete merge gate.
  • Bound cache-off server/contracts tsc-rs, scoped lint/format, diff/inventory and fork-stack/metadata checks exit 0. Logs retain the unrelated layerUnavailable lint warning and Effect suggestions. Setup used pinned Node 24.13.1 and pnpm 11.10.0 with offline/frozen/ignore-scripts arguments and zero downloads; runtime and installed patch bytes match the manifest.
  • Historical red-green-bindings.json, manifest, final-checks record and decisive raw failure output were inspected separately. I rehashed six selected historical proof files with zero mismatches. Same final regression SHA e51e6e5a1330abf7ae3a1db1cdac45982c4ab6b60686b212035bc09760ea7e00 produced 9 failed/17 passed against original f3a399d production and historical 26/26 green. Failures discriminate dropped explicit purpose, both replay bypasses, lost parent provenance and stale-selection acceptance. This is historical source-before proof, not a red run on c355.
  • The base source has 15 pre-existing it.live tests. Red's 17 passing cases are those 15 plus the two new legacy-omission and later-adapter rollback controls. No claim of 17 unchanged controls is accepted.

The fixture invokes the real registered MCP tool with an injected provider invocation scope, real Prism Run=2, real orchestration/purpose/SQLite receipt-event-outbox machinery and effect worker. Provider/probe leaves and unrelated services are faked. Assertions observe persisted child/member purpose and run identity, parent provenance, unchanged inventories/sequences and actual receipt events. Event subscriptions and worker drain provide milestones; added cases introduce no sleep/poll/timeout/skip to force success. This does not prove real bearer HTTP admission, real credentials/provider execution, full native adapter behavior or Live Verification. Recovery reactor end-to-end timing and BaseUI focus were not exercised by this review or established by these six files.

Inputs and limits

Read the canonical operations router, code-review procedure, review-method, impact-analysis, verification, orchestration, bounded-delegation and Elon algorithm references; Great Library README; project AGENTS, CONTRIBUTING, root GLOSSARY and server Effect guidance including bundled Effect LLMS instructions. The healthy hook supplied complete triad and private preferences. No Project Direction change was reviewed or proposed.

Read the original finite worker brief in full, historical and current local handoffs, current live PR body, #377 body/narrow finding/canonical handoff, and approved policy in Observer #58 plus its linked policy decision record. Both prior reports were supplied in full in the review packet and were treated only as historical coverage/limits, not current approval. Inspected the prior #386 report's O1 context. Large combined reads sometimes truncated; focused reads recovered the required policy, brief, glossary, fixture, source and decisive proof portions.

Explicit unread limits: I did not read every historical Issue comment, every private original design/adjudication artifact, all linked historical logs or every repetitive compiler/fork-stack line. The unrelated remainder of the #386 design challenge was not audited in full. No required current input was missing, and none of those unread historical details was needed to resolve an actionable mechanism in this finite repair. No full line-by-line audit of unchanged large modules, every provider/client, remote lifecycle, cross-kind concurrency or accounting was performed. CI status was not assessed or cleared. No additional runtime falsifier is requested for an unresolved code finding because none remains supported in this inspected scope.

The parent still owns the separate fresh Opus 5.5 MEDIUM whole-candidate review, current CI and explicit human merge approval for main. This verdict alone cannot clear merge.

Elon record

Requirements and who asked: User requests a fresh read-only whole-candidate review of exact fddb/c355 for finite #377 local intent carry, immutable same-kind replay, legacy compatibility and honest proof limits, supporting truthful Drafter execution under the Objective.
Deleted: Reused historical approvals, delta-only review, new policy/architecture, fabricated member-2 purpose errors, repeated tests, nested agents and live/accounting/deployment claims.
Bottleneck: The three purpose omission/replay owners plus their interaction with incoming current-main recovery and dependency inputs.
Checked myself: Exact clean identity before/after, entire eight-file diff/hash, relevant reachable consumers and fixture/oracles, incoming recovery and patch seams, 33 current hashes, six selected historical bindings, three equal range-diff entries and retained raw proof summaries.

Final frozen source remains HEAD fddb44686f415d33805993c890058cac40dfeb50, tree d852f83ec4b96c988010c1ca27dbb349ca2ed8c8, with empty git status --porcelain=v1.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Opus round 2 reports APPROVE with no code finding, but its required-input coverage is incomplete.
Why: The report explicitly omits inputs the review brief required, including CONTRIBUTING, root glossary and original finite worker brief.
So what: The report follows unchanged; a new Opus MEDIUM whole-candidate round is closing those omissions, and review/independent remains pending.

Parent adjudication: no source fix is requested. The inherited stale-selection error-prefix note is optional with no correctness impact. Fresh round 377-581-r3-opus55-medium-fddb446-required-inputs-v1 receives the complete original packet and all prior reports/responses, with exact required reads and unchanged fddb/c355 candidate. No human merge approval requested until this review is complete.

PR #581 independent whole-candidate review, round 2 (Opus 5.5)

Verdict: APPROVE. I found no supported actionable correctness finding in the complete current eight-file diff or in the admission, replay, purpose-resolution and commit consumers it reaches on fddb44686f. This is a fresh review of the current candidate. It does not transfer the ca634bb approvals and is not a delta-only check. It covers only the finite local Run-group purpose repair. It does not clear the merge: explicit human approval to merge into main stays with the parent, and so do broader #377 acceptance and #379/#386 dependency clearance.

Reviewer: Claude Opus 5.5 (claude-opus-5-5) in the Claude Agent harness. MEDIUM is the requested app configuration; I make no claim about internal effort. I did not author the fix, dispatch nested agents, run tests or installs, or write to GitHub. I made no forge reads either. PR context came from the packet and the retained pr.md and handoff.

Exact candidate

  • Read-only workspace: /home/luke/.t3/worktrees/chromeria/fix-377-local-run-group-purpose.
  • HEAD before and after review: fddb44686f415d33805993c890058cac40dfeb50. Tree before and after: d852f83ec4b96c988010c1ca27dbb349ca2ed8c8.
  • Base c3557ef338fce173285b40149fa3c19e49b52e86, which is also the merge-base.
  • git status --porcelain=v1: 0 lines before and after.
  • The base..head diff is 8 files, +400/-5. I computed its SHA-256 independently as c65fc288cf86086f3e83e47ea5d0110b6c0bc44853311c033cb3be8cfa681aae, which matches.
  • git range-diff (read-only) of f3a399d..ca634bb against c3557ef..HEAD shows all 3 entries =.
  • Scratch /home/luke/.local/state/chromeria-379-proof/581-fddb-review/opus55 was created with a plain exclusive mkdir that succeeded; only the parent was created with -p. Its only outputs are report.md, test.diff and hash-check.txt.

Mechanism review and dispositions

  1. Intent carry to every member and child run: cleared.

    • OrchestratorMcpService.ts:2041 spreads purposeIntent into delegated_task.group.request only when it is defined.
    • orchestrationV2.ts:3388 declares Schema.optional(PurposeIntent), so older persisted group commands still decode.
    • dispatchDelegatedTaskGroupRequest (Orchestrator.ts:7782) does { members, groupId, ...shared } and then { ...shared, ...member }. The member schema allows only modelSelection and runtimeMode, so a member cannot override the intent.
    • dispatchDelegatedTaskRequest (Orchestrator.ts:7433-7600) does four things for each member:
      • It finds the exact command.parentRunId and rejects it if it is inactive or stopping.
      • It validates the parent node.
      • It calls ExecutionPurpose.resolvePurposeIntent with the intent, the parent's selection, and inheritance from executionPurposeOf(parentRun) with provenance {parent_run, threadId, runId}.
      • It stores purpose and purposeIntent on the subagent and sets the child's purposeSelection to the resolved scope.
    • Inherit binds to run A, not to the mutable chip B.
    • If the intent is omitted, the call falls through to the existing legacy resolver. The test asserts the existing legacy warning. No new inference is introduced.
  2. Committed-group fast replay: cleared.

    • The check at OrchestratorMcpService.ts:1954-1967 runs before wait/read, the hasReceipt fallback, Prism, selection and dispatch.
    • runGroupMembers (RunGroups.ts) filters only origin === "app_owned" and runGroupId. Cancelled and terminal members are therefore still compared.
    • purposeIntentsEqual treats absent as equal only to absent. A legacy group cannot be relabelled with explicit intent, and an omitted retry cannot alias an explicit one.
    • On mismatch it returns orchestration_error with the existing PurposeAdmissionError(intent_reused) message. That reuses an existing owner and adds no new code.
    • A matching retry after the chip moves returns the committed identities before selection admission. That is the immutable-first-admission requirement.
  3. Native command receipt: cleared.

    • Orchestrator.ts:13161 adds the group type to the existing accepted-receipt intent check. It runs after the rejected-receipt and thread-conflict handling and before admissionResult, so a mismatch creates no plan, outbox or provider work.
    • The witness is the first app-owned subagent.updated event in the command's stored events. Every member receives the same shared intent, so any member's event is a valid witness for the whole group.
    • Groups stored before this change have no intent on that event, which gives an undefined witness. That matches the fast-path semantics.
    • Matching replay returns the original storedEvents.
  4. Atomicity: cleared, within the accepted proof adjustment.

    • Members append into one command's events and effects Refs, and only a complete plan reaches commit.
    • The ghost-Color test fails at providerAdapters.get for member 2. By then member 1 has already built its purpose-bearing child, events and effects. The test then asserts:
      • zero parent subagents;
      • an unchanged event sequence;
      • no first-child projection;
      • zero provider starts after drain.
    • Stale expectedRevision: 0 separately refuses the whole group with zero starts.
    • These are two distinct discriminators. A member-2-only purpose failure cannot arise naturally, because the intent is shared and the parent state is read once per serialized command. I do not require a fabricated one, and I do not waive atomicity.
  5. Incoming fix(prism): retry provider network failures until recovery #580/fix(web): preserve Escape focus over closing menus #578 on the current base: no interaction found.

    • I read the full f3a399d..c3557ef diff for Orchestrator.ts and orchestrationV2.ts. It adds a transportRecovery metadata spread around line 3430 and a recovery-Stop branch in the run.interrupt case around line 12869. It also adds transportRecovery fields to the thread, shell and metadata-update schemas.
    • None of these touch delegated or group admission, purpose resolution or receipt intent validation.
    • The BaseUI patch and ChatView change are web-only and have no server purpose consumer.
    • The range-diff shows the task commits are unchanged. Current affected tests ran on the combined tree.

Optional notes (non-blocking, no change requested)

  • A stale-selection refusal on the group path surfaces as orchestration_error with an Unable to create Run group: ... prefix, because of the existing dispatch error mapping in the service. That mapping existed before this PR, and the test asserts only the code. I see no correctness impact.

Proof inspected (not re-executed)

  • currentmain-c355/affected-tests.log: Test Files 6 passed (6), Tests 139 passed (139), start 14:33:54 Warsaw, duration 34.29s, on fddb/c355.
    • That total is RunGroups 26, nearby 91 and map 22.
    • This is affected feedback. It is not the full CI gate, real bearer HTTP admission, real provider execution, or proof of recovery/menu behavior.
  • I independently rehashed every entry in currentmain-c355/candidate-manifest.json: 33 checked, 0 mismatches, 0 missing (hash-check.txt). That covers source, lock, workspace, patch, runtime and installed-patch files. Byte identity is not independent witnessing of the historical processes.
  • Historical red (9 failed / 17 passed on f3a399d) is source-before proof only.
    • The base test file has exactly 15 it.live definitions (re-counted on c3557ef). The 17 passing tests are those 15 plus the two new controls, not 17 unchanged tests.
    • No red was rerun on c355, and none is claimed.
  • I read the test oracles in full.
    • They observe persisted member and child purpose, exact parent-run provenance, event-sequence and inventory invariance, and receipt event equality. They do not just check call wiring.
    • The added cases contain no sleep, timeout or skip.
    • The fixture's injected provider scope plus faked provider leaves is an explicit limit.

Whole-diff coverage

File Coverage
apps/server/src/mcp/OrchestratorMcpService.ts Full diff. I read the whole group branch of delegateTaskOrRunGroup (1935-2072), including the fast replay, single fallback, parent-run check, Prism resolve, dispatch and error mapping.
apps/server/src/orchestration-v2/Orchestrator.ts Full diff. I read the receipt-replay block (13140-13200), group expansion (7771-7790), and the delegated-request admission and subagent/child construction (7433-7600).
packages/contracts/src/orchestrationV2.ts Full diff, plus the surrounding group and member schemas.
apps/server/src/mcp/RunGroups.integration.test.ts Full diff, including every added case and the withParent change. I did not reread the unchanged fixture body line by line.
apps/server/src/testUtils/shardWeights.json Full diff (18.8 entry).
docs/fork-features.md Full diff. The Run-groups upstreamFiles entry and the execution-purpose PR and shared-file additions are consistent.
docs/map.md Full diff. EP adds secondary PR #581; #377 stays primary.
scripts/fork-upstream-edits.txt Full diff. The shard-weight path is allowlisted under the #377 heading.

The PR adds no UI, client, adapter, grant, remote-group, completion, schedule, version or deploy change. The broader #377 UI and policy decisions, cross-kind arbitration and remote groups stay outside and are not closed by this PR.

Inputs and limits

  • Read: the canonical operations router, the code-review procedure, the review method, impact analysis and the Great Library README. Also the project AGENTS (in context) and the complete packet, which includes both prior reports and the Sol round-2 report.
  • Treated as claims only: the packet's reports. My verdict comes from my own source reading above, not from agreement with Sol.
  • Not read live: the Track explicit Issue and PR purpose across runs and continuations #377 and feat(peer): complete all-tool cross-machine workflows across web desktop and mobile #386 bodies and comments, CONTRIBUTING, the root GLOSSARY, the original worker brief file, every log line, and the recovery reactor and hooks internals. None was needed to resolve a mechanism in this finite repair.
  • Not assessed: CI status. I did not audit unchanged large modules, other adapters or clients line by line.

Elon record

Requirements and who asked: The user's brief for a fresh Opus whole-candidate review of #581 at fddb/c355. It requires preserved local group intent, immutable same-kind replay at both owners, atomicity, legacy compatibility and honest proof limits.
Deleted: Approval transfer, delta-only review, test reruns, nested agents, fabricated member-2 purpose failures and new policy demands.
Bottleneck: Three omission points (group command carry, service fast replay, native receipt replay) and their interaction with the incoming main changes.
Checked myself: Identity before and after, diff hash, range-diff, all 33 manifest hashes, the full non-test and test diffs, the admission/receipt/expansion consumers, the incoming Orchestrator and contracts hunks, the base test count and the affected-test summary.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Fresh Opus 5.5 MEDIUM whole-candidate review approves exact fddb446 after completing all required inputs.
Why: The earlier input-coverage gap is closed and no actionable code finding remains.
So what: Together with Sol round 2 this completes the independent code-review pair; current CI is green, and the separate main merge awaits human approval.

Parent read the report in full and accepts the explicit limits. The inherited stale-selection error prefix remains optional with no fix requested. Complete report follows unchanged.

PR #581 independent whole-candidate review, round 3 (Opus 5.5)

Verdict: APPROVE. After reading every required input, I found no supported actionable finding in the complete eight-file candidate or in the admission, replay, purpose-resolution and commit consumers it reaches. This round reviews the current candidate and does not reuse any earlier approval. It covers only the finite local Run-group purpose repair. It does not clear merge into main, broader #377 acceptance, #379/#386 dependency clearance, real bearer-HTTP or provider execution, or Live Verification.

Reviewer: Claude Opus 5.5 (claude-opus-5-5) in the Claude Agent harness. MEDIUM is the requested app setting, and I claim nothing about internal effort beyond it. I did not author the fix, dispatch nested agents, run tests or installs, or write to source, index, refs or GitHub.

Exact candidate and boundaries

Item Value
Workspace (read-only) /home/luke/.t3/worktrees/chromeria/fix-377-local-run-group-purpose
HEAD, before and after fddb44686f415d33805993c890058cac40dfeb50
Tree, before and after d852f83ec4b96c988010c1ca27dbb349ca2ed8c8
Base c3557ef338fce173285b40149fa3c19e49b52e86 (also the merge-base)
git status --porcelain=v1 0 lines, before and after
Diff base..HEAD 8 files, +400/-5
Diff SHA-256 c65fc288cf86086f3e83e47ea5d0110b6c0bc44853311c033cb3be8cfa681aae, computed independently before and after; matches
Read-only range-diff git range-diff f3a399d..ca634bb c3557ef..HEAD: all 3 entries =
  • Scratch: /home/luke/.local/state/chromeria-379-proof/581-fddb-review/opus55-r3. I created it with a plain exclusive mkdir, which succeeded.
  • Scratch contents:
    • report.md;
    • complete.diff;
    • hash-check.txt;
    • read-only forge snapshots: issue377.json, c-6290236559.json, c-6290536120.json and observer58.json.
  • Forge access: reads only, through gh issue view and gh api GETs on Issue comments. No Issue, PR, comment, review or status writes.

Required inputs: read and outcome

These were missing from the previous Opus round; this time I read them.

Required input Read Bearing on this candidate
CONTRIBUTING.md (worktree) In full Requires one problem per PR, plus evidence that names what was checked and what was not. #581 fixes one problem: local Run groups drop purpose intent, and both replay owners skip the intent check for the same command kind. Contract, server, test and fork metadata are all needed for it. The PR is backend-only, so before/after screenshots do not apply. Its evidence names commands, results and limits. No conflict.
Root GLOSSARY.md (worktree) In full The candidate's code and test names use existing terms: Run group, execution purpose, delegated task, Color, Prism role. Names like subagent in the code are existing T3 identifiers, which the project AGENTS file allows to stay. The diff adds no new term or synonym, so no glossary edit is needed.
Original worker brief /home/luke/.local/state/chromeria-379-proof/386-de50-design-review-sol/377-worker-brief.txt In full Its requirements are mapped against the source and tests below. The exclusions it names are all respected: no new policy or tables, no cross-kind arbitration (386 R1), no remote completion (386 R3), no UI, no version bump.
#377 body (live, OPEN) In full The acceptance line "Children inherit unless explicitly assigned otherwise" applies here. So do "Valid new intent is required in a versioned envelope; absent protocol warns unscoped" and "immutable replay and failure-before-effect". The candidate satisfies all three for local groups. The broader #377 criteria (UI, steer, remote, native provenance, Observer) stay open and are not claimed.
#377 narrow finding, comment 6290236559 (live) In full The repair constraints map one-for-one onto the dispositions below.
#377 canonical handoff, comment 6290536120 (live) In full Matches the current head, tree, base, range-diff, file hashes and affected-proof claims I checked.
Approved policy: agent-observer #58 body (live) In full The candidate follows these rules: "Child work inherits unless explicitly assigned a different purpose"; "Explicit versioned task-aware calls require valid intent. Absent protocol is legacy unscoped with warnings"; and "Native admission failure prevents app-requested execution". It adds nothing from the policy's non-goals: no purpose-repair API, no reassignment, no new services.
Operations modules: SKILL.md router, references/verification.md, references/orchestration.md, references/bounded-delegation.md, references/test-design.md, procedures/code-review/index.md, review-method.md, impact-analysis.md Each in full Applied below: independent oracle, faithful seam, failing-before evidence, reuse versus executed coverage, honest limits, and no verdict transfer.
Great Library README In full No item in it applies to this review.
Project AGENTS.md and global rules Supplied in context by the session The candidate respects "Hit every surface", "Do not bump versions", the map and fork-metadata rules, and the rule not to run repo-wide checks.

Every required input was read, and no read failed.

Mechanism review and dispositions

  1. Intent reaches every member and every child run: cleared.

    • OrchestratorMcpService.ts:2041 adds purposeIntent to delegated_task.group.request only when it is defined. So an omitted intent stays absent and is never turned into a default.
    • orchestrationV2.ts:3388 declares purposeIntent: Schema.optional(PurposeIntent). Group commands persisted before this change still decode.
    • Orchestrator.ts:7782 expands the group with { members, groupId, ...shared } and then { ...shared, ...member }. The member schema at orchestrationV2.ts:3398 allows only modelSelection and runtimeMode, so a member cannot override the intent.
    • Each member then runs the existing dispatchDelegatedTaskRequest admission path, which does four things:
      • It finds the exact command.parentRunId and rejects a parent run that is inactive or stopping.
      • It validates the parent node.
      • It calls ExecutionPurpose.resolvePurposeIntent with the command intent, the parent's selection, and inheritance from executionPurposeOf(parentRun) with parent_run provenance.
      • It stores both purpose and purposeIntent on the subagent and sets the child's purposeSelection to the resolved scope.
    • So inheritance binds to the actual run A, not to the mutable chip B.
    • An omitted intent still reaches the existing legacy-unscoped path, and the existing warning is asserted.
  2. Committed-group fast replay: cleared.

    • The check at OrchestratorMcpService.ts:1954-1967 compares every committed member using purposeIntentsEqual (executionPurpose.ts:146). It runs before wait/read, the hasReceipt single-task fallback, Prism, selection and dispatch.
    • "Absent" equals only "absent", and present intents compare by their canonical encoding. So an omitted intent and inherit never alias, and a selection intent with a different expectedRevision is treated as a different intent.
    • loadRunGroup is runGroupMembers (filtered on app_owned and runGroupId) filtered again to the caller thread, with no status filter. Cancelled and terminal members are still compared.
    • The failure reuses orchestration_error and the existing PurposeAdmissionError(intent_reused) message, so no new error owner is added.
    • A matching retry after the chip changes returns the committed identities. The test asserts the same task ids, an unchanged parent event sequence, 3 subagents, and unchanged child run records.
  3. Native command receipt: cleared.

    • Orchestrator.ts:13161 adds the group type to the existing accepted-receipt intent check. It runs after the rejected-receipt and thread-conflict paths and before admissionResult, so a mismatch creates no plan, outbox or provider work.
    • The receipt is checked against the command's first subagent.updated event with app_owned origin. Every member stores the same command.purposeIntent at emission, so that one event is valid evidence for the whole group.
    • Groups stored before this change carry no intent, which matches the absent-intent behaviour of the fast replay.
    • admissionThreadId maps the group to parentThreadId, so the parent lock and serialized admission keep their existing owner.
  4. All-or-nothing creation: cleared, within the accepted proof adjustment.

    • Members append into one command's events/effects Refs, and only a complete plan reaches commit. I confirmed the order myself: providerAdapters.get sits at the start of each member's admission (about line 7490), and event emission comes later (about lines 7655-7676).
    • In the test, member 2's ghost Color fails only after member 1's whole iteration has already put its purpose-bearing child, subagent events and effects into the Refs. After drain, the test asserts:
      • zero subagents;
      • an unchanged parent event sequence;
      • no first-child projection;
      • zero provider starts.
    • Separately, a stale selection (expectedRevision: 0) refuses the whole group with zero starts.
    • These are two distinct discriminators, as the brief's accepted adjustment states. I do not require a fabricated member-2-only purpose failure, and I do not waive the atomicity requirement.
  5. Incoming fix(prism): retry provider network failures until recovery #580/fix(web): preserve Escape focus over closing menus #578: no interaction found.

    • I read the full f3a399d..c3557ef Orchestrator.ts diff:
      • a transportRecovery metadata spread around line 3430;
      • a run.interrupt branch that turns a recovery stop into thread.stop and clears transportRecovery.
    • The other server changes are confined to prism/Recovery*, recovery* and ProjectionStore.
    • None of these touch delegated or group admission, purpose resolution or receipt intent validation. A recovery stop makes the parent run stopping or inactive, and the pre-existing parent-run check refuses new admission in that state.
    • The BaseUI patch is web-only.
    • I did not audit recovery runtime behaviour.
  6. Optional note, no change requested. On the MCP group path, a stale-selection refusal surfaces as orchestration_error with the existing Unable to create Run group: ... prefix, from the existing error mapping. The test asserts only the code. I see no correctness impact; this is inherited behaviour.

Brief requirement mapping (original worker brief)

Requirement Status
Explicit reference, inherit, unscoped and selection intents reach every member through existing admission Met (dispositions 1, 4; test persists $name...)
Omitted intent stays legacy, warned and unscoped Met (legacy-omission case asserts the warning and legacy_no_intent)
Exact parent-run inheritance, independent of the chip Met (runId: active.id after the chip moves to B; separate inherits-unscoped-parent cases)
Matching retry is immutable with no extra child or run Met (disposition 2)
Changed intent is rejected before effects, at both the fast-replay owner and the receipt owner Met (disposition 2 test: 4 changed variants; disposition 3 native test)
All-or-nothing creation Met, under the accepted adjustment (disposition 4)
Stays within the deferred exclusions (no cross-kind or remote work, no UI, tables, services or version bump) Met
Proof goes through the real registered tool, real Prism Run=2, real orchestrator, SQLite and effect worker, with only provider leaves faked Met; limits below
No sleep or polling to force a pass Met: waitForProjection subscribes to streamStoredEventsFrom, and completion waits use the worker's drain

Proof: executed, reused and unverified

Kind What
Executed by me Rehashed every entry in currentmain-c355/candidate-manifest.json (manifest SHA-256 d119209f…939d): 33 entries, 0 mismatches, 0 missing (hash-check.txt). Also: diff hash, range-diff, the regression file hash e51e6e5a…7ea00, and the base test count of 15 it.live.
Reused, inspected, not rerun affected-tests.log: Test Files 6 passed (6), Tests 139 passed (139), start 14:33:54 Warsaw, 34.29s, on fddb/c355. That total is RunGroups 26, nearby 91 and map 22. Historical red: 9 failed / 17 passed on f3a399d. The 17 passing tests are the 15 pre-existing ones plus 2 new controls, not 17 unchanged tests. That run is source-before proof only, and no red run happened on c355.
Not verified by this review Full CI (the parent reports green; I did not assess it). Real bearer-HTTP admission, real credentials and provider execution, Live Verification. Recovery reactor timing and BaseUI focus behaviour.

Fixture limit: the registered MCP tool is called with an injected provider invocation scope, and provider and probe leaves are fake.

The tests' expected values are independent literals, such as reference #11/#12, exact provenance objects and the legacy warning text. They are not derived from the helper under test. A plausible faulty implementation that drops the intent, like the pre-fix code, fails the four explicit-intent cases. One that skips either replay guard fails the two replay tests. The historical red confirms both.

Whole-diff coverage

File Coverage
apps/server/src/mcp/OrchestratorMcpService.ts Full diff. Read the whole group branch at lines 1925-2072, plus loadRunGroup/readRunGroup.
apps/server/src/orchestration-v2/Orchestrator.ts Full diff. Read commandThreadId mapping, delegated admission (7433-7680, purpose and adapter order), group expansion (7771-7790), the receipt block (13120-13215) and admission threading (13228-13240).
packages/contracts/src/orchestrationV2.ts Full diff, plus the surrounding remote and group schemas. Read purposeIntentsEqual.
apps/server/src/mcp/RunGroups.integration.test.ts Full diff, every added case, the withParent intent seam, the invoke scope, waitForProjection, and the base count of 15 tests. The unchanged pre-existing test bodies were not reread line by line.
apps/server/src/testUtils/shardWeights.json Full diff: the 18.8 entry.
docs/fork-features.md Full diff. Shard-weight ownership under Run groups and the shared regression file and PR #581 under execution-purpose are consistent.
docs/map.md Full diff. EP adds secondary PR #581, and #377 stays primary, as the map rule in AGENTS requires.
scripts/fork-upstream-edits.txt Full diff. The shard-weight path is allowlisted under #377.

Limits

None of these items was a mandated input that I failed to read. None was needed to resolve a mechanism in this finite repair.

Elon record

Requirements and who asked: The user's round-3 brief for a fresh Opus whole-candidate review of #581 at fddb/c355, with the mandated inputs read in full. Under #377 and the Observer #58 policy, the repair must keep local group intent, keep same-kind replay immutable at both owners, be all-or-nothing, keep legacy compatibility, and state its proof limits honestly.
Deleted: Transferring approval from prior rounds, test reruns, nested agents, fabricated member-2 purpose failures, and new policy or architecture demands.
Bottleneck: The previous round's unread mandated inputs; the code mechanisms themselves were unchanged and already traced.
Checked myself:

Final frozen source: HEAD fddb44686f415d33805993c890058cac40dfeb50, tree d852f83ec4b96c988010c1ca27dbb349ca2ed8c8, empty git status --porcelain=v1.

@lukemaj
lukemaj merged commit 9378189 into main Oct 20, 2026
26 checks passed
@lukemaj
lukemaj deleted the fix/377-local-run-group-purpose branch October 20, 2026 14:26
lukemaj added a commit that referenced this pull request Oct 20, 2026
#581 registered shardWeights.json under run-groups while the integration
already owns it under fork-maintenance; fork-features requires one owner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lukemaj added a commit that referenced this pull request Oct 20, 2026
* feat(peer): preserve authority and native returns across environments (#391)

* feat(peer): return notices and delegate onward within durable authority

* fix(peer): retain authority through queued execution and recovery

* fix(peer): preserve active run authority across native operations

* fix(peer): retain authority for every accepted run input

* fix(peer): check every contributor against the actual target

* fix(peer): validate joint work against its actual resource

* docs(peer): inventory retained consent seams

* fix(peer): remove unused authority helper re-export

* fix(peer): bound private output by effective caller modes

* fix(ci): weight the measured peer authority workflow

* fix(peer): retain effective caller modes during task cancellation

* feat(peer): continue remote delegated jobs and stop later work (#392)

* feat(peer): retain remote delegated job lifecycle and durable Stop

* docs(map): link remote lifecycle component PR

* fix(peer): preserve Stop replay and source task navigation

* fix(peer): reconcile accepted attachment and bound session expiry

* fix(server): bind delegated lifecycle routes to production runtime

* fix(peer): preserve attachment bytes and native request acceptance (#410)

* fix(peer): preserve attachment bytes and native request acceptance

* docs(peer): link request recovery component review

* docs(peer): register attachment recovery review provenance

* fix(peer): declare device receipt owner in fork inventory

* fix(server): preserve scoped retries and scheduler acceptance

* fix(peer): preserve authorized manual admission and saved snapshot replay

* fix(peer): preserve native preview capability refusal

* fix(attachments): recover exact native discard acceptance

* fix(attachments): retain bytes after keyed discard acceptance

* fix(preview): reconcile native recording claims before replay

* feat(peer): answer remote descendant requests from the source (#416)

**What**: Exact #369 candidate42051c passed real source-only web and Codex peer request acceptance, including committed replay after both full CLI servers restarted.
**Why**: Independent tests cannot establish that the production composition, real provider callback and source-only client work together.
**So what**: The planner accepts this bounded internal component for integration into #379 after a fresh head/base/gate check; combined multi-machine/client acceptance and final shipment remain pending.

Requirements and who asked: User #379 mandates native delegated lifecycle and all permitted tools with two MEDIUM reviewers and real isolated client/provider proof.
Deleted: No fake provider, direct SQL mutation, injected browser RPC, capability expansion, alternate harness or duplicate callback.
Bottleneck: Current candidate integration; #383 shared device authority/discovery and #384/#385/#386 remain outstanding.
Checked myself: Primary planner drove actual source A browser, inspected native B events/provider results, restarted both CLI products, replayed exact original request, and reopened the same source-only result.

Identity: HEAD42051c47813c354682b80677009b199d86fef1a0, treef9efef2d7df1b8b91ac64b09018386e79ccc1d45, baseab1bf53640e2a6541a2ba9f316839cedf81d4f46. Clean author workspace /Users/rocky/.t3/worktrees/chromeria/feat-369-remote-pending-requests. Both full production servers ran that source, with meaningful copied task-owned history in NEW /tmp/chromeria-369-acceptance-a and -b; old382 homes/evidence remained untouched. Node24.18, A server14247/web7663, B14248, source incognito Browser connected ONLY to A950a38f2-e2a5-4242-9171-c17e0cb8412c. Actual B is ef047b58-1edf-4ad6-a1ba-44320188325c. No live userdata write, new grant, physical device or standalone worker server.

Human source-only flow: A actual Codex gpt-6.1-sol/MEDIUM delegated real async B task369-parent-native-question-v1 in existing B project/root. B actual Codex asked request_user_input_async, persisted pending at B sequence288. Primary opened source task viewer from transcript; browser URL stayed A, no B profile. The actual card displayed369 REAL REMOTE QUESTION, ACCEPT_369/DECLINE_369 and disabled Send answer until selection. Primary selected ACCEPT_369 and sent once. B durable request resolved at sequence290, command mcp:request:385bcb2f7e0a7415a3c0d1cda8a0cabb0b7204f83949b505a9f4fe4cb6482210:0, 2026-10-18T10:10:47.347Z. Real provider consumed the answer and completed369_REMOTE_ANSWER=ACCEPT_369. Source returned exact original result and zero pending requests. Not inferred from dispatch acceptance.

Agent tool flow: Separate deliberate B task369-parent-native-agent-answer-v1, same explicit Color. Native delegate mode wait returned on real pending question with waitTimedOut:false, requestCount1, actual qualified target/revision334. Source local list{} correctly returned[]; explicit remote descendant list returned its actual request. Native qualified read returned real369 REAL AGENT QUESTION/options/revision334. Source called t3_pending_request_respond with original target/route/expectedRevision334, answers{0:AGENT_ACCEPT_369}, stable key369-parent-agent-response-v1. Initial AND exact retry both returned sequence340. B request has exactly one pending334 and one resolved336 event; real provider completed369_AGENT_RESULT=AGENT_ACCEPT_369. Two B tasks intentionally created, each ordinal1 completed, no duplicate B run.

Restart proof: Read-only query found zero preparing/queued/starting/running/waiting runs in A/B. Primary stopped only captured own sessions47643/49402 (exit130), restarted same source and same NEW homes in sessions86505/9639. A actual Codex ordinal34 called ONLY the exact original respond input/key after reconstruction: sequence340 again. Postrestart B has no additional request resolution or provider run. Source previous-agent viewer reopened after both restarts with original human result, real accepted answer and zero pending requests. Actual client screenshot inspected before upload.

Evidence: local immutable/raw read-only oracles /tmp/chromeria-369-parent-actual-question-proof.json, /tmp/chromeria-369-parent-native-agent-tool-proof.json, /tmp/chromeria-369-parent-postrestart-proof.json. Full CLI logs /tmp/chromeria-369-acceptance-{a,b}-server.log and -restart.log retained. Native Browser screenshots in existing UNPUBLISHED draft evidence-379, never a public release:

![Real source-only pending question](https://github.com/toolboxmd/chromeria/releases/download/untagged-cf149e2fe74d54191ae2/browser-screenshot-localhost-mvdnzzmy-b8c7d28b.png)

![Real source-only completed result after reconstruction](https://github.com/toolboxmd/chromeria/releases/download/untagged-cf149e2fe74d54191ae2/browser-screenshot-localhost-mvdo5woi-469c18e9.png)

Both fresh exact-candidate independent MEDIUM reviews APPROVE: Sol #416 (comment) and installed Grok4.7 #416 (comment). Full aggregate #369 (comment). Current420 CI39116640008, Fork39116640150 and final fingerprint39116844636 SUCCESS; original canceled fingerprint retained separately. Authenticated newest review/independent SUCCESS by lukemaj. Neither review substitutes for the actual proof above. Full author/R1/R2 packet #369 (comment).

Limits: These are TWO isolated Rocky environments, web/source-only browser and actual Codex provider. No physical cross-machine/tunnel/mobile/native desktop/all-provider/real live approval, durable-dismiss or secret acceptance claim. Registered native tests retain their own broader and S1/S2 race/empty-choice proof. Earlier native initialization404 remains UNKNOWN; later tests/CI/actual positives do not diagnose it. Operational verification earlier used invalid exact=true locator syntax and a stale assumed web port; corrected to supported selectors/actual dev-runner7663 without alternate browser or product changes. Cost supported publish #416 (comment) is partial task379 coverage, not complete cost; old unplaced/unpriced usage remains unknown. Background supported sync still pending at this record, not presumed complete.

States: implemented YES; current focused/native tests YES under their exact records; BOTH reviewed YES; current CI YES; bounded primary product proof YES; internal integration NOT YET at this record; main merged/build/shipped/activated/live combined acceptance NO. No package bump. All rollback/evidence/workspaces retained under explicit #379 instruction until final acceptance.

* fix(client): clarify remote requests and count pending work once

* fix(client): make remote request choices readable and accessible

* docs(peer): track the remote request client repair

* fix(peer): count initial remote work once in sparse shells

* feat(device): add typed remote device execution core (#421)

* feat(device): execute typed commands across peer links

* docs(map): link the typed device core component

* fix(device): preserve native authority and typed command semantics

* fix(device): recheck authority before native shutdown

* wip: preserve native contexts and purpose metadata after main alignment

* fix(peer): preserve current-main request answering policy (#539)

* fix(peer): preserve current-main request answering policy

* fix(compat): restore inherited CI consumers

Reuse baseline-only repairs from the preserved #383 checkpoint d892050cb97854e08ca1ca427fc762caebbd69f7 under the #379 ownership transfer. Adapt the two web test fixtures for actual Chromium collection without changing production web behavior.

* test(prism): absorb native recovery observer fixture

Transfer the exact test blob authored in cdd4780 and preserved by PR537 at fcd3162. Await the native observer marker before measuring the live batch; preserve the duplicate assertion and production source.

* fix(client): hide remote children from default navigation (#546)

* wip: hide remote children from default navigation

* wip: register destination navigation component PR

* wip: retain user forks with remote provenance

* wip: cover phone and alternate sidebar navigation

* wip: declare phone and legacy carried upstream edits

* feat(peer): keep destination automations authorized offline (#555)

* feat(peer): retain destination automation authority offline

* docs(peer): link destination authority component PR

* wip: repair destination authority recovery and acceptance findings

* wip: fence schedule acceptance and preserve live birth permissions

* wip: preserve birth permission purpose and split native proof

* wip: preserve recovery routes and birth dependency lifetime

* wip: retain paired recovery routes through repeated unlink

* wip: wake exact automation disable recovery at known expiry

* feat(remote): view and control qualified browser and device resources (#534)

* wip: combine qualified resources with destination automation

* wip: bound mobile returned-resource row height

* wip: respect native top safe area for tool resources

* wip: preserve current-main cross-machine compatibility checkpoint

* wip: preserve linked research and tool policy identity across main alignment

* wip: repair vault authority and keyed MCP configuration replay

* test(server): validate credential refusal error envelopes (#566)

* fix(peer): render HTML from idle destination contexts (#563)

* fix(server): prepare HTML in idle peer resource contexts

* docs(map): track the open idle HTML component

* fix(orchestration): wake parents for remote pending requests (#531)

* fix(orchestration): wake parents for remote pending requests

* fix(orchestration): deliver held remote requests when parent waits end

* fix(peer): wait for request content before notifying parents

* fix(orchestration): catch up requests after remote original completion

* test(web): isolate panel keyboard tests from inherited pointer (#575)

* fix(peer): attribute remote follow-ups to the completing run (#582)

* fix(peer): attribute remote follow-ups to the completing run

* docs(map): link remote completion provenance repair

* fix(peer): use observed purpose for first remote completion

* fix(scheduled-tasks): record refused keyed manual runs as terminal failures

A keyed run_scheduled_task_now whose dispatch failed with a typed error and
left no native receipt returned outcome_unknown and kept the schedule marked
running forever. Record it as the request's failed outcome, release the
running reservation, and replay the same failure for the same key.
Interrupted or defective dispatches stay outcome_unknown.

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

* fix(orchestration): accept blank optional answers in remote request admission

Remote pending-request answers with expectedRevision rejected a blank or
omitted optional choice-only question as an unoffered option. Skip blank
optional answers before validating options, matching the message-response
path.

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

* chore(fork): keep one owner for server shard weights

#581 registered shardWeights.json under run-groups while the integration
already owns it under fork-maintenance; fork-features requires one owner.

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

* test(server): weight typed peer effects by their CI time

PeerAuthority.typedEffects.workflow.test.ts takes about 197s in a CI shard
but was weighted 46.4s, so Test Server 8 exceeded its 10-minute limit.

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

* fix(peer): reopened parents follow their remote tasks again

Archiving a parent ended its remote follower, and nothing restarted it on
unarchive, so the reopened parent missed later remote results until a
server restart. The follower now stays registered and waits for the
parent's unarchive or deletion instead of exiting, so reopening resumes
observation without a new entry point or a duplicate follower.

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

* fix(peer): threads read and answer their own questions again

The replacement pending-request service refused every "own" answerer, so a
thread reading or answering its own user-input question, or an ordinary
full-access MCP client doing so, got capability_denied. Own access is
restored for local, non-linked callers on threads not delegated from
another environment. Own approvals, dismiss, linked clients and remote
delegated children keep their existing refusals.

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

* fix(web,mobile): remote request cards keep multiline editor answers

Remote pending-request cards rendered every custom answer as a single-line
field, so a multiline editor prefill displayed and was stored flattened.
Editor questions (those with an initialAnswer) now use the Textarea on web
and a multiline, newline-submitting field on mobile, as the local paths do.

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

* fix(scheduled-tasks): keyed pause and resume replay their receipt

A keyed update_scheduled_task carries clientRequestId on its input, so the
enable-only shortcut never matched: a keyed pause or resume fell through to
the full definition update and was refused without a purposeIntent. The
shortcut now ignores routing fields, and setEnabled records and replays
the keyed mutation receipt like create, update and delete. A retried
keyed pause after a later resume replays instead of retiring the newer
automation certificate.

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

* fix(scheduled-tasks): post-admission recheck refusals release keyed manual runs

A typed refusal from the recheck after admission, or after the dispatch
claim, now records the key as failed and frees the schedule instead of
leaving it running. The stage-guarded claim keeps uncertain dispatches
outcome_unknown.

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

* fix(childThreads): stop-disposed remote children stay pending background work

A parent interrupt disposes a delegated completion with disposedBy "stop"
without stopping the remote child. The sparse SQL remote arm dropped that
row while the local arm and pendingDelegatedChildTasks kept it, so shells,
auto-settlement and storage cleanup treated the parent as idle.

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

* fix(scheduled-tasks): final recheck refusals no longer fail a concurrent same-key dispatch

The final live recheck ran after the prepared -> dispatching claim and
terminalized a refusal from the dispatching stage. For an existing-thread
schedule a same-key retry can read dispatching and send concurrently, so
the refusal failed the request and freed the schedule while that send was
accepted. The final recheck now precedes the claim, so a refusal is only
recorded through the prepared-stage compare-and-set.

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

* fix(peer): finished remote jobs no longer hold back live Stops

A lifecycle-v1 follower keeps long-polling its job there after the result,
so a later Stop or follow-up is still observed. Each poll held one of the
eight shared peer permits for up to 20 s, so more than eight finished jobs
starved Stops and live observations of other jobs.

Followers whose job has nothing left to do there (result available, no
queued runs, questions or recovery wait, or a confirmed Stop) now wait on
their own semaphore. Stops, unconfirmed and acknowledged stops, live jobs
and follow-ups seen as working keep the existing eight permits.

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

* fix(peer): stopped remote jobs with new work there keep live permits

A confirmed Stop counted a job as settled whatever its latest snapshot
said, so fresh direct input on the destination child after the Stop
left its follower queued behind idle settled long-polls, also after a
restart.

A job is now settled only while its latest snapshot is quiet (result
available, no queued runs, questions or recovery wait); a confirmed Stop
also needs that quiet snapshot. Anything showing activity uses the
shared network permits.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant