Tasks: one artifact, several accepted names (issue-124)
Phase 3 of 3. Derived from the approved
bugfix.mdanddesign.md.
Task list
- [x] T1 — Red: the parity test. New
cli/tests/test_graph_parity.pywith P1/P2/P3 (design A6). Written first and confirmed failing: P1 on the untouched tree, because no node acceptedbugfix.md; P3 the moment T7 fixed the name, becausetemplates/bugfix.mdoffered no## Requirements. The two reds arrive in that order by construction — P3 cannot see a template for a name the graph does not yet gate — and together they are the "fixing the filename moves the block one line down" story, caught by the test rather than by a person. Depends on: nothing. Requirements: R5.1–R5.4. - [x] T2 — Red: the alternation and regression tests. Extend
cli/tests/test_graph_model.py(compile-time validation, entries kept verbatim) andcli/tests/test_graph_hooks.py(tests 1–8 of design § Testing strategy). Confirmed failing. Depends on: nothing. Requirements: R1.1–R1.3, R2.1–R2.4, R3.1–R3.2, R6.1. - [x] T3 —
resolve_producesinmodel.py.ALTERNATIVE_SEPARATOR,ArtifactSlot,artifact_names,validate_produces_entry,resolve_produces;_build_nodevalidates every entry. Depends on: T2. Requirements: R1.1, R1.2. - [x] T4 —
validate-artifactsresolves slots. Missing / ambiguous / validate, with the single-name message unchanged. Depends on: T3. Requirements: R2.1–R2.4, R1.3. - [x] T5 —
lint-artifactsuses the shared resolver. Delete the duplicated private_artifact_paths. Depends on: T3. Requirements: R1.1. - [x] T6 —
enforces-boundaries-fromresolvesupstream. Joined bodies when several are present (design A4). Depends on: T3. Requirements: R3.1, R3.2. - [x] T7 —
pdlc.yaml.requirements-definition.produces: ["requirements.md|bugfix.md"]and thedesignnode'supstream. Depends on: T4, T6. Requirements: R2.1, R3.2. - [x] T8 — The bugfix template (RC3).
## Requirementswith EARS criteria nested, keeping reproduction / expected-vs-actual / root-cause. Depends on: T1 (P3 defines the target). Requirements: R4.1, R4.2. - [x] T9 — Green. Full suite, ruff, pyright, markdownlint;
the-loop graph showandthe-loop checkon a realbugfix.mdwork item. Depends on: T3–T8. - [x] T10 — Documentation and the decision record. Manifest note,
SKILL.md,reference/workflow.md,commands/work-on.md,commands/work-status.md,docs/capabilities/process-graph.md,docs/capabilities/spec-workflow.md,docs/decisions/decision-045.md+ index row. Depends on: T7. Requirements: R6.2, R6.3. - [x] T11 — Evidence and reviewer briefing. Execution log sections, capability-doc history rows, the PR briefing. Depends on: T9, T10.
Dependency graph (DAG)
mermaid
flowchart LR
T1[T1 red: parity] --> T8[T8 bugfix template]
T2[T2 red: alternation] --> T3[T3 resolve_produces]
T3 --> T4[T4 validate-artifacts]
T3 --> T5[T5 lint-artifacts]
T3 --> T6[T6 enforces-boundaries-from]
T4 --> T7[T7 pdlc.yaml]
T6 --> T7
T7 --> T9[T9 green]
T5 --> T9
T8 --> T9
T7 --> T10[T10 docs + decision]
T9 --> T11[T11 evidence + briefing]
T10 --> T11Checkpoints
- After T2: both red suites fail for the documented reasons, not for a typo. This is the red half of the red-green record.
- After T7:
the-loop check issue-104 --recomputeresolvesbugfix.mdinstead of demanding arequirements.md— the original reproduction, inverted. That closed spec still blocks, now on the## Acceptance criteria (EARS)heading it was written with in the pre-graph era; per the maintainer's call the five historical bug specs are not retro-fitted (see § Out of scope, and the note inexecution-log.md). - After T9:
uv run pre-commit run --all-filesis clean. - After T11: the-loop's own gate passes on
docs/specs/issue-124/, whose phase-1 artifact is abugfix.md.
Out of scope
Tracked in bugfix.md § Out of scope: retiring bugfix.md (declined), renaming the five existing bug specs (declined), and the six review nodes whose sections: never run (#125).