@bongos/core 1.19.1016 → 1.19.1017

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 +78 -38
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +4 -0
  4. package/clients/bongos-client/index.cjs +4 -0
  5. package/clients/bongos-client/index.d.ts +6 -1
  6. package/clients/bongos-client/index.mjs +4 -0
  7. package/docs/adr/0334-the-recruiting-directory-lists-a-hidden-builder-by-name.md +47 -0
  8. package/docs/adr/README.md +1 -0
  9. package/docs/api/openapi.json +56 -5
  10. package/docs/api-reference.md +7 -1
  11. package/docs/copy-inventory.md +5 -3
  12. package/docs/copy-registry.json +22 -4
  13. package/docs/file-map.md +1 -1
  14. package/docs/module-api-changelog.md +2 -0
  15. package/modules/hall-ui/public/people.html +11 -0
  16. package/modules/hall-ui/public/people.js +77 -11
  17. package/modules/hall-ui/public/people.states.json +1 -1
  18. package/modules/platform-identity/account-visibility.js +33 -2
  19. package/modules/platform-identity/builder-search.js +153 -0
  20. package/modules/platform-identity/migrations/platform_identity_023_builder_search_trgm.sql +40 -0
  21. package/modules/platform-identity/module.json +1 -1
  22. package/modules/platform-identity/routes/community-search.js +120 -0
  23. package/modules/platform-identity/routes/scouting.js +14 -7
  24. package/modules/platform-identity/scouting-name-only.js +47 -0
  25. package/modules/public-landing/public/projects-floor.states.json +9 -2
  26. package/modules/public-landing/public/projects.html +69 -4
  27. package/modules/ui-design/styles/expedition/mock.html +16 -3
  28. package/package-lock.json +2 -2
  29. package/package.json +1 -1
  30. package/src/module-api.js +1 -1
  31. package/tests/account_privacy_flags.mjs +4 -1
  32. package/tests/card_apply_ui.mjs +297 -0
  33. package/tests/community_search_route.mjs +385 -0
  34. package/tests/effective_visibility_predicate.mjs +49 -1
  35. package/tests/people_name_only.mjs +262 -0
  36. package/tests/profile_route.mjs +23 -5
  37. package/tests/recruiter_sliver_boundary.mjs +3 -0
  38. package/tests/scouting_owner_access_and_reach.mjs +112 -2
  39. package/tests/ui_design_styles.mjs +13 -0
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.1016",
6
- "core_contract": "1.19.1016",
7
- "source_commit": "b851150b854b6cb84117b7844e8790a7abb302ab",
5
+ "core_version": "1.19.1017",
6
+ "core_contract": "1.19.1017",
7
+ "source_commit": "9a573618264550e005f12355e27d3a7b181a3baf",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-25T01:04:44.947Z",
9
+ "built_at": "2026-09-25T01:23:29.511Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 525,
12
+ "docs_redacted": 526,
13
13
  "agent_docs_stubbed": 26,
14
- "functional_verbatim": 2432,
14
+ "functional_verbatim": 2439,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2983,
20
- "tree_sha256": "8dde43afac6292dd0280de03c46e9f393fddaab6c42bbbee84ac05784ce96a52",
19
+ "file_count": 2991,
20
+ "tree_sha256": "0df28ef9d48e95b2b0701f4c132182d88e6e5e5995bf19569136cfedb92f1299",
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": "26e3e9bd1e4dc4e7715eaabfdc155b98da64eefc2c002a18f4c5da0b5b288baa"
355
+ "sha256": "1d0f3cc30c66a4eb757e297d95406a42c55cedc073ee29671827926f06c0d260"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/bongos-client.global.js",
359
359
  "mode": "0000644",
360
- "sha256": "6684688f85798c74d0c58853fa54c90e30a69c442708e191a3ef15b8f06ca0fb"
360
+ "sha256": "c913bb0302165f718776d8f5f6f5d3bdde73ee152a9eabbe3fc4f92d23e6b0e3"
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": "5b844bbe07c67c1ac42f46d8a065d59039a447ca38ca6ae9f3422c081038cd8a"
370
+ "sha256": "48051577351ecb7f13d874668d2ed3171b1cad370969ba5e8b4124b20584c839"
371
371
  },
372
372
  {
373
373
  "path": "clients/bongos-client/index.d.ts",
374
374
  "mode": "0000644",
375
- "sha256": "68f3117d69e1bb2d68c398aab75cc302b833404d37a13f1297f5c68f03f7a1aa"
375
+ "sha256": "ffbc111669a6fb27297d1819c35d02f732c3d69b87411613a88b348b0fa897c6"
376
376
  },
377
377
  {
378
378
  "path": "clients/bongos-client/index.mjs",
379
379
  "mode": "0000644",
380
- "sha256": "24cf3312198537eb92a5c2f247faa826f596fae91a44705905bd80a5cdc8c7b0"
380
+ "sha256": "81da43a07fc9e2c89899334f58440d07c8f36df0efc5a1f3a9512a20f2a90047"
381
381
  },
382
382
  {
383
383
  "path": "clients/bongos-client/package.json",
@@ -2154,6 +2154,11 @@
2154
2154
  "mode": "0000644",
2155
2155
  "sha256": "659b73c16da06bb150434de1eae1bcc1dfe4f6acf61ac0b2d787f3b52f617187"
2156
2156
  },
2157
+ {
2158
+ "path": "docs/adr/0334-the-recruiting-directory-lists-a-hidden-builder-by-name.md",
2159
+ "mode": "0000644",
2160
+ "sha256": "60b5794466cfbdd544c19119d6e6e18ae264782b90b0d3a1d96d4a178619e62c"
2161
+ },
2157
2162
  {
2158
2163
  "path": "docs/adr/0335-an-invite-is-a-pre-approved-row-on-the-projects-own-instance.md",
2159
2164
  "mode": "0000644",
@@ -2167,17 +2172,17 @@
2167
2172
  {
2168
2173
  "path": "docs/adr/README.md",
2169
2174
  "mode": "0000644",
2170
- "sha256": "737e64b05ae9128a7320d5d142278a6fb8f28187f8036649d6b4752576726949"
2175
+ "sha256": "83fa5a319b2680beec179cf4f9dc5a1b630699aa2cfa7443300694b724215e8f"
2171
2176
  },
2172
2177
  {
2173
2178
  "path": "docs/api-reference.md",
2174
2179
  "mode": "0000644",
2175
- "sha256": "9d41ac5a4a8e13d03487068f43de42fbd0d58d4ab66f7599e2a05b7f929c1fc9"
2180
+ "sha256": "89d96b4b83075fea2954bbbfda5d815a74f12a06f46cb11da3d83c3d7951d65b"
2176
2181
  },
2177
2182
  {
2178
2183
  "path": "docs/api/openapi.json",
2179
2184
  "mode": "0000644",
2180
- "sha256": "5aa56fcfb0a0fb6f7af0e96ed6b48848cf50657854ff57a7e8bea5177c0b3f89"
2185
+ "sha256": "0e679eec9a95a36a04a91c2d37a34dcba1dec397b0eff30eff6b0b1c5e267627"
2181
2186
  },
2182
2187
  {
2183
2188
  "path": "docs/architecture.md",
@@ -2202,12 +2207,12 @@
2202
2207
  {
2203
2208
  "path": "docs/copy-inventory.md",
2204
2209
  "mode": "0000644",
2205
- "sha256": "94ef983fbe12b8d7d3314a7ebe74486ba419b382e9ae449ebdf5e5aafc56f16a"
2210
+ "sha256": "7824524ca9e6c4eed55c42542e5bca4904650f4476218a22012bf8e13d1e9ac3"
2206
2211
  },
2207
2212
  {
2208
2213
  "path": "docs/copy-registry.json",
2209
2214
  "mode": "0000644",
2210
- "sha256": "d39ca24221a9eec0ede5cd4dd594dc9558337999e5ace5c3145a5c462da1f39b"
2215
+ "sha256": "72b54a0726ff452ddc7c1e6938b6274c1251e2a471592d8083e2530aeef10778"
2211
2216
  },
2212
2217
  {
2213
2218
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2727,7 +2732,7 @@
2727
2732
  {
2728
2733
  "path": "docs/file-map.md",
2729
2734
  "mode": "0000644",
2730
- "sha256": "90e0058ee679d9dc8c9fd5bad7dad2fd05cb22dd4d5fc4831827ec42f51207d2"
2735
+ "sha256": "569c8541506b9f7669dfda06ab3768be173e7d2091d8ff591c07fa67c0fda0eb"
2731
2736
  },
2732
2737
  {
2733
2738
  "path": "docs/handoff-template.md",
@@ -2737,7 +2742,7 @@
2737
2742
  {
2738
2743
  "path": "docs/module-api-changelog.md",
2739
2744
  "mode": "0000644",
2740
- "sha256": "ea0498c65e3167f316d25a081ba9e74b410e9012daf478c42b2c43b0cca6201e"
2745
+ "sha256": "67d5afba0afa656dbf2f89d7591cc91af04a97492c85959ef6dd41ccc764e12a"
2741
2746
  },
2742
2747
  {
2743
2748
  "path": "docs/modules-contract.md",
@@ -5182,17 +5187,17 @@
5182
5187
  {
5183
5188
  "path": "modules/hall-ui/public/people.html",
5184
5189
  "mode": "0000644",
5185
- "sha256": "d94e1d3bf0a0f819469b995b4723f756d301fffcc6f42fb132bdaa82815f7011"
5190
+ "sha256": "4da8ca7dc9321f3d7303332e78ec9caeb6ea65a71fa670b20f593874514585ac"
5186
5191
  },
5187
5192
  {
5188
5193
  "path": "modules/hall-ui/public/people.js",
5189
5194
  "mode": "0000644",
5190
- "sha256": "37d7c9b14bb42a473ef7caf45f138cd87b01b976bb593d1fd2a0c82c94208539"
5195
+ "sha256": "4f5ececf426b07f6df121c857f15c436e1ae4c1269c7352104f258a21589eca1"
5191
5196
  },
5192
5197
  {
5193
5198
  "path": "modules/hall-ui/public/people.states.json",
5194
5199
  "mode": "0000644",
5195
- "sha256": "6f7612bf9ef7da53e2f66337921ee30a13f8a28bde61044f9263bc45a8074edc"
5200
+ "sha256": "5db6df77fb3ea39e03de3489178ab2bf3e978fdd7f67b795ce0da207c71e3eb9"
5196
5201
  },
5197
5202
  {
5198
5203
  "path": "modules/hall-ui/public/primer.css",
@@ -6417,7 +6422,7 @@
6417
6422
  {
6418
6423
  "path": "modules/platform-identity/account-visibility.js",
6419
6424
  "mode": "0000644",
6420
- "sha256": "020279ae50f2f9e7a004fe571e5ca14493ad26bd22c395cc4805f759f5560b72"
6425
+ "sha256": "59275121f2a8c6a044659ca94c7f7671f65be27bfc4a6759ec94afc962fc01cd"
6421
6426
  },
6422
6427
  {
6423
6428
  "path": "modules/platform-identity/activity-snapshots.js",
@@ -6434,6 +6439,11 @@
6434
6439
  "mode": "0000644",
6435
6440
  "sha256": "8217660dc23b57ba0fb54d6375aca9aec190c7abb1d70f9d44d4e290da272c64"
6436
6441
  },
6442
+ {
6443
+ "path": "modules/platform-identity/builder-search.js",
6444
+ "mode": "0000644",
6445
+ "sha256": "69e85980a3cb693fa3d39f05b6fadee34799e27c66a2e63fe86ca461f2cfa394"
6446
+ },
6437
6447
  {
6438
6448
  "path": "modules/platform-identity/canonical-profile.js",
6439
6449
  "mode": "0000644",
@@ -6574,10 +6584,15 @@
6574
6584
  "mode": "0000644",
6575
6585
  "sha256": "b9b4ca90e638af35682b04d311b2ed42f4630a41e003ee329648374fe74fef09"
6576
6586
  },
6587
+ {
6588
+ "path": "modules/platform-identity/migrations/platform_identity_023_builder_search_trgm.sql",
6589
+ "mode": "0000644",
6590
+ "sha256": "f119d0d4f8775e2ec1e0e30702ba9564d7f4f712853751e2e66bb3c103cf1da4"
6591
+ },
6577
6592
  {
6578
6593
  "path": "modules/platform-identity/module.json",
6579
6594
  "mode": "0000644",
6580
- "sha256": "cc6f7ab084ee74715241220339411d1a10c8d6697af143df452278ea2c634f79"
6595
+ "sha256": "a0f4d7143929eee513926111a314c5687005c95ebff998d0d59dd498bb5c62f2"
6581
6596
  },
6582
6597
  {
6583
6598
  "path": "modules/platform-identity/origin-containment.js",
@@ -6624,6 +6639,11 @@
6624
6639
  "mode": "0000644",
6625
6640
  "sha256": "4f6854050e3c7459f698c550577fa97958a573d7f1981c9de4d29417af2669c0"
6626
6641
  },
6642
+ {
6643
+ "path": "modules/platform-identity/routes/community-search.js",
6644
+ "mode": "0000644",
6645
+ "sha256": "f2f8f4f7a94b7f3a917b583a71fcaf482d110ed06e22a1c1aaad6d9a71a34cad"
6646
+ },
6627
6647
  {
6628
6648
  "path": "modules/platform-identity/routes/connections.js",
6629
6649
  "mode": "0000644",
@@ -6652,7 +6672,7 @@
6652
6672
  {
6653
6673
  "path": "modules/platform-identity/routes/scouting.js",
6654
6674
  "mode": "0000644",
6655
- "sha256": "0f898c038abc6c0aceb2f5649008cdc7fc66bc1b7f83129aae3da65f1eb33c15"
6675
+ "sha256": "fbd1f8679be51718131d3d95d6ed7d8dcd1ebe091df6cfc190b69fd62c00013c"
6656
6676
  },
6657
6677
  {
6658
6678
  "path": "modules/platform-identity/routes/sso.js",
@@ -6664,6 +6684,11 @@
6664
6684
  "mode": "0000644",
6665
6685
  "sha256": "b4da61899339ac5e9fac517efa4b3d98e39a8e7d38fd8b0cffbd8464ba85e902"
6666
6686
  },
6687
+ {
6688
+ "path": "modules/platform-identity/scouting-name-only.js",
6689
+ "mode": "0000644",
6690
+ "sha256": "cfffe99b93ad044a115f322eec909983b0e12428975d7cf1e0f2bd9060f922ce"
6691
+ },
6667
6692
  {
6668
6693
  "path": "modules/platform-identity/terms-acceptance.js",
6669
6694
  "mode": "0000644",
@@ -7487,12 +7512,12 @@
7487
7512
  {
7488
7513
  "path": "modules/public-landing/public/projects-floor.states.json",
7489
7514
  "mode": "0000644",
7490
- "sha256": "b02464625daff141f318ae902151b914661236bb369147507f5920dd0cd9665d"
7515
+ "sha256": "598d3d330ec8f054a8af2ca0b354e7f3a604c6335a34607dd6bcd4cd2dae4584"
7491
7516
  },
7492
7517
  {
7493
7518
  "path": "modules/public-landing/public/projects.html",
7494
7519
  "mode": "0000644",
7495
- "sha256": "60439c0cfe1c6ac00bc2054342f9065f03e0a2a7cc8f8fb6ba4c7ba8f754661f"
7520
+ "sha256": "5239de18d6e58de7e8e22f4666965afe956f567b3f31304a206feb9f476258cc"
7496
7521
  },
7497
7522
  {
7498
7523
  "path": "modules/public-landing/public/projects.probes.json",
@@ -8207,7 +8232,7 @@
8207
8232
  {
8208
8233
  "path": "modules/ui-design/styles/expedition/mock.html",
8209
8234
  "mode": "0000644",
8210
- "sha256": "baeccde1879cfb781ddf8da40f0080352fe6a2c1f015b1c8bbfe8fad49f1b6d0"
8235
+ "sha256": "3596b070d8ece6f93894257fd9d8ae5c6a4a12690302c13e6eafa971161b102d"
8211
8236
  },
8212
8237
  {
8213
8238
  "path": "modules/ui-design/styles/expedition/mock.states.json",
@@ -8262,12 +8287,12 @@
8262
8287
  {
8263
8288
  "path": "package-lock.json",
8264
8289
  "mode": "0000644",
8265
- "sha256": "c40b22193411a5ab4aeb39970ddc87ab3cc170bc0bc31648ee97abca8ce4fcea"
8290
+ "sha256": "95953cc5ca598a00deaa5aeb7f508b6b80c161f90fa7d3fd801f3d86b23bad7d"
8266
8291
  },
8267
8292
  {
8268
8293
  "path": "package.json",
8269
8294
  "mode": "0000644",
8270
- "sha256": "14e4e326449774e1d15023eb3ff52f1bf147b710ae6be8e83b422f05c69e0abe"
8295
+ "sha256": "3b1e756b16420ac260634273c6b00ab0e08e5c81ebe9df3496ec1b5b60bde3ae"
8271
8296
  },
8272
8297
  {
8273
8298
  "path": "public-docs/index.html",
@@ -10312,7 +10337,7 @@
10312
10337
  {
10313
10338
  "path": "src/module-api.js",
10314
10339
  "mode": "0000644",
10315
- "sha256": "d156fd5b889037c1ff215c0d48ceadb9cf07717bda0b547a77a5eccf3d0835bf"
10340
+ "sha256": "45613a020e18c5494e4b2664f97274a34f225e2d2c35ecd38b2926528b150a8a"
10316
10341
  },
10317
10342
  {
10318
10343
  "path": "src/module-loader/catalog.js",
@@ -10407,7 +10432,7 @@
10407
10432
  {
10408
10433
  "path": "tests/account_privacy_flags.mjs",
10409
10434
  "mode": "0000644",
10410
- "sha256": "8318379f7c012dbd56ac983649da92182d4a1b7178833285b6cd7fd75d46fa13"
10435
+ "sha256": "1b49da051770c8bcce351c5d6dd96070962913bb63c687a7b5ae0cc0248ad1e6"
10411
10436
  },
10412
10437
  {
10413
10438
  "path": "tests/achievements_reconcile.mjs",
@@ -11029,6 +11054,11 @@
11029
11054
  "mode": "0000644",
11030
11055
  "sha256": "2ddceb37d46eda5c3ab2a56b54c86f3cf55596479b5fe7f30646f45b1ac11ac2"
11031
11056
  },
11057
+ {
11058
+ "path": "tests/card_apply_ui.mjs",
11059
+ "mode": "0000644",
11060
+ "sha256": "998dcc1ca4ff0dfc2368fe4237a5b00bc98fbf7824cd1992f1f7e90bb01c1c56"
11061
+ },
11032
11062
  {
11033
11063
  "path": "tests/cascade-dispatch.mjs",
11034
11064
  "mode": "0000644",
@@ -11169,6 +11199,11 @@
11169
11199
  "mode": "0000644",
11170
11200
  "sha256": "654e70af16092ed0dc76c058b245863c8470b8c3441c39e4c4f5bfd40f60c138"
11171
11201
  },
11202
+ {
11203
+ "path": "tests/community_search_route.mjs",
11204
+ "mode": "0000644",
11205
+ "sha256": "4562631deca93ab222d9ead95c31cbc0964f30194dd59e025bfee35c4d18bb80"
11206
+ },
11172
11207
  {
11173
11208
  "path": "tests/compose_demo_credentials.mjs",
11174
11209
  "mode": "0000644",
@@ -11542,7 +11577,7 @@
11542
11577
  {
11543
11578
  "path": "tests/effective_visibility_predicate.mjs",
11544
11579
  "mode": "0000644",
11545
- "sha256": "17b7292dba01d25f160d2dd292661e5c236b3f390399e66bfab09124b551eb8f"
11580
+ "sha256": "385ffb03ca61b6422f521dfefa4ab584af1fe87cd8bd4c6fb4cf3a5d631acc28"
11546
11581
  },
11547
11582
  {
11548
11583
  "path": "tests/est_advisory.mjs",
@@ -13254,6 +13289,11 @@
13254
13289
  "mode": "0000644",
13255
13290
  "sha256": "e3b2f36780b35fd66690b1c426832322b2781c5386cf7fd50e995a7c2cc089bb"
13256
13291
  },
13292
+ {
13293
+ "path": "tests/people_name_only.mjs",
13294
+ "mode": "0000644",
13295
+ "sha256": "a94562e7680e7153b065fa5b152e13d9880de477e7e9f2a4c9b8de0224266ead"
13296
+ },
13257
13297
  {
13258
13298
  "path": "tests/permission_path.mjs",
13259
13299
  "mode": "0000644",
@@ -13357,7 +13397,7 @@
13357
13397
  {
13358
13398
  "path": "tests/profile_route.mjs",
13359
13399
  "mode": "0000644",
13360
- "sha256": "b0ce292dc642be5100cce00c199ef3dc253098ddd952eb7618c6ca6ff3fc54e5"
13400
+ "sha256": "2e23ed585a9cc31bc3627c284ba7fd1e9234ef746d050d79fa771e8029eaf1e8"
13361
13401
  },
13362
13402
  {
13363
13403
  "path": "tests/profile_ui_cross_project.mjs",
@@ -13797,7 +13837,7 @@
13797
13837
  {
13798
13838
  "path": "tests/recruiter_sliver_boundary.mjs",
13799
13839
  "mode": "0000644",
13800
- "sha256": "a9ad552e7060898e5c94db8af29e63d7cad568294c240c48bef78859a0558ec6"
13840
+ "sha256": "522df6e7930347ff312ef5b2cb98cfde3c53f7465a133618dd970872241bc2b3"
13801
13841
  },
13802
13842
  {
13803
13843
  "path": "tests/redteam_followup_kind.mjs",
@@ -13962,7 +14002,7 @@
13962
14002
  {
13963
14003
  "path": "tests/scouting_owner_access_and_reach.mjs",
13964
14004
  "mode": "0000644",
13965
- "sha256": "d5ba589fac458e51cf16ed25d01744c3bb020d607d13b85b23d780a655f30261"
14005
+ "sha256": "bbaff2a089e24b294961d8be52714be3704b81b934457a0872e32bdf3b330a96"
13966
14006
  },
13967
14007
  {
13968
14008
  "path": "tests/scouting_page_gate.mjs",
@@ -14732,7 +14772,7 @@
14732
14772
  {
14733
14773
  "path": "tests/ui_design_styles.mjs",
14734
14774
  "mode": "0000644",
14735
- "sha256": "a2ab80b7fb38695bb65c617eff1c39cfbe17403b1586cb1b20e3dee50e5a23fa"
14775
+ "sha256": "e10c29d3cf8ad7b617276c1af424a6f7c84b6b5b2c20c0284f229a0f0077c678"
14736
14776
  },
14737
14777
  {
14738
14778
  "path": "tests/unit_report_status.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
- - 416 operations across 62 resource groups
8
+ - 417 operations across 63 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -308,6 +308,10 @@ function createClient(opts = {}) {
308
308
  // GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
309
309
  getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
310
310
  },
311
+ "community": {
312
+ // GET /community/search — rank: public — GET /community/search
313
+ getCommunitySearch: (args) => request("GET", "/community/search", { hasBody: false }, args),
314
+ },
311
315
  "connections": {
312
316
  // GET /connections — rank: any-builder — GET /connections
313
317
  getConnections: (args) => request("GET", "/connections", { hasBody: false }, args),
@@ -307,6 +307,10 @@ function createClient(opts = {}) {
307
307
  // GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
308
308
  getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
309
309
  },
310
+ "community": {
311
+ // GET /community/search — rank: public — GET /community/search
312
+ getCommunitySearch: (args) => request("GET", "/community/search", { hasBody: false }, args),
313
+ },
310
314
  "connections": {
311
315
  // GET /connections — rank: any-builder — GET /connections
312
316
  getConnections: (args) => request("GET", "/connections", { hasBody: false }, args),
@@ -49,6 +49,7 @@ export interface GetBuildersRosterResponse { builders: unknown; stale_hours: unk
49
49
  export interface GetClosenessForMeResponse { closeness: unknown; count: unknown; returned: unknown }
50
50
  export interface GetClosenessWeightsResponse { weights: unknown; window_days: unknown; note: unknown }
51
51
  export interface GetClosenessWithBuilderIdResponse { closeness: unknown; why: unknown }
52
+ export interface GetCommunitySearchResponse { query: unknown; discipline: unknown; count: unknown; results: unknown; page: unknown }
52
53
  export interface GetConnectionsDegreeHandleResponse { handle: unknown; degree: unknown; mutuals: unknown; mutual_count: unknown; truncated: unknown }
53
54
  export interface GetConnectionsRequestsResponse { incoming: unknown; outgoing: unknown; incoming_count: unknown; outgoing_count: unknown }
54
55
  export interface GetConnectionsResponse { connections: unknown; count: unknown }
@@ -134,7 +135,7 @@ export interface GetPublicUptimeResponse { services: unknown }
134
135
  export interface GetPublicVersionsResponse { versions: unknown; page: PageInfo }
135
136
  export interface GetRemovalProposalsResponse { pending: unknown; count: unknown }
136
137
  export interface GetScoutingHandleResponse { sliver: unknown }
137
- export interface GetScoutingResponse { builders: unknown }
138
+ export interface GetScoutingResponse { builders: unknown; name_only: unknown }
138
139
  export interface GetSecurityDocsResponse { docs: unknown }
139
140
  export interface GetSecurityDocsSlugResponse { doc: unknown }
140
141
  export interface GetSecurityReportsResponse { reports: unknown; bounty_table: unknown; statuses: unknown }
@@ -694,6 +695,10 @@ export interface BongosClient {
694
695
  /** GET /closeness/with/{builderId} — rank: any-builder */
695
696
  getClosenessWithBuilderId(args?: RequestArgs): Promise<GetClosenessWithBuilderIdResponse>;
696
697
  };
698
+ "community": {
699
+ /** GET /community/search — rank: public */
700
+ getCommunitySearch(args?: RequestArgs): Promise<GetCommunitySearchResponse>;
701
+ };
697
702
  "connections": {
698
703
  /** GET /connections — rank: any-builder */
699
704
  getConnections(args?: RequestArgs): Promise<GetConnectionsResponse>;
@@ -304,6 +304,10 @@ export function createClient(opts = {}) {
304
304
  // GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
305
305
  getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
306
306
  },
307
+ "community": {
308
+ // GET /community/search — rank: public — GET /community/search
309
+ getCommunitySearch: (args) => request("GET", "/community/search", { hasBody: false }, args),
310
+ },
307
311
  "connections": {
308
312
  // GET /connections — rank: any-builder — GET /connections
309
313
  getConnections: (args) => request("GET", "/connections", { hasBody: false }, args),
@@ -0,0 +1,47 @@
1
+ # 0334 — The recruiting directory lists a hidden builder by name, and hide changes a row's shape, not whether it exists
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-09-24
5
+ - **Task:** [#1002291](https://cloudbongos.com/builders#/task/1002291) (R15, owner recruiting UI; goal 1000045 C5, now folded into goal 1000110)
6
+ - **Relates to:** `docs/specs/<redacted>.md` D2 (owner-signed 2026-08-16), [ADR 0171](0171-profile-rollup-join-and-consent.md) D2, [ADR 0210](0210-scouting-graduates-on-an-instance-asserted-owner-claim.md) D4, [ADR 0215](0215-the-recruiter-sliver-is-a-ceiling-not-a-step.md), [ADR 0217](0217-rank-gates-inviting-not-viewing.md) D1/D2
7
+
8
+ ## Context
9
+
10
+ R15 asks for an owner recruiting surface with search, a role filter and a sort by track record, and says it must honour the hide flag and the recruiting opt-out. Most of that already existed when the task was picked up. The hall's `/people` page (tasks 1002577, 1003470, 1003110) searches, filters by role and sorts. R14 (task 1002290, ADR 0210) opened it to project owners and made the opt-out remove a builder. The one thing that did not match the owner-signed spec was what "honour hide" does.
11
+
12
+ The privacy spec's D2 matrix has a row for an account that is active, public and has hidden its cross-project stats. In the recruiter column it says **"listed name-only (if not opted out)"**. The directory did something else: `listScoutingRollup` joins `rollupVisibleSql`, which excludes `hide_stats`, so a hidden builder was dropped completely. In practice hide worked as a second opt-out.
13
+
14
+ Two things made that a bug and not a harmless extra caution:
15
+
16
+ - **The Settings copy said the opposite.** A hidden builder's "Discoverable by recruiters" row says *"Because your cross-project record is hidden, they will see your name and your picture, and nothing else"*, and that turning the switch off *"removes you from … the People directory"*. For that builder the second sentence was false, because they were never in the directory.
17
+ - **Absence came from ADR 0171 D2, which predates the spec.** ADR 0171 dropped hidden builders from `/people` and `/scouting` before a privacy model existed, and it said *"if 1002785 lands a different privacy rule, its model wins"*. Spike 1002785 then produced the D2 matrix.
18
+
19
+ ## Decision
20
+
21
+ **The directory answers in two tiers, and the hide flag decides a builder's tier, not whether they are listed.**
22
+
23
+ | | Who | Carries |
24
+ |---|---|---|
25
+ | `builders`, the ranked tier | visible AND NOT hidden AND reachable (`scoutingListableSql`, unchanged) | the full rollup row, ranked on track record |
26
+ | `name_only` | visible AND hidden AND reachable (`scoutingNameOnlySql`, new) | `github_login`, `display_name`, `avatar_url` and nothing else |
27
+
28
+ 1. **One predicate, flipped.** `scoutingNameOnlySql` is `scoutingListableSql` with the hide term reversed, built the same way. A test proves the two predicates differ only in that term, so no builder can be in both tiers or in neither. Only the recruiting opt-out removes a builder from the directory. It lives in `account-visibility.js` like every other visibility rule.
29
+ 2. **The existence floor stays.** A private account is never listed, even by name, and even when it opted in to recruiting. That account is the D3 sliver's subject, and the sliver is gated at the archon floor, which the owner kept (ADR 0215 D4, ADR 0217 D2). This ADR does not move that gate.
30
+ 3. **Presence must not depend on activity.** The ranked tier is built from the activity table, so only builders with a record appear in it. The name-only tier reads the accounts table alone. If it listed only hidden builders who had shipped something, appearing in the list would reveal that fact, and that fact comes from the hidden record.
31
+ 4. **The only sort key is the login.** The ranked tier is sorted by the record itself, so a hidden row placed among ranked rows would reveal roughly where its record would rank. Name-only rows sit in their own panel in alphabetical order. No sort lens reorders them, a search matches their name, and a role filter never matches them because the role list is part of the hidden record.
32
+ 5. **The row is a literal whitelist, and the predicate has exactly one reader.** `scouting-name-only.js` builds each row key by key from a statement that selects three identity columns. `scoutingNameOnlySql` admits hidden accounts by design, so a read that joined it and returned a number would leak the very record hide withholds. `tests/effective_visibility_predicate.mjs` therefore pins the predicate to that one file, that file to that one statement, and the statement to those three columns and no rollup table.
33
+
34
+ These three fields are already public. A hidden builder's public profile page (`GET /profiles/:handle`) shows their handle, login, display name and avatar to anyone. The directory's audience is `project.curate` or a project owner, which is narrower. The only new fact the directory reveals is that the builder has not opted out of recruiting, and recruiters are the audience that setting exists for.
35
+
36
+ ## Consequences
37
+
38
+ - A hidden builder who is still discoverable now appears on `/people` by name and picture. Recruiters were already promised this, and the Settings copy is now true without any wording change. Turning off "Discoverable by recruiters" removes them from both tiers. `tests/account_privacy_flags.mjs` now requires all three recruiting predicates to include the reach term.
39
+ - `GET /scouting` gains a response key and changes nothing that already existed. `builders` still has the same rows and the same shape, and an older client that ignores `name_only` behaves as before. Under the hood the route now runs two reads instead of one. The page still makes a single request.
40
+ - Tests that asserted a hidden builder was *absent* from the directory now assert that the builder is *listed by name only*, and that none of their numbers appear anywhere in the response (`tests/profile_route.mjs` R06.3). The real-database proof `tests/profile_rollup_consent.mjs` calls `listScoutingRollup` directly, which is the ranked tier, and is unchanged.
41
+ - The creation wizard's invite suggestions (`invite-suggestions.js`, ADR 0251) still read the ranked tier only. A hidden builder has no record to rank, and adding them there would be a new decision, which this ADR does not make.
42
+
43
+ ## Rejected alternatives
44
+
45
+ - **Keep the exclusion and just fix the copy.** This contradicts the owner-signed matrix row, and it keeps two switches doing the same job. Whether a builder can be found is the reach setting's decision alone.
46
+ - **Mix hidden builders into the ranked ledger as trailing rows.** Their position below everyone else would read as a ranking, a role filter would need special cases, and the count, pager and clipping logic would all have to account for two kinds of row.
47
+ - **Also list private, discoverable accounts by name.** That is the D3 sliver, held at the archon floor by an owner decision. The directory's door is wider than that, and widening it is exactly what ADR 0217 D2 declined to do.
@@ -423,5 +423,6 @@ This keeps the decision history honest and traceable.
423
423
  | 0329 | [**The rendered fit check is a kit floor and an advisory ship-check row, not a grader worker** ([task 1004203](https://cloudbongos.com/builders#/task/1004203), goal 1000095 — UI quality). Nothing in the pipeline rendered a page, so titles clipped by character count ran past their cards (task 1003480, task 1004204) and a second `.mSec` child would have landed on the first (task 1003078), each found only in a browser. Two new kit floors, `text-fit` (text measured word by word past its box; SVG text past its card rect) and `sibling-overlap` (in-flow, block-level, text-bearing siblings), run in every `render.js` render; `scripts/gds/render-check.js` renders the pages a branch changed at 1280 + 390 and `/ship-check` shows them as an ADVISORY row that never flips its exit (ADR 0162). Not a grader worker: that would put a browser, fixtures and a harness on the grader host for signal the builder already saw; the artist gate (ADR 0241) stays the human look before deploy.](0329-the-rendered-fit-check-is-a-kit-floor-and-an-advisory-ship-check-row.md) | ui-design / kit + ship-check |
424
424
  | 0330 | [**An ask is answered where it was asked** ([task 1004216](https://cloudbongos.com/builders#/task/1004216), goal 1000095 — BONGOS-V2), amending [ADR 0187](0187-collab-four-decisions.md) §4a. `lifecycle_004` let a builder ASK for help and let the **asker** mark their own row answered; the person being **asked** had no write at all, so the answer happened somewhere Bongos cannot see and the row sat open until its author remembered it — six asks addressed to the owner had been open between four and thirteen days on 2026-09-23, every one of them answerable. That was not an oversight: §4a deferred conversation to the Agora and a test named *"there is deliberately NO reply thread"* enforced it. **The deferral lost its addressee** — task 1002946 is ABANDONED and goal 1000064 ARCHIVED (verified against the live DB), so the rule had stopped meaning "wait for the Agora" and started meaning "an ask stays unanswerable forever to keep a promise to something that does not exist". **Decisions:** (1) an ask carries a thread of replies, APPEND-ONLY in the SCHEMA rather than by convention — no `updated_at`, `edited_by`, `deleted_at` or `parent_reply_id`, no reactions, no mentions, and a trigger that refuses UPDATE and DELETE outright, because a thing you can edit, nest, react to and address at people is a chat and that is what §4a declined; any builder may reply, since the board read is already project-wide and the good case is somebody you did not ask knowing the answer; (2) the **ADDRESSEE** may close an ask (`answered`), widening an asker-only UPDATE that was coherent only while nothing could be said on the row — but `withdrawn` does NOT widen, since "I no longer need this" is the asker's sentence alone and widening it would be a way to make an ask vanish unanswered; `settled_by` records which of the two closed it, and ADR 0187 §3's consent posture is untouched — closing ends a question, it does not accept work; (3) `/collab-review` posts the reply and **leaves the ask open** (owner decision), since an answer the reader has not read is exactly what an unattended run must halt on. **Consequences:** a reply cannot be taken back, by design; the FK **RESTRICTS rather than cascades** — the first draft cascaded, which reads right and was wrong, because a cascade is a plain DELETE the trigger refuses, so deleting an answered ask failed outright (caught by applying the migration to a real Postgres, not by reading it); the old test was REPLACED, not deleted, so the record that the restraint was deliberate survives; and replies inherit the pull-not-push posture, so nothing still tells an asker they were answered. Rejected: a single `answer` column (cheapest and unambiguously not a chat, but a follow-up would have nowhere to go except a second ask, splitting one conversation across two rows); waiting for the Agora (abandoned — waiting means forever); letting anyone close any ask (an open question is somebody's, and a stranger ending it should not be one click away).](0330-an-ask-is-answered-where-it-was-asked.md) | collab / lifecycle / schema |
425
425
  | 0331 | [**The sky is the ideator's home, and the project sky takes the goal map's page** ([task 1004229](https://cloudbongos.com/builders#/task/1004229), goal 1000095 — BONGOS-V2), amending [ADR 0227](0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md) and decision 11 of `docs/specs/<redacted>.md`. The owner reviewed an interactive prototype of the ideator sky and the project sky over five rounds on 2026-09-24 and adopted it AS IS — copy, layout, colours, tour text, toggles, interactions — which contradicts two things already written down, so they are rewritten rather than leaving the build graded against a contract nobody means any more. **Decisions:** (1) the sky is the ideator's HOME surface — it replaces *Your thinking*, and the project sky replaces the goal map page — so "never load-bearing" and "arrives last" are DROPPED as a sequencing hedge from before there was a design to look at; the rule that survives at full force is the accessibility half, that the sky is never the ONLY path to anything it shows (the list drawer — the room — is one key away, and every drawn thing is a row in it); (2) ADR 0227 is AMENDED, not reversed — its measured refusal of a whole-corpus task map stands, and the project sky is §1's own prescription rather than its refusal: the goal graph is the entry point, tasks are drawn only INSIDE one goal past a zoom threshold (the per-goal drill-down §10.5 measured readable at 85.2px pitch worst case), below that they are dust density on the rings with NO identities, and the goal map's table survives as the sky's ledger drawer (§6's table equivalent kept); the nav slot the goal map was deliberately denied is GRANTED to the project sky, under Goals (owner, 2026-09-24), so part 4 changes the page and the test asserting no slot together; (3) the five states and the two channels are UNTOUCHED — criterion `ideator-sky-tells-the-truth` names a model, not a picture, and this amendment changes the picture's standing only; (4) the two HEURISTICS in the prototype — an idea's origin guessed from its text, and "born of a thought" found by scanning text for idea ids — must not ship as ledger facts: parts 3 and 4 hide both layers, part 5 replaces them with a `filed_via` column and a real born-of read. **Consequences:** `docs/design/mocks/sky/sky.template.html` is the PIXEL CONTRACT for parts 2–5, and every deviation a gate or the file ratchet forces is listed in that part's ship notes; no snapshot JSON or built page is ever committed (it carries real task and idea titles and this repo is public); ADR 0264's deleted goal "Living project sky" is superseded by this work under Working area 3. Rejected: shipping the sky as an extra and keeping "never load-bearing" (makes the adopted home surface unroutable); reversing ADR 0227 (its refusal is measured and still correct — the sky needs its drill-down shape, not its repeal); shipping the heuristics behind a disclaimer (a labelled guess is still a guess in a picture whose promise is that it cannot be faked).](0331-the-sky-is-the-ideators-home.md) | design / ideator / sky |
426
+ | 0334 | [**The recruiting directory lists a hidden builder by name, and hide changes a row's shape, not whether it exists** ([task 1002291](https://cloudbongos.com/builders#/task/1002291), R15 — goal 1000110). Privacy spec D2 (owner-signed) lists an active, public, hidden account on the recruiter surface "name-only (if not opted out)"; the directory dropped it outright, making hide a second opt-out while Settings told that builder recruiters would see their name and picture. `GET /scouting` now answers two tiers: `builders` (ranked, `scoutingListableSql`, unchanged) and `name_only` (`scoutingNameOnlySql` = the same predicate with the hide term flipped, so the tiers partition the directory and only the opt-out removes anyone), projected to `github_login`, `display_name`, `avatar_url` by `scouting-name-only.js`. The existence floor stays (a private account is the archon-floor D3 sliver's, never the directory's); presence never depends on activity; the only order is the login; the predicate is pinned to that one reader and its three columns. The hall's `/people` renders the tier as its own panel, never ranked, found by name, never by a role filter. Rejected: fixing only the copy; trailing rows in the ranked ledger; listing private discoverable accounts by name.](0334-the-recruiting-directory-lists-a-hidden-builder-by-name.md) | privacy / recruiting / hall |
426
427
  | 0335 | [**An invite is a pre-approved row on the project's own instance, and `project.recruit` says who may send one** ([task 1002813](https://cloudbongos.com/builders#/task/1002813), R1 of the project admin console wave, goal 1000110 — BONGOS-V2). Supersedes ADR 0141 §5's "Invitations (deferred slice)" paragraph only. Formalises spike task 1002786's three decisions and reconciles them with six weeks of shipping: the instance invite route (task 1003044), the PATCH rescind (ADR 0201 D4.2) and the composed join door (ADR 0247) already exist, and the hub invite's dead end is now reachable from the creation wizard. **Decisions:** (D1) authority lives on the project's own instance, and the instance IS the project; the hub is identity, relay, echo, notification and links, and never writes a project's admission row; (D2) a recruit invite is an `access_requests` row with `status='invited'`, so signing in is the acceptance act and the gate is untouched; the row gains `kind ∈ (application, invite)` and `created_by` (the inviter, which a rescind would otherwise overwrite), reuses `note`, backfills exactly (`created_at = resolved_at`), and neither column ever enters an admission read; (D3) one new grantable atom, `project.recruit` (`system:false`, floor archon, widened per instance through the existing governance tab), guards the invite, the outstanding list, the invite rescind and the queue read, while `access_request.review` keeps the verdict; because inviting is admitting, a recruiter without the review atom may not approve or re-admit an APPLICANT through the invite route (409 to the queue); the hub sliver moves onto the atom, and the hub directory and hub invite KEEP `project.curate`, revising ADR 0210/0215/0248, since swapping the directory would raise a gate on a viewing surface (ADR 0217). **Task map:** R2 (task 1002814) = the migration, the invite writes and the sender list, still on `access_request.review`; R3 (task 1002815) = mint the atom, move the gates, the 409 clause, the sliver swap and the pins, and it lands after R2; R5 (task 1002817) is already delivered, so close it into task 1002331; task 1003362 folds into R3. Rejected: a new invitations table; the hub pending row as the invite; widening `access_request.review` instead of minting an atom; a per-project settings row for the floor; letting a recruiter's invite approve applications; `system:true`; swapping `project.curate` on the hub directory.](0335-an-invite-is-a-pre-approved-row-on-the-projects-own-instance.md) | governance / onboarding / platform-identity |
427
428
  | 0336 | [**A guild is a hub-side group whose members each consent twice, and its collective record is only ever the sum of what those members already show** ([task 1002299](https://cloudbongos.com/builders#/task/1002299), goal 1000110 — the R23 design spike for goal 1000045's C7/C8/C9). No platform guild existed (every "guild" in the tree is Discord's). Decisions: (1) three hub tables in `platform-identity`, in their own `guilds.js` (the 1,500-line ratchet), distinct from instance-local `goal_members`: guilds (slug, name, `visibility ∈ public|unlisted` with **no default**), members (`membership_kind ∈ owner|member`, never `role` per ADR 0174; a partial unique index holds exactly one owner; a per-member `shown_publicly`), and requests; (2) two consents to join, no self-join, through ADR 0202's connections lifecycle verbatim (silent decline, 90-day swallowed re-ask, 30-day read-time expiry); `accountActiveSql` floors the feature; an **unlisted guild 404s to everyone on the public read, members included**, and takes invites only, because a slug is guessable; (3) the public roster is `shown_publicly AND accountVisibleSql`, and widening a guild to public changes no member's flag but the flipping owner's, so consent given to a small audience is never reused for a large one; (4) **the privacy resolution, pending the owner's ratification:** a member is counted iff shown AND `rollupVisibleSql`, read-time, `no-store`, never stored, and N and M are both lengths of lists the reader can see. The guild record is therefore always a sum of numbers already on members' own public profiles, so nothing can be subtracted out. All-or-nothing is rejected (one member blanks everyone and hiding becomes costly), as is per-member consent to count hidden numbers (it breaks "hide_stats beats everything"). The trade-off: guilds of privacy-minded builders look smaller and rank lower. A union count of all members' projects is refused because it reveals shared private projects; (5) the namespace is `/g/<slug>`, `g` is reserved in the SEO spec's project-slug list, the slug is fixed in V1, and `tests/guild_namespace_reserved.mjs` pins the two documents together; (6) a guild engages a project only through the individual door: a guild application is each member's own vouched application, labelled through ADR 0260's live applicant-profile read (no new instance field); inviting a guild fans out ordinary individual invites to its public roster at that moment, **never a guild-level pre-approval** (that would let a guild owner decide admission to someone else's project); (7) the map ranks public guilds by size and counted works shipped, read-time, with a slug tiebreak, and R29 narrows to the visual. Scope changes for R24–R37 are tabled in the ADR, including R28's dependency on the abandoned R11 and R29/R31's archived orb goals.](0336-a-guilds-record-is-the-sum-of-what-its-members-already-show.md) | platform identity / privacy / social graph |
@@ -89,6 +89,10 @@
89
89
  "name": "closeness",
90
90
  "description": "Endpoints under `/api/bongos/closeness`."
91
91
  },
92
+ {
93
+ "name": "community",
94
+ "description": "Endpoints under `/api/bongos/community`."
95
+ },
92
96
  {
93
97
  "name": "connections",
94
98
  "description": "Endpoints under `/api/bongos/connections`."
@@ -4391,6 +4395,34 @@
4391
4395
  ]
4392
4396
  }
4393
4397
  },
4398
+ "/community/search": {
4399
+ "get": {
4400
+ "operationId": "get_community_search",
4401
+ "tags": [
4402
+ "community"
4403
+ ],
4404
+ "summary": "GET /community/search",
4405
+ "description": "a name/discipline search under EXACTLY the public-profile visibility rules (D4): a hide_stats account is findable by name but drops out of a discipline-filtered result (disciplines are rollup-derived, and the rollup is what hide_stats suppresses); private and provisional accounts never appear. no-store: the same hide-must-beat-the-cache posture as /profiles/:handle (ADR 0171 D5) — this reads the identical predicate and a flip must be reflected on the very next request.\n\n**Rank:** `public` — No authentication — any caller.",
4406
+ "x-rank": "public",
4407
+ "x-source": "modules/platform-identity/routes/community-search.js",
4408
+ "responses": {
4409
+ "200": {
4410
+ "description": "Success.",
4411
+ "content": {
4412
+ "application/json": {
4413
+ "schema": {
4414
+ "$ref": "#/components/schemas/GetCommunitySearchResponse"
4415
+ }
4416
+ }
4417
+ }
4418
+ },
4419
+ "400": {
4420
+ "$ref": "#/components/responses/BadRequest"
4421
+ }
4422
+ },
4423
+ "security": []
4424
+ }
4425
+ },
4394
4426
  "/connections": {
4395
4427
  "get": {
4396
4428
  "operationId": "get_connections",
@@ -19808,6 +19840,23 @@
19808
19840
  "why"
19809
19841
  ]
19810
19842
  },
19843
+ "GetCommunitySearchResponse": {
19844
+ "type": "object",
19845
+ "properties": {
19846
+ "query": {},
19847
+ "discipline": {},
19848
+ "count": {},
19849
+ "results": {},
19850
+ "page": {}
19851
+ },
19852
+ "required": [
19853
+ "query",
19854
+ "discipline",
19855
+ "count",
19856
+ "results",
19857
+ "page"
19858
+ ]
19859
+ },
19811
19860
  "GetConnectionsDegreeHandleResponse": {
19812
19861
  "type": "object",
19813
19862
  "properties": {
@@ -20934,10 +20983,12 @@
20934
20983
  "GetScoutingResponse": {
20935
20984
  "type": "object",
20936
20985
  "properties": {
20937
- "builders": {}
20986
+ "builders": {},
20987
+ "name_only": {}
20938
20988
  },
20939
20989
  "required": [
20940
- "builders"
20990
+ "builders",
20991
+ "name_only"
20941
20992
  ]
20942
20993
  },
20943
20994
  "GetSecurityDocsResponse": {
@@ -26418,9 +26469,9 @@
26418
26469
  "description": "A required dependency/feature is not configured or is temporarily down."
26419
26470
  }
26420
26471
  },
26421
- "x-endpoint-count": 416,
26422
- "x-schema-count": 453,
26472
+ "x-endpoint-count": 417,
26473
+ "x-schema-count": 454,
26423
26474
  "x-undocumented-bodies": 9,
26424
- "x-response-schemas": 308,
26475
+ "x-response-schemas": 309,
26425
26476
  "x-generated-by": "scripts/gds/gen-api-docs.js"
26426
26477
  }
@@ -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. 416 endpoints across 70 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 417 endpoints across 71 route files.
6
6
  > Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
7
7
 
8
8
  Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
@@ -187,6 +187,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
187
187
  | GET | `/api/bongos/closeness/weights` | `any-builder` | — | the MODEL is not private, and publishing it is the whole point of the weights being data. |
188
188
  | GET | `/api/bongos/closeness/with/:builderId` | `any-builder` | — | One pair — "why am I close to THEM", asked directly rather than by paging the graph. |
189
189
 
190
+ ## `community` (1)
191
+
192
+ | Method | Path | Rank | Body | Description |
193
+ |---|---|---|---|---|
194
+ | GET | `/api/bongos/community/search` | `public` | — | a name/discipline search under EXACTLY the public-profile visibility rules (D4): a hide_stats account is findable by name but drops out o… |
195
+
190
196
  ## `connections` (7)
191
197
 
192
198
  | Method | Path | Rank | Body | Description |