@tekyzinc/gsd-t 2.70.14 → 2.70.15

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,16 @@
2
2
 
3
3
  All notable changes to GSD-T are documented here. Updated with each release.
4
4
 
5
+ ## [2.70.15] - 2026-04-06
6
+
7
+ ### Changed (design pipeline — decompose verification)
8
+ - **Separate Verification Agent** — `gsd-t-design-decompose` Step 6.5 now spawns a dedicated opus-model verification subagent instead of self-verifying chart classifications. The decompose agent cannot verify its own work — sunk cost bias causes it to rubber-stamp its classifications. The separate agent has fresh context and its sole incentive is finding mismatches.
9
+ - **BAR CHART ORIENTATION PROOF** — mechanical decision tree injected into the verification agent prompt: rectangles in a ROW → HORIZONTAL, rectangles BOTTOM-TO-TOP → VERTICAL. Eliminates the #1 misclassification (horizontal percentage bars classified as vertical grouped).
10
+ - **Max 2 fix cycles** — if the verifier finds mismatches, contracts are corrected and re-verified (up to 2 cycles). Persistent failures block decompose completion.
11
+
12
+ ### Why
13
+ v2.70.14 ensured "build follows contracts" but the contracts themselves were wrong. The decompose command's Step 6.5 asked the same agent to verify its own chart type classifications — it always passed itself. Three charts (`Number of Tools`, `Time on Page`, `Number of Visits`) were classified as `bar-vertical-grouped` when the Figma shows `bar-stacked-horizontal-percentage`. A separate verification agent with no sunk cost catches these mismatches before contracts are finalized.
14
+
5
15
  ## [2.70.14] - 2026-04-06
6
16
 
7
17
  ### Changed (design pipeline — hierarchical execution)
@@ -301,40 +301,112 @@ Per-page element manifest (for verification agent):
301
301
  | {analytics} | {N} | {N} — {list} |
302
302
  ```
303
303
 
304
- ## Step 6.5: Contract-vs-Figma Verification Gate (MANDATORY)
304
+ ## Step 6.5: Contract-vs-Figma Verification Gate — SEPARATE AGENT (MANDATORY)
305
305
 
306
- After writing all contracts but BEFORE proceeding to partition or build, verify that each contract accurately represents the Figma design. This gate catches errors that would otherwise propagate through the entire build.
306
+ After writing all contracts but BEFORE proceeding to partition or build, spawn a **dedicated verification subagent** to independently verify every chart classification against the Figma source. This agent has FRESH context, no sunk cost in the classifications, and its sole incentive is finding mismatches.
307
307
 
308
- ### For each widget contract:
308
+ > **Why a separate agent?** The decompose agent that classified the charts cannot objectively verify its own classifications. It has the same blind spots that caused the misclassification. This was proven repeatedly — the same agent rubber-stamps its own work. A fresh agent with only the contracts and Figma access catches what the classifier missed.
309
309
 
310
- 1. **Re-read the Figma node** — call `get_design_context` (or re-examine the screenshot) for the specific widget node
311
- 2. **Compare the contract's claimed structure against the actual Figma node:**
310
+ **OBSERVABILITY LOGGING (MANDATORY):**
311
+ Before spawning run via Bash:
312
+ `T_START=$(date +%s) && DT_START=$(date +"%Y-%m-%d %H:%M") && TOK_START=${CLAUDE_CONTEXT_TOKENS_USED:-0} && TOK_MAX=${CLAUDE_CONTEXT_TOKENS_MAX:-200000}`
312
313
 
313
- | Check | What to verify | Failure mode it prevents |
314
- |-------|---------------|------------------------|
315
- | Chart type | Contract's element name matches the actual visual pattern | Donut classified as stacked bar (or vice versa) |
316
- | Data labels | Contract's Test Fixture labels match the Figma text exactly | Hallucinated column headers, invented metrics |
317
- | Element count | Number of sub-elements in contract matches Figma | Missing legends, extra charts, wrong layout |
318
- | Text content | Every title, subtitle, label, legend item matches Figma verbatim | "Engagement per video" subtitle that doesn't exist in Figma |
319
- | Layout structure | Widget's claimed layout matches Figma arrangement | Side-by-side classified as stacked, 2 charts classified as 1 |
320
-
321
- 3. **Produce a contract-vs-Figma mismatch report:**
314
+ [opus] gsd-t-design-decompose Chart Classification Verifier
322
315
 
323
316
  ```
324
- CONTRACT-VS-FIGMA VERIFICATION
325
- ───────────────────────────────
326
- most-popular-tools-card: chart-donut MATCHES Figma node 123:458
327
- number-of-tools-card: chart-bar-stacked-horizontal-percentageMATCHES
328
- member-state-card: chart-donut MISMATCH: Figma shows stacked vertical bars, not donuts
329
- Fix: reclassify as chart-bar-stacked-vertical, rewrite element contract
330
- ❌ video-playlist-table: columns [Title, Duration, Views, Watch Time, Completion]
331
- MISMATCH: Figma shows [Video, Viewed, Clicked Thumbnail, Clicked CTA, Avg. Seconds Watched]
332
- Fix: update Test Fixture column headers
317
+ Task subagent (general-purpose, model: opus):
318
+ "You are the Chart Classification Verifier. Your ONLY job is to independently
319
+ verify that each element contract's chart type classification matches the actual
320
+ Figma design. You have ZERO knowledge of how the charts were classified you
321
+ are seeing them fresh. Your incentive: every misclassification you catch prevents
322
+ a wrong chart being built. Every misclassification you miss causes a rebuild.
323
+
324
+ ## Contracts to Verify
325
+ {list each element contract filename + its claimed chart type from INDEX.md}
326
+
327
+ ## Figma Source
328
+ File key: {fileKey}
329
+ Page node: {nodeId}
330
+
331
+ ## Verification Process
332
+
333
+ For EACH element contract that claims a chart/visualization type:
334
+
335
+ 1. Read the element contract — note its claimed type (e.g., 'bar-vertical-grouped')
336
+ 2. Find the Figma node ID referenced in the contract (or in the widget that uses it)
337
+ 3. Call `get_design_context` on that specific node ID — examine the STRUCTURE:
338
+ - Layout mode (horizontal vs vertical arrangement of children)
339
+ - Child elements (are they bars? segments? slices?)
340
+ - How children are arranged (side by side? stacked? overlapping?)
341
+ - Dimensions (do bars extend horizontally or vertically?)
342
+
343
+ 4. Walk the decision tree INDEPENDENTLY (do NOT read the contract's reasoning):
344
+
345
+ BAR CHART ORIENTATION PROOF:
346
+ a. Are the data-bearing rectangles arranged HORIZONTALLY (left to right)?
347
+ → Segments share ONE ROW, each segment's WIDTH encodes its value
348
+ → This is HORIZONTAL (stacked if touching, grouped if separated)
349
+ b. Are the data-bearing rectangles arranged VERTICALLY (bottom to top)?
350
+ → Each bar is a COLUMN, each bar's HEIGHT encodes its value
351
+ → This is VERTICAL (stacked if layered, grouped if side-by-side)
352
+ c. Is it ONE bar with colored segments? → STACKED
353
+ Is it MULTIPLE separate bars? → GROUPED
354
+ d. Do labels show percentages summing to 100%? → PERCENTAGE variant
355
+
356
+ CRITICAL DISTINCTION — the #1 misclassification:
357
+ A single horizontal bar divided into colored segments (each segment's WIDTH
358
+ represents a percentage) is chart-bar-stacked-horizontal-percentage.
359
+ Multiple vertical columns of different heights side-by-side is
360
+ chart-bar-grouped-vertical. These render COMPLETELY DIFFERENTLY.
361
+ If you see colored blocks in a ROW → HORIZONTAL. Period.
362
+
363
+ 5. Compare YOUR classification against the contract's classification.
364
+
365
+ 6. For EACH element, produce:
366
+
367
+ ```
368
+ Element: {name}
369
+ Contract claims: {chart type}
370
+ Figma node: {id}
371
+ I SEE: {describe what the Figma MCP returned — layout, children, arrangement}
372
+ MY CLASSIFICATION: {your independent classification}
373
+ VERDICT: ✅ MATCH or ❌ MISMATCH
374
+ If MISMATCH: Contract says {X} but Figma shows {Y} because {evidence}
375
+ ```
376
+
377
+ ## Report
378
+
379
+ Produce the full verification table:
380
+
381
+ | # | Element | Contract Type | Verified Type | Figma Evidence | Verdict |
382
+ |---|---------|--------------|---------------|----------------|---------|
383
+ | 1 | chart-donut | chart-donut | chart-donut | circular arcs + center hole | ✅ MATCH |
384
+ | 2 | bar-vertical-grouped | bar-vertical-grouped | bar-stacked-horizontal-pct | 4 segments in ONE horizontal row | ❌ MISMATCH |
385
+
386
+ If ANY ❌ MISMATCH found:
387
+ - List each mismatch with the correct classification and evidence
388
+ - Report: 'VERIFICATION FAILED — {N} misclassifications found. Contracts must be fixed before build.'
389
+
390
+ If ALL ✅ MATCH:
391
+ - Report: 'VERIFICATION PASSED — all {N} chart classifications confirmed against Figma source.'
392
+ "
333
393
  ```
334
394
 
335
- 4. **If ANY mismatches found**: fix the contracts BEFORE proceeding. Do not build from wrong contracts.
395
+ After subagent returns run via Bash:
396
+ `T_END=$(date +%s) && DT_END=$(date +"%Y-%m-%d %H:%M") && TOK_END=${CLAUDE_CONTEXT_TOKENS_USED:-0} && DURATION=$((T_END-T_START))`
397
+
398
+ Compute tokens/compaction per standard pattern. Append to `.gsd-t/token-log.md`.
399
+
400
+ **If VERIFICATION FAILED**: Fix every misclassified element contract before proceeding:
401
+ 1. Rename the contract file to match the correct chart type
402
+ 2. Rewrite the visual spec section to match the correct chart type
403
+ 3. Update INDEX.md references
404
+ 4. Update any widget contracts that reference the renamed element
405
+ 5. **Re-run the verification subagent** to confirm fixes (max 2 cycles)
406
+
407
+ **If VERIFICATION PASSED**: Proceed to Step 7.
336
408
 
337
- > **Why this gate exists**: The two-terminal validation (tasks 001-013) proved the system produces 50/50 scores when contracts are correctbut also revealed that scoring code-vs-contract doesn't catch contract-vs-Figma errors. This gate closes that gap.
409
+ > **Why this gate exists**: The decompose agent's own examples show the correct classification for "Number of Tools" as `chart-bar-stacked-horizontal-percentage`yet the agent classified the same chart as `bar-vertical-grouped` in practice. Soft instructions ("MANDATORY decision tree") don't prevent misclassification. A separate agent with fresh context and inverted incentives (success = finding errors) does.
338
410
 
339
411
  ## Step 7: Wire Into Partition
340
412
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekyzinc/gsd-t",
3
- "version": "2.70.14",
3
+ "version": "2.70.15",
4
4
  "description": "GSD-T: Contract-Driven Development for Claude Code — 54 slash commands with headless CI/CD mode, graph-powered code analysis, real-time agent dashboard, execution intelligence, 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",