Implements SC2/SC3/SC5b/SC7 + additive-field invariant for the v4.2
annotation pipeline:
Fixtures (tests/fixtures/annotation/):
- annotation-brief.md — brief-validator-clean fixture
- annotation-plan.md — plan-validator-clean (2 steps)
- annotation-review.md — review-validator-clean
- annotation-plan-large.md — 51 steps (SC3 scale fixture)
Integration tests:
- tests/integration/annotation-roundtrip.test.mjs — 7 cases:
SC2 byte-identical empty round-trip across brief/plan/review,
SC3 scale (51 steps + 100 anchors) round-trip,
SC7 parseAnchors(stripAnchors(addAnchors(...))) === [] per target.
- tests/integration/schema-rollback.test.mjs — 4 cases:
SC5b validator-FAIL -> revisionGuard rolls back byte-identical
(sha256 invariant) for brief/plan/review + cross-target sweep.
.local.bak deleted on rollback path (validator-PASS path tested
in lib/util/revision-guard tests).
- tests/lib/source-annotations.test.mjs — 6 cases mirroring
tests/lib/source-findings.test.mjs additive-field pattern: each
validator (brief/plan/review) accepts source_annotations as
additive-optional, parser extracts as array of dicts, entries
conform to documented shape, baseline forward-compat (artifacts
without source_annotations still validate).
Verify: node --test tests/integration/annotation-roundtrip.test.mjs
tests/integration/schema-rollback.test.mjs
tests/lib/source-annotations.test.mjs -> 17 pass / 0 fail.
Full npm test: 577 pass / 0 fail / 2 skipped (Docker).
Refs plan.md Step 7 + plan-critic M4 + plan-critic B4.
1.6 KiB
1.6 KiB
| plan_version | profile |
|---|---|
| 1.7 | balanced |
Demo plan for annotation round-trip
This fixture is used by tests/integration/annotation-roundtrip.test.mjs
to verify SC2 (byte-identical empty-anchor round-trip) and SC7 (per-target
isolation against validatePlan).
Context
A minimal plan with two steps. Each step has a Manifest block so
plan-validator --strict accepts the file.
Implementation Plan
Step 1: Touch a sentinel file
- Files:
tmp/sentinel-1.txt(new) - Changes: Create the sentinel file with the literal content "step-1".
- Reuses: none.
- Test first: none — sentinel-only step.
- Verify:
test -f tmp/sentinel-1.txt - On failure: revert.
- Checkpoint:
git commit -m "chore: sentinel step 1" - Manifest:
manifest: expected_paths: - tmp/sentinel-1.txt min_file_count: 1 commit_message_pattern: "^chore: sentinel step 1" bash_syntax_check: [] forbidden_paths: [] must_contain: []
Step 2: Touch a second sentinel file
- Files:
tmp/sentinel-2.txt(new) - Changes: Create the sentinel file with the literal content "step-2".
- Reuses: none.
- Test first: none.
- Verify:
test -f tmp/sentinel-2.txt - On failure: revert.
- Checkpoint:
git commit -m "chore: sentinel step 2" - Manifest:
manifest: expected_paths: - tmp/sentinel-2.txt min_file_count: 1 commit_message_pattern: "^chore: sentinel step 2" bash_syntax_check: [] forbidden_paths: [] must_contain: []
Verification
npm testpasses.- Both sentinel files exist.