@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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
|
|
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.
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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.
|
|
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
|