@bongos/core 1.21.56 → 1.21.58

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 (51) hide show
  1. package/.bongos-core.json +106 -46
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +6 -0
  4. package/clients/bongos-client/index.cjs +6 -0
  5. package/clients/bongos-client/index.d.ts +13 -2
  6. package/clients/bongos-client/index.mjs +6 -0
  7. package/docs/adr/0336-a-guilds-record-is-the-sum-of-what-its-members-already-show.md +2 -0
  8. package/docs/adr/0365-a-guild-engages-a-project-through-each-members-own-door.md +58 -0
  9. package/docs/adr/README.md +1 -0
  10. package/docs/api/openapi.json +233 -6
  11. package/docs/api-reference.md +8 -5
  12. package/docs/copy-inventory.md +361 -315
  13. package/docs/copy-registry.json +868 -419
  14. package/docs/file-map.md +4 -0
  15. package/docs/module-api-changelog.md +4 -0
  16. package/docs/page-inventory.json +38 -4
  17. package/docs/page-readings.json +856 -771
  18. package/modules/platform-identity/application-echo.js +11 -5
  19. package/modules/platform-identity/guild-engagements.js +255 -0
  20. package/modules/platform-identity/guilds.js +3 -1
  21. package/modules/platform-identity/migrations/platform_identity_030_guild_engagements.sql +64 -0
  22. package/modules/platform-identity/routes/guilds.js +35 -1
  23. package/modules/platform-identity/routes/my-projects.js +27 -3
  24. package/modules/platform-identity/routes/projects.js +44 -0
  25. package/modules/platform-identity/routes/sso.js +21 -3
  26. package/modules/public-landing/public/assets/cosmos.css +7 -0
  27. package/modules/public-landing/public/guild.html +633 -0
  28. package/modules/public-landing/public/guild.probes.json +63 -0
  29. package/modules/public-landing/public/guild.states.json +43 -0
  30. package/modules/public-landing/public/projects.html +252 -16
  31. package/modules/public-landing/public/projects.probes.json +26 -1
  32. package/modules/public-landing/public/projects.states.json +4 -0
  33. package/modules/ui-design/kit/fixtures/guilds.json +73 -0
  34. package/modules/ui-design/kit/fixtures/me__guild-engagements.json +7 -0
  35. package/modules/ui-design/kit/serve.js +99 -5
  36. package/package-lock.json +2 -2
  37. package/package.json +1 -1
  38. package/release-notes.json +12 -0
  39. package/scripts/gds/run-unit-tests.js +5 -0
  40. package/src/module-api.js +1 -1
  41. package/src/platform-server.js +13 -0
  42. package/tests/applicant_profile_boundary.mjs +104 -1
  43. package/tests/application_echo.mjs +91 -5
  44. package/tests/guild_engagement.mjs +881 -0
  45. package/tests/guild_engagement_db.mjs +240 -0
  46. package/tests/hub_engagement_cards.mjs +307 -0
  47. package/tests/hub_guild_page.mjs +624 -0
  48. package/tests/privacy_matrix.mjs +216 -14
  49. package/tests/project_invite_ui.mjs +187 -3
  50. package/tests/render_check.mjs +2 -2
  51. package/tests/ui_design_kit.mjs +3 -3
package/docs/file-map.md CHANGED
@@ -258,6 +258,7 @@
258
258
  │ ├── projects.html ← the hub (/projects?view=map|mine|manage|new) on cosmos.css (A4, task 1003299, rebuilds it in the world)
259
259
  │ ├── privacy.html / terms.html / contact.html ← the footer doors (task 1003251), on cosmos.css
260
260
  │ ├── account.html ← the hub account page (/account, task 1004259, ADR 0337 D4.3): handle, name, bio, links, public/private, recruiters, hide-my-numbers — the platform account's own settings, edited once; served only where platform-identity runs; account{,-private}.states.json + account.probes.json beside it
261
+ │ ├── guild.html ← the guild page (/g/<slug>, task 1002301, ADR 0336 D4/D6 + ADR 0337 D4.4): identity, the public roster or (for a member) the members' roster, the rounded weekly record, and a member's own two switches — one shell for every slug, the guild routes decide what exists; served only where platform-identity runs; guild.states.json + guild.probes.json beside it (the kit stub answers them from fixtures/guilds.json)
261
262
  │ ├── assets/
262
263
  │ │ ├── world.css ← the WORLD token layer (ADR 0196): contract tier = the pack, derived tier both modes, root-absolute plate token pairs, the reduced-motion kill switch; no page composition
263
264
  │ │ ├── world/ ← the six production plates + <file>.json provenance sidecars (embed-prompt.mjs --scan clean): r2-chrome-blobs-set.jpg, r2-chrome-blob-one.jpg, r2-bongos-chrome-b.jpg (black plates, dark mode, lighten) and their -cut.webp alpha twins (light mode); og-card.jpg (the social card, captured from the page)
@@ -359,6 +360,9 @@ tests/
359
360
  ├── 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.
360
361
  ├── 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.
361
362
  ├── privacy_matrix.mjs ← (task 1002973, goal 1000110, privacy spec D2/D3/D4): THE PRIVACY MATRIX as one table — a fixture account per D2 row (provisional, public shown, public hidden, private, private+discoverable, private+discoverable+hidden, opted out of recruiting) × every viewer (Anon, Builder, Recruiter, Self) × every cross-project surface that exists (`/profiles/:handle`, `/me/cross-project`, `/community/search`, `/community/leaderboard`, `/scouting`, `/scouting/:handle`), asserted against a literal transcription of the spec's cells; then the rules swept across EVERY recorded response (hidden numbers reach nobody but Self, private/provisional are absent, private+discoverable is named only by the sliver), the D3 key lists pinned, and an expired invite refused by the real `hasInvitedAccessRequest`. Real routers + real HTTP over in-memory tables filtered by each statement's own WHERE (boolean structure read, calibrated against the JS twins). The declined-invite row is task 1004444's. DB-free `unit` lane, asserted in the file itself.
363
+ ├── guild_engagement.mjs ← (task 1002303, goal 1000110, ADR 0365): a guild engaging a project through each member's own door, DB-free over the real routes — owner-only filing (the owner check inside the INSERT), one identical 404 for an unknown, inactive or non-public project, the inbox read's naming / joined-at rules and exclusions (no client_id out), invite-guild returning hall hand-off links for the PUBLIC roster only (unlisted == unknown), the join's `guild` resolving or 409ing with nothing relayed, no status anywhere. DB-free `unit` lane.
364
+ ├── guild_engagement_db.mjs ← (task 1002303): the same against real Postgres — migration 030 on 025 + 016, cascade on dissolve, SET NULL on the echo, the upsert restarting the 30-day window, a stale row invisible, a later joiner not seeing an invite. INTEGRATION lane; self-skips without a database.
365
+ ├── hub_engagement_cards.mjs ← (task 1002303, ADR 0365): the guild cards in `/projects?view=mine`'s invitations area, EXECUTED by the vm-slice idiom — "G is applying to P — apply with them?" and "P invited G", Apply sending the join with `guild`, the 409 `guild_engagement_gone` line with Apply on my own, rows missing a slug or an http(s) origin dropped, the section showing while either list has a row. DB-free `unit` lane.
362
366
  └── 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.
363
367
  ```
364
368
 
@@ -2939,5 +2939,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
2939
2939
  landed since 1.21.54 with no explicit bump. run 37248119513. (task 1002620)
2940
2940
  1.21.56 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2941
2941
  landed since 1.21.55 with no explicit bump. run 37249603605. (task 1002620)
2942
+ 1.21.57 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2943
+ landed since 1.21.56 with no explicit bump. run 37251840378. (task 1002620)
2944
+ 1.21.58 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2945
+ landed since 1.21.57 with no explicit bump. run 37257938390. (task 1002620)
2942
2946
  ---------------------------------------------------------------------------
2943
2947
  ```
@@ -10,10 +10,10 @@
10
10
  "An id changes only when the host prefix, the data-page value or the file name changes; that is a rename, and records keyed on the old id move with it."
11
11
  ],
12
12
  "counts": {
13
- "pages": 42,
13
+ "pages": 43,
14
14
  "surfaces": 3,
15
- "with_states": 35,
16
- "states": 273
15
+ "with_states": 36,
16
+ "states": 286
17
17
  },
18
18
  "surfaces": [
19
19
  {
@@ -30,7 +30,7 @@
30
30
  "at": "modules/public-landing/public",
31
31
  "answers_at": "apex root",
32
32
  "origin": "https://{apex}",
33
- "pages": 6
33
+ "pages": 7
34
34
  },
35
35
  {
36
36
  "id": "status",
@@ -1354,6 +1354,36 @@
1354
1354
  "states_files": [],
1355
1355
  "states": []
1356
1356
  },
1357
+ {
1358
+ "id": "landing:guild",
1359
+ "surface": "landing",
1360
+ "module": "public-landing",
1361
+ "page": "guild",
1362
+ "id_from": "file-name",
1363
+ "title": "{{productName}} — Guild",
1364
+ "document_title": "{{productName}} — Guild",
1365
+ "path": "/guild",
1366
+ "url": "https://{apex}/guild",
1367
+ "files": [
1368
+ "modules/public-landing/public/guild.html",
1369
+ "modules/public-landing/public/assets/cosmos.css",
1370
+ "modules/public-landing/public/assets/hub-bar.js"
1371
+ ],
1372
+ "states_files": [
1373
+ "modules/public-landing/public/guild.states.json"
1374
+ ],
1375
+ "states": [
1376
+ "out-public",
1377
+ "out-unlisted",
1378
+ "in-member",
1379
+ "in-unlisted-owner",
1380
+ "in-not-member",
1381
+ "in-missing",
1382
+ "in-owner-apply",
1383
+ "in-owner-applied",
1384
+ "in-profile-band"
1385
+ ]
1386
+ },
1357
1387
  {
1358
1388
  "id": "landing:index",
1359
1389
  "surface": "landing",
@@ -1437,6 +1467,10 @@
1437
1467
  "in-manage-kind",
1438
1468
  "in-manage-invite",
1439
1469
  "in-manage-invite-handoff",
1470
+ "in-manage-invite-guild",
1471
+ "in-mine-engagements",
1472
+ "in-mine-engagement-note",
1473
+ "in-mine-engagement-applied",
1440
1474
  "in-manage-app-live",
1441
1475
  "in-manage-app-building",
1442
1476
  "in-manage-app-failed",