@tekyzinc/gsd-t 4.0.22 → 4.0.24
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 +24 -0
- package/package.json +1 -1
- package/templates/workflows/gsd-t-scan.workflow.js +27 -12
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GSD-T are documented here. Updated with each release.
|
|
4
4
|
|
|
5
|
+
## [4.0.24] - 2026-06-03 (M76 revision — keep severity color bullets)
|
|
6
|
+
|
|
7
|
+
### Fixed — over-correction: v4.0.23 stripped the severity color bullets too
|
|
8
|
+
|
|
9
|
+
v4.0.23 removed the severity emoji (🔴🟠🟡🟢) along with the em-dashes. But the emoji render fine and are wanted; the actual mojibake cause was only the em/en-dashes and smart quotes. Reverted the emoji strip:
|
|
10
|
+
|
|
11
|
+
- `templates/workflows/gsd-t-scan.workflow.js`: `ascii()` now normalizes em/en-dashes, smart quotes, and ellipsis ONLY — it no longer strips emoji. The severity color bullets are kept in the summary table + section headers. Doc-phase punctuation instruction updated to explicitly allow the severity bullets.
|
|
12
|
+
- `test/m76-ascii-clean-register.test.js`: updated to assert bullets are KEPT and dashes/quotes/ellipsis are normalized.
|
|
13
|
+
- One-off: restored the color bullets in the HiloAviation register (summary table + 4 severity section headers) while keeping the em-dash fix.
|
|
14
|
+
|
|
15
|
+
Suite: 1311 pass / 0 fail / 4 skip — zero regressions.
|
|
16
|
+
|
|
17
|
+
## [4.0.23] - 2026-06-03 (M76 ASCII-Clean Register Output — patch)
|
|
18
|
+
|
|
19
|
+
### Fixed — register/docs rendered as mojibake in non-UTF-8 terminals
|
|
20
|
+
|
|
21
|
+
The scan register used emoji severity markers (🔴🟠🟡🟢) and em-dashes. In a non-UTF-8 terminal/pager these display as garbage boxes (`βPADCCH`/`πAPCCCH`). The file bytes were valid UTF-8 — purely a render problem — but the emoji added nothing and made the register unreadable in common viewers.
|
|
22
|
+
|
|
23
|
+
- `templates/workflows/gsd-t-scan.workflow.js`: added `ascii()` sanitizer (strips emoji/symbols, normalizes em/en dashes → `-`, smart quotes → ASCII, ellipsis → `...`). `fmtChunks` now emits plain-ASCII headers/tables and sanitizes every user-supplied field (finder text can contain these too). Document-phase agents instructed "ASCII ONLY".
|
|
24
|
+
- `test/m76-ascii-clean-register.test.js`: +5 tests (sanitizer behavior + a structural guard that fmtChunks' output literals contain no emoji/em-dash).
|
|
25
|
+
- One-off: cleaned the existing HiloAviation scan docs (techdebt.md + plain-english + 5 dimension files) — 0 emoji / 0 em-dashes remaining.
|
|
26
|
+
|
|
27
|
+
Suite: 1311 pass / 0 fail / 4 skip — zero regressions.
|
|
28
|
+
|
|
5
29
|
## [4.0.22] - 2026-06-02 (M75 Deterministic Chunked Register Write — patch)
|
|
6
30
|
|
|
7
31
|
### Fixed — synthesis no longer stalls writing a large register
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tekyzinc/gsd-t",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.24",
|
|
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",
|
|
@@ -494,30 +494,44 @@ counts.total = finalFindings.length;
|
|
|
494
494
|
// of a 466KB register truncates at ~165KB — verified). Chunk 0 is the header+summary
|
|
495
495
|
// (Write/create); the rest are appends. Items are grouped so a chunk never splits an
|
|
496
496
|
// item, and the severity-section heading rides with its first item's chunk.
|
|
497
|
+
// M76 (revised): the mojibake culprit was EM-DASHES (—) and smart quotes, NOT the
|
|
498
|
+
// severity color bullets (🔴🟠🟡🟢) — those render fine and are intentional/wanted.
|
|
499
|
+
// So ascii() normalizes em/en-dashes, smart quotes, and ellipsis (and tidies trailing
|
|
500
|
+
// whitespace), but KEEPS emoji. It's applied to finder-supplied free-text fields so a
|
|
501
|
+
// stray dash in a description doesn't mojibake; the severity bullets live in the
|
|
502
|
+
// template below and are preserved.
|
|
503
|
+
function ascii(s) {
|
|
504
|
+
return String(s == null ? "" : s)
|
|
505
|
+
.replace(/[—–]/g, "-") // em/en dash -> hyphen (the actual mojibake cause)
|
|
506
|
+
.replace(/[‘’]/g, "'") // smart single quotes
|
|
507
|
+
.replace(/[“”]/g, '"') // smart double quotes
|
|
508
|
+
.replace(/…/g, "...") // ellipsis
|
|
509
|
+
.replace(/[ \t]+\n/g, "\n"); // tidy trailing whitespace
|
|
510
|
+
}
|
|
497
511
|
function fmtChunks(today) {
|
|
498
512
|
const sevHead = { CRITICAL: "🔴 Critical", HIGH: "🟠 High", MEDIUM: "🟡 Medium", LOW: "🟢 Low" };
|
|
499
513
|
const head = [];
|
|
500
|
-
head.push(`# Tech Debt Register
|
|
501
|
-
if (scanNumber) head.push(`**Scan #${scanNumber}**
|
|
514
|
+
head.push(`# Tech Debt Register - ${projectDir.split("/").pop()}`, "");
|
|
515
|
+
if (scanNumber) head.push(`**Scan #${scanNumber}** - Deep codebase scan (runtime-native, ${coverageComplete ? "full coverage" : "PARTIAL coverage"})`);
|
|
502
516
|
head.push(`**Date:** ${today}`);
|
|
503
|
-
head.push(`**Slices run:** ${slices.length} | **Coverage:** ${coverageComplete ? `FULL
|
|
517
|
+
head.push(`**Slices run:** ${slices.length} | **Coverage:** ${coverageComplete ? `FULL - all ${slices.length} slices succeeded` : `PARTIAL - ${succeededCount}/${slices.length} succeeded`}`);
|
|
504
518
|
head.push(`**Verified findings:** ${counts.total}`, "");
|
|
505
519
|
head.push(`> Effort estimates use GSD-T-native units (domain / wave / spawn / token-spend). Never human-hours.`);
|
|
506
520
|
head.push(`> TD numbering continues from the prior register (if any, archived). This scan begins at **TD-${tdStart}**.`, "");
|
|
507
|
-
if (!coverageComplete) head.push(`>
|
|
521
|
+
if (!coverageComplete) head.push(`> ⚠️ **PARTIAL COVERAGE - ${failedSlices.length} of ${slices.length} codebase areas were NOT scanned this pass** (failed to return findings): ${ascii(failedSlices.join(", "))}. Findings UNDER-COUNT the real debt. Re-run (resume) for full coverage.`, "");
|
|
508
522
|
head.push(`## Summary`, "", `| Severity | Count |`, `|----------|-------|`,
|
|
509
523
|
`| 🔴 CRITICAL | ${counts.critical} |`, `| 🟠 HIGH | ${counts.high} |`,
|
|
510
524
|
`| 🟡 MEDIUM | ${counts.medium} |`, `| 🟢 LOW | ${counts.low} |`,
|
|
511
525
|
`| **Total** | **${counts.total}** |`, "", "---", "");
|
|
512
526
|
|
|
513
527
|
function itemMd(f, td) {
|
|
514
|
-
const L = [`### TD-${td}
|
|
515
|
-
`- **Area:** ${f.area || "
|
|
516
|
-
`- **Location:** ${(f.files && f.files.length) ? f.files.join(", ") : "
|
|
517
|
-
if (f.detail) L.push(`- **Description:** ${f.detail}`);
|
|
518
|
-
if (f.impact) L.push(`- **Impact:** ${f.impact}`);
|
|
519
|
-
if (f.recommendation) L.push(`- **Remediation:** ${f.recommendation}`);
|
|
520
|
-
if (f.slice) L.push(`- **Found in slice:** ${f.slice}`);
|
|
528
|
+
const L = [`### TD-${td} - ${ascii(f.title) || "(untitled)"}`,
|
|
529
|
+
`- **Area:** ${ascii(f.area) || "(none)"}`, `- **Severity:** ${f.severity}`, `- **Status:** OPEN`,
|
|
530
|
+
`- **Location:** ${(f.files && f.files.length) ? ascii(f.files.join(", ")) : "(none)"}`];
|
|
531
|
+
if (f.detail) L.push(`- **Description:** ${ascii(f.detail)}`);
|
|
532
|
+
if (f.impact) L.push(`- **Impact:** ${ascii(f.impact)}`);
|
|
533
|
+
if (f.recommendation) L.push(`- **Remediation:** ${ascii(f.recommendation)}`);
|
|
534
|
+
if (f.slice) L.push(`- **Found in slice:** ${ascii(f.slice)}`);
|
|
521
535
|
L.push("");
|
|
522
536
|
return L.join("\n");
|
|
523
537
|
}
|
|
@@ -646,7 +660,8 @@ const docResults = await parallel(
|
|
|
646
660
|
d.prompt,
|
|
647
661
|
``,
|
|
648
662
|
isLiving ? mergeNote : `Write the file fresh in the format described (use Bash \`mkdir -p\` for parent dirs if needed).`,
|
|
649
|
-
`
|
|
663
|
+
`PUNCTUATION: do NOT use em-dashes (use " - "), en-dashes, smart quotes, or ellipsis characters — those render as garbage in non-UTF-8 terminals. Use plain ASCII hyphens and straight quotes. (Severity color bullets 🔴🟠🟡🟢 are fine to keep where used for severity.)`,
|
|
664
|
+
`Read the actual code under the relevant slice paths for specifics - don't summarize only from findings. Use Write/Edit to write the file, then return JSON per the schema (status "written"/"merged"/"skipped"/"failed"). Do NOT commit - the workflow handles git at the end.`,
|
|
650
665
|
].filter(Boolean).join("\n");
|
|
651
666
|
try {
|
|
652
667
|
return await agent(prompt, { label: d.label, phase: "Document", schema: DOC_RESULT_SCHEMA, model: "sonnet" });
|