Skip to content

docs(internal): forkd snapshot-registry root-cause + operator runbook (fabro-123) - #33

Merged
zenprocess merged 2 commits into
mainfrom
ao/fabro-84/forkd-snapshot-registry
Aug 1, 2026
Merged

docs(internal): forkd snapshot-registry root-cause + operator runbook (fabro-123)#33
zenprocess merged 2 commits into
mainfrom
ao/fabro-84/forkd-snapshot-registry

Conversation

@zenprocess

@zenprocess zenprocess commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Summary

Revision 2 (commit d55855ec) of the documentation half of zenprocess/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 on gated=1 in the poll log. That was wrong on three counts:

  • gated=1 is a gate-attempt count, NOT a verdict. A gate run that returns HTTP 500 still increments gated. The authoritative verdict lives in (a) the GitHub commit status and (b) fabro-gate-health.json.
  • The SHA pairing IS verified: gh api repos/zenprocess/trader/commits/3ed3b8a4…/status returns state=error with the restore_many 400 description at 2026-08-01T08:32:33Z. fabro-gate-health.json corroborates: trader.last_gated_sha=3ed3b8a4…, trader.last_verdict=error, trader.last_success_at=null.
  • 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.

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's lib/crates/fabro-sandbox/* file changes are NOT carried forward because those paths are DEAD after the fabro crate reorg (the sandbox crate now lives under lib/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 -v or curl --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 mode
  • zenprocess/ao-company#121 — the org-wide gate silence; the descriptor-driven poller (commit 258a5f0) restored status posting
  • bin/fabro-github-gate.sh:46 preflight_snapshot() (commit e1b3b5b on ao/fabro-123/snapshot-preflight) — the gate-side companion, NOT re-implemented here
  • docs(internal): forkd snapshot registry truthfulness root-cause + operator runbook (fabro-123) #32 — superseded by this PR

Verification

  • Push landed: git rev-parse HEAD == git ls-remote refs/heads/ao/fabro-84/forkd-snapshot-registry (both d55855ec207a74e57468fcc5e67641ab0e46f3ce)
  • git rev-list --count ao/fabro-84/forkd-snapshot-registry --not --remotes → 0 (no unpushed commits)

🤖 Generated with Claude Code

Referee and others added 2 commits August 1, 2026 13:16
… (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>
@zenprocess
zenprocess merged commit 7f7a94b into main Aug 1, 2026
@zenprocess
zenprocess deleted the ao/fabro-84/forkd-snapshot-registry branch August 1, 2026 10:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant