@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 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.11** - A methodology for reliable, parallelizable development using Claude Code with optional Agent Teams support.
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.11",
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 {