Skip to content

feat(dev-loop): require live behavioral proof, not just review - #1075

Merged
aaronjmars merged 2 commits into
mainfrom
feat/dev-loop-live-proof
Sep 18, 2026
Merged

aaronjmars merged 2 commits into
mainfrom
feat/dev-loop-live-proof

Conversation

@Svector-anu

Copy link
Copy Markdown
Contributor

why

a clean review only proves the diff. nothing in dev-loop has ever launched the thing it built. review reads code and checks ci status - that's it.

what

adds create-prove: after review (and the bounded repair pass, if one ran) comes back clean, it dispatches the changed skill for real at the pr's immutable head, waits for a completed run, and requires a sha-bound aeon-proof receipt before the chain reports success. no receipt, no claimed success - chain_status=proof-missing instead.

proof-missing is excluded from skill-health's lifetime ratio, same as no-action/invalid-dispatch. reasoning: create-prove's v1 scope is narrow (aeon-shaped prs that change exactly one skills/<slug>/skill.md, nothing else), so most real feature prs will land here every run, and that's not evidence of a regression.

scoped on purpose:

  • aeon-shaped prs only, one changed skill file
  • no conventional app launching (out of scope for v1)
  • no guessing which skill represents a workflow-only change
  • unsupported shapes fail closed, no receipt posted
  • never proves itself recursively

two real gaps this needed, fixed along the way:

  • codex couldn't write to aeon's notification staging dir outside the checkout (--add-dir), so a proof run that needed to notify silently lost its queued payload
  • dev-loop's max_dispatches bumped 4 -> 5 for the new proof step

verification

$ bash scripts/tests/test_dev_loop_proof.sh
dev-loop live proof tests passed

$ bash scripts/tests/test_chain_runner_no_action.sh
ALL PASS

$ bash scripts/tests/test_dev_loop_repair.sh
dev-loop repair gate tests passed

$ node scripts/validate-config.js
config: CLEAN

$ python3 -c "import yaml; [yaml.safe_load(open(f)) for f in ['.github/workflows/chain-runner.yml','.github/workflows/ci-tests.yml','.github/workflows/aeon.yml','aeon.yml']]"
[exit 0]

catalogs regenerated (bin/generate-skills-json, bin/generate-packs-json) to pick up the new skill.

live-tested on a real fork before this was written down as working: dispatched create-prove for real, got a genuine sha-bound receipt, confirmed the target branch head never moved during the proof run. also independently reviewed on that fork before landing here - the first pass caught a real bug (the commit-skip guard never engaged because the nested dispatch didn't set the prove- prefix it checks for), fixed and re-verified before this port.

a clean pr-review pass proves the diff, not the behavior. dev-loop has
never run the thing it built - review just reads code and checks ci.

adds create-prove: after review (and the bounded repair pass, if it
ran) succeeds, it dispatches the changed skill for real at the pr's
immutable head, waits for a completed run, and requires a sha-bound
aeon-proof receipt before the chain can report success. no receipt,
no claimed success - chain_status=proof-missing instead, excluded
from skill-health's lifetime ratio the same way no-action/invalid-
dispatch already are, since create-prove's v1 scope (single
skills/<slug>/skill.md prs only) means most real feature prs will
land here every run and that's not evidence of a regression.

scoped narrowly on purpose: aeon-shaped prs only, one changed skill
file, no conventional app launching, no guessing which skill
represents a workflow-only change. unsupported shapes fail closed
without posting a receipt. never proves itself recursively.

also fixes two real gaps this needed:
- codex couldn't write to aeon's notification staging dir outside the
  checkout (--add-dir), so proof runs that need to notify were
  silently missing their queued payload
- bumped dev-loop's max_dispatches 4 -> 5 for the new proof step

live-tested against a real repo before this was written down as
working: dispatched create-prove for real, got a genuine sha-bound
receipt back, confirmed the target branch head never moved.
ci caught both: README/skill-packs.md still said 82 skills, and
create-prove had no eyebrowlock.json entry yet (needs the real
eyebrow binary, not available in the sandbox that wrote the previous
commit).
@aaronjmars
aaronjmars merged commit 1d183dc into main Sep 18, 2026
10 checks passed
@aaronjmars
aaronjmars deleted the feat/dev-loop-live-proof branch September 18, 2026 16:32
aaronjmars added a commit that referenced this pull request Sep 18, 2026
Follow-up nits from reviewing #1075/#1076/#1077 (all merged):

- aeon.yml "Commit read-only failure log" step now also skips prove-*
  dispatches. A proof run re-runs a read-only skill on the PR's attested
  head branch; on a failed run this step would commit memory/logs and push
  a stray commit onto the very head the proof must not move. The sibling
  "Commit results" step already had this guard; this closes the asymmetry.

- telegram-route.sh dev-loop target regex tightened from (#[0-9]+)? to
  (#[1-9][0-9]*)?, matching the workflow validator (dev-loop-pr.sh). The
  router no longer accepts #0 / zero-padded refs that the workflow would
  reject downstream, wasting an Actions run. Header side-effects note now
  mentions the chain-runner.yml dispatch path.

- test_idea_pipeline_dev_loop_offer.sh: the pick: no-force-reply guard was
  vacuous - its sed range start pattern omitted the backticks around ${var}
  that SKILL.md actually has, so it captured 0 lines and could never fail.
  Fixed the pattern (now captures the block, still passes).

- test_telegram_route.sh: added a regression case asserting a #0 issue ref
  is rejected at the router edge.
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.

2 participants