docs(internal): forkd snapshot-registry root-cause + operator runbook (fabro-123) - #33
Merged
Merged
Conversation
… (fabro-123) Writing-FIRST deliverable for zenprocess/ao-company#123 acceptance criterion #4. Records the verified evidence (restore_many 400 on earlier uniforme heads, exec EAGAIN at 2026-08-01T08:32, blast radius from fabro-gate-health.json) and explicitly marks every UNVERIFIED claim with the reason (forkd controller source not local, dellsrv behind egress boundary from this sandbox). The companion operator runbook hands off items 1-2 of the issue to the operator, with T3 maint-window discipline and a token-path-only reference (no token values). The code half (PR fabro-sh#143, gate-side preflight that emits a distinct snapshot-not-registered infra verdict) is already landed on ao/fabro-123/snapshot-preflight in zenprocess/ao-company and is NOT re-implemented here. Cross-referenced in §5 layer 1 and §7 of the design note. Co-Authored-By: Claude <noreply@anthropic.com>
…p, softer token rules (fabro-123 + fabro-122) Orchestrator review of revision 1 caught three errors in the design note. All three are corrected and the most important is promoted to a new §1 Headline section. Design note changes (docs/internal/forkd-snapshot-registry.md): - §1 NEW: Headline — TWO distinct live infra failures with a ~91:1 ratio. Exec-stage EAGAIN (zenprocess/ao-company#122, 1092 occurrences) dominates restore-stage 400 (this issue, 12 occurrences). Both are real; they are different bugs with different fix paths. - §3 NEW: What this worker got wrong in the previous revision (the orchestrator's three corrections, explicit). (a) gated=1 is a gate-attempt count, NOT a success verdict. The authoritative verdict lives in GitHub + fabro-gate-health.json. (b) The trader head 3ed3b8a4 pairing IS verified — gh api returns state=error at 2026-08-01T08:32:33Z with the restore_many 400 description. (c) The "log does not record 3ed3b8a" finding was misleadingly worded — the poll log's posted lines for this slice are uniformly for uniforme, but the trader/foundry verdicts live on GitHub, not in the file. - All section numbers shifted by one (added §1 headline + §3 corrections). - References updated to point at gh api + fabro-gate-health.json as authoritative. Runbook changes (docs/internal/forkd-snapshot-registry-runbook.md): - New §2 covers the exec-stage EAGAIN diagnostic (zenprocess/ao-company#122). Captures controller baseline (ps, /proc/PID/limits, cgroup) and EAGAIN-triggered samples of fd / thread / memory counters. Asks the operator to characterize which resource is exhausted. - §3 (per-tag bootability, was §2) updated; the new EAGAIN step is §2. - §4 (token handling, was §3) softened. The previous revision asserted the token "never lands on a log line because the bash subshell is the only place it is expanded." That was overconfident — shell tracing, error paths, and command capture can expose it. New rules: reference by file path only, confirm shell tracing is OFF, disable shell history capture for the maintenance window, do not paste commands into chat windows or pastebins, do not use curl -v or --trace. - All section numbers shifted. Doc header notes that this PR supersedes zenprocess/fabro PR #32. PR #32 also touches lib/crates/fabro-sandbox/* (DEAD paths post crate reorg; the sandbox crate now lives under lib/components/fabro-sandbox/) — those file changes are NOT carried forward. Co-Authored-By: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Revision 2 (commit
d55855ec) of the documentation half ofzenprocess/ao-company#123.The orchestrator's review of revision 1 (commit
40966cda) caught three errors and asked for three narrow fixes. All three are applied in this revision. This PR supersedes #32 (see "Supersedes #32" below).Files
docs/internal/forkd-snapshot-registry.md(design note)docs/internal/forkd-snapshot-registry-runbook.md(operator runbook)Fixes applied (per orchestrator review)
FIX 1 — corrected trader claim. Revision 1 asserted trader head
3ed3b8a4…"succeeded" based ongated=1in the poll log. That was wrong on three counts:gated=1is a gate-attempt count, NOT a verdict. A gate run that returns HTTP 500 still incrementsgated. The authoritative verdict lives in (a) the GitHub commit status and (b)fabro-gate-health.json.gh api repos/zenprocess/trader/commits/3ed3b8a4…/statusreturnsstate=errorwith the restore_many 400 description at2026-08-01T08:32:33Z.fabro-gate-health.jsoncorroborates:trader.last_gated_sha=3ed3b8a4…,trader.last_verdict=error,trader.last_success_at=null.The headline of the design note (§1 NEW) is the most important correction: there are TWO distinct live infra failures, with exec-stage EAGAIN (
zenprocess/ao-company#122, 1092 occurrences) dominating restore-stage 400 (this issue, 12 occurrences) by ~91:1. The orchestrator's brief to revision 1 asserted "you cannot exec into a VM you failed to restore"; the log refutes that reasoning. §3 of the design note explicitly walks back the three errors in revision 1.FIX 2 — runbook covers BOTH failure modes. New §2 in the runbook covers the exec-stage EAGAIN diagnostic: captures the controller baseline (ps,
/proc/PID/limits, cgroup) and EAGAIN-triggered samples of fd / thread / memory counters. The three-state table (missing / present-but-broken / healthy) is preserved for the snapshot side (§3 in the runbook). The resource-limit question is made explicit (fd / pid / memory) and the pattern (cumulative leak vs fixed ceiling) is captured so the fix shape can be sized.FIX 3 — supersede #32. Doc header explicitly notes that this PR supersedes
https://github.com/zenprocess/fabro/pull/32. PR #32'slib/crates/fabro-sandbox/*file changes are NOT carried forward because those paths are DEAD after the fabro crate reorg (the sandbox crate now lives underlib/components/fabro-sandbox/). Per the orchestrator's instruction, this worker did not merge or rebase #32.Soften the token claim (orchestrator's caution). Revision 1's runbook asserted the token "never lands on a log line because the bash subshell is the only place it is expanded." That was overconfident — shell tracing, error paths, and command capture can expose it. Revision 2's §4 replaces the assertion with explicit handling rules: reference by file path only, confirm shell tracing is OFF before the runbook commands run, disable shell history capture for the maintenance window, do not paste commands into chat windows or pastebins, do not use
curl -vorcurl --trace.Evidence-vs-honesty discipline (what this PR demonstrates)
Every claim is tagged VERIFIED (with log line / API endpoint / JSON file reference) or UNVERIFIED (with the reason). When the orchestrator's review surfaced errors in revision 1, the worker did not bury them; §3 of the design note walks back the three errors explicitly and the doc header notes this is revision 2 of a previous commit on the same branch.
Cross-references
zenprocess/ao-company#123— the issue (this design note's subject)zenprocess/ao-company#122— the exec EAGAIN regression; the dominant live failure modezenprocess/ao-company#121— the org-wide gate silence; the descriptor-driven poller (commit258a5f0) restored status postingbin/fabro-github-gate.sh:46 preflight_snapshot()(commite1b3b5bonao/fabro-123/snapshot-preflight) — the gate-side companion, NOT re-implemented hereVerification
git rev-parse HEAD == git ls-remote refs/heads/ao/fabro-84/forkd-snapshot-registry(bothd55855ec207a74e57468fcc5e67641ab0e46f3ce)git rev-list --count ao/fabro-84/forkd-snapshot-registry --not --remotes→ 0 (no unpushed commits)🤖 Generated with Claude Code