@bongos/core 1.21.32 → 1.21.33

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,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.21.32",
6
- "core_contract": "1.21.32",
7
- "source_commit": "dc621db8394a42d17e812d259ae034b2d9ff2e49",
5
+ "core_version": "1.21.33",
6
+ "core_contract": "1.21.33",
7
+ "source_commit": "30d1db91ef10db933cab72b3137a473db54a0f5a",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-03T20:09:59.517Z",
9
+ "built_at": "2026-10-03T20:48:28.006Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 581,
12
+ "docs_redacted": 582,
13
13
  "agent_docs_stubbed": 27,
14
- "functional_verbatim": 2904,
14
+ "functional_verbatim": 2906,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3513,
20
- "tree_sha256": "90d84e8130f69ebcd5a15d34b53ac41e6728ff754955ee11a4a9c62dda2dd54b",
19
+ "file_count": 3516,
20
+ "tree_sha256": "5c679542be1ab90675f9aef4d272309207d9776a26e96d7f95653c165e9eaf74",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -317,12 +317,12 @@
317
317
  {
318
318
  "path": "clients/bongos-client/README.md",
319
319
  "mode": "0000644",
320
- "sha256": "69d42ead01d9c96a8728c306701ade8dc9f1682cfa82513c2411a9d3a265c48d"
320
+ "sha256": "0ff95bf12579c65f3339ac4bf0cc282d7d0132a4872a159042954907b36abfa3"
321
321
  },
322
322
  {
323
323
  "path": "clients/bongos-client/bongos-client.global.js",
324
324
  "mode": "0000644",
325
- "sha256": "134bfb4b226537fdeaf31519c764926dc250b713e4eb3968e65068d0fc460740"
325
+ "sha256": "d7d4b4c0235d41edfa9348e2953c7f30e97d1c967f1c3d40d32b9a788981826f"
326
326
  },
327
327
  {
328
328
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -332,17 +332,17 @@
332
332
  {
333
333
  "path": "clients/bongos-client/index.cjs",
334
334
  "mode": "0000644",
335
- "sha256": "319671c677ec2bbcadbb8b054b47acf4e943e823720edba32416b6a23c46c90b"
335
+ "sha256": "4f3cba7f1b570870e2f407e2fbe4d407337a71c882b55e064e814bb653bd77be"
336
336
  },
337
337
  {
338
338
  "path": "clients/bongos-client/index.d.ts",
339
339
  "mode": "0000644",
340
- "sha256": "07246b400a63caa5586a45ec1af6b60c04e616f06515015653d6e7dc48b3fe4f"
340
+ "sha256": "8daa0216a1a98d91c1c5430f04a1801d3a5f44159de38c707ae929633f6ec27b"
341
341
  },
342
342
  {
343
343
  "path": "clients/bongos-client/index.mjs",
344
344
  "mode": "0000644",
345
- "sha256": "1a8057d83c6ab453ce6251991f30b8502edb0cd9cebd90d427f706187073f3c2"
345
+ "sha256": "1a0e9c95b879d23b2ed6035e27de9c8a4c830dcb2b8614cfdb6b887028684ca3"
346
346
  },
347
347
  {
348
348
  "path": "clients/bongos-client/package.json",
@@ -2152,7 +2152,7 @@
2152
2152
  {
2153
2153
  "path": "docs/adr/0338-modules-travel-through-a-bongos-hosted-store.md",
2154
2154
  "mode": "0000644",
2155
- "sha256": "5acb8ac6e656a909ef6392f845f7a479d44d7b7619197e9f66b4879e16a6971c"
2155
+ "sha256": "eadc3bb809b213bbd14dabeab23169c4b4f94393182362b840fef15a2aa59df1"
2156
2156
  },
2157
2157
  {
2158
2158
  "path": "docs/adr/0339-a-projects-owner-upgrades-it-and-a-hosted-project-hands-off-to-the-hub-door.md",
@@ -2292,17 +2292,17 @@
2292
2292
  {
2293
2293
  "path": "docs/api-reference.md",
2294
2294
  "mode": "0000644",
2295
- "sha256": "0d8593234a315be3d3e03f23612ee7248ee742bca086e24c6b835d28f137c443"
2295
+ "sha256": "12abe3c6207d5ea31ff769856aea0211f6285193a4fca9af56bb16214d05fd04"
2296
2296
  },
2297
2297
  {
2298
2298
  "path": "docs/api/openapi.json",
2299
2299
  "mode": "0000644",
2300
- "sha256": "0b0b87bbe13d992d896a7145f86d1ef09d7f80c2922d968ea45bcbff38479e11"
2300
+ "sha256": "8d3ffd1391e96fcaef1009476a3068d3eca0520bd0237130981ea037743c0d3a"
2301
2301
  },
2302
2302
  {
2303
2303
  "path": "docs/architecture.md",
2304
2304
  "mode": "0000644",
2305
- "sha256": "aa092ac83b6b23e3b030d463860a194bd024fc12d31e07bbeb036ac3a23d4a35"
2305
+ "sha256": "5236bf63df238c4b93e515a9982e76e0908382d049bf38035b5bda2a3ceda11b"
2306
2306
  },
2307
2307
  {
2308
2308
  "path": "docs/branding-contract.md",
@@ -2322,18 +2322,23 @@
2322
2322
  {
2323
2323
  "path": "docs/copy-inventory.md",
2324
2324
  "mode": "0000644",
2325
- "sha256": "48ed28854a75411af0098e31dd92f99b1cceff4e969dc1d1811a5e1bf9ccf696"
2325
+ "sha256": "63b57d53d62211c652eb5be9ab8a6cc7c86d7073dd391bf830d616521939faea"
2326
2326
  },
2327
2327
  {
2328
2328
  "path": "docs/copy-registry.json",
2329
2329
  "mode": "0000644",
2330
- "sha256": "13b018cc4a49c755c7f6b598079fdd0f028008e2c63b1e1bb18c14871b786d1f"
2330
+ "sha256": "60f2163d148fc345d5cd72f5a1215e941359b59707d9ad16579a105a4eea047d"
2331
2331
  },
2332
2332
  {
2333
2333
  "path": "docs/design/apex-pass-2-direction.md",
2334
2334
  "mode": "0000644",
2335
2335
  "sha256": "b4f9fdf5a44373217d59acadcdb2d17fd44018a4d30647bc518bd401f2876756"
2336
2336
  },
2337
+ {
2338
+ "path": "docs/design/craft-mode-direction.md",
2339
+ "mode": "0000644",
2340
+ "sha256": "083f40e17073b4c7a7d78205fa23299ecd1357fce13894d27c29365004a70f34"
2341
+ },
2337
2342
  {
2338
2343
  "path": "docs/design/demonolith-plan.md",
2339
2344
  "mode": "0000644",
@@ -2832,7 +2837,7 @@
2832
2837
  {
2833
2838
  "path": "docs/module-api-changelog.md",
2834
2839
  "mode": "0000644",
2835
- "sha256": "c0f0ecb9abea0a0d26109fbdc1022b7496ef6e9bdbfe84f1d2555bde8400149e"
2840
+ "sha256": "d1617c68d9ddf112ee4e3724e6a8e8c20862eadcf13b28ed1477357cb0d4f306"
2836
2841
  },
2837
2842
  {
2838
2843
  "path": "docs/modules-contract.md",
@@ -2922,7 +2927,7 @@
2922
2927
  {
2923
2928
  "path": "docs/page-readings.json",
2924
2929
  "mode": "0000644",
2925
- "sha256": "8ba0324ffe4260864ca53f1e42198491c42e60dd328e9886380e3ffb2e3087be"
2930
+ "sha256": "6e1cdceef490555e75212809c1feb37ab072b4d1065a448ba55fb2110be0a779"
2926
2931
  },
2927
2932
  {
2928
2933
  "path": "docs/project-context.template.md",
@@ -4852,7 +4857,7 @@
4852
4857
  {
4853
4858
  "path": "modules/government/catalog.js",
4854
4859
  "mode": "0000644",
4855
- "sha256": "300d99ff9a8c8c59f70179367e0b262c774f2cfa91376347d13e62296dbf132a"
4860
+ "sha256": "1592e5e388887cfffc79c69be88e31728d2a44a0c7db70f6b262d2df551aba44"
4856
4861
  },
4857
4862
  {
4858
4863
  "path": "modules/government/charter.js",
@@ -5054,6 +5059,11 @@
5054
5059
  "mode": "0000644",
5055
5060
  "sha256": "e839988918bee95e0a5f11bbfe71bd6d3304ad6d8a00a6b78593a34c3e36a6c4"
5056
5061
  },
5062
+ {
5063
+ "path": "modules/government/migrations/government_025_module_delist.sql",
5064
+ "mode": "0000644",
5065
+ "sha256": "5bcdd9defa3927adda5612d990d25dc8efaea8f2a0c159b5bd1b4154364512df"
5066
+ },
5057
5067
  {
5058
5068
  "path": "modules/government/module.json",
5059
5069
  "mode": "0000644",
@@ -5862,7 +5872,7 @@
5862
5872
  {
5863
5873
  "path": "modules/hall-ui/public/modules.js",
5864
5874
  "mode": "0000644",
5865
- "sha256": "01fbd0bd0ac6910e9deb91599598c5c4aa1f5139b9cdcc05aeed4def50359c55"
5875
+ "sha256": "6f960241607ea3921cce5d40bf5fbb6d17595d26213601cbc6a7195448624b11"
5866
5876
  },
5867
5877
  {
5868
5878
  "path": "modules/hall-ui/public/modules.states.json",
@@ -9807,12 +9817,12 @@
9807
9817
  {
9808
9818
  "path": "package-lock.json",
9809
9819
  "mode": "0000644",
9810
- "sha256": "98c7377fe080c344a720b0ec5e306d6229bd9c330fb051838c1d9e6f653dbbe6"
9820
+ "sha256": "9c33acea5e84be12568db8431cae6c00c0becce9ebf25f887d959cb1453f256a"
9811
9821
  },
9812
9822
  {
9813
9823
  "path": "package.json",
9814
9824
  "mode": "0000644",
9815
- "sha256": "6bb8d1ab2b6db8876f1e38077a19483cb12ebe4c8a9971e4964f563298a0866c"
9825
+ "sha256": "19635f61cb2a318a048e664315953ad7f7a8df8ae7db54ca9f3ad72bf1b4f676"
9816
9826
  },
9817
9827
  {
9818
9828
  "path": "public-docs/index.html",
@@ -9832,7 +9842,7 @@
9832
9842
  {
9833
9843
  "path": "release-notes.json",
9834
9844
  "mode": "0000644",
9835
- "sha256": "71b4fa8ec2f99c846ba0ee0d7f3451613e624841fcf4fc6790b40f5f086a3a4c"
9845
+ "sha256": "0492fe5c14bf9b67c7155a3b29fd3b361775c5b93d7ab790c4c6b39b83296936"
9836
9846
  },
9837
9847
  {
9838
9848
  "path": "scripts/bongos-mcp.js",
@@ -10712,7 +10722,7 @@
10712
10722
  {
10713
10723
  "path": "scripts/gds/module.js",
10714
10724
  "mode": "0000644",
10715
- "sha256": "240a50d80078e81b692cea24d823340d797f3193afd6bec0dcb5d9afb0669c54"
10725
+ "sha256": "eeabf40fafbfdd7e83eeaec6b3898ee913a3f9235b334c952d5d545fd42ad26c"
10716
10726
  },
10717
10727
  {
10718
10728
  "path": "scripts/gds/move-escalation.js",
@@ -11832,7 +11842,7 @@
11832
11842
  {
11833
11843
  "path": "src/bongos/module-store.js",
11834
11844
  "mode": "0000644",
11835
- "sha256": "4d4cb32e7fdc80c2f31c76a04d939c62980515eb06f7d3862a91c5163a9a70ce"
11845
+ "sha256": "373a0ff03c6644ea622ff859edfe9003fcfa94ea7eb5ca937059865c3eeb317f"
11836
11846
  },
11837
11847
  {
11838
11848
  "path": "src/bongos/module-submissions.js",
@@ -11897,7 +11907,7 @@
11897
11907
  {
11898
11908
  "path": "src/bongos/route-rank-check.js",
11899
11909
  "mode": "0000644",
11900
- "sha256": "932376cc890d5b7cd05d871e7ae346b2a877c867ae05d330f930b5779c88ad2e"
11910
+ "sha256": "a72e24f1cc5f4f27e7f8827de5b936e773d0e0e9ffe39e2de4da97e42b35e3af"
11901
11911
  },
11902
11912
  {
11903
11913
  "path": "src/bongos/routes.js",
@@ -11982,7 +11992,7 @@
11982
11992
  {
11983
11993
  "path": "src/bongos/routes/modules.js",
11984
11994
  "mode": "0000644",
11985
- "sha256": "84ae1e60b25ea68796b57b193294f1322f4349633867c419a63b888713fcd158"
11995
+ "sha256": "88fdc1c7d0904c8a7dcea9f87a61848982f9db73a1b66a0dba81ac2220c34bfa"
11986
11996
  },
11987
11997
  {
11988
11998
  "path": "src/bongos/routes/my-sessions.js",
@@ -12057,7 +12067,7 @@
12057
12067
  {
12058
12068
  "path": "src/module-api.js",
12059
12069
  "mode": "0000644",
12060
- "sha256": "3b1ea1c35af115635ef7cacc489bf5ba30bbc7aa205cec47e38602934574393d"
12070
+ "sha256": "18734fe8e41cc0acf97d24f1d444c78b22c4ec7197ff906f045c4f13ec517cae"
12061
12071
  },
12062
12072
  {
12063
12073
  "path": "src/module-loader/catalog.js",
@@ -14292,7 +14302,7 @@
14292
14302
  {
14293
14303
  "path": "tests/hall_catalog_world.mjs",
14294
14304
  "mode": "0000644",
14295
- "sha256": "9a2434b3d54cbc23b3874e757d5d2fc6ab5b50e239c07d013f8cfe1409c11806"
14305
+ "sha256": "11f0ac50c5424a76371591b31275c796ded853db0cd35798b9adc878cdd88c88"
14296
14306
  },
14297
14307
  {
14298
14308
  "path": "tests/hall_city.mjs",
@@ -15252,7 +15262,7 @@
15252
15262
  {
15253
15263
  "path": "tests/module_catalog.mjs",
15254
15264
  "mode": "0000644",
15255
- "sha256": "dfb3bdda7a25328490f2c07ee9434eae0b9b87b2676e0152d29ea40d9e9ef43f"
15265
+ "sha256": "4b2e3b067ddaed61f032f5a825402971e053326a65a75b969e0484f9b183fb7e"
15256
15266
  },
15257
15267
  {
15258
15268
  "path": "tests/module_cli.mjs",
@@ -15309,6 +15319,11 @@
15309
15319
  "mode": "0000644",
15310
15320
  "sha256": "ba4233ed072c87df9dbc5c75af10655ad8eaaf9d8ccbe69df146052467a1279e"
15311
15321
  },
15322
+ {
15323
+ "path": "tests/module_store_delist.mjs",
15324
+ "mode": "0000644",
15325
+ "sha256": "6689e5b56ba80fceff4981266886222a94d8a9fca24a8cbd07ab240ba3ff2037"
15326
+ },
15312
15327
  {
15313
15328
  "path": "tests/module_store_howto.mjs",
15314
15329
  "mode": "0000644",
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
5
5
  by hand; it regenerates when the spec changes, so it can never drift from the routes.
6
6
 
7
7
  - API version: **v1** (served at `/api/bongos/v1`)
8
- - 501 operations across 73 resource groups
8
+ - 502 operations across 73 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -1103,6 +1103,8 @@ function createClient(opts = {}) {
1103
1103
  postStoreModulesKeyAcquire: (args) => request("POST", "/store/modules/{key}/acquire", { hasBody: true }, args),
1104
1104
  // POST /store/modules/{key}/acquired — rank: any-builder — POST /store/modules/:key/acquired
1105
1105
  postStoreModulesKeyAcquired: (args) => request("POST", "/store/modules/{key}/acquired", { hasBody: true }, args),
1106
+ // POST /store/modules/{key}/delist — rank: metic+archon — POST /store/modules/:key/delist
1107
+ postStoreModulesKeyDelist: (args) => request("POST", "/store/modules/{key}/delist", { hasBody: true }, args),
1106
1108
  // GET /store/modules/{key}/entitlement — rank: any-builder — GET /store/modules/:key/entitlement
1107
1109
  getStoreModulesKeyEntitlement: (args) => request("GET", "/store/modules/{key}/entitlement", { hasBody: false }, args),
1108
1110
  // POST /store/modules/{key}/versions — rank: metic+archon — POST /store/modules/:key/versions
@@ -1102,6 +1102,8 @@ function createClient(opts = {}) {
1102
1102
  postStoreModulesKeyAcquire: (args) => request("POST", "/store/modules/{key}/acquire", { hasBody: true }, args),
1103
1103
  // POST /store/modules/{key}/acquired — rank: any-builder — POST /store/modules/:key/acquired
1104
1104
  postStoreModulesKeyAcquired: (args) => request("POST", "/store/modules/{key}/acquired", { hasBody: true }, args),
1105
+ // POST /store/modules/{key}/delist — rank: metic+archon — POST /store/modules/:key/delist
1106
+ postStoreModulesKeyDelist: (args) => request("POST", "/store/modules/{key}/delist", { hasBody: true }, args),
1105
1107
  // GET /store/modules/{key}/entitlement — rank: any-builder — GET /store/modules/:key/entitlement
1106
1108
  getStoreModulesKeyEntitlement: (args) => request("GET", "/store/modules/{key}/entitlement", { hasBody: false }, args),
1107
1109
  // POST /store/modules/{key}/versions — rank: metic+archon — POST /store/modules/:key/versions
@@ -482,6 +482,8 @@ export interface PostStoreModulesKeyAcquireRequest { version?: string }
482
482
  export interface PostStoreModulesKeyAcquireResponse { ok: boolean; module_key: unknown; version: unknown; core_version: unknown; tarball_sha256: unknown; tree_sha256: unknown; tarball_bytes: unknown; channel: unknown; entitlement: unknown }
483
483
  export interface PostStoreModulesKeyAcquiredRequest { version: string }
484
484
  export interface PostStoreModulesKeyAcquiredResponse { ok: boolean; entitlement: unknown }
485
+ export interface PostStoreModulesKeyDelistRequest { reason?: string }
486
+ export interface PostStoreModulesKeyDelistResponse { ok: boolean; module_key: unknown; status: unknown; delisted_at: unknown }
485
487
  export interface PostStoreModulesKeyVersionsResponse { ok: boolean; created_module: unknown; version: unknown }
486
488
  export interface PostStoreModulesKeyVersionsVersionReassessRequest { reason?: string }
487
489
  export interface PostStoreModulesKeyVersionsVersionReassessResponse { ok: boolean; queued: boolean; module_key: unknown; version: unknown; version_id: unknown }
@@ -1570,6 +1572,8 @@ export interface BongosClient {
1570
1572
  postStoreModulesKeyAcquire(args?: RequestArgs & { body?: PostStoreModulesKeyAcquireRequest }): Promise<PostStoreModulesKeyAcquireResponse>;
1571
1573
  /** POST /store/modules/{key}/acquired — rank: any-builder */
1572
1574
  postStoreModulesKeyAcquired(args: RequestArgs & { body: PostStoreModulesKeyAcquiredRequest }): Promise<PostStoreModulesKeyAcquiredResponse>;
1575
+ /** POST /store/modules/{key}/delist — rank: metic+archon */
1576
+ postStoreModulesKeyDelist(args?: RequestArgs & { body?: PostStoreModulesKeyDelistRequest }): Promise<PostStoreModulesKeyDelistResponse>;
1573
1577
  /** GET /store/modules/{key}/entitlement — rank: any-builder */
1574
1578
  getStoreModulesKeyEntitlement(args?: RequestArgs): Promise<ApiResponse>;
1575
1579
  /** POST /store/modules/{key}/versions — rank: metic+archon */
@@ -1099,6 +1099,8 @@ export function createClient(opts = {}) {
1099
1099
  postStoreModulesKeyAcquire: (args) => request("POST", "/store/modules/{key}/acquire", { hasBody: true }, args),
1100
1100
  // POST /store/modules/{key}/acquired — rank: any-builder — POST /store/modules/:key/acquired
1101
1101
  postStoreModulesKeyAcquired: (args) => request("POST", "/store/modules/{key}/acquired", { hasBody: true }, args),
1102
+ // POST /store/modules/{key}/delist — rank: metic+archon — POST /store/modules/:key/delist
1103
+ postStoreModulesKeyDelist: (args) => request("POST", "/store/modules/{key}/delist", { hasBody: true }, args),
1102
1104
  // GET /store/modules/{key}/entitlement — rank: any-builder — GET /store/modules/:key/entitlement
1103
1105
  getStoreModulesKeyEntitlement: (args) => request("GET", "/store/modules/{key}/entitlement", { hasBody: false }, args),
1104
1106
  // POST /store/modules/{key}/versions — rank: metic+archon — POST /store/modules/:key/versions
@@ -87,6 +87,13 @@ store entry is otherwise deleted:
87
87
  The artifact an instance acquired is already on that instance, so this costs the store nothing
88
88
  to honour: it simply never deletes or disables what it has handed over.
89
89
 
90
+ *Implemented by task 1003797 (2026-10-01):* `POST /store/modules/:key/delist` with a required
91
+ reason, behind the `module.delist` atom (Metic floor). It flips `store_modules.status` and
92
+ nothing else — holders keep their entitlement and their working copy, the module loader never
93
+ asks the store, and a delist writes no score (ADR 0359). The holder is told by `bongos upgrade`,
94
+ `bongos module list` (DELISTED) and the hall's Modules tab ("delisted · no more updates").
95
+ A delist is one-way for now; relisting would be a separate task.
96
+
90
97
  The refund path in task 1003789 is the one place an entitlement can end, and it is a separate,
91
98
  buyer-initiated act — a delist is not a refund.
92
99
 
@@ -20554,6 +20554,72 @@
20554
20554
  ]
20555
20555
  }
20556
20556
  },
20557
+ "/store/modules/{key}/delist": {
20558
+ "post": {
20559
+ "operationId": "post_store_modules_key_delist",
20560
+ "tags": [
20561
+ "store"
20562
+ ],
20563
+ "summary": "POST /store/modules/:key/delist",
20564
+ "description": "POST /api/bongos/store/modules/:key/delist — a Metic+ person takes a module out of the store (task 1003797, ADR 0338 D2). It leaves the catalog, cannot be newly acquired, takes no new versions and serves no further downloads: every store read already refuses a delisted key, so this flips the one status. What it never does: revoke an entitlement, reach into an instance that already holds the module (that copy keeps working; `bongos upgrade` and the hall tell the holder no more versions will come), or touch a score (ADR 0359). A reason is required; the audit middleware records it with who asked. There is no relist route yet.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `module.delist` (all required).",
20565
+ "x-rank": "metic+archon",
20566
+ "x-source": "src/bongos/routes/modules.js",
20567
+ "x-permissions": [
20568
+ "module.delist"
20569
+ ],
20570
+ "parameters": [
20571
+ {
20572
+ "name": "key",
20573
+ "in": "path",
20574
+ "required": true,
20575
+ "schema": {
20576
+ "type": "string"
20577
+ },
20578
+ "description": "Path parameter `key`."
20579
+ }
20580
+ ],
20581
+ "requestBody": {
20582
+ "required": false,
20583
+ "content": {
20584
+ "application/json": {
20585
+ "schema": {
20586
+ "$ref": "#/components/schemas/PostStoreModulesKeyDelistRequest"
20587
+ }
20588
+ }
20589
+ },
20590
+ "x-validated": true
20591
+ },
20592
+ "responses": {
20593
+ "200": {
20594
+ "description": "Success.",
20595
+ "content": {
20596
+ "application/json": {
20597
+ "schema": {
20598
+ "$ref": "#/components/schemas/PostStoreModulesKeyDelistResponse"
20599
+ }
20600
+ }
20601
+ }
20602
+ },
20603
+ "400": {
20604
+ "$ref": "#/components/responses/ValidationFailed"
20605
+ },
20606
+ "401": {
20607
+ "$ref": "#/components/responses/Unauthorized"
20608
+ },
20609
+ "403": {
20610
+ "$ref": "#/components/responses/Forbidden"
20611
+ },
20612
+ "404": {
20613
+ "$ref": "#/components/responses/NotFound"
20614
+ }
20615
+ },
20616
+ "security": [
20617
+ {
20618
+ "builderSession": []
20619
+ }
20620
+ ]
20621
+ }
20622
+ },
20557
20623
  "/store/modules/{key}/entitlement": {
20558
20624
  "get": {
20559
20625
  "operationId": "get_store_modules_key_entitlement",
@@ -31003,6 +31069,33 @@
31003
31069
  "entitlement"
31004
31070
  ]
31005
31071
  },
31072
+ "PostStoreModulesKeyDelistRequest": {
31073
+ "type": "object",
31074
+ "properties": {
31075
+ "reason": {
31076
+ "type": "string",
31077
+ "maxLength": 2000
31078
+ }
31079
+ },
31080
+ "additionalProperties": false
31081
+ },
31082
+ "PostStoreModulesKeyDelistResponse": {
31083
+ "type": "object",
31084
+ "properties": {
31085
+ "ok": {
31086
+ "type": "boolean"
31087
+ },
31088
+ "module_key": {},
31089
+ "status": {},
31090
+ "delisted_at": {}
31091
+ },
31092
+ "required": [
31093
+ "ok",
31094
+ "module_key",
31095
+ "status",
31096
+ "delisted_at"
31097
+ ]
31098
+ },
31006
31099
  "PostStoreModulesKeyVersionsResponse": {
31007
31100
  "type": "object",
31008
31101
  "properties": {
@@ -32077,9 +32170,9 @@
32077
32170
  "description": "A required dependency/feature is not configured or is temporarily down."
32078
32171
  }
32079
32172
  },
32080
- "x-endpoint-count": 501,
32081
- "x-schema-count": 534,
32173
+ "x-endpoint-count": 502,
32174
+ "x-schema-count": 536,
32082
32175
  "x-undocumented-bodies": 12,
32083
- "x-response-schemas": 355,
32176
+ "x-response-schemas": 356,
32084
32177
  "x-generated-by": "scripts/gds/gen-api-docs.js"
32085
32178
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Bongos API reference
4
4
 
5
- > **Generated from the live route files** — the route file is authoritative. 501 endpoints across 92 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 502 endpoints across 92 route files.
6
6
  > Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
7
7
 
8
8
  Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
@@ -781,13 +781,14 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
781
781
  | GET | `/api/bongos/sso/pubkey` | `public` | — | GET /sso/pubkey — the hub's Ed25519 assertion-verification key (public). |
782
782
  | POST | `/api/bongos/sso/token` | `public` | `client_id`, `client_secret`, `code`, `redirect_uri` | POST /sso/token — server-to-server code redemption. |
783
783
 
784
- ## `store` (9)
784
+ ## `store` (10)
785
785
 
786
786
  | Method | Path | Rank | Body | Description |
787
787
  |---|---|---|---|---|
788
788
  | GET | `/api/bongos/store/entitlements` | `any-builder` | — | GET /api/bongos/store/entitlements and /store/modules/:key/entitlement — the read side of the entitlement record (task 1003813, ADR 0338 … |
789
789
  | POST | `/api/bongos/store/modules/:key/acquire` | `any-builder` | `version` | ---- install: acquire → download → record (task 1003785, ADR 0338 D1) ---- The server end of `bongos module install`. |
790
790
  | POST | `/api/bongos/store/modules/:key/acquired` | `any-builder` | `version` | |
791
+ | POST | `/api/bongos/store/modules/:key/delist` | `metic+archon` | `reason` | POST /api/bongos/store/modules/:key/delist — a Metic+ person takes a module out of the store (task 1003797, ADR 0338 D2). |
791
792
  | GET | `/api/bongos/store/modules/:key/entitlement` | `any-builder` | — | |
792
793
  | POST | `/api/bongos/store/modules/:key/versions` | `metic+archon` | _undocumented_ | POST /api/bongos/store/modules/:key/versions — publish one module version to the store (task 1004271, ADR 0338 D1). |
793
794
  | GET | `/api/bongos/store/modules/:key/versions/:version/howto` | `any-builder` | — | GET /api/bongos/store/modules/:key/versions/:version/howto — the how-to a version shipped with (task 1004366, ADR 0347 D1/D3), read from … |
@@ -293,6 +293,7 @@ Bongos views: `claimable_tasks` (rebuilt in 006 to use SELECT t.*; rebuilt again
293
293
  - Criterion rollup + task↔criterion links ([ADR 0025](adr/0025-structured-criterion-task-link.md), [#435](https://example.com/builders#/task/435)/[#438](https://example.com/builders#/task/438)): `GET /versions/:id/progress` rolls up each done-when criterion → its gating tasks (via `task_criteria`) → live status counts + the not-yet-shipped `remaining[]` + `unattributed_tasks` (the read behind the `/status` skill, in `src/bongos/done-when.js criterionProgress`). The link CRUD mirrors the dependency endpoints: `GET /tasks/:id/criteria`, `POST /tasks/:id/criteria` (**metic+** — [ADR 0090](adr/0090-metic-task-authoring.md)) and `DELETE /tasks/:id/criteria/:criterionId` (**metic+**). A criterion ref is a numeric `done_when_criteria.id`, a positional `"Cn"` token, or a `criterion_id` slug, resolved against the task's version (`POST /tasks` links at create time so `/status` counts the task with no backfill).
294
294
  - Module store publish (ADR 0338 D1, task 1004271): `POST /store/modules/:key/versions` (`requireBuilder` + `requirePermission('module.submit')`, Metic floor). The body is the raw gzip tarball `bongos module publish` builds (own `express.raw` parser, 5 MB cap; 16 MB / 2000 files unpacked). `scripts/gds/module-artifact.js` re-verifies every hash and the publish gate, then `src/bongos/module-store.js` keeps the file under `var/module-store/` and inserts the `store_module_versions` row in one transaction. The first publish makes the caller the author; later versions are author-only, newer than the last and never overwritten; a delisted key takes none.
295
295
  - Module store install (ADR 0338 D1, task 1003785), all `requireBuilder` and own-scoped (the holder is the caller): `POST /store/modules/:key/acquire` (`{version?}`; grants a free entitlement — no price row, or a zero price, is free — or `402 payment_required` for a priced module; refuses a delisted one), `GET /store/modules/:key/versions/:version/tarball` (served only to a live entitlement holder; `X-Tarball-Sha256`), `POST /store/modules/:key/acquired` (`{version}` → `recordAcquired`). Read side in `src/bongos/module-store.js` (`resolveAcquirable`, `isFreePrice`, `versionArtifactFile`). No channel check yet (tasks 1003815, 1003805). `bongos module update` (task 1003786) reuses the same three calls; the acquire route reads price only for a caller with no entitlement, so a holder is never charged again.
296
+ - Module store delist (ADR 0338 D2, task 1003797): `POST /store/modules/:key/delist` (`requireBuilder` + `requirePermission('module.delist')`, Metic floor, granted by `government_022`; strict body `{reason}`, reason required, recorded by the audit middleware). Sets `store_modules.status='delisted'` and `delisted_at` — one-way, no relist route. Every store read already refuses a delisted key (acquire, tarball, acquired, publish), while `GET /store/modules/latest` still answers with the status so `bongos upgrade` warns the holder. `GET /modules` sets `store_delisted` on an instance-tree module the store delisted (hall pill "delisted · no more updates"), and `bongos module list` marks it DELISTED (fail-soft store check, instance modules only). Never revokes an entitlement, never reaches an installed copy, never writes a score (ADR 0359). 404 unknown key, 409 `already_delisted`.
296
297
  - Server-mediated branch publish (ADR 0055 / [#1025](https://example.com/builders#/task/1025) — lets a checkout with no GitHub push credential ship). Owner-gated like ship: `POST /tasks/:id/publish-branch` (`requireBuilder` + `gateTaskOwnership`; own 32 MB json parser for the base64 thin-bundle body, 20 MB decoded cap; the server pushes the branch + opens the PR + auto-merges with a server-side push credential — a **GitHub App** installation token (short-lived, repo-scoped; preferred, [ADR 0055](adr/0055-server-mediated-branch-publish.md) update / task 1028) or the `GITHUB_PUSH_TOKEN` PAT fallback; `503 push_unconfigured` when neither is set; `400 tip_mismatch` if the bundle tip ≠ the claimed `head_sha`) and `GET /tasks/:id/publish-status?branch=…` (polls PR + deploy-prod state derived live from GitHub). `branch` is optional: without it the server finds the task's own PR by its `task <id>: …` title, and the answer names the `branch` it used and its `branch_source` (`query` / `task_pr`, or `null` with a `branch_hint` when there is no such PR) — never a `400` (task 1003764). When the PR is still open it also carries `merge_driver`, whose `reason` says why it has not merged; on a red PR `failing_tests` names the failing unit tests (read from the `unit-report` commit status the `unit` workflow posts) and `checks_unreadable: true` says the check list is blind because the App lacks `Checks: read` — so an empty `checks[]` is never read as "nothing failed" (task 1003988, ADR 0301). Because the server's credential is the PR's AUTHOR, publish also **assigns the PR to the task's claim holder** and names them in the body (`modules/lifecycle/pr-assign.js`, task 1003991) — best-effort: the 201 carries `pr_assignee` (the login, or `null` when GitHub would not assign it) and a failed assignment never fails the publish. `ship.js` uses these in `ci` mode only when `pushVia()` resolves to server (no authenticated `gh` on the machine, or `<PREFIX>_PUSH_VIA_SERVER=1`); a machine with `gh` keeps the local push path unchanged. Implementation in `src/bongos/github-push.js`.
297
298
  - Archon monitoring reads backing the `/watch` page (ADR 0036): `GET /builders/roster`, `GET /grades/by-builder[?days=N]` (**archon-only**, [#726](https://example.com/builders#/task/726) — per-builder grade breakdown for the MARKS section; the project-wide aggregate stays public at `/public/grades`), `GET /audit-log`, `GET /override-requests`, `GET /access-requests`, `GET /security/reports`. Personal-prefs writes backing `/settings`: `GET/PATCH /me/skill-prefs`, `PATCH /me/disciplines`.
298
299
  - Per-builder "needs" + own Gemini key ([ADR 0073](adr/0073-builder-needs-signal-and-byok-gemini-key.md), [#1013](https://example.com/builders#/task/1013)): `GET /me` now also carries `needs` ({items, action_needed_count} — the consistent "the system needs an input from you" signal; `modules/builder-settings/builder-needs.js` is the SSOT — carved out in BV1.R80, resolved by `GET /me` via the `builder-settings` kernel port — rendered by the hall Standing card + the CLI `printNeedsNudge`). The own-key (pragmatic BYOK) endpoints, all own-scoped: `GET /me/art-key/own` (masked meta — last4 only), `PUT /me/art-key/own` (validate-on-save via a Google list-models call → encrypt with `src/bongos/secret-box.js` → store; `503 storage_not_configured` until `BUILDER_SECRET_KEY` is set, `422 invalid_key` on a bad key), `DELETE /me/art-key/own`. The existing `GET /me/art-key` (shared-key delivery) is extended to also deliver the decrypted own key, which `scripts/gds/fetch-art-key.js` syncs into the local `gemini_api_key` slot (own key wins in the `gen_api.py` cascade).
@@ -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
- **2422 strings** across 3 surfaces · 2105 distinct pieces of copy · 2422 certain, 0 heuristic · 220 shown in more than one place.
7
+ **2424 strings** across 3 surfaces · 2107 distinct pieces of copy · 2424 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` | 130 | 1773 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 130 | 1775 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
15
  | `landing` | `modules/public-landing/public` | 6 | 549 |
16
16
 
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
78
78
  | `2287c62afcdd` | 3x | The street | modules/hall-ui/public/street.html:54, modules/hall-ui/public/street.html:54, modules/hall-ui/public/street.html:92 |
79
79
  | … | | _180 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1773 strings
81
+ ## `builders-hall` — 1775 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -342,7 +342,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
342
342
  | `90691bceaf68` | certain | Could not load | `modules/hall-ui/public/project-settings.js:242` |
343
343
  | `90691bceaf68` | certain | Could not load | `modules/hall-ui/public/task.js:1022` |
344
344
  | `589a4cfc5442` | certain | Could not load idea {…}. | `modules/hall-ui/public/ideas.js:1018` |
345
- | `192c893fc64e` | certain | Could not load modules. | `modules/hall-ui/public/modules.js:328` |
345
+ | `192c893fc64e` | certain | Could not load modules. | `modules/hall-ui/public/modules.js:335` |
346
346
  | `9912c3835136` | certain | Could not load requests — reload to try again. | `modules/hall-ui/public/collab.js:845` |
347
347
  | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:504` |
348
348
  | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:542` |
@@ -362,7 +362,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
362
362
  | `64f9d51f0fa2` | certain | Could not load your settings. | `modules/hall-ui/public/settings.js:1199` |
363
363
  | `de244c45d916` | certain | Could not load {…} | `modules/hall-ui/public/task.js:1015` |
364
364
  | `2366356926b4` | certain | Could not mark the primer just now. Try again. | `modules/hall-ui/public/primer.js:259` |
365
- | `753987b5da13` | certain | Could not reach the submit endpoint. | `modules/hall-ui/public/modules.js:307` |
365
+ | `753987b5da13` | certain | Could not reach the submit endpoint. | `modules/hall-ui/public/modules.js:314` |
366
366
  | `6f500726f0ac` | certain | Could not read the report: {…} | `modules/hall-ui/public/watch.js:669` |
367
367
  | `21c2f33168a3` | certain | Could not read this project's deploy state: {…} | `modules/hall-ui/public/deploy.js:619` |
368
368
  | `21a782f1af26` | certain | Could not read what this would bring in: {…}. The check below still applies. | `modules/hall-ui/public/deploy.js:537` |
@@ -816,7 +816,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
816
816
  | `9ac63d97239a` | certain | Nothing newer is published that this box can take. There is nothing to deploy. | `modules/hall-ui/public/deploy.js:599` |
817
817
  | `43626cff7071` | certain | Nothing of that kind in your sky. | `modules/hall-ui/public/sky-panel.js:123` |
818
818
  | `ad9a17a8a5eb` | certain | Nothing shipped yet. | `modules/hall-ui/public/profile.js:297` |
819
- | `f326632f2013` | certain | Nothing to submit — every module here ships with the core. | `modules/hall-ui/public/modules.js:268` |
819
+ | `f326632f2013` | certain | Nothing to submit — every module here ships with the core. | `modules/hall-ui/public/modules.js:275` |
820
820
  | `27c0d872db2d` | certain | Nothing you have typed above is lost by opening this. | `modules/hall-ui/public/ideas.html:155` |
821
821
  | `26a07b64f49d` | certain | Now running core {…} | `modules/hall-ui/public/deploy.js:395` |
822
822
  | `21cb60a8a96a` | certain | Now running core {…} — but GitHub was not updated. | `modules/hall-ui/public/deploy.js:385` |
@@ -1127,6 +1127,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1127
1127
  | `93fa2e97dd35` | certain | System default for this skill | `modules/hall-ui/public/settings.js:72` |
1128
1128
  | `4894b1d9b0de` | certain | System oversight: people, operations and security. | `modules/hall-ui/public/watch.js:1364` |
1129
1129
  | `aa8da34fe237` | certain | Take the next page, or pick one from the studio. | `modules/hall-ui/public/tweak-editor.js:564` |
1130
+ | `8b3cdb88b0f4` | certain | Taken out of the store. Your copy keeps working, but it will get no more updates. | `modules/hall-ui/public/modules.js:113` |
1130
1131
  | `e604fc3ace79` | certain | Task # | `modules/hall-ui/public/blockers.js:139` |
1131
1132
  | `a0f384b022fd` | certain | Task dependencies | `modules/hall-ui/public/goals.html:132` |
1132
1133
  | `91576eb7c880` | certain | Task dependency forest — scrolls sideways inside this box | `modules/hall-ui/public/goal-forest-render.js:146` |
@@ -1513,6 +1514,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1513
1514
  | `0e2bef756977` | certain | days ({…}–{…}) | `modules/hall-ui/public/project-settings.js:113` |
1514
1515
  | `4adbb8da9999` | certain | default ({…}) | `modules/hall-ui/public/settings-render.js:64` |
1515
1516
  | `4a287afb0892` | certain | default for your rank | `modules/hall-ui/public/settings.js:420` |
1517
+ | `953f99598871` | certain | delisted · no more updates | `modules/hall-ui/public/modules.js:113` |
1516
1518
  | `563e03d200c6` | certain | designed, task-tracked, not yet built | `modules/hall-ui/public/diagrams.html:43` |
1517
1519
  | `a3fd52d9513b` | certain | document{…} you added · learned | `modules/hall-ui/public/settings-specialities.js:322` |
1518
1520
  | `fcec9cad1c69` | certain | download .docx | `modules/hall-ui/public/tweak-editor.html:65` |
@@ -1654,7 +1656,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1654
1656
  | `c8c2551006dc` | certain | skip the tour | `modules/hall-ui/public/goal-map.html:121` |
1655
1657
  | `c8c2551006dc` | certain | skip the tour | `modules/hall-ui/public/thinking.html:122` |
1656
1658
  | `1e737a57eb20` | certain | start governing | `modules/hall-ui/public/city.html:79` |
1657
- | `0215b2cdca8c` | certain | submit for review | `modules/hall-ui/public/modules.js:142` |
1659
+ | `0215b2cdca8c` | certain | submit for review | `modules/hall-ui/public/modules.js:149` |
1658
1660
  | `43e6f1592ae3` | certain | submit it in the editor | `modules/hall-ui/public/studio.js:797` |
1659
1661
  | `9ec19e32f86f` | certain | submit page | `modules/hall-ui/public/tweak-editor.html:68` |
1660
1662
  | `da30b952a60b` | certain | system / unattributed | `modules/hall-ui/public/goals-page.js:269` |
@@ -1750,7 +1752,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1750
1752
  | `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:289` |
1751
1753
  | `c5623d60015d` | certain | {…} Your standing is {…}. | `modules/hall-ui/public/hall-render.js:845` |
1752
1754
  | `a91e1e702d4d` | certain | {…} achieved, {…} in progress, {…} not started of {…} goals | `modules/hall-ui/public/roadmap.js:73` |
1753
- | `a65d371b5cb3` | certain | {…} and above can enable or disable a module | `modules/hall-ui/public/modules.js:140` |
1755
+ | `a65d371b5cb3` | certain | {…} and above can enable or disable a module | `modules/hall-ui/public/modules.js:147` |
1754
1756
  | `98b1c674fc37` | certain | {…} and up | `modules/hall-ui/public/sessions.js:289` |
1755
1757
  | `111b71a9acaf` | certain | {…} and up. | `modules/hall-ui/public/sessions.js:287` |
1756
1758
  | `56b00d773232` | certain | {…} and {…} | `modules/hall-ui/public/profile-nudge.js:77` |
@@ -1789,7 +1791,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1789
1791
  | `3ad8f32dd43b` | certain | {…} you have sent | `modules/hall-ui/public/profile-connections.js:146` |
1790
1792
  | `2f75f69cdb2f` | certain | {…} {…} changed | `modules/hall-ui/public/profile-crafts.js:218` |
1791
1793
  | `8186b562553a` | certain | {…} {…} waiting | `modules/hall-ui/public/work.js:420` |
1792
- | `a9216af9b05e` | certain | {…} {…} — how-to | `modules/hall-ui/public/modules.js:383` |
1794
+ | `a9216af9b05e` | certain | {…} {…} — how-to | `modules/hall-ui/public/modules.js:390` |
1793
1795
  | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:503` |
1794
1796
  | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/work.js:265` |
1795
1797
  | `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:873` |
@@ -1797,7 +1799,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1797
1799
  | `d73256fbc395` | certain | {…} · who votes, and how it {…} | `modules/hall-ui/public/board-room.js:458` |
1798
1800
  | `cab2a4296aec` | certain | {…} · {…} · {…}{…} | `modules/hall-ui/public/goal-inbox.js:458` |
1799
1801
  | `1ac723849449` | certain | {…} · {…}{…} | `modules/hall-ui/public/sky-interaction.js:33` |
1800
- | `ddd2bfc1fb60` | certain | {…} — how to use it | `modules/hall-ui/public/modules.js:385` |
1802
+ | `ddd2bfc1fb60` | certain | {…} — how to use it | `modules/hall-ui/public/modules.js:392` |
1801
1803
  | `085f93f3f775` | certain | {…} — see all standings | `modules/hall-ui/public/hall-render.js:80` |
1802
1804
  | `2a2728a4ec4f` | certain | {…}% of tasks complete | `modules/hall-ui/public/roadmap.js:63` |
1803
1805
  | `15e545eb3ce2` | certain | {…}, no such task | `modules/hall-ui/public/task.js:1002` |
@@ -1812,7 +1814,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1812
1814
  | `97e27ab169ae` | certain | {…}{…} session{…} across {…} builder{…}. | `modules/hall-ui/public/sessions.js:443` |
1813
1815
  | `3d74668f69e5` | certain | {…}{…} · {…} | `modules/hall-ui/public/task.js:639` |
1814
1816
  | `7f79bedecf60` | certain | {…}{…} — open it to see what went | `modules/hall-ui/public/goal-inbox.js:374` |
1815
- | `1026fd5f68b7` | certain | · version | `modules/hall-ui/public/modules.js:388` |
1817
+ | `1026fd5f68b7` | certain | · version | `modules/hall-ui/public/modules.js:395` |
1816
1818
  | `4a5ff4f662df` | certain | — ${…} of ${…} this month ({…}%). {…} | `modules/hall-ui/public/hall-render.js:520` |
1817
1819
  | `a6ae9cbdee30` | certain | — all builders — | `modules/hall-ui/public/builders.js:711` |
1818
1820
  | `729d4ce22b99` | certain | — any — | `modules/hall-ui/public/hall-widgets.js:163` |