Repository navigation
Conversation
…ent (#385) A persisted plan with a manual:* check could not be restored, because the journal proposal never passed the verification-command policy. Every resume then fell back to the fingerprinted plan, where the configured test command was not recognized, so each resume derived a configured-test-<digest> check that collided with the one added before and stopped with 'cannot rewrite frozen check identity'. authorized_bindings now binds journal-proposed manual:<name> commands (fixed grammar) while _is_verification_command still rejects them; prepare_plan recognizes the configured check by its plain command or its command digest; verify_pending never offers a manual check as a verify prefix. docs/verification.md states that manual checks survive resume and that resume is idempotent.
…385) Security review follow-up: only the runtime's configured-test* checks may stand in for the configured test command by digest, so a proposed check carrying the same fingerprint cannot suppress that obligation on resume.
|
Implementation of #385 is published at Security review (
Verification (agent-reported): |
Initial review — #387 (work item #385)[CCR-20261102-001] · senior_reviewer · anthropic/claude-opus-5-5→? · high · schema:2Verdict: Plan: Summary and scopeReviewed the accumulated diff The fix does two things:
Findings[REV-001] · low · open · - · blocks:no — Fallback resume does not assert that result history survives every resume
[REV-002] · low · open · - · blocks:no — Documented manual-name grammar omits the leading-character rule
Security triage and audit
Executed verification (local, on
|
| Command | Exit | Result |
|---|---|---|
python3 -m unittest tests.test_run_cycle.NativeExecutionPlanTests -v |
0 | 22 tests OK, including the 5 new tests |
python3 -m unittest discover -s tests |
0 | Ran 2135 tests in 231.802s, OK (skipped=1) |
python3 scripts/validate-package.py |
0 | VALID: 16 skills (7 cycle, 9 supporting), shared sections in sync, cross-agent manifests aligned |
python3 -m unittest |
0 | Ran 0 tests (no discovery from the repository root; the discover -s tests run above is the real suite) |
Acceptance criteria
| AC | Evidence | State |
|---|---|---|
| AC-1 manual plan restores when its proposal exists | test_restored_manual_check_stays_unverified_and_caps_the_conclusion; test_manual_check_survives_three_resumes_with_stable_identities (proposal=True) — executed, pass |
verified |
| AC-2 restored manual check stays unverified and non-executable | test_restored_manual_check_stays_unverified_and_caps_the_conclusion, test_manual_proposals_bind_without_gaining_execution_authority, test_manual_command_grammar_is_fixed — executed, pass |
verified |
AC-3 three resumes, same identities, no duplicate configured-test-<digest> |
test_manual_check_survives_three_resumes_with_stable_identities (both subtests) — executed, pass |
verified |
| AC-4 results, identities and obligations preserved | Restored path asserts equal results; the fallback path asserts identities and obligations but checks result history only on the first resume (REV-001) | verified_with_reservations |
| AC-5 genuinely unauthorized command still fails restore | test_an_unauthorized_non_manual_command_still_fails_restore — executed, pass |
verified |
AC-6 .code-cycle.yml and allowlist rules unchanged |
git diff --stat 7c0f28b 9d95271 lists 4 files and none of them; static evidence only |
verified (static) |
AC-7 docs/verification.md documents manual-check survival and idempotent resume |
docs/verification.md:311-324 (diff) — static evidence; see REV-002 for a grammar detail |
verified (static) |
Unverified items
- The issue's pre-resume check against a copy of the persisted PR feat(orca): share execution plans in supervised cycles (#330) #384 state was not run: it needs the host telemetry database, which is outside this read-only clone. The new fixture reproduces that plan's shape (configured, agent,
manual:orca-liveandconfigured-test-<digest>checks).
CI
CI policy: parallel (read once, not waited on). All 6 checks on 9d95271 passed:
Skills, manifests, and Bash installer— pass (required)PowerShell installer— pass (required)Windows test shard (windows-1)— passWindows test shard (windows-2)— passWindows test shard (windows-3)— passWindows test shard (windows-4)— pass
No pending, failed, cancelled or skipped check.
Residual risk
- A manual check whose name falls outside the grammar (for example one with a leading
_or a space) still forces the unrestored fallback, which is the documented behaviour for any unbound command (see REV-002 for the doc gap). - On the fallback path, the digest match depends on the configured test command being unchanged. If
allowed_test_commandchanges between resumes, the runtime adds a newconfigured-test-<digest-of-new-command>identity. This is the expected obligation for a new command and is outside this issue's acceptance criteria.
Host-side evidence: recovery of the persisted PR #384 plan (host-verified, not runtime-verified)This comment records a manual check run on the host. It is not a result of the cycle runtime: it does not satisfy the required pre-resume check, does not clear the Tested SHA: Procedure
Result
Final states on All 5 checks read Limits of this evidence
REV-001 (test-coverage gap) and REV-002 (documentation omits the leading-character rule) stay open as low follow-ups. REV-001 changes no behaviour. REV-002 means a name such as |
Human exception to
|
Closes #385
Work item: #385
Diagnosis
manual:*check cannot be resumed.restore_planraisesHistoryError, and the fallback then stopsBLOCKEDwithcannot rewrite frozen check identity, on every later resume.configured-test, an agent check,manual-orca-live(manual:orca-live) and a previously addedconfigured-test-<digest>entry, resumed with--from rereview. Before the change the run stops withcannot rewrite frozen check identity(observed by temporarily removing the digest match fromprepare_planand running the new test).authorized_bindings()only binds journal proposals that_is_verification_commandaccepts, and a manual check is not a runnable command. (2) In the fallback, stored commands aresha256:fingerprints, soprepare_plannever finds the configured check by its plain command and re-derivesconfigured-test-<digest>, whichVerificationPlan.extendrejects against the one added by the previous resume.extend's frozen-identity rule,.code-cycle.ymland the allowlist rules are untouched.Work units
WU-1manual:<name>commands on restore (fixed grammar, still non-executable and never a verify prefix); recognize the configured check by plain command or digest so resume is idempotentscripts/cycle_plan.py,scripts/verification_plan.py,docs/verification.mdtests/test_run_cycle.py(NativeExecutionPlanTests: three resumes with and without the proposal, restored manual check staysunverifiedand caps, unauthorized non-manual still fails restore, binding grammar)python3 -m unittest discover -s tests: 2134 tests OK (1 skipped);python3 scripts/validate-package.py: VALIDDocumentation
docs/verification.mdnow states that manual checks survive resume and that resume is idempotent.README.mdis unchanged because no skill or entry point was added or removed.Verification (agent-reported)
python3 -m unittest discover -s tests— exit 0, 2134 tests, 1 skipped.python3 scripts/validate-package.py— exit 0,VALID: 16 skills.python3 -m unittest— exit 0, 0 tests (no discovery from the repository root;discover -s testsabove is the real run).Local run shares with CI: no use of the global Git identity or host credentials by the new tests.