Execution Log: test and verification as nodes in the PDLC
Append-only log of progress. The-loop keeps the work item's
loop:<phase>label in sync with thephasefront-matter above.
Phase transitions
| Phase | Entered | Reviewed/approved by | Notes |
|---|---|---|---|
| requirements-definition | 2026-08-06 | pending — on the PR | Six requirements drawn from the ticket's six bullets. Risk tier raised to 4 by autonomy.inferFromChange: the change touches .the-loop/harness-config.yaml and **/*schema*, both autonomy.sensitivePaths. |
| design | 2026-08-06 | pending — on the PR | Six decisions (D1–D6); all three open questions from requirements resolved. Two nodes, one new artifact, no new runtime concepts. D1/D2 revised on PR #166: the plan is reviewed at the design gate. |
| test-planning | 2026-08-06 | pending — on the PR | 15-row matrix, 7 applicable + 8 n/a-with-reason. This work item is the first to carry the artifact it introduces. |
| tasks-breakdown | 2026-08-06 | pending — on the PR | 11 tasks; a 12th (the chain-semantics fix, T11) was added during implementation, see below. |
| implementation | 2026-08-06 | — | All tasks complete. |
| verification | 2026-08-06 | — | All 8 planned activities executed and ticked; results + evidence in testing-plan.md. |
| needs-review | 2026-08-06 | pending | Suite 1328 passed / 1 skipped; ruff, pyright, markdownlint, schema validation clean. Tier 4 (human-approves-pr) plus a named human security sign-off (security.review.humanSignOffMinTier: 4). |
| complete |
Pull requests
| PR | Scope / tasks | Status |
|---|---|---|
| #166 | The whole work item — spec chain, graph nodes, template, configs, tests, docs | open, in review |
Progress entries
2026-08-06 — spec chain drafted (requirements → design → testing plan → tasks)
- Phase: requirements-definition → tasks-breakdown
- Did: Audited how testing actually reaches the loop today and confirmed the ticket's premise:
design.mdcarries one paragraph of strategy,tasks.mda_Test:_per task, and the graph's only test hook (verify-tests) is a no-op unless a node binds a command — which no shipped node does. Everything afterimplementationis about opinion, not proof. Draftedrequirements.md(R1 the plan is a locked artifact, R2 the type matrix withn/a-and-a-reason, R3 verification as a node, R4 evidence captured not described, R5 facilitate-don't-own, R6 one process described once), thendesign.md(D1–D6), then this work item's owntesting-plan.md, thentasks.md. - Key design call (D3):
verificationre-gates the sametesting-plan.mdrather than minting averification-report.md— the produce-then-re-gate shapetasks-breakdown→implementationalready uses fortasks.md. One artifact, one diff, intent beside outcome, and no new template/manifest/parity surface. - Checkpoint/tests: none yet (no code).
2026-08-06 — implementation: two nodes, one artifact, and a defect found on the way
- Phase: implementation → verification
- Did: Executed the DAG.
- T1
skills/the-loop/templates/testing-plan.md— the four gated sections, the 11-type catalogue, the activities checklist, and the two security rules (credentials by reference; redact evidence) written where the author will read them. - T2
pdlc.yaml—test-planning(betweendesign-approvalandtasks-breakdown) andverification(betweenimplementationandself-review), edges rerouted. - T3/T4 manifest entries (
testing-plan.md@test-planning,evidence/optional directory);workflow.phasesenum + default and both harness configs;tokenEconomystage entries so routing does not fall through a hole. - T5/T6 unit + integration coverage, the latter driving the shipped graph over a temp spec folder rather than a fixture graph, because what is under test is the node declarations themselves.
- T7–T10 the skill,
reference/workflow.md,reference/testing.md,reference/context.md, three templates, five commands (two new:create-testing-plan,verify-work), README/guide/architecture phase sequences, the labels report, three capability docs anddecision-060.
- T1
- Defect found while writing T6 (not in the original task list):
run_chainshort-circuited on the first result that was notpass— includingskip. Two consequences: hooks after a skipping one never ran (design'slint-artifactssits behind anenforces-boundaries-fromthat skips whenever the upstream is absent), and a chain ending in a skip routed on the outcome"skip", for which no edge is declared — soimplementation, whose chain ends in averify-teststhat is a no-op unless a command is bound, parked atno_edgeand escalated instead of advancing. Theimplementation → verificationedge this work item adds would have been unreachable. Fixed ingraph/chain.py(a skip is not a decision; the chain runs on past it), covered byTestASkipIsNotADecisionand bytest_implementation_reaches_verification_rather_than_parking, and recorded in decision-060.NodeReport.satisfiedalready treated skip as satisfied — the chain now agrees with it. - Deviation from design, with reason: the design's node sketch listed
verify-testson theverificationnode as a declared seam; it is kept, and is now harmless because of the chain fix. Had the chain fix not landed, that hook alone would have made the new node unable to pass. - Checkpoint/tests: full suite 1326 passed, 1 skipped; ruff, pyright, markdownlint (406 files) and schema validation clean.
2026-08-06 — verification: the plan, executed
- Phase: verification
- Did: Ran all 8 planned activities from
testing-plan.md, ticked each only after its evidence was recorded, and filled the plan's Verification results table with the command, outcome and evidence link per activity. Committed the evidence underdocs/specs/issue-163/evidence/— test summaries, lint/typecheck/validate output, and the seven new scenario rows fromthe-loop scenarios --format markdown. Nothing captured touches a credential, hostname or personal data (the commands are local test runners over this repository), so no redaction was needed — recorded in the plan's evidence section. No activity went unexecuted. - Checkpoint/tests: see
testing-plan.md§ Verification results. - Next: self-review rounds, security review, capability-doc fold-in check, reviewer briefing on the PR.
2026-08-06 — owner feedback on PR #166, actioned
- Phase: needs-review
- Did: Owner answered all four open questions on PR #166:
- Labels —
loop:test-planning(#6f42c1) andloop:verification(#1f883d) created in this repository with the descriptions and coloursdocs/reports/labels-and-dashboards.mddocuments, so the report and the repository now agree. - The skipping-gates gap — filed as issue-167. Enumerating it for the ticket corrected the count I gave in round 1: it is six nodes, not four —
critic-reviewandsecurity-revieware also affected, andsecurity-reviewisrequired: true. A latent second defect rides along:capability-docsgates on aCapability docssection the execution-log template does not offer, invisible only because the node skips. - Fail-closed upgrade behaviour for in-flight items with no
testing-plan.md— confirmed as intended. uv.lock— accepted.
- Labels —
- Checkpoint/tests: no code change;
make lintclean.
2026-08-06 — PR review: one gate for the design and the testing plan
- Phase: needs-review
- Did: Owner asked on PR #166 whether
testing-plan.mdcould be produced withdesign.mdso the design approval gate also covers the plan. Yes — implemented as a reorder rather than a merge:design → test-planning → design-approval → tasks-breakdown.- The plan is still its own node, so it keeps its
phase, itsloop:test-planninglabel and avalidate-artifactscall whosesections:list is about that artifact. Folding it into thedesignnode (the literal suggestion) would have given one sections list for two files, so a missing Test matrix and a missing Architecture would be indistinguishable in the block message. design-approvalnow declaresrecord-feedbacktwice, intodesign.mdand intotesting-plan.md: a reviewer's note about the test matrix belongs in the plan, and feedback travelling with the document it concerns is what the hook exists for.changes-requestedreturns todesign, not totest-planning, so a changed design re-derives the plan on the way back through — the plan can never be approved against a design that moved under it.- Nothing in the config, schema, manifest or template needed to change: node declaration order still puts
test-planningbetweendesignandtasks-breakdown, which is all P4 reads, anddesign-approvalcarries no phase.
- The plan is still its own node, so it keeps its
- Spec updated, not re-stated: requirements R1.1 / out-of-scope / open question 2, design D1–D2, decision-060 (D1, D2 and a new rejected alternative), the skill, the workflow and testing references,
create-design/create-testing-plan/work-on, and three capability docs. - Checkpoint/tests: three new assertions in
TestTestingIsPlannedAndVerifiedAsNodes(the edge order, thechanges-requestedtarget, both feedback targets) — red→green. Full suite 1328 passed, 1 skipped; lint, typecheck, format and validate clean. Evidence re-captured from this second pass.
2026-08-06 — self-review and the ready-to-ship gate
- Phase: needs-review
- Self-review: 3 rounds.
- Correctness of the gates. Checked that each new gate actually runs rather than skipping — which is how
verificationcame to re-declareproduces, and how theskipshort-circuit was found. Re-readvalidate-artifacts: a node with noproducesreturnsskipped, so all six post-implementation nodes that gate on execution-log sections (self-review,critic-review,security-review,evidence,capability-docs,reviewer-briefing) are also skipping today —security-reviewamong them, despiterequired: true. Deliberately left alone — it is a pre-existing gap in issue-109/148 territory, and fixing it means deciding what these nodes validate against (their output is sections of the execution log, not a spec artifact). Not folded into a testing work item; filed as issue-167 at the owner's request on PR #166. This change neither worsens nor depends on it. - Blast radius of the chain fix. The chain-semantics change touches every node evaluation in the product, which is why T6 (full suite) is in the matrix rather than just the graph suites. 1326 pass. Blocking and waiting semantics are untouched; only
skipchanged, and it changed in the directionNodeReport.satisfiedalready assumed. - Minimalism and docs. No new dependency, no new hook, no new runtime concept — two node declarations and one template. Checked that no prose file now redefines the phase sequence:
SKILL.mdandreference/workflow.mdboth still defer topdlc.yaml, and P4 enforces the configs against it.reviews.criticsis empty in this repo's config, so no critic harness was run (recorded per config).
- Correctness of the gates. Checked that each new gate actually runs rather than skipping — which is how
- Security review (gate): see below.
- Capability docs: folded in this PR —
testing-and-contracts.md(the plan and the verification node),spec-workflow.md(the chain and the state machine),process-graph.md(the two nodes and the skip semantics),capabilities.mdindex.
Review cycles
| Cycle | Type (self/critic/security) | Reviewer | Outcome | Link |
|---|---|---|---|---|
| 1 | self | agent | new findings — verification needed produces or its gate would skip | fixed in pdlc.yaml |
| 2 | self | agent | new findings — run_chain short-circuits on skip; implementation cannot advance | fixed in graph/chain.py |
| 3 | self | agent | zero new actionable findings (converged); one pre-existing gap noted for its own ticket | — |
| — | critic | unavailable | reviews.critics is empty in .the-loop/harness-config.yaml, so no critic round ran — it does not count toward criticReviewCount | — |
Security review (gate)
Required before ready-to-ship (
security.review.required). Seereference/security.md.
- Mechanism: the-loop checklist (
security.review.mechanism: auto; no security-review skill invocation was available in this session). - Outcome: pass, with the boundaries recorded rather than mechanised.
- No new ingress. Nothing in this change parses a payload, opens a socket or accepts remote input. The new nodes read checked-in markdown from the work item's own spec folder, through the existing
frontmatter/validate-artifactspath. - No gate weakened.
security-reviewremainsrequired: true; the six post-implementation nodes are intact;verificationsits before the review chain so a failed verification is visible to the reviewers. Asserted bytest_the_shipped_graph_splits_the_needs_review_labelandtest_the_verification_gate_is_not_a_silent_skip. - The chain-semantics change is the one item that warranted real scrutiny, since it alters how every gate's verdict is computed. It only affects
skip:blockandwaitstill short-circuit, a raising hook is still a non-retriable block, and the change makes hooks behind a skipping one run that previously did not — strictly more gate coverage, never less.design'slint-artifactsis the concrete beneficiary. - Two boundaries are touched and handled by convention, not code, which is stated plainly rather than implied: evidence under
evidence/is repository-public and must be redacted before committing, and the plan names credentials by reference only. Both rules live in the bundled template where the author reads them, inreference/testing.md, and in both new commands. Automating redaction is explicitly out of scope (requirements.md§ Out of scope) — a follow-up, not a silent omission. - A testing plan is executable content (it names commands an agent will run) and is reviewed as code, the same footing
reviews.critics[]entries have had since decision-043. It reaches the repository only through PR review.
- No new ingress. Nothing in this change parses a payload, opens a socket or accepts remote input. The new nodes read checked-in markdown from the work item's own spec folder, through the existing
- Human sign-off: pending — effective risk tier 4 (raised by
inferFromChange:.the-loop/harness-config.yamland.the-loop/harness-config.schema.jsonare bothautonomy.sensitivePaths), which is ≥security.review.humanSignOffMinTier: 4. Requested with the PR review.
Final validation evidence
Summarised from testing-plan.md § Verification results (the verification node produced the raw record); committed evidence is under evidence/.
| Requirement | Proved by | Result |
|---|---|---|
| R1 — the plan is a first-class, locked artifact, reviewed at the design gate | test-planning node + P1–P3 parity + 4 integration scenarios + the three shared-gate assertions | pass |
| R2 — the matrix records a decision per testing type | the bundled template's 11-row catalogue and the n/a-with-a-reason rule; this work item's own 15-row matrix is the worked example | pass (review-enforced by design, D5) |
| R3 — verification is a node executed against the plan | verification node, checkmarks: complete gate, 3 integration scenarios, implementation → verification reachability | pass |
| R4 — evidence is captured, not described | three committed evidence files under evidence/, referenced per activity in the results table | pass |
| R5 — facilitate without owning | no runner, orchestrator or dependency added; the environment is a declared markdown section | pass |
| R6 — one process, described once | P4 parity over both harness configs; SKILL.md and reference/workflow.md render the graph rather than redefining it; stage entries added for both new stages | pass |
Suite: 1328 passed, 1 skipped (1322 before). ruff, pyright, ruff format --check, markdownlint (406 files) and scripts/validate_config.py all clean.