voyage/tests/fixtures/annotation/annotation-plan-large.md
Kjell Tore Guttormsen 4562614513 test(voyage): add annotation roundtrip + rollback + source_annotations integration — v4.2 Step 7
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.
2026-05-09 15:13:27 +02:00

1090 lines
28 KiB
Markdown

---
plan_version: 1.7
profile: balanced
---
# Scale plan for annotation round-trip (51 steps)
This fixture is used by tests/integration/annotation-roundtrip.test.mjs to verify SC3 (>=50 steps + >=100 anchors) without breaking the parser at scale.
## Context
Each step is a sentinel-only step with a valid manifest. The plan validates against plan-validator --strict.
## Implementation Plan
### Step 1: Sentinel step 1
- **Files:** `tmp/sentinel-1.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-1".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-1.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 1"`
- **Manifest:**
```yaml
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: Sentinel step 2
- **Files:** `tmp/sentinel-2.txt` (new)
- **Changes:** Create 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:**
```yaml
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: []
```
### Step 3: Sentinel step 3
- **Files:** `tmp/sentinel-3.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-3".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-3.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 3"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-3.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 3"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 4: Sentinel step 4
- **Files:** `tmp/sentinel-4.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-4".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-4.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 4"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-4.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 4"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 5: Sentinel step 5
- **Files:** `tmp/sentinel-5.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-5".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-5.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 5"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-5.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 5"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 6: Sentinel step 6
- **Files:** `tmp/sentinel-6.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-6".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-6.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 6"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-6.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 6"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 7: Sentinel step 7
- **Files:** `tmp/sentinel-7.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-7".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-7.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 7"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-7.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 7"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 8: Sentinel step 8
- **Files:** `tmp/sentinel-8.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-8".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-8.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 8"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-8.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 8"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 9: Sentinel step 9
- **Files:** `tmp/sentinel-9.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-9".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-9.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 9"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-9.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 9"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 10: Sentinel step 10
- **Files:** `tmp/sentinel-10.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-10".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-10.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 10"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-10.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 10"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 11: Sentinel step 11
- **Files:** `tmp/sentinel-11.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-11".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-11.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 11"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-11.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 11"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 12: Sentinel step 12
- **Files:** `tmp/sentinel-12.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-12".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-12.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 12"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-12.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 12"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 13: Sentinel step 13
- **Files:** `tmp/sentinel-13.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-13".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-13.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 13"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-13.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 13"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 14: Sentinel step 14
- **Files:** `tmp/sentinel-14.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-14".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-14.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 14"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-14.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 14"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 15: Sentinel step 15
- **Files:** `tmp/sentinel-15.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-15".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-15.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 15"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-15.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 15"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 16: Sentinel step 16
- **Files:** `tmp/sentinel-16.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-16".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-16.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 16"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-16.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 16"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 17: Sentinel step 17
- **Files:** `tmp/sentinel-17.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-17".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-17.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 17"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-17.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 17"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 18: Sentinel step 18
- **Files:** `tmp/sentinel-18.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-18".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-18.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 18"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-18.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 18"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 19: Sentinel step 19
- **Files:** `tmp/sentinel-19.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-19".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-19.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 19"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-19.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 19"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 20: Sentinel step 20
- **Files:** `tmp/sentinel-20.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-20".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-20.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 20"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-20.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 20"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 21: Sentinel step 21
- **Files:** `tmp/sentinel-21.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-21".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-21.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 21"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-21.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 21"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 22: Sentinel step 22
- **Files:** `tmp/sentinel-22.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-22".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-22.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 22"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-22.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 22"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 23: Sentinel step 23
- **Files:** `tmp/sentinel-23.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-23".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-23.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 23"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-23.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 23"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 24: Sentinel step 24
- **Files:** `tmp/sentinel-24.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-24".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-24.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 24"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-24.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 24"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 25: Sentinel step 25
- **Files:** `tmp/sentinel-25.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-25".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-25.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 25"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-25.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 25"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 26: Sentinel step 26
- **Files:** `tmp/sentinel-26.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-26".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-26.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 26"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-26.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 26"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 27: Sentinel step 27
- **Files:** `tmp/sentinel-27.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-27".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-27.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 27"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-27.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 27"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 28: Sentinel step 28
- **Files:** `tmp/sentinel-28.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-28".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-28.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 28"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-28.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 28"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 29: Sentinel step 29
- **Files:** `tmp/sentinel-29.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-29".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-29.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 29"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-29.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 29"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 30: Sentinel step 30
- **Files:** `tmp/sentinel-30.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-30".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-30.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 30"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-30.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 30"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 31: Sentinel step 31
- **Files:** `tmp/sentinel-31.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-31".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-31.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 31"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-31.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 31"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 32: Sentinel step 32
- **Files:** `tmp/sentinel-32.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-32".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-32.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 32"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-32.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 32"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 33: Sentinel step 33
- **Files:** `tmp/sentinel-33.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-33".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-33.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 33"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-33.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 33"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 34: Sentinel step 34
- **Files:** `tmp/sentinel-34.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-34".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-34.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 34"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-34.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 34"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 35: Sentinel step 35
- **Files:** `tmp/sentinel-35.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-35".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-35.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 35"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-35.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 35"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 36: Sentinel step 36
- **Files:** `tmp/sentinel-36.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-36".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-36.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 36"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-36.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 36"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 37: Sentinel step 37
- **Files:** `tmp/sentinel-37.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-37".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-37.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 37"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-37.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 37"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 38: Sentinel step 38
- **Files:** `tmp/sentinel-38.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-38".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-38.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 38"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-38.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 38"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 39: Sentinel step 39
- **Files:** `tmp/sentinel-39.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-39".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-39.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 39"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-39.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 39"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 40: Sentinel step 40
- **Files:** `tmp/sentinel-40.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-40".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-40.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 40"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-40.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 40"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 41: Sentinel step 41
- **Files:** `tmp/sentinel-41.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-41".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-41.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 41"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-41.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 41"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 42: Sentinel step 42
- **Files:** `tmp/sentinel-42.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-42".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-42.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 42"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-42.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 42"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 43: Sentinel step 43
- **Files:** `tmp/sentinel-43.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-43".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-43.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 43"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-43.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 43"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 44: Sentinel step 44
- **Files:** `tmp/sentinel-44.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-44".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-44.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 44"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-44.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 44"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 45: Sentinel step 45
- **Files:** `tmp/sentinel-45.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-45".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-45.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 45"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-45.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 45"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 46: Sentinel step 46
- **Files:** `tmp/sentinel-46.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-46".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-46.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 46"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-46.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 46"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 47: Sentinel step 47
- **Files:** `tmp/sentinel-47.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-47".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-47.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 47"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-47.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 47"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 48: Sentinel step 48
- **Files:** `tmp/sentinel-48.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-48".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-48.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 48"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-48.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 48"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 49: Sentinel step 49
- **Files:** `tmp/sentinel-49.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-49".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-49.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 49"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-49.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 49"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 50: Sentinel step 50
- **Files:** `tmp/sentinel-50.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-50".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-50.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 50"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-50.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 50"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
### Step 51: Sentinel step 51
- **Files:** `tmp/sentinel-51.txt` (new)
- **Changes:** Create sentinel file with the literal content "step-51".
- **Reuses:** none.
- **Test first:** none.
- **Verify:** `test -f tmp/sentinel-51.txt`
- **On failure:** revert.
- **Checkpoint:** `git commit -m "chore: sentinel step 51"`
- **Manifest:**
```yaml
manifest:
expected_paths:
- tmp/sentinel-51.txt
min_file_count: 1
commit_message_pattern: "^chore: sentinel step 51"
bash_syntax_check: []
forbidden_paths: []
must_contain: []
```
## Verification
- All 51 sentinel files exist.
- npm test passes.