8000 Lifting a mission block is the human's typed line, kept in the ledger (M9.51) by adeelahmad · Pull Request #93 · adeelahmad/aloop · GitHub
[go: up one dir, main page]

Skip to content

Lifting a mission block is the human's typed line, kept in the ledger (M9.51) - #93

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

adeelahmad merged 3 commits into
masterfrom
claude/m9-loop-skill-zkmelo

Conversation

@adeelahmad
Copy link
Copy Markdown
Owner

Requested by Adeel · project thread

Before: after M9.17 (#82), every mission grant needed the human's typed line, except one. aloop mission tick --force --by Adeel still lifted a block (the repeat guard, or 3 failed goals in a row) on --by alone. The lift was also run data, so a fresh checkout blocked again (M9.24's open --force part).

After: tick --force --by asks (exit 3) for the human's own line, lift <mission> <code>, just like approve or confirm. When they have typed it, the lift is recorded as a mission.lifted ledger row. --by alone, a lift only the run log has, a replayed lift, a negated line, another code, an old line and a line typed for an earlier block all lift nothing. A fresh checkout keeps a lifted block lifted.

How:

  • The grant (plugin/bin/_mission.py, _events.py): mission.lifted is an APPROVAL_EVENTS entry (subject: the mission) with verb lift in GRANT_VERBS. M9.17's provenance, cites and staleness rules therefore apply unchanged, and events emit mission.lifted is gate-owned.
  • The code names one block (tick.py, lift_of): the digest covers four things:
    • the mission;
    • the block's key;
    • how many lifts of that key the ledger has;
    • the occurrence: for a repeat, the handout tick that tripped it; for 3 failed goals, the newest of those goals.
  • Reading lifts: facts counts a lift only when its row's sha matches those fields.
    • The repeat guard restarts at the lift row's own run-log event, and only at its first copy.
    • The 3-failed-goals count resets only up to the goals the human lifted, whatever --now said.
    • The old run-data FORCE reset is gone.
  • /aloop:mission: a lift is listed among the typed grants. The BLOCKED row names the lift … line, and there is one new skill eval.
  • Docs: ROADMAP adds M9.51 (done); M9.24 keeps only mission.budget_exhausted open. The §4.12 prose, the M9.8 and M9.12 rows, TRACKING, CHANGELOG and plugin/mission/README.md are updated.

Review. An adversarial review (4 lenses) found three ways an old or copied lift still worked:

  • a run-log tick carrying an old lift's sha;
  • a line typed for a block that then cleared by itself, used on the next block of the same action;
  • a 3-failed-goals reset taken from the caller's --now.

Each one now has a test that fails on the first commit and passes on the second.

Evidence:

  • mission-tick.test.py check 30, new. Each part failed on the old code (run separately):
    • --force --by alone exits 0 on master;
    • the replayed lift, the stale line and the far --now each lift on the first commit;
    • a fresh checkout blocks again on master.
  • mission-skill.test.py check 8, new.
  • All 15 mission-*.test.py suites pass (tick 30, skill 9, e2e 8, core 13), as do make pycheck eval-validate and scripts/check-tracking.py (82 requirements).

Generated by Claude Code

… (M9.51)

`aloop mission tick --force --by` now asks (exit 3) for the human's own
`lift <mission> <code>` line, the code bound to that block's key and how
many times it was lifted, and records a mission.lifted ledger row. The
repeat guard and the 3-failed-goals count restart only after a lift the
ledger has, so --by alone, a run-log-only lift or an old line lift
nothing, and a fresh checkout keeps a lifted block lifted (M9.24's first
part). /aloop:mission relays every grant's ASK line verbatim.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Aw6CiQcdpzdzZZXKf8WbUM
…1 review)

A review found three ways an old or copied lift still lifted a block:
a run-log tick carrying an old lift's sha, a line typed for a block
that then cleared by itself, and a 3-failed-goals reset taken from the
caller's --now. The lift code now digests the occurrence too (the
handout that tripped a repeat, or the newest failed goal), a repeat
restarts only at the lift row's own run-log event (its first copy),
and the goals reset reaches only the goals the human lifted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Aw6CiQcdpzdzZZXKf8WbUM
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Aw6CiQcdpzdzZZXKf8WbUM
@adeelahmad
adeelahmad merged commit c85f6dc into master Oct 20, 2026
5 checks passed
adeelahmad pushed a commit that referenced this pull request Oct 20, 2026
adeelahmad pushed a commit that referenced this pull request Oct 20, 2026
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