@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.
- package/.bongos-core.json +144 -59
- package/.claude/skills/grade-recover/SKILL.md +1 -1
- package/.claude/skills/grader-health/SKILL.md +1 -1
- package/config/branding.neutral.json +19 -19
- package/config/design-tokens.neutral.json +31 -36
- package/docs/adr/0196-chrome-world-token-contract-and-the-landing-sheets.md +31 -0
- package/docs/adr/README.md +1 -0
- package/docs/branding-contract.md +1 -1
- package/docs/copy-inventory.md +93 -67
- package/docs/copy-registry.json +411 -133
- package/docs/file-map.md +15 -0
- package/modules/dev-box/app/assets/tray/win-alert.png +0 -0
- package/modules/dev-box/app/assets/tray/win-busy.png +0 -0
- package/modules/dev-box/app/assets/tray/win-off.png +0 -0
- package/modules/dev-box/app/assets/tray/win-on.png +0 -0
- package/modules/dev-box/app/build-resources/dmg-background.png +0 -0
- package/modules/dev-box/app/build-resources/dmg-background@2x.png +0 -0
- package/modules/dev-box/app/build-resources/icon.png +0 -0
- package/modules/dev-box/app/renderer/index.html +1 -1
- package/modules/dev-box/app/renderer/styles.css +3 -1
- package/modules/dev-box/app/renderer/theme.generated.css +13 -13
- package/modules/dev-box/app/scripts/gen-brand.js +13 -13
- package/modules/dev-box/app/scripts/gen-dmg-backdrop.py +3 -3
- package/modules/dev-box/app/scripts/gen-icons.js +3 -3
- package/modules/dev-box/app/src/brand.generated.json +1 -1
- package/modules/grading/grader-config.js +5 -3
- package/modules/grading/grader-rubric.json +2 -2
- package/modules/grading/grader-score.js +86 -33
- package/modules/grading/grader-workers/index.js +19 -0
- package/modules/hall-ui/public/builders.js +8 -3
- package/modules/provisioning/routes/provisioning.js +4 -4
- package/modules/status-ui/public/explore.html +12 -6
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/assets/cosmos.css +82 -64
- package/public-landing/assets/world/og-card.jpg +0 -0
- package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp +0 -0
- package/public-landing/assets/world/r2-bongos-chrome-a-cut.webp.json +12 -0
- package/public-landing/assets/world/r2-bongos-chrome-b.jpg +0 -0
- package/public-landing/assets/world/r2-bongos-chrome-b.jpg.json +12 -0
- package/public-landing/assets/world/r2-chrome-blob-one-cut.webp +0 -0
- package/public-landing/assets/world/r2-chrome-blob-one-cut.webp.json +13 -0
- package/public-landing/assets/world/r2-chrome-blob-one.jpg +0 -0
- package/public-landing/assets/world/r2-chrome-blob-one.jpg.json +12 -0
- package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp +0 -0
- package/public-landing/assets/world/r2-chrome-blobs-set-cut.webp.json +13 -0
- package/public-landing/assets/world/r2-chrome-blobs-set.jpg +0 -0
- package/public-landing/assets/world/r2-chrome-blobs-set.jpg.json +12 -0
- package/public-landing/assets/world.css +241 -0
- package/public-landing/contact.html +1 -1
- package/public-landing/index.html +1139 -580
- package/public-landing/privacy.html +1 -1
- package/public-landing/projects.html +2 -2
- package/public-landing/terms.html +1 -1
- package/scripts/gds/ship-grade-steps.js +27 -0
- package/src/bongos/platform-visibility-gate.js +8 -7
- package/src/bongos/stealth-gate.js +9 -8
- package/src/module-api.js +5 -1
- package/src/ui/adapters/claude-design/index.js +2 -2
- package/tests/cloud_bongos_pack.mjs +22 -18
- package/tests/cosmos_token_contrast.mjs +23 -8
- package/tests/grader.mjs +7 -6
- package/tests/grader_quality_window_overflow.mjs +324 -0
- package/tests/landing_legal_pages.mjs +8 -5
- package/tests/landing_page.mjs +295 -166
- package/tests/platform_boot.mjs +3 -1
- package/tests/projects_hub.mjs +9 -5
- package/tests/projects_hub_pre_uat.mjs +3 -1
- 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=
|
|
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=
|
|
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
|
|
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=
|
|
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
|
|
157
|
-
background:#
|
|
158
|
-
@media(prefers-color-scheme:dark){body{background:#
|
|
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:#
|
|
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:#
|
|
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
|
-
|
|
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 #
|
|
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
|
|
143
|
-
background:#
|
|
144
|
-
@media(prefers-color-scheme:dark){body{background:#
|
|
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:#
|
|
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:#
|
|
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(
|
|
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 #
|
|
157
|
-
|
|
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.
|
|
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 || '#
|
|
32
|
-
} catch { return '#
|
|
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
|
|
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 (
|
|
34
|
+
test('R74: the vanilla pack carries the Cloud Bongos LOOK (chrome palette, Manrope, bongo favicon)', () => {
|
|
34
35
|
const c = clientBranding(vanilla());
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
assert.
|
|
42
|
-
assert.match(c.theme.fonts.
|
|
43
|
-
assert.
|
|
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
|
-
|
|
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
|
|
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
|
|
57
|
-
assert.match(out, /:root\{[^}]*--accent:#
|
|
58
|
-
assert.match(out, /body\{background
|
|
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=
|
|
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:#
|
|
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
|
-
|
|
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
|
-
|
|
216
|
-
|
|
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
|
|
225
|
-
//
|
|
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', '
|
|
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
|
-
|
|
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
|
|
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-
|
|
848
|
-
'claude-
|
|
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-
|
|
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
|
|
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-
|
|
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', () => {
|