@tekyzinc/gsd-t 5.11.10 → 5.11.11

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,40 @@
2
2
 
3
3
  All notable changes to GSD-T are documented here. Updated with each release.
4
4
 
5
+ ## [5.11.11] - 2026-08-09
6
+
7
+ ### Fixed — the reply shortener was shortening itself
8
+
9
+ The child Claude was started with the personal settings, which carry the very
10
+ Stop hook that spawned it. It answered in about 4 seconds, its own hook then saw
11
+ an answer over the 60-word threshold and spawned a THIRD Claude, and the outer
12
+ call waited ~46s for work it had caused — past its own 45s limit, so it was
13
+ killed and returned nothing. Every turn, since the day it shipped.
14
+
15
+ `--setting-sources project` starts the child without the personal layer.
16
+ Measured twice each: **54.2s/54.5s before, 7.9s/6.2s after**; through the real
17
+ hook, 8.6s / 10.1s / 10.8s, all producing a rewrite.
18
+
19
+ The trigger was always the child's own REPLY crossing 60 words, never the input
20
+ text — a 63-character prompt that produces a long answer is just as slow.
21
+
22
+ Two flags rejected by measurement and recorded so they are not retried: `--bare`
23
+ skips the keychain and the child answers "Not logged in"; `--settings '{}'`
24
+ cannot remove an inherited hook, because settings layers merge.
25
+
26
+ The `--disallowed-tools` flag from 5.11.10 is removed — its root cause was
27
+ disproved (52.6s with, 52.5s without), and leaving it would enshrine a wrong
28
+ explanation.
29
+
30
+ Separately: the hook captured the rewriter's stderr into a pipe it never read,
31
+ so the loud timeout warning added in 5.11.10 reached nobody. It is inherited
32
+ now — the let-it-through paths are approved passes *because* the reader can see
33
+ them happen.
34
+
35
+ - `bin/gsd-t-concise-rewrite.cjs`: the child no longer inherits the hook that spawned it
36
+ - `scripts/gsd-t-concise-hook.js`: the child's stderr reaches the screen
37
+ - `test/m107-concise-rewrite.test.js`: 3 tests pin the recursion, the two rejected flags, the stderr
38
+
5
39
  ## [5.11.10] - 2026-08-09
6
40
 
7
41
  ### Fixed — four safety gates were passing without checking anything
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # GSD-T: Contract-Driven Development for Claude Code
2
2
 
3
- **v5.11.10** - A methodology for reliable, parallelizable development using Claude Code with optional Agent Teams support.
3
+ **v5.11.11** - 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.
@@ -136,23 +136,29 @@ function checkInvariants(original, rewritten) {
136
136
  return lost;
137
137
  }
138
138
 
139
- // Shortening prose needs no tools. Left able to use them, the rewriter read the
140
- // file paths and commands INSIDE the reply as work to do and went off running
141
- // them — 41 seconds, killed on timeout, empty output and empty stderr, on every
142
- // turn for two days. Forbidding tools returns the same rewrite in about 7
143
- // seconds. The list is explicit rather than a mode flag so a newly added tool
144
- // cannot quietly re-open the same hole.
145
- const NO_TOOLS = [
146
- "Bash", "Read", "Write", "Edit", "NotebookEdit", "Glob", "Grep",
147
- "Task", "Agent", "WebFetch", "WebSearch", "TodoWrite",
148
- ].join(",");
149
-
150
139
  /** Ask a fresh Claude to do the rewrite. */
151
140
  function rewrite(text, cfg) {
152
141
  const prompt = `${RULES}\n\n--- REPLY TO REWRITE ---\n${text}`;
142
+ // `--setting-sources project` is what stops the shortener shortening itself.
143
+ //
144
+ // A child started with the personal settings inherits the very Stop hook that
145
+ // spawned it: it answers in about 4 seconds, its own hook then sees an answer
146
+ // over the 60-word threshold and spawns a THIRD Claude, and the outer call
147
+ // waits ~46s for work it caused — past the 45s limit, so it was killed and
148
+ // returned nothing, every turn since it shipped. Measured: 54.2s/54.5s with
149
+ // the personal settings, 7.9s/6.2s with only the project's.
150
+ //
151
+ // The trigger was always the CHILD'S OWN REPLY crossing 60 words, never the
152
+ // input: a 63-character prompt that produces a long answer is just as slow
153
+ // (57.2s on, 11.7s off).
154
+ //
155
+ // Not `--bare`, the documented skip-hooks flag: it also skips the keychain, so
156
+ // the child returns "Not logged in" in 0.7s. Not `--settings '{}'` either —
157
+ // settings layers merge, so a lower layer cannot remove a higher layer's hook
158
+ // (54.5s/56.1s, unchanged).
153
159
  const run = spawnSync("claude",
154
160
  ["-p", prompt, "--model", cfg.model, "--dangerously-skip-permissions",
155
- "--disallowed-tools", NO_TOOLS],
161
+ "--setting-sources", "project"],
156
162
  { encoding: "utf8", timeout: cfg.timeoutMs, maxBuffer: 8 * 1024 * 1024 });
157
163
 
158
164
  if (run.error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekyzinc/gsd-t",
3
- "version": "5.11.10",
3
+ "version": "5.11.11",
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",
@@ -214,9 +214,15 @@ function main() {
214
214
  const rewriter = findRewriter(cwd);
215
215
  if (!rewriter) return allow();
216
216
 
217
+ // The rewriter's own warnings go to stderr. Captured into a pipe and never
218
+ // read, they reach nobody — which is why the timeouts stayed invisible even
219
+ // after a loud message was added for them. Letting the child write straight
220
+ // to this process's stderr is what makes a give-up path visible; these paths
221
+ // are approved passes precisely BECAUSE the reader can see them happen.
217
222
  const run = spawnSync(process.execPath,
218
223
  [rewriter, "--text", last.text, "--project", cwd, "--json"],
219
- { encoding: "utf8", timeout: 60000, maxBuffer: 8 * 1024 * 1024 });
224
+ { encoding: "utf8", timeout: 60000, maxBuffer: 8 * 1024 * 1024,
225
+ stdio: ["ignore", "pipe", "inherit"] });
220
226
 
221
227
  if (run.error || !run.stdout) return allow();
222
228