@thebassclef/lite 1.9.16 → 1.9.19
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.
- package/README.md +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/agents/builder.md +7 -4
- package/dist/lite/.claude/bassclef-orientation.md +22 -0
- package/dist/lite/.claude/hooks/artifact-ingestion-gate.sh +11 -3
- package/dist/lite/.claude/hooks/assert-verify-steering.sh +1 -19
- package/dist/lite/.claude/hooks/plain-english-steering.sh +86 -41
- package/dist/lite/.claude/hooks/pre-commit-gate.sh +10 -2
- package/dist/lite/.claude/hooks/pre-push-shellcheck.sh +196 -0
- package/dist/lite/.claude/hooks/reviewer-dispatch-check.sh +153 -0
- package/dist/lite/.claude/hooks/session-reflection.d/83-install-written-paths-rebuild.sh +15 -32
- package/dist/lite/.claude/hooks/turn-prose-density-measure.sh +109 -0
- package/dist/lite/.claude/hooks/turn-prose-kiss-check.sh +28 -0
- package/dist/lite/.claude/rules/branching.md +2 -0
- package/dist/lite/.claude/rules/identifier-leak-prevention.md +2 -1
- package/dist/lite/.claude/rules/install-written-paths-mediation.md +7 -0
- package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +23 -0
- package/dist/lite/.claude/rules/reviewer-dispatch.md +95 -0
- package/dist/lite/.claude/settings.json +10 -0
- package/dist/lite/.claude/skills/build/SKILL.md +81 -6
- package/dist/lite/.claude/skills/eisenhower/SKILL.md +26 -0
- package/dist/lite/.claude/skills/launch/SKILL.md +45 -2
- package/dist/lite/.claude/skills/onboard-repo/SKILL.md +208 -40
- package/dist/lite/.claude/skills/onboard-repo/claude-oauth-probe.sh +60 -0
- package/dist/lite/.claude/skills/onboard-repo/concise-prompt.sh +73 -0
- package/dist/lite/.claude/skills/onboard-repo/write-state-marker.sh +81 -0
- package/dist/lite/.claude/skills/pre-mortem/SKILL.md +56 -0
- package/dist/lite/.claude/skills/sprint/SKILL.md +24 -3
- package/dist/lite/.claude/skills/temperance/SKILL.md +15 -4
- package/dist/lite/README.md +2 -0
- package/dist/lite/bassclef-version.json +5 -5
- package/dist/lite/lib/install-written-paths.sh +250 -3
- package/dist/lite/lib/prose-marker.sh +203 -0
- package/dist/lite/lib/tier-dependency-audit.sh +52 -25
- package/dist/lite/presence/install/bassclef-sync.template.sh +86 -8
- package/dist/lite/presence/install/schedule-auto-save.cron.sh +30 -2
- package/dist/lite/scripts/generate-lite-manifest.sh +15 -0
- package/dist/lite/scripts/launch/local-serve.sh +149 -8
- package/dist/lite/standards/bassclef-wiring-manifest.json +12 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +84 -0
- package/dist/lite/standards/lite-manifest.json +100 -29
- package/dist/lite/standards/prose-marker-format.md +105 -0
- package/package.json +1 -1
|
@@ -171,6 +171,12 @@
|
|
|
171
171
|
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/git-stash-u-guard.sh",
|
|
172
172
|
"timeout": 5,
|
|
173
173
|
"tier": "lite"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"type": "command",
|
|
177
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/pre-push-shellcheck.sh",
|
|
178
|
+
"timeout": 60,
|
|
179
|
+
"tier": "lite"
|
|
174
180
|
}
|
|
175
181
|
]
|
|
176
182
|
},
|
|
@@ -392,6 +398,12 @@
|
|
|
392
398
|
"timeout": 10,
|
|
393
399
|
"tier": "lite"
|
|
394
400
|
},
|
|
401
|
+
{
|
|
402
|
+
"type": "command",
|
|
403
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/turn-prose-density-measure.sh",
|
|
404
|
+
"timeout": 10,
|
|
405
|
+
"tier": "lite"
|
|
406
|
+
},
|
|
395
407
|
{
|
|
396
408
|
"type": "command",
|
|
397
409
|
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/reviewer-dispatch-check.sh",
|
|
@@ -34,6 +34,55 @@ 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
|
+
### bassclef-upstream#2096 amendment 3 — pin hard stack rank in /eisenhower output (PATCH, 2026-10-13)
|
|
38
|
+
|
|
39
|
+
- **Change type:** content-change (`.claude/skills/eisenhower/SKILL.md` content_hash shift; new Step 4b section added)
|
|
40
|
+
- **Contracts affected:** `/eisenhower` SKILL body — adds Step 4b emitting cross-repo stack-rank table after per-quadrant tables
|
|
41
|
+
- **Version bump:** PATCH per content-only policy
|
|
42
|
+
- **Rationale:** bassclef-upstream#2096 amendment 3. The operator asked twice in-session for the hard stack rank with a repo column. The amendment pins the four-column shape (Rank · Ticket · Repo · Why this rank) and the Q1 → Q4 row order.
|
|
43
|
+
- **Downstream cure:** nothing required; adopters that invoke `/eisenhower` see the new table automatically next run.
|
|
44
|
+
- **Old shape retired:** nothing retired; this is a pure add.
|
|
45
|
+
|
|
46
|
+
### bassclef-upstream#2110 step 1 — add scripts/update-lite-manifest.sh wrapper + rule amendment (PATCH, 2026-10-13)
|
|
47
|
+
|
|
48
|
+
- **Change type:** content-change (two tier:lite files edited; one new tier:upstream script + test added)
|
|
49
|
+
- **Contracts affected:** `.claude/rules/lite-manifest-schema-change-discipline.md` entry — content_hash shift (added "Ledger-edit-then-regen order" section)
|
|
50
|
+
- **Version bump:** PATCH per content-only policy
|
|
51
|
+
- **Rationale:** bassclef-upstream#2110 — the natural authoring instinct is "regen first, then write ledger explaining the change." That order ships a stale ledger hash in the manifest because the ledger file is itself in the manifest. The wrapper `scripts/update-lite-manifest.sh` forces ledger-edit-then-regen order. Tier 0 tests at `scripts/tests/update-lite-manifest.test.sh` pin 10 cases.
|
|
52
|
+
- **Downstream cure:** nothing required; the wrapper is operator-side authoring convenience. Adopters do not run it. The rule amendment documents the preferred authoring path.
|
|
53
|
+
- **Old shape retired:** nothing retired; this is a pure add.
|
|
54
|
+
|
|
55
|
+
### bassclef-upstream#2157 step 6 — install-written-paths ajv-runtime content shift (v1.17.1 → v1.17.2, 2026-10-10)
|
|
56
|
+
|
|
57
|
+
- **Change type:** content-change (lib/install-written-paths.sh content_hash shift; no entry add/remove)
|
|
58
|
+
- **Contracts affected:** `lib/install-written-paths` entry — content_hash sha256 old `504f4f73...` → new `3c029eb9...`
|
|
59
|
+
- **Version bump:** v1.17.1 → v1.17.2 (PATCH per policy — content_hash change only)
|
|
60
|
+
- **Rationale:** bassclef-upstream#2157 step 6 adds `_iwp_ajv_validate` + `_iwp_schema_path` helpers (73 lines) in `lib/install-written-paths.sh` + extends `install_written_paths_verify` with strict ajv reject + `install_written_paths_register` with post-write advisory warning. All 5 public verbs retain signatures (Parnas information hiding). Reads via `is_install_written_path` stay cheap. Fail-soft when ajv missing.
|
|
61
|
+
- **Downstream cure:** no action for lite adopters. The lib stays backward-compatible — ajv-missing fail-soft keeps adopter machines working without ajv-cli. New verify-side strict reject only fires on explicit `install_written_paths_verify` calls, not on hot-path `is_install_written_path`.
|
|
62
|
+
- **Old shape retired:** nothing retired. PR #2149 CLI init.manifest.json fallback at L250-282 preserved per ADR-031 three-release-cycle rule — the cross-repo contracts registry ledger v1.0.1 entry names the retire schedule.
|
|
63
|
+
- **Refs:** `architecture/decisions/ADR-059-cross-repo-contract-drift-prevention.md`, bassclef-upstream#2157, bassclef-cli#415 (CLOSED via PR #416 SHA 9cf9014). See cross-repo contracts registry ledger v1.0.1 entry for the paired stage flip.
|
|
64
|
+
|
|
65
|
+
### bassclef-upstream v1.9.3 hotfix — manifest_version regression cure (v1.17.0 → v1.17.1, 2026-10-08)
|
|
66
|
+
|
|
67
|
+
- **Change type:** version-field-correction (0 content shift, 0 schema shape change). Prior v1.9.2 release shipped `manifest_version: "0.0.0"` due to a generator fallback bug — chained rebase regens compounded a null read into 0.0.0. cli bundler strict major=1 check rejected the shipped manifest.
|
|
68
|
+
- **Fields:** 449 entries (unchanged). manifest_version field only.
|
|
69
|
+
- **Version bump:** v1.17.0 → v1.17.1 (patch — version-field correction with no content shift; per policy f).
|
|
70
|
+
- **Rationale:** bassclef-cli-63 peer blocker report 2026-10-08 — v1.9.2 shipped `manifest_version: "0.0.0"`; `@thebassclef/lite@1.9.11` (2026-09-15) shipped `manifest_version: "1.6.1"`. Regression traced to commit `d59a3dfe` (PR #2135 prior session). cli bundler at `scripts/prepublish-bundle-substrate.mjs:69` enforces EXPECTED_LITE_MANIFEST_MAJOR=1; rejects v1.9.2.
|
|
71
|
+
- **Downstream cure:** no action for adopters at non-pin. cli bundler now reads a valid major digit; downstream readers that keyed on `manifest_version` get a non-zero value again.
|
|
72
|
+
- **Old shape retired:** nothing retired. v1.9.2's broken shape stays on tag v1.9.2; v1.9.3 supersedes.
|
|
73
|
+
- **Follow-on filed:** regression class caught by Tier 0 Test 50 in `.claude/hooks/tests/generate-lite-manifest.test.sh`. Generator fallback safety guard filed as sister ticket (prevents 0.0.0 from compounding across chained regens again).
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
### bassclef-upstream#2140 — generator scans skill-helper subscripts (v1.16.10 → v1.17.0, 2026-10-08)
|
|
77
|
+
|
|
78
|
+
- **Change type:** content-add (1 new lite entry: `.claude/skills/onboard-repo/write-state-marker.sh` as type=script). Generator extended to scan `.claude/skills/*/*.sh` for skill-helper subscripts; emits them as existing type=script (no schema enum change).
|
|
79
|
+
- **Fields:** 448 → 449 entries (+1 at lite tier). Schema shape unchanged. The 2 sibling helpers at `.claude/skills/onboard-repo/` stay at `# tier: standard` so they don't ride into lite.
|
|
80
|
+
- **Version bump:** v1.16.10 → v1.17.0 (minor — adds an entry to entries[] per policy a).
|
|
81
|
+
- **Rationale:** bassclef-upstream#2140 — cold adopter 2026-10-07 ran /onboard-repo at lite tier; Phase 2.3.9 saw `cat: write-state-marker.sh: No such file` because the file was tagged standard and absent from lite manifest. Retag to lite + generator extension so lite adopters receive the helper.
|
|
82
|
+
- **Downstream cure:** no action for adopters at exact-pin. Downstream readers see one additional lite-tier entry under type=script. Adopters that iterate entries[] get the extra entry without any code change.
|
|
83
|
+
- **Old shape retired:** nothing retired. Content addition is additive.
|
|
84
|
+
|
|
85
|
+
|
|
37
86
|
### cli#319 — interpret-input writes intent field (v1.16.9 → v1.16.10, 2026-10-07)
|
|
38
87
|
|
|
39
88
|
- **Change type:** content-change (1 file: `scripts/interpret-input.sh`). Script now emits `intent` field in input-artifact JSON. Prior shape omitted it.
|
|
@@ -468,3 +517,38 @@ Every entry stays in this file for the life of the manifest. Never pruned. When
|
|
|
468
517
|
## Retirement condition
|
|
469
518
|
|
|
470
519
|
This ledger retires only if bassclef stops shipping a lite manifest. Adopter count and schema change cadence may evolve; the discipline of documenting every change persists.
|
|
520
|
+
### bassclef-upstream#2253 + #2254 — pre-push-shellcheck adopter cures (PATCH, 2026-10-18)
|
|
521
|
+
|
|
522
|
+
- **Change type:** content-change (`.claude/hooks/pre-push-shellcheck.sh` + `.claude/rules/install-written-paths-mediation.md` content_hash shifts; no entry add/remove)
|
|
523
|
+
- **Contracts affected:** `pre-push-shellcheck.sh` now consults `lib/install-written-paths.sh` + reads `state/markers/skip/pre-push-shellcheck.marker` as agent-reachable bypass. Mediation rule names `pre-push-shellcheck` as adopter 2.
|
|
524
|
+
- **Version bump:** PATCH per policy — content_hash change only; no schema shift
|
|
525
|
+
- **Rationale:** Peer bassclef-cli-06 cold-adopter smoke on `giveisusfree` profile caught v1.11.0's `pre-push-shellcheck.sh` (shipped #2108) BLOCKing first push after `bassclef init` on 72 shellcheck findings in bassclef-shipped `.sh` files — Linus adopter contract break. Hook now exempts install-written content via lib's `is_install_written_path` accessor (hash-match discriminates adopter edits from untouched install-written). State-marker bypass closes #2254 — `SKIP_PRE_PUSH_SHELLCHECK=1` env may not propagate from the Claude Code harness to the hook; marker is reachable from the Write tool.
|
|
526
|
+
- **Downstream cure:** nothing required for adopters that sync normally. Adopters stuck on v1.11.0 can bypass per-session via `mkdir -p state/markers/skip && touch state/markers/skip/pre-push-shellcheck.marker` OR `SKIP_PRE_PUSH_SHELLCHECK=1` prefix in a shell outside the agent.
|
|
527
|
+
- **Old shape retired:** nothing retired; this is a pure cure of adopter break.
|
|
528
|
+
|
|
529
|
+
### bassclef-upstream#2256 — Concise prompt informed-consent preamble (PATCH, 2026-10-18)
|
|
530
|
+
|
|
531
|
+
- **Change type:** content-change (`.claude/skills/onboard-repo/SKILL.md` Phase 2.7 content_hash shift)
|
|
532
|
+
- **Contracts affected:** Phase 2.7 adopter-visible prompt now carries a 2-line preamble naming what Concise does + how to turn it off + docs link. Default flipped Y → n per ADR-049 opt-in default off.
|
|
533
|
+
- **Version bump:** PATCH per policy — content-change only
|
|
534
|
+
- **Rationale:** Peer bassclef-cli-06 cold-adopter smoke on v1.11.0 caught the Phase 2.7 prompt firing as `· Turn on the Concise output style? → Yes` with zero explanation. Adopter answered blind. Broke informed-consent discipline on a global setting. Peer recommended cure A+B combined — preamble + default flip. Both land here.
|
|
535
|
+
- **Downstream cure:** nothing required for adopters that sync normally. Operators who ran v1.11.0 and picked Y see no change (Concise still active). Operators who ran v1.11.0 and declined see no change (declined sentinel persists). New adopters see the preamble + n default.
|
|
536
|
+
- **Old shape retired:** nothing retired; prose edit + default flip.
|
|
537
|
+
|
|
538
|
+
### bassclef-upstream#2255 + #2257 — /onboard-repo cold-adopter cures (PATCH, 2026-10-18)
|
|
539
|
+
|
|
540
|
+
- **Change type:** content-change + content-add (`.claude/skills/onboard-repo/SKILL.md` + `presence/install/schedule-auto-save.cron.sh` content_hash shifts; `.claude/skills/onboard-repo/claude-oauth-probe.sh` new entry)
|
|
541
|
+
- **Contracts affected:** `/onboard-repo` Phase 0.1 OAuth probe now dispatched via portable helper `claude-oauth-probe.sh` instead of inline `timeout 10 claude -p`. `schedule-auto-save.cron.sh` probes `$CLAUDE_PROJECT_DIR/.claude/hooks/` before falling back to `~/src/sunj-labs/bassclef/.claude/hooks/`.
|
|
542
|
+
- **Version bump:** PATCH per policy — content-change + content-add (helper is additive); no schema shift
|
|
543
|
+
- **Rationale:** Peer bassclef-cli-06 cold-adopter smoke on `giveisusfree` profile caught two cold-adopter breaks in v1.11.0 — #2255 macOS adopters without GNU coreutils see false `OAUTH_FAIL` because inline `timeout` returns 127; #2257 auto-save installer hardcoded `$HOME/src/sunj-labs/bassclef/...` fails on adopters without the dev sibling. Both are Linus adopter contract breaks.
|
|
544
|
+
- **Downstream cure:** nothing required for adopters that sync normally. Adopters stuck on v1.11.0 workaround: skip Phase 0.1 OAuth probe OR install `brew install coreutils` to get `gtimeout`.
|
|
545
|
+
- **Old shape retired:** nothing retired; pure cure.
|
|
546
|
+
|
|
547
|
+
### bassclef-upstream#2257 simulator cure — tilde → $HOME in comment (PATCH, 2026-10-18)
|
|
548
|
+
|
|
549
|
+
- **Change type:** content-change (`presence/install/schedule-auto-save.cron.sh` comment edit; 2 lines)
|
|
550
|
+
- **Contracts affected:** None. Pure prose edit. Replaces `~/src/sunj-labs/bassclef` with `$HOME/src/sunj-labs/bassclef` in a code comment so `adopter-simulator-lite.sh` Assertion 4 (no `~/src/sunj-labs/...`) passes.
|
|
551
|
+
- **Version bump:** PATCH — content-only; zero behavior change.
|
|
552
|
+
- **Rationale:** v1.11.1 PR B (#2259) added a cure comment explaining why the installer probes `$CLAUDE_PROJECT_DIR` first. Comment used `~` shorthand; adopter-simulator Assertion 4 regex matches `[~]/src/sunj-labs/bassclef` even in comments. `/release` dry-run flagged the file. Swap `~` → `$HOME` reads the same + passes the simulator.
|
|
553
|
+
- **Downstream cure:** nothing required for adopters.
|
|
554
|
+
- **Old shape retired:** nothing.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"tier": "lite",
|
|
3
|
-
"manifest_version": "1.
|
|
4
|
-
"generated_at": "2026-10-
|
|
3
|
+
"manifest_version": "1.17.4",
|
|
4
|
+
"generated_at": "2026-10-18T14:30:54Z",
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"slug": "029-release-pipeline",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"type": "agent",
|
|
65
65
|
"path": ".claude/agents/builder.md",
|
|
66
66
|
"tier": "lite",
|
|
67
|
-
"content_hash": "sha256:
|
|
67
|
+
"content_hash": "sha256:b0f279027867310b2fdab217b6a072133b0f35a5bf306a35a3c108cdb4d0d64c",
|
|
68
68
|
"description": "Executes against spec. Respects ADR constraints. Commits with conventional commits. Doesn't redesign mid-build. Raises blockers immediately."
|
|
69
69
|
},
|
|
70
70
|
{
|
|
@@ -264,7 +264,7 @@
|
|
|
264
264
|
"type": "hook",
|
|
265
265
|
"path": ".claude/hooks/session-reflection.d/83-install-written-paths-rebuild.sh",
|
|
266
266
|
"tier": "lite",
|
|
267
|
-
"content_hash": "sha256:
|
|
267
|
+
"content_hash": "sha256:26afc563c1212ca472cb9c41af6d3cdbf95dd9d06ef634de95baf9337b39a28d",
|
|
268
268
|
"description": "Session-start fragment: rebuild install-written-paths manifest when missing/stale."
|
|
269
269
|
},
|
|
270
270
|
{
|
|
@@ -328,7 +328,7 @@
|
|
|
328
328
|
"type": "hook",
|
|
329
329
|
"path": ".claude/hooks/artifact-ingestion-gate.sh",
|
|
330
330
|
"tier": "lite",
|
|
331
|
-
"content_hash": "sha256:
|
|
331
|
+
"content_hash": "sha256:5946bdc740af1541e407aef397eb470166e00bef1ca87cdd47e7e08b7255cae1",
|
|
332
332
|
"description": "Artifact Ingestion Gate — fires on Write/Edit to generative artifact paths."
|
|
333
333
|
},
|
|
334
334
|
{
|
|
@@ -336,7 +336,7 @@
|
|
|
336
336
|
"type": "hook",
|
|
337
337
|
"path": ".claude/hooks/assert-verify-steering.sh",
|
|
338
338
|
"tier": "lite",
|
|
339
|
-
"content_hash": "sha256:
|
|
339
|
+
"content_hash": "sha256:a554079add7826aef3286ab28f8f1f28cb6d495c196aec002c15d4d1be425362",
|
|
340
340
|
"description": "assert-verify-steering.sh — UserPromptSubmit hook that injects"
|
|
341
341
|
},
|
|
342
342
|
{
|
|
@@ -504,7 +504,7 @@
|
|
|
504
504
|
"type": "hook",
|
|
505
505
|
"path": ".claude/hooks/plain-english-steering.sh",
|
|
506
506
|
"tier": "lite",
|
|
507
|
-
"content_hash": "sha256:
|
|
507
|
+
"content_hash": "sha256:43c94eb70b04b1de950e0928b151b8a9ecc30b6dd23d65ae1f2175a3edf993f8",
|
|
508
508
|
"description": "plain-english-steering.sh — UserPromptSubmit hook that injects"
|
|
509
509
|
},
|
|
510
510
|
{
|
|
@@ -552,7 +552,7 @@
|
|
|
552
552
|
"type": "hook",
|
|
553
553
|
"path": ".claude/hooks/pre-commit-gate.sh",
|
|
554
554
|
"tier": "lite",
|
|
555
|
-
"content_hash": "sha256:
|
|
555
|
+
"content_hash": "sha256:44ee55c1c8ba834b0b1e99209cfd86659921ebade01f18981fae3461ed3574f3",
|
|
556
556
|
"description": "Observable failure trap — closes bassclef-upstream#1075 (silent-stderr class)."
|
|
557
557
|
},
|
|
558
558
|
{
|
|
@@ -587,6 +587,22 @@
|
|
|
587
587
|
"content_hash": "sha256:d1c01e63e69d5081812c6a689b881c318667152509383fa09feeddb72e997313",
|
|
588
588
|
"description": "pre-gh-pr-title-scrub — PreToolUse hook that runs the body scrub logic"
|
|
589
589
|
},
|
|
590
|
+
{
|
|
591
|
+
"slug": "pre-push-shellcheck",
|
|
592
|
+
"type": "hook",
|
|
593
|
+
"path": ".claude/hooks/pre-push-shellcheck.sh",
|
|
594
|
+
"tier": "lite",
|
|
595
|
+
"content_hash": "sha256:a65650498b13a6195fd9c757b4bdf37dff334ce462b40a49b58dbc4ba4c8d5f7",
|
|
596
|
+
"description": "pre-push-shellcheck — PreToolUse Bash hook that scans .sh files going"
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
"slug": "reviewer-dispatch-check",
|
|
600
|
+
"type": "hook",
|
|
601
|
+
"path": ".claude/hooks/reviewer-dispatch-check.sh",
|
|
602
|
+
"tier": "lite",
|
|
603
|
+
"content_hash": "sha256:0b487dc434c96333aadbc4893c46a3aee07a4f51181fb3cec050acda82ed5b9a",
|
|
604
|
+
"description": "reviewer-dispatch-check.sh — Stop hook on code-shipping sessions"
|
|
605
|
+
},
|
|
590
606
|
{
|
|
591
607
|
"slug": "role-entry-gate",
|
|
592
608
|
"type": "hook",
|
|
@@ -691,6 +707,14 @@
|
|
|
691
707
|
"content_hash": "sha256:15c81bba2b25f8d975b806371f6ca71be59e6339bebd9afe2074505c9b9fb436",
|
|
692
708
|
"description": "SDLC Trace Log helper — sourced by all hooks."
|
|
693
709
|
},
|
|
710
|
+
{
|
|
711
|
+
"slug": "turn-prose-density-measure",
|
|
712
|
+
"type": "hook",
|
|
713
|
+
"path": ".claude/hooks/turn-prose-density-measure.sh",
|
|
714
|
+
"tier": "lite",
|
|
715
|
+
"content_hash": "sha256:5124aefce9ef1328364e38db13f0b3cb36df013d8b059bc94a57f972f3c8af80",
|
|
716
|
+
"description": "Turn-prose density measure — Stop hook that reads the last assistant message"
|
|
717
|
+
},
|
|
694
718
|
{
|
|
695
719
|
"slug": "turn-prose-grade-measure",
|
|
696
720
|
"type": "hook",
|
|
@@ -704,7 +728,7 @@
|
|
|
704
728
|
"type": "hook",
|
|
705
729
|
"path": ".claude/hooks/turn-prose-kiss-check.sh",
|
|
706
730
|
"tier": "lite",
|
|
707
|
-
"content_hash": "sha256:
|
|
731
|
+
"content_hash": "sha256:5e039dc5864f02193305a0c24ad4fb014f63e4979f57cd3364620cbea2029b75",
|
|
708
732
|
"description": "Turn-prose /kiss check — Stop hook that scans the most recent assistant"
|
|
709
733
|
},
|
|
710
734
|
{
|
|
@@ -856,7 +880,7 @@
|
|
|
856
880
|
"type": "lib",
|
|
857
881
|
"path": "lib/install-written-paths.sh",
|
|
858
882
|
"tier": "lite",
|
|
859
|
-
"content_hash": "sha256:
|
|
883
|
+
"content_hash": "sha256:a05af07492ef548781b0f206d1d51cc0926a3957e61cded77e41d99a038d32ab",
|
|
860
884
|
"description": "Install-written-paths manifest + accessor lib."
|
|
861
885
|
},
|
|
862
886
|
{
|
|
@@ -907,6 +931,14 @@
|
|
|
907
931
|
"content_hash": "sha256:0e1e0765acfad9826b9a042eed2215eb0c71b8f5f077283a5abab7d8fd40e5e7",
|
|
908
932
|
"description": "lib/preview-state.sh — typed accessor for docs/preview-state/<slug>.yml"
|
|
909
933
|
},
|
|
934
|
+
{
|
|
935
|
+
"slug": "prose-marker",
|
|
936
|
+
"type": "lib",
|
|
937
|
+
"path": "lib/prose-marker.sh",
|
|
938
|
+
"tier": "lite",
|
|
939
|
+
"content_hash": "sha256:1ced5ff7c2156bf0168673476c9a1579d9572a5206f1305e5f447c2126e72b06",
|
|
940
|
+
"description": "lib/prose-marker.sh — shared marker write + read helpers for the bassclef"
|
|
941
|
+
},
|
|
910
942
|
{
|
|
911
943
|
"slug": "prose-scan-boundary",
|
|
912
944
|
"type": "lib",
|
|
@@ -984,7 +1016,7 @@
|
|
|
984
1016
|
"type": "lib",
|
|
985
1017
|
"path": "lib/tier-dependency-audit.sh",
|
|
986
1018
|
"tier": "lite",
|
|
987
|
-
"content_hash": "sha256:
|
|
1019
|
+
"content_hash": "sha256:9b65ecf00ff584c573e84ca9e7d980e492e9673a11669ba3e1c3ecb5cd1ef2da",
|
|
988
1020
|
"description": "lib/tier-dependency-audit.sh"
|
|
989
1021
|
},
|
|
990
1022
|
{
|
|
@@ -1367,7 +1399,7 @@
|
|
|
1367
1399
|
"type": "presence-template",
|
|
1368
1400
|
"path": "presence/install/bassclef-sync.template.sh",
|
|
1369
1401
|
"tier": "lite",
|
|
1370
|
-
"content_hash": "sha256:
|
|
1402
|
+
"content_hash": "sha256:a33dd77165b005cfe639ea5093e5af4620c49022bcef6ad5d8cb0670129814d8",
|
|
1371
1403
|
"description": "description: BASSCLEF_SYNC_VERSION=2026-09-06-1496-sessionstart-heal-v1"
|
|
1372
1404
|
},
|
|
1373
1405
|
{
|
|
@@ -1375,7 +1407,7 @@
|
|
|
1375
1407
|
"type": "presence-template",
|
|
1376
1408
|
"path": "presence/install/schedule-auto-save.cron.sh",
|
|
1377
1409
|
"tier": "lite",
|
|
1378
|
-
"content_hash": "sha256:
|
|
1410
|
+
"content_hash": "sha256:2b84a5e3abadbaa7ded77a6801c5624b6d04ba75a93caa2a86cf83d7c975f53f",
|
|
1379
1411
|
"description": "description: schedule-auto-save.cron.sh — install a cron entry that fires auto-save-idle.sh"
|
|
1380
1412
|
},
|
|
1381
1413
|
{
|
|
@@ -1398,7 +1430,7 @@
|
|
|
1398
1430
|
"type": "root-doc",
|
|
1399
1431
|
"path": ".claude/bassclef-orientation.md",
|
|
1400
1432
|
"tier": "lite",
|
|
1401
|
-
"content_hash": "sha256:
|
|
1433
|
+
"content_hash": "sha256:9e98b2a6fe7038d46642ef22061b22660ebf8fb0a0ae719af6b928655c997804"
|
|
1402
1434
|
},
|
|
1403
1435
|
{
|
|
1404
1436
|
"slug": "claude-lite",
|
|
@@ -1429,7 +1461,7 @@
|
|
|
1429
1461
|
"type": "root-doc",
|
|
1430
1462
|
"path": "README.md",
|
|
1431
1463
|
"tier": "lite",
|
|
1432
|
-
"content_hash": "sha256:
|
|
1464
|
+
"content_hash": "sha256:a27a7b9d211fc1cd92864d56bd05fe5912dcd27781bf8d5229844ac909421765",
|
|
1433
1465
|
"description": "A shared substrate for working with AI coding agents."
|
|
1434
1466
|
},
|
|
1435
1467
|
{
|
|
@@ -1541,7 +1573,7 @@
|
|
|
1541
1573
|
"type": "rule",
|
|
1542
1574
|
"path": ".claude/rules/branching.md",
|
|
1543
1575
|
"tier": "lite",
|
|
1544
|
-
"content_hash": "sha256:
|
|
1576
|
+
"content_hash": "sha256:ce380a635aa65ba6087e560bb29335e7011f855884c94702b3414aa51ea8e3d0",
|
|
1545
1577
|
"description": "Trunk-based development — branch naming and flow"
|
|
1546
1578
|
},
|
|
1547
1579
|
{
|
|
@@ -1669,7 +1701,7 @@
|
|
|
1669
1701
|
"type": "rule",
|
|
1670
1702
|
"path": ".claude/rules/identifier-leak-prevention.md",
|
|
1671
1703
|
"tier": "lite",
|
|
1672
|
-
"content_hash": "sha256:
|
|
1704
|
+
"content_hash": "sha256:5653d1e6449eb982b73ddad4f9e099a4eb5352423f955067887c60f2af9de2e5",
|
|
1673
1705
|
"description": "Bassclef commits stay free of operator machine identifiers."
|
|
1674
1706
|
},
|
|
1675
1707
|
{
|
|
@@ -1677,7 +1709,7 @@
|
|
|
1677
1709
|
"type": "rule",
|
|
1678
1710
|
"path": ".claude/rules/install-written-paths-mediation.md",
|
|
1679
1711
|
"tier": "lite",
|
|
1680
|
-
"content_hash": "sha256:
|
|
1712
|
+
"content_hash": "sha256:deef48bc21ddbebd8e553eaa9bb021cf0c8759df320529552c9c9d766b56ed4a"
|
|
1681
1713
|
},
|
|
1682
1714
|
{
|
|
1683
1715
|
"slug": "iteration-bet-brief-completeness",
|
|
@@ -1699,7 +1731,7 @@
|
|
|
1699
1731
|
"type": "rule",
|
|
1700
1732
|
"path": ".claude/rules/lite-manifest-schema-change-discipline.md",
|
|
1701
1733
|
"tier": "lite",
|
|
1702
|
-
"content_hash": "sha256:
|
|
1734
|
+
"content_hash": "sha256:558817a99e902b35d6857129ce3b63ac3f1a66b9a7c97049a74f3b6c5ce2d6cc",
|
|
1703
1735
|
"description": "Every lite-manifest schema change ships a migration-note ledger entry in the same PR. Adopters read the ledger before sync."
|
|
1704
1736
|
},
|
|
1705
1737
|
{
|
|
@@ -1870,6 +1902,14 @@
|
|
|
1870
1902
|
"content_hash": "sha256:c6abf0895c5edb60c8b42c741f39c407b6145a63453fe584b7e63559d2bd7e7e",
|
|
1871
1903
|
"description": "Bassclef MUST NOT create a skill (.claude/skills/<name>/SKILL.md) with a name Claude Code's harness already claims."
|
|
1872
1904
|
},
|
|
1905
|
+
{
|
|
1906
|
+
"slug": "reviewer-dispatch",
|
|
1907
|
+
"type": "rule",
|
|
1908
|
+
"path": ".claude/rules/reviewer-dispatch.md",
|
|
1909
|
+
"tier": "lite",
|
|
1910
|
+
"content_hash": "sha256:78be083820e114ab2a940823ef47210bcdda7bed9b27d327a8724b4bbdd858f0",
|
|
1911
|
+
"description": "Any session that ships source code (files under src/, apps/, packages/, lib/, app/) MUST invoke Reviewer responsibilities before the session ends."
|
|
1912
|
+
},
|
|
1873
1913
|
{
|
|
1874
1914
|
"slug": "schema-management",
|
|
1875
1915
|
"type": "rule",
|
|
@@ -2078,6 +2118,22 @@
|
|
|
2078
2118
|
"content_hash": "sha256:d7a13ca4fb37283e50fc165bb5ebd6a65539d7dade005dcd38098e1d878c52b3",
|
|
2079
2119
|
"description": "analyze-tier-dependencies.sh — orchestrator for the tier-dependency-audit subsystem"
|
|
2080
2120
|
},
|
|
2121
|
+
{
|
|
2122
|
+
"slug": "claude-oauth-probe",
|
|
2123
|
+
"type": "script",
|
|
2124
|
+
"path": ".claude/skills/onboard-repo/claude-oauth-probe.sh",
|
|
2125
|
+
"tier": "lite",
|
|
2126
|
+
"content_hash": "sha256:974b52c28bbafb766c5c45a0beecd140714f4e9afa493d80c9a33e02d0a7a42b",
|
|
2127
|
+
"description": "claude-oauth-probe.sh — portable \"is Claude signed in\" probe."
|
|
2128
|
+
},
|
|
2129
|
+
{
|
|
2130
|
+
"slug": "concise-prompt",
|
|
2131
|
+
"type": "script",
|
|
2132
|
+
"path": ".claude/skills/onboard-repo/concise-prompt.sh",
|
|
2133
|
+
"tier": "lite",
|
|
2134
|
+
"content_hash": "sha256:75f0946c98992117722ea1f0839380f3aeb31f530aa823330a6129a660210d74",
|
|
2135
|
+
"description": "concise-prompt.sh — handle Y/n/skip for Anthropic Concise output style."
|
|
2136
|
+
},
|
|
2081
2137
|
{
|
|
2082
2138
|
"slug": "extract-repo",
|
|
2083
2139
|
"type": "script",
|
|
@@ -2091,7 +2147,7 @@
|
|
|
2091
2147
|
"type": "script",
|
|
2092
2148
|
"path": "scripts/generate-lite-manifest.sh",
|
|
2093
2149
|
"tier": "lite",
|
|
2094
|
-
"content_hash": "sha256:
|
|
2150
|
+
"content_hash": "sha256:f7c551500bdc4062993d50ca5ecb025491ca97980a7318047f6472a3fe091433",
|
|
2095
2151
|
"description": "Generate lite-manifest.json at repo root."
|
|
2096
2152
|
},
|
|
2097
2153
|
{
|
|
@@ -2131,7 +2187,7 @@
|
|
|
2131
2187
|
"type": "script",
|
|
2132
2188
|
"path": "scripts/launch/local-serve.sh",
|
|
2133
2189
|
"tier": "lite",
|
|
2134
|
-
"content_hash": "sha256:
|
|
2190
|
+
"content_hash": "sha256:cb621e555f78862bf926f2ee5681be319f9f0308ca1726ff77f0f7e1237e5589",
|
|
2135
2191
|
"description": "local-serve.sh — serve a /launch local-mode prototype gallery via python http.server"
|
|
2136
2192
|
},
|
|
2137
2193
|
{
|
|
@@ -2174,6 +2230,14 @@
|
|
|
2174
2230
|
"content_hash": "sha256:9d9ad4a997e2820046802796f81a5d064b14f951cdade6f6c252db64d2afae89",
|
|
2175
2231
|
"description": "CLI wrapper for lib/workflow-metrics.sh — Module B4 query helper."
|
|
2176
2232
|
},
|
|
2233
|
+
{
|
|
2234
|
+
"slug": "write-state-marker",
|
|
2235
|
+
"type": "script",
|
|
2236
|
+
"path": ".claude/skills/onboard-repo/write-state-marker.sh",
|
|
2237
|
+
"tier": "lite",
|
|
2238
|
+
"content_hash": "sha256:1f99762804df32a74cb2b19e2930a96d8f8e206f0261795b26766a9cebf0a29a",
|
|
2239
|
+
"description": "write-state-marker.sh — Phase 2.3.9 helper for /onboard-repo (bassclef-upstream#664)."
|
|
2240
|
+
},
|
|
2177
2241
|
{
|
|
2178
2242
|
"slug": "agent-research-spawn",
|
|
2179
2243
|
"type": "skill",
|
|
@@ -2272,7 +2336,7 @@
|
|
|
2272
2336
|
"type": "skill",
|
|
2273
2337
|
"path": ".claude/skills/build/SKILL.md",
|
|
2274
2338
|
"tier": "lite",
|
|
2275
|
-
"content_hash": "sha256:
|
|
2339
|
+
"content_hash": "sha256:25931569f4d2aa77db69c03f2deb7cfe9cba3f03a4720fea2c4234a2b6d6918e",
|
|
2276
2340
|
"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.",
|
|
2277
2341
|
"inputs": [
|
|
2278
2342
|
"A goal slug pointing to a spec on disk"
|
|
@@ -2429,7 +2493,7 @@
|
|
|
2429
2493
|
"type": "skill",
|
|
2430
2494
|
"path": ".claude/skills/eisenhower/SKILL.md",
|
|
2431
2495
|
"tier": "lite",
|
|
2432
|
-
"content_hash": "sha256:
|
|
2496
|
+
"content_hash": "sha256:cc8c006f3a40aa55d7572fb43c22f0403400cd2d86b82c84c244e7d2d94f2827",
|
|
2433
2497
|
"description": "Turn open tickets and PRs into a scored Eisenhower matrix — do, schedule, delegate, delete. Anchors 'important' to a goal you name first, so the sort has meaning. Two modes: default (current repo) and --cross-repo.",
|
|
2434
2498
|
"composes_with": [
|
|
2435
2499
|
"value-prop",
|
|
@@ -2668,7 +2732,7 @@
|
|
|
2668
2732
|
"type": "skill",
|
|
2669
2733
|
"path": ".claude/skills/launch/SKILL.md",
|
|
2670
2734
|
"tier": "lite",
|
|
2671
|
-
"content_hash": "sha256:
|
|
2735
|
+
"content_hash": "sha256:ff48cce4bffa2a7044fe009785f53b22a81a975fa8f3351eecb3947b4252a106",
|
|
2672
2736
|
"description": "Compare variants of an idea. Get a mock gallery. Pick a direction. Get a spec, user stories, and a plan to build. Two sizes — medium and full. Three modes — full, local, scratch.",
|
|
2673
2737
|
"inputs": [
|
|
2674
2738
|
"A rough idea or ticket or canvas"
|
|
@@ -2791,7 +2855,7 @@
|
|
|
2791
2855
|
"type": "skill",
|
|
2792
2856
|
"path": ".claude/skills/onboard-repo/SKILL.md",
|
|
2793
2857
|
"tier": "lite",
|
|
2794
|
-
"content_hash": "sha256:
|
|
2858
|
+
"content_hash": "sha256:46a89fb2165070ea6d4622fede69bd4939acdd99f1c9d63a6075e535fb5c72ea",
|
|
2795
2859
|
"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).",
|
|
2796
2860
|
"inputs": [
|
|
2797
2861
|
"Optional flags — --with-deploy-host or --with-secrets or --full"
|
|
@@ -2862,7 +2926,7 @@
|
|
|
2862
2926
|
"type": "skill",
|
|
2863
2927
|
"path": ".claude/skills/pre-mortem/SKILL.md",
|
|
2864
2928
|
"tier": "lite",
|
|
2865
|
-
"content_hash": "sha256:
|
|
2929
|
+
"content_hash": "sha256:32dcece733673d449bc931a0dd6cacb9ab473c338d7516ff2587b3e35f34113e",
|
|
2866
2930
|
"description": "Draft a Klein pre-mortem risk ledger for a scope (goal, feature, PR). Two modes: light (3 luminary lenses, 30 min) and full (5-8 lenses, 90 min). Always fires on auth, schema, payments, or compliance work.",
|
|
2867
2931
|
"inputs": [
|
|
2868
2932
|
"A goal or feature or PR ref",
|
|
@@ -3243,7 +3307,7 @@
|
|
|
3243
3307
|
"type": "skill",
|
|
3244
3308
|
"path": ".claude/skills/sprint/SKILL.md",
|
|
3245
3309
|
"tier": "lite",
|
|
3246
|
-
"content_hash": "sha256:
|
|
3310
|
+
"content_hash": "sha256:f9a83bfeacd95de10699fb06bf91aade2200546d2d3511fac2fe780d76d5030f",
|
|
3247
3311
|
"description": "Show what's in flight and what's next. Reads project state, open issues, and the active goal. Proposes the next sprint at thread level, not just the nearest leaf. Run at session start.",
|
|
3248
3312
|
"composes_with": [
|
|
3249
3313
|
"value-prop",
|
|
@@ -3380,7 +3444,7 @@
|
|
|
3380
3444
|
"type": "skill",
|
|
3381
3445
|
"path": ".claude/skills/temperance/SKILL.md",
|
|
3382
3446
|
"tier": "lite",
|
|
3383
|
-
"content_hash": "sha256:
|
|
3447
|
+
"content_hash": "sha256:ab1dbcb1bfcdb94d590ab32de13af96a155a4fba2f381b57f828b00e257eb161",
|
|
3384
3448
|
"description": "Pause and think before you code. Asks — am I building the right thing AND building it the right way? Fires before every non-trivial action.",
|
|
3385
3449
|
"inputs": [
|
|
3386
3450
|
"Optional scope decision context"
|
|
@@ -3871,7 +3935,7 @@
|
|
|
3871
3935
|
"type": "standard",
|
|
3872
3936
|
"path": "standards/lite-manifest-schema-changes.md",
|
|
3873
3937
|
"tier": "lite",
|
|
3874
|
-
"content_hash": "sha256:
|
|
3938
|
+
"content_hash": "sha256:9717e5237f4f2a3ed18e8202d5fbe273f9a92d609d0820665f515eb82e978a97",
|
|
3875
3939
|
"description": "Chronological ledger of every lite-manifest schema change. Adopters read this before sync to know what shifted."
|
|
3876
3940
|
},
|
|
3877
3941
|
{
|
|
@@ -4034,6 +4098,13 @@
|
|
|
4034
4098
|
"content_hash": "sha256:fec13744cd05f15144f313fe284c1d471be755bceb2b94e476e0629ffe231c50",
|
|
4035
4099
|
"description": "Standard directory structure for sunj-labs repositories."
|
|
4036
4100
|
},
|
|
4101
|
+
{
|
|
4102
|
+
"slug": "prose-marker-format",
|
|
4103
|
+
"type": "standard",
|
|
4104
|
+
"path": "standards/prose-marker-format.md",
|
|
4105
|
+
"tier": "lite",
|
|
4106
|
+
"content_hash": "sha256:8d31a3ddf3d728558650254b88d35552933d6539009faf264c793bc82559d9a8"
|
|
4107
|
+
},
|
|
4037
4108
|
{
|
|
4038
4109
|
"slug": "prototype-gallery",
|
|
4039
4110
|
"type": "standard",
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: prose-marker-format
|
|
4
|
+
version: 1.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Prose marker format
|
|
8
|
+
|
|
9
|
+
Shared marker shape for the bassclef prose scorer stack. Three producers write markers at Stop event. One consumer (`plain-english-steering.sh`) reads them at UserPromptSubmit and injects per-turn numbers.
|
|
10
|
+
|
|
11
|
+
This standard pins the shape so each producer writes markers the steering injector reads cleanly. Hoare pre/postcondition contract makes the lib `lib/prose-marker.sh` verifiable per Tier 0 tests.
|
|
12
|
+
|
|
13
|
+
## Sources read
|
|
14
|
+
|
|
15
|
+
- `.claude/hooks/turn-prose-grade-measure.sh`:153-170 — existing marker shape for `state/markers/turn-grade/last-turn.json`
|
|
16
|
+
- `.claude/hooks/turn-prose-grade-measure.sh`:171-217 — existing marker shape for `state/markers/turn-prose-flags/last-turn.json`
|
|
17
|
+
- `docs/iteration-bets/2026-10-13-longrun-2-scorer-stack-v1.md` — Longrun 2 scope + 7-step plan + RFC folds
|
|
18
|
+
- `docs/rfcs/2026-10-13-longrun-2-scorer-stack-v1-adversarial.md` — RFC O2 + O3 FOLDs (lib shape); N1 FOLD (glyph legend); F2 architect-review AMBER (Hoare contract fold)
|
|
19
|
+
- `docs/audits/2026-10-13-plain-english-steering-baseline.md` — baseline numbers that pin the thresholds
|
|
20
|
+
- `.claude/luminaries/tony-hoare.md` — pre/postcondition contract shape (anchor)
|
|
21
|
+
- `.claude/luminaries/john-ousterhout.md` — deep module single interface (anchor)
|
|
22
|
+
|
|
23
|
+
## Marker shape
|
|
24
|
+
|
|
25
|
+
Each prose marker lands at `state/markers/<scorer-name>/last-turn.json` and conforms to this JSON shape:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"metric": "<name>",
|
|
30
|
+
"value": <number>,
|
|
31
|
+
"measured_at": "<ISO-8601 UTC timestamp>",
|
|
32
|
+
"glyph": "🟢" | "🟡" | "🔴",
|
|
33
|
+
"threshold_green": <number>,
|
|
34
|
+
"threshold_amber": <number>,
|
|
35
|
+
"source": "<producer hook name>",
|
|
36
|
+
"notes": "<optional one-line note>"
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Required fields — `metric`, `value`, `measured_at`, `source`.
|
|
41
|
+
Optional fields — `glyph`, `threshold_green`, `threshold_amber`, `notes`.
|
|
42
|
+
|
|
43
|
+
## Hoare pre/postcondition contract
|
|
44
|
+
|
|
45
|
+
Per `lib/prose-marker.sh`:
|
|
46
|
+
|
|
47
|
+
### `write_prose_marker <scorer-name> <value> [notes]`
|
|
48
|
+
|
|
49
|
+
- **Precondition** — `scorer-name` is a non-empty string matching `[a-z-]+`. `value` is a number (integer or float). Working directory is a bassclef repo root with `state/markers/` writable.
|
|
50
|
+
- **Postcondition** — a file at `state/markers/<scorer-name>/last-turn.json` exists AND contains valid JSON matching the marker shape above AND has `measured_at` as a fresh ISO-8601 timestamp AND atomic write via `mv` from temp file (no partial writes visible).
|
|
51
|
+
- **Invariant** — a prior marker at the same path is overwritten atomically; no race condition for concurrent writers (different scorer names write to different directories).
|
|
52
|
+
|
|
53
|
+
### `read_prose_markers [--max-age-minutes N] <scorer-name> [<scorer-name> ...]`
|
|
54
|
+
|
|
55
|
+
- **Precondition** — zero or more `scorer-name` arguments. Each is a non-empty string matching `[a-z-]+`. Working directory is a bassclef repo root.
|
|
56
|
+
- **Postcondition** — stdout emits one JSON object. Keys are scorer names. Values are either the marker object (parsed from disk) OR `null` if the marker file does not exist OR is older than `max-age-minutes` (default 10) OR fails to parse as JSON.
|
|
57
|
+
- **Invariant** — any read failure returns `null` for that scorer without crashing the whole call. Fail-soft per Nygard.
|
|
58
|
+
|
|
59
|
+
## Scorer registry
|
|
60
|
+
|
|
61
|
+
The initial scorer stack carries three metrics:
|
|
62
|
+
|
|
63
|
+
| Scorer name | Metric | Marker path | Producer hook | Green threshold | Amber threshold |
|
|
64
|
+
|---|---|---|---|---|---|
|
|
65
|
+
| `grade` | Flesch-Kincaid grade level | `state/markers/turn-grade/last-turn.json` | `turn-prose-grade-measure.sh` | ≤8 | ≤10 |
|
|
66
|
+
| `density` | Non-standard hyphenated-compound count per turn | `state/markers/turn-prose-density/last-turn.json` | `turn-prose-density-measure.sh` | 0 | ≤3 |
|
|
67
|
+
| `appositive_misses` | Session-invented shorthand without adjacent appositive per turn | `state/markers/turn-prose-appositive/last-turn.json` | `turn-prose-kiss-check.sh` (Step 2c extension) | 0 | ≤2 |
|
|
68
|
+
|
|
69
|
+
Thresholds grounded against baseline numbers at `docs/audits/2026-10-13-plain-english-steering-baseline.md`:
|
|
70
|
+
|
|
71
|
+
- Grade — target band is 6-8; ceiling is 10 (baseline mean 7.6; 19% past ceiling)
|
|
72
|
+
- Density — non-standard hyphen compounds; baseline mean 4.1/turn; green=0 reflects clean prose; amber=3 is the baseline mean floor
|
|
73
|
+
- Appositive misses — baseline mean 0.95/turn; green=0 reflects every shorthand glossed; amber=2 picks up the 10-30% miss tail
|
|
74
|
+
|
|
75
|
+
## Glyph legend
|
|
76
|
+
|
|
77
|
+
- 🟢 — value at or below `threshold_green`; clean
|
|
78
|
+
- 🟡 — value between `threshold_green` and `threshold_amber`; drift zone
|
|
79
|
+
- 🔴 — value above `threshold_amber`; action needed
|
|
80
|
+
|
|
81
|
+
Rendering at `plain-english-steering.sh` injection — one line per scorer:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
[prose: grade 7.2 🟢 density 4 🟡 appositive 2 🟡]
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Cap at 160 chars total per injection line. If a scorer marker reads `null` (missing or stale), its field omits from the injection line.
|
|
88
|
+
|
|
89
|
+
## Density allowlist (standard-tech exclusions)
|
|
90
|
+
|
|
91
|
+
The density scorer excludes 25 standard-tech hyphenated compounds. These never count toward density:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
pre-commit, real-time, data-driven, end-to-end, fire-and-forget,
|
|
95
|
+
run-time, compile-time, read-only, write-only, fail-soft,
|
|
96
|
+
fail-fast, post-commit, pre-push, post-merge, op-ed,
|
|
97
|
+
self-test, self-check, re-read, re-run, re-fire,
|
|
98
|
+
op-cost, copy-paste, cut-off, set-up, built-in
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Follow-on refinement.** Architect-review AMBER F4 flagged this list as author-curated. Grounding sampled from top-20 hyphenated compounds across 10 session transcripts lands as a follow-on PR after `turn-prose-density-measure.sh` ships. Baseline list ships as above for V1.
|
|
102
|
+
|
|
103
|
+
## Change log
|
|
104
|
+
|
|
105
|
+
- 2026-10-12 — v1.0 initial format. Grade + density + appositive scorers. Hoare contract on lib. Glyph legend. Follow-on allowlist grounding.
|