fix: honest witness --once exit; participate erasure ergonomics - #12
Merged
Merged
Conversation
witness watch --once (issue #10): a single check that found the phase still open exited 0 with only a textual difference from a real observation, so scripts gated on the exit status reported 'saw the closure notification' when no closure existed. A witness's next step is signing a receipt about what they observed; observing nothing must be distinguishable. --once now exits non-zero with 'no closure observed' when the phase is open, and the role runbook documents the exit contract. participate (issue #11): - The DESTROYED prompt moved from stderr to stdout so a logged or tee'd transcript of the run contains it and automation watching the transcript can respond to it. - destroyed_at is now stamped strictly after the candidate's contributed_at at whole-second resolution, waiting out the shared second when the contribution completed and was confirmed within it (the tiny circuit contributes in under a second, which previously guaranteed 'destroyed_at must be strictly after contributed_at' unless the operator deliberately paused). The strict ordering rule itself is unchanged; the timestamp is read from the candidate's attestation.json and any parse failure falls back to the previous behavior. - 04-role-participate.sh archives a failed attempt's outputs to RUN_ROOT/failed/<phase>-<participant>-<timestamp>/ so the fresh-path checks pass on retry without hand-deleting undocumented paths; nothing is deleted and the local candidate is preserved. Closes #10. Closes #11.
mellowcroc
force-pushed
the
fix/witness-once-and-participate-ergonomics
branch
from
August 20, 2026 17:14
3542607 to
542ebae
Compare
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.
Fixes #10 and #11 (both found driving the scripts against real ceremonies on 2026-08-20).
#10 —
witness watch --oncefalse positive. A single check that found the phase open exited 0, differing from a real observation only in prose — so07-role-witness-watch.sh(which runs underset -eand prints its summary after the command) reported "saw the Relay closure notification" when no closure existed.--oncenow exits non-zero withno closure observed: <phase> is still open; the script's success message is thereby gated byset -ewith no script change needed. Runbook documents the exit contract.#11 — participate ergonomics (all three parts):
/proc/<pid>/fd/0).destroyed_atis read against the candidate'sattestation.jsoncontributed_atand pushed to the next whole second when they'd collide (tiny-circuit contributions complete in <1 s, previously guaranteeingdestroyed_at must be strictly after contributed_atunless the operator deliberately paused). proof-tool's strict-ordering validation is untouched; parse failures fall back to the old behavior. Unit-tested (normal case, same-second case, missing/corrupt metadata fallbacks).04-role-participate.shmoves a failed attempt's outputs toRUN_ROOT/failed/<phase>-<participant>-<timestamp>/on exit, sorequire_fresh_pathpasses on retry; nothing is deleted, the local candidate is preserved, and the operator is told exactly where it went.