@bongos/core 1.21.57 → 1.21.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +82 -47
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +6 -0
- package/clients/bongos-client/index.cjs +6 -0
- package/clients/bongos-client/index.d.ts +13 -2
- package/clients/bongos-client/index.mjs +6 -0
- package/docs/adr/0336-a-guilds-record-is-the-sum-of-what-its-members-already-show.md +2 -0
- package/docs/adr/0365-a-guild-engages-a-project-through-each-members-own-door.md +58 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +233 -6
- package/docs/api-reference.md +8 -5
- package/docs/copy-inventory.md +360 -352
- package/docs/copy-registry.json +479 -397
- package/docs/file-map.md +3 -0
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-inventory.json +7 -1
- package/docs/page-readings.json +828 -811
- package/modules/platform-identity/application-echo.js +11 -5
- package/modules/platform-identity/guild-engagements.js +255 -0
- package/modules/platform-identity/guilds.js +3 -1
- package/modules/platform-identity/migrations/platform_identity_030_guild_engagements.sql +64 -0
- package/modules/platform-identity/routes/guilds.js +35 -1
- package/modules/platform-identity/routes/my-projects.js +27 -3
- package/modules/platform-identity/routes/projects.js +44 -0
- package/modules/platform-identity/routes/sso.js +21 -3
- package/modules/public-landing/public/assets/cosmos.css +7 -0
- package/modules/public-landing/public/guild.html +64 -2
- package/modules/public-landing/public/guild.probes.json +13 -3
- package/modules/public-landing/public/guild.states.json +10 -5
- package/modules/public-landing/public/projects.html +252 -16
- package/modules/public-landing/public/projects.probes.json +26 -1
- package/modules/public-landing/public/projects.states.json +4 -0
- package/modules/ui-design/kit/fixtures/me__guild-engagements.json +7 -0
- package/modules/ui-design/kit/serve.js +54 -5
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/scripts/gds/run-unit-tests.js +5 -0
- package/src/module-api.js +1 -1
- package/tests/applicant_profile_boundary.mjs +104 -1
- package/tests/application_echo.mjs +91 -5
- package/tests/guild_engagement.mjs +881 -0
- package/tests/guild_engagement_db.mjs +240 -0
- package/tests/hub_engagement_cards.mjs +307 -0
- package/tests/hub_guild_page.mjs +94 -7
- package/tests/privacy_matrix.mjs +99 -9
- package/tests/project_invite_ui.mjs +187 -3
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.21.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.58",
|
|
6
|
+
"core_contract": "1.21.58",
|
|
7
|
+
"source_commit": "4bbf8bc0f626440da1b55c5674814cce6b291a23",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-
|
|
9
|
+
"built_at": "2026-10-05T03:05:29.962Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 583,
|
|
13
13
|
"agent_docs_stubbed": 28,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2944,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3556,
|
|
20
|
+
"tree_sha256": "27538316c32493f9657a6695546fb3b58073c51a47552755662d5f7f2c870864",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -312,12 +312,12 @@
|
|
|
312
312
|
{
|
|
313
313
|
"path": "clients/bongos-client/README.md",
|
|
314
314
|
"mode": "0000644",
|
|
315
|
-
"sha256": "
|
|
315
|
+
"sha256": "45f27ed681b4c56568ad5f7fcfe9aecddc32ab45d90f5b6321d641521995e981"
|
|
316
316
|
},
|
|
317
317
|
{
|
|
318
318
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
319
319
|
"mode": "0000644",
|
|
320
|
-
"sha256": "
|
|
320
|
+
"sha256": "a39ac01b75f7ad11b421497e2f1b7945befe18503be785b80978c25720c531ee"
|
|
321
321
|
},
|
|
322
322
|
{
|
|
323
323
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -327,17 +327,17 @@
|
|
|
327
327
|
{
|
|
328
328
|
"path": "clients/bongos-client/index.cjs",
|
|
329
329
|
"mode": "0000644",
|
|
330
|
-
"sha256": "
|
|
330
|
+
"sha256": "61c036ef4314deac3cfba830feba172a6b5f3c02bd5752cb10d8f1e378061ca7"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"path": "clients/bongos-client/index.d.ts",
|
|
334
334
|
"mode": "0000644",
|
|
335
|
-
"sha256": "
|
|
335
|
+
"sha256": "f43a89f67674a49e86864acb0b91d7f8450200da3d84c657eb5bfefe0affcb0e"
|
|
336
336
|
},
|
|
337
337
|
{
|
|
338
338
|
"path": "clients/bongos-client/index.mjs",
|
|
339
339
|
"mode": "0000644",
|
|
340
|
-
"sha256": "
|
|
340
|
+
"sha256": "c6a9b382965b4ccf32df9e296662cb2d7c628184d34a974cef8b384fdfdf54e1"
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "clients/bongos-client/package.json",
|
|
@@ -2137,7 +2137,7 @@
|
|
|
2137
2137
|
{
|
|
2138
2138
|
"path": "docs/adr/0336-a-guilds-record-is-the-sum-of-what-its-members-already-show.md",
|
|
2139
2139
|
"mode": "0000644",
|
|
2140
|
-
"sha256": "
|
|
2140
|
+
"sha256": "d84323171525d785f9909f53bd554f6c7e42d46616e92010c43b142be8db2cc4"
|
|
2141
2141
|
},
|
|
2142
2142
|
{
|
|
2143
2143
|
"path": "docs/adr/0337-the-hub-account-is-the-person-a-hall-account-is-their-seat-in-one-project.md",
|
|
@@ -2279,20 +2279,25 @@
|
|
|
2279
2279
|
"mode": "0000644",
|
|
2280
2280
|
"sha256": "882a01ac32ecddcb9b6f3dd88792e34164d7daafae4413eb3f64b502c0c59ddd"
|
|
2281
2281
|
},
|
|
2282
|
+
{
|
|
2283
|
+
"path": "docs/adr/0365-a-guild-engages-a-project-through-each-members-own-door.md",
|
|
2284
|
+
"mode": "0000644",
|
|
2285
|
+
"sha256": "93c863a7f961cd91c052eee2188b16b9f360cec26478dde6225b304ee0e59f7d"
|
|
2286
|
+
},
|
|
2282
2287
|
{
|
|
2283
2288
|
"path": "docs/adr/README.md",
|
|
2284
2289
|
"mode": "0000644",
|
|
2285
|
-
"sha256": "
|
|
2290
|
+
"sha256": "a81d1eeeb26ce4fde1731485e943d82ddb320bc60a5f1782f7a207b94da5fff5"
|
|
2286
2291
|
},
|
|
2287
2292
|
{
|
|
2288
2293
|
"path": "docs/api-reference.md",
|
|
2289
2294
|
"mode": "0000644",
|
|
2290
|
-
"sha256": "
|
|
2295
|
+
"sha256": "07e654a8305093748950d3dba7fa861a989c0302cb941743a805d5a4a70cbd8c"
|
|
2291
2296
|
},
|
|
2292
2297
|
{
|
|
2293
2298
|
"path": "docs/api/openapi.json",
|
|
2294
2299
|
"mode": "0000644",
|
|
2295
|
-
"sha256": "
|
|
2300
|
+
"sha256": "3297e2694c5be1302ea4114a1e82a5864fcb09740d84b17aa837b7421d3f34c5"
|
|
2296
2301
|
},
|
|
2297
2302
|
{
|
|
2298
2303
|
"path": "docs/architecture.md",
|
|
@@ -2317,12 +2322,12 @@
|
|
|
2317
2322
|
{
|
|
2318
2323
|
"path": "docs/copy-inventory.md",
|
|
2319
2324
|
"mode": "0000644",
|
|
2320
|
-
"sha256": "
|
|
2325
|
+
"sha256": "efc5c678e20b7e06959619777502cd728465076521f49a4b935a17559ce7de7b"
|
|
2321
2326
|
},
|
|
2322
2327
|
{
|
|
2323
2328
|
"path": "docs/copy-registry.json",
|
|
2324
2329
|
"mode": "0000644",
|
|
2325
|
-
"sha256": "
|
|
2330
|
+
"sha256": "47b5f1e5c33600905dbbaf62b70d5092b92e610e29f602d85621a0d027bad3b7"
|
|
2326
2331
|
},
|
|
2327
2332
|
{
|
|
2328
2333
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2822,7 +2827,7 @@
|
|
|
2822
2827
|
{
|
|
2823
2828
|
"path": "docs/file-map.md",
|
|
2824
2829
|
"mode": "0000644",
|
|
2825
|
-
"sha256": "
|
|
2830
|
+
"sha256": "f9943f6b4d4859358b4d2d71af9f043d47b2f5a70532bbb9489f34423c596ff8"
|
|
2826
2831
|
},
|
|
2827
2832
|
{
|
|
2828
2833
|
"path": "docs/handoff-template.md",
|
|
@@ -2832,7 +2837,7 @@
|
|
|
2832
2837
|
{
|
|
2833
2838
|
"path": "docs/module-api-changelog.md",
|
|
2834
2839
|
"mode": "0000644",
|
|
2835
|
-
"sha256": "
|
|
2840
|
+
"sha256": "afe46e7c8c0e7cf4206fb794b6da671f0e575b63161d0ae8754431bd3762f519"
|
|
2836
2841
|
},
|
|
2837
2842
|
{
|
|
2838
2843
|
"path": "docs/modules-contract.md",
|
|
@@ -2917,12 +2922,12 @@
|
|
|
2917
2922
|
{
|
|
2918
2923
|
"path": "docs/page-inventory.json",
|
|
2919
2924
|
"mode": "0000644",
|
|
2920
|
-
"sha256": "
|
|
2925
|
+
"sha256": "8f3f9d5bad79803f5bbf96ee25bbbe4bb4915455107bdf9adcc23c2ea04e7cd8"
|
|
2921
2926
|
},
|
|
2922
2927
|
{
|
|
2923
2928
|
"path": "docs/page-readings.json",
|
|
2924
2929
|
"mode": "0000644",
|
|
2925
|
-
"sha256": "
|
|
2930
|
+
"sha256": "aee98576821a49cc9fb3f7346ccced59ed6fe89c4d2672ef69ee9c9616589c0a"
|
|
2926
2931
|
},
|
|
2927
2932
|
{
|
|
2928
2933
|
"path": "docs/project-context.template.md",
|
|
@@ -7702,7 +7707,7 @@
|
|
|
7702
7707
|
{
|
|
7703
7708
|
"path": "modules/platform-identity/application-echo.js",
|
|
7704
7709
|
"mode": "0000644",
|
|
7705
|
-
"sha256": "
|
|
7710
|
+
"sha256": "ef065b3fbd898a8d16de176904bd04eb1a56a6b005705387d020fa6c6c888321"
|
|
7706
7711
|
},
|
|
7707
7712
|
{
|
|
7708
7713
|
"path": "modules/platform-identity/builder-search.js",
|
|
@@ -7734,6 +7739,11 @@
|
|
|
7734
7739
|
"mode": "0000644",
|
|
7735
7740
|
"sha256": "3a0d3e28351c81b9b46d14073dc65eb2372b05d73ccbbe161ea7c9c0ba5c9f87"
|
|
7736
7741
|
},
|
|
7742
|
+
{
|
|
7743
|
+
"path": "modules/platform-identity/guild-engagements.js",
|
|
7744
|
+
"mode": "0000644",
|
|
7745
|
+
"sha256": "7ad59a1bd96e9f8873a5110f00c34caa22ce1ff513b7454b970c3c67c2f89e78"
|
|
7746
|
+
},
|
|
7737
7747
|
{
|
|
7738
7748
|
"path": "modules/platform-identity/guild-map.js",
|
|
7739
7749
|
"mode": "0000644",
|
|
@@ -7747,7 +7757,7 @@
|
|
|
7747
7757
|
{
|
|
7748
7758
|
"path": "modules/platform-identity/guilds.js",
|
|
7749
7759
|
"mode": "0000644",
|
|
7750
|
-
"sha256": "
|
|
7760
|
+
"sha256": "9f3231c4ae89a72742ba460224068fa34850fbe284a105ed5142d5a32f3572f3"
|
|
7751
7761
|
},
|
|
7752
7762
|
{
|
|
7753
7763
|
"path": "modules/platform-identity/hub-device.js",
|
|
@@ -7924,6 +7934,11 @@
|
|
|
7924
7934
|
"mode": "0000644",
|
|
7925
7935
|
"sha256": "616c64ad4caa3579672ffcefe12badb83c6525ec45dcb68f15254da8b995fc25"
|
|
7926
7936
|
},
|
|
7937
|
+
{
|
|
7938
|
+
"path": "modules/platform-identity/migrations/platform_identity_030_guild_engagements.sql",
|
|
7939
|
+
"mode": "0000644",
|
|
7940
|
+
"sha256": "ee1d7a42517c978a771dd418d61b783b4d34629497718a1ea9340a94a94aabce"
|
|
7941
|
+
},
|
|
7927
7942
|
{
|
|
7928
7943
|
"path": "modules/platform-identity/module.json",
|
|
7929
7944
|
"mode": "0000644",
|
|
@@ -8007,12 +8022,12 @@
|
|
|
8007
8022
|
{
|
|
8008
8023
|
"path": "modules/platform-identity/routes/guilds.js",
|
|
8009
8024
|
"mode": "0000644",
|
|
8010
|
-
"sha256": "
|
|
8025
|
+
"sha256": "63442c19efe41269fde8d7f3f114d24d508baaf602b5998d73ab112bdbca30c3"
|
|
8011
8026
|
},
|
|
8012
8027
|
{
|
|
8013
8028
|
"path": "modules/platform-identity/routes/my-projects.js",
|
|
8014
8029
|
"mode": "0000644",
|
|
8015
|
-
"sha256": "
|
|
8030
|
+
"sha256": "d62b44c9d13310388b4015a273c9003664c56440295b780cc66a01d9496a5597"
|
|
8016
8031
|
},
|
|
8017
8032
|
{
|
|
8018
8033
|
"path": "modules/platform-identity/routes/profile.js",
|
|
@@ -8022,7 +8037,7 @@
|
|
|
8022
8037
|
{
|
|
8023
8038
|
"path": "modules/platform-identity/routes/projects.js",
|
|
8024
8039
|
"mode": "0000644",
|
|
8025
|
-
"sha256": "
|
|
8040
|
+
"sha256": "8f309c8b0a02e82eca0fa5873a62f1f6b221c282af23d4f13911cb9e15313f92"
|
|
8026
8041
|
},
|
|
8027
8042
|
{
|
|
8028
8043
|
"path": "modules/platform-identity/routes/public-profile.js",
|
|
@@ -8042,7 +8057,7 @@
|
|
|
8042
8057
|
{
|
|
8043
8058
|
"path": "modules/platform-identity/routes/sso.js",
|
|
8044
8059
|
"mode": "0000644",
|
|
8045
|
-
"sha256": "
|
|
8060
|
+
"sha256": "0ecc3f416dbd03ee47a2c18a64faa6e0e0fac1d19c10a5246f7c77aa313d8264"
|
|
8046
8061
|
},
|
|
8047
8062
|
{
|
|
8048
8063
|
"path": "modules/platform-identity/scouting-authz.js",
|
|
@@ -8792,7 +8807,7 @@
|
|
|
8792
8807
|
{
|
|
8793
8808
|
"path": "modules/public-landing/public/assets/cosmos.css",
|
|
8794
8809
|
"mode": "0000644",
|
|
8795
|
-
"sha256": "
|
|
8810
|
+
"sha256": "399fa97b3a03a1ef99c6be925822fc36ab0d4a2b712dbe7cf7453efe9509e00e"
|
|
8796
8811
|
},
|
|
8797
8812
|
{
|
|
8798
8813
|
"path": "modules/public-landing/public/assets/hub-bar.js",
|
|
@@ -9127,17 +9142,17 @@
|
|
|
9127
9142
|
{
|
|
9128
9143
|
"path": "modules/public-landing/public/guild.html",
|
|
9129
9144
|
"mode": "0000644",
|
|
9130
|
-
"sha256": "
|
|
9145
|
+
"sha256": "583ac74502bc63ed808b7cad4867dbd4712a3ad04bb7995636f9f50103b48a35"
|
|
9131
9146
|
},
|
|
9132
9147
|
{
|
|
9133
9148
|
"path": "modules/public-landing/public/guild.probes.json",
|
|
9134
9149
|
"mode": "0000644",
|
|
9135
|
-
"sha256": "
|
|
9150
|
+
"sha256": "a8e148626bc48c41b248105fff61dc8d20c694755ad8812a8a773c3e147352c1"
|
|
9136
9151
|
},
|
|
9137
9152
|
{
|
|
9138
9153
|
"path": "modules/public-landing/public/guild.states.json",
|
|
9139
9154
|
"mode": "0000644",
|
|
9140
|
-
"sha256": "
|
|
9155
|
+
"sha256": "ec1df640ebf9047c817a65badd28a41167fd53e00399452b537b9b5035c6215e"
|
|
9141
9156
|
},
|
|
9142
9157
|
{
|
|
9143
9158
|
"path": "modules/public-landing/public/index.html",
|
|
@@ -9187,17 +9202,17 @@
|
|
|
9187
9202
|
{
|
|
9188
9203
|
"path": "modules/public-landing/public/projects.html",
|
|
9189
9204
|
"mode": "0000644",
|
|
9190
|
-
"sha256": "
|
|
9205
|
+
"sha256": "1749ebaa1148f1288559f93c5edf9ca27f0a8a26eccee8f01ebbd92208d14f95"
|
|
9191
9206
|
},
|
|
9192
9207
|
{
|
|
9193
9208
|
"path": "modules/public-landing/public/projects.probes.json",
|
|
9194
9209
|
"mode": "0000644",
|
|
9195
|
-
"sha256": "
|
|
9210
|
+
"sha256": "d0681e889c1536ba24e038187b7c18db15aa0ccdcd71152e53f03390d2181b8f"
|
|
9196
9211
|
},
|
|
9197
9212
|
{
|
|
9198
9213
|
"path": "modules/public-landing/public/projects.states.json",
|
|
9199
9214
|
"mode": "0000644",
|
|
9200
|
-
"sha256": "
|
|
9215
|
+
"sha256": "ca468df0378d929b5332c282b64084aefa186cfc0d22cc2510611d6055477165"
|
|
9201
9216
|
},
|
|
9202
9217
|
{
|
|
9203
9218
|
"path": "modules/public-landing/public/terms.html",
|
|
@@ -9714,6 +9729,11 @@
|
|
|
9714
9729
|
"mode": "0000644",
|
|
9715
9730
|
"sha256": "4dff6353b7fe0ed5769cdeb5daf16ac36afb707103126c432a1176568c451c41"
|
|
9716
9731
|
},
|
|
9732
|
+
{
|
|
9733
|
+
"path": "modules/ui-design/kit/fixtures/me__guild-engagements.json",
|
|
9734
|
+
"mode": "0000644",
|
|
9735
|
+
"sha256": "162489516c87175269bf43a018fd97fa4acb199dd947897fad4d3d0a8900076f"
|
|
9736
|
+
},
|
|
9717
9737
|
{
|
|
9718
9738
|
"path": "modules/ui-design/kit/fixtures/my-projects.json",
|
|
9719
9739
|
"mode": "0000644",
|
|
@@ -9787,7 +9807,7 @@
|
|
|
9787
9807
|
{
|
|
9788
9808
|
"path": "modules/ui-design/kit/serve.js",
|
|
9789
9809
|
"mode": "0000644",
|
|
9790
|
-
"sha256": "
|
|
9810
|
+
"sha256": "7bfca5557ddb82596cd1d0b9a1023f4f1fe81bd99fccbb7abee102b931549498"
|
|
9791
9811
|
},
|
|
9792
9812
|
{
|
|
9793
9813
|
"path": "modules/ui-design/kit/tells.js",
|
|
@@ -9922,12 +9942,12 @@
|
|
|
9922
9942
|
{
|
|
9923
9943
|
"path": "package-lock.json",
|
|
9924
9944
|
"mode": "0000644",
|
|
9925
|
-
"sha256": "
|
|
9945
|
+
"sha256": "9329d96fc868bbb58efc9641f6e3de8051b4c3dcc6fd0f6ff5df1c4d4351c682"
|
|
9926
9946
|
},
|
|
9927
9947
|
{
|
|
9928
9948
|
"path": "package.json",
|
|
9929
9949
|
"mode": "0000644",
|
|
9930
|
-
"sha256": "
|
|
9950
|
+
"sha256": "cf36cdd408c878e2bc602c110ba1ed09984d1a7e80fcfa9dc605960cc8db321c"
|
|
9931
9951
|
},
|
|
9932
9952
|
{
|
|
9933
9953
|
"path": "public-docs/index.html",
|
|
@@ -9947,7 +9967,7 @@
|
|
|
9947
9967
|
{
|
|
9948
9968
|
"path": "release-notes.json",
|
|
9949
9969
|
"mode": "0000644",
|
|
9950
|
-
"sha256": "
|
|
9970
|
+
"sha256": "6219c16245804220029443b8e5c1aee4893e05aa32a2a7830cb21e6e3de158f4"
|
|
9951
9971
|
},
|
|
9952
9972
|
{
|
|
9953
9973
|
"path": "scripts/cron/style_guide_audit.sh",
|
|
@@ -11152,7 +11172,7 @@
|
|
|
11152
11172
|
{
|
|
11153
11173
|
"path": "scripts/gds/run-unit-tests.js",
|
|
11154
11174
|
"mode": "0000644",
|
|
11155
|
-
"sha256": "
|
|
11175
|
+
"sha256": "bd2c9b3fc469feda913bc58db6106b6bcc2c59bfacfc90fe23cb89c076ac1762"
|
|
11156
11176
|
},
|
|
11157
11177
|
{
|
|
11158
11178
|
"path": "scripts/gds/runner-drift.js",
|
|
@@ -12167,7 +12187,7 @@
|
|
|
12167
12187
|
{
|
|
12168
12188
|
"path": "src/module-api.js",
|
|
12169
12189
|
"mode": "0000644",
|
|
12170
|
-
"sha256": "
|
|
12190
|
+
"sha256": "d2a7932b2b85110bb59fb6e3724b18c139d08b6463a060fe570d5a53a6acc23f"
|
|
12171
12191
|
},
|
|
12172
12192
|
{
|
|
12173
12193
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12452,7 +12472,7 @@
|
|
|
12452
12472
|
{
|
|
12453
12473
|
"path": "tests/applicant_profile_boundary.mjs",
|
|
12454
12474
|
"mode": "0000644",
|
|
12455
|
-
"sha256": "
|
|
12475
|
+
"sha256": "f7c94079d3c85cc6513dba591111f81fa45115e25d32469d67e949a8e7abee3d"
|
|
12456
12476
|
},
|
|
12457
12477
|
{
|
|
12458
12478
|
"path": "tests/applicant_profile_read_bounds.mjs",
|
|
@@ -12462,7 +12482,7 @@
|
|
|
12462
12482
|
{
|
|
12463
12483
|
"path": "tests/application_echo.mjs",
|
|
12464
12484
|
"mode": "0000644",
|
|
12465
|
-
"sha256": "
|
|
12485
|
+
"sha256": "29224350f0699a66f9cd96860519d159f707bc48d68f154ae86742ca1377e9ea"
|
|
12466
12486
|
},
|
|
12467
12487
|
{
|
|
12468
12488
|
"path": "tests/application_lifecycle.mjs",
|
|
@@ -14359,6 +14379,16 @@
|
|
|
14359
14379
|
"mode": "0000644",
|
|
14360
14380
|
"sha256": "6e834f3cf75dd34ba30795c46bc401098053a56c967da8661128f34db71ff8c3"
|
|
14361
14381
|
},
|
|
14382
|
+
{
|
|
14383
|
+
"path": "tests/guild_engagement.mjs",
|
|
14384
|
+
"mode": "0000644",
|
|
14385
|
+
"sha256": "739cff88d954b74aaaf93a66c9409fea248b36724700f6916898fd2b4c126769"
|
|
14386
|
+
},
|
|
14387
|
+
{
|
|
14388
|
+
"path": "tests/guild_engagement_db.mjs",
|
|
14389
|
+
"mode": "0000644",
|
|
14390
|
+
"sha256": "ba38bcb529ae53d08287e774abe156da5c7ea52c5428a32ef006b2be7445da85"
|
|
14391
|
+
},
|
|
14362
14392
|
{
|
|
14363
14393
|
"path": "tests/guild_map_db.mjs",
|
|
14364
14394
|
"mode": "0000644",
|
|
@@ -14689,10 +14719,15 @@
|
|
|
14689
14719
|
"mode": "0000644",
|
|
14690
14720
|
"sha256": "5daff8488df269752d2e5992e60a03bb75cf85a5b8d5fcaa15703b12a5bb6b94"
|
|
14691
14721
|
},
|
|
14722
|
+
{
|
|
14723
|
+
"path": "tests/hub_engagement_cards.mjs",
|
|
14724
|
+
"mode": "0000644",
|
|
14725
|
+
"sha256": "04d3965899d39c3771ff5c55d6bac5482d66d5f0c9e38a12b7b0b751a5bd37f9"
|
|
14726
|
+
},
|
|
14692
14727
|
{
|
|
14693
14728
|
"path": "tests/hub_guild_page.mjs",
|
|
14694
14729
|
"mode": "0000644",
|
|
14695
|
-
"sha256": "
|
|
14730
|
+
"sha256": "77f2e01830dc84f486e75731e3db38f513fdca34c1449fa376497d3565852de4"
|
|
14696
14731
|
},
|
|
14697
14732
|
{
|
|
14698
14733
|
"path": "tests/hub_invite_notices.mjs",
|
|
@@ -15862,7 +15897,7 @@
|
|
|
15862
15897
|
{
|
|
15863
15898
|
"path": "tests/privacy_matrix.mjs",
|
|
15864
15899
|
"mode": "0000644",
|
|
15865
|
-
"sha256": "
|
|
15900
|
+
"sha256": "3a71c46b775910958f38b10cf0c8131cf07ac623e348e80444af65ac7e74ebf7"
|
|
15866
15901
|
},
|
|
15867
15902
|
{
|
|
15868
15903
|
"path": "tests/probe_cache.mjs",
|
|
@@ -15977,7 +16012,7 @@
|
|
|
15977
16012
|
{
|
|
15978
16013
|
"path": "tests/project_invite_ui.mjs",
|
|
15979
16014
|
"mode": "0000644",
|
|
15980
|
-
"sha256": "
|
|
16015
|
+
"sha256": "d95712f34de59acf31b8b78ad811786a26039ed9f051fd142d718049fe8e270f"
|
|
15981
16016
|
},
|
|
15982
16017
|
{
|
|
15983
16018
|
"path": "tests/project_join_door.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
|
-
-
|
|
8
|
+
- 515 operations across 74 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -559,6 +559,8 @@ function createClient(opts = {}) {
|
|
|
559
559
|
getGuildsSlug: (args) => request("GET", "/guilds/{slug}", { hasBody: false }, args),
|
|
560
560
|
// PATCH /guilds/{slug} — rank: any-builder — PATCH /guilds/:slug
|
|
561
561
|
patchGuildsSlug: (args) => request("PATCH", "/guilds/{slug}", { hasBody: true }, args),
|
|
562
|
+
// POST /guilds/{slug}/engagements — rank: any-builder — POST /guilds/:slug/engagements
|
|
563
|
+
postGuildsSlugEngagements: (args) => request("POST", "/guilds/{slug}/engagements", { hasBody: true }, args),
|
|
562
564
|
// POST /guilds/{slug}/invites — rank: any-builder — POST /guilds/:slug/invites
|
|
563
565
|
postGuildsSlugInvites: (args) => request("POST", "/guilds/{slug}/invites", { hasBody: true }, args),
|
|
564
566
|
// GET /guilds/{slug}/members — rank: any-builder — GET /guilds/:slug/members
|
|
@@ -683,6 +685,8 @@ function createClient(opts = {}) {
|
|
|
683
685
|
getMeEventSoundPrefs: (args) => request("GET", "/me/event-sound-prefs", { hasBody: false }, args),
|
|
684
686
|
// PATCH /me/event-sound-prefs — rank: any-builder — PATCH /me/event-sound-prefs
|
|
685
687
|
patchMeEventSoundPrefs: (args) => request("PATCH", "/me/event-sound-prefs", { hasBody: true }, args),
|
|
688
|
+
// GET /me/guild-engagements — rank: any-builder — GET /me/guild-engagements
|
|
689
|
+
getMeGuildEngagements: (args) => request("GET", "/me/guild-engagements", { hasBody: false }, args),
|
|
686
690
|
// GET /me/guild-requests — rank: any-builder — GET /me/guild-requests
|
|
687
691
|
getMeGuildRequests: (args) => request("GET", "/me/guild-requests", { hasBody: false }, args),
|
|
688
692
|
// GET /me/guilds — rank: any-builder — GET /me/guilds
|
|
@@ -853,6 +857,8 @@ function createClient(opts = {}) {
|
|
|
853
857
|
getProjectsFeatured: (args) => request("GET", "/projects/featured", { hasBody: false }, args),
|
|
854
858
|
// POST /projects/invite — rank: metic+archon — POST /projects/invite
|
|
855
859
|
postProjectsInvite: (args) => request("POST", "/projects/invite", { hasBody: true }, args),
|
|
860
|
+
// POST /projects/invite-guild — rank: metic+archon — POST /projects/invite-guild
|
|
861
|
+
postProjectsInviteGuild: (args) => request("POST", "/projects/invite-guild", { hasBody: true }, args),
|
|
856
862
|
},
|
|
857
863
|
"provisioning": {
|
|
858
864
|
// GET /provisioning/control-plane — rank: archon — GET /provisioning/control-plane
|
|
@@ -558,6 +558,8 @@ function createClient(opts = {}) {
|
|
|
558
558
|
getGuildsSlug: (args) => request("GET", "/guilds/{slug}", { hasBody: false }, args),
|
|
559
559
|
// PATCH /guilds/{slug} — rank: any-builder — PATCH /guilds/:slug
|
|
560
560
|
patchGuildsSlug: (args) => request("PATCH", "/guilds/{slug}", { hasBody: true }, args),
|
|
561
|
+
// POST /guilds/{slug}/engagements — rank: any-builder — POST /guilds/:slug/engagements
|
|
562
|
+
postGuildsSlugEngagements: (args) => request("POST", "/guilds/{slug}/engagements", { hasBody: true }, args),
|
|
561
563
|
// POST /guilds/{slug}/invites — rank: any-builder — POST /guilds/:slug/invites
|
|
562
564
|
postGuildsSlugInvites: (args) => request("POST", "/guilds/{slug}/invites", { hasBody: true }, args),
|
|
563
565
|
// GET /guilds/{slug}/members — rank: any-builder — GET /guilds/:slug/members
|
|
@@ -682,6 +684,8 @@ function createClient(opts = {}) {
|
|
|
682
684
|
getMeEventSoundPrefs: (args) => request("GET", "/me/event-sound-prefs", { hasBody: false }, args),
|
|
683
685
|
// PATCH /me/event-sound-prefs — rank: any-builder — PATCH /me/event-sound-prefs
|
|
684
686
|
patchMeEventSoundPrefs: (args) => request("PATCH", "/me/event-sound-prefs", { hasBody: true }, args),
|
|
687
|
+
// GET /me/guild-engagements — rank: any-builder — GET /me/guild-engagements
|
|
688
|
+
getMeGuildEngagements: (args) => request("GET", "/me/guild-engagements", { hasBody: false }, args),
|
|
685
689
|
// GET /me/guild-requests — rank: any-builder — GET /me/guild-requests
|
|
686
690
|
getMeGuildRequests: (args) => request("GET", "/me/guild-requests", { hasBody: false }, args),
|
|
687
691
|
// GET /me/guilds — rank: any-builder — GET /me/guilds
|
|
@@ -852,6 +856,8 @@ function createClient(opts = {}) {
|
|
|
852
856
|
getProjectsFeatured: (args) => request("GET", "/projects/featured", { hasBody: false }, args),
|
|
853
857
|
// POST /projects/invite — rank: metic+archon — POST /projects/invite
|
|
854
858
|
postProjectsInvite: (args) => request("POST", "/projects/invite", { hasBody: true }, args),
|
|
859
|
+
// POST /projects/invite-guild — rank: metic+archon — POST /projects/invite-guild
|
|
860
|
+
postProjectsInviteGuild: (args) => request("POST", "/projects/invite-guild", { hasBody: true }, args),
|
|
855
861
|
},
|
|
856
862
|
"provisioning": {
|
|
857
863
|
// GET /provisioning/control-plane — rank: archon — GET /provisioning/control-plane
|
|
@@ -98,6 +98,7 @@ export interface GetMeAchievementsResponse { unlocked: unknown }
|
|
|
98
98
|
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 }
|
|
99
99
|
export interface GetMeDisplayNameResponse { display_name: unknown; max_length: unknown }
|
|
100
100
|
export interface GetMeEventSoundPrefsResponse { prefs: unknown; effective: unknown; effective_wav: unknown; events: unknown }
|
|
101
|
+
export interface GetMeGuildEngagementsResponse { engagements: unknown; count: unknown }
|
|
101
102
|
export interface GetMeGuildRequestsResponse { incoming: unknown; outgoing: unknown; incoming_count: unknown; outgoing_count: unknown }
|
|
102
103
|
export interface GetMeGuildsResponse { guilds: unknown; count: unknown }
|
|
103
104
|
export interface GetMeRecentShipsResponse { ships: unknown }
|
|
@@ -369,6 +370,8 @@ export interface PostGuildRequestsIdAcceptRequest { visibility?: string; counted
|
|
|
369
370
|
export interface PostGuildRequestsIdAcceptResponse { status: unknown }
|
|
370
371
|
export interface PostGuildsRequest { slug: string; name: string; description?: string; visibility: string }
|
|
371
372
|
export interface PostGuildsResponse { guild: unknown }
|
|
373
|
+
export interface PostGuildsSlugEngagementsRequest { origin: string }
|
|
374
|
+
export interface PostGuildsSlugEngagementsResponse { engagement: unknown }
|
|
372
375
|
export interface PostGuildsSlugInvitesRequest { handles: string[] }
|
|
373
376
|
export interface PostGuildsSlugInvitesResponse { results: unknown; count: unknown }
|
|
374
377
|
export interface PostGuildsSlugRequestsRequest { counted_in_totals?: unknown }
|
|
@@ -412,7 +415,7 @@ export interface PostModulesKeySubmitRequest { signed_by?: string }
|
|
|
412
415
|
export interface PostModulesKeySubmitResponse { ok: boolean; submission: unknown }
|
|
413
416
|
export interface PostMyProjectsClientIdLeaveResponse { ok: boolean; left: unknown }
|
|
414
417
|
export interface PostMyProjectsInvitesClientIdDeclineResponse { ok: boolean; accepted: boolean }
|
|
415
|
-
export interface PostMyProjectsJoinRequest { origin: string; note?: string }
|
|
418
|
+
export interface PostMyProjectsJoinRequest { origin: string; note?: string; guild?: string }
|
|
416
419
|
export interface PostMyProjectsJoinResponse { ok: boolean; status: unknown; project: unknown; message: unknown }
|
|
417
420
|
export interface PostNpmReleasePreviewRequest { version: string }
|
|
418
421
|
export interface PostNpmReleaseReleaseRequest { version: string }
|
|
@@ -424,6 +427,8 @@ export interface PostPageNotesIdeasRequest { page_id: string; page_path?: string
|
|
|
424
427
|
export interface PostPageNotesIdeasResponse { ideas: unknown; split_by: unknown }
|
|
425
428
|
export interface PostPageNotesRequest { page_id: string; page_path?: string; page_title?: string }
|
|
426
429
|
export interface PostPageNotesResponse { note: unknown; images: unknown }
|
|
430
|
+
export interface PostProjectsInviteGuildRequest { client_id: string; guild: string }
|
|
431
|
+
export interface PostProjectsInviteGuildResponse { invited: boolean; guild: unknown; invites: unknown; count: unknown }
|
|
427
432
|
export interface PostProjectsInviteRequest { client_id: string; github_login: string }
|
|
428
433
|
export interface PostProjectsInviteResponse { invited: boolean; invite_url: unknown }
|
|
429
434
|
export interface PostProjectsProjectIdSpecialitiesRequest { name: string; discipline: string; summary?: string; contract_md?: string; visibility?: string; sellable?: boolean; skills?: string[] }
|
|
@@ -481,7 +486,7 @@ export interface PostSpecialitiesResponse { speciality: unknown }
|
|
|
481
486
|
export interface PostSsoActivityRollupRequest { client_id: string; client_secret: string; github_id: StringifiableId; credits?: number; tasks_shipped?: number; karma?: number; rank?: string; disciplines?: unknown; recent_ships?: unknown; crafts?: unknown }
|
|
482
487
|
export interface PostSsoActivityRollupResponse { ok: boolean }
|
|
483
488
|
export interface PostSsoApplicantProfileRequest { client_id: string; client_secret: string; github_id: StringifiableId }
|
|
484
|
-
export interface PostSsoApplicantProfileResponse { profile: unknown }
|
|
489
|
+
export interface PostSsoApplicantProfileResponse { profile: unknown; guild: unknown }
|
|
485
490
|
export interface PostSsoDevicePollRequest { device_code: string }
|
|
486
491
|
export interface PostSsoDeviceStartRequest { origin: string }
|
|
487
492
|
export interface PostSsoFeedbackRequest { client_id: string; client_secret: string; github_id: StringifiableId; message: string; kind?: string; context?: unknown }
|
|
@@ -1041,6 +1046,8 @@ export interface BongosClient {
|
|
|
1041
1046
|
getGuildsSlug(args?: RequestArgs): Promise<GetGuildsSlugResponse>;
|
|
1042
1047
|
/** PATCH /guilds/{slug} — rank: any-builder */
|
|
1043
1048
|
patchGuildsSlug(args?: RequestArgs & { body?: PatchGuildsSlugRequest }): Promise<PatchGuildsSlugResponse>;
|
|
1049
|
+
/** POST /guilds/{slug}/engagements — rank: any-builder */
|
|
1050
|
+
postGuildsSlugEngagements(args: RequestArgs & { body: PostGuildsSlugEngagementsRequest }): Promise<PostGuildsSlugEngagementsResponse>;
|
|
1044
1051
|
/** POST /guilds/{slug}/invites — rank: any-builder */
|
|
1045
1052
|
postGuildsSlugInvites(args: RequestArgs & { body: PostGuildsSlugInvitesRequest }): Promise<PostGuildsSlugInvitesResponse>;
|
|
1046
1053
|
/** GET /guilds/{slug}/members — rank: any-builder */
|
|
@@ -1165,6 +1172,8 @@ export interface BongosClient {
|
|
|
1165
1172
|
getMeEventSoundPrefs(args?: RequestArgs): Promise<GetMeEventSoundPrefsResponse>;
|
|
1166
1173
|
/** PATCH /me/event-sound-prefs — rank: any-builder */
|
|
1167
1174
|
patchMeEventSoundPrefs(args?: RequestArgs): Promise<PatchMeEventSoundPrefsResponse>;
|
|
1175
|
+
/** GET /me/guild-engagements — rank: any-builder */
|
|
1176
|
+
getMeGuildEngagements(args?: RequestArgs): Promise<GetMeGuildEngagementsResponse>;
|
|
1168
1177
|
/** GET /me/guild-requests — rank: any-builder */
|
|
1169
1178
|
getMeGuildRequests(args?: RequestArgs): Promise<GetMeGuildRequestsResponse>;
|
|
1170
1179
|
/** GET /me/guilds — rank: any-builder */
|
|
@@ -1335,6 +1344,8 @@ export interface BongosClient {
|
|
|
1335
1344
|
getProjectsFeatured(args?: RequestArgs): Promise<GetProjectsFeaturedResponse>;
|
|
1336
1345
|
/** POST /projects/invite — rank: metic+archon */
|
|
1337
1346
|
postProjectsInvite(args: RequestArgs & { body: PostProjectsInviteRequest }): Promise<PostProjectsInviteResponse>;
|
|
1347
|
+
/** POST /projects/invite-guild — rank: metic+archon */
|
|
1348
|
+
postProjectsInviteGuild(args: RequestArgs & { body: PostProjectsInviteGuildRequest }): Promise<PostProjectsInviteGuildResponse>;
|
|
1338
1349
|
};
|
|
1339
1350
|
"provisioning": {
|
|
1340
1351
|
/** GET /provisioning/control-plane — rank: archon */
|
|
@@ -555,6 +555,8 @@ export function createClient(opts = {}) {
|
|
|
555
555
|
getGuildsSlug: (args) => request("GET", "/guilds/{slug}", { hasBody: false }, args),
|
|
556
556
|
// PATCH /guilds/{slug} — rank: any-builder — PATCH /guilds/:slug
|
|
557
557
|
patchGuildsSlug: (args) => request("PATCH", "/guilds/{slug}", { hasBody: true }, args),
|
|
558
|
+
// POST /guilds/{slug}/engagements — rank: any-builder — POST /guilds/:slug/engagements
|
|
559
|
+
postGuildsSlugEngagements: (args) => request("POST", "/guilds/{slug}/engagements", { hasBody: true }, args),
|
|
558
560
|
// POST /guilds/{slug}/invites — rank: any-builder — POST /guilds/:slug/invites
|
|
559
561
|
postGuildsSlugInvites: (args) => request("POST", "/guilds/{slug}/invites", { hasBody: true }, args),
|
|
560
562
|
// GET /guilds/{slug}/members — rank: any-builder — GET /guilds/:slug/members
|
|
@@ -679,6 +681,8 @@ export function createClient(opts = {}) {
|
|
|
679
681
|
getMeEventSoundPrefs: (args) => request("GET", "/me/event-sound-prefs", { hasBody: false }, args),
|
|
680
682
|
// PATCH /me/event-sound-prefs — rank: any-builder — PATCH /me/event-sound-prefs
|
|
681
683
|
patchMeEventSoundPrefs: (args) => request("PATCH", "/me/event-sound-prefs", { hasBody: true }, args),
|
|
684
|
+
// GET /me/guild-engagements — rank: any-builder — GET /me/guild-engagements
|
|
685
|
+
getMeGuildEngagements: (args) => request("GET", "/me/guild-engagements", { hasBody: false }, args),
|
|
682
686
|
// GET /me/guild-requests — rank: any-builder — GET /me/guild-requests
|
|
683
687
|
getMeGuildRequests: (args) => request("GET", "/me/guild-requests", { hasBody: false }, args),
|
|
684
688
|
// GET /me/guilds — rank: any-builder — GET /me/guilds
|
|
@@ -849,6 +853,8 @@ export function createClient(opts = {}) {
|
|
|
849
853
|
getProjectsFeatured: (args) => request("GET", "/projects/featured", { hasBody: false }, args),
|
|
850
854
|
// POST /projects/invite — rank: metic+archon — POST /projects/invite
|
|
851
855
|
postProjectsInvite: (args) => request("POST", "/projects/invite", { hasBody: true }, args),
|
|
856
|
+
// POST /projects/invite-guild — rank: metic+archon — POST /projects/invite-guild
|
|
857
|
+
postProjectsInviteGuild: (args) => request("POST", "/projects/invite-guild", { hasBody: true }, args),
|
|
852
858
|
},
|
|
853
859
|
"provisioning": {
|
|
854
860
|
// GET /provisioning/control-plane — rank: archon — GET /provisioning/control-plane
|
|
@@ -143,6 +143,8 @@ The guild page lives at **`/g/<slug>`** on the hub, the sibling of `/u/<handle>`
|
|
|
143
143
|
|
|
144
144
|
### D7 — A guild engages a project only through the individual door, one person at a time
|
|
145
145
|
|
|
146
|
+
> **Amended by [ADR 0365](0365-a-guild-engages-a-project-through-each-members-own-door.md) (2026-10-05):** after ADR 0353 the hub writes no invites, so "a project invites a guild" returns one hall hand-off link per public-roster member instead of fanning out hub invites; the guild label reaches the queue in R28.
|
|
147
|
+
|
|
146
148
|
A project still admits **people**, through the one door ADR 0201 built, so no new admission path exists. The hub holds a guild-level **engagement** row: `(guild_id, client_id, kind ∈ {'apply','invited'}, created_at)`. It records no filer, for the same reason the guild row keeps no creator. It is **statusless**, for the ADR 0201 D1.3 reason (the hub may not hold an admission fact about someone else's project), and it ages out read-time at 30 days.
|
|
147
149
|
|
|
148
150
|
- **A guild applies** (the owner files it). Each member sees "G is applying to P — apply with them?" in their own inbox. **Opting in is applying as yourself** through the existing relay (`POST /my-projects/join`, vouched, echoed), with the engagement attached to that member's application echo. Nobody reaches P without their own act. P receives ordinary vouched applications and approves each with `access_request.review`, exactly as today. The **guild label reaches P's queue through the live applicant-profile read** (ADR 0260's `POST /sso/applicant-profile`, which already reads the echo), returning `guild: { slug, name }` when the echo carries an engagement. There is no new body field, header or instance column, so a project on any core pin keeps working (the ADR 0201 D2.2 compatibility rule). For a public guild, the reviewer may open its public page. For an unlisted guild, the reviewer sees its name and the applying members' own applicant views, and nothing else.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# ADR 0365 — A guild engages a project through each member's own door: an application is each member's, an invite is hand-off links
|
|
2
|
+
|
|
3
|
+
- **Status:** accepted
|
|
4
|
+
- **Date:** 2026-10-05
|
|
5
|
+
- **Task:** [task 1002303](https://cloudbongos.com/builders#/task/1002303) (R27, goal 1000110 — BONGOS-V2)
|
|
6
|
+
- **Amends:** [ADR 0336](0336-a-guilds-record-is-the-sum-of-what-its-members-already-show.md) D7 (the invite half)
|
|
7
|
+
- **Builds on:** [ADR 0353](0353-a-hub-invite-is-a-notice-of-the-projects-own-invite.md) D3 (the hub's own invite writes nothing; it hands the inviter to the project's hall), [ADR 0201](0201-cross-project-application-vouched-row-live-record.md) D1.3 (the application echo), [ADR 0260](0260-the-application-is-the-consent-and-the-echo-is-the-gate.md) (the echo gates the live applicant-profile read)
|
|
8
|
+
- **Decided with:** the owner, 2026-10-05, choosing each recommended option in four questions (recorded on the task).
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
ADR 0336 D7 (2026-09-24) said a guild engages a project only through the individual door, and gave the invite half a mechanism: the hub "fans out ordinary individual invites, through the same primitive used to invite one builder (today `inviteToProject`)". Six days later ADR 0353 changed what that primitive is. The hub's own invite now writes nothing, because a hub `pending` row with no `invited` row on the project leads the invitee to a locked door — on an `apply` door, the default. `inviteToProject` survives only as the call a project makes to tell the hub about its OWN invite (`invite-notices.js`).
|
|
13
|
+
|
|
14
|
+
Built as D7 reads, the fan-out would recreate exactly the state ADR 0353 removed, once per guild member. And a one-step fan-out that writes real invites needs the hub to ask the project to pre-approve people — the signed hub→project assertion ADR 0335 deferred, which is its own design.
|
|
15
|
+
|
|
16
|
+
Two further gaps showed when the task was planned. Projects read only `body.profile` from the applicant-profile response, so a guild label the hub returns is discarded by every project today. And ADR 0337 D4.4's notice ("your numbers count toward the guild's rounded totals") was asked of guild invite, request and accept cards that do not exist yet: R24 built their routes, but no UI calls them.
|
|
17
|
+
|
|
18
|
+
## Decision
|
|
19
|
+
|
|
20
|
+
### D1 — The engagement row is as D7 specified
|
|
21
|
+
|
|
22
|
+
`platform_identity_guild_engagements (guild_id, client_id, kind ∈ {'apply','invited'}, created_at)`: no filer, no status, ageing out when read at 30 days. Re-filing restarts the window. The echo gains a nullable `guild_id`, so the most recent application decides the label: applying again on your own clears it.
|
|
23
|
+
|
|
24
|
+
### D2 — A guild applies: unchanged from D7
|
|
25
|
+
|
|
26
|
+
The guild owner files the engagement. Each member sees "G is applying to P — apply with them?" in their own invitations, and applying is applying as yourself through the existing relay, with `guild` naming the engagement. A `guild` that no longer resolves for the caller (left the guild, engagement aged out) refuses with 409 and relays nothing. Filing does not apply on the owner's behalf; the owner applies like every other member.
|
|
27
|
+
|
|
28
|
+
### D3 — A project invites a guild: hand-off links, not hub-written invites
|
|
29
|
+
|
|
30
|
+
Whoever passes the project's inviter gate names a public guild. The hub records the `invited` engagement and returns one hall hand-off link per member on the guild's **public roster at that moment** — the people the inviter could see — through the same `hallInviteUrl` ADR 0353 D3 uses for one builder. The inviter sends each invite from the project's hall, so every invite is the project's own `invited` row and every acceptance is signing in. Members who join later inherit nothing; members the inviter could not see get the "P invited this guild" notice and may apply themselves. An unlisted guild cannot be invited (it answers like an unknown one).
|
|
31
|
+
|
|
32
|
+
A member who opted out of recruiting is still listed (owner, 2026-10-05): the inviter named the guild and sees only what its public page already shows, and each member still accepts or ignores their own invite — this is not the recruiting reach ADR 0251 governs.
|
|
33
|
+
|
|
34
|
+
The one-step fan-out — the hub asking the project to pre-approve N people — stays deferred with ADR 0335's signed-assertion relay.
|
|
35
|
+
|
|
36
|
+
### D4 — A project is named only when it is on the map and public, for both kinds
|
|
37
|
+
|
|
38
|
+
The naming rule (`onMapSql AND visibility = 'public'`, the ADR 0171 D2 amendment) gates the `invited` notice AND guild applications, at filing and again at read. A private or stealth project's engagement is not shown at all, rather than shown anonymised: otherwise the hub would be the one telling a roster that a project it never chose to name is recruiting. Filing against an unknown, inactive or non-public project answers one identical 404.
|
|
39
|
+
|
|
40
|
+
### D5 — The label rides the applicant-profile read; the queue is R28's
|
|
41
|
+
|
|
42
|
+
`POST /sso/applicant-profile` answers `{ profile, guild }` — `guild: { slug, name }` while the applicant is still a member (slug null for an unlisted guild), null otherwise, best-effort after the existing gate. Old projects ignore the extra field (the ADR 0201 D2.2 compatibility rule). Passing it through core and showing it in the queue is [task 1002304](https://cloudbongos.com/builders#/task/1002304) (R28).
|
|
43
|
+
|
|
44
|
+
### D6 — The D4.4 cards are their own task
|
|
45
|
+
|
|
46
|
+
The guild invite and join-request cards, with the totals notice and switch, are [task 1004583](https://cloudbongos.com/builders#/task/1004583). This task's cards are engagements: they ask a member to apply to a project, not to join a guild.
|
|
47
|
+
|
|
48
|
+
## Consequences
|
|
49
|
+
|
|
50
|
+
- No new hub→project call and no new instance field, so every project on any core pin keeps working.
|
|
51
|
+
- Inviting a guild is N clicks from the project's hall, not one. That is the honest cost of keeping admission on the project.
|
|
52
|
+
- No withdraw route: an engagement simply ages out.
|
|
53
|
+
|
|
54
|
+
## Alternatives considered
|
|
55
|
+
|
|
56
|
+
- **D7 as written (the hub calls `inviteToProject` per member).** Rejected: recreates ADR 0353's locked door per member.
|
|
57
|
+
- **Build the signed hub→project relay now.** Rejected for this task: security-sensitive, and it only works once every project upgrades.
|
|
58
|
+
- **An anonymised "a private project invited this guild" notice.** Rejected: it still widens a private project's reach to people it never saw.
|