@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 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.18** - A methodology for reliable, parallelizable development using Claude Code with optional Agent Teams support.
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.18",
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(", ")}. The register will be flagged INCOMPLETE. Resume the run to re-scan only the failed slices.`);
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