@bongos/core 1.19.1026 → 1.19.1027

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.
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.1026",
6
- "core_contract": "1.19.1026",
7
- "source_commit": "7c884f0248b594a73ef78097031ee52706b2ab4d",
5
+ "core_version": "1.19.1027",
6
+ "core_contract": "1.19.1027",
7
+ "source_commit": "6ba25af665a2f544e86c0fafd73c402ca5716cad",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-25T20:35:40.664Z",
9
+ "built_at": "2026-09-25T20:46:56.140Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 529,
13
13
  "agent_docs_stubbed": 26,
14
- "functional_verbatim": 2451,
14
+ "functional_verbatim": 2457,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3006,
20
- "tree_sha256": "ad4178b0a78588ad05270cd003c975b5e6bf842c523807dca0830bc39bb4e228",
19
+ "file_count": 3012,
20
+ "tree_sha256": "850a42b363b6a246877f08bb5cede160376f9e87f453846139ba8351fa666b97",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -352,12 +352,12 @@
352
352
  {
353
353
  "path": "clients/bongos-client/README.md",
354
354
  "mode": "0000644",
355
- "sha256": "799e58c1a74db1a78f39ba5d0344a9e8b24345a1d6f789d2a3ba3af7b72bf1fe"
355
+ "sha256": "217dec95a590eee3d3b3e7e7670882ff4851d596b9a3329215d563ab9509f5f7"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/bongos-client.global.js",
359
359
  "mode": "0000644",
360
- "sha256": "09f0016d9dab256d7e7964f41baca3cee29522ff0a6897aae97d5c3ce666b9f4"
360
+ "sha256": "f96abe3e0fad14745f5aa2f578e28316cf1c24cffa32aa389db2671ec0daa4b7"
361
361
  },
362
362
  {
363
363
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -367,17 +367,17 @@
367
367
  {
368
368
  "path": "clients/bongos-client/index.cjs",
369
369
  "mode": "0000644",
370
- "sha256": "09a9eb70bfc1249ad9a184613a3e8f17441a85c339deda809d980799c84be5f0"
370
+ "sha256": "c4a5ecc76df6099d9e1bd3e76ed0164b460e61aaf34de46fa023e22c8781a122"
371
371
  },
372
372
  {
373
373
  "path": "clients/bongos-client/index.d.ts",
374
374
  "mode": "0000644",
375
- "sha256": "aa1e1f51220283664f065f090129af0f45c04343b2f0d0452b6b6d4c4bc894d1"
375
+ "sha256": "5f6b4bc9bb1f216cdedc6a74679d2e38f72ad9a1c561411e39a571d632dccf3d"
376
376
  },
377
377
  {
378
378
  "path": "clients/bongos-client/index.mjs",
379
379
  "mode": "0000644",
380
- "sha256": "4a6ae5ad6edbe36cc099bda8df7bf6d3086661c8703d01637a1ac9adbc73679c"
380
+ "sha256": "de19e3ed58c7ba6792de3c1781e3b7fa8342643c35daf713a9cf4290ae61fbbd"
381
381
  },
382
382
  {
383
383
  "path": "clients/bongos-client/package.json",
@@ -1562,7 +1562,7 @@
1562
1562
  {
1563
1563
  "path": "docs/adr/0213-platform-terms-acceptance-is-the-hubs-own-witness.md",
1564
1564
  "mode": "0000644",
1565
- "sha256": "039edd287f0aeb2d64e85bddad1c83436357b77ce087d1dbd5f6d19885303f75"
1565
+ "sha256": "fd6c8d2e3868f2ba42262406b9fbd9ba12cb547a9eac61ddb7b9422afde6b3ab"
1566
1566
  },
1567
1567
  {
1568
1568
  "path": "docs/adr/0214-canonical-profile-url-one-resolver-dark-until-the-page-exists.md",
@@ -2192,12 +2192,12 @@
2192
2192
  {
2193
2193
  "path": "docs/api-reference.md",
2194
2194
  "mode": "0000644",
2195
- "sha256": "628c6ce6d0dfdaf518081069699a04b32c37eff61ef51b43f849fd1febfe9873"
2195
+ "sha256": "d6cad3e0d4212d9e595905f44b506e6d656526288b93e00631438c81a829f9bf"
2196
2196
  },
2197
2197
  {
2198
2198
  "path": "docs/api/openapi.json",
2199
2199
  "mode": "0000644",
2200
- "sha256": "a8d09e50133db28d1af1c6214984cd474cc064996252812ab4cdc56e8abcdc02"
2200
+ "sha256": "41bfca24af08bc206253d9288e14c71d6a92e2ccc3669af3752319e86ea42831"
2201
2201
  },
2202
2202
  {
2203
2203
  "path": "docs/architecture.md",
@@ -2222,12 +2222,12 @@
2222
2222
  {
2223
2223
  "path": "docs/copy-inventory.md",
2224
2224
  "mode": "0000644",
2225
- "sha256": "d35a354da2a802369f229f078ecad6af4e9795e3b8c3c33cde5baddad6fe29cb"
2225
+ "sha256": "7d0160679343e6b05d78c9cd1fcfa56c214020d5360ee11385f008e829a16d71"
2226
2226
  },
2227
2227
  {
2228
2228
  "path": "docs/copy-registry.json",
2229
2229
  "mode": "0000644",
2230
- "sha256": "aa10b864198f56d4f8dbe86b1e89f340e43bd3f03159b89282fb1ce008aadc3b"
2230
+ "sha256": "28f74fca91a4b66a70d996c953073e1c01cd3a8c2ca90fdde915ccbdc4294cbf"
2231
2231
  },
2232
2232
  {
2233
2233
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2757,7 +2757,7 @@
2757
2757
  {
2758
2758
  "path": "docs/module-api-changelog.md",
2759
2759
  "mode": "0000644",
2760
- "sha256": "99f4d160094c9387e0ecd96f36e18d5ff8338714c64ad1bba2aa826a6cc5f618"
2760
+ "sha256": "27d5ece78124b128720d5b52d545efd8c5dae978931f254e59ef5f4abeb5e375"
2761
2761
  },
2762
2762
  {
2763
2763
  "path": "docs/modules-contract.md",
@@ -6487,7 +6487,12 @@
6487
6487
  {
6488
6488
  "path": "modules/platform-identity/connections.js",
6489
6489
  "mode": "0000644",
6490
- "sha256": "b58280a24ff5eb364aa95bf97bb80b75c8a4fe0a4d0cc224072663cb8687edd0"
6490
+ "sha256": "793e96feacef39ec52166dd7372c894a25679c7137c9c3c5e9df38ec323f1c4a"
6491
+ },
6492
+ {
6493
+ "path": "modules/platform-identity/guilds.js",
6494
+ "mode": "0000644",
6495
+ "sha256": "5f1189de2d33fe550b4a84b8105ccb0a0b60a08d342fde6c9bfcec30b969d4ff"
6491
6496
  },
6492
6497
  {
6493
6498
  "path": "modules/platform-identity/hub-device.js",
@@ -6629,10 +6634,15 @@
6629
6634
  "mode": "0000644",
6630
6635
  "sha256": "1a1a2a8861a11e93da73db38362353409edf988fdb7b1c025c1030acb29da937"
6631
6636
  },
6637
+ {
6638
+ "path": "modules/platform-identity/migrations/platform_identity_025_guilds.sql",
6639
+ "mode": "0000644",
6640
+ "sha256": "72be4f7e3aa3afa47dd78de7a57dcdf57b877675b44fbdf02f6607a8632e1787"
6641
+ },
6632
6642
  {
6633
6643
  "path": "modules/platform-identity/module.json",
6634
6644
  "mode": "0000644",
6635
- "sha256": "3fc51261ee5262a5a9442e514e3706a055f9994723bd33f83e567ec881e9f6b6"
6645
+ "sha256": "bb9a7c6bc98e138dd49634e72bf04fcff80b7d0625106ea752da9d89311bc3f5"
6636
6646
  },
6637
6647
  {
6638
6648
  "path": "modules/platform-identity/origin-containment.js",
@@ -6677,7 +6687,7 @@
6677
6687
  {
6678
6688
  "path": "modules/platform-identity/read-rate-limit.js",
6679
6689
  "mode": "0000644",
6680
- "sha256": "50469113a1305d83b418fc7c7bc4438d9d7992aaca2e96ba8df0b2ed240c0158"
6690
+ "sha256": "db17891c79447950b68d55e6e81db6f3c524491bac5ee1caa375b0611c3248c7"
6681
6691
  },
6682
6692
  {
6683
6693
  "path": "modules/platform-identity/recruiter-sliver.js",
@@ -6699,6 +6709,16 @@
6699
6709
  "mode": "0000644",
6700
6710
  "sha256": "6132e21ae24783f11796b5084067622742dd5c05b17a2c74780d734e337f8dfc"
6701
6711
  },
6712
+ {
6713
+ "path": "modules/platform-identity/routes/guilds-public.js",
6714
+ "mode": "0000644",
6715
+ "sha256": "1a8d2d70d4b9f5e4cfc93bd1f6d83911ab625463866527838d74944162f978de"
6716
+ },
6717
+ {
6718
+ "path": "modules/platform-identity/routes/guilds.js",
6719
+ "mode": "0000644",
6720
+ "sha256": "96ca33e6753cbacc40af0c1b766ec637fa6168692a5c6260ff25882d27beb6a2"
6721
+ },
6702
6722
  {
6703
6723
  "path": "modules/platform-identity/routes/my-projects.js",
6704
6724
  "mode": "0000644",
@@ -6742,7 +6762,7 @@
6742
6762
  {
6743
6763
  "path": "modules/platform-identity/terms-acceptance.js",
6744
6764
  "mode": "0000644",
6745
- "sha256": "e72b73f528149d438150e26c02e5b4b8d14a4b03941c5e917c5775506dcb0e0b"
6765
+ "sha256": "00d3d1460d1fa0d224e487a1701309b4725f2872a36a0cfe283cbd21b96d1e53"
6746
6766
  },
6747
6767
  {
6748
6768
  "path": "modules/platform-identity/tests/activity-snapshots.mjs",
@@ -7582,7 +7602,7 @@
7582
7602
  {
7583
7603
  "path": "modules/public-landing/public/terms.html",
7584
7604
  "mode": "0000644",
7585
- "sha256": "440fb5159b45e03c5743c93068a54f81ad1a67e9d863a32b15a0cc554024585a"
7605
+ "sha256": "5f03b04a5e3d02c24941c7223a39e749e4123aabbbadf966c2c0da9b25788104"
7586
7606
  },
7587
7607
  {
7588
7608
  "path": "modules/security/CLAUDE.md",
@@ -8337,12 +8357,12 @@
8337
8357
  {
8338
8358
  "path": "package-lock.json",
8339
8359
  "mode": "0000644",
8340
- "sha256": "170293a219ad01cf0472d65b0e34ca7bcad8f55ab9375cda9374662160dd5774"
8360
+ "sha256": "6ace585be8981c530bb44df30385a399e2c6bc4ef4611ec01f3139884e9ea4dd"
8341
8361
  },
8342
8362
  {
8343
8363
  "path": "package.json",
8344
8364
  "mode": "0000644",
8345
- "sha256": "95cc86daa3d8a830540662ff083d2f00c0ae82fecd12546c6523a1ddc29a8b4b"
8365
+ "sha256": "29c0b258397c7ddee59eb7de9466c98c842865e84c6272b4c262580477217f13"
8346
8366
  },
8347
8367
  {
8348
8368
  "path": "public-docs/index.html",
@@ -9467,7 +9487,7 @@
9467
9487
  {
9468
9488
  "path": "scripts/gds/run-unit-tests.js",
9469
9489
  "mode": "0000644",
9470
- "sha256": "7b884397d2ed141c3f2cea55689517a350c68eee8f543fb6eb88dfbe60d116d8"
9490
+ "sha256": "fa6c19a9c41d9613af2980cd6f16193cd8aef8621fb517eb2372db042e69dd41"
9471
9491
  },
9472
9492
  {
9473
9493
  "path": "scripts/gds/runner-drift.js",
@@ -10387,7 +10407,7 @@
10387
10407
  {
10388
10408
  "path": "src/module-api.js",
10389
10409
  "mode": "0000644",
10390
- "sha256": "9d40b263991898abf849c1825b81673dc2a0e8663f5775cd62c6c312441691d6"
10410
+ "sha256": "2eff6ba98309a16a555bef613cae5f9be68bfe516f60f8e6862c6313f171a4b6"
10391
10411
  },
10392
10412
  {
10393
10413
  "path": "src/module-loader/catalog.js",
@@ -12314,6 +12334,16 @@
12314
12334
  "mode": "0000644",
12315
12335
  "sha256": "8298006ae35010d726bcac8a2d351a5aa932d2ee6d5b53ed7b8a5c095ca5e54f"
12316
12336
  },
12337
+ {
12338
+ "path": "tests/guilds_api.mjs",
12339
+ "mode": "0000644",
12340
+ "sha256": "9124d0f1e8edfd91b97fc7226a0f4f68638261c5dfa36954bedf6af95d24ec07"
12341
+ },
12342
+ {
12343
+ "path": "tests/guilds_db.mjs",
12344
+ "mode": "0000644",
12345
+ "sha256": "f4d974c9fd565ff6b81f3a3183e2c933e93b35d731b87505513b32ddd3daf337"
12346
+ },
12317
12347
  {
12318
12348
  "path": "tests/hall_audit.mjs",
12319
12349
  "mode": "0000644",
@@ -13302,7 +13332,7 @@
13302
13332
  {
13303
13333
  "path": "tests/own_scope_guard.mjs",
13304
13334
  "mode": "0000644",
13305
- "sha256": "4eb0b6dc31b0945b47979253bc39a4bcaa0fbe6ac538ceb2565ce9cd4563b221"
13335
+ "sha256": "e9ad80ce9837076d550dbb4b77a4c0f01f087ad3e515f8af8a672221af995ca4"
13306
13336
  },
13307
13337
  {
13308
13338
  "path": "tests/own_session_revoke.mjs",
@@ -14747,12 +14777,12 @@
14747
14777
  {
14748
14778
  "path": "tests/terms_acceptance.mjs",
14749
14779
  "mode": "0000644",
14750
- "sha256": "3dba45ebddb94b2f7d656f53c2d303cda08455738df42e9be78d75d41b2bae2e"
14780
+ "sha256": "3478460c1ac70d6cef984688f513251b5e090c4324190db9895e014a54666e2b"
14751
14781
  },
14752
14782
  {
14753
14783
  "path": "tests/terms_grandfather_db.mjs",
14754
14784
  "mode": "0000644",
14755
- "sha256": "bfaac6724700e7e2bbe2914bb3c456fa1b0fd25990764b15008f187a40d4c791"
14785
+ "sha256": "48502dc0bbf19d679faadde8bd7fa5a811957808a3e4d41cc661d3f69d88ced8"
14756
14786
  },
14757
14787
  {
14758
14788
  "path": "tests/test_path_guard.mjs",
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
5
5
  by hand; it regenerates when the spec changes, so it can never drift from the routes.
6
6
 
7
7
  - API version: **v1** (served at `/api/bongos/v1`)
8
- - 420 operations across 63 resource groups
8
+ - 437 operations across 65 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -494,6 +494,40 @@ function createClient(opts = {}) {
494
494
  // GET /grades/by-builder — rank: metic+archon — GET /grades/by-builder
495
495
  getGradesByBuilder: (args) => request("GET", "/grades/by-builder", { hasBody: false }, args),
496
496
  },
497
+ "guildRequests": {
498
+ // DELETE /guild-requests/{id} — rank: any-builder — DELETE /guild-requests/:id
499
+ deleteGuildRequestsId: (args) => request("DELETE", "/guild-requests/{id}", { hasBody: false }, args),
500
+ // POST /guild-requests/{id}/accept — rank: any-builder — POST /guild-requests/:id/accept
501
+ postGuildRequestsIdAccept: (args) => request("POST", "/guild-requests/{id}/accept", { hasBody: true }, args),
502
+ // POST /guild-requests/{id}/decline — rank: any-builder — POST /guild-requests/:id/decline
503
+ postGuildRequestsIdDecline: (args) => request("POST", "/guild-requests/{id}/decline", { hasBody: true }, args),
504
+ },
505
+ "guilds": {
506
+ // POST /guilds — rank: any-builder — POST /guilds
507
+ postGuilds: (args) => request("POST", "/guilds", { hasBody: true }, args),
508
+ // DELETE /guilds/{slug} — rank: any-builder — DELETE /guilds/:slug
509
+ deleteGuildsSlug: (args) => request("DELETE", "/guilds/{slug}", { hasBody: false }, args),
510
+ // GET /guilds/{slug} — rank: public — GET /guilds/:slug
511
+ getGuildsSlug: (args) => request("GET", "/guilds/{slug}", { hasBody: false }, args),
512
+ // PATCH /guilds/{slug} — rank: any-builder — PATCH /guilds/:slug
513
+ patchGuildsSlug: (args) => request("PATCH", "/guilds/{slug}", { hasBody: true }, args),
514
+ // POST /guilds/{slug}/invites — rank: any-builder — POST /guilds/:slug/invites
515
+ postGuildsSlugInvites: (args) => request("POST", "/guilds/{slug}/invites", { hasBody: true }, args),
516
+ // GET /guilds/{slug}/members — rank: any-builder — GET /guilds/:slug/members
517
+ getGuildsSlugMembers: (args) => request("GET", "/guilds/{slug}/members", { hasBody: false }, args),
518
+ // DELETE /guilds/{slug}/members/{handle} — rank: any-builder — DELETE /guilds/:slug/members/:handle
519
+ deleteGuildsSlugMembersHandle: (args) => request("DELETE", "/guilds/{slug}/members/{handle}", { hasBody: false }, args),
520
+ // DELETE /guilds/{slug}/membership — rank: any-builder — DELETE /guilds/:slug/membership
521
+ deleteGuildsSlugMembership: (args) => request("DELETE", "/guilds/{slug}/membership", { hasBody: false }, args),
522
+ // PATCH /guilds/{slug}/membership — rank: any-builder — PATCH /guilds/:slug/membership
523
+ patchGuildsSlugMembership: (args) => request("PATCH", "/guilds/{slug}/membership", { hasBody: true }, args),
524
+ // GET /guilds/{slug}/requests — rank: any-builder — GET /guilds/:slug/requests
525
+ getGuildsSlugRequests: (args) => request("GET", "/guilds/{slug}/requests", { hasBody: false }, args),
526
+ // POST /guilds/{slug}/requests — rank: any-builder — POST /guilds/:slug/requests
527
+ postGuildsSlugRequests: (args) => request("POST", "/guilds/{slug}/requests", { hasBody: true }, args),
528
+ // POST /guilds/{slug}/transfer — rank: any-builder — POST /guilds/:slug/transfer
529
+ postGuildsSlugTransfer: (args) => request("POST", "/guilds/{slug}/transfer", { hasBody: true }, args),
530
+ },
497
531
  "healthz": {
498
532
  // GET /healthz — rank: public — GET /healthz
499
533
  getHealthz: (args) => request("GET", "/healthz", { hasBody: false }, args),
@@ -601,6 +635,10 @@ function createClient(opts = {}) {
601
635
  getMeEventSoundPrefs: (args) => request("GET", "/me/event-sound-prefs", { hasBody: false }, args),
602
636
  // PATCH /me/event-sound-prefs — rank: any-builder — PATCH /me/event-sound-prefs
603
637
  patchMeEventSoundPrefs: (args) => request("PATCH", "/me/event-sound-prefs", { hasBody: true }, args),
638
+ // GET /me/guild-requests — rank: any-builder — GET /me/guild-requests
639
+ getMeGuildRequests: (args) => request("GET", "/me/guild-requests", { hasBody: false }, args),
640
+ // GET /me/guilds — rank: any-builder — GET /me/guilds
641
+ getMeGuilds: (args) => request("GET", "/me/guilds", { hasBody: false }, args),
604
642
  // PATCH /me/handle — rank: any-builder — PATCH /me/handle
605
643
  patchMeHandle: (args) => request("PATCH", "/me/handle", { hasBody: true }, args),
606
644
  // GET /me/interaction — rank: any-builder — GET /me/interaction
@@ -493,6 +493,40 @@ function createClient(opts = {}) {
493
493
  // GET /grades/by-builder — rank: metic+archon — GET /grades/by-builder
494
494
  getGradesByBuilder: (args) => request("GET", "/grades/by-builder", { hasBody: false }, args),
495
495
  },
496
+ "guildRequests": {
497
+ // DELETE /guild-requests/{id} — rank: any-builder — DELETE /guild-requests/:id
498
+ deleteGuildRequestsId: (args) => request("DELETE", "/guild-requests/{id}", { hasBody: false }, args),
499
+ // POST /guild-requests/{id}/accept — rank: any-builder — POST /guild-requests/:id/accept
500
+ postGuildRequestsIdAccept: (args) => request("POST", "/guild-requests/{id}/accept", { hasBody: true }, args),
501
+ // POST /guild-requests/{id}/decline — rank: any-builder — POST /guild-requests/:id/decline
502
+ postGuildRequestsIdDecline: (args) => request("POST", "/guild-requests/{id}/decline", { hasBody: true }, args),
503
+ },
504
+ "guilds": {
505
+ // POST /guilds — rank: any-builder — POST /guilds
506
+ postGuilds: (args) => request("POST", "/guilds", { hasBody: true }, args),
507
+ // DELETE /guilds/{slug} — rank: any-builder — DELETE /guilds/:slug
508
+ deleteGuildsSlug: (args) => request("DELETE", "/guilds/{slug}", { hasBody: false }, args),
509
+ // GET /guilds/{slug} — rank: public — GET /guilds/:slug
510
+ getGuildsSlug: (args) => request("GET", "/guilds/{slug}", { hasBody: false }, args),
511
+ // PATCH /guilds/{slug} — rank: any-builder — PATCH /guilds/:slug
512
+ patchGuildsSlug: (args) => request("PATCH", "/guilds/{slug}", { hasBody: true }, args),
513
+ // POST /guilds/{slug}/invites — rank: any-builder — POST /guilds/:slug/invites
514
+ postGuildsSlugInvites: (args) => request("POST", "/guilds/{slug}/invites", { hasBody: true }, args),
515
+ // GET /guilds/{slug}/members — rank: any-builder — GET /guilds/:slug/members
516
+ getGuildsSlugMembers: (args) => request("GET", "/guilds/{slug}/members", { hasBody: false }, args),
517
+ // DELETE /guilds/{slug}/members/{handle} — rank: any-builder — DELETE /guilds/:slug/members/:handle
518
+ deleteGuildsSlugMembersHandle: (args) => request("DELETE", "/guilds/{slug}/members/{handle}", { hasBody: false }, args),
519
+ // DELETE /guilds/{slug}/membership — rank: any-builder — DELETE /guilds/:slug/membership
520
+ deleteGuildsSlugMembership: (args) => request("DELETE", "/guilds/{slug}/membership", { hasBody: false }, args),
521
+ // PATCH /guilds/{slug}/membership — rank: any-builder — PATCH /guilds/:slug/membership
522
+ patchGuildsSlugMembership: (args) => request("PATCH", "/guilds/{slug}/membership", { hasBody: true }, args),
523
+ // GET /guilds/{slug}/requests — rank: any-builder — GET /guilds/:slug/requests
524
+ getGuildsSlugRequests: (args) => request("GET", "/guilds/{slug}/requests", { hasBody: false }, args),
525
+ // POST /guilds/{slug}/requests — rank: any-builder — POST /guilds/:slug/requests
526
+ postGuildsSlugRequests: (args) => request("POST", "/guilds/{slug}/requests", { hasBody: true }, args),
527
+ // POST /guilds/{slug}/transfer — rank: any-builder — POST /guilds/:slug/transfer
528
+ postGuildsSlugTransfer: (args) => request("POST", "/guilds/{slug}/transfer", { hasBody: true }, args),
529
+ },
496
530
  "healthz": {
497
531
  // GET /healthz — rank: public — GET /healthz
498
532
  getHealthz: (args) => request("GET", "/healthz", { hasBody: false }, args),
@@ -600,6 +634,10 @@ function createClient(opts = {}) {
600
634
  getMeEventSoundPrefs: (args) => request("GET", "/me/event-sound-prefs", { hasBody: false }, args),
601
635
  // PATCH /me/event-sound-prefs — rank: any-builder — PATCH /me/event-sound-prefs
602
636
  patchMeEventSoundPrefs: (args) => request("PATCH", "/me/event-sound-prefs", { hasBody: true }, args),
637
+ // GET /me/guild-requests — rank: any-builder — GET /me/guild-requests
638
+ getMeGuildRequests: (args) => request("GET", "/me/guild-requests", { hasBody: false }, args),
639
+ // GET /me/guilds — rank: any-builder — GET /me/guilds
640
+ getMeGuilds: (args) => request("GET", "/me/guilds", { hasBody: false }, args),
603
641
  // PATCH /me/handle — rank: any-builder — PATCH /me/handle
604
642
  patchMeHandle: (args) => request("PATCH", "/me/handle", { hasBody: true }, args),
605
643
  // GET /me/interaction — rank: any-builder — GET /me/interaction
@@ -11,6 +11,10 @@ export interface DeleteConnectionsIdResponse { outcome: unknown }
11
11
  export interface DeleteDependenciesResponse { ok: boolean }
12
12
  export interface DeleteGovernmentAssignmentsBuilderIdRankKeyResponse { ok: boolean; builder_id: unknown; rank_key: unknown; removed: unknown }
13
13
  export interface DeleteGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; removed: unknown }
14
+ export interface DeleteGuildRequestsIdResponse { outcome: unknown }
15
+ export interface DeleteGuildsSlugMembersHandleResponse { outcome: unknown }
16
+ export interface DeleteGuildsSlugMembershipResponse { outcome: unknown }
17
+ export interface DeleteGuildsSlugResponse { outcome: unknown }
14
18
  export interface DeleteInboxIdSparkResponse { idea: unknown; sparked: boolean; unchanged: boolean }
15
19
  export interface DeleteMemoryFileResponse { deleted: boolean; builder_id: unknown; path: unknown }
16
20
  export interface DeleteProvisioningInstancesIdEnvManifestVarIdResponse { ok: boolean; removed: boolean; message: unknown }
@@ -71,6 +75,9 @@ export interface GetGovernmentAssignmentsResponse { assignments: unknown }
71
75
  export interface GetGovernmentPermissionsResponse { permissions: unknown; principals: unknown }
72
76
  export interface GetGovernmentRanksResponse { ranks: unknown }
73
77
  export interface GetGradesByBuilderResponse { window_days: unknown; builders: unknown }
78
+ export interface GetGuildsSlugMembersResponse { guild: unknown; you: unknown; members: unknown; count: unknown }
79
+ export interface GetGuildsSlugRequestsResponse { incoming: unknown; outgoing: unknown; incoming_count: unknown; outgoing_count: unknown }
80
+ export interface GetGuildsSlugResponse { guild: unknown; members: unknown; size: unknown }
74
81
  export interface GetHealthzResponse { ok: boolean; auth_configured: unknown }
75
82
  export interface GetHelpRequestsArchiveResponse { asked_of_you: unknown; asked_of_others: unknown; count: unknown; crafts: unknown }
76
83
  export interface GetHelpRequestsForMeResponse { help_requests: unknown; count: unknown; crafts: unknown }
@@ -90,6 +97,8 @@ export interface GetMeAchievementsResponse { unlocked: unknown }
90
97
  export interface GetMeCrossProjectResponse { hide_stats: boolean; profile_state: unknown; handle: unknown; display_name: unknown; bio: unknown; links: unknown; cross_project: unknown; account_visibility: unknown; recruiter_discoverable: unknown; recruiter_discoverable_effective: unknown }
91
98
  export interface GetMeDisplayNameResponse { display_name: unknown; max_length: unknown }
92
99
  export interface GetMeEventSoundPrefsResponse { prefs: unknown; effective: unknown; effective_wav: unknown; events: unknown }
100
+ export interface GetMeGuildRequestsResponse { incoming: unknown; outgoing: unknown; incoming_count: unknown; outgoing_count: unknown }
101
+ export interface GetMeGuildsResponse { guilds: unknown; count: unknown }
93
102
  export interface GetMeRecentShipsResponse { ships: unknown }
94
103
  export interface GetMeSessionsResponse { sessions: unknown }
95
104
  export interface GetMeSkillPrefsResponse { prefs: unknown; effective: unknown; defaults: unknown; known_skills: unknown; allowed_models: unknown }
@@ -179,6 +188,9 @@ export interface PatchDoneWhenCriterionIdRequest { criterion_md?: string; goal_i
179
188
  export interface PatchDoneWhenCriterionIdResponse { ok: boolean; criterion: unknown; deltas: unknown; unchanged: unknown; achieved_goals: unknown }
180
189
  export interface PatchGoalsIdMembersBuilderIdRequest { membership_kind: string }
181
190
  export interface PatchGoalsIdMembersBuilderIdResponse { ok: boolean; member: unknown; changed: boolean }
191
+ export interface PatchGuildsSlugMembershipRequest { shown_publicly?: boolean; counted_in_totals?: unknown }
192
+ export interface PatchGuildsSlugRequest { name?: string; description?: string; visibility?: string }
193
+ export interface PatchGuildsSlugResponse { guild: unknown }
182
194
  export interface PatchHelpRequestsIdRequest { status: "answered" | "withdrawn" }
183
195
  export interface PatchHelpRequestsIdResponse { ok: boolean; help_request: unknown }
184
196
  export interface PatchInboxIdBodyRequest { body_md: string }
@@ -330,6 +342,16 @@ export interface PostGovernmentBoardItemsResponse { ok: boolean; amendment: unkn
330
342
  export interface PostGovernmentRanksRankKeyResetResponse { ok: boolean; rank_key: unknown; seeded_rank: unknown; permission_count: unknown }
331
343
  export interface PostGovernmentRanksRequest { rank_key: string; label: string; description?: string }
332
344
  export interface PostGovernmentRanksResponse { rank: unknown }
345
+ export interface PostGuildRequestsIdAcceptRequest { visibility?: string; counted_in_totals?: unknown }
346
+ export interface PostGuildRequestsIdAcceptResponse { status: unknown }
347
+ export interface PostGuildsRequest { slug: string; name: string; description?: string; visibility: string }
348
+ export interface PostGuildsResponse { guild: unknown }
349
+ export interface PostGuildsSlugInvitesRequest { handles: string[] }
350
+ export interface PostGuildsSlugInvitesResponse { results: unknown; count: unknown }
351
+ export interface PostGuildsSlugRequestsRequest { counted_in_totals?: unknown }
352
+ export interface PostGuildsSlugRequestsResponse { status: unknown }
353
+ export interface PostGuildsSlugTransferRequest { handle: string }
354
+ export interface PostGuildsSlugTransferResponse { outcome: unknown }
333
355
  export interface PostHelpRequestsIdRepliesRequest { body: string }
334
356
  export interface PostHelpRequestsIdRepliesResponse { ok: boolean; reply: unknown }
335
357
  export interface PostHelpRequestsRequest { needs_craft?: string; needs_builder_id?: number; what_is_stuck: string; task_id?: number; goal_id?: number }
@@ -884,6 +906,40 @@ export interface BongosClient {
884
906
  /** GET /grades/by-builder — rank: metic+archon */
885
907
  getGradesByBuilder(args?: RequestArgs): Promise<GetGradesByBuilderResponse>;
886
908
  };
909
+ "guildRequests": {
910
+ /** DELETE /guild-requests/{id} — rank: any-builder */
911
+ deleteGuildRequestsId(args?: RequestArgs): Promise<DeleteGuildRequestsIdResponse>;
912
+ /** POST /guild-requests/{id}/accept — rank: any-builder */
913
+ postGuildRequestsIdAccept(args?: RequestArgs & { body?: PostGuildRequestsIdAcceptRequest }): Promise<PostGuildRequestsIdAcceptResponse>;
914
+ /** POST /guild-requests/{id}/decline — rank: any-builder */
915
+ postGuildRequestsIdDecline(args?: RequestArgs): Promise<ApiResponse>;
916
+ };
917
+ "guilds": {
918
+ /** POST /guilds — rank: any-builder */
919
+ postGuilds(args: RequestArgs & { body: PostGuildsRequest }): Promise<PostGuildsResponse>;
920
+ /** DELETE /guilds/{slug} — rank: any-builder */
921
+ deleteGuildsSlug(args?: RequestArgs): Promise<DeleteGuildsSlugResponse>;
922
+ /** GET /guilds/{slug} — rank: public */
923
+ getGuildsSlug(args?: RequestArgs): Promise<GetGuildsSlugResponse>;
924
+ /** PATCH /guilds/{slug} — rank: any-builder */
925
+ patchGuildsSlug(args?: RequestArgs & { body?: PatchGuildsSlugRequest }): Promise<PatchGuildsSlugResponse>;
926
+ /** POST /guilds/{slug}/invites — rank: any-builder */
927
+ postGuildsSlugInvites(args: RequestArgs & { body: PostGuildsSlugInvitesRequest }): Promise<PostGuildsSlugInvitesResponse>;
928
+ /** GET /guilds/{slug}/members — rank: any-builder */
929
+ getGuildsSlugMembers(args?: RequestArgs): Promise<GetGuildsSlugMembersResponse>;
930
+ /** DELETE /guilds/{slug}/members/{handle} — rank: any-builder */
931
+ deleteGuildsSlugMembersHandle(args?: RequestArgs): Promise<DeleteGuildsSlugMembersHandleResponse>;
932
+ /** DELETE /guilds/{slug}/membership — rank: any-builder */
933
+ deleteGuildsSlugMembership(args?: RequestArgs): Promise<DeleteGuildsSlugMembershipResponse>;
934
+ /** PATCH /guilds/{slug}/membership — rank: any-builder */
935
+ patchGuildsSlugMembership(args?: RequestArgs & { body?: PatchGuildsSlugMembershipRequest }): Promise<ApiResponse>;
936
+ /** GET /guilds/{slug}/requests — rank: any-builder */
937
+ getGuildsSlugRequests(args?: RequestArgs): Promise<GetGuildsSlugRequestsResponse>;
938
+ /** POST /guilds/{slug}/requests — rank: any-builder */
939
+ postGuildsSlugRequests(args?: RequestArgs & { body?: PostGuildsSlugRequestsRequest }): Promise<PostGuildsSlugRequestsResponse>;
940
+ /** POST /guilds/{slug}/transfer — rank: any-builder */
941
+ postGuildsSlugTransfer(args: RequestArgs & { body: PostGuildsSlugTransferRequest }): Promise<PostGuildsSlugTransferResponse>;
942
+ };
887
943
  "healthz": {
888
944
  /** GET /healthz — rank: public */
889
945
  getHealthz(args?: RequestArgs): Promise<GetHealthzResponse>;
@@ -991,6 +1047,10 @@ export interface BongosClient {
991
1047
  getMeEventSoundPrefs(args?: RequestArgs): Promise<GetMeEventSoundPrefsResponse>;
992
1048
  /** PATCH /me/event-sound-prefs — rank: any-builder */
993
1049
  patchMeEventSoundPrefs(args?: RequestArgs): Promise<PatchMeEventSoundPrefsResponse>;
1050
+ /** GET /me/guild-requests — rank: any-builder */
1051
+ getMeGuildRequests(args?: RequestArgs): Promise<GetMeGuildRequestsResponse>;
1052
+ /** GET /me/guilds — rank: any-builder */
1053
+ getMeGuilds(args?: RequestArgs): Promise<GetMeGuildsResponse>;
994
1054
  /** PATCH /me/handle — rank: any-builder */
995
1055
  patchMeHandle(args: RequestArgs & { body: PatchMeHandleRequest }): Promise<PatchMeHandleResponse>;
996
1056
  /** GET /me/interaction — rank: any-builder */
@@ -490,6 +490,40 @@ export function createClient(opts = {}) {
490
490
  // GET /grades/by-builder — rank: metic+archon — GET /grades/by-builder
491
491
  getGradesByBuilder: (args) => request("GET", "/grades/by-builder", { hasBody: false }, args),
492
492
  },
493
+ "guildRequests": {
494
+ // DELETE /guild-requests/{id} — rank: any-builder — DELETE /guild-requests/:id
495
+ deleteGuildRequestsId: (args) => request("DELETE", "/guild-requests/{id}", { hasBody: false }, args),
496
+ // POST /guild-requests/{id}/accept — rank: any-builder — POST /guild-requests/:id/accept
497
+ postGuildRequestsIdAccept: (args) => request("POST", "/guild-requests/{id}/accept", { hasBody: true }, args),
498
+ // POST /guild-requests/{id}/decline — rank: any-builder — POST /guild-requests/:id/decline
499
+ postGuildRequestsIdDecline: (args) => request("POST", "/guild-requests/{id}/decline", { hasBody: true }, args),
500
+ },
501
+ "guilds": {
502
+ // POST /guilds — rank: any-builder — POST /guilds
503
+ postGuilds: (args) => request("POST", "/guilds", { hasBody: true }, args),
504
+ // DELETE /guilds/{slug} — rank: any-builder — DELETE /guilds/:slug
505
+ deleteGuildsSlug: (args) => request("DELETE", "/guilds/{slug}", { hasBody: false }, args),
506
+ // GET /guilds/{slug} — rank: public — GET /guilds/:slug
507
+ getGuildsSlug: (args) => request("GET", "/guilds/{slug}", { hasBody: false }, args),
508
+ // PATCH /guilds/{slug} — rank: any-builder — PATCH /guilds/:slug
509
+ patchGuildsSlug: (args) => request("PATCH", "/guilds/{slug}", { hasBody: true }, args),
510
+ // POST /guilds/{slug}/invites — rank: any-builder — POST /guilds/:slug/invites
511
+ postGuildsSlugInvites: (args) => request("POST", "/guilds/{slug}/invites", { hasBody: true }, args),
512
+ // GET /guilds/{slug}/members — rank: any-builder — GET /guilds/:slug/members
513
+ getGuildsSlugMembers: (args) => request("GET", "/guilds/{slug}/members", { hasBody: false }, args),
514
+ // DELETE /guilds/{slug}/members/{handle} — rank: any-builder — DELETE /guilds/:slug/members/:handle
515
+ deleteGuildsSlugMembersHandle: (args) => request("DELETE", "/guilds/{slug}/members/{handle}", { hasBody: false }, args),
516
+ // DELETE /guilds/{slug}/membership — rank: any-builder — DELETE /guilds/:slug/membership
517
+ deleteGuildsSlugMembership: (args) => request("DELETE", "/guilds/{slug}/membership", { hasBody: false }, args),
518
+ // PATCH /guilds/{slug}/membership — rank: any-builder — PATCH /guilds/:slug/membership
519
+ patchGuildsSlugMembership: (args) => request("PATCH", "/guilds/{slug}/membership", { hasBody: true }, args),
520
+ // GET /guilds/{slug}/requests — rank: any-builder — GET /guilds/:slug/requests
521
+ getGuildsSlugRequests: (args) => request("GET", "/guilds/{slug}/requests", { hasBody: false }, args),
522
+ // POST /guilds/{slug}/requests — rank: any-builder — POST /guilds/:slug/requests
523
+ postGuildsSlugRequests: (args) => request("POST", "/guilds/{slug}/requests", { hasBody: true }, args),
524
+ // POST /guilds/{slug}/transfer — rank: any-builder — POST /guilds/:slug/transfer
525
+ postGuildsSlugTransfer: (args) => request("POST", "/guilds/{slug}/transfer", { hasBody: true }, args),
526
+ },
493
527
  "healthz": {
494
528
  // GET /healthz — rank: public — GET /healthz
495
529
  getHealthz: (args) => request("GET", "/healthz", { hasBody: false }, args),
@@ -597,6 +631,10 @@ export function createClient(opts = {}) {
597
631
  getMeEventSoundPrefs: (args) => request("GET", "/me/event-sound-prefs", { hasBody: false }, args),
598
632
  // PATCH /me/event-sound-prefs — rank: any-builder — PATCH /me/event-sound-prefs
599
633
  patchMeEventSoundPrefs: (args) => request("PATCH", "/me/event-sound-prefs", { hasBody: true }, args),
634
+ // GET /me/guild-requests — rank: any-builder — GET /me/guild-requests
635
+ getMeGuildRequests: (args) => request("GET", "/me/guild-requests", { hasBody: false }, args),
636
+ // GET /me/guilds — rank: any-builder — GET /me/guilds
637
+ getMeGuilds: (args) => request("GET", "/me/guilds", { hasBody: false }, args),
600
638
  // PATCH /me/handle — rank: any-builder — PATCH /me/handle
601
639
  patchMeHandle: (args) => request("PATCH", "/me/handle", { hasBody: true }, args),
602
640
  // GET /me/interaction — rank: any-builder — GET /me/interaction
@@ -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