@thebassclef/lite 1.9.7 → 1.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +6 -2
  2. package/dist/cli.cjs +89 -7
  3. package/dist/cli.js +89 -7
  4. package/dist/index.cjs +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/lite/.claude/hooks/git-stash-u-guard.sh +4 -1
  8. package/dist/lite/.claude/hooks/post-skill-friction-check.sh +6 -1
  9. package/dist/lite/.claude/hooks/pre-commit-gate.sh +18 -6
  10. package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +10 -6
  11. package/dist/lite/.claude/hooks/pre-commit-manifest-autoregen.sh +4 -2
  12. package/dist/lite/.claude/hooks/save-state.sh +24 -0
  13. package/dist/lite/.claude/hooks/trace-helper.sh +29 -0
  14. package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +30 -0
  15. package/dist/lite/.claude/settings.json +1 -1
  16. package/dist/lite/.claude/skills/build/SKILL.md +19 -7
  17. package/dist/lite/.claude/skills/onboard-repo/SKILL.md +41 -0
  18. package/dist/lite/.claude/skills/release-notes/SKILL.md +24 -0
  19. package/dist/lite/bassclef-version.json +5 -5
  20. package/dist/lite/gitignore +8 -0
  21. package/dist/lite/lib/deferred-actions.sh +4 -4
  22. package/dist/lite/lib/fixture-builder.sh +9 -9
  23. package/dist/lite/lib/identifier-leak-check.sh +85 -0
  24. package/dist/lite/lib/preview-state.sh +20 -20
  25. package/dist/lite/lib/skip-env-inline-check.sh +61 -0
  26. package/dist/lite/lib/state.sh +31 -28
  27. package/dist/lite/lib/tier-check.sh +9 -9
  28. package/dist/lite/lib/tier-dependency-audit.sh +23 -23
  29. package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +1 -1
  30. package/dist/lite/standards/lite-manifest-schema-changes.md +38 -0
  31. package/dist/lite/standards/lite-manifest.json +38 -38
  32. package/dist/lite/templates/spec-template.md +10 -6
  33. package/package.json +1 -1
  34. package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
  35. package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +0 -173
@@ -364,15 +364,15 @@ walk_graph_bfs() {
364
364
  while [ -s "$queue_file" ] && [ "$iter" -lt "$max_iter" ]; do
365
365
  iter=$((iter + 1))
366
366
  local next_file; next_file="$(mktemp)"
367
- while IFS= read -r path; do
368
- [ -z "$path" ] && continue
367
+ while IFS= read -r p; do
368
+ [ -z "$p" ] && continue
369
369
  # Skip if visited
370
- if grep -Fxq "$path" "$visited_file" 2>/dev/null; then
370
+ if grep -Fxq "$p" "$visited_file" 2>/dev/null; then
371
371
  continue
372
372
  fi
373
- echo "$path" >> "$visited_file"
373
+ echo "$p" >> "$visited_file"
374
374
  # Extract references from this file
375
- "$extractor" "$path" 2>/dev/null | while IFS= read -r ref; do
375
+ "$extractor" "$p" 2>/dev/null | while IFS= read -r ref; do
376
376
  [ -n "$ref" ] && echo "$ref" >> "$next_file"
377
377
  done
378
378
  done < "$queue_file"
@@ -504,17 +504,17 @@ classify_files() {
504
504
  # tag == target tier → bucket 1 (ships correctly in this tier)
505
505
  # no tag at all → bucket 2a (safe mechanical tag)
506
506
  # tag == other tier → bucket 2b (chain-snap risk; per-file cure)
507
- comm -12 "$intended_sorted" "$actual_sorted" | while IFS= read -r path; do
507
+ comm -12 "$intended_sorted" "$actual_sorted" | while IFS= read -r p; do
508
508
  # Look up tag for path in tags file. Returns "" for untagged (no tab)
509
509
  # or missing entry; returns tier value when tagged.
510
510
  local file_tag
511
- file_tag="$(awk -F'\t' -v p="$path" '$1 == p { print ($2 ? $2 : ""); exit }' "$tags")"
511
+ file_tag="$(awk -F'\t' -v p="$p" '$1 == p { print ($2 ? $2 : ""); exit }' "$tags")"
512
512
  if [ "$file_tag" = "$tier" ]; then
513
- echo "$path" >> "$bucket_1"
513
+ echo "$p" >> "$bucket_1"
514
514
  elif [ -z "$file_tag" ]; then
515
- echo "$path" >> "$bucket_2a"
515
+ echo "$p" >> "$bucket_2a"
516
516
  else
517
- echo "$path" >> "$bucket_2b"
517
+ echo "$p" >> "$bucket_2b"
518
518
  fi
519
519
  done
520
520
 
@@ -557,13 +557,13 @@ classify_files_combined() {
557
557
 
558
558
  # Bucket 1 + Bucket 2 — split intersection by tag presence.
559
559
  # In combined mode, ANY non-empty tag places the file in bucket 1.
560
- comm -12 "$intended_sorted" "$actual_sorted" | while IFS= read -r path; do
560
+ comm -12 "$intended_sorted" "$actual_sorted" | while IFS= read -r p; do
561
561
  local file_tag
562
- file_tag="$(awk -F'\t' -v p="$path" '$1 == p { print ($2 ? $2 : ""); exit }' "$tags")"
562
+ file_tag="$(awk -F'\t' -v p="$p" '$1 == p { print ($2 ? $2 : ""); exit }' "$tags")"
563
563
  if [ -n "$file_tag" ]; then
564
- echo "$path" >> "$bucket_1"
564
+ echo "$p" >> "$bucket_1"
565
565
  else
566
- echo "$path" >> "$bucket_2"
566
+ echo "$p" >> "$bucket_2"
567
567
  fi
568
568
  done
569
569
 
@@ -738,12 +738,12 @@ write_manifest_combined() {
738
738
  # - SDLC trace logs
739
739
  # ---------------------------------------------------------------------------
740
740
  _is_substrate_relevant_path() {
741
- local path="$1"
741
+ local p="$1"
742
742
  # Normalize leading ./ prefix so patterns match consistently.
743
743
  # Closure files mix "./foo" (from find) with "foo" (from git grep).
744
744
  # Per #1385 walker cure — extends G3 filter beyond initial pattern set.
745
- path="${path#./}"
746
- case "$path" in
745
+ p="${p#./}"
746
+ case "$p" in
747
747
  /*|../*|.git/*|*/.git/*) return 1 ;;
748
748
  # Runtime state — walker outputs + gate markers + session state + analysis.
749
749
  # None ship to adopters regardless of tier tag. Per #1385.
@@ -831,12 +831,12 @@ walk_graph_bfs_inbound() {
831
831
  while [ -s "$queue_file" ] && [ "$iter" -lt "$max_iter" ]; do
832
832
  iter=$((iter + 1))
833
833
  local next_file; next_file="$(mktemp)"
834
- while IFS= read -r path; do
835
- [ -z "$path" ] && continue
836
- if grep -Fxq "$path" "$visited_file" 2>/dev/null; then continue; fi
837
- echo "$path" >> "$visited_file"
838
- # Look up callers of $path in the reverse index (path is column 1; caller is column 2)
839
- awk -F'\t' -v p="$path" '$1 == p { print $2 }' "$rev_index" | while IFS= read -r caller; do
834
+ while IFS= read -r p; do
835
+ [ -z "$p" ] && continue
836
+ if grep -Fxq "$p" "$visited_file" 2>/dev/null; then continue; fi
837
+ echo "$p" >> "$visited_file"
838
+ # Look up callers of $p in the reverse index (path is column 1; caller is column 2)
839
+ awk -F'\t' -v p="$p" '$1 == p { print $2 }' "$rev_index" | while IFS= read -r caller; do
840
840
  [ -n "$caller" ] && echo "$caller" >> "$next_file"
841
841
  done
842
842
  done < "$queue_file"
@@ -110,7 +110,7 @@ Unregister-ScheduledTask -TaskName "BassclefAutoSave" -Confirm:$false
110
110
 
111
111
  ## Alternatives
112
112
 
113
- - **WSL2 available?** Skip this doc; use `presence/install/schedule-auto-save.cron.sh` inside WSL. Cron there watches your Windows filesystem via `/mnt/c/Users/...`.
113
+ - **WSL2 available?** Skip this doc; use `presence/install/schedule-auto-save.cron.sh` inside WSL. Cron there watches your Windows filesystem via the mounted `/mnt/c/` tree under your user profile.
114
114
  - **Prefer a .ps1 installer?** File a ticket. The current ship stays doc-only to avoid installer complexity for a population not yet observed. Path B (per-OS installers) upgrade is a follow-on.
115
115
 
116
116
  ## References
@@ -34,6 +34,44 @@ Every entry stays in this file for the life of the manifest. Never pruned. When
34
34
 
35
35
  ## Entries (newest first)
36
36
 
37
+ ### #1777 — friction hook pattern adds stage|launch new skill vocabulary (v1.14.2 → v1.14.3, 2026-10-01)
38
+
39
+ - **Change type:** content-change (1 file: `post-skill-friction-check` hook)
40
+ - **Fields:** 439 entries → 439 entries (no add/remove). Content hash shifts on `post-skill-friction-check` slug (MAJOR_SKILLS_PATTERN regex extended with stage|launch per ADR-040 D1 rename grace window).
41
+ - **Version bump:** v1.14.2 → v1.14.3 (patch — content-only change; no field add/remove; no shape shift). Rebased after #523's retirement-discipline cure landed as v1.14.2.
42
+ - **Rationale:** PR #2028 closes #1777 (friction log never created because hook pattern matched old skill names only). Additive regex extension; grace-window compat preserved (preview|preview-build still match).
43
+ - **Downstream cure:** none — adopters re-sync and the hook starts firing on current-vocabulary chain dispatches. Lazy-create of `docs/session-friction-log.md` happens on first real friction case.
44
+ - **Old shape retired:** old pattern retired `2026-10-31` (grace window end for ADR-040 D1 vocabulary); current pattern keeps both until then.
45
+
46
+ ### #523 — retirement discipline + fixture allowlist pattern (v1.14.1 → v1.14.2, 2026-10-01)
47
+
48
+ - **Change type:** content-change (2 files: `rule/lite-manifest-schema-change-discipline` + `standard/lite-manifest-schema-changes`)
49
+ - **Fields:** 439 entries (unchanged). Content hashes shift on `.claude/rules/lite-manifest-schema-change-discipline.md` (gains a `## Retirements` section covering retirement-class discipline alongside additions) and `standards/lite-manifest-schema-changes.md` (gains the v1.14.0 entry for #1992 that this PR backfilled plus this v1.14.2 entry).
50
+ - **Version bump:** v1.14.1 → v1.14.2 (patch; content-only change on 2 slugs; no schema shape shift; no entry count change).
51
+ - **Rationale:** sunj-labs/bassclef-upstream#523 closed. 4 consecutive main-CI failures 2026-09-29 to 09-30 (SHAs `3c997584`, `02da6b8d`, `924d489f` on `substrate-check-phase`) traced to Test 16 — the Feathers v1.6.1 snapshot guard — seeing 2 entries drop after PR #1992's compat shim retirement. Prior addition-class discipline fired a mechanical ledger-pre-flight gate; retirement-class did not. This PR extends the existing rule with a `## Retirements` section (per Ousterhout contrarian: one rule, two sections) + ships a fixture allowlist pattern (`.claude/hooks/tests/fixtures/2026-09-16-lite-catalog-closure/retired-entries.txt`) + updates Test 16 to subtract allowlist rows before asserting zero drops + backfills the v1.14.0 ledger entry #1992 missed.
52
+ - **Downstream cure:** none — adopters at `~1.14` get the rule content update at next sync. Any adopter authoring a retirement PR going forward follows the `## Retirements` section. Mechanical pre-commit hook (`pre-retire-discipline-check.sh`) deferred to a follow-on PR per Ousterhout (keep this PR scope-tight).
53
+ - **Old shape retired:** none — additive discipline extension.
54
+ - **Protects:** 4 upcoming retirement tickets (#266 S3 → npm move, #108 ADR-020 prototype deprecation, #1142 structural rename sweep, #1999 launch cadence rules) ship under the extended discipline.
55
+
56
+ ### #1992 — compounding-axis compat shim retirement (v1.13.2 → v1.14.0, 2026-09-28)
57
+
58
+ - **Change type:** content-remove (2 entries dropped)
59
+ - **Fields:** 441 entries → 439 entries. Removed entries: `hook/longrun-prep-compounding-axis-check` (`.claude/hooks/longrun-prep-compounding-axis-check.sh`) + `rule/compounding-axis-fresh-analysis` (`.claude/rules/compounding-axis-fresh-analysis.md`). Both were compat shim symlinks from the 2026-07-03 compounding-axis → compounding-sequence rename per PR #611 (bet 2026-07-03b WU-2).
60
+ - **Version bump:** v1.13.2 → v1.14.0 (MINOR — content-remove per bump policy; adopters pinning major stay green, adopters pinning exact version must update).
61
+ - **Rationale:** sunj-labs/bassclef-upstream#1989 — compat shim grace window (ADR-031 default) elapsed on 2026-10-03; harness scanned each symlink twice inflating the rule set at session start. Grep across `standards/bassclef-source-consumers.json` returned zero adopter pins on the old slug, so the shim was defensive dogma rather than adopter-driven. Both symlinks + the duplicate embedding JSON deleted at SHA `9884278f`. Rename targets (`compounding-sequence-fresh-analysis.md` + `longrun-prep-compounding-sequence-check.sh`) stay live under their post-rename names.
62
+ - **Downstream cure:** none for adopters at `~1.13` or `~1.14`. Adopters pinning exact `manifest_version` (bassclef-web#256 + bassclef-cli#51) update pins at the next sync. Any adopter code reading `.entries[]` by legacy `compounding-axis` slug finds nothing — switch reads to `compounding-sequence` sister slugs.
63
+ - **Old shape retired:** immediately. ADR-031 grace window on compat shim ran its full term (2026-07-03 → 2026-10-03); no further compat preservation owed.
64
+ - **Retirement allowlist:** `.claude/hooks/tests/fixtures/2026-09-16-lite-catalog-closure/retired-entries.txt` carries both removed slugs so Test 16 (Feathers v1.6.1 snapshot guard) subtracts them before asserting zero drops. Backfilled by follow-on PR #<this PR> (sunj-labs/bassclef-upstream#523).
65
+
66
+ ### #1777 — friction hook pattern adds stage|launch new skill vocabulary (v1.14.0 → v1.14.1, 2026-10-01)
67
+
68
+ - **Change type:** content-change (1 file: `post-skill-friction-check` hook)
69
+ - **Fields:** 439 entries → 439 entries (no add/remove). Content hash shifts on `post-skill-friction-check` slug (MAJOR_SKILLS_PATTERN regex extended with stage|launch per ADR-040 D1 rename grace window).
70
+ - **Version bump:** v1.14.0 → v1.14.1 (patch — content-only change; no field add/remove; no shape shift).
71
+ - **Rationale:** PR #2028 closes #1777 (friction log never created because hook pattern matched old skill names only). Additive regex extension; grace-window compat preserved (preview|preview-build still match).
72
+ - **Downstream cure:** none — adopters re-sync and the hook starts firing on current-vocabulary chain dispatches. Lazy-create of `docs/session-friction-log.md` happens on first real friction case.
73
+ - **Old shape retired:** old pattern retired `2026-10-31` (grace window end for ADR-040 D1 vocabulary); current pattern keeps both until then.
74
+
37
75
  ### #1961 — persistent statusline for bassclef version + sync status (v1.12.2 → v1.13.0, 2026-09-27)
38
76
 
39
77
  - **Change type:** content-add (1 new entry: `statusline-version` lib) + content-change (2 files: `bassclef-sync` hook + `bassclef-orientation`)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "tier": "lite",
3
- "manifest_version": "1.13.2",
4
- "generated_at": "2026-09-28T01:00:57Z",
3
+ "manifest_version": "1.14.4",
4
+ "generated_at": "2026-10-03T09:49:31Z",
5
5
  "entries": [
6
6
  {
7
7
  "slug": "029-release-pipeline",
@@ -400,7 +400,7 @@
400
400
  "type": "hook",
401
401
  "path": ".claude/hooks/git-stash-u-guard.sh",
402
402
  "tier": "lite",
403
- "content_hash": "sha256:23e45017aa058d6110a327e5e74a70233333b64a0d9c09c5f03549fb58c42add",
403
+ "content_hash": "sha256:d478d64cdda57b9931f558ca8654863b09b48b35794ddadb9f91abe026031d94",
404
404
  "description": "PreToolUse: Bash"
405
405
  },
406
406
  {
@@ -427,14 +427,6 @@
427
427
  "content_hash": "sha256:7cb4c033003b987c4dddc74f9f24d9b28f111ee73622a2fa9f9a34d786191aad",
428
428
  "description": "kiss-expansion-inject.sh — UserPromptExpansion hook that injects"
429
429
  },
430
- {
431
- "slug": "longrun-prep-compounding-axis-check",
432
- "type": "hook",
433
- "path": ".claude/hooks/longrun-prep-compounding-axis-check.sh",
434
- "tier": "lite",
435
- "content_hash": "sha256:9703ca8f6582f5cc2551ea3a22621c2103162c8cdc8ad49940202667c23cb2f6",
436
- "description": "longrun-prep-compounding-sequence-check.sh — Stop hook that fires when"
437
- },
438
430
  {
439
431
  "slug": "longrun-prep-compounding-sequence-check",
440
432
  "type": "hook",
@@ -504,7 +496,7 @@
504
496
  "type": "hook",
505
497
  "path": ".claude/hooks/post-skill-friction-check.sh",
506
498
  "tier": "lite",
507
- "content_hash": "sha256:3e47245950723da47246452ad448e5339e7f0939f9c9c297fa6f43f718ccc170",
499
+ "content_hash": "sha256:6cec7025448fa0b9ab97dbf82e91b53cb39b31c802f292c3f979d6cd44a5ec11",
508
500
  "description": "Post-Skill Friction Check — fires on PostToolUse for Skill tool."
509
501
  },
510
502
  {
@@ -544,7 +536,7 @@
544
536
  "type": "hook",
545
537
  "path": ".claude/hooks/pre-commit-gate.sh",
546
538
  "tier": "lite",
547
- "content_hash": "sha256:6a825617f0cde4d3a77590ad9907667ee181539fee35badce87bfa27fb94a3c1",
539
+ "content_hash": "sha256:52bb9e21ec308a1684ef852cb02988442025c9a70fcad1efe38820829e331b7b",
548
540
  "description": "Observable failure trap — closes bassclef-upstream#1075 (silent-stderr class)."
549
541
  },
550
542
  {
@@ -552,7 +544,7 @@
552
544
  "type": "hook",
553
545
  "path": ".claude/hooks/pre-commit-identifier-leak-scrub.sh",
554
546
  "tier": "lite",
555
- "content_hash": "sha256:38665938cb3bac6d249d94b814cc3f43600456abcbb045bff5a5d0d0128a7cbb",
547
+ "content_hash": "sha256:2c4e842a4a34a706ad4993e15bbc75e62b988aa658e5a871ccee458fe0113a08",
556
548
  "description": "PreToolUse: Bash"
557
549
  },
558
550
  {
@@ -560,7 +552,7 @@
560
552
  "type": "hook",
561
553
  "path": ".claude/hooks/pre-commit-manifest-autoregen.sh",
562
554
  "tier": "lite",
563
- "content_hash": "sha256:b3641c5c2402fdedb9fb23b812548e94809dcc732e8d5e19af4fd5b488b023e0",
555
+ "content_hash": "sha256:f5258e9f6ea636b7043c771b8931bbea270f4bbaad8e239bad31b28df2252fa0",
564
556
  "description": "PreToolUse: Bash"
565
557
  },
566
558
  {
@@ -592,7 +584,7 @@
592
584
  "type": "hook",
593
585
  "path": ".claude/hooks/save-state.sh",
594
586
  "tier": "lite",
595
- "content_hash": "sha256:30487e789b2ed238a8e4915947d0a8ac8c59f44810028dd1bf5ddc0370aa48fb",
587
+ "content_hash": "sha256:b5bd5eb5d0e30f614c8afff6fd57380257413dfa08d7722b0e6e453bfa416e96",
596
588
  "description": "Save State — graceful checkpoint of all work in progress."
597
589
  },
598
590
  {
@@ -680,7 +672,7 @@
680
672
  "type": "hook",
681
673
  "path": ".claude/hooks/trace-helper.sh",
682
674
  "tier": "lite",
683
- "content_hash": "sha256:5e2b01a28c4a259949ef6878905d0692a89e19c2481eb602d38cc96150b663e6",
675
+ "content_hash": "sha256:15c81bba2b25f8d975b806371f6ca71be59e6339bebd9afe2074505c9b9fb436",
684
676
  "description": "SDLC Trace Log helper — sourced by all hooks."
685
677
  },
686
678
  {
@@ -784,7 +776,7 @@
784
776
  "type": "lib",
785
777
  "path": "lib/deferred-actions.sh",
786
778
  "tier": "lite",
787
- "content_hash": "sha256:838e4948aeef589e46519ee47791ded9ec5d5e92a1b8d551520ae493b0566752",
779
+ "content_hash": "sha256:d84e978bb4ec05d57ca5dadaf251fe4415f2759c45c536cb19a2cecbde69d887",
788
780
  "description": "lib/deferred-actions.sh — typed accessor for docs/deferred-actions/"
789
781
  },
790
782
  {
@@ -792,7 +784,7 @@
792
784
  "type": "lib",
793
785
  "path": "lib/fixture-builder.sh",
794
786
  "tier": "lite",
795
- "content_hash": "sha256:5831bcd49c162ec131cf14d402150821bd8f623e87eb3c1bcdc545fc701aaefd",
787
+ "content_hash": "sha256:d4d4a7b4f17abab386b590d616c392a9f8b33934df366c5a505a10ad3bb77b85",
796
788
  "description": "Deep module for adopter-environment fixtures used by bassclef Tier 0 tests."
797
789
  },
798
790
  {
@@ -835,6 +827,14 @@
835
827
  "content_hash": "sha256:022fa4b6f1531813203e499ea84a15a8239ac1772ec506ac1e734b22fd626b5c",
836
828
  "description": "lib/hook-installer.sh — installs a hook file at its declared install-class scope"
837
829
  },
830
+ {
831
+ "slug": "identifier-leak-check",
832
+ "type": "lib",
833
+ "path": "lib/identifier-leak-check.sh",
834
+ "tier": "lite",
835
+ "content_hash": "sha256:5bc5b46f0478817665a77787e9b26997be3452572c7514e5ce540f37a9b9188a",
836
+ "description": "Operator-identifier leak check for staged git content."
837
+ },
838
838
  {
839
839
  "slug": "luminary-pick",
840
840
  "type": "lib",
@@ -872,7 +872,7 @@
872
872
  "type": "lib",
873
873
  "path": "lib/preview-state.sh",
874
874
  "tier": "lite",
875
- "content_hash": "sha256:e5423edd6dd48a3fe7aeaa9d56a2bfa903f706a7144ca1c6119789394d71f2f2",
875
+ "content_hash": "sha256:0e1e0765acfad9826b9a042eed2215eb0c71b8f5f077283a5abab7d8fd40e5e7",
876
876
  "description": "lib/preview-state.sh — typed accessor for docs/preview-state/<slug>.yml"
877
877
  },
878
878
  {
@@ -899,6 +899,14 @@
899
899
  "content_hash": "sha256:d2205a32885bf29420a7f4d420ab2d5994bc73ad2ed9d1faf150bcf8f17a52c4",
900
900
  "description": "lib/session-rescue.sh — sweep resolved session-rescue entries to completed/."
901
901
  },
902
+ {
903
+ "slug": "skip-env-inline-check",
904
+ "type": "lib",
905
+ "path": "lib/skip-env-inline-check.sh",
906
+ "tier": "lite",
907
+ "content_hash": "sha256:88846c09dcf4dd25e048d02338f8c09c1c2dd03be36e101d856d5e3538c83980",
908
+ "description": "SKIP_* env-reach check for PreToolUse Bash hooks."
909
+ },
902
910
  {
903
911
  "slug": "source-graph-walker",
904
912
  "type": "lib",
@@ -912,7 +920,7 @@
912
920
  "type": "lib",
913
921
  "path": "lib/state.sh",
914
922
  "tier": "lite",
915
- "content_hash": "sha256:38b6cfa82123e75bb1046b97887060962a62d90ba9d089764529207ebf8c8194",
923
+ "content_hash": "sha256:c840236de9a217a9d2d92d6be916b8548f1116125af12b68e7ee9f5824886fe9",
916
924
  "description": "lib/state.sh — typed accessor library over bassclef's state spine."
917
925
  },
918
926
  {
@@ -936,7 +944,7 @@
936
944
  "type": "lib",
937
945
  "path": "lib/tier-check.sh",
938
946
  "tier": "lite",
939
- "content_hash": "sha256:c8b5ca9c7af75a49727612792e423ca0209b643039d08cfd99084707043dae75",
947
+ "content_hash": "sha256:33ccb844a171b1334d98a7dceaf13e1a1beb7952072b8d49a3429618dc2a4e26",
940
948
  "description": "lib/tier-check.sh — adopter tier resolution + gate."
941
949
  },
942
950
  {
@@ -944,7 +952,7 @@
944
952
  "type": "lib",
945
953
  "path": "lib/tier-dependency-audit.sh",
946
954
  "tier": "lite",
947
- "content_hash": "sha256:7ee5cc3c7372ca6aef3c81f614ec119ffed8874e00a78d441ce8d0304c7b6308",
955
+ "content_hash": "sha256:aea0c465ff0699e68977e8ff4a80a1f0d3455b9a9f3108888bc82a2eb84a2ee2",
948
956
  "description": "lib/tier-dependency-audit.sh"
949
957
  },
950
958
  {
@@ -1343,7 +1351,7 @@
1343
1351
  "type": "presence-template",
1344
1352
  "path": "presence/install/schedule-auto-save.taskscheduler.md",
1345
1353
  "tier": "lite",
1346
- "content_hash": "sha256:d642cdd842320ba3f7ac714da5cfbd55a594805d3ff3f144de1b7005bb1ebff6"
1354
+ "content_hash": "sha256:fd9dcc8fbcf08a812fc2dfe615c0c173971949fd2799e752fa161160232c3a5d"
1347
1355
  },
1348
1356
  {
1349
1357
  "slug": "agents",
@@ -1520,14 +1528,6 @@
1520
1528
  "content_hash": "sha256:69ae0083d62003eb70442ef3d5fcffd0061723a18da931f823795123ff7fc312",
1521
1529
  "description": "Commit message format — Conventional Commits"
1522
1530
  },
1523
- {
1524
- "slug": "compounding-axis-fresh-analysis",
1525
- "type": "rule",
1526
- "path": ".claude/rules/compounding-axis-fresh-analysis.md",
1527
- "tier": "lite",
1528
- "content_hash": "sha256:256fdb64c4703d7e492527c1dd7dbbed8325baf7c29f0c7c06d10563cc472852",
1529
- "description": "When /longrun prep proposes scope shapes, each shape's compounding-sequence row comes from fresh analysis."
1530
- },
1531
1531
  {
1532
1532
  "slug": "compounding-sequence-fresh-analysis",
1533
1533
  "type": "rule",
@@ -1653,7 +1653,7 @@
1653
1653
  "type": "rule",
1654
1654
  "path": ".claude/rules/lite-manifest-schema-change-discipline.md",
1655
1655
  "tier": "lite",
1656
- "content_hash": "sha256:7d6652791a3e1f4fa6fc33420b90c1f9c0cf379f52bc31b7002ee496064b150d",
1656
+ "content_hash": "sha256:730cde99f460fb259896e9f9aed268b4a116599a5a2b397a92196f95b9d4af5d",
1657
1657
  "description": "Every lite-manifest schema change ships a migration-note ledger entry in the same PR. Adopters read the ledger before sync."
1658
1658
  },
1659
1659
  {
@@ -2226,7 +2226,7 @@
2226
2226
  "type": "skill",
2227
2227
  "path": ".claude/skills/build/SKILL.md",
2228
2228
  "tier": "lite",
2229
- "content_hash": "sha256:ef8f6b7872a29f74e8a9c181ab0b7c24f7c93bfc76b05baaf4cee4703318b10c",
2229
+ "content_hash": "sha256:2abf1366cecf55c6b0e897c4a50fc4fbef0e175dcd9588af54240e98c7f789ea",
2230
2230
  "description": "Take a plan from /launch and ship it. One builder per user story. Runs /verify. Opens PRs. Gates prod on a human. Refuses auth, schema, security, and tenant work. Two modes — full and degrade-with-note.",
2231
2231
  "inputs": [
2232
2232
  "A goal slug pointing to a spec on disk"
@@ -2737,7 +2737,7 @@
2737
2737
  "type": "skill",
2738
2738
  "path": ".claude/skills/onboard-repo/SKILL.md",
2739
2739
  "tier": "lite",
2740
- "content_hash": "sha256:03ff7fd35e3e7219d49ca69366d6e49d735a8e3199a36471a93084bdaf68fedc",
2740
+ "content_hash": "sha256:f6f9a0029ff31f1abb1e56c1fb56c63e0f7569c50eb97136596c2fee62dbd7eb",
2741
2741
  "description": "Bootstrap the bassclef framework in a new repo. Installs the sync hook. Scaffolds config, whereami, and CLAUDE.md. Modes: default, --with-deploy-host, --with-secrets, --full, --greenfield-from-intent (starts a new repo from a short intent paragraph).",
2742
2742
  "inputs": [
2743
2743
  "Optional flags — --with-deploy-host or --with-secrets or --full"
@@ -2902,7 +2902,7 @@
2902
2902
  "type": "skill",
2903
2903
  "path": ".claude/skills/release-notes/SKILL.md",
2904
2904
  "tier": "lite",
2905
- "content_hash": "sha256:4fc630b0a7e318d06da7b2a9fc7a8b7eb3bb3c6582b4f3eb527188f1b5135921",
2905
+ "content_hash": "sha256:21dc6101fc1bb115fb40a4157c7e1592a126d03f3641ec53a1c1d121b0c061ab",
2906
2906
  "description": "Draft a weekly changelog for two audiences — internal team (what shipped) and users (what's new for you). Pushes to Google Docs.",
2907
2907
  "inputs": [
2908
2908
  "Time range or release tag ref"
@@ -3817,7 +3817,7 @@
3817
3817
  "type": "standard",
3818
3818
  "path": "standards/lite-manifest-schema-changes.md",
3819
3819
  "tier": "lite",
3820
- "content_hash": "sha256:312775fd9c55feb4537a4346de309b73a37d8f3c44793aa62f43b14246f3a2cd",
3820
+ "content_hash": "sha256:11d4386e915614b3bc0de53a419e1ce76f4a3ebc0db9436c97c63772ce540a95",
3821
3821
  "description": "Chronological ledger of every lite-manifest schema change. Adopters read this before sync to know what shifted."
3822
3822
  },
3823
3823
  {
@@ -4304,7 +4304,7 @@
4304
4304
  "type": "template",
4305
4305
  "path": "templates/spec-template.md",
4306
4306
  "tier": "lite",
4307
- "content_hash": "sha256:68f85e21426157461613b2fc55dd0e447b1d6d3940b41830dd3b23c7bc2f1365"
4307
+ "content_hash": "sha256:7096d6eb6479d7e4c9034247717675d3bba7d3e2c740c090b117cadf61674915"
4308
4308
  },
4309
4309
  {
4310
4310
  "slug": "use-case-template",
@@ -102,25 +102,29 @@ Based on the answers above:
102
102
  ## Acceptance Criteria
103
103
  How we know it's done. Testable statements.
104
104
 
105
- ## Workunits enumerated
105
+ ## Steps enumerated
106
106
 
107
107
  REQUIRED for specs that feed `/build` (bassclef#335 + bassclef#367).
108
- Each WU traces to one INVEST user story and lands as one stacked-atomic
108
+ Each step traces to one INVEST user story and lands as one stacked-atomic
109
109
  PR. /build's Phase 1 parser greps for this exact section heading.
110
110
 
111
- Format (one entry per WU):
111
+ Per ADR-040 D1 vocabulary rename (grace window through 2026-10-31),
112
+ `/build` also reads legacy specs that use `## Workunits enumerated` +
113
+ `### WU-N` headings — new work writes the step vocabulary below.
114
+
115
+ Format (one entry per step):
112
116
 
113
117
  ```markdown
114
- ### WU-N — <imperative title>
118
+ ### Step-N — <imperative title>
115
119
 
116
120
  **Story refs:** US-NNN[, US-NNN]
117
- **Branch:** feature/<bet-slug>-stack-N-<wu-slug>
121
+ **Branch:** feature/<goal-slug>-stack-N-<step-slug>
118
122
  **Acceptance:**
119
123
  - [ ] <inherited from story; testable; observable>
120
124
  - [ ] <edge case / extension>
121
125
  **Estimated:** ~Nt turns
122
126
 
123
- (per /preview-build Phase 9 contract per bassclef#367)
127
+ (per /launch Phase 9 contract per bassclef#367)
124
128
  ```
125
129
 
126
130
  If the spec doesn't feed `/build` (e.g., bassclef-evolution shaping
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thebassclef/lite",
3
- "version": "1.9.7",
3
+ "version": "1.9.9",
4
4
  "description": "Bassclef CLI — install and upgrade bassclef in your project with two commands.",
5
5
  "keywords": [
6
6
  "bassclef",