@bongos/core 1.19.1026 → 1.19.1028

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 (39) hide show
  1. package/.bongos-core.json +77 -37
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +38 -0
  4. package/clients/bongos-client/index.cjs +38 -0
  5. package/clients/bongos-client/index.d.ts +60 -0
  6. package/clients/bongos-client/index.mjs +38 -0
  7. package/docs/adr/0213-platform-terms-acceptance-is-the-hubs-own-witness.md +4 -2
  8. package/docs/api/openapi.json +1345 -182
  9. package/docs/api-reference.md +29 -2
  10. package/docs/copy-inventory.md +209 -201
  11. package/docs/copy-registry.json +329 -257
  12. package/docs/module-api-changelog.md +4 -0
  13. package/modules/hall-ui/public/builders.js +7 -4
  14. package/modules/platform-identity/connections.js +1 -0
  15. package/modules/platform-identity/guilds.js +705 -0
  16. package/modules/platform-identity/migrations/platform_identity_025_guilds.sql +100 -0
  17. package/modules/platform-identity/module.json +1 -1
  18. package/modules/platform-identity/read-rate-limit.js +3 -2
  19. package/modules/platform-identity/routes/guilds-public.js +57 -0
  20. package/modules/platform-identity/routes/guilds.js +393 -0
  21. package/modules/platform-identity/terms-acceptance.js +14 -5
  22. package/modules/public-landing/public/assets/cosmos.css +36 -0
  23. package/modules/public-landing/public/projects.html +229 -26
  24. package/modules/public-landing/public/terms.html +3 -3
  25. package/modules/ui-design/kit/fixtures/my-projects__invites.json +1 -0
  26. package/modules/ui-design/kit/serve.js +12 -1
  27. package/package-lock.json +2 -2
  28. package/package.json +1 -1
  29. package/scripts/gds/run-unit-tests.js +5 -0
  30. package/src/module-api.js +1 -1
  31. package/tests/card_apply_ui.mjs +8 -1
  32. package/tests/curve_controls_delegation.mjs +87 -0
  33. package/tests/guilds_api.mjs +521 -0
  34. package/tests/guilds_db.mjs +343 -0
  35. package/tests/my_projects_surface.mjs +26 -14
  36. package/tests/own_scope_guard.mjs +5 -0
  37. package/tests/public_landing_projects.mjs +40 -0
  38. package/tests/terms_acceptance.mjs +74 -28
  39. package/tests/terms_grandfather_db.mjs +2 -2
@@ -27,6 +27,8 @@ Three things were found on picking the task up, and they changed its shape:
27
27
 
28
28
  This is deliberately the ADR 0205 D3 property, reused. An acceptance record a caller could assert is evidence of nothing; the only thing that makes the record mean "this human accepted" is that no request-controlled value can reach the statement that writes it. `ensureAccount` — the federated check-in / device-poll path, which takes an *unproven* `github_id` from a request body — writes NULL, exactly as it writes `provisional`.
29
29
 
30
+ > **Amended 2026-09-25 ([task 1003353](https://cloudbongos.com/builders#/task/1003353); [blocker 1000124](https://cloudbongos.com/builders#/blocker/1000124)) — what "the hub's own sign-in" means.** `GET /sso/authorize` is reached when a builder uses their platform account to sign in to a **project**; the only builder of that URL is a child instance's `idpAuthorizeUrl`. Signing in to the hub itself creates a hub session and never touches `platform_identity_accounts`, so it records no acceptance. `/terms` said "signed in here"; it now names a project sign-in. The owner chose to also capture the hub's own sign-in ([task 1003361](https://cloudbongos.com/builders#/task/1003361)), which will make this a second capture point rather than a wording fix. Two smaller corrections to the text above: the device poll does not go through `ensureAccount`, it is a non-activating `upsertAccount`, and so is `PATCH /me/handle`; `ensureAccount` is the federated membership check-in alone. The outcome was always the same (neither writes an acceptance), and both paths are now executed in `tests/terms_acceptance.mjs` rather than asserted as text.
31
+
30
32
  ### D2 — Written once. The first acceptance is the one that stands
31
33
 
32
34
  The conflict branch writes `COALESCE(platform_identity_accounts.terms_accepted_at, now())`. Signing in again re-reads the terms but does not restamp them, so the column keeps meaning *when consent was given* rather than *when this account was last seen*. `terms_version` is COALESCE'd the same way and always written in the same statement, so the pair cannot diverge.
@@ -58,10 +60,10 @@ The mechanism ships complete. The text of the new section is a draft on [blocker
58
60
  ## Consequences
59
61
 
60
62
  - The premise the public-profile surfaces rest on becomes true for every account activated from here, and fail-closed for every account that predates it.
61
- - **Every currently-`active` account is unpublished until its next hub sign-in** (D4). Reversible in one line; on the owner's blocker.
63
+ - ~~**Every currently-`active` account is unpublished until its next hub sign-in** (D4).~~ Superseded by the grandfather (amendment under D4): nothing went dark after migration 024.
62
64
  - `platform-identity.js` sat at 1497 lines against a hard `oversized_file_count: 0` ratchet, so the write-side SQL lives in a new `terms-acceptance.js` — the fifth instance of the "new file beside it" precedent (`account-visibility.js`, `application-echo.js`, `routes/connections.js`, `src/bongos/routes/my-sessions.js`). The file now measures exactly 1500 and **has no headroom left**; the next change to it must shrink it.
63
65
  - The read/write split is load-bearing: `terms-acceptance.js` owns only statements that SET the columns, `account-visibility.js` owns the one that TESTS them. The guard's spelling rules deliberately do not match writes, which is what lets both files exist without one of them being a drift copy.
64
- - **Settings will read wrong for a legacy account under D4** until someone closes it: `GET /me/cross-project` returns `profile_state` raw and the Settings consent note branches on it alone, so an account that signed in before the terms existed reads "active" while its profile is published nowhere. One own-scope boolean plus a copy change fixes it - filed as idea 1000875, and it disappears entirely if the owner grandfathers on blocker 1000123.
66
+ - *(Superseded by the grandfather, amendment under D4: after migration 024 every `active` account has an acceptance, so the case below no longer arises.)* **Settings will read wrong for a legacy account under D4** until someone closes it: `GET /me/cross-project` returns `profile_state` raw and the Settings consent note branches on it alone, so an account that signed in before the terms existed reads "active" while its profile is published nowhere. One own-scope boolean plus a copy change fixes it - filed as idea 1000875, and it disappears entirely if the owner grandfathers on blocker 1000123.
65
67
  - `docs/specs/<redacted>.md`'s standing note that the consent premise "is not currently true for every account" is now addressed rather than outstanding.
66
68
 
67
69
  ## Rejected alternatives