Repository navigation
GREEN's dependency check reads only the plan text the human's grant pins (M0.9, M10.2) - #113
Conversation
…ins (M0.9, M10.2) A reviewed grant now records the plan file by file (and keeps the approved text); under an autonomy grant the plan is the one the planner's gate passed on the planner's stop (`plan.gated`, `ids gated`, gate-owned). `deps unplanned` reads only that text, so text added after the grant names no dependency and a re-plan does not undo an approved one. The approved plan now covers the sprint's intake.md and standards.md too. Tests: supply-chain.test.py 2-2e, plan-approval.test.py 4 and 21; 16/16 mutants killed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WBVFNrEg85XAnSfHQidCXN
…follow-up Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WBVFNrEg85XAnSfHQidCXN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WBVFNrEg85XAnSfHQidCXN # Conflicts: # plugin/bin/README.md
…s second On a fresh checkout a typed line from the same second as an earlier human decision counts as older (stale_before), so on a fast runner the raise-the-cap approval asked again and the test failed. The human now types after that second, as a clone's human always does. Reproduced with a frozen clock. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WBVFNrEg85XAnSfHQidCXN
|
The After 15b9022 fixes it: before the human types the line, the test waits until the clock passes the last ledger row's second, as a clone's human always would. The gate is unchanged. Local run on fe17696, master #112 merged in: lint 0, Generated by Claude Code |
…sh-clone stop) into the M9.31 branch ROADMAP: the M9 row keeps this branch's done/open lists and adds M9.42 (done in #114) and M9.48 (open); the M10 row takes master's fresh-clone stop and says the OpenCode plugin exports ALOOP_AGENT_SHELL since M9.31. aloop.js: the SubagentStart comment names both the core principles and the artifact gate's per-task start. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012rsDo9GYzNx8tXucywZHnA
Requested by Adeel · project thread
Before: GREEN's check for an unplanned dependency (M10.2) read the story's plan files as they were when GREEN stopped, whatever the human had approved. The approved plan (M0.9) left out the sprint's
intake.mdandstandards.md. A re-plan that touched a story file could also make a dependency the human approved count as unplanned.After: a dependency counts as planned only in the text the human's grant pins. Under review that is the plan they approved. Under their autonomy grant it is the plan as the planner's gate last passed it on the planner's stop. It counts as it was then, so text added later names nothing, and a re-plan does not undo an approved dependency. The approved plan now also covers the sprint's
intake.mdandstandards.md.When nothing pins the text, the block says why: no approval yet, a grant that does not hold, an approval recorded before per-file pins, or an autonomous sprint whose plan has not passed the planner's gate yet.
How
plugin/bin/_approval.py:file_sha256, the plan's files one by one, and keeps their text in run data under each sha256. A copy counts only while it still hashes to its name.pinned(cwd, sprint)returns(files, why)from the sprint's newest grant. A reviewed grant pins its approved files, provided it holds and its per-file hashes add up to the plan its code names. An autonomy grant pins the newestplan.gatedof that sprint, provided the grant holds.SPRINT_FILESnow includesintake.mdandstandards.md. An approval recorded before that says so, instead of reporting "the plan changed".plugin/bin/ids gated SPRINT_DIRrecordsplan.gated(the files' sha256, with their text kept). It needs the planner's stop payload on stdin.gate-stage2-completeruns it last when the planner's stop passes, never on a self-check.plan.gatedis a new event type, andevents emitrefuses it.plugin/bin/deps unplannedreads only pinned text: the story'stasks.md,targets.json,plan.mdandvalidate.md, and the sprint'sstories.md, by realpath. Its note names the files whose text changed since the pin.scripts/test/mission-tick.test.pycheck 30: on a fresh checkout the human now types the raised cap's approval after the second of the last ledger record. A line from that second counts as older (stale_before, unchanged), so on a fast runner the test asked again and failed (CI on 86cbe9b; reproduced on master's test with a frozen clock).plugin/bin/README.md: theids,depsandgate-stage2-completerows.Evidence
scripts/test/supply-chain.test.py, now 8 checks:tasks.mdgrowing a task, keeps the approved dependency. A dependency only the new text names is refused.ids gated, a builder's payload, a self-check andevents emit plan.gatedrecord nothing.stories.md, admits it.scripts/test/plan-approval.test.py, now 21 checks:intake.mdandstandards.md.events approval, and the review showed that missed autonomy mode._approval.py,deps,ids,eventsandgate-stage2-complete, each dropping one check. The two suites killed all 16, and the unpatched control passes.DSH_BIN=… ALOOP_REQUIRE_DSH=1 make test-hostsexits 0, including the pinned dsh runtime suite.make conformancepasses 82/82.make shellcheck,make pycheckand eval-validate are clean. CI: all 5 jobs green.🤖 Generated with Claude Code
https://claude.ai/code/session_01WBVFNrEg85XAnSfHQidCXN