@bongos/core 1.23.4 → 1.23.6

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.
Files changed (41) hide show
  1. package/.bongos-core.json +67 -42
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +4 -0
  4. package/clients/bongos-client/index.cjs +4 -0
  5. package/clients/bongos-client/index.d.ts +9 -1
  6. package/clients/bongos-client/index.mjs +4 -0
  7. package/docs/adr/0356-a-recruit-invite-expires-30-days-after-it-is-sent-read-time.md +2 -1
  8. package/docs/api/openapi.json +204 -7
  9. package/docs/api-reference.md +4 -2
  10. package/docs/copy-inventory.md +26 -24
  11. package/docs/copy-registry.json +43 -25
  12. package/docs/module-api-changelog.md +4 -0
  13. package/docs/modules-contract.md +2 -0
  14. package/docs/page-readings.json +8 -8
  15. package/migrations/core_281_module_version_withdraw_note.sql +25 -0
  16. package/modules/government/catalog.js +1 -1
  17. package/modules/hall-ui/public/modules.js +10 -1
  18. package/modules/onboarding/routes/access-requests.js +10 -9
  19. package/package-lock.json +2 -2
  20. package/package.json +1 -1
  21. package/release-notes.json +16 -0
  22. package/scripts/bongos/login.js +13 -14
  23. package/scripts/bongos/module-store-cli.js +182 -0
  24. package/scripts/bongos/module.js +60 -134
  25. package/scripts/gds/module-store-cli.js +6 -0
  26. package/src/bongos/auth-admission.js +3 -3
  27. package/src/bongos/middleware/rate-limit.js +1 -1
  28. package/src/bongos/module-listing.js +12 -2
  29. package/src/bongos/module-store.js +90 -1
  30. package/src/bongos/route-rank-check.js +6 -0
  31. package/src/bongos/routes/auth.js +7 -11
  32. package/src/bongos/routes/modules.js +76 -3
  33. package/src/module-api.js +1 -1
  34. package/tests/account_existence_rate_limit.mjs +7 -3
  35. package/tests/application_lifecycle.mjs +4 -3
  36. package/tests/bongos_login.mjs +15 -4
  37. package/tests/hall_catalog_world.mjs +1 -1
  38. package/tests/invite_expiry_db.mjs +1 -1
  39. package/tests/module_store_cli.mjs +1 -1
  40. package/tests/module_store_price.mjs +207 -0
  41. package/tests/module_store_withdraw.mjs +201 -0
@@ -505,7 +505,7 @@
505
505
  "access-requests"
506
506
  ],
507
507
  "summary": "GET /access-requests/status",
508
- "description": "GET /access-requests/status?github_login=X — PUBLIC. The `bongos login` CLI polls this after filing a request: the device flow's not_approved is TERMINAL (the device_code is spent), so the CLI can't re-poll the flow — it polls this instead, then restarts sign-in once admitted. Exposes nothing the public POST above doesn't already reveal through its 409s (already_member / already_approved). status ∈ member | invited | expired | pending | dismissed | none; admitted = member||invited. `expired` is an invite past its 30 days (task 1002969): the door is shut, and the CLI stops waiting rather than polling a door that will not open. rank: public — a would-be builder is by definition outside the system. Declared BEFORE `GET /access-requests` so the literal `/status` path is matched as its own route (not swallowed as a query on the list route). RATE-LIMITED (task 1003339 / ADR 0209). Public + unthrottled, this was a login→membership oracle an attacker could script at line rate to learn who builds here. accountExistenceReadRateLimit is the doorway's SHARED 120/60s per-IP budget: core's GET /auth/web/admission-status (the boolean twin of this answer) mounts the very same instance, so the two cannot be alternated for double the rate. The limiter runs before the queries, so a refused probe costs no DB work. Whether the ANSWER should also collapse — so a caller who is not the subject cannot tell pending/dismissed/none apart — is the owner's call and is filed as a blocker, not decided here.\n\n**Rank:** `public` — No authentication — any caller.",
508
+ "description": "GET /access-requests/status?github_login=X — PUBLIC. The `bongos login` CLI polls this after filing a request: the device flow's not_approved is TERMINAL (the device_code is spent), so the CLI can't re-poll the flow — it polls this instead, then restarts sign-in once admitted. Exposes nothing the public POST above doesn't already reveal through its 409s (already_member / already_approved). status ∈ member | invited | not_admitted; admitted = member||invited (ADR 0217 D4, task 1003359). `not_admitted` covers pending, declined, a lapsed invite and no request at all, so a caller who is not the subject cannot learn that someone applied here or was turned down. It does NOT close the membership oracle — `admitted` still answers that, and the limiter below is what bounds enumeration. A lapsed invite answering `not_admitted` rather than `expired` amends ADR 0356 D4. rank: public — a would-be builder is by definition outside the system. Declared BEFORE `GET /access-requests` so the literal `/status` path is matched as its own route (not swallowed as a query on the list route). RATE-LIMITED (task 1003339 / ADR 0209). Public + unthrottled, this was a login→membership oracle an attacker could script at line rate to learn who builds here. accountExistenceReadRateLimit is the doorway's SHARED 120/60s per-IP budget: core's GET /auth/web/admission-status (the boolean twin of this answer) mounts the very same instance, so the two cannot be alternated for double the rate. The limiter runs before the queries, so a refused probe costs no DB work.\n\n**Rank:** `public` — No authentication — any caller.",
509
509
  "x-rank": "public",
510
510
  "x-source": "modules/onboarding/routes/access-requests.js",
511
511
  "responses": {
@@ -1656,7 +1656,7 @@
1656
1656
  "auth"
1657
1657
  ],
1658
1658
  "summary": "GET /auth/web/admission-status",
1659
- "description": "GET /auth/web/admission-status?login=X — the probe renderAccessPendingPage polls (task 1002097). Answers ONE question: would this login be admitted right now? It mirrors the real gate via auth.webAdmissionStatus so the page can never invite someone in the gate would refuse. rank: public — it must be reachable by a visitor with no session (that is the entire situation it exists for). It grants nothing: admission still runs through the normal sign-in, and this only reads state. WHAT IT LEAKS, stated plainly (task 1002430 — an earlier version of this comment claimed the opposite and was wrong). Returning only a boolean does NOT make it non-enumerable: with open enrollment off, and for any login that is not the configured firstAdmin, `admitted:true` means that login is a member or has been invited. That reveals account existence to an unauthenticated caller. IT IS NOW THROTTLED (task 1003339 / ADR 0209). It used to say \"NOT throttled\" here, and that was true: rateLimitMiddleware returns early for non-write methods, so GETs bypassed it entirely and the page's 3s poll bounded the honest client, not an attacker. accountExistenceReadRateLimit below is the ceiling — 120 reads/60s per IP, and the SAME instance is mounted on the onboarding module's GET /access-requests/status, which is this route's strictly richer twin (member|invited|pending|dismissed|none plus its own `admitted`). One budget across both, because they are one oracle: hardening either alone would accomplish nothing, and giving each its own budget would just let an enumerator alternate for double the rate. WHAT IS STILL OPEN and is deliberately NOT decided here: whether the answer itself should collapse, so a caller who is not the subject cannot tell pending/dismissed/none apart from a bare \"not admitted\". That changes what a real invited user sees during onboarding, so it is the owner's call — filed as a blocker against task 1003339, not settled by a comment in this file. That endpoint is also why this one exists: it models neither the firstAdmin bypass nor open enrollment, so it reports the OWNER as 'none' forever — the exact case this page has to resolve.\n\n**Rank:** `public` — No authentication — any caller.",
1659
+ "description": "GET /auth/web/admission-status?login=X — the probe renderAccessPendingPage polls (task 1002097). Answers ONE question: would this login be admitted right now? It mirrors the real gate via auth.webAdmissionStatus so the page can never invite someone in the gate would refuse. rank: public — it must be reachable by a visitor with no session (that is the entire situation it exists for). It grants nothing: admission still runs through the normal sign-in, and this only reads state. WHAT IT LEAKS, stated plainly (task 1002430 — an earlier version of this comment claimed the opposite and was wrong). Returning only a boolean does NOT make it non-enumerable: with open enrollment off, and for any login that is not the configured firstAdmin, `admitted:true` means that login is a member or has been invited. That reveals account existence to an unauthenticated caller. IT IS NOW THROTTLED (task 1003339 / ADR 0209). It used to say \"NOT throttled\" here, and that was true: rateLimitMiddleware returns early for non-write methods, so GETs bypassed it entirely and the page's 3s poll bounded the honest client, not an attacker. accountExistenceReadRateLimit below is the ceiling — 120 reads/60s per IP, and the SAME instance is mounted on the onboarding module's GET /access-requests/status, which is this route's strictly richer twin (member|invited|not_admitted plus its own `admitted`). One budget across both, because they are one oracle: hardening either alone would accomplish nothing, and giving each its own budget would just let an enumerator alternate for double the rate. That twin once told pending/declined/none apart too; it collapsed to `not_admitted` on the owner's call (ADR 0217 D4, task 1003359). That endpoint is also why this one exists: it models neither the firstAdmin bypass nor open enrollment, so it reports the OWNER as 'not_admitted' forever — the exact case this page has to resolve.\n\n**Rank:** `public` — No authentication — any caller.",
1660
1660
  "x-rank": "public",
1661
1661
  "x-source": "src/bongos/routes/auth.js",
1662
1662
  "responses": {
@@ -23827,6 +23827,72 @@
23827
23827
  ]
23828
23828
  }
23829
23829
  },
23830
+ "/store/modules/{key}/price": {
23831
+ "post": {
23832
+ "operationId": "post_store_modules_key_price",
23833
+ "tags": [
23834
+ "store"
23835
+ ],
23836
+ "summary": "POST /store/modules/:key/price",
23837
+ "description": "POST /api/bongos/store/modules/:key/price — the module's author sets its price (task 1004894, criterion wa5-module-economy). Body: { cents?, credits? }, each a whole number of 0 or more, or null for \"not offered in that currency\"; at least one is given, and 0 in either is free. Appends a row to the price history; the newest is what the catalog shows and what acquire charges. A paid price may be set before buying exists (owner, 2026-10-26): the catalog marks it not yet buyable. Price never moves the score (ADR 0343 D6). The audit middleware records who changed it and to what. rank: metic+archon — the same gate as publishing (module.submit), plus the author check inside setPrice: only the person who published the module prices it.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `module.submit` (all required).",
23838
+ "x-rank": "metic+archon",
23839
+ "x-source": "src/bongos/routes/modules.js",
23840
+ "x-permissions": [
23841
+ "module.submit"
23842
+ ],
23843
+ "parameters": [
23844
+ {
23845
+ "name": "key",
23846
+ "in": "path",
23847
+ "required": true,
23848
+ "schema": {
23849
+ "type": "string"
23850
+ },
23851
+ "description": "Path parameter `key`."
23852
+ }
23853
+ ],
23854
+ "requestBody": {
23855
+ "required": false,
23856
+ "content": {
23857
+ "application/json": {
23858
+ "schema": {
23859
+ "$ref": "#/components/schemas/PostStoreModulesKeyPriceRequest"
23860
+ }
23861
+ }
23862
+ },
23863
+ "x-validated": true
23864
+ },
23865
+ "responses": {
23866
+ "200": {
23867
+ "description": "Success.",
23868
+ "content": {
23869
+ "application/json": {
23870
+ "schema": {
23871
+ "$ref": "#/components/schemas/PostStoreModulesKeyPriceResponse"
23872
+ }
23873
+ }
23874
+ }
23875
+ },
23876
+ "400": {
23877
+ "$ref": "#/components/responses/ValidationFailed"
23878
+ },
23879
+ "401": {
23880
+ "$ref": "#/components/responses/Unauthorized"
23881
+ },
23882
+ "403": {
23883
+ "$ref": "#/components/responses/Forbidden"
23884
+ },
23885
+ "404": {
23886
+ "$ref": "#/components/responses/NotFound"
23887
+ }
23888
+ },
23889
+ "security": [
23890
+ {
23891
+ "builderSession": []
23892
+ }
23893
+ ]
23894
+ }
23895
+ },
23830
23896
  "/store/modules/{key}/versions": {
23831
23897
  "post": {
23832
23898
  "operationId": "post_store_modules_key_versions",
@@ -24344,6 +24410,81 @@
24344
24410
  ]
24345
24411
  }
24346
24412
  },
24413
+ "/store/modules/{key}/versions/{version}/withdraw": {
24414
+ "post": {
24415
+ "operationId": "post_store_modules_key_versions_version_withdraw",
24416
+ "tags": [
24417
+ "store"
24418
+ ],
24419
+ "summary": "POST /store/modules/:key/versions/:version/withdraw",
24420
+ "description": "POST /api/bongos/store/modules/:key/versions/:version/withdraw — a Metic+ person takes one version back (task 1004895, criterion wa5-staged-rollout). The store stops handing it out: acquire, install, update and the update check skip it, and the newest version still served is offered instead. A project that already runs it keeps it, and `bongos upgrade` and the hall's Modules tab tell it the version was withdrawn, with the reason. Withdrawing the only served version is allowed; acquire then says nothing can be handed out. A reason is required: it is kept on the channel row (core_281) and shown to holders, and the audit middleware also records it with who asked. The permission is module.delist, the one that already guards delist and release.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `module.delist` (all required).",
24421
+ "x-rank": "metic+archon",
24422
+ "x-source": "src/bongos/routes/modules.js",
24423
+ "x-permissions": [
24424
+ "module.delist"
24425
+ ],
24426
+ "parameters": [
24427
+ {
24428
+ "name": "key",
24429
+ "in": "path",
24430
+ "required": true,
24431
+ "schema": {
24432
+ "type": "string"
24433
+ },
24434
+ "description": "Path parameter `key`."
24435
+ },
24436
+ {
24437
+ "name": "version",
24438
+ "in": "path",
24439
+ "required": true,
24440
+ "schema": {
24441
+ "type": "string"
24442
+ },
24443
+ "description": "Path parameter `version`."
24444
+ }
24445
+ ],
24446
+ "requestBody": {
24447
+ "required": false,
24448
+ "content": {
24449
+ "application/json": {
24450
+ "schema": {
24451
+ "$ref": "#/components/schemas/PostStoreModulesKeyVersionsVersionWithdrawRequest"
24452
+ }
24453
+ }
24454
+ },
24455
+ "x-validated": true
24456
+ },
24457
+ "responses": {
24458
+ "200": {
24459
+ "description": "Success.",
24460
+ "content": {
24461
+ "application/json": {
24462
+ "schema": {
24463
+ "$ref": "#/components/schemas/PostStoreModulesKeyVersionsVersionWithdrawResponse"
24464
+ }
24465
+ }
24466
+ }
24467
+ },
24468
+ "400": {
24469
+ "$ref": "#/components/responses/ValidationFailed"
24470
+ },
24471
+ "401": {
24472
+ "$ref": "#/components/responses/Unauthorized"
24473
+ },
24474
+ "403": {
24475
+ "$ref": "#/components/responses/Forbidden"
24476
+ },
24477
+ "404": {
24478
+ "$ref": "#/components/responses/NotFound"
24479
+ }
24480
+ },
24481
+ "security": [
24482
+ {
24483
+ "builderSession": []
24484
+ }
24485
+ ]
24486
+ }
24487
+ },
24347
24488
  "/store/subcategories": {
24348
24489
  "get": {
24349
24490
  "operationId": "get_store_subcategories",
@@ -29679,10 +29820,12 @@
29679
29820
  "GetStoreModulesLatestResponse": {
29680
29821
  "type": "object",
29681
29822
  "properties": {
29682
- "latest": {}
29823
+ "latest": {},
29824
+ "withdrawn": {}
29683
29825
  },
29684
29826
  "required": [
29685
- "latest"
29827
+ "latest",
29828
+ "withdrawn"
29686
29829
  ]
29687
29830
  },
29688
29831
  "GetStoreUsageReportingResponse": {
@@ -35978,6 +36121,31 @@
35978
36121
  "delisted_at"
35979
36122
  ]
35980
36123
  },
36124
+ "PostStoreModulesKeyPriceRequest": {
36125
+ "type": "object",
36126
+ "properties": {
36127
+ "cents": {},
36128
+ "credits": {}
36129
+ },
36130
+ "additionalProperties": false
36131
+ },
36132
+ "PostStoreModulesKeyPriceResponse": {
36133
+ "type": "object",
36134
+ "properties": {
36135
+ "ok": {
36136
+ "type": "boolean"
36137
+ },
36138
+ "module_key": {},
36139
+ "previous": {},
36140
+ "price": {}
36141
+ },
36142
+ "required": [
36143
+ "ok",
36144
+ "module_key",
36145
+ "previous",
36146
+ "price"
36147
+ ]
36148
+ },
35981
36149
  "PostStoreModulesKeyVersionsResponse": {
35982
36150
  "type": "object",
35983
36151
  "properties": {
@@ -36090,6 +36258,35 @@
36090
36258
  "reason"
36091
36259
  ]
36092
36260
  },
36261
+ "PostStoreModulesKeyVersionsVersionWithdrawRequest": {
36262
+ "type": "object",
36263
+ "properties": {
36264
+ "reason": {
36265
+ "type": "string",
36266
+ "maxLength": 2000
36267
+ }
36268
+ },
36269
+ "additionalProperties": false
36270
+ },
36271
+ "PostStoreModulesKeyVersionsVersionWithdrawResponse": {
36272
+ "type": "object",
36273
+ "properties": {
36274
+ "ok": {
36275
+ "type": "boolean"
36276
+ },
36277
+ "module_key": {},
36278
+ "version": {},
36279
+ "channel": {},
36280
+ "reason": {}
36281
+ },
36282
+ "required": [
36283
+ "ok",
36284
+ "module_key",
36285
+ "version",
36286
+ "channel",
36287
+ "reason"
36288
+ ]
36289
+ },
36093
36290
  "PostStoreSubcategoriesIdApproveRequest": {
36094
36291
  "type": "object",
36095
36292
  "properties": {
@@ -37186,9 +37383,9 @@
37186
37383
  "description": "A required dependency/feature is not configured or is temporarily down."
37187
37384
  }
37188
37385
  },
37189
- "x-endpoint-count": 582,
37190
- "x-schema-count": 624,
37386
+ "x-endpoint-count": 584,
37387
+ "x-schema-count": 628,
37191
37388
  "x-undocumented-bodies": 12,
37192
- "x-response-schemas": 404,
37389
+ "x-response-schemas": 406,
37193
37390
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
37194
37391
  }
@@ -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. 582 endpoints across 98 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 584 endpoints across 98 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`.
@@ -863,7 +863,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
863
863
  | GET | `/api/bongos/sso/pubkey` | `public` | — | GET /sso/pubkey — the hub's Ed25519 assertion-verification key (public). |
864
864
  | POST | `/api/bongos/sso/token` | `public` | `client_id`, `client_secret`, `code`, `redirect_uri` | POST /sso/token — server-to-server code redemption. |
865
865
 
866
- ## `store` (22)
866
+ ## `store` (24)
867
867
 
868
868
  | Method | Path | Rank | Body | Description |
869
869
  |---|---|---|---|---|
@@ -874,6 +874,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
874
874
  | 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). |
875
875
  | GET | `/api/bongos/store/modules/:key/entitlement` | `any-builder` | — | |
876
876
  | GET | `/api/bongos/store/modules/:key/listing` | `any-builder` | — | GET /api/bongos/store/modules/:key/listing — whether one module is in the catalog and why (task 1003810): the reason in a sentence, what … |
877
+ | POST | `/api/bongos/store/modules/:key/price` | `metic+archon` | `cents`, `credits` | POST /api/bongos/store/modules/:key/price — the module's author sets its price (task 1004894, criterion wa5-module-economy). |
877
878
  | 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). |
878
879
  | GET | `/api/bongos/store/modules/:key/versions/:version/channel` | `any-builder` | — | GET /api/bongos/store/modules/:key/versions/:version/channel — where a version stands on the promotion gate (task 1003804, ADR 0344 D3): … |
879
880
  | POST | `/api/bongos/store/modules/:key/versions/:version/error-count` | `any-builder` | `day`, `count` | |
@@ -882,6 +883,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
882
883
  | POST | `/api/bongos/store/modules/:key/versions/:version/reassess` | `metic+archon` | `reason` | POST /api/bongos/store/modules/:key/versions/:version/reassess — a Metic+ person asks for a published version's assessment to run again: … |
883
884
  | POST | `/api/bongos/store/modules/:key/versions/:version/release` | `metic+archon` | `reason` | POST /api/bongos/store/modules/:key/versions/:version/release — a Metic+ person releases a version the promotion gate HELD on tester (a t… |
884
885
  | GET | `/api/bongos/store/modules/:key/versions/:version/tarball` | `any-builder` | — | |
886
+ | POST | `/api/bongos/store/modules/:key/versions/:version/withdraw` | `metic+archon` | `reason` | POST /api/bongos/store/modules/:key/versions/:version/withdraw — a Metic+ person takes one version back (task 1004895, criterion wa5-stag… |
885
887
  | GET | `/api/bongos/store/modules/latest` | `any-builder` | — | The newest published version of each named module — what `bongos upgrade` compares an instance's installed store modules against to repor… |
886
888
  | GET | `/api/bongos/store/subcategories` | `any-builder` | — | GET /api/bongos/store/subcategories — the approved sub-categories under each of the eight parents (task 1004355, ADR 0342 D3): what an au… |
887
889
  | POST | `/api/bongos/store/subcategories/:id/approve` | `metic+archon` | `label`, `sub_key` | POST /api/bongos/store/subcategories/:id/approve { label?, sub_key? } — make a proposal live, optionally renamed first. |
@@ -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` |