@bongos/core 1.19.935 → 1.19.937

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 (40) hide show
  1. package/.bongos-core.json +74 -39
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +2 -0
  4. package/clients/bongos-client/index.cjs +2 -0
  5. package/clients/bongos-client/index.d.ts +6 -3
  6. package/clients/bongos-client/index.mjs +2 -0
  7. package/docs/api/openapi.json +103 -2
  8. package/docs/api-reference.md +6 -5
  9. package/docs/copy-inventory.md +36 -34
  10. package/docs/copy-registry.json +56 -38
  11. package/docs/module-api-changelog.md +4 -0
  12. package/modules/government/board.js +35 -0
  13. package/modules/government/db.js +41 -1
  14. package/modules/government/migrations/government_018_passed_items_index.sql +31 -0
  15. package/modules/government/routes/government.js +7 -0
  16. package/modules/hall-ui/public/board-room.css +6 -0
  17. package/modules/hall-ui/public/board-room.js +31 -0
  18. package/modules/hall-ui/public/ideas.css +27 -0
  19. package/modules/hall-ui/public/ideas.html +7 -0
  20. package/modules/hall-ui/public/ideas.js +99 -3
  21. package/modules/ideas/grades.js +43 -14
  22. package/modules/ideas/inbox.js +18 -0
  23. package/modules/ideas/migrations/ideas_009_recommendation.sql +62 -0
  24. package/modules/ideas/migrations/ideas_010_goal_ratification.sql +103 -0
  25. package/modules/ideas/module.json +1 -0
  26. package/modules/ideas/projection.js +45 -2
  27. package/modules/ideas/ratify.js +288 -1
  28. package/modules/ideas/routes/inbox.js +72 -1
  29. package/modules/ideas/routes/ratify-goal.js +163 -0
  30. package/modules/ideas/templates.js +16 -4
  31. package/modules/lifecycle/goal-from-idea.js +131 -0
  32. package/modules/lifecycle/lifecycle.js +14 -0
  33. package/package-lock.json +2 -2
  34. package/package.json +1 -1
  35. package/src/module-api.js +1 -1
  36. package/tests/government_board_view.mjs +5 -1
  37. package/tests/government_seed.mjs +1 -0
  38. package/tests/idea_develop_spark.mjs +6 -1
  39. package/tests/idea_goal_ratification.mjs +553 -0
  40. package/tests/idea_recommendation.mjs +381 -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.935",
6
- "core_contract": "1.19.935",
7
- "source_commit": "b3b2e4e86881e90300f7b23d75f5e1508eb2bf81",
5
+ "core_version": "1.19.937",
6
+ "core_contract": "1.19.937",
7
+ "source_commit": "2aee2eb9e23c44abf42a24b09f9603555ba33673",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-21T03:42:26.193Z",
9
+ "built_at": "2026-09-21T05:57:31.197Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 511,
13
13
  "agent_docs_stubbed": 26,
14
- "functional_verbatim": 2327,
14
+ "functional_verbatim": 2334,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2864,
20
- "tree_sha256": "e3c4fa4ce99958763ab765d6846942c8fad965add8df64e1f54a7e375806c926",
19
+ "file_count": 2871,
20
+ "tree_sha256": "026277292d3a56e019a060c711325a482164c64ae62daa9c92ee820321bd0a81",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -347,12 +347,12 @@
347
347
  {
348
348
  "path": "clients/bongos-client/README.md",
349
349
  "mode": "0000644",
350
- "sha256": "56d3e08ff4e4893d4d6b30c9292f2c1b0730deb2bff99ea64d7d5df7971995c1"
350
+ "sha256": "ce2ce4bd71f9ea04c46e8c1f4e7173a941458162be0e3b32759aa0c5f9d97297"
351
351
  },
352
352
  {
353
353
  "path": "clients/bongos-client/bongos-client.global.js",
354
354
  "mode": "0000644",
355
- "sha256": "7cfab2d88dc9d36fc57334db3b43c0c31b3656e2bff7ebff11d0c18b12a61850"
355
+ "sha256": "47d36e3b0c228706df44c4a91d5b22bd6005a345c95d8ddda2650bf9b8170242"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -362,17 +362,17 @@
362
362
  {
363
363
  "path": "clients/bongos-client/index.cjs",
364
364
  "mode": "0000644",
365
- "sha256": "8a5ed1946540c3adb30ff986f1845bdc65b5a6e441698723f8c31eb8e1374ef2"
365
+ "sha256": "5368fb77dc06a2ea22ab2db87ec3ac89a9857388bc12117c31dc327e598f63a1"
366
366
  },
367
367
  {
368
368
  "path": "clients/bongos-client/index.d.ts",
369
369
  "mode": "0000644",
370
- "sha256": "e84a082d51b6f1e3890886a087763ec155fa31d17ac697a291e557df5bce2345"
370
+ "sha256": "5d076131337103c34e8b0e46cd613ae898dfa9edeffa6104617f046eb4f651b0"
371
371
  },
372
372
  {
373
373
  "path": "clients/bongos-client/index.mjs",
374
374
  "mode": "0000644",
375
- "sha256": "7676427e266c9528793e47c3c9431c329b67f0b29edff522724f430b4c29a37f"
375
+ "sha256": "2e7178e059cb520cf0509a46151624bb00160cc2cd263582015980576b98482d"
376
376
  },
377
377
  {
378
378
  "path": "clients/bongos-client/package.json",
@@ -2112,12 +2112,12 @@
2112
2112
  {
2113
2113
  "path": "docs/api-reference.md",
2114
2114
  "mode": "0000644",
2115
- "sha256": "8c709c0a86391ef42df7c594087d8ebe77bb26c19b8f92f95a21c19da30de87e"
2115
+ "sha256": "d72a950df3fa37b7834a167d60e621434a0d0806f1a3f298b079d0538254be50"
2116
2116
  },
2117
2117
  {
2118
2118
  "path": "docs/api/openapi.json",
2119
2119
  "mode": "0000644",
2120
- "sha256": "6e2d8fc4d48d267ee7b16a81f48651c6d19dfa55716d7736c92e5cb734cc6b4f"
2120
+ "sha256": "f89f852f211ffee8ccc13f4331fc867837eae6b6ac2a0a24292abc4537aa9591"
2121
2121
  },
2122
2122
  {
2123
2123
  "path": "docs/architecture.md",
@@ -2142,12 +2142,12 @@
2142
2142
  {
2143
2143
  "path": "docs/copy-inventory.md",
2144
2144
  "mode": "0000644",
2145
- "sha256": "6b522b8315ca83fe72a7b4848c1a079149c8ba3804ace7de85b5fb2936e6de66"
2145
+ "sha256": "26af5ed255669bbd57112d663e6206c6ff1f13a5dc728851ad9c1a8901dbff05"
2146
2146
  },
2147
2147
  {
2148
2148
  "path": "docs/copy-registry.json",
2149
2149
  "mode": "0000644",
2150
- "sha256": "4ff37259be59178b608d303df04a9c6717c297ec22138815ef0066ac5fc16849"
2150
+ "sha256": "25916cf25193f4153694b24f0fd9a120f4dc966fbf8ec73aec21565565cfac2c"
2151
2151
  },
2152
2152
  {
2153
2153
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2677,7 +2677,7 @@
2677
2677
  {
2678
2678
  "path": "docs/module-api-changelog.md",
2679
2679
  "mode": "0000644",
2680
- "sha256": "4c9bccb55d99dc3c2588b73ae95d365511eb433e27265822725aeed38420992b"
2680
+ "sha256": "3fddd5b37bb0a00a12bf88b81992eb2510e0115b8cc7f67c8fd67c51b65ae678"
2681
2681
  },
2682
2682
  {
2683
2683
  "path": "docs/modules-contract.md",
@@ -4317,7 +4317,7 @@
4317
4317
  {
4318
4318
  "path": "modules/government/board.js",
4319
4319
  "mode": "0000644",
4320
- "sha256": "00183b9c1b2e822ac8da6a156daab8242f1997de2c1171bd7581961ee6c214e5"
4320
+ "sha256": "cce76edcf96a8ece8bb3321f5edb505e0e93acae96babe7169da607fd1888f3b"
4321
4321
  },
4322
4322
  {
4323
4323
  "path": "modules/government/catalog.js",
@@ -4332,7 +4332,7 @@
4332
4332
  {
4333
4333
  "path": "modules/government/db.js",
4334
4334
  "mode": "0000644",
4335
- "sha256": "99be259855d63808adca140222eaf8563cff054b06ecc1acdd49594fcfc129fe"
4335
+ "sha256": "dc56a5747bb5275ba372dc297cce585219c649984778a924ce22bab7249889a8"
4336
4336
  },
4337
4337
  {
4338
4338
  "path": "modules/government/membership-predicate.js",
@@ -4459,6 +4459,11 @@
4459
4459
  "mode": "0000644",
4460
4460
  "sha256": "7603087ac279d05eb2c69527557035c72c3bbb1510c16fdb2230b2e377f0df74"
4461
4461
  },
4462
+ {
4463
+ "path": "modules/government/migrations/government_018_passed_items_index.sql",
4464
+ "mode": "0000644",
4465
+ "sha256": "c85b1615c66ae68b630c727faa6ab56358a35dea37a0c2da507d11d3909176fd"
4466
+ },
4462
4467
  {
4463
4468
  "path": "modules/government/module.json",
4464
4469
  "mode": "0000644",
@@ -4492,7 +4497,7 @@
4492
4497
  {
4493
4498
  "path": "modules/government/routes/government.js",
4494
4499
  "mode": "0000644",
4495
- "sha256": "6c38766b7b2a76a5fc035ad4eefce41fe45739730e70fb26b40546bded7b66b9"
4500
+ "sha256": "40c2cd95481690b88a065afad62636ae732845a5dc81f082ebd623f7fb060de4"
4496
4501
  },
4497
4502
  {
4498
4503
  "path": "modules/government/routes/rank-sync.js",
@@ -4692,7 +4697,7 @@
4692
4697
  {
4693
4698
  "path": "modules/hall-ui/public/board-room.css",
4694
4699
  "mode": "0000644",
4695
- "sha256": "863c8af438be96097a63555d4573baec2b3a0bbdc73c1d23366cf5484189fb8a"
4700
+ "sha256": "0487726b9c742550164e2c974c146a1715caa9dcb855ab3da5c53d07444bbca2"
4696
4701
  },
4697
4702
  {
4698
4703
  "path": "modules/hall-ui/public/board-room.html",
@@ -4702,7 +4707,7 @@
4702
4707
  {
4703
4708
  "path": "modules/hall-ui/public/board-room.js",
4704
4709
  "mode": "0000644",
4705
- "sha256": "0345390d8da4270b6f33b1a4e4469b10ec59a49de652567cb678ecc79a8fe093"
4710
+ "sha256": "e5cfe87a21297ce1c61132b7b98f43edf07fdaf8075be6e219d09c279bfb836e"
4706
4711
  },
4707
4712
  {
4708
4713
  "path": "modules/hall-ui/public/board-room.states.json",
@@ -4982,17 +4987,17 @@
4982
4987
  {
4983
4988
  "path": "modules/hall-ui/public/ideas.css",
4984
4989
  "mode": "0000644",
4985
- "sha256": "57a41781c81b02cbac7b30a0a13f50f4a913e55f348d84cfc4244a99372932c2"
4990
+ "sha256": "8d93461c423e176f8a2aee3bc6c9b0e9d0187d6ff811cedd6b2e32866aed39a3"
4986
4991
  },
4987
4992
  {
4988
4993
  "path": "modules/hall-ui/public/ideas.html",
4989
4994
  "mode": "0000644",
4990
- "sha256": "1ca434b944e917e075fd86c0806b4781b6e8f3ddb2454d11540d070715d288e3"
4995
+ "sha256": "c27d6509ee5c8ac7937d7ee7b421359c3fabe835e0db583ab59b52e8b5c3aa19"
4991
4996
  },
4992
4997
  {
4993
4998
  "path": "modules/hall-ui/public/ideas.js",
4994
4999
  "mode": "0000644",
4995
- "sha256": "54fa21caf9ab7173952e9b84d60e6334743f749044c8b226cd21277f7dec574e"
5000
+ "sha256": "2f532cacb06f0f074c15101c16578f3183104042644d6c8aa0d2e80fdb425b2f"
4996
5001
  },
4997
5002
  {
4998
5003
  "path": "modules/hall-ui/public/ideas.states.json",
@@ -5447,7 +5452,7 @@
5447
5452
  {
5448
5453
  "path": "modules/ideas/grades.js",
5449
5454
  "mode": "0000644",
5450
- "sha256": "a445024a9da1f91d1b5842066599e12422f6252a71fd0c30c4a60c2ecfb6ae51"
5455
+ "sha256": "e968d10ee2c1ed682e09f823ff67951bbcf3323dc34322208cff987df7de9fbb"
5451
5456
  },
5452
5457
  {
5453
5458
  "path": "modules/ideas/homeless-home.js",
@@ -5462,7 +5467,7 @@
5462
5467
  {
5463
5468
  "path": "modules/ideas/inbox.js",
5464
5469
  "mode": "0000644",
5465
- "sha256": "14194ba97438709fbf4628c87760cfc46c2c9a5c4531ef81515296f99cb6edf7"
5470
+ "sha256": "da8ac68f553980fef162b7d9fbc85481fd60cd885954cf316894a132f845ef6c"
5466
5471
  },
5467
5472
  {
5468
5473
  "path": "modules/ideas/landing-preview.js",
@@ -5509,10 +5514,20 @@
5509
5514
  "mode": "0000644",
5510
5515
  "sha256": "4c404d3bd264bb326fb28572e999b081636e81fd6a16b923c86df49854df8061"
5511
5516
  },
5517
+ {
5518
+ "path": "modules/ideas/migrations/ideas_009_recommendation.sql",
5519
+ "mode": "0000644",
5520
+ "sha256": "53c66f25e685931e73334d6b904f7d3c0f3838a15f160bd5387864ef27836aa7"
5521
+ },
5522
+ {
5523
+ "path": "modules/ideas/migrations/ideas_010_goal_ratification.sql",
5524
+ "mode": "0000644",
5525
+ "sha256": "7ba109e2f5415daec8b0767ecfabb110fc02d8944f4e6cc0664ca2d205e05480"
5526
+ },
5512
5527
  {
5513
5528
  "path": "modules/ideas/module.json",
5514
5529
  "mode": "0000644",
5515
- "sha256": "c23099e7c3a4768dc68778292c42988ee21234ed81d1832347e9fd272f6137d9"
5530
+ "sha256": "a869f9dec25e003006a495b3fbee45ac99c80b306cec7f16808693d70133e717"
5516
5531
  },
5517
5532
  {
5518
5533
  "path": "modules/ideas/pollers/descent-writer.js",
@@ -5522,12 +5537,12 @@
5522
5537
  {
5523
5538
  "path": "modules/ideas/projection.js",
5524
5539
  "mode": "0000644",
5525
- "sha256": "ba49f771b9bc1fcf64e0df3ba3bd9a53717f20ae9ccb8f6592bc10b96467eb20"
5540
+ "sha256": "95ee83106b484d24fb60e1411a2d2616dfc9670eecdb174bbae4bb47a70cd3ff"
5526
5541
  },
5527
5542
  {
5528
5543
  "path": "modules/ideas/ratify.js",
5529
5544
  "mode": "0000644",
5530
- "sha256": "2988a93940cd1eba73fb0c9e04f8326108466ba81901f86b3768b29115f17237"
5545
+ "sha256": "05789550a8e6345f27ac78ccef3ac93a7837e99a6b067871189b1e983b4d374f"
5531
5546
  },
5532
5547
  {
5533
5548
  "path": "modules/ideas/reads.js",
@@ -5542,7 +5557,12 @@
5542
5557
  {
5543
5558
  "path": "modules/ideas/routes/inbox.js",
5544
5559
  "mode": "0000644",
5545
- "sha256": "1caa8ca38d0dc26f3411be63596f6522d1ea4177f6cb74ebc3fa07e3d8f2876a"
5560
+ "sha256": "da91fe0641109b3b8adc0cca44480337f15cbd481b590f42d022e9eaa78654b7"
5561
+ },
5562
+ {
5563
+ "path": "modules/ideas/routes/ratify-goal.js",
5564
+ "mode": "0000644",
5565
+ "sha256": "92c10dbffef40038dac64ea646372e3fcd1c70c5d2bda1d731ddbdcd508d9181"
5546
5566
  },
5547
5567
  {
5548
5568
  "path": "modules/ideas/routing.js",
@@ -5557,7 +5577,7 @@
5557
5577
  {
5558
5578
  "path": "modules/ideas/templates.js",
5559
5579
  "mode": "0000644",
5560
- "sha256": "deef66d514a2ea090274acc05e85ffefdfd6c0bf0279b64f7bee16af7b2e1471"
5580
+ "sha256": "345cbf4d87be780ee98c33042d2ec914b40bceeab6122a67a00a3852580b681b"
5561
5581
  },
5562
5582
  {
5563
5583
  "path": "modules/ideas/trail-descent.js",
@@ -5764,6 +5784,11 @@
5764
5784
  "mode": "0000644",
5765
5785
  "sha256": "c22a0782ddf7a93deb40f700a2afab15a313925647bbdf424db777da5aa29aa1"
5766
5786
  },
5787
+ {
5788
+ "path": "modules/lifecycle/goal-from-idea.js",
5789
+ "mode": "0000644",
5790
+ "sha256": "21d091ef596bc67f08a4f0785d17eaddf47d2da702219ccd5af6164413944428"
5791
+ },
5767
5792
  {
5768
5793
  "path": "modules/lifecycle/goal-rollup.js",
5769
5794
  "mode": "0000644",
@@ -5797,7 +5822,7 @@
5797
5822
  {
5798
5823
  "path": "modules/lifecycle/lifecycle.js",
5799
5824
  "mode": "0000644",
5800
- "sha256": "41ef55efff7f334ee8b19490f03944ca25f22454c718dfb81445539bc6a77aa4"
5825
+ "sha256": "74e09c7d1a978da826f99cff9e863b1051ab19a6437ae398a1e83ec8293e794f"
5801
5826
  },
5802
5827
  {
5803
5828
  "path": "modules/lifecycle/merge-lock.js",
@@ -7977,12 +8002,12 @@
7977
8002
  {
7978
8003
  "path": "package-lock.json",
7979
8004
  "mode": "0000644",
7980
- "sha256": "cc78b4e84d90eba27a329d88ae83b507df318962b057d9281c3cc1b858063e05"
8005
+ "sha256": "f1999bdf0489eddf32aabd9a5d2aec6b82bd9765a598e0eff299c31a367b6ff6"
7981
8006
  },
7982
8007
  {
7983
8008
  "path": "package.json",
7984
8009
  "mode": "0000644",
7985
- "sha256": "12f2fd99b6ac30b3bd8a443f576cf083c97eee82623b4392b714b107ab0c666b"
8010
+ "sha256": "0be6855a6ff73d2592bff19899727f708abd44265f2ea4538cc48491982a5aac"
7986
8011
  },
7987
8012
  {
7988
8013
  "path": "public-docs/index.html",
@@ -9982,7 +10007,7 @@
9982
10007
  {
9983
10008
  "path": "src/module-api.js",
9984
10009
  "mode": "0000644",
9985
- "sha256": "fe49958cdbfc0121ca262cd95b1fef21fc3028aa5da19250fb4bab2e68e42ccd"
10010
+ "sha256": "546941331565d646b5b815a2a66c4833993abd3affcd2ba309ddad87191d766a"
9986
10011
  },
9987
10012
  {
9988
10013
  "path": "src/module-loader/catalog.js",
@@ -11562,7 +11587,7 @@
11562
11587
  {
11563
11588
  "path": "tests/government_board_view.mjs",
11564
11589
  "mode": "0000644",
11565
- "sha256": "827d743080201f11b2282aaa77d37149aaddaddc42b2b444c260a2696a7727ca"
11590
+ "sha256": "035295e2dda0f0352eec6981b08e1b7b5259cdd8f1bf1aee161690e1fb7c682f"
11566
11591
  },
11567
11592
  {
11568
11593
  "path": "tests/government_board_vote.mjs",
@@ -11682,7 +11707,7 @@
11682
11707
  {
11683
11708
  "path": "tests/government_seed.mjs",
11684
11709
  "mode": "0000644",
11685
- "sha256": "e31b024ce9a64a13737a32720ba7bef3d92f2644f56581143965afb1bb65f1fd"
11710
+ "sha256": "e165fe5c67ee4e80c58f489514ac77ba34e51984dabd2329ecdd70052b81a9cc"
11686
11711
  },
11687
11712
  {
11688
11713
  "path": "tests/government_session_scope.mjs",
@@ -12047,7 +12072,7 @@
12047
12072
  {
12048
12073
  "path": "tests/idea_develop_spark.mjs",
12049
12074
  "mode": "0000644",
12050
- "sha256": "fe55e01a0be2aa6ca0bc536469eefcee7d44f40dfa0767fedf1709aed3f7d81e"
12075
+ "sha256": "4d64c378808ab7891ec5af6345b53da15f2ad3a9fc2fdcaa788fc2b7b8d25dad"
12051
12076
  },
12052
12077
  {
12053
12078
  "path": "tests/idea_full_capture.mjs",
@@ -12059,6 +12084,11 @@
12059
12084
  "mode": "0000644",
12060
12085
  "sha256": "63afe2afd59ff64e290234a0cc8d33a0f77b784d8c10c2d7147fe2ab3c114cd1"
12061
12086
  },
12087
+ {
12088
+ "path": "tests/idea_goal_ratification.mjs",
12089
+ "mode": "0000644",
12090
+ "sha256": "3c624db8e11ae02f503d19c6b2556b286d3ca59229daacd6ea2319782530c84f"
12091
+ },
12062
12092
  {
12063
12093
  "path": "tests/idea_governance_pass_credit.mjs",
12064
12094
  "mode": "0000644",
@@ -12089,6 +12119,11 @@
12089
12119
  "mode": "0000644",
12090
12120
  "sha256": "729c511f9bb3d4a9b7fb76c7b3843e1900c8d4c9cfa30fe08e482d1e41113839"
12091
12121
  },
12122
+ {
12123
+ "path": "tests/idea_recommendation.mjs",
12124
+ "mode": "0000644",
12125
+ "sha256": "b8f206392c0d5d590dd00840152942103d28f7121d8e4b1906bc131ff8731fcd"
12126
+ },
12092
12127
  {
12093
12128
  "path": "tests/idea_resubmit.mjs",
12094
12129
  "mode": "0000644",
@@ -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
- - 403 operations across 61 resource groups
8
+ - 404 operations across 61 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -511,6 +511,8 @@ function createClient(opts = {}) {
511
511
  postInboxIdDevelop: (args) => request("POST", "/inbox/{id}/develop", { hasBody: true }, args),
512
512
  // POST /inbox/{id}/ratify — rank: metic+archon — POST /inbox/:id/ratify
513
513
  postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
514
+ // POST /inbox/{id}/ratify-goal — rank: metic+archon — POST /inbox/:id/ratify-goal
515
+ postInboxIdRatifyGoal: (args) => request("POST", "/inbox/{id}/ratify-goal", { hasBody: true }, args),
514
516
  // POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
515
517
  postInboxIdResubmit: (args) => request("POST", "/inbox/{id}/resubmit", { hasBody: true }, args),
516
518
  // DELETE /inbox/{id}/spark — rank: any-builder — DELETE /inbox/:id/spark
@@ -510,6 +510,8 @@ function createClient(opts = {}) {
510
510
  postInboxIdDevelop: (args) => request("POST", "/inbox/{id}/develop", { hasBody: true }, args),
511
511
  // POST /inbox/{id}/ratify — rank: metic+archon — POST /inbox/:id/ratify
512
512
  postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
513
+ // POST /inbox/{id}/ratify-goal — rank: metic+archon — POST /inbox/:id/ratify-goal
514
+ postInboxIdRatifyGoal: (args) => request("POST", "/inbox/{id}/ratify-goal", { hasBody: true }, args),
513
515
  // POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
514
516
  postInboxIdResubmit: (args) => request("POST", "/inbox/{id}/resubmit", { hasBody: true }, args),
515
517
  // DELETE /inbox/{id}/spark — rank: any-builder — DELETE /inbox/:id/spark
@@ -322,12 +322,13 @@ export interface PostGovernmentRanksRequest { rank_key: string; label: string; d
322
322
  export interface PostGovernmentRanksResponse { rank: unknown }
323
323
  export interface PostHelpRequestsRequest { needs_craft?: string; needs_builder_id?: number; what_is_stuck: string; task_id?: number; goal_id?: number }
324
324
  export interface PostHelpRequestsResponse { ok: boolean; help_request: unknown }
325
- export interface PostInboxIdDevelopRequest { field_values: Record<string, unknown>; template_key?: string }
325
+ export interface PostInboxIdDevelopRequest { field_values: Record<string, unknown>; template_key?: string; recommendation?: string }
326
+ export interface PostInboxIdRatifyGoalRequest { target_version: string; scope_modules?: string[]; admit_reason?: string; notes_md?: string }
326
327
  export interface PostInboxIdRatifyRequest { notes_md?: string }
327
- export interface PostInboxIdResubmitRequest { field_values: Record<string, unknown>; template_key?: string }
328
+ export interface PostInboxIdResubmitRequest { field_values: Record<string, unknown>; template_key?: string; recommendation?: string }
328
329
  export interface PostInboxIdSparkResponse { idea: unknown; sparked: boolean; unchanged: boolean }
329
330
  export interface PostInboxPreviewLandingRequest { goal_id?: number; kind?: string; grade?: string }
330
- export interface PostInboxRequest { title: string; body_md?: string; kind?: string; suggested_version?: string; suggested_priority?: number; goal_id?: number; grade?: string; template_key?: string; field_values?: Record<string, unknown> }
331
+ export interface PostInboxRequest { title: string; body_md?: string; kind?: string; suggested_version?: string; suggested_priority?: number; goal_id?: number; grade?: string; template_key?: string; field_values?: Record<string, unknown>; recommendation?: string }
331
332
  export interface PostInboxScoreRequest { field_values: Record<string, unknown>; template_key?: string }
332
333
  export interface PostInboxScoreResponse { score: unknown; fields: unknown; template_key: unknown }
333
334
  export interface PostLearningsRequest { title: string; body_md: string; tags?: string[]; related_files?: string[]; source?: string; source_ref?: string; task_id?: number }
@@ -886,6 +887,8 @@ export interface BongosClient {
886
887
  postInboxIdDevelop(args: RequestArgs & { body: PostInboxIdDevelopRequest }): Promise<ApiResponse>;
887
888
  /** POST /inbox/{id}/ratify — rank: metic+archon */
888
889
  postInboxIdRatify(args?: RequestArgs & { body?: PostInboxIdRatifyRequest }): Promise<ApiResponse>;
890
+ /** POST /inbox/{id}/ratify-goal — rank: metic+archon */
891
+ postInboxIdRatifyGoal(args: RequestArgs & { body: PostInboxIdRatifyGoalRequest }): Promise<ApiResponse>;
889
892
  /** POST /inbox/{id}/resubmit — rank: any-builder */
890
893
  postInboxIdResubmit(args: RequestArgs & { body: PostInboxIdResubmitRequest }): Promise<ApiResponse>;
891
894
  /** DELETE /inbox/{id}/spark — rank: any-builder */
@@ -507,6 +507,8 @@ export function createClient(opts = {}) {
507
507
  postInboxIdDevelop: (args) => request("POST", "/inbox/{id}/develop", { hasBody: true }, args),
508
508
  // POST /inbox/{id}/ratify — rank: metic+archon — POST /inbox/:id/ratify
509
509
  postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
510
+ // POST /inbox/{id}/ratify-goal — rank: metic+archon — POST /inbox/:id/ratify-goal
511
+ postInboxIdRatifyGoal: (args) => request("POST", "/inbox/{id}/ratify-goal", { hasBody: true }, args),
510
512
  // POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
511
513
  postInboxIdResubmit: (args) => request("POST", "/inbox/{id}/resubmit", { hasBody: true }, args),
512
514
  // DELETE /inbox/{id}/spark — rank: any-builder — DELETE /inbox/:id/spark
@@ -8979,6 +8979,65 @@
8979
8979
  ]
8980
8980
  }
8981
8981
  },
8982
+ "/inbox/{id}/ratify-goal": {
8983
+ "post": {
8984
+ "operationId": "post_inbox_id_ratify_goal",
8985
+ "tags": [
8986
+ "inbox"
8987
+ ],
8988
+ "summary": "POST /inbox/:id/ratify-goal",
8989
+ "description": "BV2.R17 (task 1004096, spec R23, goal 1000095) — ratify a FULL IDEA into a GOAL, atomically: - INSERT goals (title from the idea, description = its five answers) - INSERT done_when_criteria on that goal from the \"what does a successful implementation look like\" answer - UPDATE idea_inbox SET status='promoted', reviewed_at=now() - INSERT ideas_goal_ratifications — who ratified, under which board decision, with the author's own recommendation recorded beside it All of it in one transaction; a partial failure rolls back to an open idea. A SEPARATE ROUTE FROM /ratify, not a mode of it. The two take different subjects (a `criterion-proposal` idea whose body_md is JSON vs. a graded Full Idea whose answers are prose), produce different rows, and differ on whether the board has a say. One route with a discriminator would have to document which half of its own body applies, and a caller who got the discriminator wrong would be told about a field rather than about the act. THE SCOPE AND THE VERSION COME FROM THE REQUEST because nothing else can supply them: no prose answer says which version a goal belongs to or which modules it may touch. THE GATES DO NOT come from the request — the handler passes the caller's LIVE rank through to the lifecycle port, which applies every check POST /goals applies (unknown module key, protected scope → Archon, a building version's goal set closed without a named Archon admission). `idea.ratify`'s floor is Metic, so those gates are load-bearing here rather than ceremonial. Statuses: 400 a bad body / an unratifiable idea / an unmappable template · 403 a rank gate · 404 no such idea · 409 the idea is not open, the board has not passed it, the version will not take a goal, or it is already ratified.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `idea.ratify` (all required).",
8990
+ "x-rank": "metic+archon",
8991
+ "x-source": "modules/ideas/routes/ratify-goal.js",
8992
+ "x-permissions": [
8993
+ "idea.ratify"
8994
+ ],
8995
+ "parameters": [
8996
+ {
8997
+ "name": "id",
8998
+ "in": "path",
8999
+ "required": true,
9000
+ "schema": {
9001
+ "type": "string"
9002
+ },
9003
+ "description": "Path parameter `id`."
9004
+ }
9005
+ ],
9006
+ "requestBody": {
9007
+ "required": true,
9008
+ "content": {
9009
+ "application/json": {
9010
+ "schema": {
9011
+ "$ref": "#/components/schemas/PostInboxIdRatifyGoalRequest"
9012
+ }
9013
+ }
9014
+ },
9015
+ "x-validated": true
9016
+ },
9017
+ "responses": {
9018
+ "200": {
9019
+ "description": "Success."
9020
+ },
9021
+ "400": {
9022
+ "$ref": "#/components/responses/ValidationFailed"
9023
+ },
9024
+ "401": {
9025
+ "$ref": "#/components/responses/Unauthorized"
9026
+ },
9027
+ "403": {
9028
+ "$ref": "#/components/responses/Forbidden"
9029
+ },
9030
+ "404": {
9031
+ "$ref": "#/components/responses/NotFound"
9032
+ }
9033
+ },
9034
+ "security": [
9035
+ {
9036
+ "builderSession": []
9037
+ }
9038
+ ]
9039
+ }
9040
+ },
8982
9041
  "/inbox/{id}/resubmit": {
8983
9042
  "post": {
8984
9043
  "operationId": "post_inbox_id_resubmit",
@@ -23230,6 +23289,10 @@
23230
23289
  "template_key": {
23231
23290
  "type": "string",
23232
23291
  "maxLength": 64
23292
+ },
23293
+ "recommendation": {
23294
+ "type": "string",
23295
+ "maxLength": 16
23233
23296
  }
23234
23297
  },
23235
23298
  "required": [
@@ -23237,6 +23300,36 @@
23237
23300
  ],
23238
23301
  "additionalProperties": false
23239
23302
  },
23303
+ "PostInboxIdRatifyGoalRequest": {
23304
+ "type": "object",
23305
+ "properties": {
23306
+ "target_version": {
23307
+ "type": "string",
23308
+ "minLength": 1,
23309
+ "maxLength": 64
23310
+ },
23311
+ "scope_modules": {
23312
+ "type": "array",
23313
+ "items": {
23314
+ "type": "string"
23315
+ },
23316
+ "maxItems": 64
23317
+ },
23318
+ "admit_reason": {
23319
+ "type": "string",
23320
+ "minLength": 8,
23321
+ "maxLength": 500
23322
+ },
23323
+ "notes_md": {
23324
+ "type": "string",
23325
+ "maxLength": 10000
23326
+ }
23327
+ },
23328
+ "required": [
23329
+ "target_version"
23330
+ ],
23331
+ "additionalProperties": false
23332
+ },
23240
23333
  "PostInboxIdRatifyRequest": {
23241
23334
  "type": "object",
23242
23335
  "properties": {
@@ -23256,6 +23349,10 @@
23256
23349
  "template_key": {
23257
23350
  "type": "string",
23258
23351
  "maxLength": 64
23352
+ },
23353
+ "recommendation": {
23354
+ "type": "string",
23355
+ "maxLength": 16
23259
23356
  }
23260
23357
  },
23261
23358
  "required": [
@@ -23336,6 +23433,10 @@
23336
23433
  },
23337
23434
  "field_values": {
23338
23435
  "type": "object"
23436
+ },
23437
+ "recommendation": {
23438
+ "type": "string",
23439
+ "maxLength": 16
23339
23440
  }
23340
23441
  },
23341
23442
  "required": [
@@ -25552,8 +25653,8 @@
25552
25653
  "description": "A required dependency/feature is not configured or is temporarily down."
25553
25654
  }
25554
25655
  },
25555
- "x-endpoint-count": 403,
25556
- "x-schema-count": 442,
25656
+ "x-endpoint-count": 404,
25657
+ "x-schema-count": 443,
25557
25658
  "x-undocumented-bodies": 9,
25558
25659
  "x-response-schemas": 301,
25559
25660
  "x-generated-by": "scripts/gds/gen-api-docs.js"
@@ -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. 403 endpoints across 65 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 404 endpoints across 66 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`.
@@ -337,18 +337,19 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
337
337
  | GET | `/api/bongos/help-requests/for-me` | `any-builder` | — | The addressed read — C01's answer to "and fires a notification". |
338
338
  | GET | `/api/bongos/help-requests/mine` | `any-builder` | — | your own asks, so you can settle them. |
339
339
 
340
- ## `inbox` (17)
340
+ ## `inbox` (18)
341
341
 
342
342
  | Method | Path | Rank | Body | Description |
343
343
  |---|---|---|---|---|
344
344
  | GET | `/api/bongos/inbox` | `any-builder` | — | read open ideas; skill-friction rows filtered by viewer rank. |
345
- | POST | `/api/bongos/inbox` | `any-builder` | `title`, `body_md`, `kind`, `suggested_version`, `suggested_priority`, `goal_id`, `grade`, `template_key`, `field_values` | for ordinary ideas; metic+ for kind='criterion-proposal'. |
345
+ | POST | `/api/bongos/inbox` | `any-builder` | `title`, `body_md`, `kind`, `suggested_version`, `suggested_priority`, `goal_id`, `grade`, `template_key`, `field_values`, `recommendation` | for ordinary ideas; metic+ for kind='criterion-proposal'. |
346
346
  | GET | `/api/bongos/inbox/:id` | `any-builder` | — | single idea read for the "#NNN" deep-link resolver (task 1047). |
347
347
  | PATCH | `/api/bongos/inbox/:id` | `metic+archon` | `status`, `kind`, `promoted_to_task_id`, `reviewed_at`, `merged_into_idea_id`, `triage_note` | |
348
348
  | PATCH | `/api/bongos/inbox/:id/body` | `any-builder` | `body_md` | Metic+ (task 360 / ADR 0018): idea triage (promote/discard/merge) shapes the backlog. |
349
- | POST | `/api/bongos/inbox/:id/develop` | `any-builder` | `field_values`, `template_key` | POST /inbox/:id/develop — DEVELOP A SPARK INTO A FULL IDEA (task 1002922 / BV1.R146, goal 1000062). |
349
+ | POST | `/api/bongos/inbox/:id/develop` | `any-builder` | `field_values`, `template_key`, `recommendation` | POST /inbox/:id/develop — DEVELOP A SPARK INTO A FULL IDEA (task 1002922 / BV1.R146, goal 1000062). |
350
350
  | POST | `/api/bongos/inbox/:id/ratify` | `metic+archon` | `notes_md` | V3.R31 (task 252) — Archon ratifies a criterion-proposal idea, atomically: - INSERT done_when_criteria row on the target version - UPDATE… |
351
- | POST | `/api/bongos/inbox/:id/resubmit` | `any-builder` | `field_values`, `template_key` | RESUBMIT a Full Idea after a rejection (R13 of goal 1000069, criterion C2: an idea never dies and never stalls). |
351
+ | POST | `/api/bongos/inbox/:id/ratify-goal` | `metic+archon` | `target_version`, `scope_modules`, `admit_reason`, `notes_md` | BV2.R17 (task 1004096, spec R23, goal 1000095) — ratify a FULL IDEA into a GOAL, atomically: - INSERT goals (title from the idea, descrip… |
352
+ | POST | `/api/bongos/inbox/:id/resubmit` | `any-builder` | `field_values`, `template_key`, `recommendation` | RESUBMIT a Full Idea after a rejection (R13 of goal 1000069, criterion C2: an idea never dies and never stalls). |
352
353
  | POST | `/api/bongos/inbox/:id/spark` | `any-builder` | — | Mark a Quick Idea as a Big Idea Spark — "I have the spark but not the full picture, someone develop this". |
353
354
  | DELETE | `/api/bongos/inbox/:id/spark` | `any-builder` | — | Withdraw the Big Idea Spark mark — the reversibility half of R144. |
354
355
  | GET | `/api/bongos/inbox/awaiting-nod` | `metic+archon` | — | GET /inbox/awaiting-nod — the NOD QUEUE (task 1003066, BV1.R05). |