@tekyzinc/gsd-t 4.9.11 → 4.9.12
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/CHANGELOG.md +9 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/scripts/gsd-t-brevity-guard.js +44 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GSD-T are documented here. Updated with each release.
|
|
4
4
|
|
|
5
|
+
## [4.9.12] - 2026-06-23 (M93 brevity-guard live-tuning — patch)
|
|
6
|
+
|
|
7
|
+
### Changed — brevity guard catches more, false-blocks less
|
|
8
|
+
|
|
9
|
+
Live use surfaced two gaps in the M93 brevity-guard Stop hook (it missed a real verbose reply, then would have false-blocked a clean one):
|
|
10
|
+
|
|
11
|
+
- **Interleaved preamble detection** — the guard previously only caught process-narration *stacked at the very front*. It now also catches narration/meta-commentary *scattered through the opening* (ack → narrate → a little content → narrate again → over-explain), which is the real exhausting shape. Conservative: scans only the first 6 sentences, needs ≥2 hits.
|
|
12
|
+
- **Narrowed live-reply jargon scope** — the hook no longer forces a gloss on a bare milestone code like `M92` (established conversational shorthand once context exists — it was false-blocking clean answers). It still forces glosses on the genuinely opaque IDs (`HC-003`, `S2-M7`). The stricter rule stays in the document lint (`gsd-t-jargon-lint.cjs`), where a reader has no conversation for context.
|
|
13
|
+
|
|
5
14
|
## [4.9.11] - 2026-06-23 (M93 — Brevity Guard: enforce concise, answer-first output — patch)
|
|
6
15
|
|
|
7
16
|
### Added — conciseness is now enforced, not just requested
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# GSD-T: Contract-Driven Development for Claude Code
|
|
2
2
|
|
|
3
|
-
**v4.9.
|
|
3
|
+
**v4.9.12** - A methodology for reliable, parallelizable development using Claude Code with optional Agent Teams support.
|
|
4
4
|
|
|
5
5
|
**Eliminates context rot** — task-level fresh dispatch (one subagent per task, ~10-20% context each) means compaction never triggers.
|
|
6
6
|
**Compaction-proof debug loops** — `gsd-t headless --debug-loop` runs test-fix-retest cycles as separate `claude -p` sessions. A JSONL debug ledger persists all hypothesis/fix/learning history across fresh sessions. Anti-repetition preamble injection prevents retrying failed hypotheses. Escalation tiers (sonnet → opus → human) and a hard iteration ceiling enforced externally.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tekyzinc/gsd-t",
|
|
3
|
-
"version": "4.9.
|
|
3
|
+
"version": "4.9.12",
|
|
4
4
|
"description": "GSD-T: Contract-Driven Development for Claude Code — 54 slash commands with headless-by-default workflow spawning, unattended supervisor relay with event stream, graph-powered code analysis, real-time agent dashboard, task telemetry, doc-ripple enforcement, backlog management, impact analysis, test sync, milestone archival, and PRD generation",
|
|
5
5
|
"author": "Tekyz, Inc.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -63,15 +63,28 @@ const ALLOWLIST = new Set([
|
|
|
63
63
|
]);
|
|
64
64
|
|
|
65
65
|
// High-signal code-token patterns (bare, unglossed → block on first use).
|
|
66
|
+
// LIVE-REPLY scope only: limited to the genuinely opaque IDs the user can't decode
|
|
67
|
+
// (contract / hard-constraint / stage-milestone codes). A bare `M92` milestone ref
|
|
68
|
+
// is established conversational shorthand once context exists — forcing a gloss on
|
|
69
|
+
// it every turn is over-strict and false-blocks clean answers. The stricter
|
|
70
|
+
// `M\d+-D\d+`-and-bare-`M\d+` rule stays in the DOC lint (bin/gsd-t-jargon-lint.cjs),
|
|
71
|
+
// where a reader has no conversational context. (M93 live-tuning, 2026-06-23.)
|
|
66
72
|
const JARGON_PATTERNS = [
|
|
67
|
-
/\bS2-M\d+\b/, // S2-M7
|
|
68
|
-
/\bHC-\d+\b/, // HC-003
|
|
69
|
-
/\bM\d+(?:-D\d+(?:-T\d+)?)?\b/, // M92, M92-D1, M92-D1-T3
|
|
73
|
+
/\bS2-M\d+\b/, // S2-M7 (stage-milestone code)
|
|
74
|
+
/\bHC-\d+\b/, // HC-003 (hard-constraint / contract id)
|
|
70
75
|
];
|
|
71
76
|
|
|
72
77
|
// Narration openers: first-person "about to" framing — intent without content.
|
|
73
78
|
const NARRATION_OPENER =
|
|
74
|
-
/^(let me|before i\b|i'?ll\b|i'?m going to|i am going to|first,?\s+let me|i want to|i need to|let's|let us|going to)\b/i;
|
|
79
|
+
/^(let me|before i\b|i'?ll\b|i'?m going to|i am going to|first,?\s+let me|i want to|i need to|let's|let us|going to|i need to be|i have to|i should|i want to be|let me untangle|i'?m going to verify)\b/i;
|
|
80
|
+
|
|
81
|
+
// Meta-commentary / hedge openers — sentences that talk ABOUT the answer instead
|
|
82
|
+
// of giving it ("the honest correction:", "here's the real picture", "good catch —
|
|
83
|
+
// and I…", "where does that leave you"). These don't match NARRATION_OPENER but are
|
|
84
|
+
// the same preamble disease — over-explaining around the answer. Counted in the
|
|
85
|
+
// interleaved scan, NOT the leading scan (they appear mid-reply).
|
|
86
|
+
const META_OPENER =
|
|
87
|
+
/^(good (catch|question|point|instinct)|fair (challenge|point)|the honest|here'?s (the|what)|so,? (where|to|that|let)|that'?s (a |the )?(real|fair|honest)|the (real |accurate )?(picture|version|correction|nuance)|to (untangle|be (clear|precise|careful|honest))|i (conflated|misspoke|need to be|want to be))\b/i;
|
|
75
88
|
|
|
76
89
|
// ── Transcript tail-scan (REUSED from gsd-t-conversation-capture.js) ─────────
|
|
77
90
|
// Pull the most recent assistant turn from a Claude Code transcript JSONL by
|
|
@@ -223,6 +236,21 @@ function _leadingNarrationCount(prose) {
|
|
|
223
236
|
return count;
|
|
224
237
|
}
|
|
225
238
|
|
|
239
|
+
// Count narration + meta-commentary sentences INTERLEAVED in the opening region
|
|
240
|
+
// (the first WINDOW sentences), regardless of contiguity. Catches the real failure
|
|
241
|
+
// shape the leading-only scan misses: an ack, then narration, then a content
|
|
242
|
+
// sentence, then MORE narration ("Good catch… Let me untangle… What I said was X…
|
|
243
|
+
// Let me verify…"). Conservative: only scans the opening window, needs >=2 hits.
|
|
244
|
+
const INTERLEAVED_WINDOW = 6;
|
|
245
|
+
function _interleavedPreambleCount(prose) {
|
|
246
|
+
const sentences = _sentences(prose).slice(0, INTERLEAVED_WINDOW);
|
|
247
|
+
let count = 0;
|
|
248
|
+
for (const s of sentences) {
|
|
249
|
+
if (NARRATION_OPENER.test(s) || META_OPENER.test(s)) count++;
|
|
250
|
+
}
|
|
251
|
+
return count;
|
|
252
|
+
}
|
|
253
|
+
|
|
226
254
|
// Find a bare unglossed high-signal jargon token (first occurrence, no gloss).
|
|
227
255
|
// A gloss = parenthetical or quote in the SAME sentence containing the token.
|
|
228
256
|
function _findBareJargon(prose) {
|
|
@@ -268,6 +296,18 @@ function detect(text, mode) {
|
|
|
268
296
|
};
|
|
269
297
|
}
|
|
270
298
|
|
|
299
|
+
// Interleaved preamble: narration/meta-commentary scattered through the opening
|
|
300
|
+
// (not just stacked at the front). The real exhausting shape: ack → narrate →
|
|
301
|
+
// a bit of content → narrate again → over-explain.
|
|
302
|
+
const interleaved = _interleavedPreambleCount(prose);
|
|
303
|
+
if (interleaved >= 2) {
|
|
304
|
+
return {
|
|
305
|
+
block: true,
|
|
306
|
+
reason: "Answer-first: the opening has " + interleaved +
|
|
307
|
+
" preamble/meta sentences (narration or 'here's the real picture'-style framing) around the answer. Lead with the answer; cut the meta-commentary.",
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
271
311
|
const jargon = _findBareJargon(prose);
|
|
272
312
|
if (jargon) {
|
|
273
313
|
return {
|