@tekyzinc/gsd-t 2.64.10 → 2.66.10

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
+ ## [2.66.10] - 2026-04-05
6
+
7
+ ### Changed (page-contract template)
8
+ - **Composes Elements (direct)** split into two sub-lists: "Existing element contracts used directly" vs "Inline stubs (promotion candidates)". Closes gap P8 from page-tier run 3.
9
+ - **Route guards stub convention** — if a guard is declared but not yet wired, prefix with `(stub)` and link the milestone that will wire it. Closes gap P9.
10
+ - **Skip link `tabindex="-1"` note** — `<main>` must be programmatically focusable for skip-link navigation. Closes gap P10.
11
+
12
+ ### Milestone
13
+ - **Hierarchical contract system CONVERGED** — 3×3 matrix complete: element/widget/page tiers × 3 convergence runs each × 50/50 score. 11 of 14 gaps resolved across v2.59.10–v2.66.10; remaining 3 are widget-template refinements, non-blocking.
14
+
15
+ ## [2.65.10] - 2026-04-05
16
+
17
+ ### Changed (page-contract template)
18
+ - **Boundary grep regex tightened** — line-anchored (`^\s*`) + requires opening `{` — avoids false positives on JS identifiers like `donutProps` or property access `obj.donut`. Only matches actual CSS rules. Closes gap P5 from page-tier run 2.
19
+
20
+ ### Added (page-contract template)
21
+ - **Multi-state Page Fixture convention** — for pages whose state swaps widget data, declare one full fixture per state under `__states__` keys, referencing named widget sub-fixtures (`#/fixture-sessions`). Prefer full duplication over override deltas. Closes gap P6.
22
+ - **Inline-stub promotion guidance** — if a page-scope control is used in ≥2 pages, promote to its own widget contract; until then list in Composes Elements (direct) with `(promotion candidate)` tag. Closes gap P7.
23
+
5
24
  ## [2.64.10] - 2026-04-05
6
25
 
7
26
  ### Added (page-contract template)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekyzinc/gsd-t",
3
- "version": "2.64.10",
3
+ "version": "2.66.10",
4
4
  "description": "GSD-T: Contract-Driven Development for Claude Code — 51 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",
@@ -44,6 +44,27 @@ If you want to formalize the composition chain (element → widget → page), de
44
44
 
45
45
  Skip this section for pages that are pure assembly with no storybook / harness target. Include it when the page has a dedicated demo route or when multiple pages share widget fixtures and you want to document which instance each page references.
46
46
 
47
+ **Multi-state pages** (when page state swaps widget data): declare **one full fixture per state**, keyed by the state name. Prefer full duplication over override deltas — it's more verbose but makes each state independently runnable and avoids merge ambiguity.
48
+
49
+ ```json
50
+ {
51
+ "__fixture_source__": "composed-from-widgets",
52
+ "__states__": ["Members", "Sessions"],
53
+ "Members": {
54
+ "donut": "$ref:donut-chart-card-widget#/fixture",
55
+ "bar": "$ref:bar-chart-card-widget#/fixture"
56
+ },
57
+ "Sessions": {
58
+ "donut": "$ref:donut-chart-card-widget#/fixture-sessions",
59
+ "bar": "$ref:bar-chart-card-widget#/fixture-sessions"
60
+ }
61
+ }
62
+ ```
63
+
64
+ Widget contracts that have multiple fixture variants expose them as named sub-fixtures (`#/fixture-sessions`, `#/fixture-q4`, etc.) rather than a single `#/fixture`.
65
+
66
+ **Inline-stub promotion**: if a page-scope control or chrome element (segmented control, tab bar, breadcrumb) is used in ≥2 pages, promote it to its own widget contract. Until promoted, list the stub in **Composes Elements (direct)** with a `(promotion candidate)` tag and the page paths that use it.
67
+
47
68
  ## Layout
48
69
 
49
70
  ```
@@ -91,7 +112,7 @@ Skip this section for pages that are pure assembly with no storybook / harness t
91
112
  ## Routing & Navigation
92
113
 
93
114
  - **Route**: {/dashboard/overview}
94
- - **Guards**: {requires authentication, role: user|admin}
115
+ - **Guards**: {requires authentication, role: user|admin} — if the guard is declared but not yet wired, prefix with `(stub)` and link the authentication milestone that will wire it (e.g., `(stub) requires-auth — milestone M4`).
95
116
  - **Breadcrumbs**: {Home > Dashboard > Overview}
96
117
  - **Nav active state**: {highlights "Dashboard" in nav-sidebar}
97
118
 
@@ -129,7 +150,7 @@ Skip this section for pages that are pure assembly with no storybook / harness t
129
150
  ## Accessibility
130
151
 
131
152
  - **Landmarks**: `<header>`, `<nav>`, `<main>`, per-widget `<section role="region">`
132
- - **Skip link**: "Skip to main content" at top, focuses `<main>` on activation
153
+ - **Skip link**: "Skip to main content" at top, focuses `<main>` on activation. If the skip link targets `<main>`, `<main>` MUST have `tabindex="-1"` to be programmatically focusable via hash-link navigation.
133
154
  - **Keyboard order**: header → sidebar → widgets in visual reading order
134
155
  - **Page title**: Set via `<title>` per route
135
156
 
@@ -152,7 +173,11 @@ A page is **FORBIDDEN** from:
152
173
  - Overriding widget visual spec via `:deep()` selectors or `!important` on widget-owned properties
153
174
  - Re-specifying element visual spec (colors, font sizes, radii, paddings owned by elements)
154
175
 
155
- **Enforcement check**: `grep` the page file for any CSS selector matching a widget's internal class names — if found, move the styling into the widget contract or create a widget variant.
176
+ **Enforcement check** (line-anchored CSS-only grep, avoids false positives on JS identifiers):
177
+ ```
178
+ grep -En '^\s*(\.card-title|\.donut|\.legend-dot|\.kpi-value|\.chart-wrapper|\.filter-select)[^\w-]*\{' {page-file}
179
+ ```
180
+ The leading `^\s*` anchor + trailing `\{` requirement matches ONLY CSS rules at the start of a line, not JS property access (`obj.donut`) or variable names (`donutProps`). If any match is found, move the styling into the widget contract or create a widget variant.
156
181
 
157
182
  ## Verification Checklist
158
183