Skip to content

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

Merged
lukemaj merged 8 commits into
feat/379-cross-machine-parityfrom
feat/384-destination-authority-current
Oct 20, 2026
Merged

lukemaj merged 8 commits into
feat/379-cross-machine-parityfrom
feat/384-destination-authority-current

Conversation

@lukemaj

@lukemaj lukemaj commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

What: Destination automation now passes834 affected tests, including automatic expiry-triggered disable and durable ACK after recovery parks.
Why: A known dependency deadline could pass without waking the existing recovery driver.
So what: Both new complete Sol/Opus MEDIUM reviews and exact-head hosted CI must pass before this component can integrate.

Refs #379/#384. Component into feat/379-cross-machine-parity, base 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc, head 694f80d0783d18847c50337d233bd8b537c8d16a, tree c737a76586c6f343be43ed67dccd656ee504ca96. No closing linkage or #385 blocker clearance. Canonical stopped handoff owns full decisions, commands, failures, proof and limits.

Explicit destination automation captures finite contributor authority atomically. Genuine execution remains current-definition/incarnation/generation bounded; later interactive/onward actions validate original contributors live. Private exact DISABLE/ACK retains original protected identity after retirement, while ordinary revoked authentication stays denied. Prior route repair retains an OAuth-paired primary independently of replacement ordinary-link deletion, with original token/generation, descriptor checks and excluded alternates.

The existing durable owner now derives the earliest outstanding non-pending deadline from originating dependency, indexed certificate and actual grant expiry. The existing single scoped delivery worker waits for either that deadline or its existing mutation queue, then rescans storage; pending work retains its bounded retries. Four capture registration owners notify after their outer transaction commits, so late or earlier registrations rearm an idle driver. No new scheduler/service/schema/protocol or credential path. Fairness32, concurrency4, per-attempt10s, retry2s and CI weights/partition/workers/ceilings are unchanged.

834 passed/2 existing opt-in skips across43files, including186 native across7files. All824 prior passes and139 prior native declarations remain;4 native/6 domain cases added. Real registered schedule capture, OAuth/auth/SQLite and production driver/private receiver prove reconstructed/later/earlier/simultaneous deadlines and ACK cancellation without explicit drain; deterministic external timing and TestClock observe exact durable ACK. Domain cases cover originating/certificate/grant purposes and millisecond boundary. Genuine before-test fails oncc7 with overdue pending0/ACKnull. Intermediate timing/decoder fixture feedback is preserved separately. No real provider/client/OS crash claim.

Actual cache-disabled server/contracts package compilers, scoped lint/format/exports, old-reader decoder controls, true frozen fork boundary, inventory53 and all17 current scoped commands pass. Parent verified46 source/43 test working+Git bindings,89 artifact hashes,7 unchanged older manifests, full five-path diff, native/domain test additions, rawred/final summaries and compiler headers. Manifest SHA256 81f16c55dc9c3b3b46ea3648a3251b22258fff4315c94a12c2e6add41eeaf4fd.

Sol R6 requested expiry repair with incomplete whole coverage. Opus R6 found no supported issue but issued no whole verdict because coverage was unfinished. Neither approves this candidate. Both NEW complete46-path/source/test-body/consumer/material-history reviews are running; original selected design, grants and every prior finding/response/unresolved objection remain unabridged. No historical approval transfer.

Current hosted CI and10-minute shard budget remain open; precedingcc7 all8shards max480s is historical only. Actual clients/cross-machine acceptance, OS crash/product rollback proof, R4-specific Spectrum toggle/broadening variants, #385 and combined #379 acceptance remain open; existing Spectrum tests are retained. Local scoped tests do not substitute for full CI or clients. Main advanced beyond frozen base; parent owns alignment/final cumulative review. PeerAuthority file edits finished/released to #383 for its separate minimal local predicate repair; those changes are not in this candidate. No main merge/deploy/installed restart/live-data/existing-user-grant action/version bump.

Requirements and who asked: Approved #379/#384 requires bounded offline destination automation, exact current authority and autonomous durable expiry/revocation confirmation supporting the remote Promachos surface.
Deleted: Generic scanners/new services, successor bearer promotion, relaxed authentication, dropped regressions, increased CI ceilings/workers and approval transfer.
Bottleneck: Complete current independent reviews, exact hosted CI and combined client/integration acceptance.
Checked myself: Clean local/published head/base/tree and live target, full five-path repair/handoff,46 source/43 test Git bindings/89 artifacts/7 prior manifests, raw834/2skip/186native proof and17 scoped exits.

Implemented by GPT-6.1 Sol / Codex / MEDIUM through T3 Code. Independent review: GPT-6.1 Sol and Claude Opus5.5 / MEDIUM. Coordination: GPT-6.1 Sol / Codex / MEDIUM.

@lukemaj
lukemaj force-pushed the feat/384-destination-authority-current branch from 402af0a to aa25062 Compare October 19, 2026 20:20
@lukemaj

lukemaj commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

What: R1 Sol verdict is REQUEST_CHANGES on aa25062b7fddd91e23d66fb34e7d87b6e9178c82: two independently reproduced defects prevent durable disable recovery from completing.
Why: Failed deliveries lose their recovery driver, and a fixed first batch can indefinitely exclude reachable obligations.
So what: The parent owns repair and fresh complete review of the resulting candidate; this report grants no approval, readiness, blocker clearance or integration authority.

Requirements and who asked: The review assignment requires approved #379v5/#384 destination autonomy with exact authenticated disable/ACK recovery across ordinary link retirement, bounded delivery, and independent exact-candidate review.
Deleted: No source edits, new authorization design, generic retired-session authentication, extra agents, broad test reruns or transferred approval.
Bottleneck: The production disable delivery driver and durable obligation selection fail independently of the protected recovery identity.
Checked myself: Read the production component diff and the recovery owners/callers, executed the actual SQLite obligation service plus PeerMcpClient drain/start with deterministic transport boundaries, checked positive controls, and verified the exact candidate and retained proof digests.

Candidate and reviewer

  • Base: 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc.
  • Head: aa25062b7fddd91e23d66fb34e7d87b6e9178c82.
  • Tree: 9cf9940526f67208a9a9ffdda07abe582eb25864.
  • Both local Git and live GitHub PR base/head match. Review workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-sol is detached and clean.
  • Independent reviewer: Codex harness, provider instance codex, model gpt-6.1-sol, reasoning effort medium. t3_thread_configuration read back that persisted selection for this review task; retained as reviewer-configuration.json in the proof directory below. I did not author this implementation or consult the other current review.

Required corrections

F1 [P1]: Keep driving disable recovery after a failed delivery without an ordinary link

Location: PeerMcpClient.ts:438, with the failure suppression at line450 and startup/reconnect scheduling at lines468-493.

Trigger: A has a durable pending disable and retained original recovery identity, but its ordinary link to B has been unlinked. During startup recovery B returns a transient 503, or a response/ACK is lost. B becomes reachable afterward without a separate link edit or process restart.

Reachable path: PeerLinks.unlink retains the original route and obligation; PeerMcpClient.start invokes drainAutomationDisables once. A non-200 response returns success, and transport/decode failures are suppressed by ignoreCause. With no ordinary stored link there is no startup reconnect task. Subsequent automatic drains require an unrelated PeerLinkEvents event. In the event-driven path, the retry wraps drain -> reconnect, but drain failures have already been suppressed and an unknown/revoked ordinary link is not a retryable reconnect. Retrying the ordinary control channel also never calls the disable drain. Thus recovery can remain idle indefinitely despite a valid protected route and a reachable destination. The pending state remains truthful, but the required eventual disable/ACK recovery does not happen.

Executed independent probe: actual in-memory SQLite obligation service, actual PeerMcpClient.start, actual PeerLinkEvents service, no ordinary links, deterministic HTTP boundary. First disable returns503. After the startup milestone, the destination becomes healthy; advancing Effect TestClock by one hour leaves one total attempt and one pending obligation. Explicitly calling the same production drain then performs attempt2 and immediately records the exact ACK. The positive control rules out missing recovery credentials or an unusable destination. This is not a wall-clock polling test or a product-server experiment.

Keep pending disable delivery driven independently of whether ordinary MCP reconnection succeeds, including after unlink and lost/202 acknowledgements, without widening recovery authentication. Add an observable automatic-recovery regression rather than only calling the optional manual drain in a test.

F2 [P1]: Do not let unreachable first-batch obligations starve reachable disables

Location: DestinationAutomationAuthority.ts:678, consumed by PeerMcpClient.ts:417.

Trigger: At least33 disable obligations are pending, and the32 lowest dependency_id values cannot currently be acknowledged while a later obligation's destination is reachable. The accepted graph supports up to256 dependencies and the durable store has no32-obligation acceptance limit.

pending always returns the same ORDER BY dependency_id LIMIT 32 set. Failed attempts leave those rows pending, and the drain has no continuation/cursor or fair selection. Even repeated reconnects, manual drains and process restarts cannot select the reachable later row while that first set remains unacknowledged. A reachable destination can therefore continue accepted work without ever receiving its source-issued disable because unrelated destinations are unavailable.

Executed independent probe: register and invalidate33 exact dependencies through the actual SQLite service, make the selected first32 return503, and make the withheld dependency return a valid exact ACK if contacted. Three calls to the actual production drain produced 96 requests to the first32, zero requests to the reachable dependency, which remained unconfirmed. A positive control acknowledged the earlier batch, then the unchanged drain immediately reached and cleared the healthy dependency. Preserve bounded batches while ensuring every pending obligation can make progress despite failures elsewhere.

Proof, coverage and limits

Persistent reviewer proof: /home/luke/.local/state/chromeria-379-proof/555-r1-sol-aa/.

Executed serially with existing dependencies and cached Node v24.13.1:

/home/luke/.npm/_npx/200eedeed3b657fd/node_modules/node/bin/node /home/luke/.local/state/chromeria-379-proof/555-r1-sol-aa/disable-batch-probe.mjs
/home/luke/.npm/_npx/200eedeed3b657fd/node_modules/node/bin/node /home/luke/.local/state/chromeria-379-proof/555-r1-sol-aa/disable-retry-probe.mjs

Both exit0 after asserting the defective behavior and the lawful control. Exact output is in disable-batch-probe-node24.log and disable-retry-probe-node24.log, with separate .exit files. Initial executions with existing Nodev26.8.2 reproduced the same results and are retained separately. No failed setup is counted as a product failure. These probes use production service code and SQLite, with synthetic dependencies/credentials and deterministic link-resolution/HTTP boundaries; they do not claim real peer connectivity, credential authentication, OS crash or client proof.

Reused evidence was independently checked: current manifest SHA256 341a24323629f2651fef9068e2946b069eb8652b77038a3f27b35343b40593b8, all36 candidate file hashes/Git blobs, all28 selected test hashes/Git blobs, and all137 retained artifact hashes/sizes. I inspected the raw136+405+81+48 passing summaries, package compiler logs/results and old-reader controls. These establish the reported670 affected passes on this candidate, not complete CI or proof against the two uncovered cases. No broad suite was rerun.

Source coverage: I read every changed production diff across authority records/evaluation/capture, native ownership and event/receipt commit, schedule/check acceptance and effects, Spectrum launch/round/reopen, MCP union readers, auth retirement and retained peer recovery, plus all three documentation diffs. I read the new authority unit test in full and the changed barrier test. I traced the disable driver through startup, ordinary channel retry, link events, unlink/replacement and ACK persistence, and inspected the native workflow's unavailable/lost-ACK/reconstruction tests, which explicitly invoke the manual drain.

Whole-review coverage remains incomplete: the complete changed workflow test body, every surrounding native/credential/tool consumer, all historical linked material-decision evidence and all mandatory acceptance paths have not been exhaustively read/adjudicated. I stopped with supported blockers under the assignment's early-negative allowance. This is a whole-candidate REQUEST_CHANGES, not a clean whole-component verdict or approval of the uninspected remainder. No previous #384 review finding disposition or approval transfers; this is R1. The supplied approved boundary and current handoffs remain requirements/claims, not independent implementation proof.

Real providers, source-only web/desktop/mobile clients, hardware, OS-process crashes, rolled-back product binaries, full CI and parent #379 outcome acceptance remain unverified and parent-owned. No source/index/topology/status/readiness/blocker mutation, product server, browser/device, live userdata/grant, install, subdelegation or other workspace write occurred. All reviewer commands have ended; the review workspace remains clean.

@lukemaj

lukemaj commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

What: #555 is blocked by two reproduced disable-recovery defects and a current-CI module loading cycle.
Why: Automatic recovery stops after failed unlink delivery, its fixed first batch starves later obligations, and the new EventSink authority import closes a runtime import cycle.
So what: The same #384 author is repairing all three in its exclusive workspace; Opus continues reviewing the frozen published aa candidate, and both fresh reviews remain required afterward.

Full independent Sol R1 is REQUEST_CHANGES with supported blockers and explicitly incomplete whole coverage. Parent read the full report, actual PeerMcpClient drain/start and SQL pending selection, and both retained Node24 probe logs.

Accepted F1: after ordinary unlink, startup attempts disable once, receives503, and never automatically tries again despite destination recovery and Effect TestClock1hour. The same production manual drain immediately completes exact ACK, so credentials/route are usable. Current non200 success/ignored errors and ordinary-link-driven retry leave durable pending work without a driver. The existing delivery owner must keep exact protected recovery progressing independently of ordinary link reconnection; truthful pending state alone does not fulfill eventual recovery.

Accepted F2: fixed ORDER BY dependency_id LIMIT32 selects the same failed obligations forever. Actual SQLite service and production drain with33 dependencies make96 attempts across3 drains to the first32 and zero to the healthy later obligation; acknowledging earlier rows lets the same code immediately clear the withheld one. Bounded fair selection/progress is required. No general revoked-session authentication, new public recovery protocol or broad persistent machine automation is authorized.

Current Test Server4 failure: ThreadManagementService.test.ts fails before collection with TypeError: Cannot read properties of undefined (reading of), at ThreadManagementService.ts1472 LegacyV1ThreadImporter.of.80 other files/1068 tests pass in that shard. Parent retrieved the completed-job raw log directly after whole-run log retrieval was unavailable, then inspected the exact introduced EventSink import and actual chain: LegacyV1ThreadImporter imports EventSink, which newly imports PeerAuthority, which imports PeerNoticeDelivery, which imports ThreadManagementService and reaches the incompletely initialized importer. Author must reproduce the standalone suite and repair the owning boundary while retaining atomic commit checks and postcommit notification; a load-order test edit/mock is not an accepted fix. Raw log remains outside Git in555-aa-ci-server4.log.

Same-job repair dispatch 379-384-r1-recovery-ci-repair-aa-v1 is active, no competing writer. Current published aa review status is failure linking Sol's full findings. New source/proof stays in the existing #384 workspace and384-r1-recovery-ci directory; previous670 sealed proof remains truthful for aa and does not clear uncovered cases. Parent owns publication/topology/reviews/clients/merges. No installed service/live-data/existing-grant action. #383 repair and independent frozen-aa Opus review continue separately.

Requirements and who asked: Approved #379/#384 requires durable exact disable/ACK progress after unlink/reconnect, bounded delivery and green current CI.
Deleted: No manual-drain-only recovery claim, fixed-batch starvation, generic retired credential bypass, load-order exception or stale proof transfer.
Bottleneck: Existing durable recovery selection/driver and the newly introduced runtime import dependency.
Checked myself: Full review, actual driver/SQL code, both Node24 positive/negative probe logs, actual completed CI job log and all five modules in the introduced import cycle.

@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ No successful main baseline artifact is available yet. This run establishes the initial measurement.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire — 5.0 KiB — 6.8 KiB ✅
Codex Thread snapshot wire — 3.8 KiB — 4.9 KiB ✅
Codex Live turn WebSocket wire — 1.2 KiB — 2.0 KiB ✅
Codex Live turn WebSocket decoded — 20.9 KiB — 29.3 KiB ✅
Codex Live turn messages — 2 — 8 ✅
Claude Total thread wire — 5.0 KiB — 6.8 KiB ✅
Claude Thread snapshot wire — 3.8 KiB — 4.9 KiB ✅
Claude Live turn WebSocket wire — 1.2 KiB — 2.0 KiB ✅
Claude Live turn WebSocket decoded — 21.2 KiB — 29.3 KiB ✅
Claude Live turn messages — 2 — 8 ✅

Baseline: unavailable · PR result: 694f80d · 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 19, 2026

Copy link
Copy Markdown
Contributor Author

What: #555 server shard2 confirms the same import cycle in two more suites and exposes two remote automation-routing expectation failures.
Why: Legacy importer consumers fail before collection; scheduled-create and Spectrum routing currently receive the new unsupported-authority refusal where their fixture expects success.
So what: The active #384 author has the exact logs and added cases for diagnosis and repair; no admission checks or tests may be weakened to make CI green.

Server2 job: IssueLinks.carryover.test.ts and persistence/forkV1Backfills.test.ts fail with the already accepted LegacyV1ThreadImporter.of1472 import-cycle error. These are additional affected suites, not separate causes.

PeerToolRouting.test.ts has two failed lawful-positive assertions at750: scheduled creation and Spectrum return capability_denied, The destination does not support destination automation authority v1; no definition was accepted. Parent read the actual shared fixture/cases and production version-header paths. Whether the fixture represents an intentionally unsupported old peer or current production negotiation is still UNKNOWN; the author is diagnosing it. Required retained behavior is a lawful current-peer positive at the correct destination, narrower-link denial, and old-peer denial before effects. Merely flipping the positive expectation to error or weakening negotiation is not accepted.

Raw retained555-aa-ci-server2.log; added scope is the existing routing test plus its actual negotiation owner as necessary. Full current670 selection remains, with these CI-exposed suites added to meaningful affected proof. Parent topology/push/reviews/clients/merge ownership and current review failure are unchanged. No live/runtime action.

Requirements and who asked: User requires green current component CI and valid native automation parity under #379/#384.
Deleted: Duplicate cycle counting, unsupported root-cause claims and expectation-only weakening.
Bottleneck: Existing import-cycle repair and accurate current-versus-old-peer routing coverage.
Checked myself: Completed job raw log, exact test assertions/fixture cases, version-header source and active same-author dispatch.

@lukemaj

lukemaj commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Opus 5.5 MEDIUM whole-component review R1 of PR #555 at aa25062b7fddd91e23d66fb34e7d87b6e9178c82: REQUEST_CHANGES.
Why: Plain local schedules and Spectrums now get automation certificates. Once the user disables, edits or deletes the schedule, its threads reject ordinary local follow-ups. A probe confirmed this. Two smaller boundary defects affect the disable recovery path.
So what: The parent routes F1 to F3 to the #384 author for a fix on a new head. That head needs both fresh full reviews (Sol and Opus). This review posts no status and clears no blocker.

Identity and configuration

  • Base 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc (ancestor verified), head aa25062b7fddd91e23d66fb34e7d87b6e9178c82, tree 9cf9940526f67208a9a9ffdda07abe582eb25864. Live PR head read back as aa25062, base branch feat/379-cross-machine-parity. Diff: 36 paths, +6528/-702.
  • Reviewer: Claude Code, claude-opus-5-5, effort medium. Read back from this T3 thread's persisted configuration (claudeAgent / claude-opus-5-5 / effort=medium, full-access/default).
  • Workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-grok (detached, clean at start and end). It has no relation to fix(peer): preserve current-main request answering policy #539 or the Grok route.

Elon record

Requirements and who asked: #379v5 and #384 (selected seam 6271372731, commandPlan extension 6272745083, handoffs 6276031205/6276135067/6276421839). Peer-created automations need offline execution under frozen contributor authority, with durable disable and ACK recovery. Existing ordinary and legacy positives must keep working.
Deleted: Approval transfer, re-running the author's 670-test proof, broad architecture suggestions.
Bottleneck: Stamping applies to every schedule and Spectrum, not just peer-accepted ones, which breaks ordinary local follow-ups.
Checked myself: The full 36-path diff (production read in full; the test diff was sampled by case name and harness), plus the actual consumers: claim, coverage, validate, checkEffect, EventSink commit guard, recordPeerEffectAuthority, PeerLinks retire/resolve, PeerMcpClient drain, McpHttpServer disable route, AuthSessions revoke ordering, checks engine, LaunchService, RoundService, commandPlan. Also one disposable probe through the real registered kernel (see F1).

Findings

F1 (blocking, CONFIRMED by execution): ordinary local schedules and Spectrums are stamped, so their threads become unusable after local disable, edit or delete

  • Path. ScheduledTaskService.ts:1305 calls captureAutomation whenever PeerAuthority exists, which is always true in production (server.ts provides layerPeerAuthority to the runtime). That includes a local web save with no MCP scope. LaunchService.ts:450 and commandPlan.ts:223 do the same for Spectrum. With no scope, captureAutomation returns a certificate with an empty graph. The scheduled dispatch then provides PeerAcceptedAutomation, so peerEffectAuthority.ts:155 records the automation-execution record as the created thread's permanent birth owner. Every later execution commit on that thread goes through EventSink.ts:814 births → checkAutomationCommit → claimAutomationCertificate. That claim requires the schedule to be enabled with the same incarnation and current certificate (DestinationAutomationAuthority.ts:317-354), or the Spectrum to be active at the same generation (:356-371).
  • Trigger. A local user creates a fresh-thread schedule in the web UI. It runs and creates a thread. The user then disables, edits (any field: a new definitionDigest supersedes the certificate) or deletes the schedule, and sends a normal follow-up message in that thread.
  • Actual: message.dispatch is rejected before commit, and checkThread reports "Destination automation authority is disabled or superseded."
  • Required: At base 60c0cc5, local saves capture nothing, so these threads have no peer_thread_authority row and follow-ups succeed. The approved seam keeps "existing ordinary local … paths [at] their prior checked behavior". The brief also requires existing ordinary positives to remain.
  • Evidence. A disposable probe ran outside Git, on an archive copy of exact aa25062, through the registered production kernel with SQLite, the real ScheduledTaskService and EffectWorker, and a deterministic provider adapter.
    • upsert was called with no scope and creationSource: "web". It produced fork_automation_bindings → automation:scheduled-task:….
    • Birth owner: automation-execution:automation:scheduled-task:…:manual.
    • Control: a user follow-up before disable succeeded (control: Success, provider starts 1→2).
    • After setEnabled(false): after: OrchestratorCommandRejectedError … message.dispatch (probe384-follow-after) was rejected before commit, starts stayed at 2, and checkThread failed.
    • Logs: /home/luke/.local/state/chromeria-379-proof/555-r1-opus-aa/probe384-local.log (exit 0) and probe384-local-results.txt.
  • Inferred by the same mechanism (not executed):
    • In a completed local Spectrum (status not active), follow-ups in Color or White member threads are rejected. Only the transcript thread's explicit reopen re-captures.
    • Checked runs pinned to a superseded certificate fail claimRun after a local title or prompt edit (engine.ts claimRun).
  • Proof gap. ScheduledTaskService.test.ts and the other unit suites build the service without PeerAuthority, so no case in the 670 covers a local schedule plus PeerAuthority plus a follow-up.
  • Fix direction: stamp or bind birth ownership only when live capture actually admits peer or legacy contributors. Alternatively, ensure that local-only certificates never become a birth constraint. Add a regression case alongside the existing peer cases.

F2 (blocking, source-confirmed, not executed): capture accepts unbound upstream dependencies, so a contributing peer can register disable rights over arbitrary certificates

  • Location. PeerAuthority.ts:1910: after capture-automation, B calls registerRecovery(dependency, record.sessionId, credential) for every upstream.dependencies entry the peer returned. It never checks certificateId === input.certificateId, destinationEnvironmentId === here, or that resource and definition match the binding. Legitimate multi-hop dependencies always carry the same certificateId, audience and binding, because input propagates unchanged.
  • Consequence. A linked automation-v1 peer that contributes to any capture can return a forged dependency naming another certificate id on B. It can then POST /mcp/peer-control/automation-disable with its own retained token. receiveDisable matches only the hash of the registered credential, inserts a tombstone and invalidates that certificate (DestinationAutomationAuthority.ts:633-663). It can also pre-tombstone a predictable future id, which blocks acceptance.
    • Impact is fail-closed: it can only disable, and it needs a malicious or compromised peer that knows the target id. It still contradicts the selected requirement that DISABLE authenticate only the exact registered dependency, because here the peer chooses that dependency.
  • Same boundary: upstream graph.records with environmentId === here are merged into B's frozen coverage unfiltered (mergeGraphs, then coverageFor). The exact JSON-identity check and the certificate ceiling intersection limit the effect, but B should reject or filter local-environment nodes supplied by a peer.
  • Fix: before registering, require each upstream dependency to equal the capture input (certificateId, destination, resourceId, definitionGeneration, definitionDigest), and drop or deny upstream nodes for here.

F3 (required, source-confirmed, not executed): stuck disable obligations can permanently starve every other disable

  • Location. DestinationAutomationAuthority.ts:678 selects pending=1 AND ack_json IS NULL ORDER BY dependency_id LIMIT 32, and the drain in PeerMcpClient.ts:412-450 is the only consumer. Rows that never succeed stay pending forever with the same sort key:
    • recovery resolver unknown_link or unreachable;
    • non-200 from a receiver that lost its recovery row (PeerMcpClient.ts:438);
    • a decommissioned destination.
  • Trigger. 32 or more obligations to a destination that will never ACK, sorting first. Disables owed to every other, reachable destination are then never selected. Those automations keep executing after source revocation, and their state stays "unconfirmed" indefinitely even though the receiver is online.
  • Fix: batch fairly per next_environment_id, or order by last attempt and rotate. Add a test with more than 32 stuck rows plus one deliverable row.

Non-blocking observations

  • setGrant (PeerAuthority.ts:3112) invalidates every certificate tied to a session on any grant change, including broadening. This fails closed and arguably matches "current B policy", but users widening a peer grant will silently stop that peer's automations. Confirm that this is the intended UX or document it.
  • Retired recovery secrets and fork_automation_retired_links rows are never removed after ACK. The seam permits cleanup of redundant copies; nothing is wrong today.
  • notifyAutomationChanges runs two UPDATEs plus a SELECT on every committed fork plan and schedule mutation. The cost is small but it is per commit.
  • The Spectrum reopen capture runs under the per-thread dispatch lock, not a global lock. Cleared.

Cleared concerns (checked)

  • Effect SQL nested withTransaction uses savepoints on the same TransactionConnection (.repos/effect-smol/packages/effect/src/sql/SqlClient.ts). Acceptance inside the receipt and ForkCommitPlan transactions is therefore atomic.
  • Revocation ordering: AuthSessions single, bulk and replacement revocations call invalidateAutomationSessions in the same transaction before revoked_at. PeerLinks link and unlink retire obligations before secret removal.
  • The disable route matches only the hash of the registered credential and never feeds ordinary MCP, RPC or prepare authentication.
  • Tombstone-before-accept is enforced in accept and claim.
  • Interactive onward validation still goes live (purpose: "interactive" skips frozen coverage).
  • A Spectrum successor reopen requires the generation-1, non-active native state, and old generations remain historical only.
  • The parentId traversal in checkAutomationCommit is local-only (incoming records have a null parent), so ordinary interactive commits are not newly denied by missing remote ids.

Coverage

  • Executed (this review): one disposable probe, plus three preserved failed probe-setup attempts. First, pnpm exec triggered a dependency check that aborted with ERR_PNPM_ABORTED_REMOVE_MODULES_DIR_NO_TTY; nothing was removed and the workspace was verified clean. Then two fixture timeouts, caused by the default adapter never completing a turn and the run still preparing. These are fixture faults, not product failures. Final command, run from the archive copy: PATH=<node v24.13.1>:$PATH ./node_modules/.bin/vp test run apps/server/src/peer/PeerAuthority.workflow.test.ts -t probe384-local, exit 0. Artifacts, with SHA-256 in artifact-sha256.txt: /home/luke/.local/state/chromeria-379-proof/555-r1-opus-aa/.
  • Reused, not re-run: the author's current-base proof (manifest SHA-256 341a2432…93b8 re-hashed and matching; summaries 136/405/81/48 read from the raw logs). It is affected-repository proof, not CI.
  • Unverified: F2 and F3 were not executed. The Spectrum-member and checked-run variants of F1 were not executed. No CI, real clients, cross-machine run, OS crash or product rollback was exercised. Test diff: case names and the harness were read in full; the bodies of the 2,691 added lines were only sampled.
  • No previous review findings existed, and no approval transfers. No source, index or workspace writes; no status posted.

Reviewed by Claude Opus 5.5 (medium effort) through Claude Code in T3 Code.

@lukemaj

lukemaj commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Sol MEDIUM R2 verdict for PR #555 at c93e256c745c015b6d58e9b097498fbe1f84f3ed is REQUEST_CHANGES.
Why: A schedule acceptance captured before a concurrent acceptance can overwrite its newer certificate without preserving the newly accepted contributors.
So what: The parent owns adjudication and repair; complete fresh review remains required, and this report posts no aggregate status or readiness decision.

Requirements and who asked: Approved #379v5/#384 and the selected boundary require immutable conjunctive contributors, exact definition/generation fencing, and atomic destination acceptance. The current assignment requires independent review of the complete candidate, with an early-negative allowance for supported blockers.
Deleted: No source changes, transferred approval, broad suite rerun, extra agent, replacement authority design, generic recovery authentication or publication/topology action.
Bottleneck: The acceptance fence omits the current accepted certificate, although capture reads that certificate to determine the contributor graph.
Checked myself: Read the full inherited packet, current parent contract/refinement, the production capture/acceptance/fence owners and actual WS/check-wrapper callers; executed the real SQLite fence and certificate acceptance with a successful discriminating control.

Exact candidate and reviewer

  • Base: 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc.
  • Head: c93e256c745c015b6d58e9b097498fbe1f84f3ed.
  • Tree: 8f5d610773c19cbafff32b80edd99c9cb880c314.
  • Local Git and live PR base/head match. Exclusive detached workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-sol is clean.
  • Independent reviewer: Codex harness, provider instance codex, model gpt-6.1-sol, reasoning effort medium. t3_thread_configuration read back that persisted selection for this R2 task; retained as reviewer-configuration.json in the proof directory below. No implementation authorship or consultation with the other R2 reviewer.

F1 [P1]: Fence the previously accepted schedule authority before replacing it

Location: mutationReceipts.ts:209, consumed by ScheduledTaskService.ts:1273 and checked at line1327.

Trigger: an existing unbound peer-owned schedule has no fork check state. A local authenticated settings save begins live capture against certificate C0. Before it commits, another permitted caller updates the same schedule, adding a contributor with a narrower capability ceiling and committing certificate C1. Project, bound thread, model, modes, bare state, linkOrigin and incarnation remain unchanged. The first capture then finishes and commits its older graph as C2.

Reachable path:

  1. PeerAuthority.captureAutomation reads automation.current("schedule", resourceId) once and adds that certificate's original recordIds and local legacy contributors to the new capture (PeerAuthority.ts:2011-2016). This is how successive edits retain the previous contributor conjunction.
  2. Live validation/capture yields outside SQL. The resource fence omits schedule_json and fork_automation_bindings; for this unbound unchecked schedule, births/runs/targets/checks are empty. Changing C0 to C1 changes none of the fence's selected values.
  3. The ordinary WS upsert calls scheduledTasks.upsert directly (ws.ts:2127-2132). Its outcome-check wrapper also calls inner.upsert without runs.withTaskLock (ScheduledTaskChecks.ts:640-690). The lock around MCP checked updates therefore does not serialize them against this local save.
  4. The stale save's local fence succeeds. DestinationAutomationAuthority.accept reads whichever certificate is current at commit, disables it, and unconditionally updates the binding (DestinationAutomationAuthority.ts:528-547). It compares no expected predecessor certificate. Its one-use value, grant fence and exact-new-definition check do not detect the new contributor in C1.

Actual versus required: C1's newly accepted contributor can disappear from C2 rather than remaining conjunctive or causing the stale save to be rejected and recaptured. For example, a newly accepted contributor that removes preview can be lost while all selected schedule modes remain identical. This also invalidates C1 and its dependent work as though the stale capture had actually evaluated C1. The selected boundary explicitly requires refusal when the accepted contributor set or definition changes during capture; SQL transaction serialization alone does not protect a graph captured before that transaction.

Executed evidence: one finite Node24 probe exercised the actual exported captureResourceFence, actual DestinationAutomationAuthority.accept/claim, and actual migrated SQLite in-memory layer. It accepted an original certificate, captured the fence and a one-use admission, accepted a newer certificate/stamp, then applied the stale admission under that same fence. The fence returned Success, the stale certificate claimed successfully, and the newer certificate became unclaimable. A positive control changed the tracked runtime mode and the same production fence correctly failed. Command exited0:

/home/luke/.npm/_npx/200eedeed3b657fd/node_modules/node/bin/node /home/luke/.local/state/chromeria-379-proof/555-r2-sol-c93/acceptance-fence-probe.mjs

The probe uses synthetic internal certificates and directly sequences the SQL acceptance seam. It does not execute the complete authenticated two-caller race or demonstrate a real preview effect; contributor loss and public-path reachability are source-confirmed from the owners above. No mocked fence or acceptance service is used. Script, exact output and exit file are retained beside this report.

Required correction: bind acceptance to the actual predecessor certificate/authority generation captured with the schedule, and reject or freshly recapture when it changes before commit. Include a deterministic regression through the local save plus negotiated peer update, with a narrower newly accepted contributor and an unchanged-binding control. No new authority system is needed.

Prior findings and coverage

R1 Sol F1/F2 and duplicate Opus F3 have concrete repairs present: scoped recovery wake/continued retry and durable batch rotation. Opus F1 has the empty-graph return and optional reopen admission; Opus F2 has exact dependency tuple validation and destination-record injection refusal. The CI import-cycle repair replaces EventSink's PeerAuthority value import with the small PeerLinkEvents boundary. These are source observations, not blanket clearance of every repaired scenario. The changed unsupported-peer routing expectations and their complete negotiated native replacement cases have not been fully adjudicated in this early-negative review.

Read in full: the 137848-byte inherited/current packet, including original briefs, selected seam, extension, all embedded old/current handoffs, both R1 reports, CI adjudications and repair responses; live #379 body including Design review and refinement6268898682; Great Library README and applicable review/verification/orchestration procedures. Production coverage includes the complete DestinationAutomationAuthority and PeerAuthorityRecord modules; capture/merge/coverage/validation and capture-control paths in PeerAuthority; current recovery driver; complete schedule/check/engine/fence and Spectrum launch/round/reopen diffs; actual local/checked schedule callers. The grant-change native regression was read in full. Additional surrounding files and repair diffs were inspected where needed for this finding.

Whole-review coverage remains incomplete: I have not read the entire 38-path diff, all added workflow/unit test bodies, every native/credential/tool consumer, every linked historical material-decision record or every required acceptance path. I stop under the explicit early-negative allowance with a supported blocker. This is a whole-candidate REQUEST_CHANGES, not a clean whole-component verdict or approval of the uninspected remainder. No historical approval transfers.

Executed, reused and unverified proof

  • Executed here: the single finite SQL acceptance/fence probe above, exit0. No test suite, product server or client was launched; no setup failure was counted as a product failure.
  • Reused: parent-verified782 affected passes and2 pre-existing opt-in skips. I independently re-hashed sealed manifest c7a83405093f756d45927c2a00f6223e017a1a1eff2b981acda4b12521af1dcd, all38 component and36 test worktree hashes/Git blobs, and all227 artifact sizes/digests. Raw final155/407/70+2skip/21/81/48 summaries match the reported782. Actual package compiler command/results and server diagnostic output were inspected. No broad checks were rerun, and this evidence does not cover F1.
  • Unverified: the full public concurrency regression, an actual forbidden capability effect, full CI, real providers, cross-machine clients, OS crashes, rolled-back product binaries and parent379 final outcome. These remain parent-owned.

Reviewer proof: /home/luke/.local/state/chromeria-379-proof/555-r2-sol-c93/. All owned commands ended and the detached workspace remains clean at the exact head/tree. No source/index/topology/install/client/dev-server/subdelegation/status/readiness/blocker write occurred. This full PR findings comment is the sole external content write; PR555 was registered with the thread using the native link tool.

@lukemaj

lukemaj commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Opus 5.5 MEDIUM R2 whole-component review of PR #555 at c93e256c745c015b6d58e9b097498fbe1f84f3ed: REQUEST_CHANGES.
Why: The R1 repairs hold. A new defect remains: threads created by peer-accepted automations can never take another turn once their automation retires. A Spectrum member after normal settlement is one case, and a probe confirmed it even with the source online and its grant valid.
So what: The parent routes F1 to the #384 author. The resulting new head needs fresh Sol and Opus reviews. This review posts no status, clears no blocker and transfers no approval.

Identity and configuration

  • Base 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc (ancestor verified). Head c93e256c745c015b6d58e9b097498fbe1f84f3ed, tree 8f5d610773c19cbafff32b80edd99c9cb880c314.
  • 38 changed paths. Live PR head read back as c93e256, base branch feat/379-cross-machine-parity. The PR body still names no current head; treat that as stale metadata for the parent to refresh.
  • Reviewer: Claude Code, claudeAgent / claude-opus-5-5 / effort medium, full-access/default. Read back from this thread's persisted configuration with t3_thread_configuration.
  • Workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-grok: detached at the exact head, clean at start and end. The folder name is historical; this review has nothing to do with fix(peer): preserve current-main request answering policy #539 or Grok.

Elon record

Requirements and who asked:

Deleted: Approval transfer, rerunning the author's 782-test proof, broad architecture or UX additions, and re-raising R1 notes the parent dismissed.

Bottleneck: Automation birth ownership can only be evaluated through claimCertificate, which requires the automation to be currently enabled or active. Every thread born under a certificate dies when its automation retires.

Checked myself:

  • Read the full 38-path production and documentation diff, plus the PeerToolRouting and barrier test diffs.
  • Read the full inherited and current packet, the spec: native cross-machine control across linked environments #379 body (v5 and Design review) and comment 6268898682.
  • Traced the actual consumers: claim/coverage/validate/checkResource/checkEffect, the EventSink commit guard, recordPeerEffectAuthority and EffectWorker owner provision.
  • Traced schedule upsert/setEnabled/delete/dispatch/manual paths, checks prepare/commit/claimRun, Spectrum launch/round/reopen and checkSpectrumMutation.
  • Traced PeerLinks retire/recovery resolve, the PeerMcpClient driver/fairness, the McpHttpServer disable route and AuthSessions ordering.
  • Ran one disposable probe through the registered production kernel (F1).

Prior finding disposition (R1, both reviewers)

  • Opus R1 F1 / local stamping: RESOLVED.
    • captureAutomation returns undefined for an empty graph (PeerAuthority.ts captureAutomation tail).
    • Schedule, LaunchService and commandPlan narrow on that result.
    • Native test 2190 covers local disable/edit/delete follow-ups; 3525 covers completed local Colors and White; 2629 covers local checked runs.
  • Opus R1 F2 / unbound upstream dependencies: RESOLVED.
    • captureRecord refuses upstream graph.records for here.
    • Each upstream dependency must match the capture input (certificate, audience, resource, definition generation and digest) before registerRecovery.
    • Native test 2297 (forgery) and 2439 (valid multi-hop) cover it.
  • Sol R1 F1 / driver lost after a failure: RESOLVED.
    • PeerMcpClient.start owns a sliding wake queue fed by startup, link and automation events.
    • recoverAutomationDisables loops every 2 s while a batch is non-empty and parks when it is empty. Each attempt has a 10 s timeout.
    • Native test 2735 covers 503, 202, lost ACK and idle parking.
  • Sol R1 F2 / duplicate Opus F3 starvation: RESOLVED.
    • pending rotates selection_order atomically. New rows enter at the current maximum.
    • Test 2524 plus the domain fairness tests cover it.
  • CI import cycle: RESOLVED. EventSink now imports only PeerLinkEvents and checkAutomationCommit, and publishes after commit.
  • PeerToolRouting: The fixture is an old unnegotiated peer, and its refusal is now explicit. Native test 2370 covers the actual negotiated positive (certificate on B, none on A) and narrower-link refusal with no new outbox effects. This holds; no hidden weakening was found.

Findings

F1 (blocking, CONFIRMED by execution for Spectrum; schedule variant inferred): peer-accepted automation threads are permanently locked once their automation retires

Path.

  • Launch commits under PeerDispatchAuthority = admission.record.id (LaunchService.ts:525). Scheduled dispatch runs under PeerAcceptedAutomation = execution.id (ScheduledTaskService.ts dispatchTask).
  • recordPeerEffectAuthority therefore writes the automation-execution record as the permanent birth owner of the transcript, Color and White shells, and of fresh scheduled threads (peerEffectAuthority.ts:155).
  • Every later execution commit on those threads reaches EventSink births, then checkAutomationCommit, then claimAutomationCertificate (DestinationAutomationAuthority.ts:304-380).
  • That claim requires the Spectrum to be active at the certificate's workflowGeneration. For a schedule it requires the task to be enabled with the same incarnation and the current certificate.
  • checkThread, checkEffect and coverageFor use the same claim. No path evaluates the birth owner's frozen contributors once the certificate is retired. That includes live interactive validation.

Trigger.

  • A's agent starts a council on B and it settles normally (not disabled, not revoked).
  • Then anyone, including the local B user and A's agent with A online, sends a follow-up in a Color or White thread.

Actual. message.dispatch is rejected before commit. checkThread fails with "The current Spectrum no longer matches its accepted launch generation."

Required. Normal completion, or a later edit or disable of the definition, should stop new automation execution, not brick the threads it created.

  • At base 60c0cc5, these shells were born under A's interactive record (McpRouting provided PeerDispatchAuthority; base recordPeerEffectAuthority inserted it). Follow-ups therefore validated live and succeeded while A's grant was valid.
  • The author treats member follow-ups after completion as an ordinary positive for local Spectra (test 3525). The peer case loses it.
  • Only a fresh transcript reopen temporarily re-covers members, and only during the reopened active generation.
  • Schedules have no recovery at all. Prior fresh-run threads stay unusable after any title or prompt edit (the new digest means a new certificate), a disable or a delete. This is a one-way door (AGENTS.md "Reverse states").

Evidence (executed).

  • The probe is a copy of native test 3369 (council) with a.stopConnections removed, so A stays online. After settled, it dispatches a local user follow-up into each Color and White thread.
  • Run outside Git on a git archive of exact c93e256 with the worktree's existing node_modules linked in.
  • Command: PATH=<node v24.13.1>:$PATH ./node_modules/.bin/vp test run apps/server/src/peer/PeerAuthority.workflow.test.ts -t probe384r2, exit 0, 1 passed / 155 skipped.
  • Results file:
    • birth owner automation-execution:automation:0329ce0b…:…:register for all three members;
    • every followup …: Failure Orchestration command message.dispatch (…) … rejected before commit;
    • every checkThread …: Failure The current Spectrum no longer matches its accepted launch generation.;
    • control: checkThread caller(A-born interactive): Success, which shows A is online and its grant valid.

Inferred by the same mechanism (not executed). A fresh thread created by a peer-accepted schedule rejects follow-ups after setEnabled(false), delete or any accepted edit. Its birth owner is the old certificate's execution record, claim denies it, and checkAutomationCommit has no covering certificate.

Proof gap. Test 3369 asserts settlement only. Test 2190 asserts follow-ups only for local schedules. No case follows up in a peer-born automation thread after retirement.

Fix direction (author's choice). Keep birth ownership permanent, but make it evaluable after retirement, so the retired certificate's own recordIds and legacy contributors are validated live (purpose: "interactive"), with B's current policy. Use the local-autonomy claim only for execution under a current, non-tombstoned certificate.

  • A certificate disabled by source revocation or tombstone must still deny.
  • Add peer-case regressions for Spectrum members after settlement and for schedule threads after edit, disable and delete. Include the A-offline denial as a control.

Non-blocking observations

  • PeerMcpClient.ts recoverAutomationDisables: a permanently unreachable or decommissioned destination with a pending obligation is retried every 2 s indefinitely, up to 32 requests each with a 10 s timeout. Effect.ignoreCause({ log: true }) logs every failure. This is bounded per process and parks once acknowledged, so it is correct, but a capped backoff would avoid perpetual log and network churn. This is not a correctness blocker.
  • Local B edits or re-enables of a peer-accepted schedule recapture its original contributors live. With A offline, a local title edit is refused and only delete works. This matches the user doc ("Edits … require fresh authorization"), so it is noted only for the parent's acceptance judgment.
  • EffectWorker.ts:815 now provides the execution owner as PeerDispatchAuthority to every execution effect, not only Stop. Events committed inside those effects now record peer owners. I did not find a failing consequence within the traced paths, but this is a widened behavior for interactive peer threads too.

Cleared concerns (checked)

  • Upstream capture binding and here-node refusal; registerRecovery happens only after validation.
  • Disable route: it matches only the SHA-256 of the exact registered credential. Ordinary MCP, RPC, prepare and enroll are unchanged. A failure returns 403, and an unconfirmed relay returns 202, so the sender keeps the obligation pending.
  • Revocation ordering: AuthSessions single, bulk and replacement each run invalidateAutomationSessions inside the same transaction before revoked_at. PeerLinks link and unlink run retireAutomationLink in a transaction before secret removal. Secrets are retained while unacknowledged obligations remain.
  • resolveAutomationRecovery requires an exact generation, a retained row, a pending obligation and a URL whose describe matches the environment.
  • Tombstone-before-accept and claim are enforced. Spectrum reopen requires the prior native state to be non-active with generation +1, retains report/abandonment/drain guards, and checks the certificate in checkSpectrumMutation.
  • Interactive onward validation stays live (prepare uses "interactive").
  • Checked-task creation check: prepareSave runs it only when state === null, so a committed replay does not rerun it. runCheck revalidates live for :creation with a scoped authority.
  • Effect SQL nested withTransaction uses savepoints, so acceptance is atomic with the receipt and ForkCommitPlan.

Coverage

  • Executed by this review: one probe, recorded above, exit 0. One earlier run passed silently because vitest suppressed console output; it is preserved as probe384r2-silent-pass.log and is not a product result. Artifacts and SHA-256 are in /home/luke/.local/state/chromeria-379-proof/555-r2-opus55-c93/.
  • Reused, not rerun: manifest 384-r1-proof.json re-hashed to c7a83405…1dcd, matching. Raw summaries read: 155 + 407 + 70 (2 opt-in skips) + 81 + 48 + 21 = 782. This is affected proof, not CI.
  • Read in full: all production and documentation diffs and the actual consumers listed above.
  • Not read exhaustively: the 3,638-line workflow test diff. I read the case inventory and the bodies of 2370, 3369 and 3525. I sampled DestinationAutomationAuthority.test.ts.
  • Not done: the schedule variant of F1 was not executed. No CI, real clients, cross-machine run, OS crash or rolled-back binary was exercised.
  • This is an early-negative REQUEST_CHANGES with a supported blocker. It is not a clean whole-component verdict on the unread test bodies.
  • No source, index or workspace writes. No status, readiness or blocker change. All commands have ended.

Reviewed by Claude Opus 5.5 (medium effort) through Claude Code in T3 Code.

@lukemaj

lukemaj commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Sol MEDIUM R3 verdict for PR #555 at 05f451b15f38a078264a2af207c00df9d7dbc549 is REQUEST_CHANGES.
Why: A completed peer-created Spectrum member can take a live-authorized follow-up, but cannot create a permitted onward automation because dependency registration evaluates its immutable birth certificate as current automation execution.
So what: The parent owns adjudication and repair; whole-component coverage remains incomplete under the supported-blocker stopping allowance, and this report posts no aggregate status or readiness decision.

Requirements and who asked: Approved #379v5/#384, selected boundary 6271372731 and the accepted R2 purpose distinction require permanent original contributors, live interactive onward authorization, ordinary positives after lifecycle retirement, and strict current-definition claims only for actual automation execution. The current assignment requires independent whole-candidate review, with an explicit supported-blocker early-negative allowance.
Deleted: No source repair, transferred approval, broad suite rerun, new authority system, generic retired-credential authentication, extra reviewer or publication/topology/status action.
Bottleneck: Dependency registration collapses typed birth and execution contributors to certificate IDs, then requires an execution claim for every ID.
Checked myself: Full inherited/current packet and current approved parent body/Design review; actual birth/claim/capture/dependency owners, native commit/effect paths and lifecycle test; a registered authenticated three-environment native reproduction with a lawful-positive control; a separate real SQLite/domain discriminator; all current sealed source/test/artifact digests and raw test summaries.

Exact candidate and persisted reviewer identity

  • Base: 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc.
  • Head: 05f451b15f38a078264a2af207c00df9d7dbc549.
  • Tree: cb586b02ea67f53c9467351fc003e576996298b7.
  • Local Git and live PR base/head match. Exclusive review workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-sol remains detached and clean.
  • t3_thread_configuration read back provider instance codex, model gpt-6.1-sol, reasoningEffort=medium, full-access/default for this R3 task. Retained in reviewer-configuration.json below. This reviewer did not author the implementation or consult the other R3 reviewer.
  • Current public frontier: spec: native cross-machine control across linked environments #379 (comment). PR feat(peer): keep destination automations authorized offline #555 is registered with this thread.

F1 [P2]: Retain birth-versus-execution purpose when registering onward automation dependencies

Primary location: DestinationAutomationAuthority.ts:678-680, called by PeerAuthority.ts:2431-2442.

Trigger: A starts a Spectrum on B under permitted peer authority with onward access. The Spectrum settles normally. With A still online and all original grants valid, the user starts an ordinary follow-up in a Color or White member. That active member calls schedule_task on explicitly permitted C.

Actual: The follow-up and checkThread succeed, but the registered onward tool returns capability_denied: “The current Spectrum no longer matches its accepted launch generation.” The completed Spectrum is incorrectly required to become active again to authorize new live work from its member.

Reachable cause:

  1. The new automation-birth owner correctly survives ordinary retirement and validates original contributors live. captureRecord also uses automation.birth for that variant, so live capture can traverse the retired birth legitimately.
  2. When B answers C's capture-automation frame, PeerAuthority.ts:2431 collects every local graph record with certificateId into an untyped ID list. This includes the member's automation-birth certificate.
  3. registerDependency calls claim(certificateId) for every entry. That is the strict execution claim, requiring the old Spectrum to remain active at its launch generation. The valid immutable birth is rejected here despite the preceding successful live validation.
  4. Dependency tracking also subsequently treats any disabled certificate as a reason to send a downstream disable (pending, at the same domain owner). A correction must preserve the purpose throughout dependency lifetime, not merely remove the registration check and leave retirement indistinguishable from security revocation.

Required versus observed: The selected boundary explicitly permits a newly created automation only through fresh live authorization; it does not require the caller's completed birth automation to execute again. Accepted Opus R2 adjudication likewise separates ordinary lifecycle retirement from revocation while retaining every original contributor. This is a remaining consumer of that purpose distinction, not a request for a new authority system or blanket offline onward access.

Executed native evidence: Appended one isolated test to an archive of the exact head outside Git, copied from the complete current council lifecycle test. It uses the registered production kernel, real SQLite/native receipts/effects/credential issuance, authenticated HTTP MCP/control transport, deterministic external provider adapters and explicit persisted preparation milestones. It adds onward consent before accepting the Spectrum. The Spectrum actually reaches settled; an active White follow-up passes native commit/effect handling and checkThread reports Success. Its onward schedule_task to C returns the exact refusal above. A control from B's original interactive peer-created child, using the same B-to-C link/destination/project/definition, returns a confirmed applied schedule receipt. No product/dev server, real browser, device, provider or live data was used.

Exact command, run serially from .../555-r3-sol-05f/probe-source:

PATH=/home/luke/.npm/_npx/200eedeed3b657fd/node_modules/node/bin:$PATH ./node_modules/.bin/vp test run --maxWorkers=2 apps/server/src/peer/PeerAuthority.workflow.test.ts -t 'probe384r3'

Final exit0: 1 passed / 170 unselected in15.26s. The test intentionally asserts the defective refusal plus the successful control. onward-native-results.json retains settledStatus=settled, the confirmed control, memberLive=Success, and the exact refusal. The first successful run suppressed console output and is retained separately. An initial parse error in the appended throwaway test is retained as onward-native-probe-setup.log/.exit; it is a probe setup failure, not product red proof.

Independent causal discriminator: dependency-purpose-probe.mjs uses actual migrated in-memory SQLite and actual DestinationAutomationAuthority. registerDependency succeeds with the original active certificate; after disableLocal, birth(original) still succeeds, while the same registration with a fresh downstream dependency fails its execution claim. Exit0; controls and exact failure are in dependency-purpose-probe.log. Its certificates are synthetic internal domain inputs, not fabricated transport credentials.

Correction belongs to the existing typed capture/dependency owner: retain and evaluate the original contributor's purpose, including monotone revocation/expiry/tombstones, without requiring a retired birth to execute. Add a native completed-member onward automation positive and controls for source offline/revoked and subsequent ordinary retirement versus security invalidation. The free-Spectrum and retired-schedule variants are source inferences, not executed claims here.

Prior findings and honest coverage

Sol R2's exact predecessor fence is present in captureResourceFence, including binding certificate and disabled/revoked state. Opus R2's ordinary later-work repair is present in typed birth references, birth claims, native preflight and commit checks; this review's native follow-up independently exercised its positive behavior. F1 above identifies the unconverted downstream dependency consumer. These observations do not clear all earlier R1/R2 scenarios or transfer approval.

Read the complete186766-byte inherited/current packet in bounded chunks, including original brief, full selected design/grants, handoffs, R1/R2 reports, adjudications and author responses. Read live #379's complete approved body including Design review; current frontier6279273151; refinement6268898682; R2 decision/feedback records6278214300,6278322302,6278719707,6278782431; Great Library README; applicable routing/review/verification/orchestration/impact-analysis and experiment procedures; supplied project instructions/direction and root/internal glossaries.

Source inspected: complete current DestinationAutomationAuthority, PeerAuthorityRecord and peerEffectAuthority; complete EventSink/EffectWorker/mutationReceipts and Spectrum launch/round/reopen/store diffs; current PeerAuthority coverage/validate/resource/capture/control/dependency/native-preflight/checkEffect consumers; native credential/tool helper and complete copied lifecycle test body; related schedule lifecycle and valid multi-hop test bodies. The actual reproduction exercised registered native credential, MCP and control handling.

WHOLE coverage remains incomplete: I have not read/adjudicated the entire38-path diff, every current test body, all schedule/check/recovery/transport consumers, or every linked historical material-decision record. The full newly added workflow test bodies and all38 paths are not claimed covered. I stop with a supported blocker under the explicit allowance. This is a whole-candidate REQUEST_CHANGES, not a clean whole-component verdict or approval of any uninspected remainder.

Executed, reused and unverified proof

  • Executed here: two serial native probe runs of the same single case, plus the separate finite SQL purpose discriminator; all final probe exit codes0. The one initial parse/setup failure remains separate. No broad suite was rerun.
  • Reused: manifest 384-r2-proof.json, independently re-hashed to fd458e773316cbff9daf7d6298848f6374b3c20ffb917c6df155b6847f29e027; all38 component and36 test worktree SHA256/Git blobs and all272 artifact sizes/digests verified. Raw six summaries are170+409+81+48+70+21 = 799 passed / 2 existing opt-in skips. Actual server/contracts tsc-rs --noEmit cache-disabled package headers/results inspected. These are affected author checks, not complete CI, and do not cover F1.
  • Unverified: full CI, real clients/providers/hardware, OS crash, rolled-back product binary, free/schedule variants of F1, and final parent379 acceptance. No forbidden effect or authority broadening was demonstrated; the observed defect is refusal of permitted work.

Proof directory: /home/luke/.local/state/chromeria-379-proof/555-r3-sol-05f/. The appended probe and exact-source archive are retained there; original repository production/test bytes are unchanged. All owned commands ended; workspace remains clean at the exact head/tree. No source/index/checkout/topology/install/subdelegation/status/readiness/blocker/merge/deploy write occurred. This full findings comment is the sole external content write.

@lukemaj

lukemaj commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Claude Opus 5.5 MEDIUM R3 review of PR #555 at 05f451b15f38a078264a2af207c00df9d7dbc549: REQUEST_CHANGES.
Why: Both R2 repairs hold for the cases they target. The new birth/execution split adds two regressions on peer-born automation threads, and both are confirmed by execution with A online and a valid grant: (F1) the source peer's non-turn commands on those threads are rejected before commit, and (F2) any Connections grant edit, including a broadening, permanently revokes the threads, so even local follow-ups fail.
So what: The parent routes F1/F2 to the #384 author. The resulting head needs fresh Sol and Opus reviews. This review posts no status, clears no blocker and transfers no approval. WHOLE coverage is incomplete; see Coverage.

Identity and configuration

  • Base 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc (ancestor verified). Head 05f451b15f38a078264a2af207c00df9d7dbc549, tree cb586b02ea67f53c9467351fc003e576996298b7. There are 38 changed paths.
  • Live PR readback: head 05f451b, base feat/379-cross-machine-parity at 60c0cc5.
  • Reviewer: Claude Code, claudeAgent / claude-opus-5-5 / effort medium, full-access/default. Read back from this thread's persisted configuration with t3_thread_configuration and retained as reviewer-configuration.json.
  • Workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-grok was detached and clean at the exact head at start and end. The folder name is historical and has no link to fix(peer): preserve current-main request answering policy #539 or Grok.

Elon record

Requirements and who asked: Approved #379 v5 and #384. The selected seam 6271372731 and the commandPlan extension 6272745083. The accepted R2 adjudications 6278176221 and 6278262850, which require:

  • immutable birth constraints evaluated live, separately from current execution;
  • source revocation, narrowing, expiry and tombstones still deny;
  • lifecycle retirement never acts as blanket revocation;
  • ordinary positives remain.

Deleted: Approval transfer, rerunning the author's 799-test proof, architecture additions, and re-raising notes the parent already dismissed.

Bottleneck: A birth reference is only admitted when EventSink's live preflight runs, and that preflight runs only for execution-effect commits. Separately, setGrant marks every dependent certificate revoked, which births treat as permanent denial.

Checked myself:

  • Read the full packet, the spec: native cross-machine control across linked environments #379 body (v5 and Design review), 6268898682 and the four R2 design and feedback comments.
  • Read the complete c93..05f production diff and the R2 test diff.
  • Read the complete base..head diffs of PeerAuthority, DestinationAutomationAuthority, peerEffectAuthority, EventSink, EffectWorker, PeerAuthorityRecord, all MCP union readers and docs.
  • Ran one probe through the registered production kernel (below).

Findings

F1 (blocking, CONFIRMED by execution): the source peer's non-turn commands on its own automation-born threads are rejected before commit

Location:

  • EventSink.ts:743 runs preflight only when execution is true. The guard at line 877 runs whenever dispatch, automation or execution is set.
  • DestinationAutomationAuthority.ts:502-515 fails any automation-birth that is not in liveBirths and has no automation-execution of the same certificate among the owners.

Path:

  • McpRouting.ts:137 provides PeerDispatchAuthority for every routed peer call.
  • A command with no execution effect therefore reaches checkAutomationCommit(owners, undefined). Examples: thread.metadata.update (rename, PR link), and interrupt/stop, since provider-turn.interrupt is not in the execution list.
  • nativeAuthorityOwners always adds the thread's birth: record.
  • The birth claim succeeds, but liveBirths is empty and there is no execution owner. The failure is pushed and nothing covers it, so the commit is rejected.

Regression:

  • At base, scheduled and Spectrum shells had no peer birth owner, so this guard did not exist.
  • At c93, the birth was the execution record, so these commands passed while the automation was active.
  • At 05f they are rejected even while the schedule is enabled, A is online and its grant is valid.

Executed evidence: probe test probe384r3, on a copy of exact 05f. Steps:

  1. A creates a fresh-thread schedule on B.
  2. runNow runs it and the run completes.
  3. A local follow-up succeeds (starts=2) and checkThread succeeds.
  4. A calls t3_thread_update rename on that thread.

Results:

  • The rename fails: Orchestration command thread.metadata.update (…) was rejected before commit. The title is unchanged.
  • Control: the same A tool on a B thread A launched interactively (t3_thread_launch) succeeds.

Inferred (not executed):

  • The same applies to every peer-dispatched commit without execution effects on any automation-born shell. That covers schedule fresh threads and Spectrum transcript, Color and White threads.
  • t3_thread_interrupt/stop=true from A after the automation has retired, or on an idle born thread, would likewise be rejected. That would block the creator from stopping or organizing its own work.

Fix direction (author's choice): Obtain live birth admission whenever the owner set contains a birth that no current execution covers, not only for execution effects. Add peer non-turn (rename, interrupt) positives, plus an offline denial control.

F2 (blocking, CONFIRMED by execution): any grant edit permanently revokes automation-born threads, including a broadening

Location: PeerAuthority.ts:3239. setGrant calls invalidateAutomationSessions on any encoded change, which invalidates with reason "revoked" (DestinationAutomationAuthority.ts:214). For births, revoked is a monotone denial (claimCertificate, line 342).

Trigger: On B, the user edits the A link's grant in Connections. Examples: widen resourceScope, enable preview or device, or narrow and then restore it.

Actual:

  • The certificate becomes disabled=1, revoked=1.
  • checkThread fails with "Destination automation authority is disabled or superseded."
  • A local B user's follow-up message.dispatch is rejected before commit, permanently.
  • Reverting the grant does not restore the thread.

Required:

  • Per the R2 adjudication, narrowing must deny, through live evaluation against B's current grant.
  • A policy edit is not source revocation and must not brick ordinary later work: "Do not use lifecycle retirement as blanket authority revocation".
  • At base these schedule-born threads had no birth owner, and A-interactive-born threads keep working after a grant edit because they validate live.
  • This is a one-way door (AGENTS.md "Reverse states").
  • Stopping execution on a grant change was previously accepted as fail-closed. Extending it to permanent birth denial was not.

Executed evidence: same probe, after F1.

  • A online. setGrant({...grant, resourceScope: "environment-resources"}), broadening from created-work.
  • fork_automation_certificates shows disabled:1, revoked:1.
  • checkThread fails.
  • follow after-broadening: Failure … message.dispatch … was rejected before commit, compared with the earlier control-before: Success.

Proof gap: The new lifecycle case's narrowed variant (preview: false) passes because of this revoked flag, not because of live narrowing. There is no broadening control, so the test cannot tell the two apart.

Fix direction: On grant change, retire execution (retired) and leave births to live validation against the current grant. Keep revoked for session revocation or expiry, link retirement and disable tombstones. Add broadening-positive and narrowing-negative regressions.

Prior finding disposition

  • Sol R2 F1 (stale predecessor): RESOLVED in source.
    • captureResourceFence now includes the schedule binding's certificate_id, disabled and revoked.
    • It is captured before captureAutomation (ScheduledTaskService.ts:1273 before line 1305) and rechecked inside the acceptance transaction.
    • I read the author's WS/peer race regression with its concurrent=false control; I did not rerun it.
  • Opus R2 F1 (retired automation bricks born threads): PARTIALLY RESOLVED.
    • Local follow-ups after schedule disable, edit or delete and after Spectrum settlement now validate live. Retired execution still fails.
    • F1 and F2 above are the same one-way-door class, reached through different triggers.
  • R1 findings: PeerMcpClient, the PeerLinks recovery, AuthSessions and the pending/fairness SQL are unchanged since c93. The R2 dispositions are not re-verified here.

Cleared concerns (checked)

  • The schema migration adds revoked and conservatively copies historical disabled into it.
  • Disable tombstones, session revocation and expiry still deny births.
  • The EventSink preflight runs outside SQL, and the grant digest and owner set are rechecked inside the transaction.
  • A local follow-up's internal effect commits complete; the author's case and the probe reached completed.
  • The map uses a secondary PR #555 ref for a non-closing PR, which follows current AGENTS.md.

Coverage (WHOLE incomplete)

  • Read in full:
  • Not read in this round:
    • the remaining ScheduledTaskService diff;
    • ScheduledTaskChecks, engine, state and store;
    • Spectrum LaunchService, RoundService, commandPlan, state and store;
    • PeerLinks, PeerMcpClient, PeerLinkEvents, AuthSessions and server.ts;
    • DestinationAutomationAuthority.test, PeerToolRouting and barrier tests;
    • the base..c93 workflow test body.
  • This is an early-negative REQUEST_CHANGES with supported blockers, not a clean whole-component verdict.
  • Executed: one finite probe, exit 0, 1 passed / 170 skipped:
    • command PATH=<node v24.13.1>:$PATH PROBE_OUT=… ./node_modules/.bin/vp test run apps/server/src/peer/PeerAuthority.workflow.test.ts -t probe384r3;
    • run on a git archive of exact 05f with the worktree's existing node_modules linked;
    • deterministic provider adapter, isolated fixture homes, no product server, browser or real provider;
    • the archive was removed afterwards; the executed test diff is retained as probe-added.diff.
  • Reused, not rerun: I re-hashed manifest 384-r2-proof.json to fd458e77…f029e027, which matches. The author reports 799 passed / 2 opt-in skipped. That is affected proof, not CI.
  • Unverified: F1's interrupt variant and Spectrum-member variant, full CI, real clients, cross-machine runs, OS crashes and rolled-back binaries.
  • Proof: /home/luke/.local/state/chromeria-379-proof/555-r3-opus55-05f/, with SHA-256 in artifact-sha256.txt.
  • No source, index or workspace writes, and no status, readiness or blocker change. All commands have ended.

Reviewed by Claude Opus 5.5 (medium effort) through Claude Code in T3 Code.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Sol MEDIUM R4 verdict for PR #555 at 17bace35e5339817ab5e8fda1fd922a987d30117 is REQUEST_CHANGES.
Why: A pending disable cannot recover after the destination moves to a new endpoint, even after a successful relink to that endpoint and with the exact original recovery credential still usable there.
So what: The parent owns adjudication and repair; whole-component coverage remains incomplete under the supported-blocker allowance, and this report posts no aggregate status or readiness decision.

Requirements and who asked: Approved #379v5/#384 and selected boundary 6271372731 require durable exact DISABLE/ACK recovery across unlink/relink, retaining the original protected identity without restoring ordinary revoked authentication. The R4 assignment requires a fresh whole-candidate review and explicitly permits an early negative for a supported blocker.
Deleted: No source repair, replacement authority system, successor credential substitution, generic revoked authentication, broad test rerun, extra reviewer, topology action or approval transfer.
Bottleneck: Recovery binds endpoint selection to the retired credential generation, although endpoint reachability and authentication identity have different lifetimes.
Checked myself: Complete inherited/current packet; current approved parent contract and selected recovery requirements; actual capture/dependency, native authority, link retirement/resolution, delivery driver and HTTP receiver owners; a real registered authenticated schedule/relink/recovery reproduction with a new-endpoint exact-credential positive and ordinary-auth/wrong-tuple negative controls; all current source/test/artifact bindings and raw affected-test summaries.

Candidate and persisted reviewer configuration

  • Base: 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc.
  • Head: 17bace35e5339817ab5e8fda1fd922a987d30117.
  • Tree: 24400a5f9acab671b9e1832a9fbf1b1787dfe32b.
  • Local Git and live PR base/head agree. Exclusive workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-sol remains detached and clean.
  • t3_thread_configuration read back provider instance codex, model gpt-6.1-sol, reasoningEffort=medium, full-access/default for this R4 delegated task. Retained as reviewer-configuration.json in the proof directory below. I did not author the implementation or consult the other R4 reviewer.
  • Current parent frontier: 6280254653. PR feat(peer): keep destination automations authorized offline #555 is registered with this thread and is not watched.

F1 [P2]: Resolve the original disable through the destination's newly linked endpoint

Location: PeerLinks.ts:533-540, with endpoint selection at line 564. Consumer: PeerMcpClient.ts, deliverAutomationDisableBatch.

Trigger: A has accepted automation on B and an original registered disable dependency. A unlinks; the original recovery identity and pending obligation are retained. B subsequently answers at a different endpoint, such as a changed address or port. A successfully relinks to B at that new endpoint, producing a distinct ordinary link generation. The old endpoint is unavailable.

Actual: Ordinary resolution reaches the new endpoint, but resolveAutomationRecovery(B, originalGeneration) refuses it and probes only the retired endpoint. The production disable drain leaves the obligation pending and sends no request to the reachable new endpoint. Reconstructing the owner does not help.

Reachable cause: ordinary is eligible as current only when its secret-derived launchIdentity equals the original generation. A successful relink changes that identity, so the resolver selects the retained row and then uses only that row's link.urls. The current link's usable URLs are discarded along with its unsuitable credential. The automatic retry driver calls this same resolver on every attempt, so retries cannot repair this route selection while only the new endpoint is reachable. Automatic indefinite retry under this condition is a source inference; the executed probe uses the actual finite drain.

Required versus observed: The selected recovery contract says to retain the original protected identity and exact dependency until ACK and that relinking enables the same obligation. It does not require the destination to preserve its old network endpoint. The original identity can authenticate its exact registered disable on the new endpoint without authorizing ordinary tools or using the successor credential. This is a remaining recovery consumer failure, not a proposal to broaden credentials or to treat a claimed environment ID alone as continuity proof.

Executed discriminator: One isolated test on an archive of exact current HEAD:

  1. Registered A and B fixtures perform actual OAuth pairing and a public schedule_task on B, obtaining the real persisted certificate and source dependency.
  2. Stop A's owned connection lifetime, unlink, revoke the original B auth session, and retain the original recovery binding/token. No existing user grant is involved.
  3. Rehost the same B scheduler/auth/SQLite state at another ephemeral endpoint with the existing restartSchedulerTransport fixture; relink A to it. Ordinary resolution succeeds at the new endpoint with a distinct generation.
  4. Reconstruct the actual PeerLinks and PeerMcpClient owners with a deterministic HTTP boundary that returns503 for the old origin and passes all new-origin requests through to real fixture HTTP services.
  5. Recovery resolution returns unreachable; the actual disable drain leaves one pending obligation and no destination ACK. Recorded requests are 2 old-origin probes / 0 new-origin requests.
  6. Using the same retained original token directly against the new endpoint: ordinary /mcp returns 401, a changed dependency tuple returns 403, and the exact registered DISABLE returns 200 with its matching durable ACK. Recording that ACK clears the original source obligation. No token value is printed.

This establishes a usable, narrowly authenticated recovery route that the production resolver fails to select. The destination already knows the auth-session revocation in this reproduction, so I do not claim that prohibited execution continued. The demonstrated failure is durable disable confirmation/recovery despite successful relink and destination reachability.

Correction belongs to the existing link/recovery owner: retain the exact original protected credential/dependency while allowing an appropriately verified current route to that same destination. Preserve wrong-environment, wrong-generation/tuple, ordinary-auth, tombstone and ACK checks. Add a changed-endpoint relink regression alongside the existing same-endpoint recovery controls.

Execution and proof

Proof directory: /home/luke/.local/state/chromeria-379-proof/555-r4-sol-17b/.

Final command, from probe-source/apps/server, using existing cached Node24 and dependencies:

PATH=/home/luke/.npm/_npx/200eedeed3b657fd/node_modules/node/bin:$PATH ./node_modules/.bin/vp test run --maxWorkers=2 src/peer/PeerAuthority.r4RecoveryProbe.workflow.test.ts

Final exit0, 1 passed,14.70s. This test intentionally asserts the defective refusal and its successful exact-route control; exit0 is reproduction evidence, not repaired behavior. relocation-results.json, relocation-probe.log, .exit and the appended test retain the exact observations. An earlier successful version without the two added authentication controls is retained separately; the two runs are the same case and are not counted as distinct coverage.

The first probe attempt failed a setup assertion: the existing reconstruction helper injects its HTTP adapter into PeerMcpClient but builds PeerLinks with the normal HTTP adapter, so the old descriptor still answered. The final probe constructs both actual owners with the same controlled HTTP boundary. relocation-setup.log, .exit and relocation-setup-test.ts retain that setup failure separately; it is not product red proof.

Reused: Independently verified manifest SHA256 47df089f3feb1b5abeecc6374b40db38af03ac273d9bc3f5edbdae5df91fdea4; all46 component and43 test working-file hashes/Git blobs, and all135 retained artifact sizes/digests. Raw final summaries show176+415+81+48+70+21+2 = 813 passed / 2 pre-existing opt-in skips. Actual server/contracts cache-disabled tsc-rs --noEmit package headers and recorded exit0 commands inspected. This is affected author proof, not full CI or evidence against F1. No broad suite was rerun.

Prior findings and honest coverage

The current core source contains the R3 typed dependency admission/persistence, strict execution default/dominance, retirement-versus-security invalidation, matching EventSink preflight/SQL guard condition, and setGrant's retirement reason. The current domain tests were read in full. These observations do not independently clear every R1/R2/R3 native scenario or transfer earlier approval. F1 concerns another actual recovery consumer.

Read the entire244981-byte inherited/current packet in bounded chunks, including the original design/grants, commandPlan extension, R1/R2/R3 findings, adjudications, responses and CI history. Read the live #379 contract including Design review, current #384 body, refinement6268898682, current frontier6280254653 and current R3 owner decisions6279413859/6279460525/6279509412. Loaded the operations review/verification/orchestration/impact-analysis and empirical diagnosis procedures, Great Library README, supplied instructions/direction, root/internal glossaries and Effect service guidance.

Source coverage includes complete current PeerAuthority, DestinationAutomationAuthority, PeerAuthorityRecord and peerEffectAuthority; EventSink/EffectWorker, link/recovery/auth-route/revocation, checks/engine/state/store and Spectrum launch/round/reopen/store diffs; actual capture/dependency, original recovery resolver, driver and receiver callers. Read the shared fixture's node/auth/database/reconstruction and scheduler-rehosting portions and selected existing schedule recovery/lifecycle and Spectrum reopen test bodies used to verify the reproduction's seam.

WHOLE coverage remains incomplete: I have not read/adjudicated the entire46-path diff, every current test body, all fixture movement/import/export/lifetime semantics, the complete AST preservation/narrowed-fixture correction evidence, every actual consumer, or every linked historical material-decision record. Hash verification is not substituted for reading. I stop under the explicit supported-blocker early-negative allowance. This is a whole-candidate REQUEST_CHANGES, not a clean whole-component verdict or approval of any uninspected remainder.

Unverified: Full CI, complete hosted shard budget, real clients/providers/machines, OS crashes, a rolled-back product binary, every earlier repair scenario and final #379 acceptance. The probe uses fresh isolated fixture homes and actual registered services/auth/SQLite/receipts with a deterministic unavailable-origin adapter. B is rehosted within the fixture; this is not an OS restart or real network migration claim. No product/dev/installed server, browser/device/Metro, real provider, live userdata/existing grant, install, subdelegation or other workspace was used or changed.

All owned commands ended. The original workspace remains clean at the exact head/tree; the archive and probe are retained outside Git. No source/index/checkout/topology/status/readiness/blocker/merge/deploy write occurred. This full findings comment is the sole external content write.

Reviewed by Codex, gpt-6.1-sol with medium reasoning effort, through T3 Code.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Claude Opus 5.5 MEDIUM R4 review of PR #555 at 17bace35e5339817ab5e8fda1fd922a987d30117: REQUEST_CHANGES.
Why: Two of the R3 repairs still let policy state destroy ordinary work, both confirmed by execution. (F1) The new birth "narrowed by current policy" check counts B's own browser/device project settings as contributor narrowing, so peer-born threads reject even local B user follow-ups, and with B's default device setting they do so right after their first run. (F2) A pure grant broadening on B still sends a permanent DISABLE to an onward automation on C that depends only on a birth, and C records it as revoked.
So what: The parent routes F1 and F2 to the #384 author. The new head needs fresh Sol and Opus reviews. This review posts no status, clears no blocker and transfers no approval. WHOLE coverage is incomplete; see Coverage.

Identity and configuration

  • Base 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc (ancestor verified). Head 17bace35e5339817ab5e8fda1fd922a987d30117, tree 24400a5f9acab671b9e1832a9fbf1b1787dfe32b, 46 changed paths.
  • Live PR readback: head 17bace3, base feat/379-cross-machine-parity at 60c0cc5.
  • Reviewer: Claude Code, claudeAgent / claude-opus-5-5 / effort medium, full-access/default. Read back from this thread's persisted configuration with t3_thread_configuration and retained as reviewer-configuration.json.
  • Workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-grok was detached and clean at the exact head at start and end. The folder name is historical and has no link to fix(peer): preserve current-main request answering policy #539 or Grok.

Elon record

Requirements and who asked: Approved #379 v5 and #384, selected seam 6271372731, the R2 purpose distinction (6278262850), and the R3 adjudications 6279387352 and 6279433809:

  • a pure grant broadening must not irreversibly revoke ordinary work;
  • current live policy constrains every original contributor;
  • retirement must stay distinguishable from security revocation for the whole dependency lifetime;
  • genuine revocation, expiry and tombstones stay permanent.

Deleted: Approval transfer, rerunning the author's 813-test proof, architecture additions, and re-raising notes the parent already dismissed.

Bottleneck: Two consumers still collapse destination policy state into contributor revocation. One is the new birth narrowing comparison. The other is the session-indexed dependency invalidation, which ignores the new reason.

Checked myself:

  • Read the full 244,981-byte inherited packet in bounded chunks.
  • Read the complete 05f..17b production diff.
  • Read the complete current DestinationAutomationAuthority.ts.
  • Read these PeerAuthority functions: coverageFor, validate, captureRecord, the captureAutomation ceiling path, the capture-automation responder, accept, nativePreflight, checkThread and setGrant.
  • Read the EventSink guard and the three captureAutomation callers.
  • Read the r2/r3 schedule test bodies and the r3 council driver section.
  • Ran two native probes (below).

Findings

F1 (blocking, CONFIRMED by execution): B's own preview/device settings count as birth contributor narrowing and lock peer-born threads

Location: PeerAuthority.ts:956-968.

Mechanism:

  • current passes the live ceiling through currentCapabilities, which drops preview and device according to B's project settings (enableAgentBrowserAccess, enableAgentDeviceAccess).
  • The birth is then denied when intersect(certificate.ceiling, current) !== certificate.ceiling.
  • certificate.ceiling is never filtered by those settings:
    • accept (:1481-1517) filters peer capabilities only by B's link grant;
    • captureAutomation intersects scope limits with live record ceilings.
  • Consequence: any certificate carrying preview or device while B's project currently disables that capability denies every birth evaluation. This reaches nativePreflight (EventSink live birth admission), checkThread and onward capture.
  • Interactive-born threads under the same link, project and grant are unaffected. Their validation filters the capability and continues.

Executed evidence: probe probe384r4 on a git archive of exact 17b. It reuses the author's r2 schedule-birth structure with a real registered kernel, SQLite, native receipts/effects and a deterministic provider.

  • browser-off-after:
    • B grants A preview:true; the certificate ceiling includes preview. The first scheduled run completes and a local follow-up before the toggle returns Success.
    • B sets enableAgentBrowserAccess=false. The local B user's follow-up then fails: message.dispatch ... was rejected before commit, with 0 provider starts.
    • checkThread(born) fails: "An original automation birth contributor was narrowed by current policy". checkThread(interactive child) returns Success.
    • Re-enabling the setting restores the thread.
  • device-default:
    • B keeps the product default enableAgentDeviceAccess=false (contracts settings.ts:1129) and grants A device:true. The certificate ceiling includes device. The first scheduled run completes.
    • With no further change, the first local follow-up is rejected before commit and checkThread fails with the same message. The interactive child control returns Success.

Required: Per R3 adjudication 6279433809, broadening must permit later work within the original ceiling, and narrowing must be identified as an actual live-policy refusal. A destination-local capability toggle is not narrowing of an original contributor. Today it turns a capability filter into a whole-thread denial, and the device default makes that the out-of-the-box result.

Proof gap: The shared fixture forces enableAgentBrowserAccess: true and enableAgentDeviceAccess: true on every node (PeerAuthority.workflow.fixture.ts:514-515), so no current case reaches this state.

Fix direction (author's choice): Compare like with like, for example by applying the same current project capability filter to the frozen side, or by checking contributor narrowing separately from destination capability availability. Then add native regressions with browser access off and with the device default, each with an interactive-born control.

F2 (blocking, CONFIRMED by execution): a pure grant broadening on B still permanently revokes a birth-only onward automation on C

Location: DestinationAutomationAuthority.ts:226.

  • invalidateAutomationSessions(sessionIds, reason) first marks pending every obligation listed in fork_automation_dependency_grants for those sessions, whatever the reason or certificate_kind.
  • The R3 kind filter applies only to the second, certificate-based UPDATE (:213).
  • setGrant (PeerAuthority.ts:3245) now passes "retired", but the first UPDATE ignores it.

Path:

  1. C's capture of an onward automation created from a peer-born B thread reaches B's capture-automation responder (PeerAuthority.ts:2393-2450).
  2. captureRecord expands the birth certificate's recordIds. A's incoming record on B therefore enters the graph with environmentId === here.
  3. A's session lands in sessionIds and is registered in fork_automation_dependency_grants, together with certificates=[automation-birth].
  4. Any change to A's grant on B marks the C obligation pending.
  5. The production driver delivers it, and C's receiveDisable applies invalidateAutomationCertificates([...], "revoked") (:739), a permanent revocation.

Executed evidence: probe probe384r4 onward-broadening. It follows the author's r3 "onward" scenario: the peer schedule is disabled, then an active follow-up creates a permitted onward schedule on C.

  • Before the grant edit:
    • B's dependency kind is automation-birth;
    • two obligations to C exist with pending=0;
    • C's certificate shows disabled:0, revoked:0.
  • The change: B runs setGrant({...grant, device:true}), a pure broadening with no revocation. Both obligations become pending=1.
  • After the actual drainAutomationDisables driver call (the same call the author's r3 council case uses):
    • C's certificate shows disabled:1, revoked:1;
    • C has 2 durable disable acks;
    • B's obligations are acked.
  • Control: on B, the birth itself still passes (checkThread(born): Success).
  • An earlier run without the driver call shows the durable pending=1 state only, and is retained separately.

Required:

  • R3 adjudication 6279433809: "a pure grant broadening must not irreversibly revoke ordinary work".
  • The author's own disposition: "Ordinary lifecycle retirement marks only execution dependencies pending".
  • Sol R3: retirement must remain distinguishable from security revocation across dependency lifetime.

C's automation and anything it has born become a one-way door caused by a broadening on B, while the B thread it came from keeps working.

Fix direction: Make the session-indexed UPDATE honor the same reason and kind rules as the certificate path. Genuine session revocation must still mark both kinds. Add a native A→B→C regression in which a broadening leaves C enabled and a real revocation disables it.

Prior finding disposition

  • Sol R3 F1 (onward dependency purpose): PARTIALLY RESOLVED.
    • Registration now admits births via claimBirthCertificate, and the certificate-kind lifetime filter is present.
    • F2 above shows the session-index lifetime path was not converted.
  • Opus R3 F1 (non-turn commits): The source change is consistent. EventSink now uses one guarded condition for preflight and the SQL guard. I did not rerun the author's rename/interrupt cases.
  • Opus R3 F2 (grant edit revokes): The local B birth is RESOLVED for the tested broadening. The repair introduced F1, and F2 shows the same defect class persisting one hop downstream.
  • CI budget: I independently checked the test-title inventory of the 05f workflow file against the 7 current files. All 133 original titles are present exactly once, plus the 2 new r3 titles (title-inventory.txt). Body identity and the shard weights were not independently verified.

Coverage (WHOLE incomplete)

  • Read in full:
    • the packet;
    • the 05f..17b production diff;
    • current DestinationAutomationAuthority.ts;
    • the PeerAuthority functions listed under "Checked myself";
    • the EventSink guarded condition;
    • the capture callers in ScheduledTaskService, LaunchService and commandPlan;
    • the r2 and r3 schedule test bodies.
  • Not read in this round:
  • This is an early-negative REQUEST_CHANGES with supported blockers, not a clean whole-component verdict.
  • Executed: one probe file with three cases, on a git archive of exact 17b with the worktree's node_modules linked. The archive was removed afterwards; probe384r4.workflow.test.ts is retained. Command, from apps/server:
    • PATH=<node v24.13.1>:$PATH PROBE_OUT=… ../../node_modules/.bin/vp test run --maxWorkers=2 src/peer/PeerAuthority.probe384r4.workflow.test.ts [-t onward-broadening]
    • Final runs: 2 passed (F1), exit 0; 1 passed / 2 skipped (F2), exit 0.
    • Each probe asserts the defective outcome alongside its lawful controls.
  • Setup and feedback runs, not product results:
    • probe384r4-setup1.*: the grant was read before the first peer session existed;
    • probe384r4-ob-nodrain.*: no driver call, so only the durable pending state is shown.
  • Isolated fixture homes and a deterministic provider were used. No product server, browser, real provider, live data or existing grants were touched.
  • Reused, not rerun: I re-hashed manifest 384-r3-proof.json to 47df089f…fdea4, which matches. Raw summaries read: 176 + 415 + 70 (2 skipped) + 81 + 48 + 21 + 2 = 813 passed. That is affected proof, not CI, and it does not cover F1 or F2.
  • Unverified: the Spectrum-member variants of F1 and F2, full CI on 17b (including the shard budget), real clients, cross-machine runs, OS crashes and rolled-back binaries.
  • Proof: /home/luke/.local/state/chromeria-379-proof/555-r4-opus55-17b/, with SHA-256 in artifact-sha256.txt.
  • No source, index or workspace writes, and no status, readiness or blocker change. All commands have ended.

Reviewed by Claude Opus 5.5 (medium effort) through Claude Code in T3 Code.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Sol MEDIUM R5 verdict for PR #555 at 078569dbecf94b8baab2d83b46394ed31b0a3fa0 is REQUEST_CHANGES.
Why: Unlinking a freshly paired replacement discards its reachable recovery address while an older generation's exact disable obligation is still pending.
So what: The parent owns adjudication and repair; WHOLE coverage remains incomplete under the supported-blocker allowance, and this report posts no aggregate status, readiness or merge decision.

Requirements and who asked: Approved #379v5/#384 and selected boundary 6271372731 require durable exact DISABLE/ACK recovery through ordinary unlink/relink cleanup, retaining the original protected identity until acknowledgement. The R5 assignment permits an early negative for a supported blocker.
Deleted: No source repair, successor bearer substitution, generic revoked authentication, new recovery service, broad test rerun, subdelegation, topology action or approval transfer.
Bottleneck: The newly paired route exists only in the ordinary link row; retirement preserves rows only for obligations of that row's own generation.
Checked myself: Complete supplied inherited/current packet; live parent contract including Design review, refinement6268898682, current #384 and PR bodies; current recovery selection/retirement/driver/receiver and relevant capture/domain consumers; one registered authenticated relocation plus repeated-unlink probe with before-unlink and exact original-credential controls; all current source/test/artifact bindings and raw affected summaries.

Exact candidate and persisted reviewer configuration

  • Base: 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc.
  • Head: 078569dbecf94b8baab2d83b46394ed31b0a3fa0.
  • Tree: 539bea9cbb6f9aa804c181b923254bb8c56d2d0e.
  • Local Git and live PR base/head match. Designated exclusive workspace /home/luke/.t3/worktrees/chromeria/feat-384-destination-authority-current, branch feat/384-destination-authority-current, is clean. I made no source/index/checkout changes.
  • t3_thread_configuration read back provider instance codex, model gpt-6.1-sol, reasoningEffort=medium, full-access/default for this R5 delegated task. Raw readback is retained as reviewer-configuration.json below. I did not author the implementation or consult another current reviewer.
  • PR feat(peer): keep destination automations authorized offline #555 is registered with this thread and is not watched. No historical review approval transfers.

F1 [P2]: Preserve the newly paired recovery route through another unlink

Primary location: PeerLinks.ts:566-570. Retirement owner: lines182-191; deletion: lines475-484.

Trigger: A has an unacknowledged disable for original generation G1 on B. The original endpoint becomes unavailable. A successfully pairs to the same B at a new endpoint, creating G2, so R4's route repair can reach B using G1's original protected credential. Before that old obligation is acknowledged, A unlinks G2. This can happen after a failed/lost delivery or simply before the next delivery attempt; G2 need not have created any new automation.

Actual: Recovery loses the new endpoint and returns unreachable, while the G1 obligation remains pending. The same original G1 token can still complete its exact registered DISABLE/ACK at that endpoint. The lost address is a completed pairing fact, not an unsuitable successor credential.

Reachable cause: resolveAutomationRecovery adds the paired primary solely from readRow(environmentId). unlink deletes that ordinary row. retireAutomationLink retains the departing G2 row only if there is an unacknowledged obligation with next_generation=G2; an outstanding G1 obligation does not qualify. Even a retained G2 row would not be queried by the G1 resolver, which selects the exact G1 row. Consequently the G1 row still contains only the unavailable old endpoint, and the usable new primary disappears from recovery's candidate list. The production deliverAutomationDisableBatch uses this resolver; its retry driver cannot rediscover the discarded pairing fact by retrying it. Indefinite retry is a source inference, not a timed execution claim.

Required versus observed: The selected contract retains recovery material across unlink/relink until the exact ACK. The R4 owner decisions separate paired address knowledge from ordinary credential lifetime. Keeping it after expiry but deleting it at the next unlink leaves the same lifecycle gap. This does not require retaining G2's bearer, accepting unpaired alternates or allowing ordinary revoked authentication.

Executed discriminator: One isolated test on an archive of exact current HEAD, derived from the current registered relocation test:

  1. Actual fixture OAuth pairing and public schedule_task create B's persisted certificate and A's real source dependency.
  2. Stop A's owned connection lifetime, unlink G1 and revoke its B auth session. Retain the original pending obligation and protected identity.
  3. Rehost the same B fixture state at a new ephemeral endpoint and perform actual successful OAuth pairing there, producing G2. Ordinary resolution and exact G1 recovery both succeed at the new endpoint before the second unlink; returned recovery token/generation remain G1.
  4. A deterministic HTTP boundary makes only the old origin return503, passing new-origin requests to the real fixture HTTP services. Matching-descriptor and wrong-generation negative controls remain in the copied case.
  5. Call actual PeerLinks.unlink(B) for G2. Ordinary resolution now fails as required. G1 recovery fails specifically with reason=unreachable. The actual production disable drain leaves one pending obligation, makes zero new-origin requests in that drain, and produces zero destination ACKs.
  6. Send the retained G1 token directly to the same new endpoint: ordinary /mcp returns 401, changed dependency tuple returns 403, exact registered DISABLE returns 200. Its matching durable ACK clears the original source obligation; B stores exactly one ACK.

The test intentionally asserts this defective outcome and its lawful controls, so exit0 is reproduction evidence, not repaired behavior. No setup attempt failed. The destination already knows G1's auth revocation, so this probe does not demonstrate prohibited provider execution; it demonstrates broken durable recovery/confirmation despite a usable exact authenticated route.

Correction belongs to the existing paired-route/retirement owner: retain appropriately proved paired-primary route knowledge for outstanding original obligations through ordinary replacement/unlink cleanup. Preserve the original credential/generation/dependency, descriptor check, alternate-address exclusion, ordinary-auth denial and exact durable ACK checks. Add a repeated-unlink/reconstruction regression alongside the current relocation/expiry control. No new service or broader authentication is needed.

Executed, reused and unverified proof

Reviewer proof directory: /home/luke/.local/state/chromeria-379-proof/555-r5-sol-078/.

Executed once from probe-source/apps/server, with existing dependencies and cached Node24:

PATH=/home/luke/.npm/_npx/200eedeed3b657fd/node_modules/node/bin:$PATH ./node_modules/.bin/vp test run --maxWorkers=2 src/peer/PeerAuthority.r5RelinkProbe.workflow.test.ts

Exit0, 1 passed,12.91s. Exact probe is retained as probe384r5.test.ts; raw output/exit are relink-probe.log and relink-probe.exit, with command/cwd in command-result.json and file digests in artifact-sha256.json. All46 archived component files retain their current manifest hashes; the additional probe is outside Git. The finite command and its scoped fixture services have ended.

Reused, not rerun: Independently hashed 384-r4-proof.json to fb2374763a80d068fecf17a75e3faffef51c57792b7b75347ecc0d2a05512d9f; verified all46 component and43 test working-file hashes and HEAD Git blobs, plus all165 artifact sizes/digests. Raw summaries show181+420+81+48+70+21+2 = 823 passed / 2 existing opt-in skips. Inspected actual server/contracts cache-disabled tsc-rs --noEmit headers and all17 recorded required exits0. This is current affected author proof, not full CI and not evidence against F1. No broad test group was repeated.

Unverified: Complete hosted CI and10-minute shard budget; real clients/providers/hardware/machines; OS crashes; rolled-back product binary; R4-specific Spectrum toggle/broadening variants; every historical repaired scenario; final #379 acceptance. The relocation is fixture endpoint rehosting, not an OS migration. The unavailable-origin adapter is the external boundary; authority, SQLite, authentication, dependency and ACK owners are actual registered services. No product/dev/installed server, Browser/Device/Metro, real provider, live userdata/existing grants, install, agent CLI or other workspace was used or changed.

Prior findings and honest WHOLE coverage

The R4 route repair is independently exercised as working before the additional unlink, including the original protected token and exact generation. The current PeerAuthority diff separates contributor comparison from final B capability availability, propagates the private contributor view through local recursion and traverses different claimed local certificates. Current dependency SQL persists grant purpose, defaults historical rows to execution, makes strict registration dominate and filters retirement accordingly. These are inspected source observations, not blanket clearance of all prior native/legacy/Spectrum scenarios. F1 is a remaining lifetime consumer of the accepted recovery requirement.

Read the entire307221-byte 555-r5-full-inherited-and-current-packet.txt in bounded chunks, including original brief/full selected design/commandPlan extension, R1-R4 findings, adjudications, author responses, CI history, failed-proof dispositions and retained objections. Read live #379 including approved v5/Design review, current #384 and PR bodies and refinement6268898682. Applied the supplied instructions/direction, operations routing/orchestration/verification/review method/impact analysis/Elon and empirical-diagnosis guidance, Great Library README, root/internal glossaries and Effect guidance.

Source inspection includes complete current DestinationAutomationAuthority.ts and PeerLinks.ts; complete R4 production diff; current PeerAuthority coverage/validate/resource/capture and recovery facade portions; actual delivery/retry/start consumer and HTTP disable authenticator. Read the complete current relocation regression, relevant native schedule lifecycle portions, and fixture reconstruction/rehosting/native-call owners used by the probe.

WHOLE coverage remains incomplete: I have not read/adjudicated the entire46-path base-to-head diff, every current test body, the entire moved fixture and its lifetime/import/export semantics, all actual native/credential/schedule/check/Spectrum consumers, the complete AST/weight preservation evidence, or every linked historical material-decision record beyond the full supplied packet. Hash verification is not substituted for that reading. I stop under the explicit supported-blocker early-negative allowance. This is a whole-candidate REQUEST_CHANGES, not a clean WHOLE verdict, approval of any uninspected remainder, aggregate readiness result or blocker clearance.

All owned commands ended. The designated workspace remains clean at the exact head/tree. No source/index/checkout/topology/status/readiness/merge/deploy write occurred. This full findings comment is the sole external content write.

Reviewed by Codex, gpt-6.1-sol with medium reasoning effort, through T3 Code.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Sol MEDIUM R6 verdict for PR #555 at cc7ad7764827c921d1c123e3da0cf7c81003aea5 is REQUEST_CHANGES.
Why: The disable driver parks when no obligation is pending and never wakes for a registered dependency's future expiry, so expiry-triggered disable and durable confirmation can remain undelivered.
So what: The parent owns adjudication and repair; WHOLE coverage remains incomplete under the supported-blocker allowance, and this report posts no aggregate status, readiness or merge decision.

Requirements and who asked: Approved #379v5/#384 and the selected 6271372731 require source expiry to mark and forward exact durable disable obligations. The selected protocol's step 5 explicitly includes source expiry alongside revoke/replacement/unlink. The R6 assignment permits a supported early negative with honest coverage.
Deleted: No source repair, new service, generic scanner, successor credential substitution, revoked-auth bypass, broad suite rerun, nested agent, topology action or approval transfer.
Bottleneck: A durable future expiry has no wakeup once the existing delivery owner parks.
Checked myself: Entire 338342-character inherited/current packet in sequential bounded chunks; live parent/child/PR contract and refinement; actual registration, expiry SQL, recovery driver and notification/retirement owners; a finite real-SQLite/actual-driver TestClock discriminator with an exact-ACK control; current source/test/artifact bindings and raw affected proof.

Exact candidate and reviewer

  • Base 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc.
  • Head cc7ad7764827c921d1c123e3da0cf7c81003aea5, tree b928f055646e48a5cb3bcdacc78058fcaf920a7d.
  • Local Git and live PR base/head agree. Designated workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-sol is detached and clean. No other workspace was used or changed.
  • Persisted t3_thread_configuration confirms provider codex, model gpt-6.1-sol, reasoningEffort=medium, full-access/default. Raw readback retained in reviewer-configuration.json below. No implementation authorship or consultation with the other current reviewer.
  • PR feat(peer): keep destination automations authorized offline #555 is registered with this thread. No historical approval transfers; no Opus R5 dispatch or verdict is inferred.

F1 [P2]: Wake idle disable recovery at a registered dependency's known expiry

Location: PeerMcpClient.ts:463-479, with expiry promotion at DestinationAutomationAuthority.ts:764-769.

Trigger: A has a registered, not-yet-pending dependency with a known future expiry. The driver completes its startup/link wakeups while that expiry is still in the future, finds no pending batch and parks. The expiry then passes without a link edit, revocation, fork commit, another automation mutation or restart. The destination's exact recovery route is usable.

Actual: The obligation remains pending=0, ack_json=NULL and no disable is attempted. pending is the only code that promotes expires_at deadlines into pending disables, but it is evaluated only when the parked worker receives a wake. Startup, link changes and explicit automation notifications supply wakes; time passing does not. The second expiry query for certificate-indexed obligations has the same dependency on a future scan. Session expiry checks and ordinary control-channel termination do not publish the automation wake. New originating dependencies are populated with known expiry by the actual capture-automation responder and legacy attestation responder, so this is a production state, not an unsupported synthetic expiry feature.

Required: The selected protocol explicitly requires source expiry to persist and forward an exact disable. Its durable confirmation cannot depend on an unrelated future mutation. Preserve idle parking and the existing narrow recovery owner, but arrange progress when a registered deadline becomes due, including deadlines registered after parking and reconstruction. No new authority/service or ordinary expired authentication is needed.

Executed discriminator: Actual migrated SQLite, actual DestinationAutomationAuthority.registerDependency/pending/acknowledge, actual PeerMcpClient.start/drainAutomationDisables, actual PeerLinkEvents, Effect TestClock and deterministic link-resolution/HTTP boundaries:

  1. Register one exact originating dependency with knownExpiry = now + 1000ms; leave it legitimately non-pending before expiry. The link-list boundary exposes its ordinary destination.
  2. Await explicit startup and link-wakeup scan milestones before advancing time. Both scans find no pending obligation.
  3. Advance TestClock two hours. Observed 2 total scans / 0 automatic attempts / pending=0 / no ACK, with SQL confirming expires_at < now.
  4. Invoke the unchanged production drain. It immediately observes expiry, sends the exact dependency to the available boundary and persists its matching ACK. This rules out missing expiry data, selection refusal or an unusable recovery result at the driver seam.

This probe deliberately asserts the defect and lawful control, so exit0 is reproduction evidence. It isolates delivery scheduling: the ordinary reconnect environment service is omitted, and link resolution plus HTTP ACK are deterministic external boundaries. It does not execute OAuth, a registered native schedule, real peer authentication or a provider. Source inspection establishes that the actual capture owners populate the same persisted expiry.

Impact limit: The destination also captures known expiry and independently denies execution after it. This finding does not demonstrate prohibited execution beyond expiry or permission broadening. It demonstrates missing source expiry-triggered disable/confirmation and a non-pending durable row despite the deadline having passed, under the explicit selected recovery contract. Indefinite dormancy without another wake follows the source loop; the executed observation advances two hours.

Proof

Canonical reviewer record and artifacts: /home/luke/.local/state/chromeria-379-proof/555-r6-sol-cc7/ (review.md, expiry-wakeup-probe.mjs, raw .log/.exit, configuration and artifact digests).

Final command from the designated review workspace:

/home/luke/.npm/_npx/200eedeed3b657fd/node_modules/node/bin/node /home/luke/.local/state/chromeria-379-proof/555-r6-sol-cc7/expiry-wakeup-probe.mjs

Node v24.13.1, exit0, finite command ended. No suite was rerun. An initial empty-link boundary also exposed dormancy but was strengthened to retain an ordinary link. The first strengthened attempt failed an overly early startup milestone assertion (2 !== 1 scans); startup-milestone-feedback-* preserves that setup feedback. The final probe explicitly sequences both scans using Deferred and has no sleep/poll loop or weakened product expectation.

Reused, not rerun: Independently hashed 384-r5-proof.json to 606f0300c8ed9c25121a7f679d74ffcbb765581de0ac32ec83c3737262c5e0ad; verified all46 component and43 test working hashes/HEAD Git blobs, all86 artifact sizes/digests, six unchanged older sealed manifests and all17 required recorded exits0. Raw final summaries inspected:182+420+81+48+70+21+2 = 824 passed / 2 existing opt-in skips. Actual server/contracts package cache-disabled tsc-rs --noEmit headers inspected. This is affected author proof, not full CI and not evidence against F1.

Read the complete current R5 native regression and PeerLinks owner. The stored original-generation primary, additive schema migration, repeated unlink/reconstruction, successor-secret deletion, descriptor refusal, alternate exclusion and exact ACK oracles directly address the previous R5 mechanism. Inspected raw final-before unreachable failure and migration/lifetime green. These source/proof observations do not transfer approval or clear all recovery corners.

Coverage and remaining limits

Inspected complete current DestinationAutomationAuthority, PeerLinks, PeerAuthorityRecord and peerEffectAuthority; current PeerAuthority coverage/validate/resource/capture/registration/native-preflight/effect/binding consumers; full schedule/check/engine/fence, EventSink/EffectWorker and Spectrum launch/round/reopen/state/store diffs; MCP union-reader/recovery-route and auth-retirement changes; actual notification and expiry callers. Read the complete R5 regression, selected expiry and automatic-recovery native cases and relevant fixture/test portions. Applied supplied instructions/direction, operations review/verification/orchestration/impact-analysis/Elon/diagnosis/test-design/empirical guidance, Great Library README, root/internal glossaries and Effect guidance.

WHOLE coverage remains incomplete: I have not exhaustively read/adjudicated every46-path full source diff, every43-test-file body, the complete moved fixture/import/export/lifetime semantics, all actual credential/native/tool/legacy/Spectrum consumers, the complete AST/weight preservation evidence or every linked material decision outside the full supplied packet. Hash verification is not substituted for reading. I stop under the explicit supported-blocker early-negative allowance. This is a whole-candidate REQUEST_CHANGES, not a clean WHOLE verdict or approval of any uninspected remainder.

Unverified: Complete current hosted CI and10-minute shard budget; real clients/providers/machines; OS crashes; rolled-back product binary; R4-specific Spectrum toggle/broadening variants; complete historical repair clearance; parent #379 acceptance. No product/dev/installed server, browser/device/Metro, real provider, live userdata/existing grant, install, nested agent, source/index/checkout/topology/status/readiness/blocker/merge/deploy write occurred. All owned commands ended; the frozen workspace remains clean. This findings comment is the sole external content write.

Reviewed by Codex gpt-6.1-sol, medium reasoning effort, through T3 Code/Codex.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Claude Opus 5.5 MEDIUM R6 review of PR #555 at cc7ad7764827c921d1c123e3da0cf7c81003aea5: no WHOLE verdict. I found no supported defect, and that includes the new R5 route-retirement repair. This is not an APPROVE.
Why: I read the full inherited packet, every R5 change and most of the production diff. I did not read the ~17k lines of moved and new native test bodies, or a few production regions, so the scope that a clean WHOLE approval requires is incomplete.
So what: The parent decides how to finish WHOLE coverage on this head. This review posts no status, readiness or blocker change, and it transfers no approval.

Identity and configuration

  • Base 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc, head cc7ad7764827c921d1c123e3da0cf7c81003aea5, tree b928f055646e48a5cb3bcdacc78058fcaf920a7d. 46 changed paths.
  • Live readback: PR OPEN, head cc7ad77, base feat/379-cross-machine-parity at 60c0cc5.
  • Reviewer: Claude Code through T3 Code, claudeAgent / claude-opus-5-5 / effort medium, full-access/default. Read back with t3_thread_configuration and retained as reviewer-configuration.json.
  • Workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-grok: detached at the exact head and clean at start and end. The folder name is historical and has no link to fix(peer): preserve current-main request answering policy #539 or Grok.

Elon record

Requirements and who asked: Approved #379 v5 and #384, selected seam 6271372731, commandPlan extension 6272745083, and all accepted R1–R5 dispositions. For R5, parent disposition 6281224396 requires that the original-generation exact DISABLE/ACK survives replacement, repeated unlink and reconstruction. The original credential, generation, dependency, descriptor check, alternate exclusion, ordinary-auth denial and durable ACK must all remain in force.
Deleted: Approval transfer, rerunning the author's 824-test proof, architecture additions, re-raising dismissed notes, and inventing a finding to justify a verdict.
Bottleneck: The size of the WHOLE scope. The test bodies have never been fully read by an independent reviewer in any round.
Checked myself:

  • The full 338,420-character packet, read in sequential chunks.
  • The complete 078..cc7 diff (both files).
  • Complete current PeerLinks.ts and DestinationAutomationAuthority.ts.
  • The PeerMcpClient disable driver.
  • Raw R5 red and green evidence and its hash bindings.

R5 repair adjudication (no finding)

  • Route lifetime. retireAutomationLink now snapshots the departing row's urls[0] onto every retained generation for that destination that still has an unacknowledged obligation. It does this inside the existing unlink and replacement transaction, before the row is deleted. link() records the new paired primary in the same transaction as the upsert.
    • urls[0] is always the OAuth-paired input.url. Alternates are never promoted.
    • unlink is the only DELETE FROM peer_environment_links, so no deletion path bypasses the snapshot (grep-checked).
  • Identity. The resolver still selects the exact original generation row and requires an unacknowledged obligation. It returns that row's original secret and launchIdentity, and it sends a token only to a candidate whose descriptor matches. No successor bearer is copied, and replacement-secret deletion is unchanged.
  • Migration and rollback. The migration is an additive ALTER guarded by PRAGMA. An 078 reader's sql.insert({generation,...row}) still works against the extra nullable column.
  • Races. Capture-side dependency registration rechecks that the link generation is current inside its transaction. A concurrent unlink therefore either retains the obligation or causes the registration to be refused.
  • Red/green. red-final-baseline-owner.ts hashes equal to git show 078:PeerLinks.ts (2b02037d…). red-final-test.ts/testSha256 equal the current HEAD test (14afbaed…). The baseline fails with PeerLinkError reason=unreachable, exit 1, and the final run passes.
  • Non-blocking notes:
    1. One route per retained generation means the latest successful pairing overwrites an earlier one. If the latest pairing becomes unreachable while the earlier one still answers, recovery waits. R4 had the same single-route property through the current row, so this is design-bounded, not a regression.
    2. Route trust is still "completed pairing plus matching descriptor". The ACK is accepted from whoever answers at that verified origin. This is the trust model the parent accepted in R4, not new in R5.
    3. paired_primary_origin is cleared only when the resolver observes no obligation. Acknowledged obligations never reach the resolver, so the value normally stays stale. This is harmless: the resolver refuses without an obligation, and the EXISTS clause blocks further updates.

Wider inspection (no finding)

  • Read:
    • complete Spectrum LaunchService, RoundService, commandPlan, state and store diffs;
    • the EventSink guard and EffectWorker diffs;
    • the PeerAuthorityRecord union and conjunction;
    • the ScheduledTaskService and mutationReceipts diffs;
    • the checks engine, state and store diffs;
    • all MCP union-reader diffs;
    • the McpHttpServer disable route;
    • the AuthSessions revoke ordering, PeerLinkEvents and server.ts;
    • PeerAuthority currentCapabilities, coverageFor, validate (including the R4 contributor view), hasResourceSession, checkCreated, checkResource, captureLegacy, captureRecord with its BirthFacts logic, and the capture-automation responder.
  • Considered and cleared:
    • Remote variant of R4 F1. A contributor environment's own browser/device project filter is applied to onward ceilings it validates. This already applies to interactive onward calls at base, so for a downstream birth it is a genuine, reversible narrowing by a contributor, which is consistent with the accepted R3/R4 model.
    • Execution purpose in the checks engine. claimRun uses the execution purpose, so an unfinished checked run stops after its certificate is retired. This is consistent with the purpose split.

Coverage (WHOLE incomplete)

  • Not read in this round:
    • PeerAuthority hunks outside the functions listed above: schema, enroll and ask, checkThread, checkEffect, accept and prepare, the captureAutomation tail, admission and execution, the remaining responders, setGrant and nativePreflight;
    • peerEffectAuthority.ts, the ScheduledTaskChecks.ts diff and the docs diffs;
    • all test bodies except the new R5 case: seven native files, the shared fixture, the domain test and the PeerToolRouting test, about 17k lines.
  • I did not substitute the author's AST-identity chain for reading. That chain proves the declarations were preserved across rounds, not that they were independently adjudicated.
  • Because the scope is incomplete, this review issues no WHOLE APPROVE. Because I found no supported blocker, it issues no REQUEST_CHANGES.
  • Executed: no tests or probes this round. One heavy command was available, but no hypothesis needed it.
  • Reused, not rerun:
    • I re-hashed manifest 384-r5-proof.json to 606f0300…62e0ad, which matches.
    • All 17 final-*.exit files read 0.
    • Raw summaries: 182 + 420 + 81 + 48 + 70 (+2 opt-in skips) + 21 + 2 = 824 passed.
    • This is affected author proof, not CI.
  • Unverified: full hosted CI and the 10-minute shard budget on cc7; real clients, providers and machines; OS crashes and a rolled-back binary; the R4-specific Spectrum toggle and broadening variants; final spec: native cross-machine control across linked environments #379 acceptance.
  • Proof directory: /home/luke/.local/state/chromeria-379-proof/555-r6-opus55-cc7/.
  • No source, index or workspace writes. No status, readiness or blocker change. No commands remain running.

Reviewed by Claude Opus 5.5 (medium effort) through Claude Code in T3 Code.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Sol MEDIUM R7 WHOLE verdict for PR #555 at 694f80d0783d18847c50337d233bd8b537c8d16a is APPROVE for the reviewed component source and tests; no supported new finding.
Why: The complete current component, native test bodies, actual consumers and material review history preserve the selected bounded authority contract, including autonomous expiry-triggered exact DISABLE/ACK.
So what: Parent retains the second independent review, alignment and combined acceptance decisions; this comment changes no aggregate status, readiness, Issue, blocker or merge state.

Requirements and who asked: Approved #379v5/#384, selected design 6271372731, commandPlan extension 6272745083, and every binding prior finding/adjudication require bounded local destination automation while A is offline, live original contributors for later interactive/onward work, atomic exact-generation acceptance and durable exact disable confirmation. This supports the cross-environment Promachos/Drafter/Spectrum Objective.
Deleted: Approval transfer, repair-only coverage, new authority or scheduler requirements, speculative route redesign, broader authentication, another full-suite rerun, source repair and nested delegation.
Bottleneck: Complete independent inspection of the current production and native test scope, rather than relying on previous subset reviews or author hashes.
Checked myself: Entire inherited/current packet sequentially without truncation; all46 changed paths and required surrounding consumers; every substantive body in all7 native files, shared fixture, domain, PeerToolRouting and barrier tests; current Git/GitHub identity; sealed source/test/artifact bindings; raw failed and passing evidence; actual package compiler headers; current exact-head hosted CI and job durations.

Exact candidate and independence

  • Base: 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc.
  • Head: 694f80d0783d18847c50337d233bd8b537c8d16a.
  • Tree: c737a76586c6f343be43ed67dccd656ee504ca96.
  • Sole workspace: /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-sol, detached and clean. Live PR remains OPEN against feat/379-cross-machine-parity at the exact base/head above.
  • Current t3_thread_configuration readback, retained as reviewer-configuration.json, confirms provider instance codex, model gpt-6.1-sol, reasoningEffort=medium, full-access/default, on delegated job 379-555-r7-sol-medium-694f80d-full-v1. Harness: T3 Code/Codex.
  • PR feat(peer): keep destination automations authorized offline #555 is registered with this thread. No source-author or other-reviewer consultation, implementation authorship, nested agents, other-workspace source inspection or historical verdict transfer occurred.

Whole review result

No supported defect remains from this independent inspection. This is a fresh whole-candidate source/test verdict, including the ordinary, historical legacy, conjunction, native acceptance, credential, onward, Spectrum and recovery paths. It is not a verdict on #383's separate predicate/attachment repair, which is absent here.

The principal invariants are supported by the current owners and actual consumers:

  • Live capture finishes outside the write transaction. Schedule resource evidence includes the accepted predecessor and monotone disabled/revoked state. Native admission checks owners before SQL and rechecks exact owner/grant/security evidence inside the atomic commit. Native events, authority mappings, receipt and outbox are committed together. No network operation was introduced under those SQL guards.
  • Execution and permanent birth are distinct typed internal records. A current automation execution must claim its exact enabled/current certificate, binding/incarnation and generation. Permanent birth retains every original contributor and later interactive work evaluates them live. Coverage uses exact immutable facts; later unrelated inputs cannot borrow coverage merely by sharing a session. Execution intent dominates when an indexed dependency contains both purposes. Imported rows remain conservative.
  • Credential preparation, issue, reuse and resolution read the current composed owner and narrow capabilities. EventSink and EffectWorker retain the same ownership through actual start, continuation, steer, restart and non-turn commits. Independent later local runs retain their existing behavior; permanent descendants retain birth ownership. Modern and legacy contributors remain conjunctive across targets and onward capture.
  • Private DISABLE is a separate exact registered dependency operation. Its retained token hash cannot authorize ordinary MCP, control preparation, credential issue or new execution after ordinary authentication retires. The receiver commits its tombstone before acknowledgement; relay confirmation waits for downstream ACK. Lost/unknown ACK does not clear the obligation. Retained route lookup uses the original protected credential/generation and checks destination identity before sending. Replacement alternates do not become paired continuity evidence.

Prior findings and R6 repair disposition

All prior findings, responses and unresolved objections in the packet were considered against this candidate, not inherited as approvals.

Mechanism Current disposition
R1 idle recovery, first32 starvation, local empty graph, capture-bound dependency identity and forged local graph node Existing single scoped retry owner, sliding wake queue and durable rotating selection preserve progress and fairness. Empty local captures stay unstamped. Upstream dependency tuples are checked against the exact capture and peer-supplied local records are refused. Native route, lost-ACK, fair33 and local controls remain.
R1 EventSink import cycle and old PeerToolRouting positives The small event owner avoids importing the full peer runtime into EventSink. Old fixture negotiation refuses before effects; actual negotiated positives are exercised through native registered paths.
R2 accepted predecessor race The resource fence includes current accepted binding and disabled/revoked state. Both authenticated local-save/peer competing acceptance and unchanged-predecessor controls exercise the actual save path.
R2 birth versus retired execution Permanent automation-birth references retain original owners; stopped/superseded execution stays denied. Native follow-up preflight, effects and credentials use that distinction rather than deleting ownership or authorizing from raw facts.
R3 dependency purpose, non-turn admission and reversible grant policy Certificate/grant indexes preserve purpose with strict dominance and strict defaults. EventSink's preflight condition matches its SQL guard for dispatch/automation/non-turn work. Policy changes retire execution; genuine session/link/source/expiry invalidation remains monotone security denial. Current original live narrowing, restoration and broadening controls retain their intended oracles.
R3 CI partition All seven complete current test files and the shared fixture were read. Each case still constructs scoped isolated state. Existing weighted sequencing, eight shards, workers and timeouts are preserved. An additional independent AST check confirms all139 cc7 declarations retained unchanged exactly once,141 current declarations total. This check supplements reading.
R4 local capability filtering and exact birth facts Contributor comparison precedes destination operation availability filtering; nested local birth contributors remain traversed. Grant purpose is derived from exact occurrence facts, with any uncovered occurrence keeping the strict purpose. Native actual A-B-C broadening/revocation and nested controls remain.
R4 moved recovery origin Only a successfully paired primary supplements the old route. The original secret/generation and exact dependency remain authoritative, with descriptor and ordinary expired-auth denial controls.
R5 repeated unlink/reconstruction Nullable retained paired_primary_origin is recorded in the unlink/replacement transaction for unacknowledged obligations. Repeated unlink no longer destroys the last paired route needed by the old generation. The full migration/reconstruction, successor-secret deletion, descriptor refusal, alternate exclusion, ordinary401, wrong-dependency403 and exact200/ACK test was read.
R6 future expiry cannot wake parked recovery Addressed at the existing durable deadline and delivery owners, as detailed below.

R6's nextDisableDeadline returns the earliest originating, indexed immutable-certificate or indexed actual-session expiry over unacknowledged non-pending obligations. The pending promotion and deadline view agree, including expired/revoked grants for both purposes. Pending, acknowledged and removed rows cannot keep a stale due timer active. The1001ms SQL boundary cases cover the millisecond conversion.

The existing worker drains a batch, retains its2s retry for nonempty work, and after an empty batch races its sliding queue against the Effect clock deadline. Null parks only on the queue; either winner rescans durable state. A notification arriving between scan/read/wait remains queued. Earlier registration interrupts the previous wait. Storage failures retain the existing2s retry rather than becoming a false empty result. Four registration notifications follow their actual enclosing transaction; the domain owner has no event-bus constructor dependency. ACK notification follows durable acknowledgement. The pinned Effect implementation interrupts the losing race branch, clears canceled live timers and chunks waits beyond 2**31-1; no extra timer wrapper is needed. Scope owns the worker and wait branches. Fair32/concurrency4/attempt10s/retry2s remain unchanged.

I read the complete new native controls for reconstruction, late registration, earlier rearm, simultaneous notify/deadline and ACK cancellation. They use actual OAuth pairing, registered schedule capture, SQLite, authority, driver and private receiver. Only external HTTP timing is deterministic; policy Effects are tapped for milestones, not replaced by successful answers. Capture itself supplies the originating expiry. Automatic progress has no explicit drain or unrelated mutation. Domain controls separately cover certificate/grant purposes; they are not native captures of every certificate or legacy variant.

The original red input and its three baseline production bindings were independently hashed against Git. Its observed failure is overdue pending=0/ACK=null. The same early SQL assertion also failed the first repaired run because it preceded the asynchronous scan milestone, so that run is timing feedback, not green proof or an independent liveness discriminator. The final strengthened tests await actual deadline-read/selection milestones and exact durable ACK. The old source's absent deadline wake, the inherited real-driver discriminator and the current source/strengthened passing controls establish the repair together. The later decoder yield* fixture failure is retained separately from product failure.

The R6 Opus report's single-latest-route, paired-origin trust and harmless stale-route notes add no requirement. Its no-WHOLE-verdict is not approval. The former Sol expiry finding did not demonstrate expired execution privilege escalation; this repair restores required durable confirmation while destination expiry denial remains.

Coverage ledger

Every path below was inspected through its complete base..HEAD change. Complete central modules and all current substantive test/fixture bodies were additionally read sequentially. coverage.json retains the per-path reading mode and current SHA256.

Area Paths inspected
MCP mcp/McpHttpServer.ts, McpRequestReceipts.ts, McpRouting.ts, OrchestratorMcpService.ts, linkOrigin.ts, requestIdentity.ts, toolkits/environment/handlers.ts, toolkits/preview/handlers.ts, toolkits/pullRequests/handlers.ts
Native orchestration orchestration-v2/EventSink.ts, EffectWorker.ts
Peer owners peer/PeerAuthority.ts, PeerAuthorityRecord.ts, PeerLinkEvents.ts, PeerLinks.ts, PeerMcpClient.ts, peerEffectAuthority.ts
Complete native bodies peer/PeerAuthority.workflow.test.ts, PeerAuthority.automationSchedules.workflow.test.ts, PeerAuthority.automationSpectrum.workflow.test.ts, PeerAuthority.automationContributors.workflow.test.ts, PeerAuthority.lifecycle.workflow.test.ts, PeerAuthority.pendingRequests.workflow.test.ts, PeerAuthority.typedEffects.workflow.test.ts, PeerAuthority.workflow.fixture.ts, PeerToolRouting.test.ts
Authentication persistence/AuthSessions.ts
Schedule/check scheduledTasks/DestinationAutomationAuthority.ts, DestinationAutomationAuthority.test.ts, ScheduledTaskService.ts, mutationReceipts.ts; scheduledTaskChecks/ScheduledTaskChecks.ts, engine.ts, state.ts, store.ts
Spectrum spectrum/LaunchService.ts, RoundService.ts, commandPlan.ts, state.ts, store.ts, complete barrier.test.ts
Composition/metadata/docs server.ts, testUtils/shardWeights.json, docs/fork-features.md, docs/map.md, docs/user/remote-access.md

Source paths above are relative to apps/server/src/ except docs/. Actual surrounding consumers traced include ProviderSessionManager preparation/reuse, McpSessionRegistry issue/resolve, authenticated MCP and recovery routes, WS schedule upsert, schedule/check validation/claim/command dispatch/manual recovery, Spectrum launch/reopen/round ownership, EventSink transaction/publish order, EffectWorker execution and continuation owners, original link retirement and session-revocation ordering, and the existing shard sequencer/CI configuration. Backend behavior reaches shared server paths used by web/desktop/mobile and scheduled/MCP entry points; there is no new client or provider-specific wire contract.

History: full /home/luke/.local/state/chromeria-379-proof/555-r7-full-inherited-and-current-packet.txt, SHA256 bdd7033569cce3c73eed2208ea8abeb6139de0c83c68241c47265843f214ad82, was read in sequential bounded untruncated chunks. Live #379v5, refinement6268898682, #384 and current PR body were read, along with material decision records6278214300,6278322302,6278719707,6278782431,6279413859,6279460525,6279509412. The packet retains original selected design/commandPlan grant, all earlier reports, responses, objections and current handoff. Applicable operations review/verification/orchestration/impact/Elon guidance, direction, glossaries, Great Library README and Effect guidance were applied. Hash/AST evidence did not substitute for current source/test reading.

Proof executed, reused and limits

Reviewer record directory: /home/luke/.local/state/chromeria-379-proof/555-r7-sol-694/.

Executed here: read-only Git/GH inspection and finite metadata checks only. git diff --check 60c0cc55..HEAD exits0. Independent Python verification confirms all46 component and43 tested working files equal their HEAD blobs and recorded hashes, all89 artifacts match bytes/SHA256, and all7 older manifests remain unchanged. The red test and3 old production-owner bindings also match. Pinned Node24.13.1 ran verify-retention.mjs, exit0:139 old declarations retained AST-identically once,141 current in7files. Free memory was checked before this finite command, about20GiB available. No runtime test suite or fixture was started in this review; no heavy commands overlapped. Commands ended.

Reused after verification: sealed manifest 384-r6-expiry-wakeup/384-r6-proof.json, SHA256 81f16c55dc9c3b3b46ea3648a3251b22258fff4315c94a12c2e6add41eeaf4fd. All17 final recorded exits are0. Raw summaries inspected:186native7files +426focused17 +81auth7 +48pairing/contracts3 +70CI4 with2existing opt-in skips +21drivers4 +2sequencer = 834 passed / 2 skipped / 43 files. Actual cache-disabled server and contracts tsc-rs --noEmit package headers were inspected, along with scoped lint/format/exports, original-reader and c93 decoder controls, frozen fork-boundary/inventory53 and postcommit checks. Failed timing/decoder feedback remains distinct from passing proof. This is affected author proof, not a suite rerun by this reviewer.

Current hosted evidence, independently read live: CI run 39361106103 binds exact694f80d0 and succeeds. All8 server jobs succeed under the unchanged600s limit: shards1–8 take302,416,375,438,406,465,439,449seconds respectively. Current trusted transfer report binds694f80d0, source CI success, and every enforced ceiling passes. It has no successful main baseline, so it supports no comparative main-regression claim. Raw run/job/report readbacks are retained locally. No historicalcc7 timing is transferred.

Not established by this approval: real client/cross-machine/provider/hardware acceptance, OS crash or rolled-back product binary behavior, every R4 Spectrum toggle/broadening variant, #385 or combined #379 acceptance, and alignment to later main. Existing decoder controls are not a product rollback. Domain expiry variants are not all native capture variants. These remain parent acceptance limits, not hidden source coverage gaps. This component review does not waive them or approve unpublished #383 changes.

No product/dev/installed server, Browser/Device/Metro, real provider, live userdata, existing user grant, installation, source/index/ref/topology, aggregate status, readiness, blocker, merge, deploy or Issue write occurred. Workspace remains clean at the frozen head/tree. This findings comment is the sole external content write.

Reviewed independently by Codex gpt-6.1-sol, medium reasoning effort, through T3 Code/Codex.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent Claude Opus 5.5 MEDIUM R7 review of PR #555 at 694f80d0783d18847c50337d233bd8b537c8d16a: WHOLE APPROVE (no supported blocking finding).
Why: The R6 expiry-wakeup repair is correct at its existing owners, and a complete read of all 46 changed paths found no new defect. That includes every native test body, the shared fixture and the domain tests, plus the material history.
So what: The parent owns adjudication against the separate Sol R7 verdict, the aggregate status, alignment, clients and final acceptance. One optional test-coverage note follows. This review posts no status or readiness and clears no blocker.

Identity and configuration

  • Base 60c0cc55d09ece9af6dd073f44187f0ec4d31ebc (ancestor verified). Head 694f80d0783d18847c50337d233bd8b537c8d16a, tree c737a76586c6f343be43ed67dccd656ee504ca96, 46 changed paths.
  • Live readback: PR OPEN, head 694f80d, base feat/379-cross-machine-parity at 60c0cc5.
  • Reviewer: Claude Code through T3 Code, claudeAgent / claude-opus-5-5 / effort medium, full-access/default. Read back with t3_thread_configuration and retained as reviewer-configuration.json. I did not author this code or consult the other reviewer.
  • Workspace /home/luke/dev/toolboxmd/chromeria-worktrees/379-review-539-grok: detached at the exact head and clean at start and end. The folder name is historical and has no link to fix(peer): preserve current-main request answering policy #539 or Grok.

Elon record

Requirements and who asked: Approved #379 v5 (read live, including the Design review and its clarification that pending disable material survives unlink/relink) and #384 (read live). The selected seam 6271372731, step 5 of which requires source revoke, expiry, replacement and unlink to persist and forward an exact disable. The commandPlan extension 6272745083. Every R1–R6 finding, response and parent disposition in the R7 packet. Refinement 6268898682 is a sidebar decision and is not consumed by #384.
Deleted: Approval transfer, rerunning the author's 834-test proof, new architecture, re-raising notes the parent dismissed (for example retry backoff and the stale route column), and inventing a finding to justify a verdict.
Bottleneck: The size of the WHOLE scope, about 17k test lines plus about 4k production lines. It was read in full this round.
Checked myself: The full packet, all 46 paths, the surrounding consumers, the pinned Effect timer implementation, one targeted probe, the R6 proof bindings and the hosted CI. Details follow.

R6 repair adjudication (no finding)

  • Deadline view agrees with promotion. nextDisableDeadline (DestinationAutomationAuthority.ts:765-786) unions three sources, each restricted to ack_json IS NULL AND pending=0:

    • the obligation's expires_at;
    • expiresAt of each indexed certificate;
    • the expiry of each indexed auth_sessions row.

    pending (:787-797) promotes exactly the same three predicates at now. Only acknowledge writes pending=0; I grep-checked every write to fork_automation_obligations. So a due deadline is always promoted on the next scan and then leaves the view. There is no expired-deadline hot loop, and nothing resets a promoted row.

  • New grant promotion. It uses revoked_at IS NOT NULL OR expiry<=now for both purposes. Every production path that sets revoked_at (single, bulk and replacement in AuthSessions) already runs invalidateAutomationSessions(...,"revoked"). The only new trigger is therefore genuine session expiry. That is consistent with the destination's own birth and execution claims, which deny an expired local session in checkDestinationSessions. Retirement (setGrant, "retired") still skips birth-only grants.

  • Session renewal. SessionRenewal extends expires_at in place. The worker re-reads the deadline after every wake, so a renewed session simply re-arms later.

  • Driver lifetime (PeerMcpClient.ts:463-490):

    • One scoped worker drains batches; a non-empty batch keeps the 2 s retry.
    • When the batch is empty, it reads the durable deadline and runs raceFirst(Queue.take, Effect.sleep(deadline-now)), or parks on the queue when there is no deadline.
    • A sliding queue of size 1 keeps a wake that arrives between the scan and the wait. Either winner rescans durable storage.
    • Storage failures log and retry after 2 s rather than reading as "no work".
  • Long waits. I checked the installed effect@4.0.5 internal/effect.ts:6306-6331: it chunks sleeps at 2**31-1 ms. A year-9999 permanent-pairing deadline therefore cannot fire immediately.

  • Notifications fire after commit. All four registration sites tap wakeDisables on the outer sql.withTransaction. Neither captureRecord nor captureLegacy runs inside an enclosing transaction, because both perform network ask. Relay sites wake only when a dependency was registered.

  • Shared event instance. server.ts composes PeerMcpClient, EventSink and EnvironmentAuth/AuthSessions under the same layerPeerAuthority, so they share one PeerLinkEvents instance.

  • Proof.

    • red-native.log fails on the cc7 owners: an expected-progress assertion fails, exit 1. red-source-bindings.json blobs equal git rev-parse cc7:<path> for all three owners.
    • The four new native cases assert automatic delivery with no manual drain: reconstruction, a late registration, re-arming to an earlier one, a simultaneous notification and deadline, and cancellation by ACK. The two-hour tail checks attempt counts.
    • The six domain cases cover the 1001 ms boundary for originating, certificate birth/execution and grant birth/execution deadlines.

Whole inspection (no blocking finding)

  • Production, read in full:
    • DestinationAutomationAuthority.ts, as a complete file;
    • the complete PeerAuthority.ts diff (2,315 lines);
    • PeerAuthorityRecord, peerEffectAuthority, EventSink, EffectWorker, PeerLinks, PeerLinkEvents, PeerMcpClient, AuthSessions and server.ts;
    • all MCP union readers: McpHttpServer, McpRouting, McpRequestReceipts, OrchestratorMcpService, linkOrigin, requestIdentity and the three toolkit handlers;
    • ScheduledTaskService and mutationReceipts;
    • ScheduledTaskChecks, engine, state and store;
    • Spectrum LaunchService, RoundService, commandPlan, state and store;
    • shardWeights.json and the three docs.
  • Surrounding consumers traced: bind and returnNotice callers; McpSessionRegistry and ProviderSessionManager forThread().orDie, which EffectWorker captures through Effect.exit; the checked-run retry bound (it stops at needs-you); and the old-reader stamped schema unions.
  • Tests, read as complete bodies:
    • all seven native files: automationSchedules, automationSpectrum, automationContributors, lifecycle, pendingRequests, typedEffects, and the remaining PeerAuthority.workflow.test.ts;
    • PeerAuthority.workflow.fixture.ts;
    • DestinationAutomationAuthority.test.ts;
    • the PeerToolRouting.test.ts and barrier.test.ts diffs.
  • Moved-block check. I compared every moved it block with its base text: 62 of those in the six split files are verbatim, and 20 blocks across all seven files changed.
    • Most changes only rename a decoder or extract a helper.
    • Three changes are substantive: added awaitAutomationPrepared waits; the R1 paused-manual assertions in manual382 (counts 3→4 match the extra message); and the note below.
  • Cleared:
    • conjunction cannot throw for non-envelope inputs, because every non-interactive variant carries generation.
    • The returnNotice rewrite finds at most one row per child, because pair rows are keyed per launched thread.
    • The new descendant===false predicate in directFullAccessPeer is equivalent for interactive records, because descendant is a required boolean.
    • Imported legacy schedules require their live creator on edit. This is the explicit design ("modification requires fresh live authorization"), and the user doc states it.

Optional note (non-blocking test coverage)

PeerAuthority.lifecycle.workflow.test.ts:2147, runtime382-F1: remote keyed manual admission.

  • At base, this test ran A's remote run_scheduled_task_now against a paused ordinary B schedule (enabled:false).
  • Commit 15651f4 added setEnabled({enabled:true}), back when every local save was stamped (Opus R1 F1). R1 removed local stamping, but the workaround stayed. The paused remote positive is now asserted nowhere: manual382 covers only local paused runs.
  • Executed: I replaced that line with expect(...enabled).toBe(false) on an archive of exact 694f. Command, from probe-source/apps/server:
    PATH=<node v24.13.1>:$PATH ../../node_modules/.bin/vp test run --maxWorkers=2 src/peer/PeerAuthority.lifecycle.workflow.test.ts -t "remote keyed manual admission validates outside SQL"
  • Result: exit 0, 1 passed / 31 skipped, Node v24.13.1. The base behavior is intact; only its oracle was weakened.
  • Suggested change: remove the stale line. This is optional and not a requirement.

Executed, reused and unverified

  • Executed: the single probe above. Artifacts are probe-paused-manual.{diff,log,exit,node} and probe-source/ (a git archive of exact 694f with the worktree's node_modules symlinked). No product server, browser, provider, live data or grant was used.
  • Reused, independently verified:
    • Manifest 384-r6-proof.json hashes to 81f16c55dc9c3b3b46ea3648a3251b22258fff4315c94a12c2e6add41eeaf4fd.
    • All 46 component and 43 tested-file working SHA-256 values and HEAD Git blobs match, and the component set equals git diff --name-only base..head.
    • All 89 artifact sizes and digests match.
    • All 17 final-*.exit files read 0, and red-native.exit reads 1.
    • Raw summaries: 186 + 426 + 81 + 48 + 70 (+2 opt-in skips) + 21 + 2 = 834 passed.
    • The server package typecheck header is tsc-rs --noEmit ⊘ cache disabled.
    • This is affected author proof, not CI.
  • Hosted CI, read only: run 39361106103 has head_sha=694f80d… and conclusion success. All eight server shards pass, with a maximum of 7m45s (Server 6), under the 10-minute budget. Lint, Build/Typecheck, Test, Check and Fork Stack Model pass. The parent owns the final CI claim.
  • Packet: the full 494,884-byte packet was read in sequential chunks. Lines 2236–2637 and 2641–2806 were checked by diff to be byte-identical (apart from four heading labels) to the already-read records 1634–2035 and 2042–2207, and were not reread.
  • Unverified: real clients, providers and machines; OS crashes; a rolled-back product binary; the R4-specific Spectrum toggle and broadening variants beyond the existing suites; parent spec: native cross-machine control across linked environments #379 final acceptance.

Proof directory: /home/luke/.local/state/chromeria-379-proof/555-r7-opus55-694f/. No source, index or workspace writes. No status, readiness, blocker, merge or deploy action. All commands have ended. This comment is my only external content write.

Reviewed by Claude Opus 5.5 (medium effort) through Claude Code in T3 Code.

@lukemaj

lukemaj commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

What: Both independent MEDIUM reviews give WHOLE APPROVE to #555 at694f80d0783d18847c50337d233bd8b537c8d16a; exact-head CI and transfer checks pass.
Why: Complete current production, test-body, consumer and material-history inspection supports the selected bounded destination automation and expiry recovery contract.
So what: Integrate this reviewed backend component only into feat/379-cross-machine-parity; retain #384 open and all cumulative/client/latest-main/final-approval gates.

Requirements and who asked: User explicitly authorizes reviewed component merges into the integration branch, requires a different-family independent review, and forbids merge to main/deploy/restart/live-data changes.
Deleted: Approval transfer, main delivery, optional test cleanup before integration and any waiver of final combined acceptance.
Bottleneck: Integrate approved384 once, then align/revalidate unpublished383 against its actual new base before both new reviews.
Checked myself: Full Sol #555 (comment) and Opus #555 (comment); current head/base/tree/mergeability, full five-path repair/proof bindings, complete source/test coverage records, raw Opus paused-manual probe, run39361106103headsuccess and all8serverjobs under600seconds, trusted transfer694fallceilings.

Sol codex/gpt-6.1-sol MEDIUM and Opus claudeAgent/claude-opus-5-5 MEDIUM independently inspected all46 changed paths, complete7native bodies/sharedfixture/domain/consumers/fullmaterialhistory. Both WHOLE APPROVE, no supported blocking finding. No verdict is transferred from a previous candidate. Parent verified source46/test43/raw89bindings and affected834/2skip proof earlier; reviewercompletecoverage/rawnativeproof+CI gateaccepted for internalbackendcomponent. Final actualclients/crossmachine/OScrash/rolled-backproduct/R4Spectrumvariants/385/combined379/mainalignment remain open and unwaived.

Optional Opus note accepted OPTIONAL/UNSELECTED: moved runtime382-F1 test contains stale enable-before-remote-run-now fixture, so lacks the original paused oracle. Reviewer isolatedexact694f probe restores paused expectation and passes1case/31skip, proving currentbehaviorintact, notblockingproductfailure. Preserve as384 testcoverage follow-up and in finalreviewhistory; no current codechange or approvalidentitytransfer.

Exact base60c0cc55d09ece9af6dd073f44187f0ec4d31ebc/head694f80d0783d18847c50337d233bd8b537c8d16a/treec737a76586c6f343be43ed67dccd656ee504ca96. Internal integration only, Issue staysopen/no closinglink. No versionbump perprojectpolicy. Release/deploy workflows requiretags/main; internalpush triggers no installeddeployment. Parent sole topologyowner retains checkpoints/source/proof/reviewworkspaces while subsequent383alignment/finalreview needs them, ownerparent untilfinaloutcome. No processesownedby384/reviewersremain. Main remains untouched.

@lukemaj
lukemaj merged commit 232f820 into feat/379-cross-machine-parity Oct 20, 2026
26 checks passed
lukemaj added a commit that referenced this pull request Oct 20, 2026
* 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
lukemaj added a commit that referenced this pull request Oct 20, 2026
* 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
lukemaj added a commit that referenced this pull request Oct 20, 2026
* 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
lukemaj added a commit that referenced this pull request Oct 20, 2026
* 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
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:XXL 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