Skip to content

Testing plan: everything can be declared away, nothing is declared away quietly

Phase 3 of 4. Derived from the locked requirements.md and design.md. Ticket: issue #179.

This file is executable content. It names commands an agent will run, so review it like code. No credentials are involved: every test runs against temp directories and this repository's own checkout; nothing touches the network.

Test matrix

#TypeIn scope?What it proves
M1Unit — the vocabulary is exactly rightyesR1.1, R1.2: every outer-loop node is skippable except phase-selection (still required: true) and the terminals; asserted as a set equality so a future node cannot be added silently on either side
M2Unit — the invariantyesR1.2, R1.3: phase-selection is required and not skippable; security-review/human-approval are skippable and no longer required; required × skippable is still a compile error (the rule that enforces the invariant)
M3Unit — routing is authoredyesR1.4: the shipped graph compiles (every skippable node declares its on: skipped edge), and each new edge points at the node's ordinary forward successor
M4Unit — skip setsyesR1.5: spec-chain names the seven spec-chain nodes; review-chain names the six review nodes; every member is skippable (compile-checked)
M5Unit — the inner loop is untouchedyesR1.6: pdlc-pr-loop declares no skippable node, has no phase-selection, and keeps security-review required: true
M6Unit — routing end to endyesR1.8: with every selectable phase declared away the pointer runs phase-selection → complete; each intermediate node records outcome skipped; none of their hooks run (no phase label, no log entry, no assignment)
M7Unit — onlyWhenSkipped appliesyesR3.1: the entry gates its fallback artifact when the named artifact is a planned absence (authoring node declared-skipped and absent)
M8Unit — onlyWhenSkipped does not applyyesR3.1–R3.3: skipped-but-present → does not apply; not skipped → does not apply; names an artifact no skippable node authors → never applies; parameter absent → today's behaviour unchanged
M9Integration — the real verification node, plan keptyesR2.1: testing-plan.md locked and complete → pass; its Verification results empty → block. No execution-log section required
M10Integration — the real verification node, plan declared awayyesR2.2: no testing-plan.md and test-planning skipped → blocks naming execution-log.md; once the log carries non-empty Verification results → passes
M11Integration — declared but presentyesR2.3: test-planning skipped and a testing-plan.md present → gated on the plan alone; an empty log section does not block
M12Unit — the checklist copyyesR1.7: with no protected phase the checklist says every phase is selectable and each omission is recorded, instead of printing an empty "always runs" block; the selectable rows still name every skippable node
M13Parity — templates, phases, manifestyesR2.5: test_p5c (every gated section exists in the artifact's template) passes, which it can only once templates/execution-log.md offers Verification results; P1–P5b unchanged
M14Regression — full suite, lint, types, docsyesnothing else moved: pytest, ruff, ruff format --check, pyright, markdownlint, validate_config.py
M15UI/visual, accessibilityn/ano user-facing surface — YAML, Python and markdown only
M16Performancen/aone extra set-membership test per gated node; ten more edges in a ≤ 20-node graph. Nothing hot
M17Migrationn/aadditive: an already-frozen graph keeps walking the phases it froze (a skip is recorded, never inferred), and an in-flight item sees the wider checklist only at a selection it has not yet answered
M18E2E against live GitHubn/ano integration surface changed — the selection gate, its transports and the CLI verb are untouched

Verification environment

This repository's own checkout, nothing else: uv for the environment, pytest from cli/, the linters from the repo root — the same commands CI runs (uv run --directory cli pytest -q, uvx ruff check, uv run --directory cli pyright, npx markdownlint-cli2). No second repo, no service, no secrets; integrations are faked in-process.

Evidence plan

Committed under evidence/:

  • tests.md — the new tests red against the pre-change code (proving they test something), then green, with full-suite counts before and after.
  • walkthrough.md — the motivating scenario end to end: a doc-fix work item declaring spec-chain + review-chain, the-loop check reporting each omission with provenance, and verification blocking until the execution log carries its results.
  • lint-and-types.md — ruff, pyright, markdownlint and config-validation output.

Activities checklist

  • [x] M1–M13 written test-first and failing against the pre-change code where the behaviour is new (record the red in evidence/tests.md)
  • [x] M1–M13 green
  • [x] M14 full regression suite + lint + types green
  • [x] Evidence committed and redacted (no tokens, no hostnames beyond github.com)

Verification results

Executed at the verification node on 2026-08-08. Per-activity record below; raw output in evidence/.

ActivityCommandOutcomeEvidence
M1–M6, M12 vocabulary, invariant, routing, checklistuv run --directory cli pytest -q tests/test_graph_skips.pypass — 46 tests. Red first: five of them failed against the pre-change YAML and checklist (ten nodes unmarked, security-review still required, no review-chain set)evidence/tests.md
M7, M8 onlyWhenSkippeduv run --directory cli pytest -q tests/test_graph_hooks.pypass — 46 tests, four of them new. The three dormancy cases were red before the parameter existed (the entry applied unconditionally)evidence/tests.md
M9–M11 the real verification nodeuv run --directory cli pytest -q tests/test_graph_verification_integration.pypass — 10 tests, three of them new; the plan-declared-away case blocked naming execution-log.md before the section was written, then passedevidence/tests.md
M13 parityuv run --directory cli pytest -q tests/test_graph_parity.pypass — 8 tests; test_p5c red in isolation before templates/execution-log.md offered Verification results, exactly as designedevidence/tests.md
M1/M4 the operator surfaceuv run --directory cli pytest -q tests/test_core_graphs.pypass — 5 tests; the shipped-vocabulary case now declares seven spec-chain nodes and rejects phase-selection rather than security-reviewevidence/tests.md
M14 full suiteuv run --directory cli pytest -qpass — 1480 passed, 1 skipped (baseline 1467 passed, 1 skipped)evidence/tests.md
M14 lint/types/configuvx ruff check cli · uvx ruff format --check cli · uv run --directory cli pyright · npx markdownlint-cli2 over the changed docs · uv run python scripts/validate_config.pypass — all cleanevidence/lint-and-types.md
Walkthrough (the ticket's scenario)the-loop graph skip + a scripted selection-gate run against the shipped graph, then check and the verification nodepass — 13 nodes declared from two tokens with phase-selection refused, pointer at implementation, every omission reported skipped by declaration — by whom, verification blocked until the log carried its results, and a forged declaration on the gate inert and surfacedevidence/walkthrough.md

Released under the MIT License.