fix(probe): classify EAGAIN-500 on the gate-health probe's exec round-trip (fabro-71) - #34
Open
zenprocess wants to merge 3 commits into
Conversation
Extends the existing gate-health probe to emit a structured
FORKD-GATE-ALERT reason=exec_eagain_500 marker whenever the exec
round-trip response carries the OS-level EAGAIN signature
('os error 11' or 'Resource temporarily unavailable'). The
exec round-trip itself was already in place since fec175a (the
2026-07-22 netns fix); this branch adds the failure-class split
monitoring needs.
WHY: ~91:1 of all observed gate failures (1092 of 1104 in
~/.ao/state/fabro-gate-poll.log) carry this single signature. A
generic exec_nonzero_exit alert cannot distinguish it from a
guest-side failure, so the controller-side fix (retry-with-
deadline on EAGAIN in the read loop, bounded by FABRO_EXEC_TIMEOUT)
has remained unprioritized. The leading HYPOTHESIS — controller
source not local on this box — is captured in
docs/internal/fabro-122-eagain-hypothesis.md §2.
PAIRS WITH: ao-company PR stacking on ao/fabro-123/snapshot-preflight,
which adds the matching gate-side deferral
(FABRO_EAGAIN_MAX_RETRIES budget, EAGAIN-500 retryable
classification in fabro-github-gate.sh cmd_gate). Branched FROM
fabro-71/exec-eagain-control because the probe scripts already
live on that WIP branch.
Co-Authored-By: Claude <noreply@anthropic.com>
Rewrite docs/internal/fabro-122-eagain-hypothesis.md to match the structure and honesty conventions of the merged design note (docs/internal/forkd-snapshot-registry.md, revision 2): - Status header at top (author, related PRs, controller-half scope). - Section 1 Headline — exec EAGAIN dominates by ~91:1 on the exec stage; restore succeeded. - Section 3 Downstream harm — records the operator quote on uniforme PR #1009 'merged 20 minutes after head showed qa-pipeline ERROR', marked UNVERIFIED by this worker (quote is from the issue text, not independently confirmable from this sandbox). - Section 4 Leading HYPOTHESIS — explicitly marked HYPOTHESIS, not finding; cites the verbatim Go os.Errno(11) wording; lists what would promote to confirmed. - Section 5 Client-side defense in depth — three layers (Rust retry already in place on lib/components/fabro-sandbox/src/forkd/mod.rs, gate-side deferral via ao-company PR fabro-sh#145, probe-side classifier). - Section 6 VERIFIED vs UNVERIFIED — explicit split with reasons (egress boundary, no GH_TOKEN, controller source not local). - Section 7 Acceptance evidence — local-only self-test PASS plus bash -n probe plus dry-run. Honest 'could not verify' on the workspace build step: dependency resolution needs a registry fetch that is unreachable from this sandbox (not blocked by my edits). - Section 8 Operator runbook handoff with T3 maint-window discipline, pointing at the operator runbook companion on ao/fabro-84/forkd-snapshot-registry. Docs-only commit. Routes through PR #34. Co-Authored-By: Claude <noreply@anthropic.com>
Adds an explicit STOP callout at the top of doc section 5a (Rust client retry) saying the existing retry is defense in depth, NOT the fix. The remaining 1092-occurrence rate is the tail beyond the client-side envelope; the fix is still the controller-side retry-with-deadline bounded by FABRO_EXEC_TIMEOUT (sections 4 and 8). Also rewrites the cargo section with the actual command output: cargo build -p fabro-sandbox --features forkd fails on daytona-sdk fetch (workspace dep resolved before -p is honored; not a blocker on the edits). Docs-only commit. PR #34 routes this through. 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.
Closes fabro-sh#122
Closes zenprocess/ao-company#122 ACCEPTANCE item 4 (extend the existing gate-health probe with an exec round-trip so this failure class is caught by monitoring, not by users). Pairs with the ao-company PR stack on ao/fabro-123/snapshot-preflight (PR fabro-sh#145).
Evidence
~/.ao/state/fabro-gate-poll.log: ~91:1 ratio ofos error 11(1092) vs the next-largest class (12, snapshot-restore 400).docs/internal/fabro-122-eagain-hypothesis.md.fec175a65 ops(dellsrv): gate-health probe for per_child_netns=true path (#17); this PR adds the failure-class split monitoring needs.What this PR does
Adds an EAGAIN-500 classifier to the existing exec round-trip in
scripts/ops/dellsrv-forkd-supervision/gate-health-probe.sh:exit_code, the raw response body is checked for the OS-level EAGAIN signature (os error 11orResource temporarily unavailable).FORKD-GATE-ALERT reason=exec_eagain_500is emitted BEFORE the existingexec_nonzero_exitmarker.journalctl -t gate-probe | grep exec_eagain_500.The change is local + hermetic — no token or argv changes; it reuses the existing
in_container_curl,alert, andteardown_sandboxinfra. The EXIT trap teardown discipline is preserved (sandbox id scraped before anydie()).Dry-run evidence
In-repo HYPOTHESIS doc (acceptance item 3)
New file
docs/internal/fabro-122-eagain-hypothesis.mdcaptures:FABRO_EXEC_TIMEOUT. MARKED AS HYPOTHESIS with reasons (controller source not local; alternatives not excluded; no live trace).What I could NOT verify live
.service/.timerfor the probe are part of the parentfabro-71/exec-eagain-controlworkflow).Branching / merge order
fabro-71/exec-eagain-control(the WIP branch where the probe scripts live per the brief). Do NOT rebase onto main.fabro-122-eagain-retryable-classification(the matching gate-side deferral).🤖 Generated with Claude Code