Session H (night2): design pass — §2 locks + honest waiting sweep

- QA.20: one meaning per color, locked — STEAM amber (caution), VALUE
  green (edge), red only at STALE/miss; revisions render the original
  grade struck through on slate AND ledger.
- QA.21: every new data surface (PriorReads, PlayerStreaks, ModelRecord)
  renders data in mono (tabular-nums via the .mono class).
- QA.22: waiting copy derives from the real cron schedule on every
  surface (StatStrip, dashboard, Explore) — no passive mystery anywhere.
- Explore empty state joined the honest-waiting lib.
- Sweep result: no raw brand hexes and no sans-serif data in tonight's
  components (sans only on prose/captions/hero letter — sanctioned);
  glow confined to A-tier badges + reveal chrome; 390px containment
  holds (wrapping chips, scroll-contained tables from Phase 3 rules).

Backend 2352 -> 2396 tests (205 suites), web build exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kev
2026-07-11 02:30:41 -04:00
parent 1b4f2772d6
commit 7a35c96781
4 changed files with 123 additions and 1 deletions
+45
View File
@@ -91,3 +91,48 @@ describe('QA.18 — auth gate integration', () => {
expect(routes.isGatedRoute('/dashboard')).toBe(false); // free funnel stays open
});
});
// ── Session 60 (night2/H) — §2 design-pass locks for tonight's surfaces ─────
// One meaning per color: green = edge/favorable, amber = caution/market
// signal, red = miss/error. Data is mono. Glow stays on A-tier/chrome.
describe('QA.20 — movement + status color semantics (Phase 2.5 surfaces)', () => {
it('STEAM is amber (caution: entry compressed), VALUE is green (edge)', () => {
const strip = read('components/vyndr/StatStrip.tsx');
expect(strip).toMatch(/steam \? 'var\(--amber/);
expect(strip).toMatch(/: 'var\(--g-a/);
});
it('SYNC goes red ONLY at the STALE tier (error meaning), amber at 1.5x', () => {
const live = read('components/vyndr/LiveLayer.tsx');
expect(live).toContain("tier === 'stale' ? 'var(--miss)'");
expect(live).toContain("tier === 'amber' ? 'var(--amber)'");
});
it('a revision renders the ORIGINAL grade struck through (public, never silent)', () => {
expect(read('components/vyndr/StatStrip.tsx')).toContain("textDecoration: 'line-through'");
expect(read('app/ledger/page.tsx')).toContain("textDecoration: 'line-through'");
});
it('lens difficulty: tougher = amber, softer = green — never inverted', () => {
const panel = read('components/StreaksPanel.tsx');
expect(panel).toMatch(/step up' \? 'var\(--amber[^']*' : [^:]*step down' \? 'var\(--g-a/);
});
});
describe('QA.21 — new data surfaces are mono', () => {
it.each([
'components/vyndr/PriorReads.tsx',
'components/vyndr/PlayerStreaks.tsx',
'components/vyndr/ModelRecord.tsx',
])('%s renders its data rows in mono', (rel) => {
expect(read(rel)).toContain('className="mono"');
});
});
describe('QA.22 — honest waiting copy everywhere (no passive mystery)', () => {
it.each([
'components/vyndr/StatStrip.tsx',
'app/dashboard/page.tsx',
'components/ExploreHub.tsx',
])('%s derives its waiting state from the real schedule', (rel) => {
expect(read(rel)).toContain('nextRunLabelET');
});
});