@thebassclef/lite 1.4.0 → 1.5.1

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 +1 -1
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/lite/.bassclef-source.json +2 -2
  6. package/dist/lite/.claude/hooks/_lib/wirings.sh +237 -0
  7. package/dist/lite/.claude/hooks/pre-commit-manifest-autoregen.sh +212 -0
  8. package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +66 -6
  9. package/dist/lite/.claude/hooks/session-reflection.d/20-artifact-staleness.sh +25 -5
  10. package/dist/lite/.claude/hooks/session-reflection.d/30-metrics-staleness.sh +11 -0
  11. package/dist/lite/.claude/hooks/session-reflection.d/60-deferred-actions.sh +2 -1
  12. package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +20 -0
  13. package/dist/lite/.claude/hooks/session-reflection.d/tests/20-artifact-staleness.test.sh +89 -0
  14. package/dist/lite/.claude/hooks/session-reflection.sh +12 -1
  15. package/dist/lite/.claude/luminaries/david-farley.md +115 -0
  16. package/dist/lite/.claude/luminaries/jez-humble.md +124 -0
  17. package/dist/lite/.claude/luminaries/martin-fowler.md +18 -0
  18. package/dist/lite/.claude/skills/longrun/SKILL.md +51 -0
  19. package/dist/lite/.claude/skills/onboard-repo/SKILL.md +39 -11
  20. package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +2 -2
  21. package/dist/lite/lib/ancestor-claude-check.sh +101 -0
  22. package/dist/lite/lib/fixture-builder.sh +324 -0
  23. package/dist/lite/lib/mechanism-fidelity.sh +14 -0
  24. package/dist/lite/lib/workflow-metrics.sh +166 -0
  25. package/dist/lite/presence/install/bassclef-configs.template.jsonc +76 -0
  26. package/dist/lite/presence/install/bassclef-sync.template.sh +7 -4
  27. package/dist/lite/scripts/generate-lite-manifest.sh +151 -1
  28. package/dist/lite/scripts/workflow-metrics-query.sh +57 -0
  29. package/dist/lite/standards/lite-manifest-schema-changes.md +24 -0
  30. package/dist/lite/standards/lite-manifest.json +82 -71
  31. package/dist/lite/standards/mechanism-fidelity.md +1 -0
  32. package/dist/lite/standards/substrate-config-schema.md +2 -2
  33. package/package.json +1 -1
  34. package/dist/lite/.claude/skills/journal-export/SKILL.md +0 -293
  35. package/dist/lite/.claude/skills/release/SKILL.md +0 -311
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "tier": "lite",
3
- "manifest_version": "1.8.5",
4
- "generated_at": "2026-09-18T12:53:51Z",
3
+ "manifest_version": "1.9.4",
4
+ "generated_at": "2026-09-21T12:32:12Z",
5
5
  "entries": [
6
6
  {
7
7
  "slug": "029-release-pipeline",
@@ -104,7 +104,7 @@
104
104
  "type": "hook",
105
105
  "path": ".claude/hooks/session-reflection.d/08-settings-drift.sh",
106
106
  "tier": "lite",
107
- "content_hash": "sha256:610c46bab04ca47af207824cc5faa24c7754c00b976b71d9be77057e9ea87a63",
107
+ "content_hash": "sha256:8c2884630f16301023b943b08f8e12b17eb1d7ea6e04bec838198dca2ec0ba05",
108
108
  "description": "Drift detector — fires at every SessionStart via session-reflection.sh."
109
109
  },
110
110
  {
@@ -136,7 +136,7 @@
136
136
  "type": "hook",
137
137
  "path": ".claude/hooks/session-reflection.d/20-artifact-staleness.sh",
138
138
  "tier": "lite",
139
- "content_hash": "sha256:5a406be60669e106c99e98da00d7acb8e9ce834a84e1145d244f5121cfd0f9a9",
139
+ "content_hash": "sha256:24d1c0513b88bde625ab0bdbd7e4bd6678cdfc47ba76900bc06e3fbfe543f24c",
140
140
  "description": "Artifact-staleness checks: chronicle, danger-mode summary,"
141
141
  },
142
142
  {
@@ -144,7 +144,7 @@
144
144
  "type": "hook",
145
145
  "path": ".claude/hooks/session-reflection.d/30-metrics-staleness.sh",
146
146
  "tier": "lite",
147
- "content_hash": "sha256:6a296054a37741db7a9161a11e8582ce31f489f8fb1683d3c2cf2daf981242a7",
147
+ "content_hash": "sha256:a4b2f436c218c15230c126fa2f2748fca36cdf9778185cab90a8aac4a6416f41",
148
148
  "description": "Metrics-staleness check: version tags, iteration closeouts, metrics"
149
149
  },
150
150
  {
@@ -208,7 +208,7 @@
208
208
  "type": "hook",
209
209
  "path": ".claude/hooks/session-reflection.d/60-deferred-actions.sh",
210
210
  "tier": "lite",
211
- "content_hash": "sha256:b119d0700df5823afeed631a6f4ddfb9cb0f302577e3b3977a30c8ddb85acd60",
211
+ "content_hash": "sha256:ae167ab6b1626b9155a0539618678ca7a08d1f619cb054f94476df3ad9f7dff9",
212
212
  "description": "Deferred-actions scan: enumerate docs/deferred-actions/*.md, detect current"
213
213
  },
214
214
  {
@@ -232,7 +232,7 @@
232
232
  "type": "hook",
233
233
  "path": ".claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh",
234
234
  "tier": "lite",
235
- "content_hash": "sha256:4467390bb6f7dfa418c799ce175a9febc395e3b883c720c562e2c42ffdb1ff81",
235
+ "content_hash": "sha256:9f20ebd080a1a7364fe6e6c16266547b56b95c820297310cdd5be559852bab5f",
236
236
  "description": "Hook heartbeat check — reads standards/hook-cadence.json, calls"
237
237
  },
238
238
  {
@@ -339,14 +339,6 @@
339
339
  "content_hash": "sha256:6981fedc02dc0b683db7872519e06bd16b68fd346a2e566a7e8503f28822db10",
340
340
  "description": "bassclef-source-config-validate.sh — PreToolUse hook validating"
341
341
  },
342
- {
343
- "slug": "bassclef-sync",
344
- "type": "hook",
345
- "path": ".claude/hooks/bassclef-sync.sh",
346
- "tier": "lite",
347
- "content_hash": "sha256:03c813d942e42a8a4a37744e3cb14219fa4364ce18e2269957dc3a2f954fa983",
348
- "description": "Bassclef Substrate Sync — fires on SessionStart."
349
- },
350
342
  {
351
343
  "slug": "bet-doc-gate",
352
344
  "type": "hook",
@@ -547,6 +539,14 @@
547
539
  "content_hash": "sha256:38665938cb3bac6d249d94b814cc3f43600456abcbb045bff5a5d0d0128a7cbb",
548
540
  "description": "PreToolUse: Bash"
549
541
  },
542
+ {
543
+ "slug": "pre-commit-manifest-autoregen",
544
+ "type": "hook",
545
+ "path": ".claude/hooks/pre-commit-manifest-autoregen.sh",
546
+ "tier": "lite",
547
+ "content_hash": "sha256:b3641c5c2402fdedb9fb23b812548e94809dcc732e8d5e19af4fd5b488b023e0",
548
+ "description": "PreToolUse: Bash"
549
+ },
550
550
  {
551
551
  "slug": "pre-gh-pr-body-scrub",
552
552
  "type": "hook",
@@ -592,7 +592,7 @@
592
592
  "type": "hook",
593
593
  "path": ".claude/hooks/session-reflection.sh",
594
594
  "tier": "lite",
595
- "content_hash": "sha256:a9f2492fcf1ae86da3da2e0b6311d8e68a01472e9d68e9504fe6044a5f55d99d",
595
+ "content_hash": "sha256:ece32cd8261bafe4597563aa18237b504bba335c0a1e8d94e1d8d69f4a8e97ae",
596
596
  "description": "Session Start hook coordinator. Injects reflection prompt and iterates"
597
597
  },
598
598
  {
@@ -699,6 +699,22 @@
699
699
  "content_hash": "sha256:867d05c8da773e8aef3d077ec7c171d8e9a208b579596f77dd73e18cc8fcf2e2",
700
700
  "description": "whereami-utc-gate.sh — PreToolUse hook that BLOCKs Edit|Write|MultiEdit"
701
701
  },
702
+ {
703
+ "slug": "wirings",
704
+ "type": "hook",
705
+ "path": ".claude/hooks/_lib/wirings.sh",
706
+ "tier": "lite",
707
+ "content_hash": "sha256:65fb14b5c7b4a919516c96f4587b492d5eb3bcf6f939bbc7c1809205de49498d",
708
+ "description": "Shared accessor library for hook-wiring inspection."
709
+ },
710
+ {
711
+ "slug": "ancestor-claude-check",
712
+ "type": "lib",
713
+ "path": "lib/ancestor-claude-check.sh",
714
+ "tier": "lite",
715
+ "content_hash": "sha256:f84c7b57ae28ef15b0c4c138ee4781030e04e7bb858ff0c53a80a538672d64dd",
716
+ "description": "ancestor-claude-check.sh — walks up from a starting directory to $HOME"
717
+ },
702
718
  {
703
719
  "slug": "bassclef-dir-resolver",
704
720
  "type": "lib",
@@ -752,7 +768,7 @@
752
768
  "type": "lib",
753
769
  "path": "lib/fixture-builder.sh",
754
770
  "tier": "lite",
755
- "content_hash": "sha256:85a59597e8898ea38e7d7442423381f0c4caa5ecf6780bbd0a71d63b819d3b13",
771
+ "content_hash": "sha256:5831bcd49c162ec131cf14d402150821bd8f623e87eb3c1bcdc545fc701aaefd",
756
772
  "description": "Deep module for adopter-environment fixtures used by bassclef Tier 0 tests."
757
773
  },
758
774
  {
@@ -808,7 +824,7 @@
808
824
  "type": "lib",
809
825
  "path": "lib/mechanism-fidelity.sh",
810
826
  "tier": "lite",
811
- "content_hash": "sha256:7ccd6751d3ff3c31b142aac3c1739cd1cb1863f5e13db29ce1eb8206def1b7ca",
827
+ "content_hash": "sha256:3253ce24b845e601486dea9dab4a9e27d11f7fc72f5b9084ab5fb473bea84826",
812
828
  "description": "lib/mechanism-fidelity.sh — shared scanner for the mechanism-fidelity"
813
829
  },
814
830
  {
@@ -899,6 +915,14 @@
899
915
  "content_hash": "sha256:7ee5cc3c7372ca6aef3c81f614ec119ffed8874e00a78d441ce8d0304c7b6308",
900
916
  "description": "lib/tier-dependency-audit.sh"
901
917
  },
918
+ {
919
+ "slug": "workflow-metrics",
920
+ "type": "lib",
921
+ "path": "lib/workflow-metrics.sh",
922
+ "tier": "lite",
923
+ "content_hash": "sha256:4615d673185021f484887b6a674b08f209e8f93db195189f77aff58c618ccf3e",
924
+ "description": "Workflow metrics measurement library — Module B4 per"
925
+ },
902
926
  {
903
927
  "slug": "alan-cooper",
904
928
  "type": "luminary",
@@ -971,6 +995,14 @@
971
995
  "content_hash": "sha256:ec2bb153111b28d5f505825f107fb0ac5da354a4cc3a6a474e1d1b153c81eafb",
972
996
  "description": "\\\"The whole idea was to imagine what it's like to be inside someone else's head."
973
997
  },
998
+ {
999
+ "slug": "david-farley",
1000
+ "type": "luminary",
1001
+ "path": ".claude/luminaries/david-farley.md",
1002
+ "tier": "lite",
1003
+ "content_hash": "sha256:db45f22a2e893137ad0a09ed7a090dc145b3e92dd0c3a5db718e63305921ca91",
1004
+ "description": "Continuous Delivery co-author; deployment pipeline mechanics; author of Modern Software Engineering."
1005
+ },
974
1006
  {
975
1007
  "slug": "david-ogilvy",
976
1008
  "type": "luminary",
@@ -1067,6 +1099,14 @@
1067
1099
  "content_hash": "sha256:8275c70d25fb8e8acad9dc68ade399993d5f1432ae82449fe14db8533342fd70",
1068
1100
  "description": "\\\"Every user experience has five planes: strategy, scope, structure, skeleton, surface."
1069
1101
  },
1102
+ {
1103
+ "slug": "jez-humble",
1104
+ "type": "luminary",
1105
+ "path": ".claude/luminaries/jez-humble.md",
1106
+ "tier": "lite",
1107
+ "content_hash": "sha256:312d4e5cbf21824a50f120c9f7b54b30e00afb4b33782537eda67500269fb7f3",
1108
+ "description": "Continuous Delivery co-author; deployment pipeline framework; DORA metrics researcher."
1109
+ },
1070
1110
  {
1071
1111
  "slug": "john-ousterhout",
1072
1112
  "type": "luminary",
@@ -1128,7 +1168,7 @@
1128
1168
  "type": "luminary",
1129
1169
  "path": ".claude/luminaries/martin-fowler.md",
1130
1170
  "tier": "lite",
1131
- "content_hash": "sha256:7fbf6ec65206fcbb6dbf2df1d24fed37555d495c6597885ff1a7f201ce3c2544",
1171
+ "content_hash": "sha256:c81089dbc3aaeb9d67a91cf19517571452ecc6505fe6ffd065e4029698ae39ec",
1132
1172
  "description": "\\\"Any fool can write code that a computer can understand."
1133
1173
  },
1134
1174
  {
@@ -1227,6 +1267,13 @@
1227
1267
  "content_hash": "sha256:9b5d51d106b5f4398c15c1412c781b81f2cde55fecc294c120479a06b8de92a9",
1228
1268
  "description": "\\\"A bad system will beat a good person every time.\\\""
1229
1269
  },
1270
+ {
1271
+ "slug": "bassclef-configs-template-jsonc",
1272
+ "type": "presence-template",
1273
+ "path": "presence/install/bassclef-configs.template.jsonc",
1274
+ "tier": "lite",
1275
+ "content_hash": "sha256:e796b9736e9b00468822bfed2e2cdbed220c25ee8541f66fe7b743fe50d1a893"
1276
+ },
1230
1277
  {
1231
1278
  "slug": "bassclef-hook-connect",
1232
1279
  "type": "presence-template",
@@ -1248,7 +1295,7 @@
1248
1295
  "type": "presence-template",
1249
1296
  "path": "presence/install/bassclef-sync.template.sh",
1250
1297
  "tier": "lite",
1251
- "content_hash": "sha256:f202c2bb2d252e72e3c2f80a99fea4fece95b9db3744721ce4fea12e3a4b4eb1",
1298
+ "content_hash": "sha256:0a689f73d94bb78d1a3e7fdb3cda760e093db1d7536548cb05cf3a9ea9fb4c6c",
1252
1299
  "description": "description: BASSCLEF_SYNC_VERSION=2026-09-06-1496-sessionstart-heal-v1"
1253
1300
  },
1254
1301
  {
@@ -1958,7 +2005,7 @@
1958
2005
  "type": "script",
1959
2006
  "path": "scripts/generate-lite-manifest.sh",
1960
2007
  "tier": "lite",
1961
- "content_hash": "sha256:950c701995965d543a692cfba919593bb6ae36c2103b5b93a7217d41bb9f0009",
2008
+ "content_hash": "sha256:6342c768c91af054a4dcb6ea3e63228f0c7b4ff0e188867026fe0cdd333e3fe5",
1962
2009
  "description": "Generate lite-manifest.json at repo root."
1963
2010
  },
1964
2011
  {
@@ -1993,6 +2040,14 @@
1993
2040
  "content_hash": "sha256:30dc5eaff11fafc08b0845d8c4ce329a51b6ca0e89136638d335b58af41c7c0f",
1994
2041
  "description": "Render human-readable companion doc from lite-manifest.json."
1995
2042
  },
2043
+ {
2044
+ "slug": "workflow-metrics-query",
2045
+ "type": "script",
2046
+ "path": "scripts/workflow-metrics-query.sh",
2047
+ "tier": "lite",
2048
+ "content_hash": "sha256:9d9ad4a997e2820046802796f81a5d064b14f951cdade6f6c252db64d2afae89",
2049
+ "description": "CLI wrapper for lib/workflow-metrics.sh — Module B4 query helper."
2050
+ },
1996
2051
  {
1997
2052
  "slug": "agent-research-spawn",
1998
2053
  "type": "skill",
@@ -2434,24 +2489,6 @@
2434
2489
  "problem": "Session work fades from memory. Insight worth sharing with PE partners or eng leaders never gets written.",
2435
2490
  "value": "Drafts a journal entry from this session's work. Tuned for PE, search, and board audiences."
2436
2491
  },
2437
- {
2438
- "slug": "journal-export",
2439
- "type": "skill",
2440
- "path": ".claude/skills/journal-export/SKILL.md",
2441
- "tier": "lite",
2442
- "content_hash": "sha256:e63ffd119880230749701b9e484538bfe4a766a8e53ab2778c03f0cdb0762bc9",
2443
- "description": "Generate a structured journal-entry corpus for a brand team or your own archive — chronicle digest, draft index, moment inventory. Supports incremental updates.",
2444
- "inputs": [
2445
- "Time range or theme filter"
2446
- ],
2447
- "outputs": [
2448
- "Corpus JSON",
2449
- "Google Doc export",
2450
- "Archive-ready file"
2451
- ],
2452
- "problem": "Journal drafts pile up locally. Brand teams and archives don't get them systematically.",
2453
- "value": "Structured journal-entry corpus for a brand team or your own archive. Chronicle digest included."
2454
- },
2455
2492
  {
2456
2493
  "slug": "jtbd-tasks",
2457
2494
  "type": "skill",
@@ -2535,7 +2572,7 @@
2535
2572
  "type": "skill",
2536
2573
  "path": ".claude/skills/longrun/SKILL.md",
2537
2574
  "tier": "lite",
2538
- "content_hash": "sha256:65c43c8b003cfe34787021a6c34c0b9686f4467269aed304cebba0b4cc1e5346",
2575
+ "content_hash": "sha256:e11e395721186c5e5021266723b942ac8f330f17bff4b495adf316d05674ac01",
2539
2576
  "description": "Run a long autonomous session that paces itself. Prepares scope. Checkpoints at phase boundaries. Closes with session log and retrospective. Three modes: prep, checkpoint, closeout.",
2540
2577
  "composes_with": [
2541
2578
  "value-prop",
@@ -2620,7 +2657,7 @@
2620
2657
  "type": "skill",
2621
2658
  "path": ".claude/skills/onboard-repo/SKILL.md",
2622
2659
  "tier": "lite",
2623
- "content_hash": "sha256:daaa194480170f0b4745ee5c72d267413d8dc249e4ece2711672118553121667",
2660
+ "content_hash": "sha256:ff92c1539bbad449bbdcfc85430963ceeda8cae67a2eded953bc95dff24a3c75",
2624
2661
  "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 (cold-adopter magic demo).",
2625
2662
  "inputs": [
2626
2663
  "Optional flags — --with-deploy-host or --with-secrets or --full"
@@ -2749,7 +2786,7 @@
2749
2786
  "type": "skill",
2750
2787
  "path": ".claude/skills/provision-deploy-host/SKILL.md",
2751
2788
  "tier": "lite",
2752
- "content_hash": "sha256:62000692c88b5ceb15d3a04ae3f8c45a97728061e1915368af11f67945643ee1",
2789
+ "content_hash": "sha256:0fca55a7f73e23e0eee612597c9718ea58d020ddd61f81c3143f4ab8791a92a7",
2753
2790
  "description": "Run the consumer onboarding chain — read bassclef-platform.yml plus verify secrets, extend GHA scope, run aws amplify create-app with console-pivot fallback, open the consumer config PR, write an audit row. Replaces the 5-step flow.",
2754
2791
  "inputs": [
2755
2792
  "Consumer name and target host"
@@ -2780,32 +2817,6 @@
2780
2817
  "problem": "Trivial bugs get over-ceremonied by full /diagnose. Small edits shouldn't need the whole chain.",
2781
2818
  "value": "Compressed fix workflow for trivial bugs. Operator-in-loop with stated entry criteria."
2782
2819
  },
2783
- {
2784
- "slug": "release",
2785
- "type": "skill",
2786
- "path": ".claude/skills/release/SKILL.md",
2787
- "tier": "lite",
2788
- "content_hash": "sha256:17b931a7a5d3b69f57bc76f995af5c5c7a967df0389719c9fcbfc7f6677d09a9",
2789
- "description": "Ship framework files from bassclef-upstream to public bassclef, filtered by tier. Dry-runs first, reports tier counts plus andon scan plus sibling smoke evidence. On operator confirm runs the live release and opens a PR. Per ADR-029.",
2790
- "composes_with": [
2791
- "verify",
2792
- "state-a-problem",
2793
- "value-prop",
2794
- "kiss"
2795
- ],
2796
- "inputs": [
2797
- "Optional tier filter",
2798
- "Dry-run or apply flag"
2799
- ],
2800
- "outputs": [
2801
- "Files shipped",
2802
- "Dry-run diff",
2803
- "Public PR",
2804
- "Tag drop"
2805
- ],
2806
- "problem": "Framework files ship from upstream to public bassclef through many manual steps. Dry-run catches slip past.",
2807
- "value": "Ships framework files from bassclef-upstream to public bassclef. Filtered by tier. Dry-runs first."
2808
- },
2809
2820
  {
2810
2821
  "slug": "release-notes",
2811
2822
  "type": "skill",
@@ -3726,7 +3737,7 @@
3726
3737
  "type": "standard",
3727
3738
  "path": "standards/lite-manifest-schema-changes.md",
3728
3739
  "tier": "lite",
3729
- "content_hash": "sha256:1269fad0dfe006a4c52094d4efb441101d87cbd3a85b1a1de0e8ff724fa20e44",
3740
+ "content_hash": "sha256:ba7d81b68af60e4df0e46fd7e0bb52ff756eaa13baf42b0dc679db37521b70a5",
3730
3741
  "description": "Chronological ledger of every lite-manifest schema change. Adopters read this before sync to know what shifted."
3731
3742
  },
3732
3743
  {
@@ -3750,7 +3761,7 @@
3750
3761
  "type": "standard",
3751
3762
  "path": "standards/mechanism-fidelity.md",
3752
3763
  "tier": "lite",
3753
- "content_hash": "sha256:b212287354832a3613bf9bcdae7da6071df64d8c08f227e8d4233666ccea4d55",
3764
+ "content_hash": "sha256:e0b14abf4a0331c96c488d52c6e3067f827b6ef4d506c19c83616184c53c3642",
3754
3765
  "description": "- ADR-035 — names the substrate-as-system foundational tenet that this standard's audit method verifies - architecture/audits/2026-06-24-closeout.md — bet 24c architect-review that missed this class; this standard's audit fills the lens-gap and…"
3755
3766
  },
3756
3767
  {
@@ -4014,7 +4025,7 @@
4014
4025
  "type": "standard",
4015
4026
  "path": "standards/substrate-config-schema.md",
4016
4027
  "tier": "lite",
4017
- "content_hash": "sha256:94931a2f1f0e08f4381ddbc464ecd1578170f832a41d263a42f67ac0dfafee48",
4028
+ "content_hash": "sha256:dff6bec2527dfa1cb899fd907b4f802bd4ce7a1e4bb9621bdf3cdfcc05601804",
4018
4029
  "description": "substrate.config.md is the single source of truth for external resource references in any bassclef-substrate repo."
4019
4030
  },
4020
4031
  {
@@ -67,6 +67,7 @@ The class fires when one or more of these hold:
67
67
  | `NOT-WIRED-BY-DESIGN-CI` | Hook lives on disk and is referenced from `.github/workflows/*.yml`; settings.json is not the right home for it | `pr-body-scrub-check.sh`, `pr-body-loop-discipline-check.sh` |
68
68
  | `NOT-WIRED-BY-DESIGN-LAUNCHD` | Hook is scheduled by macOS launchd (or cron); header comment names the scheduler; settings.json is not the right home | `auto-save-idle.sh` |
69
69
  | `NOT-WIRED-BY-DESIGN-LIB` | File is sourced by other hooks (library role); header comment says "sourced by"; settings.json is not the right home | `trace-helper.sh` |
70
+ | `NOT-WIRED-BY-DESIGN-EXCLUSIONS` | Hook basename is listed in `presence/install/template-hook-exclusions.txt`; wired in bassclef-upstream settings.json but intentionally absent from the adopter-shipped template (bassclef-team-only or upstream-only substrate) | `lite-skill-key-gate-check.sh`, `user-global-hook-ref-guard-check.sh` |
70
71
  | `CLEAN` | All chain steps pass | most existing rules (audit will surface count) |
71
72
 
72
73
  ## The 5-step verification chain
@@ -83,7 +83,7 @@ uncommented defaults shown.
83
83
  # === Artifacts ===
84
84
  journal_doc_id: [per-repo draft Google Doc — pushes from /journal + session-end]
85
85
  changelog_doc_id: [per-repo weekly changelog Google Doc — pushes from /release-notes]
86
- brand_corpus_doc_id: [cross-repo brand team corpus — pushes from /journal-export]
86
+ brand_corpus_doc_id: [cross-repo brand team corpus — pushes from an operator export skill]
87
87
 
88
88
  # === Environments ===
89
89
  deploy_targets:
@@ -213,7 +213,7 @@ reference the raw ID directly.
213
213
 
214
214
  ### Anti-pattern 2: hardcoded IDs in skills
215
215
 
216
- **Before** (in `.claude/skills/journal-export/SKILL.md`):
216
+ **Before** (in a skill body):
217
217
  ```bash
218
218
  npx tsx scripts/push-to-gdoc.ts \
219
219
  --file docs/journal-corpus/corpus.md \
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thebassclef/lite",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "Bassclef CLI — install and upgrade bassclef in your project with two commands.",
5
5
  "keywords": [
6
6
  "bassclef",
@@ -1,293 +0,0 @@
1
- ---
2
- tier: lite
3
- name: journal-export
4
- description: "Generate a structured journal-entry corpus for a brand team or your own archive \u2014 chronicle digest, draft index, moment inventory. Supports incremental updates."
5
- problem: "Journal drafts pile up locally. Brand teams and archives don't get them systematically."
6
- value: "Structured journal-entry corpus for a brand team or your own archive. Chronicle digest included."
7
- inputs: [Time range or theme filter]
8
- outputs: [Corpus JSON, Google Doc export, Archive-ready file]
9
- user_invocable: true
10
- disable_model_invocation: false
11
- requires:
12
- files: [standards/writing-guide.md]
13
- network: true
14
- ---
15
-
16
- # /journal export — Journal-Entry Corpus
17
-
18
- Generate a structured content corpus from session chronicles and existing
19
- drafts. The corpus gives the brand team everything they need to produce
20
- journal entries without understanding the codebase.
21
-
22
- ## Usage
23
-
24
- ```
25
- /journal export → full generation (first run or rebuild)
26
- /journal export incremental → update with new sessions since last export
27
- ```
28
-
29
- ## What the corpus contains
30
-
31
- ### 1. Chronicle digest
32
-
33
- Every session summarized in ~150 words:
34
- - Date and repo
35
- - Theme tags (governance, reliability, design, constraint, methodology, product)
36
- - Key moment (the single most compelling thing that happened)
37
- - Quotable decision or insight (one sentence a brand team member can latch onto)
38
- - Audience fit (Board/PE, Engineering, or both)
39
-
40
- ### 2. Draft index
41
-
42
- Every existing journal entry with:
43
- - Date and source repo
44
- - Topic/title
45
- - Variant (A: Board or B: Engineering)
46
- - Angle taken
47
- - Status (drafted / published / held)
48
- - Hook strength assessment
49
-
50
- ### 3. Moment inventory
51
-
52
- Pre-mined moments across major themes. Each moment has:
53
- - Date, repo, session title
54
- - What happened (2-3 sentences)
55
- - Why it matters as a journal entry (tension, stakes, surprise, result)
56
- - Audience fit and hook strength
57
- - Whether an existing draft already covers this angle
58
-
59
- ### 4. Writing guide bundle
60
-
61
- Packaged for external handoff:
62
- - `standards/writing-guide.md` content (journal-entry style guide)
63
- - Audience definitions (PE/board vs. engineering variants)
64
- - Vocabulary rules (concept names, not implementation details)
65
- - Post structure (Hook → Setup → Body → Takeaway)
66
-
67
- ## Procedure
68
-
69
- ### Step 1: Locate all sources
70
-
71
- ```
72
- Chronicles:
73
- ~/src/sunj-labs/bassclef/chronicle/
74
- ~/src/your-org/your-app/docs/chronicle/
75
- ~/src/your-org/your-second-app/docs/chronicle/
76
-
77
- Existing drafts:
78
- ~/src/sunj-labs/bassclef/docs/operator-private/journals/
79
- ~/src/your-org/your-app/docs/operator-private/journals/
80
- ~/src/your-org/your-app/docs/operator-private/journals/legacy/ (pre-substrate content)
81
-
82
- Writing guide:
83
- ~/src/sunj-labs/bassclef/standards/writing-guide.md
84
- ```
85
-
86
- ### Step 2: Check for previous export
87
-
88
- Look for `docs/journal-corpus/` in bassclef. If it exists and the
89
- mode is `incremental`:
90
- - Read `docs/journal-corpus/last-export.md` for the last export date
91
- - Only process chronicles and drafts newer than that date
92
- - Append to existing corpus sections
93
-
94
- If full mode or no previous export: generate everything from scratch.
95
-
96
- ### Step 3: Read all chronicles
97
-
98
- For each chronicle:
99
- 1. Read the full file
100
- 2. Extract: date, repo, title, tags, key decisions, notable moments
101
- 3. Assign theme tags from this list:
102
- - **governance**: rules, gates, guardrails, permissions, ADRs, hooks
103
- - **reliability**: failures, diagnosis, fixes, what broke, resilience
104
- - **design**: luminaries, prototypes, visual review, UX migration, taste
105
- - **constraint**: budget, time budget, scope kills, trade-offs, real stakes
106
- - **methodology**: SDLC, choreography, skills, agents, substrate, process
107
- - **product**: features built, user-facing outcomes, family use, deals
108
- - **infrastructure**: deployment, CI/CD, bassclef sync, tooling
109
- 4. Identify the key moment (strongest journal-worthy content)
110
- 5. Rate audience fit and hook strength
111
-
112
- ### Step 4: Read all existing drafts
113
-
114
- For each draft:
115
- 1. Read the file
116
- 2. Extract: date, topic/title, variant, audience, angle
117
- 3. Note status (drafts in legacy/ are "pre-substrate")
118
-
119
- ### Step 5: Pre-mine major themes
120
-
121
- Run theme matching (same logic as `/journal mine`) for these themes:
122
- - "The autonomous SDLC journey"
123
- - "Governance that scales"
124
- - "Building under constraint"
125
- - "Design taste in AI agents"
126
- - "What broke"
127
- - "From zero to production"
128
-
129
- Surface top 3-5 moments per theme.
130
-
131
- ### Step 6: Assemble the corpus
132
-
133
- Write to `docs/journal-corpus/`:
134
-
135
- ```
136
- docs/journal-corpus/
137
- corpus.md # main document — digest + index + inventory
138
- last-export.md # metadata for incremental updates
139
- writing-guide.md # copy of standards/writing-guide.md for handoff
140
- ```
141
-
142
- **corpus.md** structure:
143
-
144
- ```markdown
145
- # Content Corpus — <your-org>
146
-
147
- Generated: YYYY-MM-DD
148
- Sessions covered: N (Dec 2025 - [latest])
149
- Repos: <list-the-repos-you-mine-chronicles-from>
150
-
151
- ## How to use this document
152
-
153
- This corpus contains the raw material for journal-entry content. Each session
154
- is summarized with theme tags and a key moment. To write a post:
155
-
156
- 1. Pick a theme or topic you want to write about
157
- 2. Find moments that serve that theme (use the theme index below)
158
- 3. Pick the strongest moment
159
- 4. Draft a standalone post — every post must work on its own,
160
- even if it covers a theme you've posted about before
161
-
162
- ## Chronicle digest
163
-
164
- ### [Repo name]
165
-
166
- | Date | Title | Themes | Key moment | Audience | Hook |
167
- |------|-------|--------|-----------|----------|------|
168
- | ... | ... | ... | ... | ... | ... |
169
-
170
- [For each session, a ~150 word summary follows the table]
171
-
172
- ## Draft index
173
-
174
- | Date | Repo | Title | Variant | Audience | Angle | Status |
175
- |------|------|-------|---------|----------|-------|--------|
176
- | ... | ... | ... | ... | ... | ... | ... |
177
-
178
- ## Moment inventory by theme
179
-
180
- ### [Theme name]
181
-
182
- | # | Date | Repo | Moment | Why it's strong | Hook |
183
- |---|------|------|--------|-----------------|------|
184
- | ... | ... | ... | ... | ... | ... |
185
-
186
- [Repeated for each theme]
187
-
188
- ## Writing guide
189
-
190
- [Full writing guide content]
191
- ```
192
-
193
- ### Step 7: Push to Google Docs
194
-
195
- Push the corpus to the brand team corpus doc. Read the doc ID from
196
- bassclef's `substrate.config.md` field `brand_corpus_doc_id` — never
197
- hardcode (per `standards/substrate-config-schema.md`):
198
-
199
- ```bash
200
- DOC_ID=$(grep "^brand_corpus_doc_id:" substrate.config.md | awk '{print $2}')
201
- npx tsx ~/src/your-org/your-app/scripts/push-to-gdoc.ts \
202
- --file docs/journal-corpus/corpus.md --replace \
203
- --doc-id "$DOC_ID"
204
- ```
205
-
206
- Use `--replace` to clear the doc first and re-push the full corpus
207
- (appending accumulates duplicates over time).
208
-
209
- The brand team corpus doc is separate from per-repo draft docs. It
210
- contains session digests, moment inventory, and writing guide — not
211
- the full post drafts. The per-repo drafts push separately at session-
212
- end using each repo's `journal_doc_id`.
213
-
214
- All doc IDs live in `substrate.config.md` — never hardcoded here,
215
- never stored in memory. See `standards/substrate-config-schema.md`
216
- for the bassclef field convention.
217
-
218
- ### Step 7a: Defer push when capabilities missing
219
-
220
- If `brand_corpus_doc_id` is configured but this session cannot push
221
- (missing `gcloud-auth` / `google-docs-write` — ephemeral-mobile,
222
- cloud-web, or desktop without the SA key), DO NOT silently skip. Write
223
- a deferred-action entry:
224
-
225
- ```bash
226
- TS=$(date -u +"%Y-%m-%dT%H-%M-%SZ")
227
- ID="${TS}-journal-export-corpus-push"
228
- cp templates/deferred-action-template.md \
229
- "docs/deferred-actions/${ID}.md"
230
- # Fill frontmatter:
231
- # pending_action: push-brand-corpus-to-gdoc
232
- # requires_capability: [gcloud-auth, google-docs-write]
233
- # priority: medium
234
- # origin_skill: /journal-export
235
- # resolves_when: |
236
- # Brand corpus doc <brand_corpus_doc_id> reflects docs/journal-corpus/corpus.md
237
- # Body should cross-ref the corpus file + last-export.md.
238
- git add "docs/deferred-actions/${ID}.md"
239
- git commit -m "chore: defer journal-export corpus-push"
240
- ```
241
-
242
- See `.claude/rules/deferred-actions.md` and
243
- `standards/deferred-actions-schema.md`.
244
-
245
- ### Step 8: Record metadata
246
-
247
- Write `docs/journal-corpus/last-export.md`:
248
-
249
- ```markdown
250
- ---
251
- last_export: YYYY-MM-DD
252
- sessions_covered: N
253
- repos: [<list of mined repos>]
254
- chronicles_processed: N
255
- drafts_indexed: N
256
- themes_mined: N
257
- ---
258
- ```
259
-
260
- ## Incremental mode
261
-
262
- When called with `incremental`:
263
- 1. Read `last-export.md` for the cutoff date
264
- 2. Only read chronicles newer than the cutoff
265
- 3. Only read drafts newer than the cutoff
266
- 4. Append new sessions to the chronicle digest
267
- 5. Append new drafts to the draft index
268
- 6. Re-run theme mining with new material included
269
- 7. Update `last-export.md` with new date and counts
270
-
271
- ## Rules
272
-
273
- - The corpus is for external consumption — no internal jargon, file paths,
274
- or skill names unless they're in the vocabulary guide
275
- - Every session gets a summary even if it's "low" hook strength —
276
- the brand team decides what's worth writing about
277
- - Theme tags are additive — a session can have multiple themes
278
- - The writing guide section uses the SENTINEL_bassclef_version verbatim
279
- - Incremental updates append, never overwrite existing entries
280
-
281
- ## Scheduled refresh (Level 1 automation)
282
-
283
- The brand team corpus can be kept fresh automatically via a scheduled agent.
284
- See `docs/journal-corpus/REFRESH.md` for:
285
-
286
- - Manual refresh procedure (step-by-step bash commands)
287
- - Automated refresh setup using the `/schedule` skill (weekly, Monday 9am)
288
- - A map of all three Google Docs and how each one stays current
289
- - Troubleshooting guide
290
-
291
- ## Output discipline
292
-
293
- Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.