@bongos/core 1.19.579 → 1.19.580

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 (33) hide show
  1. package/.bongos-core.json +60 -35
  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 +4 -0
  6. package/clients/bongos-client/index.mjs +2 -0
  7. package/docs/adr/0260-the-application-is-the-consent-and-the-echo-is-the-gate.md +146 -0
  8. package/docs/adr/README.md +1 -0
  9. package/docs/api/openapi.json +73 -3
  10. package/docs/api-reference.md +3 -2
  11. package/docs/copy-inventory.md +21 -18
  12. package/docs/copy-registry.json +50 -23
  13. package/docs/file-map.md +1 -0
  14. package/docs/module-api-changelog.md +2 -0
  15. package/modules/dev-box/app/src/vendor/bongos-client.cjs +2 -0
  16. package/modules/hall-ui/public/oversight.css +7 -0
  17. package/modules/hall-ui/public/watch.js +75 -0
  18. package/modules/onboarding/routes/access-requests.js +56 -1
  19. package/modules/platform-identity/applicant-profile.js +158 -0
  20. package/modules/platform-identity/application-echo.js +50 -0
  21. package/modules/platform-identity/recruiter-sliver.js +19 -0
  22. package/modules/platform-identity/routes/sso.js +126 -0
  23. package/package-lock.json +2 -2
  24. package/package.json +1 -1
  25. package/src/bongos/auth-admission.js +61 -0
  26. package/src/bongos/auth.js +2 -1
  27. package/src/module-api.js +11 -1
  28. package/tests/adr_renumber_integrity.mjs +84 -0
  29. package/tests/applicant_profile_boundary.mjs +641 -0
  30. package/tests/applicant_profile_read_bounds.mjs +95 -0
  31. package/tests/module_api.mjs +1 -0
  32. package/tests/recruiter_sliver_boundary.mjs +35 -2
  33. package/tests/watch_applications_queue.mjs +94 -0
@@ -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. 358 endpoints across 58 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 359 endpoints across 58 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/<redacted>.md)): `public` < `any-builder` < `metic+archon` < `archon`.
@@ -556,11 +556,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
556
556
  | GET | `/api/bongos/sessions/mine` | `any-builder` | — | your OWN sessions (self-serve; no audit needed). |
557
557
  | GET | `/api/bongos/sessions/search` | `metic+archon` | — | cross-builder corpus search (BFG-principal posture until 6C.1). |
558
558
 
559
- ## `sso` (7)
559
+ ## `sso` (8)
560
560
 
561
561
  | Method | Path | Rank | Body | Description |
562
562
  |---|---|---|---|---|
563
563
  | POST | `/api/bongos/sso/activity/rollup` | `public` | `client_id`, `client_secret`, `github_id`, `credits`, `tasks_shipped`, `karma`, `rank`, `disciplines`, `recent_ships` | POST /sso/activity/rollup — a federated instance reports a builder's activity snapshot (ADR 0141 §4). |
564
+ | POST | `/api/bongos/sso/applicant-profile` | `public` | `client_id`, `client_secret`, `github_id` | POST /sso/applicant-profile — a federated instance resolves ONE applicant's profile view for its own reviewer queue, LIVE at render (priv… |
564
565
  | GET | `/api/bongos/sso/authorize` | `public` | — | GET /sso/authorize?client_id=&redirect_uri=&state= — the browser authorize leg. |
565
566
  | POST | `/api/bongos/sso/device/poll` | `public` | `device_code` | POST /sso/device/poll — poll the hub device flow. |
566
567
  | POST | `/api/bongos/sso/device/start` | `public` | `origin` | POST /sso/device/start — begin CLI federation. |
@@ -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
- **1706 strings** across 3 surfaces · 1475 distinct pieces of copy · 1706 certain, 0 heuristic · 162 shown in more than one place.
7
+ **1709 strings** across 3 surfaces · 1478 distinct pieces of copy · 1709 certain, 0 heuristic · 162 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` | 78 | 1234 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 78 | 1237 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
15
  | `landing` | `modules/public-landing/public` | 5 | 372 |
16
16
 
@@ -75,10 +75,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
75
75
  | `996edffc1966` | 2x | Access requests | modules/hall-ui/public/watch.html:46, modules/hall-ui/public/watch.html:61 |
76
76
  | `a072071b893c` | 2x | All time | modules/status-ui/public/index.html:286, modules/status-ui/public/index.html:313 |
77
77
  | `490b73a0c6e8` | 2x | Approve your Dev Box app — {{worldName}} | modules/hall-ui/public/pair.html:6, modules/hall-ui/public/pair.html:6 |
78
- | `b2656d0b2402` | 2x | Asked {…} | modules/hall-ui/public/collab.js:41, modules/hall-ui/public/watch.js:389 |
78
+ | `b2656d0b2402` | 2x | Asked {…} | modules/hall-ui/public/collab.js:41, modules/hall-ui/public/watch.js:464 |
79
79
  | … | | _122 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1234 strings
81
+ ## `builders-hall` — 1237 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -138,6 +138,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
138
138
  | `303f8d90266f` | certain | Achievements could not be loaded. | `modules/hall-ui/public/builders.js:1158` |
139
139
  | `6ca31dd5eb91` | certain | Acknowledge the primer | `modules/hall-ui/public/primer.html:99` |
140
140
  | `4461b13f95c2` | certain | Actions apply at once. Closing stops and deletes the box; you can start a fresh one anytime. | `modules/hall-ui/public/settings.html:209` |
141
+ | `74cc57f76b42` | certain | Active recently | `modules/hall-ui/public/watch.js:411` |
141
142
  | `524188fe0078` | certain | Active sessions | `modules/hall-ui/public/settings.html:162` |
142
143
  | `f6036360c90c` | certain | Activity, by craft | `modules/hall-ui/public/profile.html:133` |
143
144
  | `62eded408097` | certain | Add {…} | `modules/hall-ui/public/profile-nudge.js:68` |
@@ -162,7 +163,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
162
163
  | `01a0f29ff406` | certain | As first filed | `modules/hall-ui/public/idea.js:252` |
163
164
  | `688cc6dd38ee` | certain | Asked of you | `modules/hall-ui/public/collab.html:37` |
164
165
  | `b2656d0b2402` | certain | Asked {…} | `modules/hall-ui/public/collab.js:41` |
165
- | `b2656d0b2402` | certain | Asked {…} | `modules/hall-ui/public/watch.js:389` |
166
+ | `b2656d0b2402` | certain | Asked {…} | `modules/hall-ui/public/watch.js:464` |
166
167
  | `8c8ec2597036` | certain | Assigned {…} to builder {…}. | `modules/hall-ui/public/government.js:470` |
167
168
  | `46714066f2da` | certain | Audit log | `modules/hall-ui/public/watch.html:148` |
168
169
  | `1de02052abf2` | certain | Available from the {…} rank up. | `modules/hall-ui/public/gate.js:222` |
@@ -273,8 +274,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
273
274
  | `7bcaeffb742f` | certain | Could not approve: {…} | `modules/hall-ui/public/gate.js:108` |
274
275
  | `c922293e668c` | certain | Could not assign: {…} | `modules/hall-ui/public/government.js:475` |
275
276
  | `94763c4d5a94` | certain | Could not block: {…} | `modules/hall-ui/public/harbor.js:167` |
276
- | `e1fc7cedf4e7` | certain | Could not change rank: {…} | `modules/hall-ui/public/watch.js:720` |
277
- | `b9e53fbd90e6` | certain | Could not change standing: {…} | `modules/hall-ui/public/watch.js:746` |
277
+ | `e1fc7cedf4e7` | certain | Could not change rank: {…} | `modules/hall-ui/public/watch.js:795` |
278
+ | `b9e53fbd90e6` | certain | Could not change standing: {…} | `modules/hall-ui/public/watch.js:821` |
278
279
  | `1ef1efc15b6c` | certain | Could not change that just now. | `modules/hall-ui/public/goals-render.js:1059` |
279
280
  | `78e18ea59b9f` | certain | Could not close: {…} | `modules/hall-ui/public/harbor.js:136` |
280
281
  | `c3f99e7c6e6b` | certain | Could not copy automatically — select and copy manually. ({…}) | `modules/hall-ui/public/settings.js:997` |
@@ -298,7 +299,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
298
299
  | `8b69e445592a` | certain | Could not load the question labels; showing the answers as stored. | `modules/hall-ui/public/idea.js:244` |
299
300
  | `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:550` |
300
301
  | `02bb0570996a` | certain | Could not load the ranks. | `modules/hall-ui/public/ranks.js:197` |
301
- | `2878778cf9f3` | certain | Could not load this page. | `modules/hall-ui/public/watch.js:1212` |
302
+ | `2878778cf9f3` | certain | Could not load this page. | `modules/hall-ui/public/watch.js:1287` |
302
303
  | `4b0c8d94541c` | certain | Could not load your account. Reload the page to try again. | `modules/hall-ui/public/settings.js:1376` |
303
304
  | `2a9fb4046bc4` | certain | Could not load your rank. Return to the hall and try again. | `modules/hall-ui/public/ranks.js:196` |
304
305
  | `9d533e811dec` | certain | Could not load your sessions: {…} | `modules/hall-ui/public/settings-sessions.js:114` |
@@ -306,7 +307,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
306
307
  | `de244c45d916` | certain | Could not load {…} | `modules/hall-ui/public/task.js:703` |
307
308
  | `2366356926b4` | certain | Could not mark the primer just now. Try again. | `modules/hall-ui/public/primer.js:260` |
308
309
  | `753987b5da13` | certain | Could not reach the submit endpoint. | `modules/hall-ui/public/modules.js:297` |
309
- | `6f500726f0ac` | certain | Could not read the report: {…} | `modules/hall-ui/public/watch.js:541` |
310
+ | `6f500726f0ac` | certain | Could not read the report: {…} | `modules/hall-ui/public/watch.js:616` |
310
311
  | `8b470cebf53d` | certain | Could not remove your key. Try again. | `modules/hall-ui/public/settings.js:1198` |
311
312
  | `4cf6bc8b377b` | certain | Could not remove. Try again. | `modules/hall-ui/public/settings.js:1197` |
312
313
  | `7a778d188e87` | certain | Could not remove: {…} | `modules/hall-ui/public/government.js:376` |
@@ -336,7 +337,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
336
337
  | `d4601887a058` | certain | Could not sign out everywhere: {…} | `modules/hall-ui/public/settings-sessions.js:102` |
337
338
  | `b1602d01f4bb` | certain | Could not unblock: {…} | `modules/hall-ui/public/harbor.js:187` |
338
339
  | `3db890b074a7` | certain | Could not update visibility just now. | `modules/hall-ui/public/goals-render.js:1043` |
339
- | `112d12b24879` | certain | Could not verify your access. Go back and try again. | `modules/hall-ui/public/watch.js:1211` |
340
+ | `112d12b24879` | certain | Could not verify your access. Go back and try again. | `modules/hall-ui/public/watch.js:1286` |
340
341
  | `6bd74fd20311` | certain | Could not verify your access. Try again. | `modules/hall-ui/public/sessions.js:280` |
341
342
  | `278e8281c82f` | certain | Could not vote: {…} | `modules/hall-ui/public/government.js:990` |
342
343
  | `a48e9f098392` | certain | Could not {…} just now. | `modules/hall-ui/public/goals-render.js:1029` |
@@ -670,7 +671,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
670
671
  | `d9c802f5d85e` | certain | Opening the studio… | `modules/hall-ui/public/studio.html:45` |
671
672
  | `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` |
672
673
  | `c78d7388ffd7` | certain | Or just stay in the online terminal | `modules/hall-ui/public/hall-render.js:750` |
673
- | `d89d1923ecf9` | certain | Over the last {…} days | `modules/hall-ui/public/watch.js:1054` |
674
+ | `d89d1923ecf9` | certain | Over the last {…} days | `modules/hall-ui/public/watch.js:1129` |
674
675
  | `695ffff13730` | certain | Over time | `modules/hall-ui/public/profile.html:72` |
675
676
  | `5ded44da0cc5` | certain | Override requests | `modules/hall-ui/public/watch.html:143` |
676
677
  | `15a49bf15007` | certain | Page {…} of {…} | `modules/hall-ui/public/hall-kit.js:112` |
@@ -696,6 +697,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
696
697
  | `0ecbc4ee23f0` | certain | Primer required | `modules/hall-ui/public/work.html:42` |
697
698
  | `04f8740a0cb4` | certain | Primer — {{worldName}} | `modules/hall-ui/public/primer.html:6` |
698
699
  | `04f8740a0cb4` | certain | Primer — {{worldName}} | `modules/hall-ui/public/primer.html:6` |
700
+ | `92d8fad6dc91` | certain | Private account — this is all they share by applying. | `modules/hall-ui/public/watch.js:412` |
699
701
  | `2b88c01d1697` | certain | Private — join is by invitation or an approved request | `modules/hall-ui/public/goals-render.js:797` |
700
702
  | `230e7677aad4` | certain | Profile privacy | `modules/hall-ui/public/settings.html:110` |
701
703
  | `f796836eac4e` | certain | Profile sections | `modules/hall-ui/public/profile.html:44` |
@@ -715,7 +717,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
715
717
  | `3f85bdc47099` | certain | Protected module scope — join by request; an Archon admits members | `modules/hall-ui/public/goals-render.js:803` |
716
718
  | `e5c292c8b361` | certain | Provides (seams) | `modules/hall-ui/public/atlas.js:288` |
717
719
  | `4de232a05888` | certain | Raise after | `modules/hall-ui/public/project-settings.js:113` |
718
- | `b9c6def6b120` | certain | Rank set to {…}. | `modules/hall-ui/public/watch.js:714` |
720
+ | `b9c6def6b120` | certain | Rank set to {…}. | `modules/hall-ui/public/watch.js:789` |
719
721
  | `ff50a1395cbc` | certain | Rank: {…} | `modules/hall-ui/public/profile.js:50` |
720
722
  | `6824ec470f99` | certain | Ranks — {{worldName}} | `modules/hall-ui/public/ranks.html:6` |
721
723
  | `6824ec470f99` | certain | Ranks — {{worldName}} | `modules/hall-ui/public/ranks.html:6` |
@@ -723,7 +725,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
723
725
  | `101a51902f53` | certain | Re-issue failed: {…} | `modules/hall-ui/public/settings.js:1001` |
724
726
  | `fae2f90927bd` | certain | Read an idea, then decide. An objection needs a reason and the section it faults. | `modules/hall-ui/public/government.html:66` |
725
727
  | `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/drachmae.js:148` |
726
- | `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/watch.js:1027` |
728
+ | `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/watch.js:1102` |
727
729
  | `b6fcfdd652a7` | certain | Read it here | `modules/hall-ui/public/work.html:45` |
728
730
  | `c5f19a888a15` | certain | Read the handoff notes | `modules/hall-ui/public/task.js:441` |
729
731
  | `f9e998f4af3d` | certain | Read to the end and the button below unlocks. It is an honour system — nothing here checks your comprehension. | `modules/hall-ui/public/primer.html:100` |
@@ -758,7 +760,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
758
760
  | `7d4149cee474` | certain | Repo Atlas — a self-drawing map of the codebase | `modules/hall-ui/public/atlas.html:6` |
759
761
  | `4d40a68605e1` | certain | Repo atlas | `modules/hall-ui/public/atlas.html:30` |
760
762
  | `52d7d4309540` | certain | Repo health | `modules/hall-ui/public/watch.html:111` |
761
- | `e6629398d47c` | certain | Report {…}. | `modules/hall-ui/public/watch.js:475` |
763
+ | `e6629398d47c` | certain | Report {…}. | `modules/hall-ui/public/watch.js:550` |
762
764
  | `ab456f09c0f6` | certain | Request access | `modules/hall-ui/public/hall-render.js:284` |
763
765
  | `ab456f09c0f6` | certain | Request access | `modules/hall-ui/public/hall-render.js:414` |
764
766
  | `967f6d1ac068` | certain | Request dev box | `modules/hall-ui/public/box-panel.js:357` |
@@ -775,7 +777,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
775
777
  | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/gate.js:219` |
776
778
  | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/government.js:1104` |
777
779
  | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/harbor.js:337` |
778
- | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/watch.js:1166` |
780
+ | `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/watch.js:1241` |
779
781
  | `feb48b0d462c` | certain | Return to the Dev Box app and click “Connect” again for a fresh code. | `modules/hall-ui/public/pair.js:32` |
780
782
  | `908a0d5d0685` | certain | Review how it judged this work, and teach it what good looked like. | `modules/hall-ui/public/studio.js:87` |
781
783
  | `f1b2b158c3b1` | certain | Review quality | `modules/hall-ui/public/watch.html:82` |
@@ -861,7 +863,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
861
863
  | `f79e1fb8ebd4` | certain | Suggested as you type; leave it on "no goal" and it waits for triage. | `modules/hall-ui/public/ideas.html:91` |
862
864
  | `1e40f33483eb` | certain | Switch theme | `modules/hall-ui/public/shell.js:386` |
863
865
  | `93fa2e97dd35` | certain | System default for this skill | `modules/hall-ui/public/settings.js:74` |
864
- | `4894b1d9b0de` | certain | System oversight: people, operations and security. | `modules/hall-ui/public/watch.js:1225` |
866
+ | `4894b1d9b0de` | certain | System oversight: people, operations and security. | `modules/hall-ui/public/watch.js:1300` |
865
867
  | `dfc967a63d57` | certain | Task lifecycle from backlog to shipped, showing states and transitions and the edge where credits are awarded. | `modules/hall-ui/public/diagrams.html:51` |
866
868
  | `10cc12f37636` | certain | Task sections | `modules/hall-ui/public/work.html:53` |
867
869
  | `0e636ea41b29` | certain | Task status | `modules/hall-ui/public/goals-render.js:331` |
@@ -939,6 +941,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
939
941
  | `df316c3484de` | certain | Then drive it however you like: | `modules/hall-ui/public/hall-render.js:750` |
940
942
  | `5151cf635644` | certain | They have asked to connect. | `modules/hall-ui/public/profile-connections.js:203` |
941
943
  | `6e46811189db` | certain | This PR is held by the gate-review check. | `modules/hall-ui/public/gate.js:129` |
944
+ | `b7c288328f79` | certain | This builder hides their cross-project record. | `modules/hall-ui/public/watch.js:393` |
942
945
  | `ed313d96b419` | certain | This builder keeps their track record private. | `modules/hall-ui/public/profile.js:270` |
943
946
  | `3f9e476e22db` | certain | This clears {…}. The gate check re-runs and the PR merges once it goes green. Your approval applies only to co | `modules/hall-ui/public/gate.js:94` |
944
947
  | `c2a0e726bd97` | certain | This goal is Archon-mediated — request to join instead. | `modules/hall-ui/public/goals-render.js:1025` |
@@ -1199,7 +1202,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1199
1202
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/hall-render.js:605` |
1200
1203
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/idea.js:207` |
1201
1204
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/ideas.js:476` |
1202
- | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/watch.js:1137` |
1205
+ | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/watch.js:1212` |
1203
1206
  | `a41659dc2bee` | certain | tasks remaining | `modules/hall-ui/public/roadmap.js:285` |
1204
1207
  | `bd3402efa59e` | certain | task{…} shipped | `modules/hall-ui/public/goals-render.js:748` |
1205
1208
  | `95854f8315ca` | certain | the page everyone else reads | `modules/hall-ui/public/profile.html:32` |
@@ -1269,7 +1272,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1269
1272
  | `b2db97589086` | certain | {…} will not be able to open or wake a dev box until you unblock them. A box they already have running is left | `modules/hall-ui/public/harbor.js:148` |
1270
1273
  | `3ad8f32dd43b` | certain | {…} you have sent | `modules/hall-ui/public/profile-connections.js:137` |
1271
1274
  | `8186b562553a` | certain | {…} {…} waiting | `modules/hall-ui/public/work.js:359` |
1272
- | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:379` |
1275
+ | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:450` |
1273
1276
  | `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/work.js:223` |
1274
1277
  | `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:1055` |
1275
1278
  | `94445e6ed5e8` | certain | {…} · code | `modules/hall-ui/public/pair.js:53` |
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 1706,
7
- "unique_ids": 1475,
8
- "certain": 1706,
6
+ "strings": 1709,
7
+ "unique_ids": 1478,
8
+ "certain": 1709,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 162
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 78,
16
- "strings": 1234
16
+ "strings": 1237
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -159,7 +159,7 @@
159
159
  "modules/hall-ui/public/hall-render.js:605",
160
160
  "modules/hall-ui/public/idea.js:207",
161
161
  "modules/hall-ui/public/ideas.js:476",
162
- "modules/hall-ui/public/watch.js:1137"
162
+ "modules/hall-ui/public/watch.js:1212"
163
163
  ]
164
164
  },
165
165
  {
@@ -243,7 +243,7 @@
243
243
  "modules/hall-ui/public/gate.js:219",
244
244
  "modules/hall-ui/public/government.js:1104",
245
245
  "modules/hall-ui/public/harbor.js:337",
246
- "modules/hall-ui/public/watch.js:1166"
246
+ "modules/hall-ui/public/watch.js:1241"
247
247
  ]
248
248
  },
249
249
  {
@@ -504,7 +504,7 @@
504
504
  "occurrences": 2,
505
505
  "at": [
506
506
  "modules/hall-ui/public/collab.js:41",
507
- "modules/hall-ui/public/watch.js:389"
507
+ "modules/hall-ui/public/watch.js:464"
508
508
  ]
509
509
  },
510
510
  {
@@ -1134,7 +1134,7 @@
1134
1134
  "occurrences": 2,
1135
1135
  "at": [
1136
1136
  "modules/hall-ui/public/drachmae.js:148",
1137
- "modules/hall-ui/public/watch.js:1027"
1137
+ "modules/hall-ui/public/watch.js:1102"
1138
1138
  ]
1139
1139
  },
1140
1140
  {
@@ -1713,7 +1713,7 @@
1713
1713
  "text": "{…} {…}{…}",
1714
1714
  "occurrences": 2,
1715
1715
  "at": [
1716
- "modules/hall-ui/public/watch.js:379",
1716
+ "modules/hall-ui/public/watch.js:450",
1717
1717
  "modules/hall-ui/public/work.js:223"
1718
1718
  ]
1719
1719
  },
@@ -2233,6 +2233,15 @@
2233
2233
  "origin": "html-text",
2234
2234
  "confidence": "certain"
2235
2235
  },
2236
+ {
2237
+ "id": "74cc57f76b42",
2238
+ "surface": "builders-hall",
2239
+ "text": "Active recently",
2240
+ "file": "modules/hall-ui/public/watch.js",
2241
+ "line": 411,
2242
+ "origin": "js-markup",
2243
+ "confidence": "certain"
2244
+ },
2236
2245
  {
2237
2246
  "id": "524188fe0078",
2238
2247
  "surface": "builders-hall",
@@ -2454,7 +2463,7 @@
2454
2463
  "surface": "builders-hall",
2455
2464
  "text": "Asked {…}",
2456
2465
  "file": "modules/hall-ui/public/watch.js",
2457
- "line": 389,
2466
+ "line": 464,
2458
2467
  "origin": "js-markup",
2459
2468
  "confidence": "certain"
2460
2469
  },
@@ -3453,7 +3462,7 @@
3453
3462
  "surface": "builders-hall",
3454
3463
  "text": "Could not change rank: {…}",
3455
3464
  "file": "modules/hall-ui/public/watch.js",
3456
- "line": 720,
3465
+ "line": 795,
3457
3466
  "origin": "js-notice",
3458
3467
  "confidence": "certain"
3459
3468
  },
@@ -3462,7 +3471,7 @@
3462
3471
  "surface": "builders-hall",
3463
3472
  "text": "Could not change standing: {…}",
3464
3473
  "file": "modules/hall-ui/public/watch.js",
3465
- "line": 746,
3474
+ "line": 821,
3466
3475
  "origin": "js-notice",
3467
3476
  "confidence": "certain"
3468
3477
  },
@@ -3678,7 +3687,7 @@
3678
3687
  "surface": "builders-hall",
3679
3688
  "text": "Could not load this page.",
3680
3689
  "file": "modules/hall-ui/public/watch.js",
3681
- "line": 1212,
3690
+ "line": 1287,
3682
3691
  "origin": "js-notice",
3683
3692
  "confidence": "certain"
3684
3693
  },
@@ -3750,7 +3759,7 @@
3750
3759
  "surface": "builders-hall",
3751
3760
  "text": "Could not read the report: {…}",
3752
3761
  "file": "modules/hall-ui/public/watch.js",
3753
- "line": 541,
3762
+ "line": 616,
3754
3763
  "origin": "js-markup",
3755
3764
  "confidence": "certain"
3756
3765
  },
@@ -4020,7 +4029,7 @@
4020
4029
  "surface": "builders-hall",
4021
4030
  "text": "Could not verify your access. Go back and try again.",
4022
4031
  "file": "modules/hall-ui/public/watch.js",
4023
- "line": 1211,
4032
+ "line": 1286,
4024
4033
  "origin": "js-text-assign",
4025
4034
  "confidence": "certain"
4026
4035
  },
@@ -7026,7 +7035,7 @@
7026
7035
  "surface": "builders-hall",
7027
7036
  "text": "Over the last {…} days",
7028
7037
  "file": "modules/hall-ui/public/watch.js",
7029
- "line": 1054,
7038
+ "line": 1129,
7030
7039
  "origin": "js-markup",
7031
7040
  "confidence": "certain"
7032
7041
  },
@@ -7255,6 +7264,15 @@
7255
7264
  "origin": "html-title",
7256
7265
  "confidence": "certain"
7257
7266
  },
7267
+ {
7268
+ "id": "92d8fad6dc91",
7269
+ "surface": "builders-hall",
7270
+ "text": "Private account — this is all they share by applying.",
7271
+ "file": "modules/hall-ui/public/watch.js",
7272
+ "line": 412,
7273
+ "origin": "js-markup",
7274
+ "confidence": "certain"
7275
+ },
7258
7276
  {
7259
7277
  "id": "2b88c01d1697",
7260
7278
  "surface": "builders-hall",
@@ -7431,7 +7449,7 @@
7431
7449
  "surface": "builders-hall",
7432
7450
  "text": "Rank set to {…}.",
7433
7451
  "file": "modules/hall-ui/public/watch.js",
7434
- "line": 714,
7452
+ "line": 789,
7435
7453
  "origin": "js-notice",
7436
7454
  "confidence": "certain"
7437
7455
  },
@@ -7503,7 +7521,7 @@
7503
7521
  "surface": "builders-hall",
7504
7522
  "text": "Read it as a table",
7505
7523
  "file": "modules/hall-ui/public/watch.js",
7506
- "line": 1027,
7524
+ "line": 1102,
7507
7525
  "origin": "js-markup",
7508
7526
  "confidence": "certain"
7509
7527
  },
@@ -7818,7 +7836,7 @@
7818
7836
  "surface": "builders-hall",
7819
7837
  "text": "Report {…}.",
7820
7838
  "file": "modules/hall-ui/public/watch.js",
7821
- "line": 475,
7839
+ "line": 550,
7822
7840
  "origin": "js-notice",
7823
7841
  "confidence": "certain"
7824
7842
  },
@@ -7971,7 +7989,7 @@
7971
7989
  "surface": "builders-hall",
7972
7990
  "text": "Restricted.",
7973
7991
  "file": "modules/hall-ui/public/watch.js",
7974
- "line": 1166,
7992
+ "line": 1241,
7975
7993
  "origin": "js-text-assign",
7976
7994
  "confidence": "certain"
7977
7995
  },
@@ -8745,7 +8763,7 @@
8745
8763
  "surface": "builders-hall",
8746
8764
  "text": "System oversight: people, operations and security.",
8747
8765
  "file": "modules/hall-ui/public/watch.js",
8748
- "line": 1225,
8766
+ "line": 1300,
8749
8767
  "origin": "js-text-assign",
8750
8768
  "confidence": "certain"
8751
8769
  },
@@ -9442,6 +9460,15 @@
9442
9460
  "origin": "js-markup",
9443
9461
  "confidence": "certain"
9444
9462
  },
9463
+ {
9464
+ "id": "b7c288328f79",
9465
+ "surface": "builders-hall",
9466
+ "text": "This builder hides their cross-project record.",
9467
+ "file": "modules/hall-ui/public/watch.js",
9468
+ "line": 393,
9469
+ "origin": "js-markup",
9470
+ "confidence": "certain"
9471
+ },
9445
9472
  {
9446
9473
  "id": "ed313d96b419",
9447
9474
  "surface": "builders-hall",
@@ -11787,7 +11814,7 @@
11787
11814
  "surface": "builders-hall",
11788
11815
  "text": "task {…}",
11789
11816
  "file": "modules/hall-ui/public/watch.js",
11790
- "line": 1137,
11817
+ "line": 1212,
11791
11818
  "origin": "js-markup",
11792
11819
  "confidence": "certain"
11793
11820
  },
@@ -12417,7 +12444,7 @@
12417
12444
  "surface": "builders-hall",
12418
12445
  "text": "{…} {…}{…}",
12419
12446
  "file": "modules/hall-ui/public/watch.js",
12420
- "line": 379,
12447
+ "line": 450,
12421
12448
  "origin": "js-markup",
12422
12449
  "confidence": "certain"
12423
12450
  },
package/docs/file-map.md CHANGED
@@ -365,6 +365,7 @@ tests/
365
365
  ├── scouting_owner_access_and_reach.mjs ← (task 1002290, goal 1000045 C5, ADR 0210): the R14 proof — WHO may read the cross-project recruiting directory, and WHO appears in it. A project owner (an instance-asserted, hub-witnessed `membership_kind='owner'`) reads `GET /scouting` with no rank at all; a builder who is neither owner nor `project.curate` holder gets the unchanged 403; an un-witnessed owner claim is refused; a broken ownership read falls closed onto the permission gate rather than admitting or 500ing. And the recruiting opt-out finally bites: a public, unhidden, active account that opted out is absent from `/scouting` and the hall's `/people` (the same endpoint), returns when it opts back in, and the opt-out grants and denies no permission — an opted-out owner still reads the directory while being absent from their own copy of it. Fake pool filtered by each statement's own WHERE clause, real route, real `requirePermission` over the real government catalog, real HTTP. Mutation-checked three ways. DB-free `unit` lane.
366
366
  ├── scouting_page_gate.mjs ← (task 1002290, goal 1000045 C5, ADR 0210 D3): the OTHER half of R14 — the `/builders/people` SHELL must admit exactly the two audiences `GET /scouting` admits. A project owner holding no permission reaches it; everyone the route refuses gets the byte-identical `?denied=project.curate` redirect; and each of six ways the `alsoAdmits` door can fail (module absent, function absent, throw, reject, non-boolean, prototype-only) fails CLOSED. Also pins that the other four page gates never consult the seam at all, and that exactly ONE gate declares a second door. Its own file because the route proof's ESM imports pull `auth.js` in before a session double could be installed — this one installs it first, the `government_page_gates.mjs` pattern. DB-free `unit` lane.
367
367
  ├── terms_acceptance.mjs ← (task 1002913, goal 1000045, ADR 0213): the platform T&C acceptance record. Proves the four properties that make it evidence rather than a claim — the /terms page carries the cross-project consent ADR 0141 §4 deferred to it and it is apex-only; acceptance is written ONLY by the hub's own /sso/authorize (driven over the real router with an attacker-controlled query string, so a forged timestamp/version/activate flag reaches nothing); it is written ONCE (the fake pool interprets the upsert's own column assignments, so COALESCE is executed, not string-matched, and an assignment shape it cannot read throws instead of reading as "unchanged"); and consent is two columns in the shared predicate, so an account the hub witnessed before the terms existed publishes nothing. Plus the projection rule — every read whose row a JS twin judges must select both consent columns, or the twin denies everyone silently. DB-free `unit` lane, asserts its own lane membership.
368
+ ├── applicant_profile_boundary.mjs ← (task 1002972, goal 1000045 C4, privacy spec D7, ADR 0241): THE D7 BOUNDARY proof for the applicant view a reviewer sees. Whitelists read from the MODULES’ own exports — the private branch against `recruiter-sliver`’s `SLIVER_KEYS`/`SLIVER_KEYS_HIDDEN`, the public branch against the public-page payload’s key list — so a third shape (the “new disclosure class” D7 forbids) reds this file. Pins THE CONSENT SWAP in both directions on the same account: a private builder who never opted into recruiting gets an applicant view and gets `null` from `getRecruiterSliver`, so a refactor routing the port through the recruiter sliver cannot pass quietly. `hide_stats` beats the application in both branches; provisional and terms-never-accepted disclose nothing; planted sentinels asserted absent from the whole body with the avatar-embedded `github_id` pinned as the one honest exception. Plus the federated gate (ADR 0205): no echo → 404 and NO account row read (asserted on the statement log), the witness matched against the AUTHENTICATED client, an out-of-window echo stops working, and `Cache-Control: no-store`. Real router + real HTTP over in-memory tables filtered by each statement’s own WHERE clause. DB-free `unit` lane, asserted in the file itself.
368
369
  ├── recruiter_sliver_boundary.mjs ← (task 1002968, goal 1000045 C2/C5, privacy spec D3, ADR 0215): THE PRE-ACCEPT BOUNDARY proof for the D3 recruiter sliver. A WHITELIST over the module's own exported key list (a sixth key fails whether or not this file was told about it), planted improbable sentinels asserted absent from the WHOLE response body with two controls against vacuity, the ceiling assertion (the handle a recruiter is handed 404s at `GET /profiles/:handle`, with a 200 control) and the gate (both recruiting routes admit the same two audiences and refuse byte-identically). Real router + real HTTP over an in-memory table filtered by each statement's own WHERE clause. DB-free `unit` lane, asserted in the file itself.
369
370
  └── public_task_resolver.mjs ← (#604): the public `/public/tasks/:id` projection — title/value_summary exposed only for shipped|confirmed; withheld for in-flight so unshipped/security task names can't leak.
370
371
  ```
@@ -1607,5 +1607,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
1607
1607
  landed since 1.19.577 with no explicit bump. run 34146835487. (task 1002620)
1608
1608
  1.19.579 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1609
1609
  landed since 1.19.578 with no explicit bump. run 34149317186. (task 1002620)
1610
+ 1.19.580 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1611
+ landed since 1.19.579 with no explicit bump. run 34153217035. (task 1002620)
1610
1612
  ---------------------------------------------------------------------------
1611
1613
  ```
@@ -792,6 +792,8 @@ function createClient(opts = {}) {
792
792
  "sso": {
793
793
  // POST /sso/activity/rollup — rank: public — POST /sso/activity/rollup
794
794
  postSsoActivityRollup: (args) => request("POST", "/sso/activity/rollup", { hasBody: true }, args),
795
+ // POST /sso/applicant-profile — rank: public — POST /sso/applicant-profile
796
+ postSsoApplicantProfile: (args) => request("POST", "/sso/applicant-profile", { hasBody: true }, args),
795
797
  // GET /sso/authorize — rank: public — GET /sso/authorize
796
798
  getSsoAuthorize: (args) => request("GET", "/sso/authorize", { hasBody: false }, args),
797
799
  // POST /sso/device/poll — rank: public — POST /sso/device/poll
@@ -119,6 +119,13 @@ a.ov-row__title:hover { color: var(--accent-ink); text-decoration: underline; te
119
119
  .ov-row__sub { display: block; margin: 4px 0 0; font-size: 13.5px; line-height: 1.5; color: var(--ink-soft); max-width: var(--measure); overflow-wrap: anywhere; }
120
120
  .ov-row__facts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin: 10px 0 0; }
121
121
  .ov-row__sub + .ov-row__facts { margin-top: 8px; }
122
+ /* The applicant's own profile inside an access-request row (task 1002972, D7).
123
+ A rule on the inline edge rather than a card: it is the APPLICANT speaking
124
+ through their own privacy settings, and it must read as evidence attached to
125
+ their ask — never as another decision surface competing with the buttons. */
126
+ .ov-row__profile { margin: 10px 0 0; padding-left: 12px; border-left: 2px solid var(--rule); }
127
+ .ov-row__profile .ov-row__sub { margin-top: 0; }
128
+ .ov-row__profile .ov-row__facts { margin-top: 6px; }
122
129
  .ov-row__right { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; text-align: right; }
123
130
  .ov-row__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; }
124
131
  .ov-row__when { font-size: 12.5px; color: var(--ink-faint); font-variant-numeric: tabular-nums; white-space: nowrap; }
@@ -350,6 +350,77 @@
350
350
  : '<span class="fact-pill fact-pill--warn" title="Nobody vouched for this name — anyone can file a request naming anyone. Confirm who is asking before you admit them.">Name unvouched</span>';
351
351
  }
352
352
 
353
+ // ---- the applicant's own profile, beside their ask (task 1002972, D7) -----
354
+ //
355
+ // The reviewer sees what the APPLICANT'S OWN privacy rules would show them —
356
+ // resolved live by the server on every render, never stored on the request. So
357
+ // this renderer decides nothing about disclosure: it draws whichever of the
358
+ // two shapes the server sent, and draws nothing at all when it sent null. A
359
+ // null covers "not vouched", "no hub", "hub unreachable", "account hidden" and
360
+ // "no such account" alike, and it must stay that way on screen too — the row
361
+ // simply carries no profile block, and the vouch pill above already says
362
+ // whether anyone confirmed the name.
363
+ //
364
+ // NOTHING HERE IS AUTHORITY (ADR 0016). A rich record is not a reason to admit
365
+ // and an empty one is not a reason to refuse; the two buttons are unchanged
366
+ // and the server's admission gate never reads any of this.
367
+
368
+ // The bio, under the applicant's name. ESCAPED AND NEVER LINKIFIED — the
369
+ // render contract the hub's own profile payload carries, because a bio is user
370
+ // content on a page an Archon reads. escapeHtml is the whole defence; do not
371
+ // "improve" this into anchor-building.
372
+ function profileBio(p) {
373
+ var bio = p.account && p.account.bio;
374
+ return bio ? '<p class="ov-row__sub">' + escapeHtml(bio) + '</p>' : '';
375
+ }
376
+
377
+ // Disciplines as pills — the one field both shapes carry, so it is read off
378
+ // whichever half is present rather than branched on twice.
379
+ function disciplinePills(list) {
380
+ if (!Array.isArray(list) || !list.length) return '';
381
+ return list.slice(0, 6).map(function (d) {
382
+ return '<span class="fact-pill fact-pill--quiet">' + escapeHtml(d) + '</span>';
383
+ }).join('');
384
+ }
385
+
386
+ // The PUBLIC shape: the cross-project rollup as one plain sentence. A null
387
+ // rollup is not an error and not an absence of the person — it is the builder
388
+ // having hidden their numbers, and saying so is what stops a reviewer reading
389
+ // the blank as "this applicant has done nothing".
390
+ function publicProfileFacts(p) {
391
+ var x = p.cross_project;
392
+ if (!x) {
393
+ return '<span class="ov-row__when">This builder hides their cross-project record.</span>';
394
+ }
395
+ var t = x.totals || {};
396
+ var parts = [];
397
+ if (num(t.projects)) parts.push(fmtInt(t.projects) + (t.projects === 1 ? ' project' : ' projects'));
398
+ if (num(t.works_shipped)) parts.push(fmtInt(t.works_shipped) + ' shipped');
399
+ if (num(t.credits)) parts.push(fmtCompact(t.credits) + ' credits');
400
+ return disciplinePills(x.disciplines)
401
+ + (parts.length ? '<span class="ov-row__when">' + escapeHtml(parts.join(' · ')) + '</span>' : '')
402
+ + (x.last_active ? '<span class="ov-row__when">Last active ' + escapeHtml(fmtDate(x.last_active)) + '</span>' : '');
403
+ }
404
+
405
+ // The SLIVER shape: a private account that chose to apply anyway. The sentence
406
+ // is there so a reviewer does not read the thinness as a poor record — it is a
407
+ // deliberate boundary, and applying is what opened even this much.
408
+ function sliverProfileFacts(p) {
409
+ var s = p.sliver || {};
410
+ return disciplinePills(s.disciplines)
411
+ + (s.active_recently ? '<span class="fact-pill fact-pill--ok">Active recently</span>' : '')
412
+ + '<span class="ov-row__when">Private account — this is all they share by applying.</span>';
413
+ }
414
+
415
+ function profileHtml(p) {
416
+ if (!p || (p.view !== 'public' && p.view !== 'sliver')) return '';
417
+ var facts = p.view === 'public' ? publicProfileFacts(p) : sliverProfileFacts(p);
418
+ return '<div class="ov-row__profile">'
419
+ + (p.view === 'public' ? profileBio(p) : '')
420
+ + (facts ? '<div class="ov-row__facts">' + facts + '</div>' : '')
421
+ + '</div>';
422
+ }
423
+
353
424
  // What this row still offers. A waiting request has two decisions; an admitted
354
425
  // one can still be rescinded (until they sign in, after which the server
355
426
  // refuses and says so); a declined one is terminal here — re-admitting is the
@@ -384,6 +455,10 @@
384
455
  '<div class="ov-row__main">' +
385
456
  `<span class="ov-row__title">${who}</span>` +
386
457
  note +
458
+ // The applicant's own profile sits between what THEY wrote and what the
459
+ // SYSTEM knows — their words first, their record second, the decision
460
+ // facts last. Empty string when the server resolved nothing.
461
+ profileHtml(r.profile) +
387
462
  '<div class="ov-row__facts">' +
388
463
  vouchPill(!!r.vouched) +
389
464
  `<span class="ov-row__when">Asked ${escapeHtml(fmtDate(r.created_at))}</span>` +