@tekyzinc/gsd-t 2.71.10 → 2.71.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 CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to GSD-T are documented here. Updated with each release.
4
4
 
5
+ ## [2.71.11] - 2026-04-08
6
+
7
+ ### Fixed (design-build — review gates and measurement)
8
+ - **Explicit Blocking Review Gates** — Steps 5 (widgets) and 6 (pages) now include their own inline bash polling loops instead of cross-referencing Step 3. The subagent was treating "Wait for human review (Step 3)" as an informational note and skipping the gate entirely, building all three tiers without ever showing the review UI.
9
+ - **Concrete Widget Measurement** — Step 5 now has full Playwright `page.evaluate()` code for measuring grid columns, gap, children-per-row, padding, and child positioning. Previously was a single vague line ("Playwright measure the assembled widget").
10
+ - **Concrete Page Measurement** — Step 6 now has explicit Playwright code for grid column count verification, section ordering, widget width ratios, spacing, and responsive breakpoints. Grid column mismatch (e.g., 4-across instead of 2-across) is flagged as `severity: "critical"`.
11
+ - **Auto-Rejection for Grid Failures** — Review server now auto-rejects items with `grid-template-columns`, `gridTemplateColumns`, `columns-per-row`, or `children-per-row` measurement failures as critical (same as chart type mismatches).
12
+
13
+ ### Why
14
+ User ran `design-build` and the builder completed all three tiers (elements → widgets → pages) without ever displaying the review panel. The review gate in Steps 5/6 used parenthetical cross-references that the subagent ignored. Additionally, the page rendered 4-across when the contract specified 2-across — the measurement step had no concrete code to catch this.
15
+
5
16
  ## [2.70.15] - 2026-04-06
6
17
 
7
18
  ### Changed (design pipeline — decompose verification)
@@ -175,23 +175,27 @@ If rejected:
175
175
 
176
176
  Continue building remaining elements. Don't wait for human review — queue them all.
177
177
 
178
- ## Step 3: Wait for Human Review
178
+ ## Step 3: Wait for Human Review (BLOCKING)
179
179
 
180
- After all elements are built and queued, enter the poll loop:
180
+ **This is a BLOCKING step. Do NOT proceed to Step 4 until the human submits their review. Do NOT skip this step. Do NOT treat this as optional.**
181
+
182
+ After all elements are built and queued, **STOP** and enter the poll loop:
181
183
 
182
184
  ```
183
- Waiting for human review...
185
+ Waiting for human review of elements...
184
186
  Review UI: http://localhost:3456/review
185
187
  {N} elements queued, awaiting submission
186
188
  ```
187
189
 
188
- Poll for the review-complete signal:
190
+ Poll for the review-complete signal — **actually run this bash loop**:
189
191
  ```bash
190
192
  while [ ! -f .gsd-t/design-review/review-complete.json ]; do
191
193
  sleep 5
192
194
  done
193
195
  ```
194
196
 
197
+ **Only after `review-complete.json` appears**, proceed to Step 4.
198
+
195
199
  ## Step 4: Process Feedback
196
200
 
197
201
  Read `.gsd-t/design-review/review-complete.json` and each feedback file in `.gsd-t/design-review/feedback/`.
@@ -233,29 +237,96 @@ If any elements were re-queued → return to Step 3 (max 3 review cycles total).
233
237
 
234
238
  ## Step 5: Widget Assembly Phase
235
239
 
236
- After all elements are approved:
240
+ **GATE: Do NOT start this step until ALL elements from Step 2 have been reviewed and approved by the human in the review UI.**
237
241
 
238
242
  1. Read widget contracts from `.gsd-t/contracts/design/widgets/`
239
243
  2. For each widget:
240
244
  a. Build the widget — MUST import approved element components, not rebuild them inline
241
245
  b. Verify imports: grep the widget file for element imports
242
- c. Playwright measure the assembled widget
243
- d. Queue for review (same flow as elements)
244
- 3. Wait for human review (Step 3)
245
- 4. Process feedback (Step 4)
246
+ c. **Render-Measure-Compare** — use Playwright to measure the assembled widget against its contract specs:
247
+ ```javascript
248
+ // In Playwright page.evaluate():
249
+ const widget = document.querySelector(widgetSelector);
250
+ const s = getComputedStyle(widget);
251
+ const rect = widget.getBoundingClientRect();
252
+ // Measure layout properties from widget contract:
253
+ // - grid-template-columns / grid-template-rows (column count, track sizes)
254
+ // - gap / row-gap / column-gap
255
+ // - padding, margin, border-radius
256
+ // - width, height, aspect-ratio
257
+ // Count direct children and verify against contract's expected child count
258
+ const children = widget.children;
259
+ const childRects = [...children].map(c => c.getBoundingClientRect());
260
+ // Verify children-per-row: count children whose top is within 2px of first child's top
261
+ const firstRowTop = childRects[0]?.top;
262
+ const childrenPerRow = childRects.filter(r => Math.abs(r.top - firstRowTop) < 2).length;
263
+ // Compare ALL measured values against contract specs
264
+ // Build measurements array: [{ property, expected, actual, pass }]
265
+ ```
266
+ **Every measurement failure MUST appear in the queue JSON measurements array with `pass: false`.**
267
+ d. Write queue JSON to `.gsd-t/design-review/queue/{widget-id}.json` (same format as elements, with `"type": "widget"`)
268
+ e. Check for auto-rejections (sleep 3, check `rejected/` dir) — fix and re-queue if rejected (max 2 cycles)
269
+ 3. After ALL widgets are built and queued, **STOP and poll for human review** — this is a BLOCKING wait, do NOT proceed until the human submits:
270
+ ```
271
+ Waiting for human review of widgets...
272
+ Review UI: http://localhost:3456/review
273
+ {N} widgets queued, awaiting submission
274
+ ```
275
+ ```bash
276
+ while [ ! -f .gsd-t/design-review/review-complete.json ]; do
277
+ sleep 5
278
+ done
279
+ ```
280
+ 4. Process feedback — read `review-complete.json` and each feedback file, apply changes/fixes per the same rules as Step 4. Clear queue, delete signal, clear feedback after processing. If any widgets re-queued → return to sub-step 3 (max 3 review cycles).
246
281
 
247
282
  ## Step 6: Page Composition Phase
248
283
 
249
- After all widgets are approved:
284
+ **GATE: Do NOT start this step until ALL widgets from Step 5 have been reviewed and approved by the human in the review UI.**
250
285
 
251
286
  1. Read page contracts from `.gsd-t/contracts/design/pages/`
252
287
  2. For each page:
253
288
  a. Build the page — MUST import approved widget components
254
- b. Verify grid layout, section ordering, responsive breakpoints
255
- c. Playwright measure the full page
256
- d. Queue for review
257
- 3. Wait for human review
258
- 4. Process feedback
289
+ b. **Render-Measure-Compare** use Playwright to verify the full page layout against its contract specs:
290
+ ```javascript
291
+ // In Playwright page.evaluate():
292
+ // 1. GRID LAYOUT verify column count matches contract
293
+ const grid = document.querySelector(pageGridSelector);
294
+ const gridStyle = getComputedStyle(grid);
295
+ const columns = gridStyle.gridTemplateColumns.split(' ').length;
296
+ // Compare against contract's expected column count (e.g., 2, not 4)
297
+
298
+ // 2. SECTION ORDERING — verify widgets appear in contract-specified order
299
+ const sections = [...grid.querySelectorAll('[data-section]')];
300
+ const sectionOrder = sections.map(s => s.dataset.section);
301
+ // Compare against contract's section order array
302
+
303
+ // 3. WIDGET DIMENSIONS — verify each widget's width relative to grid
304
+ const gridRect = grid.getBoundingClientRect();
305
+ const widgetRects = sections.map(s => s.getBoundingClientRect());
306
+ // For a 2-column grid: each widget should be ~50% of grid width (minus gap)
307
+ // For a 1-column widget spanning full width: should be ~100% of grid width
308
+
309
+ // 4. SPACING — verify gap, padding, margins match contract
310
+ // gap, rowGap, columnGap, padding
311
+
312
+ // 5. RESPONSIVE — if contract specifies breakpoints, measure at each viewport width
313
+ // Build measurements array: [{ property, expected, actual, pass }]
314
+ ```
315
+ **Grid column count is a CRITICAL measurement. If the contract says 2 columns and the page renders 4, this is `severity: "critical"` and MUST be flagged.**
316
+ c. Write queue JSON to `.gsd-t/design-review/queue/{page-id}.json` (same format, with `"type": "page"`)
317
+ e. Check for auto-rejections (sleep 3, check `rejected/` dir) — fix and re-queue if rejected (max 2 cycles)
318
+ 3. After ALL pages are built and queued, **STOP and poll for human review** — this is a BLOCKING wait, do NOT proceed until the human submits:
319
+ ```
320
+ Waiting for human review of pages...
321
+ Review UI: http://localhost:3456/review
322
+ {N} pages queued, awaiting submission
323
+ ```
324
+ ```bash
325
+ while [ ! -f .gsd-t/design-review/review-complete.json ]; do
326
+ sleep 5
327
+ done
328
+ ```
329
+ 4. Process feedback — same rules as Step 4. Clear queue, delete signal, clear feedback. If any pages re-queued → return to sub-step 3 (max 3 review cycles).
259
330
 
260
331
  ## Step 7: Cleanup and Report
261
332
 
@@ -307,8 +378,10 @@ Update `.gsd-t/progress.md` with completion status.
307
378
 
308
379
  - NEVER share builder context with Term 2 — coordination is files only
309
380
  - NEVER skip the review cycle — every component goes through Term 2 + human
310
- - NEVER proceed to widgets before all elements are approved
381
+ - NEVER proceed to widgets before all elements are reviewed and approved by the human — the bash polling loop MUST block until `review-complete.json` appears
382
+ - NEVER proceed to pages before all widgets are reviewed and approved by the human — same blocking poll
311
383
  - NEVER rebuild element functionality inline in widgets — always import
384
+ - NEVER skip or shortcut the bash polling loop — it MUST actually execute and block
312
385
  - Max 3 review cycles per phase — if still failing, stop and present to user
313
386
  - Auto-open the browser review UI so the user doesn't have to find it
314
387
  - Kill all background processes on completion or error
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekyzinc/gsd-t",
3
- "version": "2.71.10",
3
+ "version": "2.71.11",
4
4
  "description": "GSD-T: Contract-Driven Development for Claude Code — 56 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",
@@ -79,7 +79,11 @@ function autoRejectFailures() {
79
79
  m.severity === "critical" ||
80
80
  m.property === "chart type" ||
81
81
  m.property === "display" ||
82
- m.property === "flexDirection"
82
+ m.property === "flexDirection" ||
83
+ m.property === "grid-template-columns" ||
84
+ m.property === "gridTemplateColumns" ||
85
+ m.property === "columns-per-row" ||
86
+ m.property === "children-per-row"
83
87
  );
84
88
  if (criticalFailures.length > 0) {
85
89
  // Auto-reject: write feedback and remove from queue