release(v3.0.0): TTI-UX 3.0 prime-time release & communications team handover #65
No reviewers
Labels
No labels
idea
points
1
points
13
points
2
points
3
points
5
points
8
priority
p0
priority
p1
priority
p2
priority
p3
state
blocked
state
done
state
in-progress
state
ready
state
review
state
triage
status
declined
status
in-progress
status
planned
status
proposed
status
shipped
status
under-review
type
bug
type
epic
type
feature
type
spike
type
story
type
task
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
tti/tti-ux!65
Loading…
Reference in a new issue
No description provided.
Delete branch "status-palette"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
TTI-UX 3.0: Prime-Time Release & Communications Team Handover
This release marks the landmark v3.0.0 of the Texas A&M Transportation Institute Design System (TTI-UX / TUX), transitioning the repository to 100% turnkey autonomy for the TTI Communications & Marketing team.
Summary of Major Additions
Brand Foundations & Tokens:
tokens.jsonsingle source of truth across 11 platform targets.maintenance) with OKLab perceptual lightness uniformity and WCAG AAA compliance.Components & Interactive Workbenches (183 Primitives):
<TuxEditorialArticle>layout with 5 interchangeable heroes, reading ergonomics, and APA/BibTeX citation export.Multi-Platform Distribution (11 Synchronized Targets):
@tti/tti-ux-react(React 19 / TSX).@tti/tti-ux-elements(177 zero-dependency Web Components).Tti.Tux.AspNetCore& Blazor components (.NET 8/9).kadence-child-tti) andtti-ux-coreplugin for WordPress.Turnkey Communications Handover:
COMM_HANDOVER.mdoperational runbook at repo root./docs/comm-handoverweb guide with copyable shortcodes and quickstart terminal commands.templates/tux-starter-content).tux-bridge.css).Institutional Quality Harness & Compliance:
node scripts/test-all-suites.mjs.color.semantic is a sentiment palette — good / neutral / bad — and it cannot express the five states an operations surface has to separate at a glance. Building the Nagios Core overlay surfaced two failures that are properties of the palette, not of that consumer: - semantic.success #3D5328 is a deep olive tuned to clear AAA as text on white. Used as a cell tint it loses its hue and reads grey-green. - There is no orange, so UNKNOWN had to borrow chart.5 #8C5A3C, a clay brown that reads as a weak red beside CRITICAL — after which PENDING's neutral grey sat too close to that near-grey brown and read as UNKNOWN. Both survived review because the code referenced canonical tokens throughout and passed every contrast check. What failed was legibility as a RAMP, which nothing in the system was measuring. Adds themes.<t>.status for tti, tti-dark and tti-hc: five states x three roles (base for text and edges, fill for a chip, ink for the word inside it). Hues are inherited from what Nagios Core itself ships, because green -> yellow -> orange -> red is operator muscle memory and a prettier ramp would be a legibility regression dressed as a brand win. tti-hc renders outlined chips so no state depends on a colour-on-colour pair. Values were derived in OKLCH and are authored in tokens.json like everything else. scripts/audit-status-palette.mjs re-derives the constraints and fails on any breach: hue identity within 14deg, chips >= 0.075 apart in OKLab, chip lightness descending with severity, no status colour within 0.10 of brand maroon, and WCAG 2.2 AA as the floor with tti-hc held to AAA. It needs neither a browser nor a Nuxt build, unlike audit:contrast, so it can gate every commit. Each rule was negative-tested. Three of those guards exist because the unconstrained solve actually broke them: CRITICAL landed at #77020b, 0.076 from brand maroon — "down" painted the colour of the chrome. Power BI's good/neutral/bad still resolve to the semantic palette. Re-pointing them would change every report already built on tti-theme.json, and sentiment is arguably right for a KPI card; ADR-0013 records that as an open decision rather than an oversight.The warning chip was #D2D331, a yellow-green. Cause was rule 3, which required chip lightness to descend ok > warning > unknown > critical. sRGB gives each hue a very different lightness at full chroma — yellow ~0.97, green ~0.87, orange ~0.77, red ~0.64 — so a monotonic ramp across all four forces yellow below green, and yellow does not survive being darkened: it turns olive almost immediately. Hue identity outranks weight ordering. The ordering exists to keep ADJACENT WARM hues apart, which is where the collision actually was (pale orange beside pale salmon); green is far enough away in hue that its weight does not matter. - warning fill: #D2D331 -> #ECEE55 (tti), #C6C618 -> #E6E74C (tti-dark) - rule 3 now covers warning > unknown > critical only - separation is unchanged at 0.101 / 0.111 OKLab, well over the 0.075 floor, and ink clears AAA on both ADR-0013 and palette.md record why the rule stops short of ok, so it does not get "fixed" back into a full ramp later.🔧 Security-gate fix map
The gate failed on these dependency findings — fastest path to green for each:
@nuxtjs/mdcbrace-expansionbrace-expansionbracesnpm update braces --package-lock-onlydevaluenpm update devalue --package-lock-onlydevaluenpm update devalue --package-lock-onlydevaluenpm update devalue --package-lock-onlydevaluenpm update devalue --package-lock-onlyjs-yamlnpm update js-yaml --package-lock-onlynode-forgenpm update node-forge --package-lock-onlysharpnpm update sharp --package-lock-onlysvgonpm update svgo --package-lock-onlyundicinpm update undici --package-lock-onlyundicinpm update undici --package-lock-onlyundicinpm update undici --package-lock-onlyPosted once per head commit by the baseline gate (M2). A Renovate PR that only touches a manifest with no lockfile change is a broken pre-2026-08-06 artifact — check its diff before merging.
AI review · advisory
Verdict: 7 things worth fixing (1 high · 4 medium · 2 low) — 8 confirmed, near-duplicates merged.
Findings that didn't map to a diff line:
tokens.css:20· HIGH — Spectrum token values in :root don't match CHANGELOG or COMM_HANDOVER.mdThe actual spectrum tokens defined in tokens.css for the light theme use different hex values (#701D35, #566A8A, etc.) than the ones documented in CHANGELOG.md (#500000, #005480, etc.) and COMM_HANDOVER.md, creating a discrepancy between documentation and implementation
⚑ panel: Muse Glimmer 30B · Gemma 4 31B · Mistral Medium 3.5 128B · Laguna S 2.1 — 11 distinct, 8 confirmed, 1 below threshold, 2 refuted · web: not used · context: 9 files under review · 89 codebase · 5 standards chunks (best-grounded: Muse Glimmer 30B; smaller windows saw less)
Panel debate — how this review was reached
Grounding — context: 9 files under review · 89 codebase · 5 standards chunks (best-grounded: Muse Glimmer 30B; smaller windows saw less)
Round 1 — independent reviews
Round 2 — cross-examination
Muse Glimmer 30B#1Spectrum token values diverge from documented 5-band brand · confirmed: Gemma 4 31B, Mistral Medium 3.5 128B, Laguna S 2.1 · refuted: — · support 3Mistral Medium 3.5 128B#4Spectrum token values in :root don't match CHANGELOG or COMM_HANDOVER.md · confirmed: Muse Glimmer 30B, Gemma 4 31B, Laguna S 2.1 · refuted: — · support 3Gemma 4 31B#1Missing Tailwind mapping for brand wash tokens · confirmed: Muse Glimmer 30B, Mistral Medium 3.5 128B, Laguna S 2.1 · refuted: — · support 3Mistral Medium 3.5 128B#3Missing Tailwind @theme entries for new spectrum tokens · confirmed: — · refuted: Muse Glimmer 30B, Gemma 4 31B, Laguna S 2.1 · support 0Laguna S 2.1#1package.json version not bumped for v3.0.0 release · confirmed: Muse Glimmer 30B, Gemma 4 31B, Mistral Medium 3.5 128B · refuted: — · support 3Laguna S 2.1#2Duplicate .style--bold .heading--bold::after rule conflicts with globals.css · confirmed: Muse Glimmer 30B, Gemma 4 31B · refuted: Mistral Medium 3.5 128B · support 2Muse Glimmer 30B#2heading--bold accent rule now opt-in only, breaking existing editorial headings · confirmed: Gemma 4 31B, Laguna S 2.1 · refuted: Mistral Medium 3.5 128B · support 2Laguna S 2.1#3Unreachable /contrast-audit breadcrumb branch · confirmed: Muse Glimmer 30B, Gemma 4 31B, Mistral Medium 3.5 128B · refuted: — · support 3Mistral Medium 3.5 128B#1Inconsistent color format in CHANGELOG · confirmed: — · refuted: Muse Glimmer 30B, Gemma 4 31B, Laguna S 2.1 · support 0Mistral Medium 3.5 128B#2Inconsistent component count · confirmed: — · refuted: Gemma 4 31B, Laguna S 2.1 · support 0Laguna S 2.1#4Incorrect token file path in handover document · confirmed: Muse Glimmer 30B, Gemma 4 31B, Mistral Medium 3.5 128B · refuted: — · support 3Not posted (support < 2, or contested at a severity where one refutation vetoes)
Mistral Medium 3.5 128B#2Inconsistent component count (support 0)Raised but refuted (left out of the review above)
Mistral Medium 3.5 128B#3Missing Tailwind @theme entries for new spectrum tokens — The PR adds --color-spectrum-maroon, --color-spectrum-blue, --color-spectrum-teal, --color-spectrum-green and --color-spectrum-gold to the @theme blocMistral Medium 3.5 128B#1Inconsistent color format in CHANGELOG — CHANGELOG lists the 5-band spectrum once with #500000, #005480, #006F79, #285C4D, #CFA935. There is no second, conflicting hex for the same token insiSynthesis — Laguna S 2.1 wrote the final review from 8 confirmed findings (+1 below threshold) · promotion: support ≥ 2, and no refutation at high severity.
Transcript
rv-20261005235357-9baf22— full round outputs, web results, and model reasoning are viewable by anyone with access to this repository via the AI gateway.Advisory — never a merge gate. Findings are ordered by how well the panel's own evidence checks out, strongest first. React 👍/👎 on any inline comment to tell it whether it was worth flagging — that is the only feedback this system gets, and every threshold in it is tuned from those reactions. Transcript
rv-20261005235357-9baf22.@ -0,0 +27,4 @@## 2. The 3 Primary Consumption Vectors for Comm### Vector A: WordPress & Kadence WebsitesCOMM_HANDOVER.md:30· LOW — Incorrect token file path in handover documentCOMM_HANDOVER.md states 'tokens.json in repository root' but the canonical token source is design/tokens.json (confirmed by README.md, design/roadmap.md, design/tux.md, and kit/README.md). A Comm team member following this reference would not find the file at the repository root.
Evidence: partly verified — two or more reviewers, quote or anchor verified (panel 4/4).
👍 if this was worth flagging · 👎 if it was not — a reaction on this comment is the whole feedback loop.
@ -98,0 +552,4 @@children: [{ label: "Document Verification", to: "/admin", icon: "lucide:shield-check" },{ label: "Review Cadence", to: "/admin", icon: "lucide:calendar-clock" },{ label: "Reader Issues Triage", to: "/admin", icon: "lucide:life-buoy" },app/app.vue:555· MEDIUM — package.json version not bumped for v3.0.0 releaseThe release PR advertises v3.0.0 (CHANGELOG, README) but package.json still declares "version": "2.2.0". The new onMounted handler reads pkg.version to set the default data-tux-version attribute and version switcher state, so the default visual era defaults to v2.2.0 instead of v3.0.0 — affecting button geometry, header ribbon, and the archive banner logic.
Evidence: partly verified — two or more reviewers, quote or anchor verified (panel 4/4).
👍 if this was worth flagging · 👎 if it was not — a reaction on this comment is the whole feedback loop.
@ -37,0 +309,4 @@}const crumbs: Crumb[] = [{ label: "Home", to: "/" }];app/app.vue:312· LOW — Unreachable /contrast-audit breadcrumb branchThe
if (p === '/contrast-audit')check sits inside theif (p.startsWith('/tokens') || p.startsWith('/design/'))block, but /contrast-audit matches neither prefix, so the branch is dead code. The breadcrumb falls through to the generic handler, producing "Contrast Audit" instead of the intended "Contrast Audit (WCAG AAA)".Proposed replacement (one-click ⚡ Apply on the findings board at the top of this PR):
Evidence: partly verified — two or more reviewers, quote or anchor verified (panel 4/4).
👍 if this was worth flagging · 👎 if it was not — a reaction on this comment is the whole feedback loop.
@ -329,0 +1051,4 @@<spanclass="w-1.5 h-1.5 rounded-full shrink-0":class="selectedVersion === `v${pkgVersion}` ? 'bg-status-ok' : 'bg-status-warning animate-pulse'"/>app/app.vue:1054· MEDIUM — Missing Tailwind mapping for brand wash tokensThe Tailwind utility class
bg-wash-brand-12used in the version switcher will not resolve because the--wash-brand-*tokens are not mapped in the@themeblock ofglobals.css.Proposed replacement (one-click ⚡ Apply on the findings board at the top of this PR):
Evidence: partly verified — two or more reviewers, quote or anchor verified (panel 4/4).
👍 if this was worth flagging · 👎 if it was not — a reaction on this comment is the whole feedback loop.
@ -133,3 +143,3 @@padding-bottom: 0.5rem;padding-bottom: 0.625rem;}app/assets/css/globals.css:145· MEDIUM — heading--bold accent rule now opt-in only, breaking existing editorial headingsThe .heading--bold::after accent rule was moved to .style--bold .heading--bold::after and .heading--bold-roadway::after. Pages that use .heading--bold without a .style--bold ancestor lose the Warm Gold roadway rule entirely, changing visual language for the default style.
Proposed replacement (one-click ⚡ Apply on the findings board at the top of this PR):
Evidence: partly verified — two or more reviewers, quote or anchor verified (panel 3/4).
👍 if this was worth flagging · 👎 if it was not — a reaction on this comment is the whole feedback loop.
@ -19,6 +19,11 @@--tti-teal: #4A8892;--tti-sage: #66814F;--tti-charcoal: #221F1F;app/assets/css/tokens.css:21· HIGH — Spectrum token values diverge from documented 5-band brandThe generated token file defines the 5-band spectrum colors with hex values that do not match the values documented in CHANGELOG.md and COMM_HANDOVER.md for TUX 3.0, making the shipped UI brand-inconsistent and breaking the Comm rebrand contract.
Proposed replacement (one-click ⚡ Apply on the findings board at the top of this PR):
Evidence: strong evidence — two or more reviewers, quote verified against the diff, anchored on a changed line (panel 4/4).
👍 if this was worth flagging · 👎 if it was not — a reaction on this comment is the whole feedback loop.
@ -358,3 +362,4 @@padding-bottom: 0.625rem;margin: 0;}app/assets/css/tux.css:365· MEDIUM — Duplicate .style--bold .heading--bold::after rule conflicts with globals.cssBoth tux.css and globals.css define ::after for .style--bold .heading--bold with different patterns (dot-grid radial gradient in tux.css vs roadway solid+dashed pattern in globals.css). Same selector and specificity — whichever file loads later wins, making one pattern unreachable and creating inconsistent heading decoration depending on CSS load order.
Evidence: corroborated, evidence not machine-checked — two or more reviewers, neither the quote nor the anchor could be checked (panel 3/4).
👍 if this was worth flagging · 👎 if it was not — a reaction on this comment is the whole feedback loop.