@bongos/core 1.21.61 → 1.21.63

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 +62 -42
  2. package/clients/bongos-client/index.d.ts +1 -1
  3. package/docs/adr/0366-hall-planning-is-forms-and-a-goal-made-there-carries-its-own-spec-task.md +85 -0
  4. package/docs/adr/README.md +1 -0
  5. package/docs/api/openapi.json +7 -3
  6. package/docs/api-reference.md +1 -1
  7. package/docs/copy-inventory.md +301 -301
  8. package/docs/copy-registry.json +342 -342
  9. package/docs/module-api-changelog.md +4 -0
  10. package/docs/onboarding/diagrams/assertions.json +1 -1
  11. package/docs/page-inventory.json +4 -1
  12. package/docs/page-readings.json +687 -670
  13. package/modules/lifecycle/merge-lock.js +53 -9
  14. package/modules/lifecycle/ship-preflight.js +40 -22
  15. package/modules/platform-identity/guilds.js +32 -0
  16. package/modules/platform-identity/routes/guilds.js +10 -3
  17. package/modules/public-landing/public/assets/cosmos.css +29 -3
  18. package/modules/public-landing/public/projects.html +294 -4
  19. package/modules/public-landing/public/projects.probes.json +18 -0
  20. package/modules/public-landing/public/projects.states.json +3 -0
  21. package/modules/ui-design/kit/fixtures/guilds.json +7 -0
  22. package/modules/ui-design/kit/fixtures/me__guild-requests.json +9 -0
  23. package/modules/ui-design/kit/serve.js +41 -0
  24. package/package-lock.json +2 -2
  25. package/package.json +1 -1
  26. package/release-notes.json +16 -0
  27. package/scripts/gds/ship-grade.js +13 -6
  28. package/scripts/gds/ship-merge-gate.js +26 -0
  29. package/scripts/gds/ship-merge.js +12 -3
  30. package/scripts/gds/ship-state.js +42 -5
  31. package/src/module-api.js +1 -1
  32. package/tests/guilds_api.mjs +31 -0
  33. package/tests/guilds_db.mjs +7 -0
  34. package/tests/hub_engagement_cards.mjs +9 -6
  35. package/tests/hub_guild_cards.mjs +392 -0
  36. package/tests/merge_lock.mjs +58 -0
  37. package/tests/ship_merge_gate.mjs +63 -0
  38. package/tests/ship_preflight.mjs +46 -1
  39. package/tests/ship_vendored_instance.mjs +259 -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.21.61",
6
- "core_contract": "1.21.61",
7
- "source_commit": "af0a03f180373b14387c419d584201ee10f7a5ab",
5
+ "core_version": "1.21.63",
6
+ "core_contract": "1.21.63",
7
+ "source_commit": "d41368cb70cf813937608660b4f1ce0719e0523c",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-05T10:43:45.436Z",
9
+ "built_at": "2026-10-06T00:15:37.787Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 585,
12
+ "docs_redacted": 586,
13
13
  "agent_docs_stubbed": 28,
14
- "functional_verbatim": 2948,
14
+ "functional_verbatim": 2951,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3562,
20
- "tree_sha256": "0537fa5681807a5c2c7bd9b89d503ede191d00215928234a666c9795d20de7eb",
19
+ "file_count": 3566,
20
+ "tree_sha256": "739a2690a0bb3d598fab3a9c799e365ba82d2b41522a3c5e5fc89bb736b5afec",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -332,7 +332,7 @@
332
332
  {
333
333
  "path": "clients/bongos-client/index.d.ts",
334
334
  "mode": "0000644",
335
- "sha256": "2e250be34d7de5f2b98a835d054ec301c88bac96538509f51074c9c5382b781d"
335
+ "sha256": "13975c1817d7441022af0decfcc9561e09e7c953eb92aa8ce36831abdd61223b"
336
336
  },
337
337
  {
338
338
  "path": "clients/bongos-client/index.mjs",
@@ -2284,20 +2284,25 @@
2284
2284
  "mode": "0000644",
2285
2285
  "sha256": "93c863a7f961cd91c052eee2188b16b9f360cec26478dde6225b304ee0e59f7d"
2286
2286
  },
2287
+ {
2288
+ "path": "docs/adr/0366-hall-planning-is-forms-and-a-goal-made-there-carries-its-own-spec-task.md",
2289
+ "mode": "0000644",
2290
+ "sha256": "29c841d193efa7b6f6479e14a6056057138574fcd7b526f667da6f219dece5a7"
2291
+ },
2287
2292
  {
2288
2293
  "path": "docs/adr/README.md",
2289
2294
  "mode": "0000644",
2290
- "sha256": "a81d1eeeb26ce4fde1731485e943d82ddb320bc60a5f1782f7a207b94da5fff5"
2295
+ "sha256": "08f66fecefc58d9c09e45841dd9d47514e807934cfcd4621a8bfeaa390afb334"
2291
2296
  },
2292
2297
  {
2293
2298
  "path": "docs/api-reference.md",
2294
2299
  "mode": "0000644",
2295
- "sha256": "3943fbe1d9661c16ee6f4f455312312359fe4b1e59da88b37858e76e302aae45"
2300
+ "sha256": "0b828454e83a6321177f11793f120372fdddaef0dec6a02471937785685944df"
2296
2301
  },
2297
2302
  {
2298
2303
  "path": "docs/api/openapi.json",
2299
2304
  "mode": "0000644",
2300
- "sha256": "f0d70cbc5227c426ffa47c245ac281575459943e9fef2c196d325620574a91bb"
2305
+ "sha256": "3ee03a72d3757bca0938a893421ca02710d4f0c73634a381b873664c086b435a"
2301
2306
  },
2302
2307
  {
2303
2308
  "path": "docs/architecture.md",
@@ -2322,12 +2327,12 @@
2322
2327
  {
2323
2328
  "path": "docs/copy-inventory.md",
2324
2329
  "mode": "0000644",
2325
- "sha256": "38102e6280c4560deab4ec5c65e5bfba0f423a9bb71a9a101a3a41246a5a7078"
2330
+ "sha256": "f6f91263fa72b1b421dd9c0868bfd750f8a65466b34e67b4305d1243fb6386a0"
2326
2331
  },
2327
2332
  {
2328
2333
  "path": "docs/copy-registry.json",
2329
2334
  "mode": "0000644",
2330
- "sha256": "d843d30609d3e1391b89702e79e3bc9dc765f5ed332b1861a918a7179671e2f1"
2335
+ "sha256": "d8483d26f99e8ad3b73bb4490e8fbcf78b0dd0b919d80bd5749bb87768b40687"
2331
2336
  },
2332
2337
  {
2333
2338
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2837,7 +2842,7 @@
2837
2842
  {
2838
2843
  "path": "docs/module-api-changelog.md",
2839
2844
  "mode": "0000644",
2840
- "sha256": "fe852dba06c424e3ff2b7b84eb4cc4670690525201f2d1929e9fd5a0340ab522"
2845
+ "sha256": "628a2c51dfe01f436ee3d1dbc8c79d731c4d2c8be8a7f32d0f4aaa8a649703a7"
2841
2846
  },
2842
2847
  {
2843
2848
  "path": "docs/modules-contract.md",
@@ -2877,7 +2882,7 @@
2877
2882
  {
2878
2883
  "path": "docs/onboarding/diagrams/assertions.json",
2879
2884
  "mode": "0000644",
2880
- "sha256": "b2e8855cbc2acc539dbd060093a15bdd0a9d073fe8006736552d07676f3d6899"
2885
+ "sha256": "1cda1da05b0a74bc5532e478acbf3d625c49d1a1fac3b75ed967626d95a022bc"
2881
2886
  },
2882
2887
  {
2883
2888
  "path": "docs/onboarding/diagrams/puppeteer-config.json",
@@ -2922,12 +2927,12 @@
2922
2927
  {
2923
2928
  "path": "docs/page-inventory.json",
2924
2929
  "mode": "0000644",
2925
- "sha256": "8f3f9d5bad79803f5bbf96ee25bbbe4bb4915455107bdf9adcc23c2ea04e7cd8"
2930
+ "sha256": "bfc236a808f6cd7cdc51fd2b872077500d7d5932d16a365d4c4a081521f729e7"
2926
2931
  },
2927
2932
  {
2928
2933
  "path": "docs/page-readings.json",
2929
2934
  "mode": "0000644",
2930
- "sha256": "db5cba7d0748f9a961561190f819ef6f23b55b2ddab6fdd86522be37dbd67ceb"
2935
+ "sha256": "339badbdc838f18409778ace02e3e820e948be47fef16997c2ffd5d8b9b7149d"
2931
2936
  },
2932
2937
  {
2933
2938
  "path": "docs/project-context.template.md",
@@ -7047,7 +7052,7 @@
7047
7052
  {
7048
7053
  "path": "modules/lifecycle/merge-lock.js",
7049
7054
  "mode": "0000644",
7050
- "sha256": "aaa5171275b156b67ed9767c341fda462fd6e6e44e4591d9fd21ba1aece996ac"
7055
+ "sha256": "16667b27f462627277da092dd0cf8905cf7144f1a959fdaf3174a9fb41a91da4"
7051
7056
  },
7052
7057
  {
7053
7058
  "path": "modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql",
@@ -7367,7 +7372,7 @@
7367
7372
  {
7368
7373
  "path": "modules/lifecycle/ship-preflight.js",
7369
7374
  "mode": "0000644",
7370
- "sha256": "3b08535b9a680b6f0eaf0ab2d5e38f8ae77ff5563b517a97c1ab34402f5c7a06"
7375
+ "sha256": "99de217d003dd0a837e8604a7a6fedc28be8e5e589c0e4d70b7f46eca1b4432e"
7371
7376
  },
7372
7377
  {
7373
7378
  "path": "modules/lifecycle/sky.js",
@@ -7772,7 +7777,7 @@
7772
7777
  {
7773
7778
  "path": "modules/platform-identity/guilds.js",
7774
7779
  "mode": "0000644",
7775
- "sha256": "9f3231c4ae89a72742ba460224068fa34850fbe284a105ed5142d5a32f3572f3"
7780
+ "sha256": "826f8e0be8af72363f1f8361be2a66d5a25f3753c187b9cfc0d0523cdd86fd4c"
7776
7781
  },
7777
7782
  {
7778
7783
  "path": "modules/platform-identity/hub-device.js",
@@ -8037,7 +8042,7 @@
8037
8042
  {
8038
8043
  "path": "modules/platform-identity/routes/guilds.js",
8039
8044
  "mode": "0000644",
8040
- "sha256": "63442c19efe41269fde8d7f3f114d24d508baaf602b5998d73ab112bdbca30c3"
8045
+ "sha256": "c3c794710e67a7adef83c954921527d31f97191ea6cf6de08fe05bb114a51367"
8041
8046
  },
8042
8047
  {
8043
8048
  "path": "modules/platform-identity/routes/my-projects.js",
@@ -8822,7 +8827,7 @@
8822
8827
  {
8823
8828
  "path": "modules/public-landing/public/assets/cosmos.css",
8824
8829
  "mode": "0000644",
8825
- "sha256": "399fa97b3a03a1ef99c6be925822fc36ab0d4a2b712dbe7cf7453efe9509e00e"
8830
+ "sha256": "1b1852573d29c0c54c9118fc9ebe20d75ceab59649027d7fd200d4818873ef7a"
8826
8831
  },
8827
8832
  {
8828
8833
  "path": "modules/public-landing/public/assets/hub-bar.js",
@@ -9217,17 +9222,17 @@
9217
9222
  {
9218
9223
  "path": "modules/public-landing/public/projects.html",
9219
9224
  "mode": "0000644",
9220
- "sha256": "bef16bab1080297b50cf1783bd3df23fe0310aabca2b4376b502256f5d4fe436"
9225
+ "sha256": "16d6002596ce553b613fa864a29f6edbb9b19334876882428c773e6983ffe9af"
9221
9226
  },
9222
9227
  {
9223
9228
  "path": "modules/public-landing/public/projects.probes.json",
9224
9229
  "mode": "0000644",
9225
- "sha256": "d0681e889c1536ba24e038187b7c18db15aa0ccdcd71152e53f03390d2181b8f"
9230
+ "sha256": "6441fd50117b07075ca17e5373308301d00867986a62dd231c54ca03ab63dc70"
9226
9231
  },
9227
9232
  {
9228
9233
  "path": "modules/public-landing/public/projects.states.json",
9229
9234
  "mode": "0000644",
9230
- "sha256": "ca468df0378d929b5332c282b64084aefa186cfc0d22cc2510611d6055477165"
9235
+ "sha256": "88f774bb404c22062dd2e63ce7353c73ca8ac8871d27d00638e44dee48db1793"
9231
9236
  },
9232
9237
  {
9233
9238
  "path": "modules/public-landing/public/terms.html",
@@ -9712,7 +9717,7 @@
9712
9717
  {
9713
9718
  "path": "modules/ui-design/kit/fixtures/guilds.json",
9714
9719
  "mode": "0000644",
9715
- "sha256": "ce48f794f2e1c1607c27278f4498ca9caad145f010e8d3dfc5d36c6241ae76b2"
9720
+ "sha256": "dc7918ee0c1327d5c247cd105f0e986111f2bbe29c07370c36c4eeb99e19de6d"
9716
9721
  },
9717
9722
  {
9718
9723
  "path": "modules/ui-design/kit/fixtures/leaderboard.json",
@@ -9749,6 +9754,11 @@
9749
9754
  "mode": "0000644",
9750
9755
  "sha256": "162489516c87175269bf43a018fd97fa4acb199dd947897fad4d3d0a8900076f"
9751
9756
  },
9757
+ {
9758
+ "path": "modules/ui-design/kit/fixtures/me__guild-requests.json",
9759
+ "mode": "0000644",
9760
+ "sha256": "8b570740db3306fdaade674fada0511d9d2152d63c5eb47bcbec28a597270bd5"
9761
+ },
9752
9762
  {
9753
9763
  "path": "modules/ui-design/kit/fixtures/my-projects.json",
9754
9764
  "mode": "0000644",
@@ -9822,7 +9832,7 @@
9822
9832
  {
9823
9833
  "path": "modules/ui-design/kit/serve.js",
9824
9834
  "mode": "0000644",
9825
- "sha256": "7bfca5557ddb82596cd1d0b9a1023f4f1fe81bd99fccbb7abee102b931549498"
9835
+ "sha256": "8ee400210af0a4c20d8737f756cd04717f684ba4927c323b9377d70aca809454"
9826
9836
  },
9827
9837
  {
9828
9838
  "path": "modules/ui-design/kit/tells.js",
@@ -9957,12 +9967,12 @@
9957
9967
  {
9958
9968
  "path": "package-lock.json",
9959
9969
  "mode": "0000644",
9960
- "sha256": "b9418adf527e06a17607eff5caea767b391e41fbe70b95a429c493dd72c0e443"
9970
+ "sha256": "420432c580d464d69a8e202ef34d471ca361e48a9ba41bc2db2c0d4cad874f58"
9961
9971
  },
9962
9972
  {
9963
9973
  "path": "package.json",
9964
9974
  "mode": "0000644",
9965
- "sha256": "1be4723fd1f70d91d04a5f8ca95237fd864b704ec61e978e25d3169f6eb29f31"
9975
+ "sha256": "046e83692e6f67d76f0724f15fdd0b0848a27df4c72a931f794e644bed628257"
9966
9976
  },
9967
9977
  {
9968
9978
  "path": "public-docs/index.html",
@@ -9982,7 +9992,7 @@
9982
9992
  {
9983
9993
  "path": "release-notes.json",
9984
9994
  "mode": "0000644",
9985
- "sha256": "6921afa5e5ab728375f7dbfe4f8a0b024d4006d65912fa52601145cba74a5c86"
9995
+ "sha256": "d967b31f93314c9df18eb5346bb761835cbf1bd69a69443e515f4adad9fe5ea9"
9986
9996
  },
9987
9997
  {
9988
9998
  "path": "scripts/cron/style_guide_audit.sh",
@@ -11457,7 +11467,7 @@
11457
11467
  {
11458
11468
  "path": "scripts/gds/ship-grade.js",
11459
11469
  "mode": "0000644",
11460
- "sha256": "eb0740f3cdc3dc91038320dd9044dc81c05e31212059d772d5c8bf6e9f44b474"
11470
+ "sha256": "5fd40df43c942eb3fcbd24a22c22743e63d2b32efba3c612c7e2fa791ad0f087"
11461
11471
  },
11462
11472
  {
11463
11473
  "path": "scripts/gds/ship-honesty.js",
@@ -11482,12 +11492,12 @@
11482
11492
  {
11483
11493
  "path": "scripts/gds/ship-merge-gate.js",
11484
11494
  "mode": "0000644",
11485
- "sha256": "34c28500eb2c4324f44c5b3604049c305d7b7921b57557ee325ece88b6293252"
11495
+ "sha256": "fba341724c94b1ab9a56b1b43cda608eaa477f50c6f8e65ec287632367d603a9"
11486
11496
  },
11487
11497
  {
11488
11498
  "path": "scripts/gds/ship-merge.js",
11489
11499
  "mode": "0000644",
11490
- "sha256": "7b877a3a3cb63c41923b9e6410f042b13263afe88429ade6b32f6d4e90d4fadd"
11500
+ "sha256": "8d37d5c6cbaa1ca0e8363fab6c34159d1e16922fdae11d4ffc17b4d9e2c7f795"
11491
11501
  },
11492
11502
  {
11493
11503
  "path": "scripts/gds/ship-preflight-steps.js",
@@ -11512,7 +11522,7 @@
11512
11522
  {
11513
11523
  "path": "scripts/gds/ship-state.js",
11514
11524
  "mode": "0000644",
11515
- "sha256": "a22377162ea9449249ee338e434c2b595a4de88743e6dacc290138f0ea9799dc"
11525
+ "sha256": "e465cb391d4518258290d6f53be3a31353e701fb21935f8e1f9ff7b4f38e00a6"
11516
11526
  },
11517
11527
  {
11518
11528
  "path": "scripts/gds/ship-surprise.js",
@@ -12202,7 +12212,7 @@
12202
12212
  {
12203
12213
  "path": "src/module-api.js",
12204
12214
  "mode": "0000644",
12205
- "sha256": "27af8869982707a3bbb16a65d9d2b0ccca2a40a579448aa9cc8fd10045e5c93d"
12215
+ "sha256": "abc57062eb654fff799c6a526b21509943ac0b70c3e500680c139ac20b115f6b"
12206
12216
  },
12207
12217
  {
12208
12218
  "path": "src/module-loader/catalog.js",
@@ -14437,12 +14447,12 @@
14437
14447
  {
14438
14448
  "path": "tests/guilds_api.mjs",
14439
14449
  "mode": "0000644",
14440
- "sha256": "ae92262fb5fa1a79b1540538e7b9191ae47d19c3b4ae3572d07d470159f4ef91"
14450
+ "sha256": "e263fd48c54517e604e993e4d49a6100588095bfcde73a694939b353ebb29acd"
14441
14451
  },
14442
14452
  {
14443
14453
  "path": "tests/guilds_db.mjs",
14444
14454
  "mode": "0000644",
14445
- "sha256": "f4d974c9fd565ff6b81f3a3183e2c933e93b35d731b87505513b32ddd3daf337"
14455
+ "sha256": "8d8847a10fb1930a1c64acd66efb372acef0e742b0b5d804a994d003759f5248"
14446
14456
  },
14447
14457
  {
14448
14458
  "path": "tests/hall_approval_queue.mjs",
@@ -14747,7 +14757,12 @@
14747
14757
  {
14748
14758
  "path": "tests/hub_engagement_cards.mjs",
14749
14759
  "mode": "0000644",
14750
- "sha256": "04d3965899d39c3771ff5c55d6bac5482d66d5f0c9e38a12b7b0b751a5bd37f9"
14760
+ "sha256": "baa4acc689e632692a8fc7ec0a6502e5f00f74e5bec267322784fdb6de5f74fc"
14761
+ },
14762
+ {
14763
+ "path": "tests/hub_guild_cards.mjs",
14764
+ "mode": "0000644",
14765
+ "sha256": "b8fa62d1e72e377d011186be16c1b3799eda8da5c238bf42581925fab85ee2b3"
14751
14766
  },
14752
14767
  {
14753
14768
  "path": "tests/hub_guild_page.mjs",
@@ -15332,7 +15347,7 @@
15332
15347
  {
15333
15348
  "path": "tests/merge_lock.mjs",
15334
15349
  "mode": "0000644",
15335
- "sha256": "5617e46b1e07ceb5fd537ae1192a27c88e8ce5d1fd06f219190f90aaebd64a5a"
15350
+ "sha256": "03888ba034c0af2af764575b4b6c2b37e1f1eb54c7dc02b39ce4590e5a4b5451"
15336
15351
  },
15337
15352
  {
15338
15353
  "path": "tests/metrics.mjs",
@@ -17022,7 +17037,7 @@
17022
17037
  {
17023
17038
  "path": "tests/ship_merge_gate.mjs",
17024
17039
  "mode": "0000644",
17025
- "sha256": "b498d2820f6e17948cb8a86637d16b248a3349ebd9933343dd4b335a239497b7"
17040
+ "sha256": "28ad67a5ee8be6807f8d16149ea42cb837b7bc4e4084068b74d8e944db09d291"
17026
17041
  },
17027
17042
  {
17028
17043
  "path": "tests/ship_post_land_verify.mjs",
@@ -17032,7 +17047,7 @@
17032
17047
  {
17033
17048
  "path": "tests/ship_preflight.mjs",
17034
17049
  "mode": "0000644",
17035
- "sha256": "b86e826355cf786328a7d1301abebd9c7c8b5c5b7ad82b9d2ebcb3d6e35285a9"
17050
+ "sha256": "325980877dc43ea902de03cf938a85f29700f0443ca040efe75873b5f4f210b9"
17036
17051
  },
17037
17052
  {
17038
17053
  "path": "tests/ship_premerge.mjs",
@@ -17074,6 +17089,11 @@
17074
17089
  "mode": "0000644",
17075
17090
  "sha256": "46856ed6c15ec0cca70e9d2541b4e17331de3c2336eb45dc1e36de1241b5440a"
17076
17091
  },
17092
+ {
17093
+ "path": "tests/ship_vendored_instance.mjs",
17094
+ "mode": "0000644",
17095
+ "sha256": "75aa59accad12d197202457ed36281e5d3eca1040762a5045972c4b10cf09006"
17096
+ },
17077
17097
  {
17078
17098
  "path": "tests/ship_zero_commit.mjs",
17079
17099
  "mode": "0000644",
@@ -101,7 +101,7 @@ export interface GetMeDisplayNameResponse { display_name: unknown; max_length: u
101
101
  export interface GetMeEventSoundPrefsResponse { prefs: unknown; effective: unknown; effective_wav: unknown; events: unknown }
102
102
  export interface GetMeFilterViewsResponse { page: unknown; views: unknown }
103
103
  export interface GetMeGuildEngagementsResponse { engagements: unknown; count: unknown }
104
- export interface GetMeGuildRequestsResponse { incoming: unknown; outgoing: unknown; incoming_count: unknown; outgoing_count: unknown }
104
+ export interface GetMeGuildRequestsResponse { incoming: unknown; outgoing: unknown; owner_incoming: unknown; incoming_count: unknown; outgoing_count: unknown; owner_incoming_count: unknown }
105
105
  export interface GetMeGuildsResponse { guilds: unknown; count: unknown }
106
106
  export interface GetMeRecentShipsResponse { ships: unknown }
107
107
  export interface GetMeSessionsResponse { sessions: unknown }
@@ -0,0 +1,85 @@
1
+ # ADR 0366 — Hall planning is forms; a goal made there carries its own spec task, and the interviews stay in the CLI
2
+
3
+ - **Status:** accepted
4
+ - **Date:** 2026-10-05
5
+ - **Task:** [task 1003461](https://cloudbongos.com/builders#/task/1003461) (spike, goal 1000089 — Working area 3, BONGOS-V2)
6
+ - **Builds on:** [ADR 0086](0086-goal-scoped-work-hierarchy.md) (goals and the scope wall), [ADR 0154](0154-goal-owner-criterion-authoring.md) (a goal's owner authors its criteria), [ADR 0264](0264-the-ten-working-areas.md) §1 (working area 3: "users edit, scope and manage work without ever prompting Claude")
7
+ - **Decided with:** the owner, 2026-10-05 — two questions; the scope answer was the owner's own (D3), the hand-off answer was the recommended option (D4).
8
+
9
+ ## Context
10
+
11
+ Goal 1000089 wants the hall to plan work: create a task, a goal, a criterion. Two CLI flows do this today, and both are **interviews**, not forms:
12
+
13
+ - **`/goal-create`** (`.claude/skills/goal-create/SKILL.md`). Phases 1–3 are marked *"autonomous; ask nothing"*: Claude picks the version, decides **reuse vs create** against the live goal board, infers the **scope wall** from the planned work's file paths and checks it against the live module roster, drafts 2–4 criteria and 3–8 seed tasks with dependencies. Phase 4 asks the human only the grey areas (at most 4 questions) and one approval. Phase 5 writes goal → criteria → tasks.
14
+ - **`/planning-session`** (`.claude/skills/planning-session/SKILL.md`). A whole version: a written spec file under `docs/specs/`, a multi-round interview that runs *"until nothing material is left"*, then a migration, a seed script, dependency ranking and promotion. Creating a version is Archon-only (ADR 0250 §6).
15
+
16
+ The spike's question: which of these steps are form-shaped, which must stay interviews (named, so nobody half-builds them), and whether anything wants a third shape. The constraint: every write already exists behind a server rank floor (`task.create`, `goal.create`, `criterion.create`, the Archon wall on a protected scope); the spike decides **surface only**.
17
+
18
+ ### The evidence
19
+
20
+ Read the two flows for which inputs a person can **know** versus which Claude **infers**:
21
+
22
+ | Input | Who supplies it today | Shape |
23
+ |---|---|---|
24
+ | A task's title, description, goal | the person | form — and the goal picker already exists: `GET /goals/suggestions` feeds the hall composer (`sky-composer.js`, task 1003069) |
25
+ | A task's kind, criterion link | the server already infers it: `POST /tasks` auto-classifies kind; `GET /goals/:id/suggest-criteria` ranks criteria | form, with the server's suggestion shown |
26
+ | A goal's name, subtitle, description, version, category | the person (goal-create *drafts* them, but they are statements of intent, and `GET /work-categories` is a plain list) | form |
27
+ | A criterion's outcome text | the person, for a goal they own (ADR 0154) | form — the slug `criterion_id` is derivable from the text, and a 409 collision is a sentence, not a judgement |
28
+ | Satisfying a criterion | already in the hall (`goals-page.js`) | form (exists) |
29
+ | Reuse vs create a goal | Claude reads the board and judges | **interview** — though a form can *show* the suggester's candidates and let the person choose |
30
+ | A goal's **scope wall** | Claude infers from file paths, checks the roster | **interview** — and the roster is not readable by the hall at all (`module-scope-map` is server-only; the hall gets only a derived `scope_protected` flag, `goal-route-authz.js` `decorateGoalScope`) |
31
+ | Criteria drafted from a description; seed tasks and their dependency edges | Claude | **interview** |
32
+ | A version: spec, multi-round interview, migration, seed script, ranking | Claude with the owner, Archon-only to create | **interview** |
33
+
34
+ And two precedents show the in-between shape already exists in the hall: the idea composer asks a **server-defined question sequence** with skip and cancel and no Claude (`sky-composer.js`, the base-v2 template), and the hall already **composes a prompt for a session to finish** (`task-lib.js` `buildPromptForTask`, the bulk toolbar's sequential and parallel prompts, collab's "Copy for Session Start").
35
+
36
+ ## Decision
37
+
38
+ **D1 — Form-shaped; build in the hall.** Every step whose inputs the person knows:
39
+ 1. Create a task under a goal (title, description, goal via the existing suggester; kind and criterion offered from the server's own suggestions). → [task 1003462](https://cloudbongos.com/builders#/task/1003462).
40
+ 2. Create a goal: a **name** field and a separate **subtitle/description** (goal 1000072's convention — a title is a name, not its own explanation), version, category. **No scope field** (D3). Before the name is submitted the form shows the suggester's matching open goals, so "reuse instead" is a click and the judgement stays the person's. → [task 1003463](https://cloudbongos.com/builders#/task/1003463).
41
+ 3. Attach a criterion to a goal the person owns or manages: the outcome text; the slug is derived from it. → task 1003463.
42
+
43
+ Every refusal the server already makes — `task.create` / `goal.create` / `criterion.create` floors, the Archon wall on a protected scope, ADR 0154's `bad_goal_id` for a goal the actor does not hold — is rendered as copy. The forms never pre-filter themselves into a shape that hides one (1003463's own rule).
44
+
45
+ **D2 — Interview-shaped; stays in the CLI, deliberately absent from the hall.** Named so nobody half-builds them:
46
+ - planning a **version** (`/planning-session`) — the spec file, the multi-round interview, the migration, the seed script, the ranking, and creating a version at all;
47
+ - **inferring a goal's scope wall** from the work it will do;
48
+ - **drafting criteria** from a description, and **decomposing a goal into seed tasks** with dependency edges;
49
+ - **judging reuse vs create** beyond showing the suggester's candidates;
50
+ - **carrying achieved goals forward** across a version boundary (the planning session's rescope).
51
+
52
+ A hall form for any of these would be the title-field-and-textarea the spike warned against: worse than the CLI it replaces, because the CLI's value *is* the inference.
53
+
54
+ **D3 — The third shape: a goal made in the hall carries its own spec task (the owner's answer).** A goal created from the hall form is created with a task inside it — **"Spec goal N: its scope, criteria and first tasks"** — and the goal's other work waits behind that task until it ships. Someone claims it like any task and does the interview half in a session (`/goal-create`, finishing an existing goal rather than creating one). This is the "draft the hall composes and a session finishes" shape, but recorded in the ledger as a claimable, creditable task rather than a prompt on someone's clipboard. Concretely:
55
+ - `POST /goals` grows an opt-in `spec_task: true` (the hall form sends it; `/goal-create`, which specs inline, does not). The server creates the spec task in the same request, `source_ref = goal-<id>-spec` so a retry is idempotent, promoted to `ready` so it can be claimed.
56
+ - While that task is unshipped, every task created in the goal gets a **dependency** on it, so a claim is refused `DEPS_NOT_SHIPPED` — the existing gate, not a new one. Once it ships, the dependents auto-promote as they do today.
57
+ - The walls do not move. Setting the scope uses the existing `POST /goals/:id/scope` (`goal.scope.widen`, owner or manager, Archon for a protected key) and criteria use `criterion.create` under ADR 0154. A claimer who does not hold the goal drafts the scope and criteria and hands them to the owner — `/goal-create`'s existing off-ramp — rather than gaining anything.
58
+
59
+ No new permission and no migration: the spec task is identified by its `source_ref`, and blocking is an ordinary dependency.
60
+
61
+ **D4 — An optional hand-off button.** On a goal's page, a **"Plan with Claude"** button copies a prompt that continues from that goal (its open spec task when there is one, else `/goal-create` against the goal for seed tasks). It is an extra, never a requirement: every D1 step works without it, so ADR 0264's "without ever prompting Claude" holds.
62
+
63
+ ## Consequences
64
+
65
+ - Goal 1000089's remaining planning work is five tasks (below; the three new ones were filed by this spike as tasks 1004585, 1004586 and 1004587). The CLI flows are unchanged except that `/goal-create` learns to finish an existing goal's spec task.
66
+ - A hall-made goal is visibly **unspecced** until its spec task ships, and its work cannot be claimed early. That is the intent: a goal with no wall and no criteria is the state `/goal-create` exists to prevent, and D3 makes the gap a task instead of a silence.
67
+ - The hall never needs the module roster, so the protected list stays server-only.
68
+ - Risk: a spec task nobody claims stalls its goal. It is an ordinary ready task, visible on the board and in the goal; if this proves common, an age nudge is the follow-up, not a softer block.
69
+
70
+ ## The task list for the rest of the criterion
71
+
72
+ | Task | Shape | Depends on |
73
+ |---|---|---|
74
+ | [task 1003462](https://cloudbongos.com/builders#/task/1003462) — Create a task from the hall, attached to its goal | form (D1.1) | — |
75
+ | [task 1004585](https://cloudbongos.com/builders#/task/1004585) — A goal made in the hall carries a spec task that gates its other work (server: `spec_task`, the dependency) | D3 | — |
76
+ | [task 1003463](https://cloudbongos.com/builders#/task/1003463) — Author a goal and a done-when criterion from the hall | form (D1.2, D1.3) | task 1004585 |
77
+ | [task 1004586](https://cloudbongos.com/builders#/task/1004586) — `/goal-create` finishes an existing goal's spec task | D3, CLI | task 1004585 |
78
+ | [task 1004587](https://cloudbongos.com/builders#/task/1004587) — "Plan with Claude" hand-off button on a goal | D4 | task 1004585 |
79
+
80
+ ## Alternatives considered
81
+
82
+ - **A scope picker in the goal form** (checkboxes of code areas, protected ones marked). Rejected in favour of D3 by the owner: scope is inferred from the work, and a person ticking boxes before the work is understood is the half-built interview D2 forbids. It would also have needed a new roster read.
83
+ - **No scope at all for hall goals.** Rejected: an open wall with no criteria and nobody responsible for fixing it is the catch-all failure ADR 0086 retired.
84
+ - **Port `/goal-create` into the hall as a guided form** (the idea composer's question sequence). Rejected: the composer's questions are fixed; goal-create's are decided by what it reads, which is exactly the part a script cannot do.
85
+ - **The hand-off as the only path** (every hall planning action copies a prompt). Rejected: it breaks working area 3's thesis outright.
@@ -484,3 +484,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
484
484
  | 0363 | [**Who decides what is a per-project table, changed only by a passed amendment** ([task 1004529](https://cloudbongos.com/builders#/task/1004529), goal 1000125). **D1:** `government_decision_rules`, one row per building: `gate` (as today), `board` (the charter only), `nobody` (vacant) or a membership predicate with decide / first / consent / majority / unanimous / sign-off. **D2:** the seeded defaults are today, and a malformed row reads as its default. **D3:** written only inside the transaction that closes a `decision_rules` amendment as passed; JS guard + SQL condition + trigger; no settings route. **D4:** eight building matters join the board's three subjects, openable only where a row names a sitting; sign-off is the author rule. **D5:** People's rank assignments defer to People's row (`checkActAlone`); a passed People matter acts. **D6:** the docket's buildings carry who decides.](0363-who-decides-what-is-a-table-changed-only-by-amendment.md) | government / Governor City |
485
485
  | 0364 | [**Repo access is asked at sign-in on the hub, and held for as long as the builder stays signed in** ([task 1004549](https://cloudbongos.com/builders#/task/1004549)). Amends ADR 0143 and 0155. **D1:** every sign-in door on the hub's own pages carries `repos=1`; the hall and CLI stay identity-only. **D2:** the repo token's TTL is the web session's remaining life; a web sign-out deletes it, a CLI logout does not. **D3:** a draft at a wizard step beside a stored create keeps its place on a reload or a GitHub round-trip.](0364-repo-access-is-asked-at-sign-in-and-held-for-the-session.md) | auth / GitHub / create wizard |
486
486
  | 0365 | [**A guild engages a project through each member's own door** ([task 1002303](https://cloudbongos.com/builders#/task/1002303)). Amends ADR 0336 D7's invite half after ADR 0353. **D1:** the engagement row as D7 specified, plus `guild_id` on the echo (the latest application decides the label). **D2:** a guild applies = each member applies as themselves through the relay, naming the engagement. **D3:** a project invites a guild = the hub records it and returns one hall hand-off link per public-roster member; no hub-written invites, the one-step relay stays deferred. **D4:** a project is named only when on the map and public, for both kinds. **D5:** the label rides the applicant-profile read; the queue is R28's. **D6:** the D4.4 guild cards are their own task.](0365-a-guild-engages-a-project-through-each-members-own-door.md) | guilds / invites / applications |
487
+ | 0366 | [**Hall planning is forms; a goal made there carries its own spec task, and the interviews stay in the CLI** ([task 1003461](https://cloudbongos.com/builders#/task/1003461), goal 1000089). Spike answer. **D1:** form-shaped, build in the hall: create a task under a goal, create a goal (name + subtitle, version, category, no scope field), attach a criterion to a goal you hold; every server refusal rendered as copy. **D2:** interview-shaped, deliberately absent from the hall: version planning, scope inference, drafting criteria and seed tasks, reuse-vs-create judgement, carry-forward. **D3 (owner):** a hall-made goal is created with a "Spec goal N" task (`POST /goals` `spec_task: true`, `source_ref goal-<id>-spec`) and every task in the goal depends on it until it ships; no new permission, no migration. **D4:** an optional "Plan with Claude" hand-off button.](0366-hall-planning-is-forms-and-a-goal-made-there-carries-its-own-spec-task.md) | lifecycle / planning |
@@ -12603,7 +12603,7 @@
12603
12603
  "me"
12604
12604
  ],
12605
12605
  "summary": "GET /me/guild-requests",
12606
- "description": "MY queue: invites addressed to me, each carrying the card (the guild's current visibility, which an accept must echo back), and the join requests I sent. Stamps seen_at on the invites.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
12606
+ "description": "MY queue: invites addressed to me, each carrying the card (the guild's current visibility, which an accept must echo back), the join requests I sent, and the join requests waiting on me as the owner of a guild, each naming its guild (task 1004583 — one read for the hub, never one per owned guild). Stamps seen_at on the invites and on those requests.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
12607
12607
  "x-rank": "any-builder",
12608
12608
  "x-source": "modules/platform-identity/routes/guilds.js",
12609
12609
  "responses": {
@@ -25743,14 +25743,18 @@
25743
25743
  "properties": {
25744
25744
  "incoming": {},
25745
25745
  "outgoing": {},
25746
+ "owner_incoming": {},
25746
25747
  "incoming_count": {},
25747
- "outgoing_count": {}
25748
+ "outgoing_count": {},
25749
+ "owner_incoming_count": {}
25748
25750
  },
25749
25751
  "required": [
25750
25752
  "incoming",
25751
25753
  "outgoing",
25754
+ "owner_incoming",
25752
25755
  "incoming_count",
25753
- "outgoing_count"
25756
+ "outgoing_count",
25757
+ "owner_incoming_count"
25754
25758
  ]
25755
25759
  },
25756
25760
  "GetMeGuildsResponse": {
@@ -492,7 +492,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
492
492
  | PATCH | `/api/bongos/me/filter-views/:id` | `any-builder` | `page`, `name`, `is_default` | Rename a view and/or make it (or stop it being) my default for that page. |
493
493
  | DELETE | `/api/bongos/me/filter-views/:id` | `any-builder` | — | own filter config. |
494
494
  | GET | `/api/bongos/me/guild-engagements` | `any-builder` | — | MY inbox of guild engagements (ADR 0365): "G is applying to P" and "P invited G", for guilds I belong to, inside 30 days, naming only pro… |
495
- | GET | `/api/bongos/me/guild-requests` | `any-builder` | — | MY queue: invites addressed to me, each carrying the card (the guild's current visibility, which an accept must echo back), and the join … |
495
+ | GET | `/api/bongos/me/guild-requests` | `any-builder` | — | MY queue: invites addressed to me, each carrying the card (the guild's current visibility, which an accept must echo back), the join requ… |
496
496
  | GET | `/api/bongos/me/guilds` | `any-builder` | — | MY guilds, each with my own two switches. |
497
497
  | PATCH | `/api/bongos/me/handle` | `any-builder` | `handle` | rename the caller's OWN handle (own data, keyed on the authenticated github_id). |
498
498
  | GET | `/api/bongos/me/interaction` | `any-builder` | — | Per-builder INTERACTION PROFILE (task 2010, shares the behavior_prefs jsonb / migration 119). |