@bongos/core 1.21.126 → 1.21.128

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 (35) hide show
  1. package/.bongos-core.json +73 -33
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +6 -0
  4. package/clients/bongos-client/index.cjs +6 -0
  5. package/clients/bongos-client/index.d.ts +8 -0
  6. package/clients/bongos-client/index.mjs +6 -0
  7. package/docs/adr/0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md +6 -0
  8. package/docs/adr/0354-a-builder-hosts-one-project-free-and-more-takes-the-fleet-permission.md +1 -1
  9. package/docs/api/openapi.json +147 -2
  10. package/docs/api-reference.md +5 -2
  11. package/docs/module-api-changelog.md +4 -0
  12. package/modules/onboarding/howto-state.js +108 -0
  13. package/modules/onboarding/migrations/onboarding_001_howto_reads.sql +33 -0
  14. package/modules/onboarding/module.json +1 -1
  15. package/modules/onboarding/routes/onboarding.js +48 -1
  16. package/package-lock.json +2 -2
  17. package/package.json +1 -1
  18. package/release-notes.json +16 -0
  19. package/scripts/gds/exec-path-guard.js +1 -1
  20. package/scripts/gds/fitness.js +1 -0
  21. package/scripts/gds/module-error-report.js +148 -0
  22. package/scripts/gds/module.js +1 -0
  23. package/scripts/gds/provision-caps.js +63 -0
  24. package/scripts/gds/provision-process.js +3 -0
  25. package/scripts/gds/provision-units.js +3 -0
  26. package/scripts/gds/provision.js +3 -1
  27. package/src/module-api.js +1 -1
  28. package/src/module-loader/error-tally.js +188 -0
  29. package/src/module-loader/loader.js +52 -4
  30. package/src/platform-server.js +7 -0
  31. package/tests/howto_state.mjs +178 -0
  32. package/tests/module_error_counts.mjs +265 -0
  33. package/tests/own_scope_guard.mjs +6 -0
  34. package/tests/provision.mjs +2 -0
  35. package/tests/provision_resource_caps.mjs +117 -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.126",
6
- "core_contract": "1.21.126",
7
- "source_commit": "94a48727259da5ad6269d8e1982648c5a263116b",
5
+ "core_version": "1.21.128",
6
+ "core_contract": "1.21.128",
7
+ "source_commit": "31d87d7e4b4e2c97040083251efcd43c9c97c935",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-15T15:32:06.327Z",
9
+ "built_at": "2026-10-15T16:35:02.176Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 606,
13
13
  "agent_docs_stubbed": 28,
14
- "functional_verbatim": 3133,
14
+ "functional_verbatim": 3141,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3768,
20
- "tree_sha256": "aaa23a52f299e82601309b1dc11007fe842e9686674c9c5cc96991f5412286e3",
19
+ "file_count": 3776,
20
+ "tree_sha256": "63aa30ff5172b9c025bc2092a63f9109f261f2a5d46b47638378c0505428b3f4",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -317,12 +317,12 @@
317
317
  {
318
318
  "path": "clients/bongos-client/README.md",
319
319
  "mode": "0000644",
320
- "sha256": "8ec09fb234db73a4cb92ad78c4da3532d5717f48106dd97fbb860fa17b1b1b5b"
320
+ "sha256": "9aea69205101517f33e85bd80593333deb8a015d6c98ae55d73ddc59c3067d12"
321
321
  },
322
322
  {
323
323
  "path": "clients/bongos-client/bongos-client.global.js",
324
324
  "mode": "0000644",
325
- "sha256": "2f89099d91db14e37dc9d67ef68a81ba410740446758e639cb50de51a6942d79"
325
+ "sha256": "23208de4f2aa8f0c1c5ec2f7939e637224280c3cf520958148549e2f79c02c9d"
326
326
  },
327
327
  {
328
328
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -332,17 +332,17 @@
332
332
  {
333
333
  "path": "clients/bongos-client/index.cjs",
334
334
  "mode": "0000644",
335
- "sha256": "14f0fa81adc576c014950856f70d6721bb796104e65b3fecadb7d5b1370010b2"
335
+ "sha256": "25dd808eae862cd02ed9a494f5e0ce2ee8d31bb664f78a23c151a95dc1f0c25f"
336
336
  },
337
337
  {
338
338
  "path": "clients/bongos-client/index.d.ts",
339
339
  "mode": "0000644",
340
- "sha256": "c13884fb0bd175f8bc9745150b2ca5ed254dd0ad14bcaa63511cf892cdbaec36"
340
+ "sha256": "d98b7b69f7e2db071b9b10e5e039afdf95262b7196450ef56c73c0acac8717a7"
341
341
  },
342
342
  {
343
343
  "path": "clients/bongos-client/index.mjs",
344
344
  "mode": "0000644",
345
- "sha256": "b77e22573f2d8c9c9f2f1b3a1642e9258cd4fec394d1416ae816c6bf56a3295d"
345
+ "sha256": "c3a776cd09ddde2c4d1d3ed8b3f90daed304c6cc8d459a688585526360c2b5e5"
346
346
  },
347
347
  {
348
348
  "path": "clients/bongos-client/package.json",
@@ -1887,7 +1887,7 @@
1887
1887
  {
1888
1888
  "path": "docs/adr/0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md",
1889
1889
  "mode": "0000644",
1890
- "sha256": "6043bb19c2b18074c132750b0480b03f627733536c3263ab79c049f40f314e57"
1890
+ "sha256": "957ee2f99f8b8ac8a22723c7af73798540499a0ea859f010decb87b09cf0a02f"
1891
1891
  },
1892
1892
  {
1893
1893
  "path": "docs/adr/0286-a-gated-project-s-manifest-tells-a-stranger-how-to-sign-in-and-nothing-else.md",
@@ -2232,7 +2232,7 @@
2232
2232
  {
2233
2233
  "path": "docs/adr/0354-a-builder-hosts-one-project-free-and-more-takes-the-fleet-permission.md",
2234
2234
  "mode": "0000644",
2235
- "sha256": "962d868c0887244c53b53c58754f7232715a20df6feec694f30cbda707f9e17e"
2235
+ "sha256": "47b6fbbe4da97fd83f1b7e9914f102bbd5924d88b02dca6d87a4e2cf44af8664"
2236
2236
  },
2237
2237
  {
2238
2238
  "path": "docs/adr/0355-a-soft-limit-is-a-rule-with-a-reason-and-nobody-enforces-it.md",
@@ -2377,12 +2377,12 @@
2377
2377
  {
2378
2378
  "path": "docs/api-reference.md",
2379
2379
  "mode": "0000644",
2380
- "sha256": "cda3b2d273704ab0bebe67efe46f0101e1809ec8e8beef2ad3614b6fc5845a31"
2380
+ "sha256": "9ec7dd570500edd3705cd871886734d89780b92df6f185cdc86002288fe7aa7d"
2381
2381
  },
2382
2382
  {
2383
2383
  "path": "docs/api/openapi.json",
2384
2384
  "mode": "0000644",
2385
- "sha256": "cd89b6776167172503ef68a77b1cfa68a00bf886d8f586c456f67e3cfef84fba"
2385
+ "sha256": "319fce626080497fdf50a50064f0faa56951b1aa021e97edd6ad481d8ee5c9b9"
2386
2386
  },
2387
2387
  {
2388
2388
  "path": "docs/architecture.md",
@@ -2922,7 +2922,7 @@
2922
2922
  {
2923
2923
  "path": "docs/module-api-changelog.md",
2924
2924
  "mode": "0000644",
2925
- "sha256": "8b70cfa6cac3da1e08d0f969f6d2a3f0c43ca0533b28d7e8a58ca12044165c26"
2925
+ "sha256": "f5e9ba961f5fad8945bbcba2e6daefdde31efba3e6e6b41dde6d52aa06b07065"
2926
2926
  },
2927
2927
  {
2928
2928
  "path": "docs/modules-contract.md",
@@ -7934,10 +7934,20 @@
7934
7934
  "mode": "0000644",
7935
7935
  "sha256": "18984c946d746da66ff7678379e9f49c9cfdcdb8f70d2acd852ab29c820baad0"
7936
7936
  },
7937
+ {
7938
+ "path": "modules/onboarding/howto-state.js",
7939
+ "mode": "0000644",
7940
+ "sha256": "9b6d361568feaa4f9a9f299bddcd4bc649861cf79a9a6045ea00389bd86cc01c"
7941
+ },
7942
+ {
7943
+ "path": "modules/onboarding/migrations/onboarding_001_howto_reads.sql",
7944
+ "mode": "0000644",
7945
+ "sha256": "cb5a3a58b4db75c028ccc53ea3316bb733fda650218b16b494d69de58c84e982"
7946
+ },
7937
7947
  {
7938
7948
  "path": "modules/onboarding/module.json",
7939
7949
  "mode": "0000644",
7940
- "sha256": "5ec905fe4a387bbb26ec157ac8d67a05bd02986fc661aa2621b84df260f45774"
7950
+ "sha256": "363a44b85c87bfbc2bb473656319099c39e7817e47294f3ceb4a33ee6bc85421"
7941
7951
  },
7942
7952
  {
7943
7953
  "path": "modules/onboarding/newcomer-restock.js",
@@ -7967,7 +7977,7 @@
7967
7977
  {
7968
7978
  "path": "modules/onboarding/routes/onboarding.js",
7969
7979
  "mode": "0000644",
7970
- "sha256": "385deea4dfc4e737f756dc56c1cd6c8891ebdb202e66cf15e235e6b10e498788"
7980
+ "sha256": "011dfc781cbe8c7a17956fa2020e0327cf0e46f537a9057cf2b4911752ba813a"
7971
7981
  },
7972
7982
  {
7973
7983
  "path": "modules/page-notes/CLAUDE.md",
@@ -10482,12 +10492,12 @@
10482
10492
  {
10483
10493
  "path": "package-lock.json",
10484
10494
  "mode": "0000644",
10485
- "sha256": "341426e0e35db5113dd017485f4479dc0674db124643388aeec9d883e113f7e3"
10495
+ "sha256": "b7d2956b1155f633fbfbbfafe4211befef0d545b02671ce8cd9096ee22a1f734"
10486
10496
  },
10487
10497
  {
10488
10498
  "path": "package.json",
10489
10499
  "mode": "0000644",
10490
- "sha256": "f5522e5c98564bbf8ffd3a4817e094732239f369a1850e1b743030a4b03d00b2"
10500
+ "sha256": "4cbf0ddd56ffbee1d0d4cdd8388793c2590a243737608cf18556e0400e946fed"
10491
10501
  },
10492
10502
  {
10493
10503
  "path": "public-docs/index.html",
@@ -10507,7 +10517,7 @@
10507
10517
  {
10508
10518
  "path": "release-notes.json",
10509
10519
  "mode": "0000644",
10510
- "sha256": "4fbea8b3dd2714eb5ec49751e18f66a0b995e94d64163edfbbf5fa837b196d81"
10520
+ "sha256": "f5b81f238e17e854f85e2af52d9c3661acf519c8bd9634aaa95206e8f107bc5b"
10511
10521
  },
10512
10522
  {
10513
10523
  "path": "scripts/cron/style_guide_audit.sh",
@@ -11022,7 +11032,7 @@
11022
11032
  {
11023
11033
  "path": "scripts/gds/exec-path-guard.js",
11024
11034
  "mode": "0000644",
11025
- "sha256": "cda9e125cfb2cb354c7d4e20065c36712a75955d3981203012c2334d0ce637ae"
11035
+ "sha256": "5b5f2b8b40d62dab10a0ea9b43768944dcbe60a8af550b35229ce278deaceffc"
11026
11036
  },
11027
11037
  {
11028
11038
  "path": "scripts/gds/feedback-send.js",
@@ -11097,7 +11107,7 @@
11097
11107
  {
11098
11108
  "path": "scripts/gds/fitness.js",
11099
11109
  "mode": "0000644",
11100
- "sha256": "88a99a1a1455477dd9f7987c0f6c48f20464cc4ab98cc2f224c1a5536483fd2d"
11110
+ "sha256": "e2f483de1afd806d77fc5b62d6f1b08d762ea4fec9eaddb91d2ef1f25f00112e"
11101
11111
  },
11102
11112
  {
11103
11113
  "path": "scripts/gds/gate-review.js",
@@ -11404,6 +11414,11 @@
11404
11414
  "mode": "0000644",
11405
11415
  "sha256": "b21c85714a8b93e43857c26237eec9dca9830abb53f44146957525f262fb8e7b"
11406
11416
  },
11417
+ {
11418
+ "path": "scripts/gds/module-error-report.js",
11419
+ "mode": "0000644",
11420
+ "sha256": "dc8e6794d0c09479891136c8b0ab4da7ce73c1797522e03b9457db113b2534e2"
11421
+ },
11407
11422
  {
11408
11423
  "path": "scripts/gds/module-test-runner.js",
11409
11424
  "mode": "0000644",
@@ -11422,7 +11437,7 @@
11422
11437
  {
11423
11438
  "path": "scripts/gds/module.js",
11424
11439
  "mode": "0000644",
11425
- "sha256": "b02d07e9e7e1d2e2852676383e054f13d8e423755534fe23ed3e10cbfefb4086"
11440
+ "sha256": "9391cc7d6881150cd5d196aa5e63245db032093063ce90e1e1ae5c26dafcb49c"
11426
11441
  },
11427
11442
  {
11428
11443
  "path": "scripts/gds/move-escalation.js",
@@ -11549,6 +11564,11 @@
11549
11564
  "mode": "0000644",
11550
11565
  "sha256": "2102af404ac985f0d7b037da973600234b2ef8f90b6c689ca164b9ac1f46262f"
11551
11566
  },
11567
+ {
11568
+ "path": "scripts/gds/provision-caps.js",
11569
+ "mode": "0000644",
11570
+ "sha256": "0dee61336a309cf3eda2cb715bb53680773c17d65186864384e3cb0bc9dadaba"
11571
+ },
11552
11572
  {
11553
11573
  "path": "scripts/gds/provision-config.js",
11554
11574
  "mode": "0000644",
@@ -11587,7 +11607,7 @@
11587
11607
  {
11588
11608
  "path": "scripts/gds/provision-process.js",
11589
11609
  "mode": "0000644",
11590
- "sha256": "6a784f63078e5cb2c0f85475672b02b18ded67a36a8041b1ba3643b227a465d0"
11610
+ "sha256": "4689867d4925672e3e12c56620ef2e4e6ad2474dfaaa309571da9533af49b997"
11591
11611
  },
11592
11612
  {
11593
11613
  "path": "scripts/gds/provision-render.js",
@@ -11617,12 +11637,12 @@
11617
11637
  {
11618
11638
  "path": "scripts/gds/provision-units.js",
11619
11639
  "mode": "0000644",
11620
- "sha256": "eb6cf09ce1eb97330b20fe97c61068e2b7cc8bb4556a54df39e3a3978fe6ffa2"
11640
+ "sha256": "02173656cffc347b23b68fa5036826d16bfedbb0e490161b8e5853b5cbb9b8a9"
11621
11641
  },
11622
11642
  {
11623
11643
  "path": "scripts/gds/provision.js",
11624
11644
  "mode": "0000644",
11625
- "sha256": "ea11cc49dbc298c8b3ed4ad88e25a3acfbba65fcd65727c9b47c43ee41e24437"
11645
+ "sha256": "bf16a2ef196d64088c7755e3d6ccbdd8f7917eb907efdbb8ec132e7df9694a52"
11626
11646
  },
11627
11647
  {
11628
11648
  "path": "scripts/gds/publish-credential-check.js",
@@ -12847,17 +12867,22 @@
12847
12867
  {
12848
12868
  "path": "src/module-api.js",
12849
12869
  "mode": "0000644",
12850
- "sha256": "05cbabab7a15ea12d403cdce32d0e9accfb56fe1dc44c691dc5e8920933edaf0"
12870
+ "sha256": "638e7c6e9ff2e460bacc69abc98b8f6721b6d2ade29ba79aa166920e1f71f7e7"
12851
12871
  },
12852
12872
  {
12853
12873
  "path": "src/module-loader/catalog.js",
12854
12874
  "mode": "0000644",
12855
12875
  "sha256": "633042ab3228780fd18f96ce6a2dd0d84452a124948720678d4484c29df0acd8"
12856
12876
  },
12877
+ {
12878
+ "path": "src/module-loader/error-tally.js",
12879
+ "mode": "0000644",
12880
+ "sha256": "00f37bb206c47a75c5ee1420831781a38eb88b9446a9ce1cc3e8ee5a47e09334"
12881
+ },
12857
12882
  {
12858
12883
  "path": "src/module-loader/loader.js",
12859
12884
  "mode": "0000644",
12860
- "sha256": "04458c645d876011324e5ae11011774699c06e39ff2fa1ba1cf58a2d2775f887"
12885
+ "sha256": "4520d7cb0a91dd3f6cb52c52ced8caf2039126fa7c942e3f0714e91600cebb80"
12861
12886
  },
12862
12887
  {
12863
12888
  "path": "src/module-loader/manifest-schema.js",
@@ -12892,7 +12917,7 @@
12892
12917
  {
12893
12918
  "path": "src/platform-server.js",
12894
12919
  "mode": "0000644",
12895
- "sha256": "773372a16a32d3936aa53d0ca5ec0e19833e45cadcc16688102b5e81c117e5bf"
12920
+ "sha256": "435a89e5f5becab510ee5ad3f4246f34ee6a6abac859d49823edc74fd1bcdf4f"
12896
12921
  },
12897
12922
  {
12898
12923
  "path": "src/role-responsibilities.js",
@@ -15624,6 +15649,11 @@
15624
15649
  "mode": "0000644",
15625
15650
  "sha256": "8e9b206fdde738f289bc11e204852595e9128b523cfc20cd67e3e83fb60a2fac"
15626
15651
  },
15652
+ {
15653
+ "path": "tests/howto_state.mjs",
15654
+ "mode": "0000644",
15655
+ "sha256": "8b8d3eeeffd1bb7d0deaec51c91165b06302737b72b1a710547340c7ecadcec6"
15656
+ },
15627
15657
  {
15628
15658
  "path": "tests/html_comment_nesting.mjs",
15629
15659
  "mode": "0000644",
@@ -16409,6 +16439,11 @@
16409
16439
  "mode": "0000644",
16410
16440
  "sha256": "50e4d45bf544efe755dda538a93eafc40dcd9caa071e987d8833d97ecf1b7e0f"
16411
16441
  },
16442
+ {
16443
+ "path": "tests/module_error_counts.mjs",
16444
+ "mode": "0000644",
16445
+ "sha256": "7c5e8009a416c72d5659677c0a23d90408001f33ff6b56b121ed06a2beceb739"
16446
+ },
16412
16447
  {
16413
16448
  "path": "tests/module_exports_unique_keys.mjs",
16414
16449
  "mode": "0000644",
@@ -16702,7 +16737,7 @@
16702
16737
  {
16703
16738
  "path": "tests/own_scope_guard.mjs",
16704
16739
  "mode": "0000644",
16705
- "sha256": "e9ad80ce9837076d550dbb4b77a4c0f01f087ad3e515f8af8a672221af995ca4"
16740
+ "sha256": "cdd964e66b9ebe74c504a3916eb3a10b36497af4f5b94924534d2d73f136801a"
16706
16741
  },
16707
16742
  {
16708
16743
  "path": "tests/own_session_revoke.mjs",
@@ -17132,7 +17167,7 @@
17132
17167
  {
17133
17168
  "path": "tests/provision.mjs",
17134
17169
  "mode": "0000644",
17135
- "sha256": "2c31c74c71147c5fe96beb8e6a53f8793ea3f42870512a6005f43df7c6fb5382"
17170
+ "sha256": "dc30483813143d76ed6597f4b68d61db3dd2ae9bf34d15b9ce8ddd57caf0f79f"
17136
17171
  },
17137
17172
  {
17138
17173
  "path": "tests/provision_account_identity.mjs",
@@ -17169,6 +17204,11 @@
17169
17204
  "mode": "0000644",
17170
17205
  "sha256": "f99d0a4a54fa9d846efc772148156e06023d3ad4e2afbddce8dd1d9a62821b96"
17171
17206
  },
17207
+ {
17208
+ "path": "tests/provision_resource_caps.mjs",
17209
+ "mode": "0000644",
17210
+ "sha256": "491c29cbeee40a677a01ee71f1f54a787017456b4baa8416219480f337e3c3e3"
17211
+ },
17172
17212
  {
17173
17213
  "path": "tests/provision_restart.mjs",
17174
17214
  "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
- - 555 operations across 76 resource groups
8
+ - 558 operations across 76 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -735,6 +735,12 @@ function createClient(opts = {}) {
735
735
  getMeGuilds: (args) => request("GET", "/me/guilds", { hasBody: false }, args),
736
736
  // PATCH /me/handle — rank: any-builder — PATCH /me/handle
737
737
  patchMeHandle: (args) => request("PATCH", "/me/handle", { hasBody: true }, args),
738
+ // GET /me/howto — rank: any-builder — GET /me/howto
739
+ getMeHowto: (args) => request("GET", "/me/howto", { hasBody: false }, args),
740
+ // POST /me/howto/read — rank: any-builder — POST /me/howto/read
741
+ postMeHowtoRead: (args) => request("POST", "/me/howto/read", { hasBody: true }, args),
742
+ // POST /me/howto/reset — rank: any-builder — POST /me/howto/reset
743
+ postMeHowtoReset: (args) => request("POST", "/me/howto/reset", { hasBody: true }, args),
738
744
  // GET /me/interaction — rank: any-builder — GET /me/interaction
739
745
  getMeInteraction: (args) => request("GET", "/me/interaction", { hasBody: false }, args),
740
746
  // PATCH /me/interaction — rank: any-builder — PATCH /me/interaction
@@ -734,6 +734,12 @@ function createClient(opts = {}) {
734
734
  getMeGuilds: (args) => request("GET", "/me/guilds", { hasBody: false }, args),
735
735
  // PATCH /me/handle — rank: any-builder — PATCH /me/handle
736
736
  patchMeHandle: (args) => request("PATCH", "/me/handle", { hasBody: true }, args),
737
+ // GET /me/howto — rank: any-builder — GET /me/howto
738
+ getMeHowto: (args) => request("GET", "/me/howto", { hasBody: false }, args),
739
+ // POST /me/howto/read — rank: any-builder — POST /me/howto/read
740
+ postMeHowtoRead: (args) => request("POST", "/me/howto/read", { hasBody: true }, args),
741
+ // POST /me/howto/reset — rank: any-builder — POST /me/howto/reset
742
+ postMeHowtoReset: (args) => request("POST", "/me/howto/reset", { hasBody: true }, args),
737
743
  // GET /me/interaction — rank: any-builder — GET /me/interaction
738
744
  getMeInteraction: (args) => request("GET", "/me/interaction", { hasBody: false }, args),
739
745
  // PATCH /me/interaction — rank: any-builder — PATCH /me/interaction
@@ -429,6 +429,8 @@ export interface PostMeAnthropicLinkRequest { anthropic_email: string; anthropic
429
429
  export interface PostMeAnthropicLinkResponse { linked: unknown }
430
430
  export interface PostMeFilterViewsRequest { page: string; name: string; values: Record<string, unknown>; is_default?: boolean }
431
431
  export interface PostMeFilterViewsResponse { page: unknown; view: unknown; views: unknown }
432
+ export interface PostMeHowtoReadRequest { steps?: unknown[]; all?: boolean; how?: string }
433
+ export interface PostMeHowtoResetRequest { steps?: unknown[]; all?: boolean }
432
434
  export interface PostMeSessionsRevokeAllResponse { ok: boolean; revoked: unknown }
433
435
  export interface PostMeSessionsRevokeRequest { session_id?: StringifiableId }
434
436
  export interface PostMeSessionsRevokeResponse { ok: boolean; revoked: unknown }
@@ -1260,6 +1262,12 @@ export interface BongosClient {
1260
1262
  getMeGuilds(args?: RequestArgs): Promise<GetMeGuildsResponse>;
1261
1263
  /** PATCH /me/handle — rank: any-builder */
1262
1264
  patchMeHandle(args: RequestArgs & { body: PatchMeHandleRequest }): Promise<PatchMeHandleResponse>;
1265
+ /** GET /me/howto — rank: any-builder */
1266
+ getMeHowto(args?: RequestArgs): Promise<ApiResponse>;
1267
+ /** POST /me/howto/read — rank: any-builder */
1268
+ postMeHowtoRead(args?: RequestArgs & { body?: PostMeHowtoReadRequest }): Promise<ApiResponse>;
1269
+ /** POST /me/howto/reset — rank: any-builder */
1270
+ postMeHowtoReset(args?: RequestArgs & { body?: PostMeHowtoResetRequest }): Promise<ApiResponse>;
1263
1271
  /** GET /me/interaction — rank: any-builder */
1264
1272
  getMeInteraction(args?: RequestArgs): Promise<ApiResponse>;
1265
1273
  /** PATCH /me/interaction — rank: any-builder */
@@ -731,6 +731,12 @@ export function createClient(opts = {}) {
731
731
  getMeGuilds: (args) => request("GET", "/me/guilds", { hasBody: false }, args),
732
732
  // PATCH /me/handle — rank: any-builder — PATCH /me/handle
733
733
  patchMeHandle: (args) => request("PATCH", "/me/handle", { hasBody: true }, args),
734
+ // GET /me/howto — rank: any-builder — GET /me/howto
735
+ getMeHowto: (args) => request("GET", "/me/howto", { hasBody: false }, args),
736
+ // POST /me/howto/read — rank: any-builder — POST /me/howto/read
737
+ postMeHowtoRead: (args) => request("POST", "/me/howto/read", { hasBody: true }, args),
738
+ // POST /me/howto/reset — rank: any-builder — POST /me/howto/reset
739
+ postMeHowtoReset: (args) => request("POST", "/me/howto/reset", { hasBody: true }, args),
734
740
  // GET /me/interaction — rank: any-builder — GET /me/interaction
735
741
  getMeInteraction: (args) => request("GET", "/me/interaction", { hasBody: false }, args),
736
742
  // PATCH /me/interaction — rank: any-builder — PATCH /me/interaction
@@ -80,3 +80,9 @@ The measured cost is the same **unit** for `co-tenant` and `standalone`. What se
80
80
  - **+** Billing has a unit cost for a shared slot.
81
81
  - **−** The page-cache reserve is an allowance, not a measurement. If a ceiling is ever approached, re-measure `MemAvailable` then instead of trusting the 250 MB.
82
82
  - **−** These are **idle-fleet** numbers. A project with real traffic or large data will sit above 80 MB, so the ceiling is an upper bound for quiet projects. Re-measure the same way (`Pss` + `SwapPss` per unit, `memory.peak`, `pg_stat_activity`) as projects gain users.
83
+
84
+ ## Amendment — 2026-10-15 (task 1004414): each hosted project is capped
85
+
86
+ **The owner's numbers**, sized from the measurement above: `MemoryHigh=160M`, `MemoryMax=256M`, `CPUQuota=50%`, `TasksMax=256` on every hosted project's unit. A project idles at 45–70 MB and its boot peak is 118–134 MB with page cache, so `MemoryHigh` sits above the boot peak and makes the kernel reclaim before `MemoryMax` kills. A killed project comes back through `Restart=always`. Half a core is about a thousand times the measured idle use, and 256 tasks is far above what one Node process starts. The caps bound one runaway project; they do not change the ceiling, which still counts ~80 MB per project.
87
+
88
+ New units render the caps (`serviceUnit`). An existing unit takes them with `systemctl set-property`, live and without a restart, through `node scripts/gds/provision.js apply-caps --apply` on the control plane. The unit file is not rewritten, because a project made before the per-instance accounts (task 1003369) would be moved onto an account that does not exist. The numbers live in `scripts/gds/provision-caps.js`, and `tests/provision_resource_caps.mjs` pins them, so changing one is a decision. A project with real traffic or an adopted repo with heavy dependencies may need more; re-measure as above before raising them.
@@ -36,7 +36,7 @@ The count and the insert are two separate steps, so two requests sent together w
36
36
  ## Consequences
37
37
 
38
38
  - New users can create a project from the wizard again. Each project costs us about $0.80 a month (ADR 0285).
39
- - A stranger's code now runs on the shared box, on the same server as the hub. It runs in its own locked account (task 1003369), and the hub's sign-in cookie no longer reaches project halls (task 1004357). **Nothing caps a hosted project's memory or CPU**, so one misbehaving project can slow every hall and the hub. That was already true of every hosted project; this decision widens who can have one.
39
+ - A stranger's code now runs on the shared box, on the same server as the hub. It runs in its own locked account (task 1003369), and the hub's sign-in cookie no longer reaches project halls (task 1004357). **Nothing caps a hosted project's memory or CPU**, so one misbehaving project can slow every hall and the hub. That was already true of every hosted project; this decision widens who can have one. (Closed by task 1004414: each hosted project is now capped. See the ADR 0285 amendment.)
40
40
  - Each first-free request holds one database connection from its count to its insert. Creates are rare, so the pool can carry it.
41
41
 
42
42
  ## Alternatives considered
@@ -13518,6 +13518,121 @@
13518
13518
  ]
13519
13519
  }
13520
13520
  },
13521
+ "/me/howto": {
13522
+ "get": {
13523
+ "operationId": "get_me_howto",
13524
+ "tags": [
13525
+ "me"
13526
+ ],
13527
+ "summary": "GET /me/howto",
13528
+ "description": "the caller's own read state.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
13529
+ "x-rank": "any-builder",
13530
+ "x-source": "modules/onboarding/routes/onboarding.js",
13531
+ "responses": {
13532
+ "200": {
13533
+ "description": "Success."
13534
+ },
13535
+ "400": {
13536
+ "$ref": "#/components/responses/BadRequest"
13537
+ },
13538
+ "401": {
13539
+ "$ref": "#/components/responses/Unauthorized"
13540
+ },
13541
+ "403": {
13542
+ "$ref": "#/components/responses/Forbidden"
13543
+ }
13544
+ },
13545
+ "security": [
13546
+ {
13547
+ "builderSession": []
13548
+ }
13549
+ ]
13550
+ }
13551
+ },
13552
+ "/me/howto/read": {
13553
+ "post": {
13554
+ "operationId": "post_me_howto_read",
13555
+ "tags": [
13556
+ "me"
13557
+ ],
13558
+ "summary": "POST /me/howto/read",
13559
+ "description": "marks the caller's own steps read ({ steps }) or skips the guide ({ all: true, how: 'skipped' }).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
13560
+ "x-rank": "any-builder",
13561
+ "x-source": "modules/onboarding/routes/onboarding.js",
13562
+ "requestBody": {
13563
+ "required": false,
13564
+ "content": {
13565
+ "application/json": {
13566
+ "schema": {
13567
+ "$ref": "#/components/schemas/PostMeHowtoReadRequest"
13568
+ }
13569
+ }
13570
+ },
13571
+ "x-validated": true
13572
+ },
13573
+ "responses": {
13574
+ "200": {
13575
+ "description": "Success."
13576
+ },
13577
+ "400": {
13578
+ "$ref": "#/components/responses/ValidationFailed"
13579
+ },
13580
+ "401": {
13581
+ "$ref": "#/components/responses/Unauthorized"
13582
+ },
13583
+ "403": {
13584
+ "$ref": "#/components/responses/Forbidden"
13585
+ }
13586
+ },
13587
+ "security": [
13588
+ {
13589
+ "builderSession": []
13590
+ }
13591
+ ]
13592
+ }
13593
+ },
13594
+ "/me/howto/reset": {
13595
+ "post": {
13596
+ "operationId": "post_me_howto_reset",
13597
+ "tags": [
13598
+ "me"
13599
+ ],
13600
+ "summary": "POST /me/howto/reset",
13601
+ "description": "forgets the caller's own marks ({ steps }, or everything when none are named).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
13602
+ "x-rank": "any-builder",
13603
+ "x-source": "modules/onboarding/routes/onboarding.js",
13604
+ "requestBody": {
13605
+ "required": false,
13606
+ "content": {
13607
+ "application/json": {
13608
+ "schema": {
13609
+ "$ref": "#/components/schemas/PostMeHowtoResetRequest"
13610
+ }
13611
+ }
13612
+ },
13613
+ "x-validated": true
13614
+ },
13615
+ "responses": {
13616
+ "200": {
13617
+ "description": "Success."
13618
+ },
13619
+ "400": {
13620
+ "$ref": "#/components/responses/ValidationFailed"
13621
+ },
13622
+ "401": {
13623
+ "$ref": "#/components/responses/Unauthorized"
13624
+ },
13625
+ "403": {
13626
+ "$ref": "#/components/responses/Forbidden"
13627
+ }
13628
+ },
13629
+ "security": [
13630
+ {
13631
+ "builderSession": []
13632
+ }
13633
+ ]
13634
+ }
13635
+ },
13521
13636
  "/me/interaction": {
13522
13637
  "get": {
13523
13638
  "operationId": "get_me_interaction",
@@ -32403,6 +32518,36 @@
32403
32518
  "views"
32404
32519
  ]
32405
32520
  },
32521
+ "PostMeHowtoReadRequest": {
32522
+ "type": "object",
32523
+ "properties": {
32524
+ "steps": {
32525
+ "type": "array",
32526
+ "maxItems": 100
32527
+ },
32528
+ "all": {
32529
+ "type": "boolean"
32530
+ },
32531
+ "how": {
32532
+ "type": "string",
32533
+ "maxLength": 16
32534
+ }
32535
+ },
32536
+ "additionalProperties": false
32537
+ },
32538
+ "PostMeHowtoResetRequest": {
32539
+ "type": "object",
32540
+ "properties": {
32541
+ "steps": {
32542
+ "type": "array",
32543
+ "maxItems": 100
32544
+ },
32545
+ "all": {
32546
+ "type": "boolean"
32547
+ }
32548
+ },
32549
+ "additionalProperties": false
32550
+ },
32406
32551
  "PostMeSessionsRevokeAllResponse": {
32407
32552
  "type": "object",
32408
32553
  "properties": {
@@ -35469,8 +35614,8 @@
35469
35614
  "description": "A required dependency/feature is not configured or is temporarily down."
35470
35615
  }
35471
35616
  },
35472
- "x-endpoint-count": 555,
35473
- "x-schema-count": 592,
35617
+ "x-endpoint-count": 558,
35618
+ "x-schema-count": 594,
35474
35619
  "x-undocumented-bodies": 12,
35475
35620
  "x-response-schemas": 390,
35476
35621
  "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. 555 endpoints across 95 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 558 endpoints across 95 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`.
@@ -489,7 +489,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
489
489
  | POST | `/api/bongos/llm-cache/lookup` | `metic+archon` | `cache_key`, `tokens_saved_est` | POST /llm-cache/lookup — hit/miss + atomic hit_count bump. |
490
490
  | POST | `/api/bongos/llm-cache/store` | `metic+archon` | `spec`, `result_stdout`, `result_cost_usd` | POST /llm-cache/store — upsert a freshly-produced result. |
491
491
 
492
- ## `me` (39)
492
+ ## `me` (42)
493
493
 
494
494
  | Method | Path | Rank | Body | Description |
495
495
  |---|---|---|---|---|
@@ -512,6 +512,9 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
512
512
  | 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… |
513
513
  | GET | `/api/bongos/me/guilds` | `any-builder` | — | MY guilds, each with my own two switches. |
514
514
  | PATCH | `/api/bongos/me/handle` | `any-builder` | `handle` | rename the caller's OWN handle (own data, keyed on the authenticated github_id). |
515
+ | GET | `/api/bongos/me/howto` | `any-builder` | — | the caller's own read state. |
516
+ | POST | `/api/bongos/me/howto/read` | `any-builder` | `steps`, `all`, `how` | marks the caller's own steps read ({ steps }) or skips the guide ({ all: true, how: 'skipped' }). |
517
+ | POST | `/api/bongos/me/howto/reset` | `any-builder` | `steps`, `all` | forgets the caller's own marks ({ steps }, or everything when none are named). |
515
518
  | GET | `/api/bongos/me/interaction` | `any-builder` | — | Per-builder INTERACTION PROFILE (task 2010, shares the behavior_prefs jsonb / migration 119). |
516
519
  | PATCH | `/api/bongos/me/interaction` | `any-builder` | _undocumented_ | PATCH the interaction profile. |
517
520
  | GET | `/api/bongos/me/model-allocation` | `any-builder` | — | |
@@ -3089,5 +3089,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
3089
3089
  landed since 1.21.124 with no explicit bump. run 38759002066. (task 1002620)
3090
3090
  1.21.126 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3091
3091
  landed since 1.21.125 with no explicit bump. run 38761052564. (task 1002620)
3092
+ 1.21.127 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3093
+ landed since 1.21.126 with no explicit bump. run 38764985266. (task 1002620)
3094
+ 1.21.128 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3095
+ landed since 1.21.127 with no explicit bump. run 38770118067. (task 1002620)
3092
3096
  ---------------------------------------------------------------------------
3093
3097
  ```