@bongos/core 1.19.870 → 1.19.871

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 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.870",
6
- "core_contract": "1.19.870",
7
- "source_commit": "3f3a8f1a641ec7e951dbc4be16c5393245267cc4",
5
+ "core_version": "1.19.871",
6
+ "core_contract": "1.19.871",
7
+ "source_commit": "67620593f1ed87465a216fd10c1da6f3e612e683",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-18T19:58:09.397Z",
9
+ "built_at": "2026-09-18T20:45:57.710Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 500,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 2812,
20
- "tree_sha256": "6c70260465a8be8139d283648111c991a1e4f685776de07905880ba2ebbdae9b",
20
+ "tree_sha256": "20310f17dfaa6daa96b4a95d76e600e86e47d3f50c26ff8e5c61e99ad8bed267",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -2602,7 +2602,7 @@
2602
2602
  {
2603
2603
  "path": "docs/module-api-changelog.md",
2604
2604
  "mode": "0000644",
2605
- "sha256": "ac508e1b84ecb0425f8139f5949c3253aa83565fdc649dc42737bc6aa348ccf0"
2605
+ "sha256": "942c02c95b11974a2dfa23288232af47dc505fcc1ea9aa7fa5e7bcb9c9637b63"
2606
2606
  },
2607
2607
  {
2608
2608
  "path": "docs/modules-contract.md",
@@ -7927,12 +7927,12 @@
7927
7927
  {
7928
7928
  "path": "package-lock.json",
7929
7929
  "mode": "0000644",
7930
- "sha256": "55e245ef92f27beb20d11ef866d8264893f33d3e0e6021e84ac8bc5f9c5b2822"
7930
+ "sha256": "a286ed3d44baa4e0996d95f9a822b8d1ea89d4b2703dc4df98f4a694ae6a80fc"
7931
7931
  },
7932
7932
  {
7933
7933
  "path": "package.json",
7934
7934
  "mode": "0000644",
7935
- "sha256": "a0d3158d2589f76b783a67698b13cc78affd260b50dfffdcbc18626a5311eaee"
7935
+ "sha256": "ad919bbaaf5a3d1cb95005c9b45a9d6feb7b3aeae20d575deb24a66d7318ef53"
7936
7936
  },
7937
7937
  {
7938
7938
  "path": "public-docs/index.html",
@@ -9882,7 +9882,7 @@
9882
9882
  {
9883
9883
  "path": "src/module-api.js",
9884
9884
  "mode": "0000644",
9885
- "sha256": "e6b37c96d4027d5093b6cecb603c743988b711883c4cb65209b8ca109eb34875"
9885
+ "sha256": "56a6a61c2947942ec791acd5efda2ff62684d4f543f80249cfdead156d8ff4ea"
9886
9886
  },
9887
9887
  {
9888
9888
  "path": "src/module-loader/catalog.js",
@@ -11352,7 +11352,7 @@
11352
11352
  {
11353
11353
  "path": "tests/goal_subtitle.mjs",
11354
11354
  "mode": "0000644",
11355
- "sha256": "85f4b99edb85d2e04d0029d9962a2870889c747de1ae0781290688bd4cc03de3"
11355
+ "sha256": "90f27cd81c785d81b89bb7242d2e6a1e6a96e6c01a9422a3a841439dfab5433c"
11356
11356
  },
11357
11357
  {
11358
11358
  "path": "tests/goal_suggest.mjs",
@@ -2214,5 +2214,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
2214
2214
  landed since 1.19.868 with no explicit bump. run 35382740500. (task 1002620)
2215
2215
  1.19.870 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2216
2216
  landed since 1.19.869 with no explicit bump. run 35388809554. (task 1002620)
2217
+ 1.19.871 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2218
+ landed since 1.19.870 with no explicit bump. run 35393164740. (task 1002620)
2217
2219
  ---------------------------------------------------------------------------
2218
2220
  ```
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.870",
3
+ "version": "1.19.871",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.870",
9
+ "version": "1.19.871",
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.870",
3
+ "version": "1.19.871",
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
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
71
71
  // there. scripts/gds/bump-version.js still rewrites the literal below; it appends
72
72
  // the entry to that file. Look for a version's history there, not here.
73
73
  // ---------------------------------------------------------------------------
74
- const CORE_VERSION = '1.19.870'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
74
+ const CORE_VERSION = '1.19.871'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
75
75
 
76
76
  // A namespaced logger so a module's log lines are attributable + consistent.
77
77
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -184,6 +184,27 @@ test('an unset subtitle is hidden; a set one is shown trimmed', () => {
184
184
  assert.equal(els.sub.textContent, 'the grep path');
185
185
  });
186
186
 
187
+ // goalTitleRegions — where the row's title ends and the card's begins, as an
188
+ // ANCHOR rather than a byte count (task 1004036).
189
+ //
190
+ // The assertion below and the vacuity guard further down BOTH derive the row's
191
+ // region from here, deliberately. The previous shape asserted subtitleAttr(g)
192
+ // absent from a 160-char window while the row's real region measured 766 — 21%
193
+ // of the span it claimed to check — and a negative assertion passes when it
194
+ // finds nothing, which is also what it does when it is looking in the wrong
195
+ // place. Injecting the tooltip into the row left it passing.
196
+ //
197
+ // One derivation, not two: a guard that recomputed the region itself would stay
198
+ // green while the assertion it claims to protect was narrowed back. Narrow this
199
+ // function and the guard fails, which is the only arrangement that makes the
200
+ // guard worth having.
201
+ function goalTitleRegions(js) {
202
+ const row = js.indexOf('class="gr-title"');
203
+ const card = js.indexOf('class="goal-card__title gr-title"');
204
+ assert.ok(card > row, 'card title boundary not found — re-anchor this slice to whatever now follows the row title');
205
+ return { row, card, rowRegion: js.slice(row, card) };
206
+ }
207
+
187
208
  test('on a LIST the subtitle is a visible line; on the CARD it stays a tooltip', () => {
188
209
  // task 1003206: the row/card painters moved to goals-render.js — the second half
189
210
  // of the carve goals-lib.js began — so read the family, not one filename.
@@ -197,15 +218,38 @@ test('on a LIST the subtitle is a visible line; on the CARD it stays a tooltip',
197
218
  // task 1003307 gave the ROW its line back on the owner's call: 35 of 72 goals
198
219
  // carry a subtitle, and a tooltip does not exist on a touch screen. The CARD
199
220
  // has no room for a line, so it keeps the tooltip (task 1003224's shape).
200
- const row = js.indexOf('class="gr-title"');
221
+ const { row, card, rowRegion } = goalTitleRegions(js);
201
222
  assert.ok(row > 0, 'the row title is still rendered');
202
- assert.match(js.slice(row, row + 200), /subtitleLine\(g\)/, 'the row renders the visible line');
203
- assert.doesNotMatch(js.slice(row, row + 160), /subtitleAttr\(g\)/, 'the row does not also carry the tooltip');
204
- const card = js.indexOf('class="goal-card__title gr-title"');
205
223
  assert.ok(card > 0, 'the card title is still rendered');
224
+ assert.match(rowRegion, /subtitleLine\(g\)/, 'the row renders the visible line');
225
+ assert.doesNotMatch(rowRegion, /subtitleAttr\(g\)/, 'the row does not also carry the tooltip');
206
226
  assert.match(js.slice(card, card + 160), /subtitleAttr\(g\)/, 'the card carries the tooltip');
207
227
  });
208
228
 
229
+ // ---- the negative assertion above is not vacuous (task 1004036) -------------
230
+ // A negative assertion passes when it finds nothing, which is also what it does
231
+ // when it is looking in the wrong place — so one that has never been watched
232
+ // FAIL is not evidence of anything. The previous shape checked subtitleAttr(g)
233
+ // was absent from a 160-char window while the row's real region measured 766,
234
+ // so it verified 21% of the span it claimed to; injecting the tooltip into the
235
+ // row left it passing. This case does that injection and requires the anchored
236
+ // region to catch it. It guards the ASSERTION, not the page.
237
+ test('the row/tooltip check CATCHES a row that carries the tooltip', () => {
238
+ const js = goalsPageSource();
239
+ const { row, card } = goalTitleRegions(js);
240
+
241
+ // Inject the forbidden attribute INSIDE the row's region but past the old
242
+ // 160-char window — the exact regression the assertion exists to catch.
243
+ const at = row + Math.floor((card - row) / 2);
244
+ const broken = js.slice(0, at) + ' title="${subtitleAttr(g)}" ' + js.slice(at);
245
+
246
+ // Through the SAME derivation the assertion uses, so narrowing it reds here.
247
+ assert.throws(
248
+ () => assert.doesNotMatch(goalTitleRegions(broken).rowRegion, /subtitleAttr\(g\)/),
249
+ 'the row region does not notice a tooltip added to the row — the check is vacuous again',
250
+ );
251
+ });
252
+
209
253
  test('every CSS token the new styles use actually exists', () => {
210
254
  // copy-desk.css shipped with --line and --panel, which style.css never
211
255
  // defines, so its fallbacks rendered as nothing (idea 1000821).