@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 +34 -0
- package/README.md +1 -1
- package/bin/gsd-t-concise-rewrite.cjs +18 -12
- package/package.json +1 -1
- package/scripts/gsd-t-concise-hook.js +7 -1
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.
|
|
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
|
-
"--
|
|
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.
|
|
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
|
|