@bongos/core 1.21.9 → 1.21.10

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.21.9",
6
- "core_contract": "1.21.9",
7
- "source_commit": "5e31917865d3e81d3818f3930245d356d5a4026d",
5
+ "core_version": "1.21.10",
6
+ "core_contract": "1.21.10",
7
+ "source_commit": "512aceee25e7da9c383d00fced1ebdaf3439fb2e",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-02T17:40:06.190Z",
9
+ "built_at": "2026-10-02T18:33:24.262Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 579,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 3492,
20
- "tree_sha256": "24b6a7b06537f3c5cb25c6a7eabfb5f090643f6e300f42c37dee0627da872521",
20
+ "tree_sha256": "7e67152d9786e7d747180fc77c1d2f3224b15a8a36335fa8175323bd8e228a12",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -2317,12 +2317,12 @@
2317
2317
  {
2318
2318
  "path": "docs/copy-inventory.md",
2319
2319
  "mode": "0000644",
2320
- "sha256": "29d3b399a53a5c89ecd310d353865cfbb29edbd28831dbf39bf7a094369dc746"
2320
+ "sha256": "caf871e1412f90f483f5cec52da966f9ebef1c4be482c9b5a349c69cb83a452b"
2321
2321
  },
2322
2322
  {
2323
2323
  "path": "docs/copy-registry.json",
2324
2324
  "mode": "0000644",
2325
- "sha256": "aec91a4e362a16a62845f79329962972f3b7dbbb819983776528ad784a5c9bdd"
2325
+ "sha256": "f49ecfbe46fab175c02a643e04dac414addd383b9a8b9b244790f00dfc13adc7"
2326
2326
  },
2327
2327
  {
2328
2328
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2827,7 +2827,7 @@
2827
2827
  {
2828
2828
  "path": "docs/module-api-changelog.md",
2829
2829
  "mode": "0000644",
2830
- "sha256": "8f7968f627d9784ce81c36e26fefc4e729b846921ec9683cb8ebec89f613e031"
2830
+ "sha256": "d8e443e8cc8327a6090b608a7a172f312bb946c7e8333917b6a6f33025686c08"
2831
2831
  },
2832
2832
  {
2833
2833
  "path": "docs/modules-contract.md",
@@ -9742,12 +9742,12 @@
9742
9742
  {
9743
9743
  "path": "package-lock.json",
9744
9744
  "mode": "0000644",
9745
- "sha256": "b23c027985b0275c7f62b7cd914a25f8557fd771ce9cc4abef71248344a51038"
9745
+ "sha256": "cc768cbf847ca2bf344b6fc1cf714b3dfcd98e7a3455abc8767955abd050ad1b"
9746
9746
  },
9747
9747
  {
9748
9748
  "path": "package.json",
9749
9749
  "mode": "0000644",
9750
- "sha256": "3b87c1abaf920c0c806b703ac09727005771586d21b2ace4591c3c80179b8dff"
9750
+ "sha256": "1cc1fff963debf018e51b22a1439c8dc152642b9a75932b7565cba3774f75532"
9751
9751
  },
9752
9752
  {
9753
9753
  "path": "public-docs/index.html",
@@ -9767,7 +9767,7 @@
9767
9767
  {
9768
9768
  "path": "release-notes.json",
9769
9769
  "mode": "0000644",
9770
- "sha256": "636e17f625656d60f00fd2b995930f25d063eef13c9ab00e4e814097bcb74784"
9770
+ "sha256": "e6135cfea7642a896020667d8439b3d884b9a9124629fe1249813fe9d58a0f92"
9771
9771
  },
9772
9772
  {
9773
9773
  "path": "scripts/bongos-mcp.js",
@@ -10132,7 +10132,7 @@
10132
10132
  {
10133
10133
  "path": "scripts/gds/copy-inventory.js",
10134
10134
  "mode": "0000644",
10135
- "sha256": "5317a97fce3dfe9cd4101bb0d8fd7928fdd6ab2298297e2e42ec0f859a2f34f5"
10135
+ "sha256": "9dd80d2c37602c59cb75db0be02cfadc737fc64891a81d03f5be5f0ea5e35a27"
10136
10136
  },
10137
10137
  {
10138
10138
  "path": "scripts/gds/coreB-carve-proof.sh",
@@ -11992,7 +11992,7 @@
11992
11992
  {
11993
11993
  "path": "src/module-api.js",
11994
11994
  "mode": "0000644",
11995
- "sha256": "16930510b83df4fe79f92b31a33eb01634368e526ee1cf7e41e59410952aaf45"
11995
+ "sha256": "7706017caa8c20cc1ea2b2c72434a9569d653673ff3b32cc64d65a73ce5736ae"
11996
11996
  },
11997
11997
  {
11998
11998
  "path": "src/module-loader/catalog.js",
@@ -12952,7 +12952,7 @@
12952
12952
  {
12953
12953
  "path": "tests/copy_inventory.mjs",
12954
12954
  "mode": "0000644",
12955
- "sha256": "8af3844c60dad9f561c297398f7d7b72b8a5fd318213b165f72030e923cee93b"
12955
+ "sha256": "b3a2787a34a78bb961bb55ef9de52088881dc2f9cbe6ce7098f0803cd1548146"
12956
12956
  },
12957
12957
  {
12958
12958
  "path": "tests/core_258_box_session_claims_db.mjs",
@@ -4,15 +4,15 @@
4
4
  > Deterministic on a given tree — regenerate and commit rather than hand-editing.
5
5
  > Machine-readable twin: [`copy-registry.json`](copy-registry.json).
6
6
 
7
- **2436 strings** across 3 surfaces · 2106 distinct pieces of copy · 2436 certain, 0 heuristic · 222 shown in more than one place.
7
+ **2417 strings** across 3 surfaces · 2091 distinct pieces of copy · 2417 certain, 0 heuristic · 220 shown in more than one place.
8
8
 
9
9
  ## Surfaces
10
10
 
11
11
  | surface | lives at | files | strings |
12
12
  |---|---|---|---|
13
- | `builders-hall` | `modules/hall-ui/public` | 125 | 1769 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 125 | 1751 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
- | `landing` | `modules/public-landing/public` | 6 | 567 |
15
+ | `landing` | `modules/public-landing/public` | 6 | 566 |
16
16
 
17
17
  ## Confidence, and why it is on every row
18
18
 
@@ -61,8 +61,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
61
61
  | `72a29648399b` | 4x | Tweak a page | modules/hall-ui/public/tweak-editor.html:32, modules/hall-ui/public/tweak-editor.html:32, modules/hall-ui/public/tweak-editor.html:53 |
62
62
  | `ed394c66d49c` | 4x | What the choice changes | modules/public-landing/public/projects.html:1195, modules/public-landing/public/projects.html:1272, modules/public-landing/public/projects.html:1284 |
63
63
  | `4e25e6872321` | 4x | Your projects | modules/public-landing/public/account.html:116, modules/public-landing/public/index.html:691, modules/public-landing/public/projects.html:721 |
64
- | `ed3e9f97ed31` | 3x | , not a | modules/hall-ui/public/studio.html:92, modules/hall-ui/public/thinking.html:40, modules/hall-ui/public/tweak-editor.html:49 |
65
- | `20b0408512ae` | 3x | : the shell's top bar is the page's one | modules/hall-ui/public/studio.html:92, modules/hall-ui/public/thinking.html:41, modules/hall-ui/public/tweak-editor.html:49 |
66
64
  | `08afb1257b71` | 3x | Back to home | modules/hall-ui/public/drachmae.html:87, modules/hall-ui/public/primer.html:90, modules/hall-ui/public/primer.js:282 |
67
65
  | `118026595c16` | 3x | Board Room | modules/hall-ui/public/board-room.html:19, modules/hall-ui/public/board-room.html:19, modules/hall-ui/public/board-room.html:31 |
68
66
  | `a78477a24a48` | 3x | Builders' Hall | modules/hall-ui/public/index.html:12, modules/hall-ui/public/index.html:12, modules/hall-ui/public/index.html:49 |
@@ -76,9 +74,11 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
76
74
  | `e08628967f2f` | 3x | Project settings | modules/hall-ui/public/project-settings.html:15, modules/hall-ui/public/project-settings.html:15, modules/hall-ui/public/project-settings.html:26 |
77
75
  | `45f7bea67776` | 3x | Reading the project’s settings… | modules/public-landing/public/projects.html:1137, modules/public-landing/public/projects.html:1152, modules/public-landing/public/projects.html:1171 |
78
76
  | `df38941b25a6` | 3x | Sign in with GitHub | modules/public-landing/public/account.html:143, modules/public-landing/public/projects.html:894, modules/public-landing/public/projects.html:996 |
79
- | … | | _182 more in the JSON registry_ | |
77
+ | `f9af2d90ce5b` | 3x | Sign out | modules/public-landing/public/account.html:128, modules/public-landing/public/index.html:709, modules/public-landing/public/projects.html:739 |
78
+ | `a061df49e6cb` | 3x | Skip to content | modules/public-landing/public/account.html:88, modules/public-landing/public/index.html:650, modules/public-landing/public/projects.html:661 |
79
+ | … | | _180 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1769 strings
81
+ ## `builders-hall` — 1751 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -88,13 +88,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
88
88
  | `66cea7cefa4e` | certain | '; for (const row of bodyRows) { html += ' | `modules/hall-ui/public/md-reader.js:220` |
89
89
  | `53e4ac514458` | certain | '; out.push(html); continue; } // Lists (unordered '- ' or ordered '1. '); consecutive items collapse. if (/^( | `modules/hall-ui/public/md-reader.js:224` |
90
90
  | `87fa099f5068` | certain | '; } html += ' | `modules/hall-ui/public/md-reader.js:224` |
91
- | `1ee8125b806c` | certain | (README "Where the screens live"; task 1004526 builds them). A pin opens the matter's short card (task 1004528 | `modules/hall-ui/public/street.html:31` |
92
91
  | `af615fa9f404` | certain | (checked {…}) | `modules/hall-ui/public/deploy.js:457` |
93
- | `544794f1ec8f` | certain | (later in | `modules/hall-ui/public/index.html:9` |
94
92
  | `3ac2eb36ba97` | certain | (no sections) | `modules/hall-ui/public/drachmae.js:260` |
95
93
  | `a4614c0b8eb5` | certain | (or use the Claude Code CLI) and open the project. | `modules/hall-ui/public/hall-render.js:810` |
96
94
  | `c7aecadc8133` | certain | (with {…}) | `modules/hall-ui/public/goals-render.js:592` |
97
- | `04e34924e1c4` | certain | ) to where its interior lives — /builders/street#building= | `modules/hall-ui/public/street.html:30` |
98
95
  | `c81e3a97b531` | certain | + Add goal | `modules/hall-ui/public/gate.js:375` |
99
96
  | `650c0b90a095` | certain | + File a blocker | `modules/hall-ui/public/blockers.js:303` |
100
97
  | `27d9721f358f` | certain | + Invite | `modules/hall-ui/public/goals-render.js:1219` |
@@ -105,25 +102,15 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
105
102
  | `1f8aceffb15e` | certain | , claiming, and shipping show — spend on explaining themselves. Richer cards say more and cost more tokens; le | `modules/hall-ui/public/settings.html:324` |
106
103
  | `ac57fe1ccd6e` | certain | , follow its acceptance criteria, stay within touches[], /builder-ship | `modules/hall-ui/public/bulk-toolbar.js:78` |
107
104
  | `574acf2f93bb` | certain | , never quietly ratified — so a clock is worth proposing. The recommended sitting is | `modules/hall-ui/public/government.js:605` |
108
- | `ed3e9f97ed31` | certain | , not a | `modules/hall-ui/public/studio.html:92` |
109
- | `ed3e9f97ed31` | certain | , not a | `modules/hall-ui/public/thinking.html:40` |
110
- | `ed3e9f97ed31` | certain | , not a | `modules/hall-ui/public/tweak-editor.html:49` |
111
105
  | `741e355954ac` | certain | , not at ship). | `modules/hall-ui/public/diagrams.html:52` |
112
- | `6025eb36b204` | certain | , not the prototype's | `modules/hall-ui/public/city.html:31` |
113
106
  | `b31a6bd7edc5` | certain | , or | `modules/hall-ui/public/profile.js:982` |
114
- | `cc4fe2daf372` | certain | , so the brand is a | `modules/hall-ui/public/goal-map.html:66` |
115
107
  | `c7c9b0afc38e` | certain | , then mark it as read on the Home page. | `modules/hall-ui/public/work.html:45` |
116
- | `7a8111edba0a` | certain | , which is a containing block for its position: fixed layers (thinking.css), so the template's fixed layout is | `modules/hall-ui/public/thinking.html:37` |
117
108
  | `24174ce79df3` | certain | 1 · Task lifecycle | `modules/hall-ui/public/diagrams.html:49` |
118
109
  | `e4e929617054` | certain | 2 · Builder rank ladder | `modules/hall-ui/public/diagrams.html:57` |
119
110
  | `a35dd1f12e78` | certain | 3 · {{Currency}} & karma | `modules/hall-ui/public/diagrams.html:65` |
120
111
  | `f1dec47e42d1` | certain | 4 · The complete architecture | `modules/hall-ui/public/diagrams.html:73` |
121
112
  | `477235450d2b` | certain | 5 · Versioning | `modules/hall-ui/public/diagrams.html:82` |
122
- | `20b0408512ae` | certain | : the shell's top bar is the page's one | `modules/hall-ui/public/studio.html:92` |
123
- | `20b0408512ae` | certain | : the shell's top bar is the page's one | `modules/hall-ui/public/thinking.html:41` |
124
- | `20b0408512ae` | certain | : the shell's top bar is the page's one | `modules/hall-ui/public/tweak-editor.html:49` |
125
113
  | `353fff36068f` | certain | ; a later push must be re-approved. | `modules/hall-ui/public/gate.js:109` |
126
- | `2a5aa36f4d29` | certain | ; the sky's first build made only the BRAND the header (the kit's top-bar-80px floor). In the hall the shell's | `modules/hall-ui/public/thinking.html:66` |
127
114
  | `8ffdf4995e81` | certain | A Full Idea answers five questions, so that someone else can deliver against it without having to interview yo | `modules/hall-ui/public/ideas.html:146` |
128
115
  | `3e5a62bc4887` | certain | A GitHub username is needed. | `modules/hall-ui/public/hall-render.js:426` |
129
116
  | `3e5a62bc4887` | certain | A GitHub username is needed. | `modules/hall-ui/public/watch.js:334` |
@@ -1469,7 +1456,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1469
1456
  | `9612c983451f` | certain | achieved · | `modules/hall-ui/public/roadmap.js:288` |
1470
1457
  | `dbfc9e6e921b` | certain | active builder{…}: {…} | `modules/hall-ui/public/government.js:809` |
1471
1458
  | `6ea7c97a6583` | certain | alive · | `modules/hall-ui/public/sky-interaction.js:129` |
1472
- | `c1367ee35fec` | certain | and #district= | `modules/hall-ui/public/street.html:31` |
1473
1459
  | `754babaae931` | certain | and ask in | `modules/hall-ui/public/hall-render.js:808` |
1474
1460
  | `bc960f460250` | certain | and install dependencies ( | `modules/hall-ui/public/hall-render.js:810` |
1475
1461
  | `2177da93be9b` | certain | and leave this alone. | `modules/hall-ui/public/settings.html:328` |
@@ -1553,9 +1539,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1553
1539
  | `01ae1a45baff` | certain | invited by {…} | `modules/hall-ui/public/goal-inbox.js:53` |
1554
1540
  | `77ad318bb546` | certain | invited — awaiting their response | `modules/hall-ui/public/goals-render.js:1433` |
1555
1541
  | `6cfd7c0e0db6` | certain | is both the authority and production; | `modules/hall-ui/public/diagrams.html:74` |
1556
- | `af0777cd098b` | certain | is hardcoded back inside this | `modules/hall-ui/public/index.html:60` |
1557
1542
  | `d0e722302840` | certain | is published and this box is not on it yet. | `modules/hall-ui/public/deploy.js:422` |
1558
- | `aa530bd15088` | certain | itself). The registry stays the single source of truth for what the hall shows; a fitness check (scripts/gds/f | `modules/hall-ui/public/index.html:57` |
1559
1543
  | `6b530a7007bc` | certain | jump to a goal or a thought | `modules/hall-ui/public/goal-map.html:84` |
1560
1544
  | `6b530a7007bc` | certain | jump to a goal or a thought | `modules/hall-ui/public/thinking.html:92` |
1561
1545
  | `9328033a890a` | certain | land every shuttle | `modules/hall-ui/public/sky-interaction.js:45` |
@@ -1599,7 +1583,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1599
1583
  | `99f88f2af2ee` | certain | of work — a tangent, an investigation, an unprompted suggestion — instead of staying on your claimed task. It | `modules/hall-ui/public/settings.html:305` |
1600
1584
  | `5e7a2220c6a9` | certain | of {…} | `modules/hall-ui/public/roadmap.js:288` |
1601
1585
  | `759c12b5f983` | certain | oldest first | `modules/hall-ui/public/hall-widgets.js:165` |
1602
- | `8e888f28b08f` | certain | on the hall's tokens. The button is a link to /builders/street, the street's own hall page, which task 1004525 | `modules/hall-ui/public/city.html:27` |
1603
1586
  | `f5a9579bbc36` | certain | open in new tab | `modules/hall-ui/public/tweak-editor.html:59` |
1604
1587
  | `e2431ea36238` | certain | open in split view | `modules/hall-ui/public/tweak-editor.html:60` |
1605
1588
  | `b9d1b0f0dfb4` | certain | open it where it lives | `modules/hall-ui/public/street.html:109` |
@@ -1632,7 +1615,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1632
1615
  | `f37f5043f81b` | certain | ring {…} of {…} · {…} | `modules/hall-ui/public/sky-interaction.js:34` |
1633
1616
  | `7a398ca1a286` | certain | route · {…} | `modules/hall-ui/public/sky-interaction.js:37` |
1634
1617
  | `90da768431d5` | certain | routes · | `modules/hall-ui/public/sky-interaction.js:129` |
1635
- | `594962dc9ec3` | certain | s into the view containers below (falling back to | `modules/hall-ui/public/index.html:56` |
1636
1618
  | `2a42549b34ae` | certain | said, when flagged: | `modules/hall-ui/public/copy-desk.js:124` |
1637
1619
  | `9bec9eb4829e` | certain | scope: {…} | `modules/hall-ui/public/goals-render.js:865` |
1638
1620
  | `9c35bc28a3e9` | certain | see it | `modules/hall-ui/public/goal-map.html:96` |
@@ -1957,7 +1939,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1957
1939
  | `7667eb552781` | certain | {…}: {…}% ({…}/{…} checks) | `modules/status-ui/public/status.js:468` |
1958
1940
  | `6d0d64f10bd9` | certain | ‹ earlier page | `modules/status-ui/public/index.html:321` |
1959
1941
 
1960
- ## `landing` — 567 strings
1942
+ ## `landing` — 566 strings
1961
1943
 
1962
1944
  | id | conf | text | where |
1963
1945
  |---|---|---|---|
@@ -2478,7 +2460,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2478
2460
  | `56787ad7373b` | certain | save profile | `modules/public-landing/public/account.html:177` |
2479
2461
  | `156d37716e14` | certain | ship.js still writes no session record when the session is rooted in another project dir | `modules/public-landing/public/index.html:817` |
2480
2462
  | `75d4a6fa0422` | certain | shipped in 30 days | `modules/public-landing/public/projects.html:861` |
2481
- | `c50f6ad6e51e` | certain | shipped on | `modules/public-landing/public/index.html:634` |
2482
2463
  | `d06d9d2f5fb7` | certain | so you can bring it back, your repository on GitHub is untouched, and its database and existing backups are ke | `modules/public-landing/public/projects.html:1324` |
2483
2464
  | `22a2200c3beb` | certain | still watching | `modules/public-landing/public/projects.html:1417` |
2484
2465
  | `787275f310ed` | certain | teammate’s handle | `modules/public-landing/public/projects.html:1462` |
@@ -3,17 +3,17 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 2436,
7
- "unique_ids": 2106,
8
- "certain": 2436,
6
+ "strings": 2417,
7
+ "unique_ids": 2091,
8
+ "certain": 2417,
9
9
  "heuristic": 0,
10
- "duplicate_ids": 222
10
+ "duplicate_ids": 220
11
11
  },
12
12
  "surfaces": {
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 125,
16
- "strings": 1769
16
+ "strings": 1751
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -23,7 +23,7 @@
23
23
  "landing": {
24
24
  "at": "modules/public-landing/public",
25
25
  "files": 6,
26
- "strings": 567
26
+ "strings": 566
27
27
  }
28
28
  },
29
29
  "blind_spots": [
@@ -368,28 +368,6 @@
368
368
  "modules/public-landing/public/projects.html:883"
369
369
  ]
370
370
  },
371
- {
372
- "id": "ed3e9f97ed31",
373
- "surface": "builders-hall",
374
- "text": ", not a",
375
- "occurrences": 3,
376
- "at": [
377
- "modules/hall-ui/public/studio.html:92",
378
- "modules/hall-ui/public/thinking.html:40",
379
- "modules/hall-ui/public/tweak-editor.html:49"
380
- ]
381
- },
382
- {
383
- "id": "20b0408512ae",
384
- "surface": "builders-hall",
385
- "text": ": the shell's top bar is the page's one",
386
- "occurrences": 3,
387
- "at": [
388
- "modules/hall-ui/public/studio.html:92",
389
- "modules/hall-ui/public/thinking.html:41",
390
- "modules/hall-ui/public/tweak-editor.html:49"
391
- ]
392
- },
393
371
  {
394
372
  "id": "08afb1257b71",
395
373
  "surface": "builders-hall",
@@ -2422,15 +2400,6 @@
2422
2400
  "origin": "js-markup",
2423
2401
  "confidence": "certain"
2424
2402
  },
2425
- {
2426
- "id": "1ee8125b806c",
2427
- "surface": "builders-hall",
2428
- "text": "(README \"Where the screens live\"; task 1004526 builds them). A pin opens the matter's short card (task 1004528 makes it act). The drawing is street-draw.js (the prototype's front-on kit, verbatim, as pure data) over city-draw.js (the glyphs and the seeded random, shared with the city); street.js reads the feeds and builds the nodes; street.css is the template's",
2429
- "file": "modules/hall-ui/public/street.html",
2430
- "line": 31,
2431
- "origin": "html-text",
2432
- "confidence": "certain"
2433
- },
2434
2403
  {
2435
2404
  "id": "af615fa9f404",
2436
2405
  "surface": "builders-hall",
@@ -2440,15 +2409,6 @@
2440
2409
  "origin": "js-markup",
2441
2410
  "confidence": "certain"
2442
2411
  },
2443
- {
2444
- "id": "544794f1ec8f",
2445
- "surface": "builders-hall",
2446
- "text": "(later in",
2447
- "file": "modules/hall-ui/public/index.html",
2448
- "line": 9,
2449
- "origin": "html-text",
2450
- "confidence": "certain"
2451
- },
2452
2412
  {
2453
2413
  "id": "3ac2eb36ba97",
2454
2414
  "surface": "builders-hall",
@@ -2476,15 +2436,6 @@
2476
2436
  "origin": "js-markup",
2477
2437
  "confidence": "certain"
2478
2438
  },
2479
- {
2480
- "id": "04e34924e1c4",
2481
- "surface": "builders-hall",
2482
- "text": ") to where its interior lives — /builders/street#building=",
2483
- "file": "modules/hall-ui/public/street.html",
2484
- "line": 30,
2485
- "origin": "html-text",
2486
- "confidence": "certain"
2487
- },
2488
2439
  {
2489
2440
  "id": "c81e3a97b531",
2490
2441
  "surface": "builders-hall",
@@ -2575,33 +2526,6 @@
2575
2526
  "origin": "js-markup",
2576
2527
  "confidence": "certain"
2577
2528
  },
2578
- {
2579
- "id": "ed3e9f97ed31",
2580
- "surface": "builders-hall",
2581
- "text": ", not a",
2582
- "file": "modules/hall-ui/public/studio.html",
2583
- "line": 92,
2584
- "origin": "html-text",
2585
- "confidence": "certain"
2586
- },
2587
- {
2588
- "id": "ed3e9f97ed31",
2589
- "surface": "builders-hall",
2590
- "text": ", not a",
2591
- "file": "modules/hall-ui/public/thinking.html",
2592
- "line": 40,
2593
- "origin": "html-text",
2594
- "confidence": "certain"
2595
- },
2596
- {
2597
- "id": "ed3e9f97ed31",
2598
- "surface": "builders-hall",
2599
- "text": ", not a",
2600
- "file": "modules/hall-ui/public/tweak-editor.html",
2601
- "line": 49,
2602
- "origin": "html-text",
2603
- "confidence": "certain"
2604
- },
2605
2529
  {
2606
2530
  "id": "741e355954ac",
2607
2531
  "surface": "builders-hall",
@@ -2611,15 +2535,6 @@
2611
2535
  "origin": "html-text",
2612
2536
  "confidence": "certain"
2613
2537
  },
2614
- {
2615
- "id": "6025eb36b204",
2616
- "surface": "builders-hall",
2617
- "text": ", not the prototype's",
2618
- "file": "modules/hall-ui/public/city.html",
2619
- "line": 31,
2620
- "origin": "html-text",
2621
- "confidence": "certain"
2622
- },
2623
2538
  {
2624
2539
  "id": "b31a6bd7edc5",
2625
2540
  "surface": "builders-hall",
@@ -2629,15 +2544,6 @@
2629
2544
  "origin": "js-markup",
2630
2545
  "confidence": "certain"
2631
2546
  },
2632
- {
2633
- "id": "cc4fe2daf372",
2634
- "surface": "builders-hall",
2635
- "text": ", so the brand is a",
2636
- "file": "modules/hall-ui/public/goal-map.html",
2637
- "line": 66,
2638
- "origin": "html-text",
2639
- "confidence": "certain"
2640
- },
2641
2547
  {
2642
2548
  "id": "c7c9b0afc38e",
2643
2549
  "surface": "builders-hall",
@@ -2647,15 +2553,6 @@
2647
2553
  "origin": "html-text",
2648
2554
  "confidence": "certain"
2649
2555
  },
2650
- {
2651
- "id": "7a8111edba0a",
2652
- "surface": "builders-hall",
2653
- "text": ", which is a containing block for its position: fixed layers (thinking.css), so the template's fixed layout is unchanged and simply measures from the stage instead of the window. The sky's heading is a",
2654
- "file": "modules/hall-ui/public/thinking.html",
2655
- "line": 37,
2656
- "origin": "html-text",
2657
- "confidence": "certain"
2658
- },
2659
2556
  {
2660
2557
  "id": "24174ce79df3",
2661
2558
  "surface": "builders-hall",
@@ -2701,33 +2598,6 @@
2701
2598
  "origin": "html-text",
2702
2599
  "confidence": "certain"
2703
2600
  },
2704
- {
2705
- "id": "20b0408512ae",
2706
- "surface": "builders-hall",
2707
- "text": ": the shell's top bar is the page's one",
2708
- "file": "modules/hall-ui/public/studio.html",
2709
- "line": 92,
2710
- "origin": "html-text",
2711
- "confidence": "certain"
2712
- },
2713
- {
2714
- "id": "20b0408512ae",
2715
- "surface": "builders-hall",
2716
- "text": ": the shell's top bar is the page's one",
2717
- "file": "modules/hall-ui/public/thinking.html",
2718
- "line": 41,
2719
- "origin": "html-text",
2720
- "confidence": "certain"
2721
- },
2722
- {
2723
- "id": "20b0408512ae",
2724
- "surface": "builders-hall",
2725
- "text": ": the shell's top bar is the page's one",
2726
- "file": "modules/hall-ui/public/tweak-editor.html",
2727
- "line": 49,
2728
- "origin": "html-text",
2729
- "confidence": "certain"
2730
- },
2731
2601
  {
2732
2602
  "id": "353fff36068f",
2733
2603
  "surface": "builders-hall",
@@ -2737,15 +2607,6 @@
2737
2607
  "origin": "js-markup",
2738
2608
  "confidence": "certain"
2739
2609
  },
2740
- {
2741
- "id": "2a5aa36f4d29",
2742
- "surface": "builders-hall",
2743
- "text": "; the sky's first build made only the BRAND the header (the kit's top-bar-80px floor). In the hall the shell's top bar is the page's header, so the brand is a",
2744
- "file": "modules/hall-ui/public/thinking.html",
2745
- "line": 66,
2746
- "origin": "html-text",
2747
- "confidence": "certain"
2748
- },
2749
2610
  {
2750
2611
  "id": "8ffdf4995e81",
2751
2612
  "surface": "builders-hall",
@@ -14851,15 +14712,6 @@
14851
14712
  "origin": "js-markup",
14852
14713
  "confidence": "certain"
14853
14714
  },
14854
- {
14855
- "id": "c1367ee35fec",
14856
- "surface": "builders-hall",
14857
- "text": "and #district=",
14858
- "file": "modules/hall-ui/public/street.html",
14859
- "line": 31,
14860
- "origin": "html-text",
14861
- "confidence": "certain"
14862
- },
14863
14715
  {
14864
14716
  "id": "754babaae931",
14865
14717
  "surface": "builders-hall",
@@ -15607,15 +15459,6 @@
15607
15459
  "origin": "html-text",
15608
15460
  "confidence": "certain"
15609
15461
  },
15610
- {
15611
- "id": "af0777cd098b",
15612
- "surface": "builders-hall",
15613
- "text": "is hardcoded back inside this",
15614
- "file": "modules/hall-ui/public/index.html",
15615
- "line": 60,
15616
- "origin": "html-text",
15617
- "confidence": "certain"
15618
- },
15619
15462
  {
15620
15463
  "id": "d0e722302840",
15621
15464
  "surface": "builders-hall",
@@ -15625,15 +15468,6 @@
15625
15468
  "origin": "js-markup",
15626
15469
  "confidence": "certain"
15627
15470
  },
15628
- {
15629
- "id": "aa530bd15088",
15630
- "surface": "builders-hall",
15631
- "text": "itself). The registry stays the single source of truth for what the hall shows; a fitness check (scripts/gds/fitness.js checkHallSectionRegistry) reds the build if a",
15632
- "file": "modules/hall-ui/public/index.html",
15633
- "line": 57,
15634
- "origin": "html-text",
15635
- "confidence": "certain"
15636
- },
15637
15471
  {
15638
15472
  "id": "6b530a7007bc",
15639
15473
  "surface": "builders-hall",
@@ -16021,15 +15855,6 @@
16021
15855
  "origin": "js-markup",
16022
15856
  "confidence": "certain"
16023
15857
  },
16024
- {
16025
- "id": "8e888f28b08f",
16026
- "surface": "builders-hall",
16027
- "text": "on the hall's tokens. The button is a link to /builders/street, the street's own hall page, which task 1004525 builds. It is an",
16028
- "file": "modules/hall-ui/public/city.html",
16029
- "line": 27,
16030
- "origin": "html-text",
16031
- "confidence": "certain"
16032
- },
16033
15858
  {
16034
15859
  "id": "f5a9579bbc36",
16035
15860
  "surface": "builders-hall",
@@ -16318,15 +16143,6 @@
16318
16143
  "origin": "js-markup",
16319
16144
  "confidence": "certain"
16320
16145
  },
16321
- {
16322
- "id": "594962dc9ec3",
16323
- "surface": "builders-hall",
16324
- "text": "s into the view containers below (falling back to",
16325
- "file": "modules/hall-ui/public/index.html",
16326
- "line": 56,
16327
- "origin": "html-text",
16328
- "confidence": "certain"
16329
- },
16330
16146
  {
16331
16147
  "id": "2a42549b34ae",
16332
16148
  "surface": "builders-hall",
@@ -22942,15 +22758,6 @@
22942
22758
  "origin": "html-text",
22943
22759
  "confidence": "certain"
22944
22760
  },
22945
- {
22946
- "id": "c50f6ad6e51e",
22947
- "surface": "landing",
22948
- "text": "shipped on",
22949
- "file": "modules/public-landing/public/index.html",
22950
- "line": 634,
22951
- "origin": "html-text",
22952
- "confidence": "certain"
22953
- },
22954
22761
  {
22955
22762
  "id": "d06d9d2f5fb7",
22956
22763
  "surface": "landing",
@@ -2845,5 +2845,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
2845
2845
  landed since 1.21.7 with no explicit bump. run 37041143274. (task 1002620)
2846
2846
  1.21.9 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2847
2847
  landed since 1.21.8 with no explicit bump. run 37042188671. (task 1002620)
2848
+ 1.21.10 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2849
+ landed since 1.21.9 with no explicit bump. run 37048132870. (task 1002620)
2848
2850
  ---------------------------------------------------------------------------
2849
2851
  ```
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.9",
3
+ "version": "1.21.10",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.21.9",
9
+ "version": "1.21.10",
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.21.9",
3
+ "version": "1.21.10",
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",
@@ -8810,5 +8810,11 @@
8810
8810
  "id": "1004529",
8811
8811
  "text": "Each project can now set who decides what in each part of its government: the charter, rules, disputes, people, planning, automation, review, release and treasury. For each part it names who decides and how: one person decides"
8812
8812
  }
8813
+ ],
8814
+ "1.21.10": [
8815
+ {
8816
+ "id": "1004545",
8817
+ "text": "The list of every piece of on-screen text now comes out the same on a Windows computer as on the build server, so updating it on Windows no longer breaks the automatic checks. Notes the authors left inside page source are no l"
8818
+ }
8813
8819
  ]
8814
8820
  }
@@ -119,8 +119,12 @@ function lineAt(starts, index) {
119
119
 
120
120
  // Does this look like prose a person reads, rather than code that happens to be a
121
121
  // string? Conservative on purpose — a false positive costs an artist's attention.
122
+ //
123
+ // Measured with CRLF folded to LF: the length cap must give a multi-line run the
124
+ // same verdict on a Windows checkout as on CI's, or the committed registry differs
125
+ // by platform (task 1004545 — a 396-char run was 403 under CRLF and vanished).
122
126
  function looksLikeCopy(raw) {
123
- const s = String(raw).trim();
127
+ const s = String(raw).replace(/\r\n/g, '\n').trim();
124
128
  if (s.length < 4 || s.length > 400) return false;
125
129
  if (!/[A-Za-z]{2}/.test(s)) return false; // needs actual letters
126
130
  if (!/\s/.test(s) && !/[.!?]$/.test(s)) return false; // one bare word is a token
@@ -155,12 +159,25 @@ function trimmedSpan(group, groupStart) {
155
159
  return { start: groupStart + lead, end: groupStart + group.length - trail };
156
160
  }
157
161
 
158
- // Strip <script>/<style> bodies so their contents are not read as page text.
159
- // Replaced with spaces of equal length so every line number stays truthful.
162
+ // Strip HTML comments and <script>/<style> bodies so their contents are not read
163
+ // as page text. Replaced with spaces of equal length so every line number — and
164
+ // every span copy-apply.js writes through — stays truthful.
165
+ //
166
+ // Comments are author notes, never something a visitor reads (task 1004545: a
167
+ // header comment's literal `<a>` opened a fake text node). ONE alternation, not
168
+ // three passes, so whichever construct opens first wins, as in a browser: a
169
+ // `<style>` named inside a comment cannot swallow the page up to the real
170
+ // `</style>`, and a `<!--` inside a script string cannot eat past `</script>`.
171
+ //
172
+ // A comment keeps its `<` and `>` and blanks only its inside: marker comments
173
+ // (`<!--apex-only:start-->`, `<!--brand-if:…-->`) split a sentence into segments
174
+ // the server shows or drops independently, so each segment must stay its own row
175
+ // with its own stable id — blanking the whole comment would fuse them.
160
176
  function stripEmbedded(html) {
161
- return html
162
- .replace(/<script\b[\s\S]*?<\/script>/gi, (m) => m.replace(/[^\n]/g, ' '))
163
- .replace(/<style\b[\s\S]*?<\/style>/gi, (m) => m.replace(/[^\n]/g, ' '));
177
+ return html.replace(/<!--[\s\S]*?-->|<script\b[\s\S]*?<\/script>|<style\b[\s\S]*?<\/style>/gi, (m) => {
178
+ const blank = m.replace(/[^\r\n]/g, ' ');
179
+ return m.startsWith('<!--') ? `<${blank.slice(1, -1)}>` : blank;
180
+ });
164
181
  }
165
182
 
166
183
  function fromHtml({ source, rel }) {
@@ -193,7 +210,7 @@ function fromHtml({ source, rel }) {
193
210
 
194
211
  // 3. <title> is the page's own name — always copy.
195
212
  const titleRe = /<title>([^<]{2,200})<\/title>/gi;
196
- while ((m = titleRe.exec(source)) !== null) {
213
+ while ((m = titleRe.exec(cleaned)) !== null) {
197
214
  const titleStart = m.index + '<title>'.length;
198
215
  out.push({ text: m[1].replace(/\s+/g, ' ').trim(), file: rel, line: lineAt(starts, m.index), origin: 'html-title', confidence: 'certain', ...trimmedSpan(m[1], titleStart) });
199
216
  }
package/src/module-api.js CHANGED
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
75
75
  // MAJOR (see allowBoxScope below): passes the request through untouched.
76
76
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
77
77
 
78
- const CORE_VERSION = '1.21.9'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
78
+ const CORE_VERSION = '1.21.10'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
79
79
 
80
80
  // A namespaced logger so a module's log lines are attributable + consistent.
81
81
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -98,6 +98,68 @@ test('stripEmbedded keeps line numbers truthful', () => {
98
98
  assert.equal(copy.line, 6, 'a stripped script must not shift the lines after it — a wrong line number sends an artist to the wrong place');
99
99
  });
100
100
 
101
+ // Task 1004545. street.html's header comment held a literal `<a>`, which opened a
102
+ // fake text node; under CRLF that run was 403 characters, under LF 396 — so a
103
+ // Windows regen dropped a row CI kept and redded "the committed artifacts match".
104
+ // The fixture rebuilds both halves: a tag inside a comment, and a run sized to
105
+ // straddle the cap.
106
+ // Eight 45-char lines under a 28-char head: 396 chars on LF, 404 on CRLF.
107
+ const NEAR_CAP_LINES = Array.from({ length: 8 }, () => ` ${'word '.repeat(8)}s.`);
108
+ const EOL_FIXTURE = [
109
+ '<!doctype html>',
110
+ '<!-- Author note: a building is a door (an <a>) to its interior.',
111
+ ' The template is street.css, the <style> on the tokens.',
112
+ '-->',
113
+ '<style>.x { color: red; }</style>',
114
+ '<p>A real sentence on the page,',
115
+ ...NEAR_CAP_LINES.slice(0, -1),
116
+ `${NEAR_CAP_LINES.at(-1)}</p>`,
117
+ '<p title="A tooltip a person reads">Second real line.</p>',
118
+ ].join('\n');
119
+
120
+ test('LF and CRLF checkouts extract identical rows (task 1004545)', () => {
121
+ const lf = inv.fromHtml({ source: EOL_FIXTURE, rel: 'p.html' });
122
+ const crlf = inv.fromHtml({ source: EOL_FIXTURE.replace(/\n/g, '\r\n'), rel: 'p.html' });
123
+ const strip = (rows) => rows.map(({ text, line, origin }) => ({ text, line, origin }));
124
+ assert.deepEqual(strip(crlf), strip(lf), 'the registry must not depend on the checkout\'s line endings');
125
+ const run = EOL_FIXTURE.slice(EOL_FIXTURE.indexOf('A real'), EOL_FIXTURE.indexOf('</p>'));
126
+ assert.ok(run.length <= 400 && run.replace(/\n/g, '\r\n').length > 400, 'the fixture must straddle the cap, or this test proves nothing');
127
+ // The multi-line sentence sits under the cap only when CRLF counts as one
128
+ // character — so this is the case that reds if the length rule regresses.
129
+ assert.ok(lf.some((r) => r.text.startsWith('A real sentence on the page')), 'a multi-line run under the cap is copy on LF');
130
+ assert.ok(crlf.some((r) => r.text.startsWith('A real sentence on the page')), 'and the same run is copy on CRLF');
131
+ });
132
+
133
+ test('HTML comments are never copy, and a tag named inside one swallows nothing', () => {
134
+ const rows = inv.fromHtml({ source: EOL_FIXTURE, rel: 'p.html' });
135
+ const texts = rows.map((r) => r.text);
136
+ assert.ok(!texts.some((t) => /Author note|its interior|the tokens/.test(t)), 'comment text is an author note, not page copy');
137
+ // The comment names `<style>`: a strip pass that ran style-first would blank from
138
+ // there to the real </style> — harmless here, but the same shape with <script>
139
+ // ahead of real copy would erase it. Both real lines must survive.
140
+ assert.ok(texts.includes('Second real line.'));
141
+ assert.ok(texts.includes('A tooltip a person reads'));
142
+ const real = rows.find((r) => r.text === 'Second real line.');
143
+ assert.equal(real.line, 15, 'a stripped comment must not shift the lines after it');
144
+ // A span still addresses the file's own characters (copy-apply writes through it).
145
+ assert.equal(EOL_FIXTURE.slice(real.start, real.end), 'Second real line.');
146
+ });
147
+
148
+ test('a marker comment still splits copy into the segments the server drops independently', () => {
149
+ // The landing footer: the first sentence is apex-only, the second is not. One
150
+ // fused row would give both a new id and hide that a child instance drops half.
151
+ const src = '<p><!--apex-only:start-->A non-profit, capture-resistant commons. <!--apex-only:end-->Built by agents, on the platform.</p>';
152
+ const texts = inv.fromHtml({ source: src, rel: 'p.html' }).map((r) => r.text);
153
+ assert.ok(texts.includes('A non-profit, capture-resistant commons.'));
154
+ assert.ok(texts.includes('Built by agents, on the platform.'));
155
+ });
156
+
157
+ test('a comment opener inside a script string does not eat the page after it', () => {
158
+ const src = '<script>const s = "<!--";</script>\n<p>Copy after the script.</p>\n<!-- x -->';
159
+ const texts = inv.fromHtml({ source: src, rel: 'p.html' }).map((r) => r.text);
160
+ assert.ok(texts.includes('Copy after the script.'));
161
+ });
162
+
101
163
  test('the registry is deterministic and internally consistent', () => {
102
164
  const a = inv.buildRegistry();
103
165
  const b = inv.buildRegistry();