@bongos/core 1.19.387 → 1.19.389

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.
Files changed (69) hide show
  1. package/.bongos-core.json +144 -59
  2. package/.claude/skills/grade-recover/SKILL.md +1 -1
  3. package/.claude/skills/grader-health/SKILL.md +1 -1
  4. package/config/branding.neutral.json +19 -19
  5. package/config/design-tokens.neutral.json +31 -36
  6. package/docs/adr/0196-chrome-world-token-contract-and-the-landing-sheets.md +31 -0
  7. package/docs/adr/README.md +1 -0
  8. package/docs/branding-contract.md +1 -1
  9. package/docs/copy-inventory.md +93 -67
  10. package/docs/copy-registry.json +411 -133
  11. package/docs/file-map.md +15 -0
  12. package/modules/dev-box/app/assets/tray/win-alert.png +0 -0
  13. package/modules/dev-box/app/assets/tray/win-busy.png +0 -0
  14. package/modules/dev-box/app/assets/tray/win-off.png +0 -0
  15. package/modules/dev-box/app/assets/tray/win-on.png +0 -0
  16. package/modules/dev-box/app/build-resources/dmg-background.png +0 -0
  17. package/modules/dev-box/app/build-resources/dmg-background@2x.png +0 -0
  18. package/modules/dev-box/app/build-resources/icon.png +0 -0
  19. package/modules/dev-box/app/renderer/index.html +1 -1
  20. package/modules/dev-box/app/renderer/styles.css +3 -1
  21. package/modules/dev-box/app/renderer/theme.generated.css +13 -13
  22. package/modules/dev-box/app/scripts/gen-brand.js +13 -13
  23. package/modules/dev-box/app/scripts/gen-dmg-backdrop.py +3 -3
  24. package/modules/dev-box/app/scripts/gen-icons.js +3 -3
  25. package/modules/dev-box/app/src/brand.generated.json +1 -1
  26. package/modules/grading/grader-config.js +5 -3
  27. package/modules/grading/grader-rubric.json +2 -2
  28. package/modules/grading/grader-score.js +86 -33
  29. package/modules/grading/grader-workers/index.js +19 -0
  30. package/modules/hall-ui/public/builders.js +8 -3
  31. package/modules/provisioning/routes/provisioning.js +4 -4
  32. package/modules/status-ui/public/explore.html +12 -6
  33. package/package-lock.json +2 -2
  34. package/package.json +1 -1
  35. package/public-landing/assets/cosmos.css +82 -64
  36. package/public-landing/assets/world/og-card.jpg +0 -0
  37. package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp +0 -0
  38. package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp.json +12 -0
  39. package/public-landing/assets/world/r2-bongos-chrome-b.jpg +0 -0
  40. package/public-landing/assets/world/r2-bongos-chrome-b.jpg.json +12 -0
  41. package/public-landing/assets/world/r2-chrome-blob-one-cut.webp +0 -0
  42. package/public-landing/assets/world/r2-chrome-blob-one-cut.webp.json +13 -0
  43. package/public-landing/assets/world/r2-chrome-blob-one.jpg +0 -0
  44. package/public-landing/assets/world/r2-chrome-blob-one.jpg.json +12 -0
  45. package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp +0 -0
  46. package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp.json +13 -0
  47. package/public-landing/assets/world/r2-chrome-blobs-set.jpg +0 -0
  48. package/public-landing/assets/world/r2-chrome-blobs-set.jpg.json +12 -0
  49. package/public-landing/assets/world.css +241 -0
  50. package/public-landing/contact.html +1 -1
  51. package/public-landing/index.html +1139 -580
  52. package/public-landing/privacy.html +1 -1
  53. package/public-landing/projects.html +2 -2
  54. package/public-landing/terms.html +1 -1
  55. package/scripts/gds/ship-grade-steps.js +27 -0
  56. package/src/bongos/platform-visibility-gate.js +8 -7
  57. package/src/bongos/stealth-gate.js +9 -8
  58. package/src/module-api.js +5 -1
  59. package/src/ui/adapters/claude-design/index.js +2 -2
  60. package/tests/cloud_bongos_pack.mjs +22 -18
  61. package/tests/cosmos_token_contrast.mjs +23 -8
  62. package/tests/grader.mjs +7 -6
  63. package/tests/grader_quality_window_overflow.mjs +324 -0
  64. package/tests/landing_legal_pages.mjs +8 -5
  65. package/tests/landing_page.mjs +295 -166
  66. package/tests/platform_boot.mjs +3 -1
  67. package/tests/projects_hub.mjs +9 -5
  68. package/tests/projects_hub_pre_uat.mjs +3 -1
  69. package/tests/world_tokens.mjs +351 -0
@@ -13,7 +13,7 @@
13
13
  <link rel="canonical" href="{{publicOrigin}}/privacy">
14
14
  <link rel="preconnect" href="https://fonts.googleapis.com">
15
15
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
16
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Quicksand:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap">
16
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
17
17
  <link rel="stylesheet" href="/assets/cosmos.css">
18
18
  <script>
19
19
  /* Mode, resolved before first paint — the same contract as every landing page. */
@@ -14,7 +14,7 @@
14
14
  correctly when viewed standalone. -->
15
15
  <link rel="preconnect" href="https://fonts.googleapis.com">
16
16
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
17
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Quicksand:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap">
17
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
18
18
  <!-- The R07 redesign (task 1002696): shared token + component layer — the
19
19
  space sky both modes ride on, light/dark governing the cards. The server
20
20
  re-injects the branding :root AFTER stylesheets, so the pack stays
@@ -313,7 +313,7 @@ summary{min-height:24px;padding:3px 0;}
313
313
  background:var(--bg-card);border:2px solid var(--line);border-radius:999px;padding:9px 16px;
314
314
  transition:all .12s ease;}
315
315
  .tpill:hover{border-color:var(--accent);color:var(--accent-deep);}
316
- .tpill[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff;}
316
+ .tpill[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:var(--accent-on);}
317
317
  .typeCard{border:2px solid color-mix(in srgb,var(--type-acc) 35%,var(--bg-card));border-radius:18px;
318
318
  padding:16px 18px;margin-bottom:6px;
319
319
  background:linear-gradient(180deg,color-mix(in srgb,var(--type-acc) 9%,var(--bg-card)) 0%,var(--bg-card) 100%);}
@@ -13,7 +13,7 @@
13
13
  <link rel="canonical" href="{{publicOrigin}}/terms">
14
14
  <link rel="preconnect" href="https://fonts.googleapis.com">
15
15
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
16
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Quicksand:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap">
16
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
17
17
  <link rel="stylesheet" href="/assets/cosmos.css">
18
18
  <script>
19
19
  /* Mode, resolved before first paint — the same contract as every landing page. */
@@ -306,6 +306,33 @@ function formatGradeOutcome(g, taskId, cliFinding = null) {
306
306
  return out.join('\n');
307
307
  }
308
308
 
309
+ // task 1003318: ONE gating lens went dark (the Quality worker died on a
310
+ // context-window overflow before it started) while the rest of the panel
311
+ // judged the diff and found nothing substantive. The server records that axis
312
+ // as unavailable instead of fabricating a 0 (validateAndScore
313
+ // cq_lens_unavailable); present it the way #943 presents a total outage —
314
+ // there are no findings to fix, and the paths forward are re-grade or
315
+ // manual-confirm. Sits BELOW the authorization wall (a refusal is never an
316
+ // outage) and steps aside when any lens raised a blocker/major (then the
317
+ // ordinary FAIL block prints the findings). The task stays at completed.
318
+ const cqLensOutage = !g.passed
319
+ && g.signals?.cq_lens_unavailable === true
320
+ && g.rubric_scores?.code_quality === null
321
+ && !(g.issues || []).some((i) => i && (i.severity === 'blocker' || i.severity === 'major'));
322
+ if (cqLensOutage) {
323
+ out.push('');
324
+ out.push('Subagent grade: QUALITY LENS UNAVAILABLE · the Quality worker did not run — NOT a quality rejection');
325
+ if (g.notes_md) out.push(g.notes_md.split('\n').map((l) => ' ' + l).join('\n'));
326
+ out.push(...formatOutageDiagnostic(g, null));
327
+ out.push('');
328
+ out.push('The other lenses judged the diff and found nothing substantive; code_quality is recorded as unavailable, not 0. Task stays at completed.');
329
+ out.push('When the grader is healthy again, re-grade:');
330
+ out.push(` node scripts/gds/ship.js ${taskId} --regrade`);
331
+ out.push('Or land it now via manual-confirm:');
332
+ out.push(` curl -X POST -H "Authorization: Bearer <token>" ${resolveInstanceBase() || '<instance-origin>'}/api/gds/tasks/${taskId}/confirm`);
333
+ return out.join('\n');
334
+ }
335
+
309
336
  const verdict = g.passed ? 'PASS' : 'FAIL';
310
337
  out.push('');
311
338
  out.push(`Subagent grade: ${verdict} · blended ${g.score}/10 · threshold ${g.threshold} (both axes)`);
@@ -153,19 +153,20 @@ function doorHtml({ productName: name, signIn }) {
153
153
  :root{color-scheme:light dark}
154
154
  *{box-sizing:border-box}
155
155
  body{margin:0;min-height:100vh;display:grid;place-items:center;padding:24px;
156
- font:500 15px/1.5 ui-rounded,"Quicksand",system-ui,-apple-system,"Segoe UI",sans-serif;
157
- background:#f9d9a8;color:#2b170e}
158
- @media(prefers-color-scheme:dark){body{background:#150c06;color:#f4e6cd}}
156
+ font:500 15px/1.5 "Manrope",system-ui,-apple-system,"Segoe UI",sans-serif;
157
+ background:#edecee;color:#17181a}
158
+ @media(prefers-color-scheme:dark){body{background:#000000;color:#ffffff}}
159
159
  .box{width:min(380px,100%);text-align:center}
160
160
  .dots{display:flex;gap:10px;justify-content:center;margin-bottom:22px}
161
- .dots i{display:block;border-radius:50%;background:#ce4806}
161
+ .dots i{display:block;border-radius:50%;background:#fb9569}
162
162
  .dots i:first-child{width:38px;height:38px}
163
- .dots i:last-child{width:28px;height:28px;background:#855b3d;align-self:flex-end}
163
+ .dots i:last-child{width:28px;height:28px;background:#c9512c;align-self:flex-end}
164
164
  h1{font-size:20px;font-weight:700;margin:0 0 6px}
165
165
  p{margin:0 0 20px;opacity:.72;font-size:14px}
166
- a.btn{display:inline-block;padding:11px 22px;border-radius:999px;background:#ce4806;color:#fff;
166
+ /* dark ink on the accent fill: the chrome world's salmon carries white at 2.19:1 */
167
+ a.btn{display:inline-block;padding:11px 22px;border-radius:999px;background:#fb9569;color:#2a1305;
167
168
  font:700 14px/1 inherit;text-decoration:none}
168
- a.btn:focus{outline:2px solid #ce4806;outline-offset:2px}
169
+ a.btn:focus{outline:2px solid #a3481a;outline-offset:2px}
169
170
  </style></head><body><div class="box">
170
171
  <div class="dots"><i></i><i></i></div>
171
172
  <h1>${safe}</h1>
@@ -139,22 +139,23 @@ function formHtml({ productName, wrong, returnTo }) {
139
139
  :root{color-scheme:light dark}
140
140
  *{box-sizing:border-box}
141
141
  body{margin:0;min-height:100vh;display:grid;place-items:center;padding:24px;
142
- font:500 15px/1.5 ui-rounded,"Quicksand",system-ui,-apple-system,"Segoe UI",sans-serif;
143
- background:#f9d9a8;color:#2b170e}
144
- @media(prefers-color-scheme:dark){body{background:#150c06;color:#f4e6cd}}
142
+ font:500 15px/1.5 "Manrope",system-ui,-apple-system,"Segoe UI",sans-serif;
143
+ background:#edecee;color:#17181a}
144
+ @media(prefers-color-scheme:dark){body{background:#000000;color:#ffffff}}
145
145
  .box{width:min(380px,100%);text-align:center}
146
146
  .dots{display:flex;gap:10px;justify-content:center;margin-bottom:22px}
147
- .dots i{display:block;border-radius:50%;background:#ce4806}
147
+ .dots i{display:block;border-radius:50%;background:#fb9569}
148
148
  .dots i:first-child{width:38px;height:38px}
149
- .dots i:last-child{width:28px;height:28px;background:#855b3d;align-self:flex-end}
149
+ .dots i:last-child{width:28px;height:28px;background:#c9512c;align-self:flex-end}
150
150
  h1{font-size:20px;font-weight:700;margin:0 0 6px}
151
151
  p{margin:0 0 20px;opacity:.72;font-size:14px}
152
152
  form{display:flex;gap:8px}
153
- input{flex:1;min-width:0;padding:11px 14px;border-radius:999px;border:1.5px solid rgba(206,72,6,.35);
153
+ input{flex:1;min-width:0;padding:11px 14px;border-radius:999px;border:1.5px solid rgba(163,72,26,.35);
154
154
  background:rgba(255,255,255,.72);color:inherit;font:inherit}
155
155
  @media(prefers-color-scheme:dark){input{background:rgba(255,255,255,.08)}}
156
- input:focus{outline:2px solid #ce4806;outline-offset:1px}
157
- button{padding:11px 20px;border:0;border-radius:999px;background:#ce4806;color:#fff;
156
+ input:focus{outline:2px solid #a3481a;outline-offset:1px}
157
+ /* dark ink on the accent fill: the chrome world's salmon carries white at 2.19:1 */
158
+ button{padding:11px 20px;border:0;border-radius:999px;background:#fb9569;color:#2a1305;
158
159
  font:700 14px/1 inherit;cursor:pointer}
159
160
  .err{margin:14px 0 0;color:#b3261e;font-size:13.5px}
160
161
  @media(prefers-color-scheme:dark){.err{color:#ffb4a8}}
package/src/module-api.js CHANGED
@@ -1214,8 +1214,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
1214
1214
  // landed since 1.19.385 with no explicit bump. run 33120468176. (task 1002620)
1215
1215
  // 1.19.387 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1216
1216
  // landed since 1.19.386 with no explicit bump. run 33121066592. (task 1002620)
1217
+ // 1.19.388 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1218
+ // landed since 1.19.387 with no explicit bump. run 33125589814. (task 1002620)
1219
+ // 1.19.389 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1220
+ // landed since 1.19.388 with no explicit bump. run 33126279278. (task 1002620)
1217
1221
  // ---------------------------------------------------------------------------
1218
- const CORE_VERSION = '1.19.387'; // CI auto-patch carrier (ADR 0161); see changelog above
1222
+ const CORE_VERSION = '1.19.389'; // CI auto-patch carrier (ADR 0161); see changelog above
1219
1223
 
1220
1224
  // A namespaced logger so a module's log lines are attributable + consistent.
1221
1225
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -28,8 +28,8 @@ const FALLBACK_ACCENT = (() => {
28
28
  try {
29
29
  return JSON.parse(fs.readFileSync(
30
30
  path.resolve(__dirname, '..', '..', '..', '..', 'config', 'design-tokens.neutral.json'), 'utf8',
31
- )).colors.accent || '#ce4806';
32
- } catch { return '#ce4806'; }
31
+ )).colors.accent || '#fb9569';
32
+ } catch { return '#fb9569'; }
33
33
  })();
34
34
 
35
35
  // ── token helpers ─────────────────────────────────────────────────────────────
@@ -1,7 +1,8 @@
1
1
  // tests/cloud_bongos_pack.mjs — the Cloud Bongos vanilla brand pack (R74 / task 1216,
2
2
  // ADR 0064). "Verified on the standalone boot", executable: a vanilla instance (no
3
3
  // config/branding.json → the neutral starter ALONE) resolves to the Cloud Bongos
4
- // identity, and the served-HTML theme injection paints the sunrise look. This is
4
+ // identity, and the served-HTML theme injection paints the chrome look (the chrome
5
+ // world replaced the sunrise on 2026-08-27, task 1003298). This is
5
6
  // the customer-0 pack Cloud Bongos itself runs on.
6
7
  import assert from 'node:assert/strict';
7
8
  import { test } from 'node:test';
@@ -30,36 +31,39 @@ test('R74: a vanilla boot resolves to the Cloud Bongos identity', () => {
30
31
  assert.equal(b.envPrefix, 'CLOUDBONGOS');
31
32
  });
32
33
 
33
- test('R74: the vanilla pack carries the Cloud Bongos LOOK (sunrise palette, Baloo 2/Quicksand, bongo favicon)', () => {
34
+ test('R74: the vanilla pack carries the Cloud Bongos LOOK (chrome palette, Manrope, bongo favicon)', () => {
34
35
  const c = clientBranding(vanilla());
35
- // fired down from the original #f97316 so white-on-accent clears WCAG AA
36
- // (2.80:1 -> 4.61:1, task 1002749) — same ember hue, readable
37
- assert.equal(c.theme.colors.accent, '#ce4806', 'ember orange accent');
38
- // ember marigold (task 1002748): the base is PIGMENTED, not near-white. The
39
- // old #fff7ed sat within a few points of the cards and the page read as fog.
40
- assert.equal(c.theme.colors.bg, '#f9d9a8', 'marigold base');
41
- assert.match(c.theme.fonts.display, /Baloo 2/);
42
- assert.match(c.theme.fonts.body, /Quicksand/);
43
- assert.ok(c.theme.fonts.links.some((l) => /Baloo\+2/.test(l) && /Quicksand/.test(l) && /Fira\+Code/.test(l)), 'loads Baloo 2 + Quicksand + Fira Code');
36
+ // the chrome world (owner, 2026-08-27; task 1003298): a salmon accent that is a
37
+ // FILL, never a text colour — white on it is 2.19:1, so cosmos.css paints labels
38
+ // on it with a derived dark --accent-on and accent WORDS with --accent-deep.
39
+ assert.equal(c.theme.colors.accent, '#fb9569', 'salmon accent');
40
+ // the ground is a cool near-grey paper, not the old marigold #f9d9a8: the chrome
41
+ // sculpture reads as metal on it, and the cards still lift off it.
42
+ assert.equal(c.theme.colors.bg, '#edecee', 'chrome paper base');
43
+ assert.match(c.theme.fonts.display, /Manrope/);
44
+ assert.match(c.theme.fonts.body, /Manrope/);
45
+ assert.ok(c.theme.fonts.links.some((l) => /JetBrains\+Mono/.test(l) && /Manrope/.test(l)), 'loads Manrope + JetBrains Mono');
44
46
  assert.match(c.theme.favicon, /circle/, 'bongo-pair favicon (circles), not the Greek Α');
45
47
  assert.doesNotMatch(c.theme.favicon, /font-family='serif'>Α/);
46
- assert.equal(c.theme.backdrop, '#f9d9a8', 'the marigold ground holds all the way down');
48
+ // the backdrop is the TOKEN, not a hex: the served body follows the mode,
49
+ // because the sheets' dark blocks are (0,2,0) and outrank the injected :root.
50
+ assert.equal(c.theme.backdrop, 'var(--bg)', 'the ground follows the mode all the way down');
47
51
  // task 1002934: the owner's homepage rewrite retitled the platform.
48
52
  assert.equal(c.copy.tagline, 'Building Digitally, as simple as Bongos.');
49
53
  assert.equal(c.rankLabels.archon, 'Owner', 'plain rank labels, not "Archon"');
50
54
  });
51
55
 
52
- test('R74: serving the hall on a vanilla boot injects the Cloud Bongos sunrise theme', () => {
56
+ test('R74: serving the hall on a vanilla boot injects the Cloud Bongos chrome theme', () => {
53
57
  const c = clientBranding(vanilla());
54
58
  const html = '<head><link rel="stylesheet" href="/builders/style.css"><title>x</title></head><body></body>';
55
59
  const out = injectBrandingGlobal(html, c);
56
- // palette override + the marigold body backdrop + bongo favicon + the type links
57
- assert.match(out, /:root\{[^}]*--accent:#ce4806;/);
58
- assert.match(out, /body\{background:#f9d9a8;\}/);
60
+ // palette override + the token-valued body backdrop + bongo favicon + the type links
61
+ assert.match(out, /:root\{[^}]*--accent:#fb9569;/);
62
+ assert.match(out, /body\{background:var\(--bg\);\}/);
59
63
  assert.match(out, /<link rel="icon" href="data:image\/svg\+xml[^"]*circle/);
60
- assert.match(out, /fonts\.googleapis\.com\/css2\?family=Baloo\+2/);
64
+ assert.match(out, /fonts\.googleapis\.com\/css2\?family=JetBrains\+Mono/);
61
65
  // and it lands AFTER the stylesheet so the Cloud Bongos look wins
62
- assert.ok(out.indexOf('/builders/style.css') < out.indexOf('--accent:#ce4806'));
66
+ assert.ok(out.indexOf('/builders/style.css') < out.indexOf('--accent:#fb9569'));
63
67
  });
64
68
 
65
69
  test('R74: themeMarkup paints the backdrop only when the pack supplies one', () => {
@@ -169,8 +169,13 @@ const deltaE76 = (a, b) => {
169
169
  // need: 4.5 normal text · 3.0 large text and meaningful non-text
170
170
  const CARD = 'var(--bg-card)';
171
171
  const PAIRS = [
172
- // primary + secondary action
173
- ['.btn label on its fill', '#ffffff', 'var(--accent)', 4.5],
172
+ // primary + secondary action.
173
+ // The label ink on an accent FILL is --accent-on since task 1003298 (2026-08-27):
174
+ // the chrome world's salmon accent carries white at 2.19:1, so every filled accent
175
+ // control took a derived DARK ink. (The marigold pack this file was written for
176
+ // shipped a fired-down ember where #ffffff measured 4.61:1 — that is history now,
177
+ // and any prose below still naming those values is history too.)
178
+ ['.btn label on its fill', 'var(--accent-on)', 'var(--accent)', 4.5],
174
179
  ['.btn.ghost:hover label', 'var(--accent-deep)', CARD, 4.5],
175
180
  ['.btn.danger label', 'var(--err)', CARD, 4.5],
176
181
  // Code chips, pills, the now-step number, the hover inks: --accent-deep is
@@ -212,8 +217,11 @@ const PAIRS = [
212
217
  ['strip indicator on the strip tint', 'var(--sea-ink)', 'color-mix(in srgb,var(--sea) 8%,var(--bg-card))', 3.0],
213
218
  ['strip done tick on its fill', 'var(--on-ok)', 'var(--sea-ink)', 3.0],
214
219
  ['flowDown done tick on its fill', 'var(--on-ok)', 'var(--ink-faint)', 3.0],
215
- ['.steps done/now ring on card', 'var(--accent)', CARD, 3.0],
216
- ['.steps done vs idle connector', 'var(--accent)', 'var(--line)', 3.0],
220
+ // the create rail's ring + connector: non-text at 1.4.11's 3:1. --accent-deep,
221
+ // not --accent, since task 1003298 — the chrome world's salmon is 2.10:1 on the
222
+ // card, so the mark that IDENTIFIES a done step had to move to the deep twin.
223
+ ['.steps done/now ring on card', 'var(--accent-deep)', CARD, 3.0],
224
+ ['.steps done vs idle connector', 'var(--accent-deep)', 'var(--line)', 3.0],
217
225
  // the opted-out address card swaps to the page ground (--bg); its muted copy
218
226
  // must still measure (19px/700 headline = large text, 3.0)
219
227
  ['optedOut .addrBig (large) on --bg', 'var(--ink-soft)', 'var(--bg)', 3.0],
@@ -221,10 +229,11 @@ const PAIRS = [
221
229
  // ?view=mine (task 1002823) — both surfaces traded a subtree opacity for muted
222
230
  // tokens, so the tokens themselves now carry the de-emphasis and must measure.
223
231
  // The two pill rows are the pair that proves the split: one mute cannot serve
224
- // both grounds, because on the pressed --accent fill no ink token clears 4.5
225
- // (--ink is the best at 3.70 light / 4.05 dark) and only the button's #fff does.
232
+ // both grounds, because on the pressed --accent fill no muted ink token clears
233
+ // 4.5 — the count inherits the button's own label ink, which is --accent-on
234
+ // since task 1003298 (it was the button's #fff under the marigold pack).
226
235
  ['.filters .n count, resting pill', 'var(--ink-faint)', CARD, 4.5],
227
- ['.filters .n count, pressed pill', '#ffffff', 'var(--accent)', 4.5],
236
+ ['.filters .n count, pressed pill', 'var(--accent-on)', 'var(--accent)', 4.5],
228
237
  ['.proj.gone name (muted)', 'var(--ink-soft)', CARD, 4.5],
229
238
  ['.proj.gone meta (dim removed)', 'var(--ink-faint)', CARD, 4.5],
230
239
  // lifecycle strip: 12px/700
@@ -265,7 +274,13 @@ const PAIRS = [
265
274
  ['--ctl-line boundary on the card', 'var(--ctl-line)', 'var(--card)', 3.0],
266
275
  ['--ctl-line boundary vs input fill', 'var(--ctl-line)', CARD, 3.0],
267
276
  ['?view=new input ::placeholder', 'var(--ink-faint)', CARD, 4.5],
268
- ['?view=new .ghlist .hint on deep', 'var(--ink-faint)', 'var(--bg-deep)', 4.5],
277
+ // the repo-picker panel's own ground. Retargeted 2026-08-27 (task 1003298) from
278
+ // --ink-faint to --ink-soft: under the chrome palette the pack's --ink-faint
279
+ // measures 4.45:1 on --bg-deep, and NO rule paints it there — .ghlist's own copy
280
+ // is .ghrow (--ink) and .ghrow .priv (--ink-soft); the .hint blocks are siblings
281
+ // of #ghList and sit on the card. So the floor now measures the ink the deep
282
+ // panel actually uses, instead of a pairing nothing renders.
283
+ ['?view=new .ghlist copy on deep', 'var(--ink-soft)', 'var(--bg-deep)', 4.5],
269
284
  ['--chrome-accent wordmark', 'var(--chrome-accent)', 'var(--page-bg)', 4.5],
270
285
  ['--chrome-ink', 'var(--chrome-ink)', 'var(--page-bg)', 4.5],
271
286
  ['--foot-ink footer copy', 'var(--foot-ink)', 'var(--page-bg)', 4.5],
package/tests/grader.mjs CHANGED
@@ -842,20 +842,20 @@ test('selectGraderModel: builder Haiku → grader Opus', () => {
842
842
 
843
843
  // --- task 1002660: per-worker model tiering (cross-model-guarded) ---
844
844
 
845
- test('workerModelFor: Quality tiers down to haiku; other workers keep the panel model', () => {
845
+ test('workerModelFor: Quality runs on its sonnet tier (task 1003318 — haiku\'s window overflowed); other workers keep the panel model', () => {
846
846
  assert.equal(
847
- grader.workerModelFor('quality', 'claude-sonnet-5', 'claude-fable-5'),
848
- 'claude-haiku-4-5-20251001'
847
+ grader.workerModelFor('quality', 'claude-opus-5', 'claude-fable-5'),
848
+ 'claude-sonnet-5'
849
849
  );
850
850
  for (const kind of ['narc', 'hacker', 'efficiency']) {
851
- assert.equal(grader.workerModelFor(kind, 'claude-sonnet-5', 'claude-fable-5'), 'claude-sonnet-5');
851
+ assert.equal(grader.workerModelFor(kind, 'claude-opus-5', 'claude-fable-5'), 'claude-opus-5');
852
852
  }
853
853
  });
854
854
 
855
855
  test('workerModelFor: a tier override landing on the BUILDER family is refused (cross-model guarantee)', () => {
856
- // A haiku builder must not be quality-judged by haiku — fall back to the panel model.
856
+ // A sonnet builder must not be quality-judged by sonnet — fall back to the panel model.
857
857
  assert.equal(
858
- grader.workerModelFor('quality', 'claude-opus-5', 'claude-haiku-4-5-20251001'),
858
+ grader.workerModelFor('quality', 'claude-opus-5', 'claude-sonnet-5'),
859
859
  'claude-opus-5'
860
860
  );
861
861
  });
@@ -1795,6 +1795,7 @@ test('v4 #465/#467: TRANSIENT_WORKER_ERRORS covers infra noise but NOT timeout',
1795
1795
  assert.ok(t.has(code), `${code} should be retryable`);
1796
1796
  }
1797
1797
  assert.ok(!t.has('SUBAGENT_TIMEOUT'), 'timeout is a real budget signal, never retried');
1798
+ assert.ok(!t.has('PROMPT_TOO_LONG'), 'a window overflow is deterministic, never retried (task 1003318)');
1798
1799
  });
1799
1800
 
1800
1801
  test('v4 #467: audit-exports classifyExports — consumed / test-only / DEAD', () => {