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.
1090 lines
28 KiB
Markdown
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.
|