@tekyzinc/gsd-t 5.11.18 → 5.11.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/CHANGELOG.md +19 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/templates/workflows/gsd-t-scan.workflow.js +47 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GSD-T are documented here. Updated with each release.
|
|
4
4
|
|
|
5
|
+
## [5.11.19] - 2026-08-10
|
|
6
|
+
|
|
7
|
+
### Changed — a scan that lost areas now STOPS instead of writing the report
|
|
8
|
+
|
|
9
|
+
It already warned and stamped the register PARTIAL. It kept going anyway, so the
|
|
10
|
+
register got written, read, and acted on. On HiloAviation the two lost areas
|
|
11
|
+
were repositories and data-access — the areas with the most to find. A report
|
|
12
|
+
that under-counts the debt while looking finished is worse than no report.
|
|
13
|
+
|
|
14
|
+
The stop happens **before synthesis and before any document is written**, names
|
|
15
|
+
every area that was missed, and returns a failure rather than a quiet success.
|
|
16
|
+
It also says plainly that a failed area is not a clean one.
|
|
17
|
+
|
|
18
|
+
`allowPartial: true` continues deliberately, says so out loud, and the register
|
|
19
|
+
still carries its PARTIAL banner.
|
|
20
|
+
|
|
21
|
+
- `templates/workflows/gsd-t-scan.workflow.js`: the halt + the `allowPartial` option
|
|
22
|
+
- `test/m112-scan-schema-tolerance.test.js`: 4 more tests — the halt precedes writing, names the areas, fails rather than passes, and cannot be bypassed by a truthy-ish value
|
|
23
|
+
|
|
5
24
|
## [5.11.18] - 2026-08-10
|
|
6
25
|
|
|
7
26
|
### Fixed — a scan finding was thrown away over its FORM, not its truth
|
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.19** - 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": "5.11.
|
|
3
|
+
"version": "5.11.19",
|
|
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",
|
|
@@ -56,6 +56,9 @@ const maxSlicesOverride = _args.maxSlicesHint || null; // optional power-user ce
|
|
|
56
56
|
// M94-D6: graph wiring — "wired" (default) or "disabled" (no-graph baseline for AC-4).
|
|
57
57
|
// [RULE] scan-injects-structural-slice / [RULE] no-graph-baseline-proven-graph-free
|
|
58
58
|
const graphMode = (_args.graphMode === "disabled") ? "disabled" : "wired";
|
|
59
|
+
// A scan that lost areas STOPS rather than writing a register that under-counts
|
|
60
|
+
// the debt while looking finished. Set true to accept an incomplete scan.
|
|
61
|
+
const allowPartial = _args.allowPartial === true;
|
|
59
62
|
|
|
60
63
|
// VOLUME-DERIVED CAP — a RUNAWAY BACKSTOP, not the target count. The probe decides
|
|
61
64
|
// the actual slice count by cohesive sub-domain WITHIN this cap; the cap only fires
|
|
@@ -740,7 +743,50 @@ const succeededCount = slices.length - failedSlices.length;
|
|
|
740
743
|
const coverageComplete = failedSlices.length === 0;
|
|
741
744
|
const allFindings = sliceResults.filter(Boolean).filter((r) => !r.failed).flatMap((r) => (r.findings || []).map((f) => ({ ...f, slice: r.slice })));
|
|
742
745
|
if (!coverageComplete) {
|
|
743
|
-
log(`⚠ PARTIAL COVERAGE — ${failedSlices.length}/${slices.length} slices failed after retry and produced NO findings: ${failedSlices.join(", ")}
|
|
746
|
+
log(`⚠ PARTIAL COVERAGE — ${failedSlices.length}/${slices.length} slices failed after retry and produced NO findings: ${failedSlices.join(", ")}.`);
|
|
747
|
+
|
|
748
|
+
// HALT. A scan whose densest areas dropped out is not a scan with a caveat —
|
|
749
|
+
// it is a report that under-counts the debt while looking finished. On
|
|
750
|
+
// HiloAviation two of 228 slices failed, and the two were repositories and
|
|
751
|
+
// data-access: the areas with the most to find. Warning and continuing meant
|
|
752
|
+
// the register got written, read, and acted on as if complete.
|
|
753
|
+
//
|
|
754
|
+
// Writing the documents is the point of no return, so the stop goes HERE,
|
|
755
|
+
// before them — not after, where the flawed register already exists.
|
|
756
|
+
//
|
|
757
|
+
// Not a fallback and not a gate on findings: the run stops and says exactly
|
|
758
|
+
// which areas are missing. `allowPartial: true` continues deliberately, and
|
|
759
|
+
// the register still carries its PARTIAL banner in that case.
|
|
760
|
+
if (!allowPartial) {
|
|
761
|
+
const lines = [
|
|
762
|
+
"",
|
|
763
|
+
"════════════════════════════════════════════════════════════════",
|
|
764
|
+
` SCAN HALTED — ${failedSlices.length} of ${slices.length} areas were never scanned`,
|
|
765
|
+
"════════════════════════════════════════════════════════════════",
|
|
766
|
+
"",
|
|
767
|
+
" Not scanned:",
|
|
768
|
+
...failedSlices.map((k) => ` · ${k}`),
|
|
769
|
+
"",
|
|
770
|
+
" These areas found nothing because they FAILED, not because they",
|
|
771
|
+
" are clean. Their problems are missing from the register.",
|
|
772
|
+
"",
|
|
773
|
+
" Nothing has been written. Re-run to scan only the failed areas,",
|
|
774
|
+
" or re-run with allowPartial: true to accept an incomplete scan",
|
|
775
|
+
" (the register will say PARTIAL on its first line).",
|
|
776
|
+
"════════════════════════════════════════════════════════════════",
|
|
777
|
+
"",
|
|
778
|
+
].join("\n");
|
|
779
|
+
log(lines);
|
|
780
|
+
return {
|
|
781
|
+
ok: false,
|
|
782
|
+
halted: "partial-coverage",
|
|
783
|
+
slicesTotal: slices.length,
|
|
784
|
+
slicesFailed: failedSlices,
|
|
785
|
+
findingsDiscarded: allFindings.length,
|
|
786
|
+
message: `${failedSlices.length} of ${slices.length} areas were never scanned. Nothing written.`,
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
log("→ allowPartial: true — continuing with an INCOMPLETE scan, as asked.");
|
|
744
790
|
}
|
|
745
791
|
log(`deep scan complete: ${allFindings.length} verified findings across ${succeededCount}/${slices.length} slices${coverageComplete ? " (full coverage)" : " (PARTIAL)"}`);
|
|
746
792
|
|