8000 Mission loop review fixes (M9.8): restore, unmeasurable and vetoed proposals, block keys by adeelahmad · Pull Request #84 · adeelahmad/aloop · GitHub
[go: up one dir, main page]

Skip to content

Mission loop review fixes (M9.8): restore, unmeasurable and vetoed proposals, block keys - #84

Merged
adeelahmad merged 1 commit into
masterfrom
claude/m9-loop-skill-zkmelo
Oct 20, 2026
Merged

adeelahmad merged 1 commit into
masterfrom
claude/m9-loop-skill-zkmelo

Conversation

@adeelahmad
Copy link
Copy Markdown
Owner

Requested by Adeel · project thread

Before: an adversarial review of mission tick (#75) found 13 ways it could send the loop wrong:

  • After a human baseline restore, it kept asking for a new version that would undo the restore.
  • It handed out "measure it" for versions baseline measure refuses, until the repeat guard blocked.
  • After a veto it said "no baseline yet" and never named the veto.
  • Two different blocks could share one key, so due stayed silent on the second.
  • A fresh checkout forgot a hard ethics line.

After: each of those, and the smaller ones below, is fixed and pinned by a test that failed on the old code.

How.

  • Archived versions. A version that any baseline.confirmed record covered is archived, never a replacement candidate. Only the human's baseline restore brings it back, matching baseline.py.
  • Unmeasurable proposals. A proposed version is checked the way baseline measure checks it (standing_problems, plus each listed journey's journeys.problems, which covers runner-file pins).
    • A listed journey that no longer runs as pinned → DEFINE_JOURNEYS: a journey that supersedes it.
    • Anything else → BASELINE "can no longer be measured: propose a new version", under its own key.
    • Nothing to earn, and the journeys changed since → BASELINE "propose a new version" (it lists them), not DEFINE_JOURNEYS forever.
  • Vetoes. When the newest proposal is vetoed content, the loop says so (by, when, why). The key is bound to the content (bind), so re-proposing it is the same work.
  • Block keys. The ledger block is keyed on its problems. A stalled sprint is keyed on S<n>. A new block always reaches the human.
  • Ledger order. Rows are folded by ts (stable), as the core's records() reads them, so a union merge cannot make an older pick win.
  • Fail closed. A committed, recorded ethics review of tier hard blocks, even when the run log is gone or holds only a clear review.
  • States. A state report counts only with its state.assessed record (as assess.latest does).
  • Resets. Only the grant that lifts "3 failed goals" (GOALS) resets that count.
  • Fingerprint. It now covers spend, reviews, intents, plan approvals, the sprint lock and grants.
  • Docs. ROADMAP's M9.8 row and loop paragraph, TRACKING, CHANGELOG, /aloop:mission rows and the tick docstring are updated. The fresh-checkout claim is narrowed to what the ledger holds.

New gap items (§4.12, one-line reasons):

  • M9.26: sprint history is run data.
  • M9.27: tick trusts eval files.
  • M9.24 now also covers mission.budget_exhausted, so a hit cap survives a fresh checkout.

Evidence.

  • mission-tick.test.py: 27 checks (was 20). The 7 new sections each failed against the previous tick.py, and each now passes:
    • restore → EVALUATE, not BASELINE;
    • mission change while proposed, runner edit, and a raised bar;
    • veto named, with the same key on re-proposal;
    • stall then broken ledger → due exits 3 twice;
    • committed hard review;
    • union-merge order;
    • unrecorded state, the grant scope, and the fingerprint.
  • Every mission-*.test.py, make pycheck and check-tracking pass locally.

Generated by Claude Code

…, block keys

- An archived (once-confirmed) baseline version is never a replacement, so a
  human restore is not undone.
- A proposed version that baseline measure would refuse asks for a new version,
  or a journey that supersedes a listed one that no longer runs as pinned; a
  raised bar after nothing to earn asks for a new version.
- A vetoed content is named (by, when, why) and keyed on the content.
- Every BLOCKED has its own key, so due tells the human each new block.
- The ledger is folded by time; a committed hard ethics review fails closed;
  a state needs its state.assessed record; only the GOALS grant resets the
  failed-goal count; the fingerprint covers spend, reviews, intents, plans,
  the lock and grants.
- Gaps M9.26 (sprint history) and M9.27 (eval trust); M9.24 adds the budget stop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Aw6CiQcdpzdzZZXKf8WbUM
@adeelahmad
adeelahmad merged commit a653fd4 into master Oct 20, 2026
5 checks passed
adeelahmad pushed a commit that referenced this pull request Oct 20, 2026
…eck gets its id

A derived goal's check waits on its ethics review, which is the Ethics
Reviewer's step: area_checks marks those blocks foreign, so the planner's
stop notes them instead of blocking. Gap rows renumbered to M9.30/M9.31.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0197nSutKR1QAAqgJhFZ8fPj
adeelahmad pushed a commit that referenced this pull request Oct 20, 2026
… waits for the human's typed line

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018RxETAY6S1gcmdctBK8a8Z
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

0