@bongos/core 1.19.523 → 1.19.524
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 +13 -13
- package/docs/module-api-changelog.md +2 -0
- package/modules/hall-ui/public/oversight.css +1 -1
- package/modules/hall-ui/public/style.css +3 -3
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/hall_audit.mjs +66 -0
- package/tests/hall_board_world.mjs +7 -9
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.524",
|
|
6
|
+
"core_contract": "1.19.524",
|
|
7
|
+
"source_commit": "2bcf689e8a274d2d6fe6d95f0ae0cc94d8de9ad2",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-03T23:
|
|
9
|
+
"built_at": "2026-09-03T23:36:45.727Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 431,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2424,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "5b603403c990cba86562e75005310c23fd6ec06bfc6934190cb2f7b1edd8f596",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -2597,7 +2597,7 @@
|
|
|
2597
2597
|
{
|
|
2598
2598
|
"path": "docs/module-api-changelog.md",
|
|
2599
2599
|
"mode": "0000644",
|
|
2600
|
-
"sha256": "
|
|
2600
|
+
"sha256": "dc3cb8274947a5bed3315b467d104b852e5ef4a9aea5642763765e2c3bfc5650"
|
|
2601
2601
|
},
|
|
2602
2602
|
{
|
|
2603
2603
|
"path": "docs/modules-contract.md",
|
|
@@ -4847,7 +4847,7 @@
|
|
|
4847
4847
|
{
|
|
4848
4848
|
"path": "modules/hall-ui/public/oversight.css",
|
|
4849
4849
|
"mode": "0000644",
|
|
4850
|
-
"sha256": "
|
|
4850
|
+
"sha256": "9aa3fd3f662274571e049eb9931f8dd575eef527a624bc6a5d57102061f54936"
|
|
4851
4851
|
},
|
|
4852
4852
|
{
|
|
4853
4853
|
"path": "modules/hall-ui/public/pair.css",
|
|
@@ -5077,7 +5077,7 @@
|
|
|
5077
5077
|
{
|
|
5078
5078
|
"path": "modules/hall-ui/public/style.css",
|
|
5079
5079
|
"mode": "0000644",
|
|
5080
|
-
"sha256": "
|
|
5080
|
+
"sha256": "b37fa5714da911e20f1cab9bca3e4a76314065dd27cc59fad3bbb7ad9314370b"
|
|
5081
5081
|
},
|
|
5082
5082
|
{
|
|
5083
5083
|
"path": "modules/hall-ui/public/task-detail.js",
|
|
@@ -7297,12 +7297,12 @@
|
|
|
7297
7297
|
{
|
|
7298
7298
|
"path": "package-lock.json",
|
|
7299
7299
|
"mode": "0000644",
|
|
7300
|
-
"sha256": "
|
|
7300
|
+
"sha256": "bc7bbba6148fa9d568b64a75b65ef180df5552277546b777ffdee8316f72105c"
|
|
7301
7301
|
},
|
|
7302
7302
|
{
|
|
7303
7303
|
"path": "package.json",
|
|
7304
7304
|
"mode": "0000644",
|
|
7305
|
-
"sha256": "
|
|
7305
|
+
"sha256": "f9383e8ec30bfc6a70fc13c2484732cbe20e97caac115737fb4942dd2e6c3588"
|
|
7306
7306
|
},
|
|
7307
7307
|
{
|
|
7308
7308
|
"path": "public-docs/index.html",
|
|
@@ -8972,7 +8972,7 @@
|
|
|
8972
8972
|
{
|
|
8973
8973
|
"path": "src/module-api.js",
|
|
8974
8974
|
"mode": "0000644",
|
|
8975
|
-
"sha256": "
|
|
8975
|
+
"sha256": "40fd7f7332ab9375d8078e846d565e282b7daf64abfdb6b22eb21380e7cdae17"
|
|
8976
8976
|
},
|
|
8977
8977
|
{
|
|
8978
8978
|
"path": "src/module-loader/catalog.js",
|
|
@@ -10357,12 +10357,12 @@
|
|
|
10357
10357
|
{
|
|
10358
10358
|
"path": "tests/hall_audit.mjs",
|
|
10359
10359
|
"mode": "0000644",
|
|
10360
|
-
"sha256": "
|
|
10360
|
+
"sha256": "7e73863dba1bb570f61e3415af6ba84ba74207d9efd11c9032873b2cc1734ee9"
|
|
10361
10361
|
},
|
|
10362
10362
|
{
|
|
10363
10363
|
"path": "tests/hall_board_world.mjs",
|
|
10364
10364
|
"mode": "0000644",
|
|
10365
|
-
"sha256": "
|
|
10365
|
+
"sha256": "31013c61fa0099ae2195148aeef5c810996edafc667ea5bc2e4c7176570e4ee7"
|
|
10366
10366
|
},
|
|
10367
10367
|
{
|
|
10368
10368
|
"path": "tests/hall_catalog_world.mjs",
|
|
@@ -1483,5 +1483,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1483
1483
|
landed since 1.19.521 with no explicit bump. run 33815020928. (task 1002620)
|
|
1484
1484
|
1.19.523 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1485
1485
|
landed since 1.19.522 with no explicit bump. run 33816191865. (task 1002620)
|
|
1486
|
+
1.19.524 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1487
|
+
landed since 1.19.523 with no explicit bump. run 33818285201. (task 1002620)
|
|
1486
1488
|
---------------------------------------------------------------------------
|
|
1487
1489
|
```
|
|
@@ -284,7 +284,7 @@ a.fact-chip:hover { color: var(--accent-ink); border-color: var(--accent-ink); t
|
|
|
284
284
|
align-items: center;
|
|
285
285
|
justify-content: center;
|
|
286
286
|
padding: 20px;
|
|
287
|
-
background:
|
|
287
|
+
background: var(--scrim);
|
|
288
288
|
}
|
|
289
289
|
.ov-modal {
|
|
290
290
|
width: 100%;
|
|
@@ -963,7 +963,7 @@ main:focus { outline: none; }
|
|
|
963
963
|
position: fixed;
|
|
964
964
|
inset: 0;
|
|
965
965
|
z-index: var(--z-scrim);
|
|
966
|
-
background:
|
|
966
|
+
background: var(--scrim);
|
|
967
967
|
}
|
|
968
968
|
|
|
969
969
|
/* Focus: the world's two-tone ring — a 2px accent-derived outline at 3px offset
|
|
@@ -2695,7 +2695,7 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2695
2695
|
position: fixed;
|
|
2696
2696
|
inset: 0;
|
|
2697
2697
|
z-index: 2000;
|
|
2698
|
-
background:
|
|
2698
|
+
background: var(--scrim);
|
|
2699
2699
|
display: flex;
|
|
2700
2700
|
align-items: center;
|
|
2701
2701
|
justify-content: center;
|
|
@@ -3190,7 +3190,7 @@ a.stat-tile:hover .stat-tile__sub { color: var(--ink-soft); }
|
|
|
3190
3190
|
}
|
|
3191
3191
|
|
|
3192
3192
|
.palette { position: fixed; inset: 0; z-index: 2100; }
|
|
3193
|
-
.palette__scrim { position: absolute; inset: 0; background:
|
|
3193
|
+
.palette__scrim { position: absolute; inset: 0; background: var(--scrim); }
|
|
3194
3194
|
.palette__panel {
|
|
3195
3195
|
position: relative;
|
|
3196
3196
|
margin: 10vh auto 0;
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.524",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.524",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.524",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/src/module-api.js
CHANGED
|
@@ -45,7 +45,7 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
45
45
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
46
46
|
// the entry to that file. Look for a version's history there, not here.
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
48
|
-
const CORE_VERSION = '1.19.
|
|
48
|
+
const CORE_VERSION = '1.19.524'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
49
49
|
|
|
50
50
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
51
51
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
package/tests/hall_audit.mjs
CHANGED
|
@@ -527,3 +527,69 @@ test('the command palette input rings from the token tier, inside its own box',
|
|
|
527
527
|
assert.match(css, /\.palette__panel\s*\{[^}]*overflow:\s*hidden/, 'the panel still clips, so the inset form is still the right one');
|
|
528
528
|
assert.match(rule[1], /outline-offset:\s*-|inset/, 'the indication sits inside the input, not outside it');
|
|
529
529
|
});
|
|
530
|
+
|
|
531
|
+
// ---- 11. the world has ONE scrim (task 1003568) ---------------------------
|
|
532
|
+
|
|
533
|
+
// A scrim darkens what is behind it — in BOTH modes. That is why it cannot be
|
|
534
|
+
// mixed from a ground token: `--ink` is near-black in light and #ffffff in
|
|
535
|
+
// dark, so `color-mix(in srgb, var(--ink) N%, transparent)` paints a WHITE wash
|
|
536
|
+
// over a dark page. `.palette__scrim` did exactly that, unnoticed, while three
|
|
537
|
+
// other scrims in the same sheet each carried their own copy of the same
|
|
538
|
+
// black-with-alpha literal. Task 1003495 gave the value a home as `--scrim`;
|
|
539
|
+
// this pins that every scrim now spends it.
|
|
540
|
+
const SCRIM_VALUE = 'rgba(0, 0, 0, .55)';
|
|
541
|
+
|
|
542
|
+
test('every scrim in the hall spends --scrim, and none is mixed from a ground token', () => {
|
|
543
|
+
const sheets = fs.readdirSync(HALL).filter((f) => f.endsWith('.css'));
|
|
544
|
+
const offenders = [];
|
|
545
|
+
for (const f of sheets) {
|
|
546
|
+
const css = read(f).replace(/\/\*[\s\S]*?\*\//g, '');
|
|
547
|
+
for (const m of css.matchAll(/([^{}]*(?:scrim|::backdrop)[^{}]*)\{([^{}]*)\}/gi)) {
|
|
548
|
+
const [sel, body] = [m[1].trim().replace(/\s+/g, ' '), m[2]];
|
|
549
|
+
if (!/background(-color)?\s*:/.test(body)) continue; // not the painting rule
|
|
550
|
+
if (!/background(-color)?\s*:\s*var\(--scrim\)/.test(body)) {
|
|
551
|
+
offenders.push(`${f}: \`${sel}\` paints a scrim without var(--scrim)`);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
assert.deepEqual(offenders, [], 'a scrim spends the token, never its own value');
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
test('no rule washes a whole surface with a ground token — the dark-mode inversion', () => {
|
|
559
|
+
// Mixing --ink into a SURFACE (var(--bg-card)) is the design system working —
|
|
560
|
+
// --surface-2 and --skeleton are meant to flip with the mode. Mixing it into
|
|
561
|
+
// `transparent` as a FLAT WASH over everything behind it is the bug: --ink is
|
|
562
|
+
// #ffffff in dark, so the wash turns white and lifts the page instead of
|
|
563
|
+
// dimming it. That is what .palette__scrim and .ov-modal-bg both did.
|
|
564
|
+
//
|
|
565
|
+
// The same mix INSIDE a gradient is not a wash — the diagram viewer's dotted
|
|
566
|
+
// "drawing board" texture spends it as one colour stop over the card's own
|
|
567
|
+
// ground, and there flipping with the mode is exactly right. So this matches
|
|
568
|
+
// only a mix that is the ENTIRE value of a background declaration.
|
|
569
|
+
const FLAT_INK_WASH = /background(?:-color)?\s*:\s*color-mix\(in srgb,\s*var\(--ink\)\s*\d+%\s*,\s*transparent\s*\)\s*;/g;
|
|
570
|
+
const bad = [];
|
|
571
|
+
for (const f of fs.readdirSync(HALL).filter((x) => x.endsWith('.css'))) {
|
|
572
|
+
const css = read(f).replace(/\/\*[\s\S]*?\*\//g, '');
|
|
573
|
+
for (const m of css.matchAll(FLAT_INK_WASH)) bad.push(`${f}: ${m[0].trim()}`);
|
|
574
|
+
}
|
|
575
|
+
assert.deepEqual(bad, [], 'a full-surface wash mixed from --ink inverts between modes — use var(--scrim)');
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
test('the wash guard CATCHES a scrim but spares a texture', () => {
|
|
579
|
+
const FLAT_INK_WASH = /background(?:-color)?\s*:\s*color-mix\(in srgb,\s*var\(--ink\)\s*\d+%\s*,\s*transparent\s*\)\s*;/;
|
|
580
|
+
assert.ok(FLAT_INK_WASH.test('.x { background: color-mix(in srgb, var(--ink) 40%, transparent); }'),
|
|
581
|
+
'a flat wash is caught');
|
|
582
|
+
assert.equal(FLAT_INK_WASH.test('.y { background: radial-gradient(circle, color-mix(in srgb, var(--ink) 5%, transparent) 1px, transparent 1.4px) 0 0 / 22px 22px, var(--bg-card); }'), false,
|
|
583
|
+
'the same mix as a gradient STOP is a texture over a ground, and flips correctly');
|
|
584
|
+
assert.equal(FLAT_INK_WASH.test('.z { background: color-mix(in srgb, var(--ink) 6%, var(--bg-card)); }'), false,
|
|
585
|
+
'mixing into a surface is the design system working as intended');
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
test('--scrim is defined once and does NOT flip with the mode', () => {
|
|
589
|
+
const css = read('style.css');
|
|
590
|
+
const defs = [...css.matchAll(/--scrim\s*:/g)];
|
|
591
|
+
assert.equal(defs.length, 1, '--scrim is declared exactly once; a per-mode override would defeat its whole purpose');
|
|
592
|
+
// And no sheet keeps a second copy of the value it holds.
|
|
593
|
+
const copies = [...css.matchAll(new RegExp(SCRIM_VALUE.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'))];
|
|
594
|
+
assert.equal(copies.length, 1, `${SCRIM_VALUE} appears only in the --scrim declaration`);
|
|
595
|
+
});
|
|
@@ -439,22 +439,18 @@ test('RUN: the three notices are inbox lines with a kind, a line and — where o
|
|
|
439
439
|
// than scrolling in a row of their own (walk 1003309). The status tab strip
|
|
440
440
|
// overflows too, but its row is overflow-x:auto and scrolls itself, which is
|
|
441
441
|
// why the fix belongs on the control and not on the drawer.
|
|
442
|
-
const ruleFor = (css, selector) => {
|
|
443
|
-
const re = new RegExp(`(?:^|\\r?\\n)${selector.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*\\{([^}]*)\\}`);
|
|
444
|
-
const m = re.exec(css);
|
|
445
|
-
assert.ok(m, `${selector} rule present in style.css`);
|
|
446
|
-
return m[1];
|
|
447
|
-
};
|
|
448
442
|
|
|
449
443
|
test('a filter control may shrink below its content, so the drawer never pushes the page', () => {
|
|
450
|
-
const filter =
|
|
444
|
+
const filter = rule(styleCss, '.filter');
|
|
445
|
+
assert.ok(filter, '.filter rule present in style.css');
|
|
451
446
|
assert.match(filter, /min-width:\s*0\b/, '.filter is a flex item: min-width:auto is what pinned it to its content');
|
|
452
447
|
assert.match(filter, /max-width:\s*100%/, 'and it may not exceed the row it sits in');
|
|
453
448
|
|
|
454
449
|
// The select is the thing with the runaway intrinsic width. It keeps its
|
|
455
450
|
// 150px floor for wide screens — a filter narrower than that is unreadable —
|
|
456
451
|
// and gains a cap so a long option label cannot widen it past its cell.
|
|
457
|
-
const select =
|
|
452
|
+
const select = rule(styleCss, '.filter select');
|
|
453
|
+
assert.ok(select, '.filter select rule present in style.css');
|
|
458
454
|
assert.match(select, /max-width:\s*100%/, 'the select is capped to its cell');
|
|
459
455
|
// The floor is expressed so it CANNOT itself pin the control: a bare 150px
|
|
460
456
|
// would refuse to shrink in a cell narrower than 150px, which is the same
|
|
@@ -463,7 +459,9 @@ test('a filter control may shrink below its content, so the drawer never pushes
|
|
|
463
459
|
|
|
464
460
|
// The free-text search box sits in the same wrapping row and would do the
|
|
465
461
|
// same thing at 320 with its 200px floor.
|
|
466
|
-
|
|
462
|
+
const search = rule(styleCss, '.filter input[type="search"]');
|
|
463
|
+
assert.ok(search, '.filter input[type="search"] rule present in style.css');
|
|
464
|
+
assert.match(search, /max-width:\s*100%/,
|
|
467
465
|
'the search box is capped the same way');
|
|
468
466
|
});
|
|
469
467
|
|