@bongos/core 1.20.27 → 1.20.29

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 (44) hide show
  1. package/.bongos-core.json +75 -45
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +2 -0
  4. package/clients/bongos-client/index.cjs +2 -0
  5. package/clients/bongos-client/index.d.ts +2 -0
  6. package/clients/bongos-client/index.mjs +2 -0
  7. package/docs/adr/0335-an-invite-is-a-pre-approved-row-on-the-projects-own-instance.md +1 -1
  8. package/docs/adr/0353-a-hub-invite-is-a-notice-of-the-projects-own-invite.md +1 -1
  9. package/docs/adr/0356-a-recruit-invite-expires-30-days-after-it-is-sent-read-time.md +46 -0
  10. package/docs/adr/README.md +1 -0
  11. package/docs/api/openapi.json +51 -3
  12. package/docs/api-reference.md +3 -2
  13. package/docs/copy-inventory.md +20 -19
  14. package/docs/copy-registry.json +34 -25
  15. package/docs/module-api-changelog.md +5 -1
  16. package/docs/page-readings.json +9 -9
  17. package/migrations/core_266_access_requests_invited_login_idx.sql +31 -0
  18. package/modules/hall-ui/public/watch.js +9 -3
  19. package/modules/onboarding/routes/access-requests.js +43 -20
  20. package/modules/platform-identity/platform-identity.js +12 -8
  21. package/modules/platform-identity/tests/platform-identity.mjs +4 -2
  22. package/modules/provisioning/core-upgrade.js +70 -1
  23. package/modules/provisioning/migrations/provisioning_029_update_channel.sql +24 -0
  24. package/modules/provisioning/routes/core-upgrade.js +21 -1
  25. package/package-lock.json +2 -2
  26. package/package.json +1 -1
  27. package/release-notes.json +16 -0
  28. package/scripts/gds/fitness.js +4 -0
  29. package/scripts/gds/login.js +6 -0
  30. package/scripts/gds/provision-core-upgrade.js +17 -11
  31. package/scripts/gds/run-unit-tests.js +4 -0
  32. package/src/bongos/db-kernel.js +6 -3
  33. package/src/bongos/invite-expiry.js +47 -0
  34. package/src/module-api.js +10 -1
  35. package/tests/access_requests_invite.mjs +2 -1
  36. package/tests/application_lifecycle.mjs +164 -5
  37. package/tests/bongos_login.mjs +2 -0
  38. package/tests/core_upgrade_door.mjs +80 -1
  39. package/tests/core_upgrade_runner.mjs +54 -1
  40. package/tests/hub_invite_notices.mjs +5 -2
  41. package/tests/invite_expiry.mjs +37 -0
  42. package/tests/invite_expiry_db.mjs +196 -0
  43. package/tests/module_api.mjs +1 -0
  44. package/tests/project_admin_console_model.mjs +12 -5
@@ -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. 465 endpoints across 83 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 466 endpoints across 83 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`.
@@ -562,7 +562,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
562
562
  | GET | `/api/bongos/projects/featured` | `public` | — | the public map of projects; no auth by design. |
563
563
  | POST | `/api/bongos/projects/invite` | `metic+archon` | `client_id`, `github_login` | own-or-metic in effect: where to invite a builder into a project, asked by a `project.curate` holder OR the project's OWN OWNER (task 100… |
564
564
 
565
- ## `provisioning` (34)
565
+ ## `provisioning` (35)
566
566
 
567
567
  | Method | Path | Rank | Body | Description |
568
568
  |---|---|---|---|---|
@@ -594,6 +594,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
594
594
  | GET | `/api/bongos/provisioning/instances/:id/settings` | `any-builder` | — | GET /provisioning/instances/:id/settings — read a project's effective settings + the allowed values (so a form can render its choices). |
595
595
  | PATCH | `/api/bongos/provisioning/instances/:id/settings` | `any-builder` | validated | PATCH /provisioning/instances/:id/settings — change a project's settings. |
596
596
  | POST | `/api/bongos/provisioning/instances/:id/teardown` | `any-builder` | — | POST /provisioning/instances/:id/teardown — request teardown of the caller's OWN instance. |
597
+ | POST | `/api/bongos/provisioning/instances/:id/update-channel` | `archon` | — | POST /provisioning/instances/:id/update-channel — set the project's update rule (task 1004445). |
597
598
  | GET | `/api/bongos/provisioning/onboard-plan` | `public` | — | GET /provisioning/onboard-plan?mode=greenfield\|adopt&domain=<host> — the CANONICAL onboarding step sequence (task 2085; goal 35 / criteri… |
598
599
  | GET | `/api/bongos/provisioning/recommendations` | `public` | — | GET /provisioning/recommendations?type=<project type>&team_shape=<interview answer> — the RULE-BASED recommendation for one set of creati… |
599
600
  | POST | `/api/bongos/provisioning/render/lookup` | `any-builder` | `key`, `owner_id` | POST /provisioning/render/lookup — rank: any authenticated builder. |
@@ -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
- **2188 strings** across 3 surfaces · 1888 distinct pieces of copy · 2188 certain, 0 heuristic · 207 shown in more than one place.
7
+ **2189 strings** across 3 surfaces · 1889 distinct pieces of copy · 2189 certain, 0 heuristic · 207 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` | 109 | 1617 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 109 | 1618 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
15
  | `landing` | `modules/public-landing/public` | 6 | 471 |
16
16
 
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
78
78
  | `064c72453555` | 3x | goals · | modules/hall-ui/public/roadmap.js:218, modules/hall-ui/public/sky-interaction.js:38, modules/hall-ui/public/sky-interaction.js:129 |
79
79
  | … | | _167 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1617 strings
81
+ ## `builders-hall` — 1618 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -190,7 +190,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
190
190
  | `688cc6dd38ee` | certain | Asked of you | `modules/hall-ui/public/collab.html:48` |
191
191
  | `688cc6dd38ee` | certain | Asked of you | `modules/hall-ui/public/collab.html:122` |
192
192
  | `b2656d0b2402` | certain | Asked {…} | `modules/hall-ui/public/collab.js:91` |
193
- | `b2656d0b2402` | certain | Asked {…} | `modules/hall-ui/public/watch.js:511` |
193
+ | `b2656d0b2402` | certain | Asked {…} | `modules/hall-ui/public/watch.js:517` |
194
194
  | `8c8ec2597036` | certain | Assigned {…} to builder {…}. | `modules/hall-ui/public/government.js:463` |
195
195
  | `46714066f2da` | certain | Audit log | `modules/hall-ui/public/watch.html:141` |
196
196
  | `d7c574ba6b2a` | certain | Autobongos runner | `modules/hall-ui/public/gate.html:53` |
@@ -309,8 +309,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
309
309
  | `e269ff7b3144` | certain | Could not add that builder just now. | `modules/hall-ui/public/goals-render.js:1311` |
310
310
  | `7bcaeffb742f` | certain | Could not approve: {…} | `modules/hall-ui/public/gate.js:123` |
311
311
  | `c922293e668c` | certain | Could not assign: {…} | `modules/hall-ui/public/government.js:468` |
312
- | `e1fc7cedf4e7` | certain | Could not change rank: {…} | `modules/hall-ui/public/watch.js:883` |
313
- | `b9e53fbd90e6` | certain | Could not change standing: {…} | `modules/hall-ui/public/watch.js:909` |
312
+ | `e1fc7cedf4e7` | certain | Could not change rank: {…} | `modules/hall-ui/public/watch.js:889` |
313
+ | `b9e53fbd90e6` | certain | Could not change standing: {…} | `modules/hall-ui/public/watch.js:915` |
314
314
  | `1ef1efc15b6c` | certain | Could not change that just now. | `modules/hall-ui/public/goals-render.js:1357` |
315
315
  | `6214998a5ebe` | certain | Could not check for a newer version: {…}. | `modules/hall-ui/public/settings-software-update.js:135` |
316
316
  | `9ab613a308d6` | certain | Could not check for updates: {…}. | `modules/hall-ui/public/settings-software-update.js:180` |
@@ -334,7 +334,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
334
334
  | `8b69e445592a` | certain | Could not load the question labels; showing the answers as stored. | `modules/hall-ui/public/idea.js:458` |
335
335
  | `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:885` |
336
336
  | `02bb0570996a` | certain | Could not load the ranks. | `modules/hall-ui/public/ranks.js:197` |
337
- | `2878778cf9f3` | certain | Could not load this page. | `modules/hall-ui/public/watch.js:1345` |
337
+ | `2878778cf9f3` | certain | Could not load this page. | `modules/hall-ui/public/watch.js:1351` |
338
338
  | `df4c2f78a3f6` | certain | Could not load this project’s skills — {…} | `modules/hall-ui/public/settings-specialities.js:311` |
339
339
  | `4b0c8d94541c` | certain | Could not load your account. Reload the page to try again. | `modules/hall-ui/public/settings.js:1156` |
340
340
  | `2a9fb4046bc4` | certain | Could not load your rank. Return to the hall and try again. | `modules/hall-ui/public/ranks.js:196` |
@@ -343,7 +343,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
343
343
  | `de244c45d916` | certain | Could not load {…} | `modules/hall-ui/public/task.js:1027` |
344
344
  | `2366356926b4` | certain | Could not mark the primer just now. Try again. | `modules/hall-ui/public/primer.js:259` |
345
345
  | `753987b5da13` | certain | Could not reach the submit endpoint. | `modules/hall-ui/public/modules.js:298` |
346
- | `6f500726f0ac` | certain | Could not read the report: {…} | `modules/hall-ui/public/watch.js:663` |
346
+ | `6f500726f0ac` | certain | Could not read the report: {…} | `modules/hall-ui/public/watch.js:669` |
347
347
  | `21c2f33168a3` | certain | Could not read this project's deploy state: {…} | `modules/hall-ui/public/deploy.js:449` |
348
348
  | `21a782f1af26` | certain | Could not read what this would bring in: {…}. The check below still applies. | `modules/hall-ui/public/deploy.js:368` |
349
349
  | `8b470cebf53d` | certain | Could not remove your key. Try again. | `modules/hall-ui/public/settings.js:977` |
@@ -375,7 +375,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
375
375
  | `e65b392144ac` | certain | Could not set up storage. Try again. | `modules/hall-ui/public/settings.js:956` |
376
376
  | `d4601887a058` | certain | Could not sign out everywhere: {…} | `modules/hall-ui/public/settings-sessions.js:102` |
377
377
  | `3db890b074a7` | certain | Could not update visibility just now. | `modules/hall-ui/public/goals-render.js:1341` |
378
- | `112d12b24879` | certain | Could not verify your access. Go back and try again. | `modules/hall-ui/public/watch.js:1344` |
378
+ | `112d12b24879` | certain | Could not verify your access. Go back and try again. | `modules/hall-ui/public/watch.js:1350` |
379
379
  | `6bd74fd20311` | certain | Could not verify your access. Try again. | `modules/hall-ui/public/sessions.js:436` |
380
380
  | `278e8281c82f` | certain | Could not vote: {…} | `modules/hall-ui/public/board-room.js:396` |
381
381
  | `a48e9f098392` | certain | Could not {…} just now. | `modules/hall-ui/public/goals-render.js:1327` |
@@ -574,6 +574,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
574
574
  | `dad3388b49c9` | certain | Invitation rescinded. | `modules/hall-ui/public/goals-page.js:689` |
575
575
  | `12561be47da9` | certain | Invitation sent — they join once they accept. | `modules/hall-ui/public/goals-render.js:1270` |
576
576
  | `24f9e88c21f6` | certain | Invite by GitHub username | `modules/hall-ui/public/watch.js:295` |
577
+ | `33a35c77d372` | certain | Invite expired {…} — invite them again to reopen the door | `modules/hall-ui/public/watch.js:501` |
577
578
  | `b9cb720ad5d1` | certain | Invited? Sign in | `modules/hall-ui/public/hall-render.js:286` |
578
579
  | `0e48bb2c8c94` | certain | Island index | `modules/hall-ui/public/atlas.html:76` |
579
580
  | `2170b74c6526` | certain | Isometric map of the repository | `modules/hall-ui/public/atlas.html:54` |
@@ -801,7 +802,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
801
802
  | `a2bd76ae030d` | certain | Opens this project's upgrade{…}: you see what would move, confirm it, and it installs, checks itself, and roll | `modules/hall-ui/public/settings-software-update.js:85` |
802
803
  | `569980a263ae` | certain | Optional. This is the ledger link — a copy change ships as a task like every other change. | `modules/hall-ui/public/copy-desk.html:130` |
803
804
  | `f2e9e8f21e8e` | certain | Or add someone without asking… | `modules/hall-ui/public/goals-render.js:1234` |
804
- | `d89d1923ecf9` | certain | Over the last {…} days | `modules/hall-ui/public/watch.js:1182` |
805
+ | `d89d1923ecf9` | certain | Over the last {…} days | `modules/hall-ui/public/watch.js:1188` |
805
806
  | `695ffff13730` | certain | Over time | `modules/hall-ui/public/profile.html:72` |
806
807
  | `5ded44da0cc5` | certain | Override requests | `modules/hall-ui/public/watch.html:136` |
807
808
  | `0046e08db06a` | certain | Owner’s bill / month (est.) | `modules/hall-ui/public/fleet-costs.js:70` |
@@ -852,7 +853,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
852
853
  | `3f85bdc47099` | certain | Protected module scope — join by request; an Archon admits members | `modules/hall-ui/public/goals-render.js:856` |
853
854
  | `e5c292c8b361` | certain | Provides (seams) | `modules/hall-ui/public/atlas.js:288` |
854
855
  | `4de232a05888` | certain | Raise after | `modules/hall-ui/public/project-settings.js:113` |
855
- | `b9c6def6b120` | certain | Rank set to {…}. | `modules/hall-ui/public/watch.js:877` |
856
+ | `b9c6def6b120` | certain | Rank set to {…}. | `modules/hall-ui/public/watch.js:883` |
856
857
  | `ff50a1395cbc` | certain | Rank: {…} | `modules/hall-ui/public/profile.js:50` |
857
858
  | `6824ec470f99` | certain | Ranks — {{worldName}} | `modules/hall-ui/public/ranks.html:6` |
858
859
  | `6824ec470f99` | certain | Ranks — {{worldName}} | `modules/hall-ui/public/ranks.html:6` |
@@ -860,7 +861,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
860
861
  | `101a51902f53` | certain | Re-issue failed: {…} | `modules/hall-ui/public/settings.js:780` |
861
862
  | `fae2f90927bd` | certain | Read an idea, then decide. An objection needs a reason and the section it faults. | `modules/hall-ui/public/board-room.html:51` |
862
863
  | `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/drachmae.js:148` |
863
- | `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/watch.js:1155` |
864
+ | `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/watch.js:1161` |
864
865
  | `b6fcfdd652a7` | certain | Read it here | `modules/hall-ui/public/work.html:45` |
865
866
  | `053df132e22c` | certain | Read the full ask | `modules/hall-ui/public/collab.js:133` |
866
867
  | `c5f19a888a15` | certain | Read the handoff notes | `modules/hall-ui/public/task.js:490` |
@@ -897,7 +898,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
897
898
  | `7d4149cee474` | certain | Repo Atlas — a self-drawing map of the codebase | `modules/hall-ui/public/atlas.html:6` |
898
899
  | `4d40a68605e1` | certain | Repo atlas | `modules/hall-ui/public/atlas.html:30` |
899
900
  | `52d7d4309540` | certain | Repo health | `modules/hall-ui/public/watch.html:104` |
900
- | `e6629398d47c` | certain | Report {…}. | `modules/hall-ui/public/watch.js:597` |
901
+ | `e6629398d47c` | certain | Report {…}. | `modules/hall-ui/public/watch.js:603` |
901
902
  | `ab456f09c0f6` | certain | Request access | `modules/hall-ui/public/hall-render.js:294` |
902
903
  | `ab456f09c0f6` | certain | Request access | `modules/hall-ui/public/hall-render.js:470` |
903
904
  | `820f47ce5f16` | certain | Request sent | `modules/hall-ui/public/profile-connections.js:95` |
@@ -916,7 +917,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
916
917
  | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/board-room.js:526` |
917
918
  | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/gate.js:234` |
918
919
  | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/government.js:890` |
919
- | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/watch.js:1294` |
920
+ | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/watch.js:1300` |
920
921
  | `b99a71747432` | certain | Retire task {…}? It leaves the claimable queue. Promote restores it to the backlog. | `modules/hall-ui/public/task.js:966` |
921
922
  | `b33dde402434` | certain | Retire this goal — you will be asked what happens to any unfinished work | `modules/hall-ui/public/goals-render.js:936` |
922
923
  | `d0d5b4300f28` | certain | Retire this task | `modules/hall-ui/public/task.js:802` |
@@ -1030,7 +1031,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1030
1031
  | `a1482eff4ead` | certain | Suggested for you | `modules/hall-ui/public/settings-specialities.js:384` |
1031
1032
  | `1e40f33483eb` | certain | Switch theme | `modules/hall-ui/public/shell.js:491` |
1032
1033
  | `93fa2e97dd35` | certain | System default for this skill | `modules/hall-ui/public/settings.js:72` |
1033
- | `4894b1d9b0de` | certain | System oversight: people, operations and security. | `modules/hall-ui/public/watch.js:1358` |
1034
+ | `4894b1d9b0de` | certain | System oversight: people, operations and security. | `modules/hall-ui/public/watch.js:1364` |
1034
1035
  | `aa8da34fe237` | certain | Take the next page, or pick one from the studio. | `modules/hall-ui/public/tweak-editor.js:564` |
1035
1036
  | `e604fc3ace79` | certain | Task # | `modules/hall-ui/public/blockers.js:139` |
1036
1037
  | `a0f384b022fd` | certain | Task dependencies | `modules/hall-ui/public/goals.html:140` |
@@ -1057,7 +1058,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1057
1058
  | `c0e28f30524d` | certain | That project's own standing, as reported by that project. | `modules/hall-ui/public/profile.js:314` |
1058
1059
  | `e99d4a811e92` | certain | That request is no longer available. | `modules/hall-ui/public/profile-connections.js:314` |
1059
1060
  | `34017119ce22` | certain | That work is genuinely gone | `modules/hall-ui/public/goal-inbox.js:374` |
1060
- | `6e5a324b2972` | certain | That's you | `modules/hall-ui/public/watch.js:826` |
1061
+ | `6e5a324b2972` | certain | That's you | `modules/hall-ui/public/watch.js:832` |
1061
1062
  | `50198c465225` | certain | The 16-value rank enum in three bands, which ranks are live, and the permissions each rank holds. | `modules/hall-ui/public/diagrams.html:59` |
1062
1063
  | `c5e6bdd32fe3` | certain | The Board Room is open to the builders this project’s constitution seats on its board. | `modules/hall-ui/public/board-room.js:529` |
1063
1064
  | `6e93ef49d63f` | certain | The adversarial panel. Each worker reports pass, concerns or fail on its own; the gating workers must all pass | `modules/hall-ui/public/task.js:440` |
@@ -1313,7 +1314,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1313
1314
  | `6dadadffa36e` | certain | Your name cannot be blank. | `modules/hall-ui/public/settings.js:606` |
1314
1315
  | `bd77210a8c90` | certain | Your name must be {…} characters or fewer. | `modules/hall-ui/public/settings.js:611` |
1315
1316
  | `c0a01a95e97e` | certain | Your own idea. You may vote, but it can’t be decided by your vote alone, and a vote on your own idea earns no | `modules/hall-ui/public/board-room.js:366` |
1316
- | `5e0ec4cd1cfe` | certain | Your own row carries no controls. Nobody can change their own rank or standing — that guard is what stops the | `modules/hall-ui/public/watch.js:858` |
1317
+ | `5e0ec4cd1cfe` | certain | Your own row carries no controls. Nobody can change their own rank or standing — that guard is what stops the | `modules/hall-ui/public/watch.js:864` |
1317
1318
  | `8fc605026acf` | certain | Your pending join {…}: {…} — awaiting approval. | `modules/hall-ui/public/goal-inbox.js:88` |
1318
1319
  | `e91418db3962` | certain | Your preferences, {…}. | `modules/hall-ui/public/settings.js:630` |
1319
1320
  | `e91418db3962` | certain | Your preferences, {…}. | `modules/hall-ui/public/settings.js:1173` |
@@ -1526,7 +1527,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1526
1527
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/idea.js:234` |
1527
1528
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/ideas.js:201` |
1528
1529
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/ideas.js:782` |
1529
- | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/watch.js:1265` |
1530
+ | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/watch.js:1271` |
1530
1531
  | `e4e423344746` | certain | task · {…} | `modules/hall-ui/public/sky-interaction.js:36` |
1531
1532
  | `e4e423344746` | certain | task · {…} | `modules/hall-ui/public/sky-panel.js:95` |
1532
1533
  | `a41659dc2bee` | certain | tasks remaining | `modules/hall-ui/public/roadmap.js:298` |
@@ -1634,7 +1635,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1634
1635
  | `1a8a6267e490` | certain | {…} unfinished task{…} — say what happens to each | `modules/hall-ui/public/goals-render.js:1015` |
1635
1636
  | `3ad8f32dd43b` | certain | {…} you have sent | `modules/hall-ui/public/profile-connections.js:146` |
1636
1637
  | `8186b562553a` | certain | {…} {…} waiting | `modules/hall-ui/public/work.js:432` |
1637
- | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:497` |
1638
+ | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:503` |
1638
1639
  | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/work.js:265` |
1639
1640
  | `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:834` |
1640
1641
  | `a6e4ed98fbea` | certain | {…} · revoke it any time under Active sessions. | `modules/hall-ui/public/settings.js:766` |
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 2188,
7
- "unique_ids": 1888,
8
- "certain": 2188,
6
+ "strings": 2189,
7
+ "unique_ids": 1889,
8
+ "certain": 2189,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 207
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 109,
16
- "strings": 1617
16
+ "strings": 1618
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -182,7 +182,7 @@
182
182
  "modules/hall-ui/public/idea.js:234",
183
183
  "modules/hall-ui/public/ideas.js:201",
184
184
  "modules/hall-ui/public/ideas.js:782",
185
- "modules/hall-ui/public/watch.js:1265"
185
+ "modules/hall-ui/public/watch.js:1271"
186
186
  ]
187
187
  },
188
188
  {
@@ -268,7 +268,7 @@
268
268
  "modules/hall-ui/public/board-room.js:526",
269
269
  "modules/hall-ui/public/gate.js:234",
270
270
  "modules/hall-ui/public/government.js:890",
271
- "modules/hall-ui/public/watch.js:1294"
271
+ "modules/hall-ui/public/watch.js:1300"
272
272
  ]
273
273
  },
274
274
  {
@@ -638,7 +638,7 @@
638
638
  "occurrences": 2,
639
639
  "at": [
640
640
  "modules/hall-ui/public/collab.js:91",
641
- "modules/hall-ui/public/watch.js:511"
641
+ "modules/hall-ui/public/watch.js:517"
642
642
  ]
643
643
  },
644
644
  {
@@ -1378,7 +1378,7 @@
1378
1378
  "occurrences": 2,
1379
1379
  "at": [
1380
1380
  "modules/hall-ui/public/drachmae.js:148",
1381
- "modules/hall-ui/public/watch.js:1155"
1381
+ "modules/hall-ui/public/watch.js:1161"
1382
1382
  ]
1383
1383
  },
1384
1384
  {
@@ -2187,7 +2187,7 @@
2187
2187
  "text": "{…} {…}{…}",
2188
2188
  "occurrences": 2,
2189
2189
  "at": [
2190
- "modules/hall-ui/public/watch.js:497",
2190
+ "modules/hall-ui/public/watch.js:503",
2191
2191
  "modules/hall-ui/public/work.js:265"
2192
2192
  ]
2193
2193
  },
@@ -3180,7 +3180,7 @@
3180
3180
  "surface": "builders-hall",
3181
3181
  "text": "Asked {…}",
3182
3182
  "file": "modules/hall-ui/public/watch.js",
3183
- "line": 511,
3183
+ "line": 517,
3184
3184
  "origin": "js-markup",
3185
3185
  "confidence": "certain"
3186
3186
  },
@@ -4251,7 +4251,7 @@
4251
4251
  "surface": "builders-hall",
4252
4252
  "text": "Could not change rank: {…}",
4253
4253
  "file": "modules/hall-ui/public/watch.js",
4254
- "line": 883,
4254
+ "line": 889,
4255
4255
  "origin": "js-notice",
4256
4256
  "confidence": "certain"
4257
4257
  },
@@ -4260,7 +4260,7 @@
4260
4260
  "surface": "builders-hall",
4261
4261
  "text": "Could not change standing: {…}",
4262
4262
  "file": "modules/hall-ui/public/watch.js",
4263
- "line": 909,
4263
+ "line": 915,
4264
4264
  "origin": "js-notice",
4265
4265
  "confidence": "certain"
4266
4266
  },
@@ -4476,7 +4476,7 @@
4476
4476
  "surface": "builders-hall",
4477
4477
  "text": "Could not load this page.",
4478
4478
  "file": "modules/hall-ui/public/watch.js",
4479
- "line": 1345,
4479
+ "line": 1351,
4480
4480
  "origin": "js-notice",
4481
4481
  "confidence": "certain"
4482
4482
  },
@@ -4557,7 +4557,7 @@
4557
4557
  "surface": "builders-hall",
4558
4558
  "text": "Could not read the report: {…}",
4559
4559
  "file": "modules/hall-ui/public/watch.js",
4560
- "line": 663,
4560
+ "line": 669,
4561
4561
  "origin": "js-markup",
4562
4562
  "confidence": "certain"
4563
4563
  },
@@ -4845,7 +4845,7 @@
4845
4845
  "surface": "builders-hall",
4846
4846
  "text": "Could not verify your access. Go back and try again.",
4847
4847
  "file": "modules/hall-ui/public/watch.js",
4848
- "line": 1344,
4848
+ "line": 1350,
4849
4849
  "origin": "js-text-assign",
4850
4850
  "confidence": "certain"
4851
4851
  },
@@ -6631,6 +6631,15 @@
6631
6631
  "origin": "js-markup",
6632
6632
  "confidence": "certain"
6633
6633
  },
6634
+ {
6635
+ "id": "33a35c77d372",
6636
+ "surface": "builders-hall",
6637
+ "text": "Invite expired {…} — invite them again to reopen the door",
6638
+ "file": "modules/hall-ui/public/watch.js",
6639
+ "line": 501,
6640
+ "origin": "js-markup",
6641
+ "confidence": "certain"
6642
+ },
6634
6643
  {
6635
6644
  "id": "b9cb720ad5d1",
6636
6645
  "surface": "builders-hall",
@@ -8679,7 +8688,7 @@
8679
8688
  "surface": "builders-hall",
8680
8689
  "text": "Over the last {…} days",
8681
8690
  "file": "modules/hall-ui/public/watch.js",
8682
- "line": 1182,
8691
+ "line": 1188,
8683
8692
  "origin": "js-markup",
8684
8693
  "confidence": "certain"
8685
8694
  },
@@ -9138,7 +9147,7 @@
9138
9147
  "surface": "builders-hall",
9139
9148
  "text": "Rank set to {…}.",
9140
9149
  "file": "modules/hall-ui/public/watch.js",
9141
- "line": 877,
9150
+ "line": 883,
9142
9151
  "origin": "js-notice",
9143
9152
  "confidence": "certain"
9144
9153
  },
@@ -9210,7 +9219,7 @@
9210
9219
  "surface": "builders-hall",
9211
9220
  "text": "Read it as a table",
9212
9221
  "file": "modules/hall-ui/public/watch.js",
9213
- "line": 1155,
9222
+ "line": 1161,
9214
9223
  "origin": "js-markup",
9215
9224
  "confidence": "certain"
9216
9225
  },
@@ -9543,7 +9552,7 @@
9543
9552
  "surface": "builders-hall",
9544
9553
  "text": "Report {…}.",
9545
9554
  "file": "modules/hall-ui/public/watch.js",
9546
- "line": 597,
9555
+ "line": 603,
9547
9556
  "origin": "js-notice",
9548
9557
  "confidence": "certain"
9549
9558
  },
@@ -9714,7 +9723,7 @@
9714
9723
  "surface": "builders-hall",
9715
9724
  "text": "Restricted.",
9716
9725
  "file": "modules/hall-ui/public/watch.js",
9717
- "line": 1294,
9726
+ "line": 1300,
9718
9727
  "origin": "js-text-assign",
9719
9728
  "confidence": "certain"
9720
9729
  },
@@ -10740,7 +10749,7 @@
10740
10749
  "surface": "builders-hall",
10741
10750
  "text": "System oversight: people, operations and security.",
10742
10751
  "file": "modules/hall-ui/public/watch.js",
10743
- "line": 1358,
10752
+ "line": 1364,
10744
10753
  "origin": "js-text-assign",
10745
10754
  "confidence": "certain"
10746
10755
  },
@@ -10983,7 +10992,7 @@
10983
10992
  "surface": "builders-hall",
10984
10993
  "text": "That's you",
10985
10994
  "file": "modules/hall-ui/public/watch.js",
10986
- "line": 826,
10995
+ "line": 832,
10987
10996
  "origin": "js-markup",
10988
10997
  "confidence": "certain"
10989
10998
  },
@@ -13287,7 +13296,7 @@
13287
13296
  "surface": "builders-hall",
13288
13297
  "text": "Your own row carries no controls. Nobody can change their own rank or standing — that guard is what stops the last {…} locking everyone out — so another {…} does it.",
13289
13298
  "file": "modules/hall-ui/public/watch.js",
13290
- "line": 858,
13299
+ "line": 864,
13291
13300
  "origin": "js-text-assign",
13292
13301
  "confidence": "certain"
13293
13302
  },
@@ -15204,7 +15213,7 @@
15204
15213
  "surface": "builders-hall",
15205
15214
  "text": "task {…}",
15206
15215
  "file": "modules/hall-ui/public/watch.js",
15207
- "line": 1265,
15216
+ "line": 1271,
15208
15217
  "origin": "js-markup",
15209
15218
  "confidence": "certain"
15210
15219
  },
@@ -16176,7 +16185,7 @@
16176
16185
  "surface": "builders-hall",
16177
16186
  "text": "{…} {…}{…}",
16178
16187
  "file": "modules/hall-ui/public/watch.js",
16179
- "line": 497,
16188
+ "line": 503,
16180
16189
  "origin": "js-markup",
16181
16190
  "confidence": "certain"
16182
16191
  },
@@ -2710,6 +2710,10 @@ is load-bearing: the script throws rather than guess if it is missing, and
2710
2710
  1.20.26 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2711
2711
  landed since 1.20.25 with no explicit bump. run 36764011836. (task 1002620)
2712
2712
  1.20.27 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2713
- landed since 1.20.26 with no explicit bump. run 36767793137. (task 1002620)
2713
+ landed since 1.20.26 with no explicit bump. run 36768642814. (task 1002620)
2714
+ 1.20.28 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2715
+ landed since 1.20.27 with no explicit bump. run 36772266063. (task 1002620)
2716
+ 1.20.29 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2717
+ landed since 1.20.28 with no explicit bump. run 36775277990. (task 1002620)
2714
2718
  ---------------------------------------------------------------------------
2715
2719
  ```
@@ -2980,7 +2980,7 @@
2980
2980
  "surface": "builders",
2981
2981
  "title": "Watch",
2982
2982
  "states_read": ["board","out","operations","security"],
2983
- "files_hash": "4139b4721a06ea62",
2983
+ "files_hash": "4b89e8960b706953",
2984
2984
  "reading_hash": "de49e347cca76e41",
2985
2985
  "counts": {"lines":156,"placed":44,"shared":5,"unplaced":107},
2986
2986
  "omitted": {"data":123},
@@ -2991,7 +2991,7 @@
2991
2991
  {"key":"L0003","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":487,"string_id":"eba610d25523"},
2992
2992
  {"key":"L0004","section":"top bar","text":"Ctrl K","placement":"shared"},
2993
2993
  {"key":"L0005","section":"Watch","text":"Watch","placement":"unplaced"},
2994
- {"key":"L0006","section":"Watch","text":"System oversight: people, operations and security.","placement":"placed","file":"modules/hall-ui/public/watch.js","line":1358,"string_id":"4894b1d9b0de"},
2994
+ {"key":"L0006","section":"Watch","text":"System oversight: people, operations and security.","placement":"placed","file":"modules/hall-ui/public/watch.js","line":1364,"string_id":"4894b1d9b0de"},
2995
2995
  {"key":"L0007","section":"Watch","text":"Access requests","placement":"placed","file":"modules/hall-ui/public/watch.html","line":46,"string_id":"996edffc1966"},
2996
2996
  {"key":"L0008","section":"Watch","text":"pending, on the People tab","placement":"placed","file":"modules/hall-ui/public/watch.html","line":46,"string_id":"2fb1dad96280"},
2997
2997
  {"key":"L0009","section":"Watch","text":"Security reports","placement":"placed","file":"modules/hall-ui/public/watch.html","line":47,"string_id":"ab8af800f2bb"},
@@ -3029,7 +3029,7 @@
3029
3029
  {"key":"L0041","section":"Security","text":"Requester","placement":"unplaced","state":"security"},
3030
3030
  {"key":"L0042","section":"Security","text":"Rationale","placement":"unplaced","state":"security"},
3031
3031
  {"key":"L0043","section":"Security","text":"Reward","placement":"unplaced","state":"security"},
3032
- {"key":"L0044","section":"Security","text":"Asked","placement":"placed","file":"modules/hall-ui/public/watch.js","line":511,"string_id":"b2656d0b2402","state":"security"},
3032
+ {"key":"L0044","section":"Security","text":"Asked","placement":"placed","file":"modules/hall-ui/public/watch.js","line":517,"string_id":"b2656d0b2402","state":"security"},
3033
3033
  {"key":"L0045","section":"Security","text":"Decide","placement":"unplaced","state":"security"},
3034
3034
  {"key":"L0046","section":"Security","text":"Approve","placement":"unplaced","state":"security"},
3035
3035
  {"key":"L0047","section":"Security","text":"Deny","placement":"unplaced","state":"security"},
@@ -3061,7 +3061,7 @@
3061
3061
  {"key":"L0073","section":"Sessions","text":"Earned","placement":"unplaced","state":"operations"},
3062
3062
  {"key":"L0074","section":"Sessions","text":"Duration","placement":"unplaced","state":"operations"},
3063
3063
  {"key":"L0075","section":"Sessions","text":"Uploaded","placement":"unplaced","state":"operations"},
3064
- {"key":"L0076","section":"Sessions","text":"task {…}","placement":"placed","file":"modules/hall-ui/public/watch.js","line":1265,"string_id":"4d8ee7d68974","state":"operations","occurrences":5},
3064
+ {"key":"L0076","section":"Sessions","text":"task {…}","placement":"placed","file":"modules/hall-ui/public/watch.js","line":1271,"string_id":"4d8ee7d68974","state":"operations","occurrences":5},
3065
3065
  {"key":"L0077","section":"Sessions","text":"412.0k","placement":"unplaced","state":"operations"},
3066
3066
  {"key":"L0078","section":"Sessions","text":"1h 31m","placement":"unplaced","state":"operations"},
3067
3067
  {"key":"L0079","section":"Sessions","text":"1.2M","placement":"unplaced","state":"operations"},
@@ -3082,8 +3082,8 @@
3082
3082
  {"key":"L0094","section":"Repo health","text":"Dead Files","placement":"unplaced","state":"operations"},
3083
3083
  {"key":"L0095","section":"Repo health","text":"Stale Branches","placement":"unplaced","state":"operations"},
3084
3084
  {"key":"L0096","section":"Repo health","text":"Confirmed Unshipped","placement":"unplaced","state":"operations"},
3085
- {"key":"L0097","section":"Repo health","text":"Over the last {…} days","placement":"placed","file":"modules/hall-ui/public/watch.js","line":1182,"string_id":"d89d1923ecf9","state":"operations"},
3086
- {"key":"L0098","section":"Repo health","text":"Read it as a table","placement":"placed","file":"modules/hall-ui/public/watch.js","line":1155,"string_id":"b03e17693dcd","state":"operations","occurrences":4},
3085
+ {"key":"L0097","section":"Repo health","text":"Over the last {…} days","placement":"placed","file":"modules/hall-ui/public/watch.js","line":1188,"string_id":"d89d1923ecf9","state":"operations"},
3086
+ {"key":"L0098","section":"Repo health","text":"Read it as a table","placement":"placed","file":"modules/hall-ui/public/watch.js","line":1161,"string_id":"b03e17693dcd","state":"operations","occurrences":4},
3087
3087
  {"key":"L0099","section":"Repo health","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"operations"},
3088
3088
  {"key":"L0100","section":"Repo health","text":"Dead exports","placement":"unplaced","state":"operations"},
3089
3089
  {"key":"L0101","section":"Repo health","text":"Exported symbols nothing imports — the knip scan, run daily. 0 – 3 across 28 snapshots.","placement":"unplaced","state":"operations"},
@@ -3111,7 +3111,7 @@
3111
3111
  {"key":"L0123","section":"Access requests","text":"Admitted","placement":"unplaced"},
3112
3112
  {"key":"L0124","section":"Access requests","text":"Declined","placement":"unplaced"},
3113
3113
  {"key":"L0125","section":"Access requests","text":"Name unvouched","placement":"placed","file":"modules/hall-ui/public/watch.js","line":397,"string_id":"5e8199266a8a","occurrences":2},
3114
- {"key":"L0126","section":"Access requests","text":"Asked {…}","placement":"placed","file":"modules/hall-ui/public/watch.js","line":511,"string_id":"b2656d0b2402","occurrences":2},
3114
+ {"key":"L0126","section":"Access requests","text":"Asked {…}","placement":"placed","file":"modules/hall-ui/public/watch.js","line":517,"string_id":"b2656d0b2402","occurrences":2},
3115
3115
  {"key":"L0127","section":"Access requests","text":"Dismiss","placement":"unplaced","occurrences":2},
3116
3116
  {"key":"L0128","section":"Roster","text":"Roster","placement":"unplaced"},
3117
3117
  {"key":"L0129","section":"Roster","text":"Every builder in {{worldName}} — rank, {{currency}}, karma, and active claims.","placement":"placed","file":"modules/hall-ui/public/watch.html","line":69,"string_id":"8690c6424585"},
@@ -3124,9 +3124,9 @@
3124
3124
  {"key":"L0136","section":"Roster","text":"Action","placement":"unplaced"},
3125
3125
  {"key":"L0137","section":"Roster","text":"Offboard","placement":"unplaced","occurrences":3},
3126
3126
  {"key":"L0138","section":"Roster","text":"stale","placement":"unplaced"},
3127
- {"key":"L0139","section":"Roster","text":"That's you","placement":"placed","file":"modules/hall-ui/public/watch.js","line":826,"string_id":"6e5a324b2972"},
3127
+ {"key":"L0139","section":"Roster","text":"That's you","placement":"placed","file":"modules/hall-ui/public/watch.js","line":832,"string_id":"6e5a324b2972"},
3128
3128
  {"key":"L0140","section":"Roster","text":"Reactivate","placement":"unplaced"},
3129
- {"key":"L0141","section":"Roster","text":"Your own row carries no controls. Nobody can change their own rank or standing — that guard is what stops the last {…} locking everyone out — so another {…} does it.","placement":"placed","file":"modules/hall-ui/public/watch.js","line":858,"string_id":"5e0ec4cd1cfe"},
3129
+ {"key":"L0141","section":"Roster","text":"Your own row carries no controls. Nobody can change their own rank or standing — that guard is what stops the last {…} locking everyone out — so another {…} does it.","placement":"placed","file":"modules/hall-ui/public/watch.js","line":864,"string_id":"5e0ec4cd1cfe"},
3130
3130
  {"key":"L0142","section":"Reviews by builder","text":"Reviews by builder","placement":"placed","file":"modules/hall-ui/public/watch.html","line":75,"string_id":"4e062d4f8d69"},
3131
3131
  {"key":"L0143","section":"Reviews by builder","text":"How each builder's shipped work has been graded over the past thirty days.","placement":"placed","file":"modules/hall-ui/public/watch.html","line":76,"string_id":"0bab9286ea38"},
3132
3132
  {"key":"L0144","section":"Reviews by builder","text":"Builder","placement":"unplaced"},
@@ -0,0 +1,31 @@
1
+ -- core_266 — index the invited rows by login (task 1002969, the owner's go-ahead
2
+ -- on a grader finding)
3
+ --
4
+ -- access_requests had two indexes, both partial on status = 'pending' (060). Every
5
+ -- read of an INVITED row therefore scanned the table:
6
+ --
7
+ -- the sign-in gate hasInvitedAccessRequest / accessStateByLogin
8
+ -- (lower(github_login) = lower($1) AND status = 'invited')
9
+ -- the standing invite the onboarding routes' STANDING_INVITE_SQL: re-invite,
10
+ -- rescind-clears-notice, the public POST's already-approved check
11
+ -- the outstanding list GET /access-requests/invites (status = 'invited', windowed
12
+ -- by lower(github_login) since the invite expiry, ADR 0356)
13
+ --
14
+ -- Invite and approved rows are kept as history, so the scan grew with the table's
15
+ -- lifetime rather than with one login's rows. One partial index on the expression
16
+ -- every one of those reads already uses serves them all, and it stays small:
17
+ -- it holds invited rows only.
18
+ --
19
+ -- Additive and idempotent: an index only, no column, constraint or data. Safe to
20
+ -- run forward against a live database, and an older release running against it
21
+ -- just has an unused index. Rollback is DROP INDEX.
22
+
23
+ CREATE INDEX IF NOT EXISTS idx_access_requests_invited_login
24
+ ON access_requests (lower(github_login))
25
+ WHERE status = 'invited';
26
+
27
+ COMMENT ON INDEX idx_access_requests_invited_login IS
28
+ 'Every read of an invited row: the sign-in gate (hasInvitedAccessRequest), the standing-invite probe, and the outstanding-invite list (ADR 0356). 060''s indexes are partial on pending and cannot serve them.';
29
+
30
+ INSERT INTO schema_migrations (version) VALUES ('core_266_access_requests_invited_login_idx')
31
+ ON CONFLICT DO NOTHING;
@@ -474,6 +474,9 @@
474
474
  // invite form above, which is what the server's own refusal names.
475
475
  function gateRowActions(r) {
476
476
  const id = escapeHtml(r.id);
477
+ // An expired invite's door is already shut: inviting again (the form above) is
478
+ // the only move, so the row offers none.
479
+ if (r.expired) return '';
477
480
  if (r.status === 'invited') {
478
481
  return ghost(`data-gate-action="dismissed" data-gate-from="invited" data-id="${id}"`, 'Rescind', true);
479
482
  }
@@ -493,9 +496,12 @@
493
496
  // A rescind overwrites the approver with the rescinder (ADR 0208), so this
494
497
  // names who put the row in the state it is in now — which is what it says.
495
498
  const by = r.resolved_by_login ? ` by <span class="ov-mono">@${escapeHtml(r.resolved_by_login)}</span>` : '';
496
- const decided = r.resolved_at
497
- ? `<span class="ov-row__when">${r.status === 'invited' ? 'Admitted' : 'Declined'} ${escapeHtml(fmtDate(r.resolved_at))}${by}</span>`
498
- : '';
499
+ // An invite past its 30 days is still 'invited' in storage, but no longer admits.
500
+ const decided = r.expired
501
+ ? `<span class="ov-row__when">Invite expired ${escapeHtml(fmtDate(r.expires_at))} — invite them again to reopen the door</span>`
502
+ : r.resolved_at
503
+ ? `<span class="ov-row__when">${r.status === 'invited' ? 'Admitted' : 'Declined'} ${escapeHtml(fmtDate(r.resolved_at))}${by}</span>`
504
+ : '';
499
505
  const actions = gateRowActions(r);
500
506
  return (
501
507
  `<li class="ov-row" data-req-id="${escapeHtml(r.id)}">` +