@bongos/core 1.23.3 → 1.23.5

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.
@@ -4,13 +4,13 @@
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
- **2735 strings** across 3 surfaces · 2323 distinct pieces of copy · 2735 certain, 0 heuristic · 239 shown in more than one place.
7
+ **2737 strings** across 3 surfaces · 2325 distinct pieces of copy · 2737 certain, 0 heuristic · 239 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` | 153 | 1916 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 153 | 1918 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 91 |
15
15
  | `landing` | `modules/public-landing/public` | 9 | 728 |
16
16
 
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
78
78
  | `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 |
79
79
  | … | | _199 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1916 strings
81
+ ## `builders-hall` — 1918 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -362,7 +362,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
362
362
  | `71da00d47492` | certain | Could not invite: {…} | `modules/hall-ui/public/watch.js:344` |
363
363
  | `90691bceaf68` | certain | Could not load | `modules/hall-ui/public/task.js:1038` |
364
364
  | `589a4cfc5442` | certain | Could not load idea {…}. | `modules/hall-ui/public/ideas.js:1019` |
365
- | `192c893fc64e` | certain | Could not load modules. | `modules/hall-ui/public/modules.js:593` |
365
+ | `192c893fc64e` | certain | Could not load modules. | `modules/hall-ui/public/modules.js:602` |
366
366
  | `9912c3835136` | certain | Could not load requests — reload to try again. | `modules/hall-ui/public/collab.js:845` |
367
367
  | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:504` |
368
368
  | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:542` |
@@ -383,7 +383,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
383
383
  | `64f9d51f0fa2` | certain | Could not load your settings. | `modules/hall-ui/public/settings.js:1208` |
384
384
  | `de244c45d916` | certain | Could not load {…} | `modules/hall-ui/public/task.js:1031` |
385
385
  | `2366356926b4` | certain | Could not mark the primer just now. Try again. | `modules/hall-ui/public/primer.js:259` |
386
- | `753987b5da13` | certain | Could not reach the submit endpoint. | `modules/hall-ui/public/modules.js:570` |
386
+ | `753987b5da13` | certain | Could not reach the submit endpoint. | `modules/hall-ui/public/modules.js:579` |
387
387
  | `6f500726f0ac` | certain | Could not read the report: {…} | `modules/hall-ui/public/watch.js:768` |
388
388
  | `21c2f33168a3` | certain | Could not read this project's deploy state: {…} | `modules/hall-ui/public/deploy.js:636` |
389
389
  | `21a782f1af26` | certain | Could not read what this would bring in: {…}. The check below still applies. | `modules/hall-ui/public/deploy.js:542` |
@@ -813,7 +813,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
813
813
  | `90623fec4cfa` | certain | No page is open. | `modules/hall-ui/public/tweak-editor.js:565` |
814
814
  | `1a46c31343cb` | certain | No projects are hosted here yet. | `modules/hall-ui/public/fleet-costs.js:69` |
815
815
  | `9f73b3f3dad0` | certain | No rank floor — any builder can claim this task | `modules/hall-ui/public/task-lib.js:77` |
816
- | `4ffd939755e0` | certain | No real-world data yet, so it is listed but not ranked. | `modules/hall-ui/public/modules.js:334` |
816
+ | `4ffd939755e0` | certain | No real-world data yet, so it is listed but not ranked. | `modules/hall-ui/public/modules.js:343` |
817
817
  | `722d107d7a90` | certain | No render is attached to this page yet. /tweak attaches them when it applies a page; until then there is nothi | `modules/hall-ui/public/approval-queue.js:136` |
818
818
  | `3fd0c6fcb92e` | certain | No request and no invite needed. Sign in with GitHub, and a step-by-step guide takes you the rest of the way. | `modules/hall-ui/public/hall-render.js:283` |
819
819
  | `2947c1ddea9a` | certain | No running box to deploy. | `modules/hall-ui/public/deploy.js:720` |
@@ -885,7 +885,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
885
885
  | `43626cff7071` | certain | Nothing of that kind in your sky. | `modules/hall-ui/public/sky-panel.js:123` |
886
886
  | `b05a5f8cb074` | certain | Nothing personal is sent. | `modules/hall-ui/public/my-agents.js:452` |
887
887
  | `ad9a17a8a5eb` | certain | Nothing shipped yet. | `modules/hall-ui/public/profile.js:292` |
888
- | `f326632f2013` | certain | Nothing to submit — every module here ships with the core. | `modules/hall-ui/public/modules.js:531` |
888
+ | `f326632f2013` | certain | Nothing to submit — every module here ships with the core. | `modules/hall-ui/public/modules.js:540` |
889
889
  | `27c0d872db2d` | certain | Nothing you have typed above is lost by opening this. | `modules/hall-ui/public/ideas.html:155` |
890
890
  | `26a07b64f49d` | certain | Now running core {…} | `modules/hall-ui/public/deploy.js:400` |
891
891
  | `21cb60a8a96a` | certain | Now running core {…} — but GitHub was not updated. | `modules/hall-ui/public/deploy.js:390` |
@@ -1235,7 +1235,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1235
1235
  | `da9da6e866bd` | certain | Take it offline | `modules/hall-ui/public/project-settings.html:59` |
1236
1236
  | `aa8da34fe237` | certain | Take the next page, or pick one from the studio. | `modules/hall-ui/public/tweak-editor.js:566` |
1237
1237
  | `fc53e250e86f` | certain | Take this page | `modules/hall-ui/public/paintbrush.js:116` |
1238
- | `8b3cdb88b0f4` | certain | Taken out of the store. Your copy keeps working, but it will get no more updates. | `modules/hall-ui/public/modules.js:125` |
1238
+ | `8b3cdb88b0f4` | certain | Taken out of the store. Your copy keeps working, but it will get no more updates. | `modules/hall-ui/public/modules.js:134` |
1239
1239
  | `e604fc3ace79` | certain | Task # | `modules/hall-ui/public/blockers.js:138` |
1240
1240
  | `a0f384b022fd` | certain | Task dependencies | `modules/hall-ui/public/goals.html:195` |
1241
1241
  | `91576eb7c880` | certain | Task dependency forest — scrolls sideways inside this box | `modules/hall-ui/public/goal-forest-render.js:186` |
@@ -1400,7 +1400,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1400
1400
  | `e97b2d549f10` | certain | This project is hosted on {…}, and that is where it is taken offline or removed. Both links below open this pr | `modules/hall-ui/public/project-settings.js:298` |
1401
1401
  | `fcd43f045614` | certain | This project is upgraded on the server that runs it: | `modules/hall-ui/public/settings-software-update.js:121` |
1402
1402
  | `53e287924841` | certain | This project runs on a server that {…} looks after, so they install its updates. Ask them for this one and the | `modules/hall-ui/public/settings-software-update.js:100` |
1403
- | `1116d2cad470` | certain | This project tests new versions first | `modules/hall-ui/public/modules.js:211` |
1403
+ | `1116d2cad470` | certain | This project tests new versions first | `modules/hall-ui/public/modules.js:220` |
1404
1404
  | `3c8aaec39c40` | certain | This project's code expects {…} database change{…} that its database has not applied yet. Anything that relies | `modules/hall-ui/public/deploy.js:599` |
1405
1405
  | `b9ed9a5f38dd` | certain | This round changed no lines. | `modules/hall-ui/public/approval-queue.js:150` |
1406
1406
  | `09256febc32d` | certain | This sentence has {…} {…} where a value is dropped in when it is shown. | `modules/hall-ui/public/copy-desk.js:422` |
@@ -1649,7 +1649,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1649
1649
  | `1e6212a16397` | certain | decisions made today | `modules/hall-ui/public/street.html:71` |
1650
1650
  | `4adbb8da9999` | certain | default ({…}) | `modules/hall-ui/public/settings-render.js:64` |
1651
1651
  | `4a287afb0892` | certain | default for your rank | `modules/hall-ui/public/settings.js:424` |
1652
- | `953f99598871` | certain | delisted · no more updates | `modules/hall-ui/public/modules.js:125` |
1652
+ | `953f99598871` | certain | delisted · no more updates | `modules/hall-ui/public/modules.js:134` |
1653
1653
  | `563e03d200c6` | certain | designed, task-tracked, not yet built | `modules/hall-ui/public/diagrams.html:40` |
1654
1654
  | `a3fd52d9513b` | certain | document{…} you added · learned | `modules/hall-ui/public/settings-specialities.js:322` |
1655
1655
  | `fcec9cad1c69` | certain | download .docx | `modules/hall-ui/public/tweak-editor.html:65` |
@@ -1699,7 +1699,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1699
1699
  | `c0c1d07e2829` | certain | is the authority and production; | `modules/hall-ui/public/diagrams.html:71` |
1700
1700
  | `6b530a7007bc` | certain | jump to a goal or a thought | `modules/hall-ui/public/goal-map.html:84` |
1701
1701
  | `6b530a7007bc` | certain | jump to a goal or a thought | `modules/hall-ui/public/thinking.html:92` |
1702
- | `cf5047ea06d8` | certain | kept on general: {…} | `modules/hall-ui/public/modules.js:207` |
1702
+ | `cf5047ea06d8` | certain | kept on general: {…} | `modules/hall-ui/public/modules.js:216` |
1703
1703
  | `9328033a890a` | certain | land every shuttle | `modules/hall-ui/public/sky-interaction.js:45` |
1704
1704
  | `9018bf6e99eb` | certain | last used {…} · signed in {…} | `modules/hall-ui/public/settings-sessions.js:46` |
1705
1705
  | `b4b8d57ab043` | certain | lists them there. | `modules/hall-ui/public/commands.html:42` |
@@ -1727,11 +1727,11 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1727
1727
  | `7b5ad068dc26` | certain | not graded | `modules/hall-ui/public/hall-render.js:349` |
1728
1728
  | `01a3d68d80c1` | certain | not graded (grader outage) | `modules/hall-ui/public/builders.js:544` |
1729
1729
  | `d43b9bbb8d4d` | certain | not graded (quality lens unavailable) | `modules/hall-ui/public/builders.js:546` |
1730
- | `380177c47d89` | certain | not measured yet | `modules/hall-ui/public/modules.js:351` |
1730
+ | `380177c47d89` | certain | not measured yet | `modules/hall-ui/public/modules.js:360` |
1731
1731
  | `c04e4491af67` | certain | not now | `modules/hall-ui/public/studio.html:110` |
1732
1732
  | `3916a3dc8e98` | certain | not started | `modules/hall-ui/public/roadmap.js:120` |
1733
1733
  | `3916a3dc8e98` | certain | not started | `modules/hall-ui/public/roadmap.js:311` |
1734
- | `6d28ca6a61bf` | certain | not testing | `modules/hall-ui/public/modules.js:206` |
1734
+ | `6d28ca6a61bf` | certain | not testing | `modules/hall-ui/public/modules.js:215` |
1735
1735
  | `b4d87a62ec85` | certain | nothing by that name — or not explored yet | `modules/hall-ui/public/sky-interaction.js:138` |
1736
1736
  | `8ca0a499ec86` | certain | nothing recorded yet · {…} | `modules/hall-ui/public/profile-charts.js:302` |
1737
1737
  | `6a040d3dbd48` | certain | nothing waits on you. | `modules/hall-ui/public/street.html:105` |
@@ -1771,7 +1771,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1771
1771
  | `9eca058c6ad2` | certain | release a thought — one line | `modules/hall-ui/public/goal-map.html:90` |
1772
1772
  | `9eca058c6ad2` | certain | release a thought — one line | `modules/hall-ui/public/thinking.html:98` |
1773
1773
  | `d4bb81532896` | certain | repro steps, context, anything that helps… | `modules/hall-ui/public/ideas.html:80` |
1774
- | `299dd9d33f53` | certain | restart it | `modules/hall-ui/public/modules.js:141` |
1774
+ | `299dd9d33f53` | certain | restart it | `modules/hall-ui/public/modules.js:150` |
1775
1775
  | `58b4e7a48d86` | certain | reviews from before Tweak Mode | `modules/hall-ui/public/studio.html:143` |
1776
1776
  | `0d677ab4868a` | certain | reviews written on the live site | `modules/hall-ui/public/studio.html:138` |
1777
1777
  | `f37f5043f81b` | certain | ring {…} of {…} · {…} | `modules/hall-ui/public/sky-interaction.js:34` |
@@ -1794,8 +1794,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1794
1794
  | `c8c2551006dc` | certain | skip the tour | `modules/hall-ui/public/goal-map.html:121` |
1795
1795
  | `c8c2551006dc` | certain | skip the tour | `modules/hall-ui/public/thinking.html:122` |
1796
1796
  | `1e737a57eb20` | certain | start governing | `modules/hall-ui/public/city.html:99` |
1797
- | `e294c3429c2e` | certain | strong at {…} | `modules/hall-ui/public/modules.js:340` |
1798
- | `0215b2cdca8c` | certain | submit for review | `modules/hall-ui/public/modules.js:286` |
1797
+ | `e294c3429c2e` | certain | strong at {…} | `modules/hall-ui/public/modules.js:349` |
1798
+ | `0215b2cdca8c` | certain | submit for review | `modules/hall-ui/public/modules.js:295` |
1799
1799
  | `43e6f1592ae3` | certain | submit it in the editor | `modules/hall-ui/public/studio.js:868` |
1800
1800
  | `9ec19e32f86f` | certain | submit page | `modules/hall-ui/public/tweak-editor.html:68` |
1801
1801
  | `da30b952a60b` | certain | system / unattributed | `modules/hall-ui/public/goals-page.js:284` |
@@ -1859,9 +1859,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1859
1859
  | `969577b937d6` | certain | versions in flight | `modules/hall-ui/public/roadmap.js:321` |
1860
1860
  | `8cd3cc4005fc` | certain | via goal | `modules/hall-ui/public/dom-utils.js:450` |
1861
1861
  | `18cf722bdd7e` | certain | waiting · | `modules/hall-ui/public/sky-interaction.js:128` |
1862
- | `354861d3c2ce` | certain | waits for a restart | `modules/hall-ui/public/modules.js:139` |
1862
+ | `354861d3c2ce` | certain | waits for a restart | `modules/hall-ui/public/modules.js:148` |
1863
1863
  | `35be9e0923da` | certain | walks the whole path in plain language. | `modules/hall-ui/public/hall-render.js:841` |
1864
- | `20318b6da94e` | certain | weak at {…} | `modules/hall-ui/public/modules.js:342` |
1864
+ | `20318b6da94e` | certain | weak at {…} | `modules/hall-ui/public/modules.js:351` |
1865
1865
  | `db42054582ed` | certain | wells · | `modules/hall-ui/public/sky-interaction.js:129` |
1866
1866
  | `17705daf7b85` | certain | what counts as passing | `modules/hall-ui/public/government.html:53` |
1867
1867
  | `96a8971a5c44` | certain | what got un-stuck | `modules/hall-ui/public/blockers.js:131` |
@@ -1878,6 +1878,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1878
1878
  | `143f77e2b782` | certain | why these are the same | `modules/hall-ui/public/task-detail.js:571` |
1879
1879
  | `ec7c228cb4ce` | certain | why this isn’t worth doing | `modules/hall-ui/public/task-detail.js:622` |
1880
1880
  | `98297cf0fa4d` | certain | with help from {…} | `modules/hall-ui/public/builders.js:754` |
1881
+ | `caa8962d20c8` | certain | withdrawn · update when a fix is out | `modules/hall-ui/public/modules.js:127` |
1881
1882
  | `80707a00b301` | certain | would lock | `modules/hall-ui/public/my-agents.js:383` |
1882
1883
  | `95cdbd063b62` | certain | would lock none | `modules/hall-ui/public/my-agents.js:384` |
1883
1884
  | `dd7f7d6a97fe` | certain | your share this month | `modules/hall-ui/public/street.html:91` |
@@ -1892,10 +1893,11 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1892
1893
  | `de5b58a187c6` | certain | {…} Change that profile and this follows it. | `modules/hall-ui/public/settings-render.js:65` |
1893
1894
  | `e4b36621d4f1` | certain | {…} Nothing needs doing — this page shows the result when it lands. | `modules/hall-ui/public/deploy.js:222` |
1894
1895
  | `6c08bfe92e2b` | certain | {…} This project is invite-only: the {…} invites each builder, and there is nothing to apply for here. | `modules/hall-ui/public/hall-render.js:292` |
1896
+ | `8ebfbca38e77` | certain | {…} Your copy keeps working; update when a newer version is out. | `modules/hall-ui/public/modules.js:127` |
1895
1897
  | `c5623d60015d` | certain | {…} Your standing is {…}. | `modules/hall-ui/public/hall-render.js:854` |
1896
1898
  | `a91e1e702d4d` | certain | {…} achieved, {…} in progress, {…} not started of {…} goals | `modules/hall-ui/public/roadmap.js:73` |
1897
- | `a65d371b5cb3` | certain | {…} and above can enable or disable a module | `modules/hall-ui/public/modules.js:284` |
1898
- | `36258a270517` | certain | {…} and above can switch this | `modules/hall-ui/public/modules.js:210` |
1899
+ | `a65d371b5cb3` | certain | {…} and above can enable or disable a module | `modules/hall-ui/public/modules.js:293` |
1900
+ | `36258a270517` | certain | {…} and above can switch this | `modules/hall-ui/public/modules.js:219` |
1899
1901
  | `56b00d773232` | certain | {…} and {…} | `modules/hall-ui/public/profile-nudge.js:77` |
1900
1902
  | `788ff11f1135` | certain | {…} awarded | `modules/hall-ui/public/task.js:475` |
1901
1903
  | `9d160147b34a` | certain | {…} criteria · since {…} | `modules/hall-ui/public/roadmap.js:176` |
@@ -1906,7 +1908,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1906
1908
  | `55b949873848` | certain | {…} is in. | `modules/hall-ui/public/tweak-editor.js:568` |
1907
1909
  | `80b4aa799a4b` | certain | {…} is writing this page now. You can read it, download it, or take another page from the studio. | `modules/hall-ui/public/tweak-editor.js:319` |
1908
1910
  | `830d2be6f859` | certain | {…} line | `modules/hall-ui/public/tweak-editor.js:235` |
1909
- | `92469c4757f1` | certain | {…} not measured yet | `modules/hall-ui/public/modules.js:325` |
1911
+ | `92469c4757f1` | certain | {…} not measured yet | `modules/hall-ui/public/modules.js:334` |
1910
1912
  | `73c1372b43d9` | certain | {…} of {…} | `modules/hall-ui/public/sky-panel.js:120` |
1911
1913
  | `cc5106af4b35` | certain | {…} of {…} criteria satisfied | `modules/hall-ui/public/goals-lib.js:32` |
1912
1914
  | `cc5106af4b35` | certain | {…} of {…} criteria satisfied | `modules/hall-ui/public/goals-render.js:701` |
@@ -1929,14 +1931,14 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1929
1931
  | `1a8a6267e490` | certain | {…} unfinished task{…} — say what happens to each | `modules/hall-ui/public/goals-render.js:1032` |
1930
1932
  | `2f75f69cdb2f` | certain | {…} {…} changed | `modules/hall-ui/public/profile-crafts.js:216` |
1931
1933
  | `8186b562553a` | certain | {…} {…} waiting | `modules/hall-ui/public/work.js:431` |
1932
- | `a9216af9b05e` | certain | {…} {…} — how-to | `modules/hall-ui/public/modules.js:646` |
1934
+ | `a9216af9b05e` | certain | {…} {…} — how-to | `modules/hall-ui/public/modules.js:655` |
1933
1935
  | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:514` |
1934
1936
  | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/work.js:276` |
1935
1937
  | `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:878` |
1936
1938
  | `a6e4ed98fbea` | certain | {…} · revoke it any time under Active sessions. | `modules/hall-ui/public/settings.js:810` |
1937
1939
  | `d73256fbc395` | certain | {…} · who votes, and how it {…} | `modules/hall-ui/public/board-room.js:480` |
1938
1940
  | `1ac723849449` | certain | {…} · {…}{…} | `modules/hall-ui/public/sky-interaction.js:33` |
1939
- | `ddd2bfc1fb60` | certain | {…} — how to use it | `modules/hall-ui/public/modules.js:648` |
1941
+ | `ddd2bfc1fb60` | certain | {…} — how to use it | `modules/hall-ui/public/modules.js:657` |
1940
1942
  | `085f93f3f775` | certain | {…} — see all standings | `modules/hall-ui/public/hall-render.js:80` |
1941
1943
  | `7609b97aec22` | certain | {…}% complete | `modules/hall-ui/public/hall-render.js:741` |
1942
1944
  | `2a2728a4ec4f` | certain | {…}% of tasks complete | `modules/hall-ui/public/roadmap.js:63` |
@@ -1950,7 +1952,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1950
1952
  | `1e275ee0299c` | certain | {…}s only | `modules/hall-ui/public/government.js:1067` |
1951
1953
  | `97e27ab169ae` | certain | {…}{…} session{…} across {…} builder{…}. | `modules/hall-ui/public/sessions.js:443` |
1952
1954
  | `3d74668f69e5` | certain | {…}{…} · {…} | `modules/hall-ui/public/task.js:655` |
1953
- | `1026fd5f68b7` | certain | · version | `modules/hall-ui/public/modules.js:651` |
1955
+ | `1026fd5f68b7` | certain | · version | `modules/hall-ui/public/modules.js:660` |
1954
1956
  | `a6ae9cbdee30` | certain | — all builders — | `modules/hall-ui/public/builders.js:698` |
1955
1957
  | `729d4ce22b99` | certain | — any — | `modules/hall-ui/public/hall-widgets.js:173` |
1956
1958
  | `d2c30a1ee74e` | certain | — decide — | `modules/hall-ui/public/goals-render.js:996` |
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/bongos/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 2735,
7
- "unique_ids": 2323,
8
- "certain": 2735,
6
+ "strings": 2737,
7
+ "unique_ids": 2325,
8
+ "certain": 2737,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 239
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 153,
16
- "strings": 1916
16
+ "strings": 1918
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -5128,7 +5128,7 @@
5128
5128
  "surface": "builders-hall",
5129
5129
  "text": "Could not load modules.",
5130
5130
  "file": "modules/hall-ui/public/modules.js",
5131
- "line": 593,
5131
+ "line": 602,
5132
5132
  "origin": "js-notice",
5133
5133
  "confidence": "certain"
5134
5134
  },
@@ -5317,7 +5317,7 @@
5317
5317
  "surface": "builders-hall",
5318
5318
  "text": "Could not reach the submit endpoint.",
5319
5319
  "file": "modules/hall-ui/public/modules.js",
5320
- "line": 570,
5320
+ "line": 579,
5321
5321
  "origin": "js-notice",
5322
5322
  "confidence": "certain"
5323
5323
  },
@@ -9187,7 +9187,7 @@
9187
9187
  "surface": "builders-hall",
9188
9188
  "text": "No real-world data yet, so it is listed but not ranked.",
9189
9189
  "file": "modules/hall-ui/public/modules.js",
9190
- "line": 334,
9190
+ "line": 343,
9191
9191
  "origin": "js-markup",
9192
9192
  "confidence": "certain"
9193
9193
  },
@@ -9835,7 +9835,7 @@
9835
9835
  "surface": "builders-hall",
9836
9836
  "text": "Nothing to submit — every module here ships with the core.",
9837
9837
  "file": "modules/hall-ui/public/modules.js",
9838
- "line": 531,
9838
+ "line": 540,
9839
9839
  "origin": "js-text-assign",
9840
9840
  "confidence": "certain"
9841
9841
  },
@@ -12985,7 +12985,7 @@
12985
12985
  "surface": "builders-hall",
12986
12986
  "text": "Taken out of the store. Your copy keeps working, but it will get no more updates.",
12987
12987
  "file": "modules/hall-ui/public/modules.js",
12988
- "line": 125,
12988
+ "line": 134,
12989
12989
  "origin": "js-markup",
12990
12990
  "confidence": "certain"
12991
12991
  },
@@ -14470,7 +14470,7 @@
14470
14470
  "surface": "builders-hall",
14471
14471
  "text": "This project tests new versions first",
14472
14472
  "file": "modules/hall-ui/public/modules.js",
14473
- "line": 211,
14473
+ "line": 220,
14474
14474
  "origin": "js-markup",
14475
14475
  "confidence": "certain"
14476
14476
  },
@@ -16711,7 +16711,7 @@
16711
16711
  "surface": "builders-hall",
16712
16712
  "text": "delisted · no more updates",
16713
16713
  "file": "modules/hall-ui/public/modules.js",
16714
- "line": 125,
16714
+ "line": 134,
16715
16715
  "origin": "js-markup",
16716
16716
  "confidence": "certain"
16717
16717
  },
@@ -17161,7 +17161,7 @@
17161
17161
  "surface": "builders-hall",
17162
17162
  "text": "kept on general: {…}",
17163
17163
  "file": "modules/hall-ui/public/modules.js",
17164
- "line": 207,
17164
+ "line": 216,
17165
17165
  "origin": "js-markup",
17166
17166
  "confidence": "certain"
17167
17167
  },
@@ -17413,7 +17413,7 @@
17413
17413
  "surface": "builders-hall",
17414
17414
  "text": "not measured yet",
17415
17415
  "file": "modules/hall-ui/public/modules.js",
17416
- "line": 351,
17416
+ "line": 360,
17417
17417
  "origin": "js-markup",
17418
17418
  "confidence": "certain"
17419
17419
  },
@@ -17449,7 +17449,7 @@
17449
17449
  "surface": "builders-hall",
17450
17450
  "text": "not testing",
17451
17451
  "file": "modules/hall-ui/public/modules.js",
17452
- "line": 206,
17452
+ "line": 215,
17453
17453
  "origin": "js-markup",
17454
17454
  "confidence": "certain"
17455
17455
  },
@@ -17809,7 +17809,7 @@
17809
17809
  "surface": "builders-hall",
17810
17810
  "text": "restart it",
17811
17811
  "file": "modules/hall-ui/public/modules.js",
17812
- "line": 141,
17812
+ "line": 150,
17813
17813
  "origin": "js-markup",
17814
17814
  "confidence": "certain"
17815
17815
  },
@@ -18016,7 +18016,7 @@
18016
18016
  "surface": "builders-hall",
18017
18017
  "text": "strong at {…}",
18018
18018
  "file": "modules/hall-ui/public/modules.js",
18019
- "line": 340,
18019
+ "line": 349,
18020
18020
  "origin": "js-markup",
18021
18021
  "confidence": "certain"
18022
18022
  },
@@ -18025,7 +18025,7 @@
18025
18025
  "surface": "builders-hall",
18026
18026
  "text": "submit for review",
18027
18027
  "file": "modules/hall-ui/public/modules.js",
18028
- "line": 286,
18028
+ "line": 295,
18029
18029
  "origin": "js-markup",
18030
18030
  "confidence": "certain"
18031
18031
  },
@@ -18601,7 +18601,7 @@
18601
18601
  "surface": "builders-hall",
18602
18602
  "text": "waits for a restart",
18603
18603
  "file": "modules/hall-ui/public/modules.js",
18604
- "line": 139,
18604
+ "line": 148,
18605
18605
  "origin": "js-markup",
18606
18606
  "confidence": "certain"
18607
18607
  },
@@ -18619,7 +18619,7 @@
18619
18619
  "surface": "builders-hall",
18620
18620
  "text": "weak at {…}",
18621
18621
  "file": "modules/hall-ui/public/modules.js",
18622
- "line": 342,
18622
+ "line": 351,
18623
18623
  "origin": "js-markup",
18624
18624
  "confidence": "certain"
18625
18625
  },
@@ -18767,6 +18767,15 @@
18767
18767
  "origin": "js-markup",
18768
18768
  "confidence": "certain"
18769
18769
  },
18770
+ {
18771
+ "id": "caa8962d20c8",
18772
+ "surface": "builders-hall",
18773
+ "text": "withdrawn · update when a fix is out",
18774
+ "file": "modules/hall-ui/public/modules.js",
18775
+ "line": 127,
18776
+ "origin": "js-markup",
18777
+ "confidence": "certain"
18778
+ },
18770
18779
  {
18771
18780
  "id": "80707a00b301",
18772
18781
  "surface": "builders-hall",
@@ -18893,6 +18902,15 @@
18893
18902
  "origin": "js-markup",
18894
18903
  "confidence": "certain"
18895
18904
  },
18905
+ {
18906
+ "id": "8ebfbca38e77",
18907
+ "surface": "builders-hall",
18908
+ "text": "{…} Your copy keeps working; update when a newer version is out.",
18909
+ "file": "modules/hall-ui/public/modules.js",
18910
+ "line": 127,
18911
+ "origin": "js-markup",
18912
+ "confidence": "certain"
18913
+ },
18896
18914
  {
18897
18915
  "id": "c5623d60015d",
18898
18916
  "surface": "builders-hall",
@@ -18916,7 +18934,7 @@
18916
18934
  "surface": "builders-hall",
18917
18935
  "text": "{…} and above can enable or disable a module",
18918
18936
  "file": "modules/hall-ui/public/modules.js",
18919
- "line": 284,
18937
+ "line": 293,
18920
18938
  "origin": "js-markup",
18921
18939
  "confidence": "certain"
18922
18940
  },
@@ -18925,7 +18943,7 @@
18925
18943
  "surface": "builders-hall",
18926
18944
  "text": "{…} and above can switch this",
18927
18945
  "file": "modules/hall-ui/public/modules.js",
18928
- "line": 210,
18946
+ "line": 219,
18929
18947
  "origin": "js-markup",
18930
18948
  "confidence": "certain"
18931
18949
  },
@@ -19024,7 +19042,7 @@
19024
19042
  "surface": "builders-hall",
19025
19043
  "text": "{…} not measured yet",
19026
19044
  "file": "modules/hall-ui/public/modules.js",
19027
- "line": 325,
19045
+ "line": 334,
19028
19046
  "origin": "js-markup",
19029
19047
  "confidence": "certain"
19030
19048
  },
@@ -19231,7 +19249,7 @@
19231
19249
  "surface": "builders-hall",
19232
19250
  "text": "{…} {…} — how-to",
19233
19251
  "file": "modules/hall-ui/public/modules.js",
19234
- "line": 646,
19252
+ "line": 655,
19235
19253
  "origin": "js-text-assign",
19236
19254
  "confidence": "certain"
19237
19255
  },
@@ -19294,7 +19312,7 @@
19294
19312
  "surface": "builders-hall",
19295
19313
  "text": "{…} — how to use it",
19296
19314
  "file": "modules/hall-ui/public/modules.js",
19297
- "line": 648,
19315
+ "line": 657,
19298
19316
  "origin": "js-text-assign",
19299
19317
  "confidence": "certain"
19300
19318
  },
@@ -19420,7 +19438,7 @@
19420
19438
  "surface": "builders-hall",
19421
19439
  "text": "· version",
19422
19440
  "file": "modules/hall-ui/public/modules.js",
19423
- "line": 651,
19441
+ "line": 660,
19424
19442
  "origin": "js-markup",
19425
19443
  "confidence": "certain"
19426
19444
  },
@@ -3223,5 +3223,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
3223
3223
  landed since 1.23.1 with no explicit bump. run 40399986777. (task 1002620)
3224
3224
  1.23.3 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3225
3225
  landed since 1.23.2 with no explicit bump. run 40402796050. (task 1002620)
3226
+ 1.23.4 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3227
+ landed since 1.23.3 with no explicit bump. run 40406624494. (task 1002620)
3228
+ 1.23.5 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3229
+ landed since 1.23.4 with no explicit bump. run 40417462733. (task 1002620)
3226
3230
  ---------------------------------------------------------------------------
3227
3231
  ```
@@ -176,6 +176,8 @@ closed on every unknown, including a ledger read it cannot complete.
176
176
 
177
177
  **Attribution (`author`/`origin`/`license`/`maintainer`) is portable metadata, not a cross-Bongos link** — each repo runs its own Bongos with its own builder identities ([ADR 0100](adr/0100-two-repo-instance-model.md) §3), so credit travels *with the module* rather than through a foreign key ([ADR 0107](adr/0107-module-upstreaming-contribution-to-core-catalog.md) §2). `bongos module new` stamps all four as TODO placeholders (license defaults to `AGPL-3.0`) so a module carries its authorship from the day it's scaffolded, not bolted on later at upstream-submit time.
178
178
 
179
+ **`bongos module store [--sort <part>] [--max-cents N] [--max-credits N] [--json]`** (task 1003811) is the **store** from the terminal: what the catalog lists, in its order — listed modules ranked, then New ones, unranked — with each module's score, price and place (parent, and sub-category once approved). It asks `GET /store/modules`, the same read the hall's "In the store" group makes, and filters, ranks and caps nothing itself: the quality floor, the ranking and the cap of ten per sub-category live only in `src/bongos/module-listing.js`, so the hall and the terminal cannot disagree about which modules are the best. `tests/module_store_cli.mjs` sends the same queries through the API and the CLI and requires the same modules in the same order.
180
+
179
181
  **`bongos module list [--catalog] [--search <text>] [--json]`** ([ADR 0107](adr/0107-module-upstreaming-contribution-to-core-catalog.md) §2/§3, [ADR 0167](adr/0167-module-catalog-source-vs-provenance.md)) is the browsable catalog from the terminal: every module on disk with its enabled state, its author + origin credit, and its upkeep posture. `--catalog` narrows to the **core-shipped** modules — the shared catalog an instance opts into (§6, default-off). Two axes travel on each row and they are *not* the same question: **`source`** (which tree ships it — the core package or this instance's own repo, read structurally from the loader's discovery root, [ADR 0108](adr/0108-instance-composition-configurable-root.md) §1) and **`provenance`** (who built it, derived from the declared `origin`). A core module that declares no attribution is credited to the platform and the credit is **marked inferred** (`*`) rather than left blank or silently invented. The hall's Modules tab renders the same model (`src/module-loader/catalog.js`) via `GET /modules`, so the two surfaces cannot drift.
180
182
 
181
183
  **`bongos module check <key> [--sign-off "Name <email>"]`** ([ADR 0107](adr/0107-module-upstreaming-contribution-to-core-catalog.md) §4) is the submit-time pre-check a module must clear before it can be upstreamed. It reuses (never re-types) the public-mirror publish denylist (`scripts/bongos/publish-manifest.js`'s `matchesDeny`) to reject content that cannot ship under AGPL (game content, pixel art, copyrighted reference material) — deliberately the DENY half only, since a brand-new module is never on the publish ALLOWLIST until it's accepted into core (§6). It also requires `module.json`'s `license` to be AGPL-3.0 (inbound = outbound) and a declared `maintenance` posture — acceptance is a commitment to upkeep, so a module with no `maintenance.status`, or one already `deprecated`/`orphaned`, is refused ([ADR 0166](adr/0166-module-maintenance-and-deprecation-policy.md); see below). On a pass, `--sign-off` records a lightweight DCO-style affirmation (own work, licensed AGPL-3.0 — never a copyright-assignment CLA) to `modules/<key>/.upstream-signoff.json`.
@@ -389,6 +391,7 @@ Run `bongos upgrade` to confirm coreVersion compatibility, then `node scripts/bo
389
391
  - The version is `module.json`'s `version`. Each version is published **once** and must be newer than the last — bump it to publish a fix.
390
392
  - Your first publish of a key makes you its author; only the author can publish later versions, and a delisted key takes none.
391
393
  - **Every new version goes to testers first** (task 1003803, [ADR 0344](adr/0344-a-tester-is-a-project-that-opts-in-once.md) D2). A published version, first release or update, is recorded on the `tester` channel (`store_module_version_channels`, reason `new_version`), and the publish response says so as `channel`. A publish cannot name a channel, so there is no flag that sends an untested version to every project. Moving it to `general` is a separate, later step: the promotion gate (task 1003804).
394
+ - **Taking a version back** (task 1004895). Once a version is on `general` the tester stage is behind it, so a Metic+ person can withdraw it: `POST /store/modules/:key/versions/:version/withdraw { reason }` (the `module.delist` permission, the same one that guards delist and release). It writes one `withdrawn` channel row (reason `withdrawn_by_person`, `set_by` the person; the reason text is kept by the audit log), and from then on acquire, install, update and the update check hand out the newest version still served instead; an exact request for the withdrawn one is refused by name. The reason is kept on that row (`note`, core_281). Nothing a project already holds is touched: it keeps running the version, and both `bongos upgrade` and the hall's Modules tab tell it the version was withdrawn, with the reason (`GET /store/modules/latest` returns a `withdrawn` map of `{ version, note }` beside `latest`, and each `GET /modules` row carries `store_withdrawn`). Because update only moves forward, the way off is a newer version: until the author publishes one, the upgrade report says so rather than offering the older release. Withdrawing the only served version is allowed and leaves nothing to hand out. A second withdraw of the same version is refused (`already_withdrawn`). There is no un-withdraw route.
392
395
  - **When a tester version reaches everyone** (task 1003804, [ADR 0344](adr/0344-a-tester-is-a-project-that-opts-in-once.md) D3; owner, 2026-10-23). A version on `tester` moves to `general` after **7 days**, or **from day 2** once **5 or more** testers report a clean install, as long as its Security gate has passed and its own tests pass (every test file, or no tests declared; ADR 0343). Any failed tester install or runtime error **holds** it on `tester` (reason `held_tester_errors`); a held version does not move at day 7, and only a Metic+ person releases it, with `POST /store/modules/:key/versions/:version/release { reason }` (the `module.delist` permission). A version is only ever held on evidence, so one nobody tests still moves at day 7. Each move is a new channel row: reason `promoted_after_7_days`, `promoted_early_clean_installs` or `released_by_person`, and `set_by` empty when the system moved it. An hourly sweep in the server applies the rule (`MODULE_PROMOTION_DISABLED=1` switches it off). `GET /store/modules/:key/versions/:version/channel` shows any signed-in builder a version's channel, who moved it and why, the rule in plain words and, on `tester`, the counts it is waiting on and the day it goes to everyone. The rule is `decidePromotion` in `src/bongos/module-promotion.js`.
393
396
  - The publish denylist applies (ADR 0098), plus a refusal of credential-named files (`.env*`, `*.pem`, `*.key`, `id_rsa`, …) anywhere in the module. The store re-checks every hash and the denylist itself.
394
397
  - Gate: Metic+ (`module.submit`) for now. This is not `bongos module submit`, which proposes a module *into* core.
@@ -1644,7 +1644,7 @@
1644
1644
  "surface": "builders",
1645
1645
  "title": "Modules",
1646
1646
  "states_read": ["browse","search-empty","lens","details","out"],
1647
- "files_hash": "d23744d56d3d6024",
1647
+ "files_hash": "29285c080d99ce0e",
1648
1648
  "reading_hash": "d544f93125c23b24",
1649
1649
  "counts": {"lines":58,"placed":26,"shared":8,"unplaced":24},
1650
1650
  "omitted": {"data":106},
@@ -1653,7 +1653,7 @@
1653
1653
  {"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":868,"string_id":"87cee78ca134"},
1654
1654
  {"key":"L0002","section":"top bar","text":"Modules","placement":"shared"},
1655
1655
  {"key":"L0003","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":540,"string_id":"eba610d25523"},
1656
- {"key":"L0004","section":"top bar","text":"⌘K","placement":"shared"},
1656
+ {"key":"L0004","section":"top bar","text":"Ctrl K","placement":"shared"},
1657
1657
  {"key":"L0005","section":"top bar","text":"Building","placement":"shared"},
1658
1658
  {"key":"L0006","section":"top bar","text":"Artistry","placement":"shared"},
1659
1659
  {"key":"L0007","section":"top bar","text":"Ideating","placement":"shared"},
@@ -1665,7 +1665,7 @@
1665
1665
  {"key":"L0013","section":"Module catalog","text":"all","placement":"unplaced"},
1666
1666
  {"key":"L0014","section":"Module catalog","text":"enabled","placement":"unplaced","occurrences":16},
1667
1667
  {"key":"L0015","section":"Module catalog","text":"disabled","placement":"unplaced","occurrences":4},
1668
- {"key":"L0016","section":"Module catalog","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"search-empty","occurrences":3},
1668
+ {"key":"L0016","section":"Module catalog","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"lens","occurrences":4},
1669
1669
  {"key":"L0017","section":"Module catalog","text":"modules","placement":"unplaced"},
1670
1670
  {"key":"L0018","section":"Module catalog","text":"16 from the {…}","placement":"unplaced"},
1671
1671
  {"key":"L0019","section":"Module catalog","text":"of {…}","placement":"placed","file":"modules/hall-ui/public/roadmap.js","line":311,"string_id":"5e7a2220c6a9"},
@@ -1683,20 +1683,20 @@
1683
1683
  {"key":"L0031","section":"Module catalog","text":"{…}-loaded","placement":"unplaced"},
1684
1684
  {"key":"L0032","section":"Module catalog","text":"sessions","placement":"placed","file":"modules/hall-ui/public/task.js","line":483,"string_id":"732b4c935e36"},
1685
1685
  {"key":"L0033","section":"Module catalog","text":"Built by this project","placement":"placed","file":"modules/hall-ui/public/modules.html","line":67,"string_id":"b51edc826cbe"},
1686
- {"key":"L0034","section":"Module catalog","text":"submit for review","placement":"placed","file":"modules/hall-ui/public/modules.js","line":286,"string_id":"0215b2cdca8c"},
1686
+ {"key":"L0034","section":"Module catalog","text":"submit for review","placement":"placed","file":"modules/hall-ui/public/modules.js","line":295,"string_id":"0215b2cdca8c"},
1687
1687
  {"key":"L0035","section":"Module catalog","text":"A module built here can be sent for review to join the shared catalog, credited to you and this project.","placement":"placed","file":"modules/hall-ui/public/modules.html","line":71,"string_id":"25442a59064e"},
1688
1688
  {"key":"L0036","section":"Module catalog","text":"Testing new versions","placement":"placed","file":"modules/hall-ui/public/modules.html","line":79,"string_id":"d52c87fba7da"},
1689
- {"key":"L0037","section":"Module catalog","text":"This project tests new versions first","placement":"placed","file":"modules/hall-ui/public/modules.js","line":211,"string_id":"1116d2cad470"},
1689
+ {"key":"L0037","section":"Module catalog","text":"This project tests new versions first","placement":"placed","file":"modules/hall-ui/public/modules.js","line":220,"string_id":"1116d2cad470"},
1690
1690
  {"key":"L0038","section":"Module catalog","text":"testing","placement":"unplaced"},
1691
- {"key":"L0039","section":"Module catalog","text":"kept on general: {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":207,"string_id":"cf5047ea06d8"},
1691
+ {"key":"L0039","section":"Module catalog","text":"kept on general: {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":216,"string_id":"cf5047ea06d8"},
1692
1692
  {"key":"L0040","section":"Module catalog","text":"A testing project gets new module versions first, and what it finds feeds their scores. It is never switched on for you. To keep one module on the versions everyone gets, open its details.","placement":"placed","file":"modules/hall-ui/public/modules.html","line":82,"string_id":"a517246720d9"},
1693
1693
  {"key":"L0041","section":"Module catalog","text":"In the store","placement":"placed","file":"modules/hall-ui/public/modules.html","line":91,"string_id":"ecfebcd52894"},
1694
1694
  {"key":"L0042","section":"Module catalog","text":"Sort by","placement":"placed","file":"modules/hall-ui/public/modules.html","line":95,"string_id":"70383b194ec0"},
1695
1695
  {"key":"L0043","section":"Module catalog","text":"Name","placement":"unplaced"},
1696
1696
  {"key":"L0044","section":"Module catalog","text":"No store module matches that {…}.","placement":"unplaced","state":"search-empty"},
1697
1697
  {"key":"L0045","section":"Module catalog","text":"scores","placement":"unplaced","occurrences":2},
1698
- {"key":"L0046","section":"Module catalog","text":"strong at {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":340,"string_id":"e294c3429c2e","occurrences":3},
1699
- {"key":"L0047","section":"Module catalog","text":"weak at {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":342,"string_id":"20318b6da94e"},
1698
+ {"key":"L0046","section":"Module catalog","text":"strong at {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":349,"string_id":"e294c3429c2e","occurrences":3},
1699
+ {"key":"L0047","section":"Module catalog","text":"weak at {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":351,"string_id":"20318b6da94e"},
1700
1700
  {"key":"L0048","section":"Module catalog","text":"A part is strong at 80 of 100 or more, and weak below the listing floor. Missing data never counts against a module, and a new module is not ranked.","placement":"placed","file":"modules/hall-ui/public/modules.html","line":98,"string_id":"01857ee8cbe3"},
1701
1701
  {"key":"L0049","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":516,"string_id":"1883ad7f07fc"},
1702
1702
  {"key":"L0050","section":"Module catalog","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":670,"string_id":"fd1903586e8e"},
@@ -0,0 +1,25 @@
1
+ -- core_281_module_version_withdraw_note.sql — the reason a person gave when they took
2
+ -- a module version back (task 1004895, criterion wa5-staged-rollout).
3
+ --
4
+ -- WHAT IT IS. One nullable column on the channel history (core_276). A withdraw
5
+ -- writes a 'withdrawn' row; `note` holds the reason the Metic+ person gave, so a
6
+ -- project still running that version is told WHY ("crashes on start", "security
7
+ -- flaw, update now") in `bongos upgrade` and the hall's Modules tab, not just that
8
+ -- it happened. `reason` stays the machine code it always was (^[a-z][a-z0-9_]*$);
9
+ -- `note` is the person's words. Every other move (publish, promote, release) leaves
10
+ -- it NULL, so no existing row or writer changes.
11
+ --
12
+ -- Additive only (one nullable column), so forward-safe: an older release that does
13
+ -- not know the column keeps reading and writing the table as before.
14
+ -- Idempotent: safe to re-run.
15
+ -- Approved by the owner on 2026-10-26 (in chat: "Yes, show the reason").
16
+
17
+ BEGIN;
18
+
19
+ ALTER TABLE store_module_version_channels
20
+ ADD COLUMN IF NOT EXISTS note text CHECK (note IS NULL OR length(note) BETWEEN 1 AND 2000);
21
+
22
+ INSERT INTO schema_migrations (version) VALUES ('core_281_module_version_withdraw_note')
23
+ ON CONFLICT (version) DO NOTHING;
24
+
25
+ COMMIT;
@@ -240,7 +240,7 @@ const PERMISSIONS = [
240
240
  { key: 'module.subcategory.review', system: false, floor: 'metic', guards: 'GET /store/subcategories/queue, POST /store/subcategories/:id/approve, POST /store/subcategories/:id/merge' },
241
241
  // Take a module out of the store (task 1003797, ADR 0338 D2). Stops new installs,
242
242
  // versions and downloads; never reaches an instance that already holds it.
243
- { key: 'module.delist', system: false, floor: 'metic', guards: 'POST /store/modules/:key/delist, POST /store/modules/:key/versions/:version/release (a version the promotion gate held on tester — task 1003804)' },
243
+ { key: 'module.delist', system: false, floor: 'metic', guards: 'POST /store/modules/:key/delist, POST /store/modules/:key/versions/:version/release (a version the promotion gate held on tester — task 1003804), POST /store/modules/:key/versions/:version/withdraw (take a version back — task 1004895)' },
244
244
  { key: 'security.report.file', system: false, floor: 'metic', guards: 'POST /security/reports, GET /security/adr' },
245
245
  { key: 'llm_cache.use', system: false, floor: 'metic', guards: 'POST /llm-cache/{lookup,store}' },
246
246
  { key: 'backup.manage', system: false, floor: 'metic', guards: 'GET /backup/status, POST /backup/trigger' },
@@ -118,6 +118,15 @@
118
118
  return `<a class="ov-fact mod-howto" href="${escapeHtml(href)}">how-to</a>`;
119
119
  }
120
120
 
121
+ // A store module this instance runs at a version the store took back (task
122
+ // 1004895): it keeps working here, and the reason the person gave is the tooltip.
123
+ function withdrawnFact(m) {
124
+ const w = m.store_withdrawn;
125
+ if (!w || typeof w !== 'object') return '';
126
+ const why = w.note ? `Taken back from the store: ${w.note}` : 'Taken back from the store.';
127
+ return `<span class="fact-pill fact-pill--warn" title="${escapeHtml(why)} Your copy keeps working; update when a newer version is out.">withdrawn · update when a fix is out</span>`;
128
+ }
129
+
121
130
  // A store module this instance holds that the store has since delisted (task
122
131
  // 1003797, ADR 0338 D2): it keeps working here, but no more versions will come.
123
132
  function delistedFact(m) {
@@ -296,7 +305,7 @@
296
305
  <div class="ov-row__main">
297
306
  <span class="ov-row__title">${escapeHtml(m.title || m.key)}<span class="ov-mono">${escapeHtml(m.key)}</span></span>
298
307
  ${desc ? `<p class="ov-row__sub mod-row__desc">${escapeHtml(desc)}</p>` : ''}
299
- <div class="ov-row__facts">${provenancePill(m)}${categoryFact(m)}${attributionFacts(m)}${upkeepFact(m)}${howtoFact(m)}${delistedFact(m)}${restartFact(m)}</div>
308
+ <div class="ov-row__facts">${provenancePill(m)}${categoryFact(m)}${attributionFacts(m)}${upkeepFact(m)}${howtoFact(m)}${delistedFact(m)}${withdrawnFact(m)}${restartFact(m)}</div>
300
309
  ${lines ? `<details class="mod-more"${openKeys.has(m.key) ? ' open' : ''}><summary aria-label="Details for ${escapeHtml(m.title || m.key)}"></summary>${lines}</details>` : ''}
301
310
  </div>
302
311
  <div class="ov-row__right mod-row__right">${rightHtml(m)}</div>
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.23.3",
3
+ "version": "1.23.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.23.3",
9
+ "version": "1.23.5",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",