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:
@@ -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');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user