@bongos/core 1.25.21 → 1.25.23

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 (51) hide show
  1. package/.bongos-core.json +89 -49
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +8 -0
  4. package/clients/bongos-client/index.cjs +8 -0
  5. package/clients/bongos-client/index.d.ts +11 -0
  6. package/clients/bongos-client/index.mjs +8 -0
  7. package/docs/adr/0406-every-project-gets-a-sandbox-that-follows-main-and-live-moves-only-when-a-person-promotes.md +8 -0
  8. package/docs/api/openapi.json +198 -3
  9. package/docs/api-reference.md +7 -3
  10. package/docs/copy-inventory.md +415 -410
  11. package/docs/copy-registry.json +551 -506
  12. package/docs/file-map.md +1 -0
  13. package/docs/module-api-changelog.md +4 -0
  14. package/docs/page-readings.json +382 -376
  15. package/modules/hall-ui/public/palette.js +11 -4
  16. package/modules/hall-ui/records/founding-mode.md +6 -0
  17. package/modules/lifecycle/kickoff-checklist.js +1 -1
  18. package/modules/lifecycle/routes/pay-type-gates.js +7 -2
  19. package/modules/onboarding/project-facts.js +318 -0
  20. package/modules/onboarding/routes/genesis-work.js +16 -0
  21. package/modules/provisioning/project-facts.js +55 -0
  22. package/modules/provisioning/provisioning.js +4 -1
  23. package/modules/provisioning/render-sandbox.js +6 -0
  24. package/modules/public-landing/public/projects.html +191 -31
  25. package/package-lock.json +2 -2
  26. package/package.json +2 -1
  27. package/release-notes.json +20 -0
  28. package/scripts/bongos/genesis.js +38 -2
  29. package/scripts/bongos/init.js +13 -0
  30. package/scripts/bongos/package-core.js +2 -0
  31. package/scripts/bongos/provision-render-sandbox.js +5 -1
  32. package/scripts/bongos/render-payload.js +5 -2
  33. package/scripts/hall-preview/README.md +1 -0
  34. package/scripts/hall-preview/server.js +32 -1
  35. package/src/bongos/folder-upload.js +243 -0
  36. package/src/bongos/routes/github.js +109 -16
  37. package/src/bongos/routes.js +3 -0
  38. package/src/branding.js +4 -0
  39. package/src/module-api.js +1 -1
  40. package/src/sandbox/gate.js +164 -0
  41. package/src/sandbox/index.js +144 -0
  42. package/tests/folder_upload_project.mjs +396 -0
  43. package/tests/genesis_work_routes.mjs +25 -1
  44. package/tests/hall_palette.mjs +59 -2
  45. package/tests/project_facts.mjs +158 -0
  46. package/tests/projects_hub.mjs +1 -1
  47. package/tests/provision_settings_apply.mjs +2 -1
  48. package/tests/provisioning_settings_env.mjs +2 -2
  49. package/tests/public_landing_projects.mjs +27 -5
  50. package/tests/render_sandbox.mjs +7 -4
  51. package/tests/sandbox_gate.mjs +182 -0
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/bongos/package-core.js",
5
- "core_version": "1.25.21",
6
- "core_contract": "1.25.21",
7
- "source_commit": "edec2e881467ab2a9a71c1e4d73a4b3eac5644b4",
5
+ "core_version": "1.25.23",
6
+ "core_contract": "1.25.23",
7
+ "source_commit": "d44d5d0d3ac522246a0d48b80f5242a91ff07993",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-11-13T23:42:24.852Z",
9
+ "built_at": "2026-11-14T00:30:52.761Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 658,
13
13
  "agent_docs_stubbed": 34,
14
- "functional_verbatim": 4079,
14
+ "functional_verbatim": 4087,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 4772,
20
- "tree_sha256": "93a366dc7cd95fda7d827b0d346bf6594531a25809e3f042fe56c36a4c6e2628",
19
+ "file_count": 4780,
20
+ "tree_sha256": "c0fb506fb3f6b9181476ed72898814cc4e63103372b56ee2d2a34d862fa94770",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -332,12 +332,12 @@
332
332
  {
333
333
  "path": "clients/bongos-client/README.md",
334
334
  "mode": "0000644",
335
- "sha256": "ddde16f707ff0385bad50c6a1581792d094eaf71c24056880c6ae64e76a5d98e"
335
+ "sha256": "0304791b677adf1ad3b29232d25d401906717ffa939d91978eda5300560079f9"
336
336
  },
337
337
  {
338
338
  "path": "clients/bongos-client/bongos-client.global.js",
339
339
  "mode": "0000644",
340
- "sha256": "5b02f9bd936d62be25dade68132bc8beafcef97ad6dce9421a431408692decc6"
340
+ "sha256": "22a8d01073ff817c4216441793f6c036b8550316be0b48c8f7d9abd285337ca1"
341
341
  },
342
342
  {
343
343
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -347,17 +347,17 @@
347
347
  {
348
348
  "path": "clients/bongos-client/index.cjs",
349
349
  "mode": "0000644",
350
- "sha256": "4563e8b2002556033029ec0e458d7fe1e690cc0f637f2e3c4fc0beb2bb7a80af"
350
+ "sha256": "8a4f7994d2d3c7c3864ec2254c4d892437b6b71d723615830e5b40a541f2db58"
351
351
  },
352
352
  {
353
353
  "path": "clients/bongos-client/index.d.ts",
354
354
  "mode": "0000644",
355
- "sha256": "c3db9753a4b3d8d59f223fa20b36ec95b89667c3f8e75b65b8b76fbe6a44fb19"
355
+ "sha256": "9da38b663cbe1414270d88c77cea4ac35f1bcc11101d768522bed195c03f3818"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/index.mjs",
359
359
  "mode": "0000644",
360
- "sha256": "c05d9cdfe867d81257f3aaecdf6cb8a88133e280d7147065151da29f19fff751"
360
+ "sha256": "b9e24350b0be77271687738665bbba2dc9173313a1563450367ae715a221627b"
361
361
  },
362
362
  {
363
363
  "path": "clients/bongos-client/package.json",
@@ -2492,7 +2492,7 @@
2492
2492
  {
2493
2493
  "path": "docs/adr/0406-every-project-gets-a-sandbox-that-follows-main-and-live-moves-only-when-a-person-promotes.md",
2494
2494
  "mode": "0000644",
2495
- "sha256": "73e2506a621dbc141089ce7c827c530f21a5604d26871c028b25cf9e79c1681c"
2495
+ "sha256": "74432c80fc96290a67ece45663a956e296f7351dbc3099c2ec2d691adf7378c9"
2496
2496
  },
2497
2497
  {
2498
2498
  "path": "docs/adr/0407-a-project-grant-is-made-by-the-owner-not-witnessed-at-sign-in.md",
@@ -2512,12 +2512,12 @@
2512
2512
  {
2513
2513
  "path": "docs/api-reference.md",
2514
2514
  "mode": "0000644",
2515
- "sha256": "8958d5017da37110048c273b1ae365fa7ce093668cf63e98f6ebaf6c1036a861"
2515
+ "sha256": "85e880fb33314f7857b68348002b521d6f81b80a8d1d2b5c3a8cacc388285b30"
2516
2516
  },
2517
2517
  {
2518
2518
  "path": "docs/api/openapi.json",
2519
2519
  "mode": "0000644",
2520
- "sha256": "e576e79ca02594739010e1baa389204a99986c79b63561dfcb0ed1574306e764"
2520
+ "sha256": "7230b0899b0d31ab67024901e84e8aecc4b7b25abebac413c731e6eb3e08ed98"
2521
2521
  },
2522
2522
  {
2523
2523
  "path": "docs/architecture.md",
@@ -2542,12 +2542,12 @@
2542
2542
  {
2543
2543
  "path": "docs/copy-inventory.md",
2544
2544
  "mode": "0000644",
2545
- "sha256": "007c078a8859b38d8d9dde3c6d90ffbf1b2f688f284016c5b18da82de32601da"
2545
+ "sha256": "2336261aeb9028b6bff1fbeaa530a099b2ed2069dac2b5920152ec6f33555cb7"
2546
2546
  },
2547
2547
  {
2548
2548
  "path": "docs/copy-registry.json",
2549
2549
  "mode": "0000644",
2550
- "sha256": "b2978248d9694ee0a36200ce110b9c937bcfe66cb10bd3aa2814327664ccb3b7"
2550
+ "sha256": "1b571de216bf571c87618addcdf4c169c4c7b9d4bc1d6b01fa8a4e292b86542c"
2551
2551
  },
2552
2552
  {
2553
2553
  "path": "docs/design/apex-pass-2-direction.md",
@@ -3092,7 +3092,7 @@
3092
3092
  {
3093
3093
  "path": "docs/file-map.md",
3094
3094
  "mode": "0000644",
3095
- "sha256": "39873c50e006b944e9d7ef17712af1252cb6e667c40b0695fe1e8818e0d47aff"
3095
+ "sha256": "32a5a774019d20cc0194f5128c737907e86ba94dc47de230afbd061f52e7c8a9"
3096
3096
  },
3097
3097
  {
3098
3098
  "path": "docs/handoff-template.md",
@@ -3102,7 +3102,7 @@
3102
3102
  {
3103
3103
  "path": "docs/module-api-changelog.md",
3104
3104
  "mode": "0000644",
3105
- "sha256": "4c4d9ba1532cb57da74961f0cbeba5052349e20784eabd572915494938489f85"
3105
+ "sha256": "cdc7967cb5713ea9041d69fea21e7a1ef5a2b74b7c29f86d89a290fe863058e1"
3106
3106
  },
3107
3107
  {
3108
3108
  "path": "docs/modules-contract.md",
@@ -3187,7 +3187,7 @@
3187
3187
  {
3188
3188
  "path": "docs/page-readings.json",
3189
3189
  "mode": "0000644",
3190
- "sha256": "11b2e6ec69ff67de20e9110fbffa1dca245c8343a0bde0c4a0c71d744c596b7d"
3190
+ "sha256": "4374b8ba743d5dd03cf35b03fbd84024e63d749a0a5aa63d669d94fc69357eb3"
3191
3191
  },
3192
3192
  {
3193
3193
  "path": "docs/project-context.template.md",
@@ -7177,7 +7177,7 @@
7177
7177
  {
7178
7178
  "path": "modules/hall-ui/public/palette.js",
7179
7179
  "mode": "0000644",
7180
- "sha256": "1b52b9df0762f7eed34ec6f226e8e9a10cce6f9797a564cd3416786209a5e1d5"
7180
+ "sha256": "60296972ebfb14296a0a12d8fc85b41551ad699d90537e554876bb6653636fb3"
7181
7181
  },
7182
7182
  {
7183
7183
  "path": "modules/hall-ui/public/panel.css",
@@ -7832,7 +7832,7 @@
7832
7832
  {
7833
7833
  "path": "modules/hall-ui/records/founding-mode.md",
7834
7834
  "mode": "0000644",
7835
- "sha256": "25e506d34ff52b2d358b608ca17d9403b3d3674f5cf647030bb69c3fb235c487"
7835
+ "sha256": "cfaf28f0c396215cd2b5f1131f01fed12e7de37a89e8520bbce983d7a9c79a72"
7836
7836
  },
7837
7837
  {
7838
7838
  "path": "modules/hall-ui/records/game-menu.md",
@@ -8587,7 +8587,7 @@
8587
8587
  {
8588
8588
  "path": "modules/lifecycle/kickoff-checklist.js",
8589
8589
  "mode": "0000644",
8590
- "sha256": "43d5f3c3bab9c9b3fddab524d111224215d0661a48fce782d0d7980b1c333ee7"
8590
+ "sha256": "2e3eebac363df54307fe0592eaa2c69d08556469be7456985cfd3ae6dc49e6e6"
8591
8591
  },
8592
8592
  {
8593
8593
  "path": "modules/lifecycle/kickoff-seed.js",
@@ -8952,7 +8952,7 @@
8952
8952
  {
8953
8953
  "path": "modules/lifecycle/routes/pay-type-gates.js",
8954
8954
  "mode": "0000644",
8955
- "sha256": "ef0f4aa074e4391b01a3c863a9836e2dacc4047fe15a2ee58cb574e83b8e6850"
8955
+ "sha256": "ce0dad88d5d0f5542117c50923c780603b4a33609049b718967b13e70304859b"
8956
8956
  },
8957
8957
  {
8958
8958
  "path": "modules/lifecycle/routes/project-settings.js",
@@ -9499,6 +9499,11 @@
9499
9499
  "mode": "0000644",
9500
9500
  "sha256": "9c279c29c73a52aca400674e8a369972609e4c295d6b10f3997fd0ffc3064644"
9501
9501
  },
9502
+ {
9503
+ "path": "modules/onboarding/project-facts.js",
9504
+ "mode": "0000644",
9505
+ "sha256": "2a00fcc47148e4d2a01a57c25429df47cc6851c48dc44a772dd2c8c89b111a80"
9506
+ },
9502
9507
  {
9503
9508
  "path": "modules/onboarding/routes/access-requests.js",
9504
9509
  "mode": "0000644",
@@ -9507,7 +9512,7 @@
9507
9512
  {
9508
9513
  "path": "modules/onboarding/routes/genesis-work.js",
9509
9514
  "mode": "0000644",
9510
- "sha256": "48669d7c25c316c903169281fd3a9fd80aa14c3f3af5eb170869173ee81983bf"
9515
+ "sha256": "3bdab7a940576497a089d0b9ab5b5550ed9a19f6aede09a300723f2d25a84d03"
9511
9516
  },
9512
9517
  {
9513
9518
  "path": "modules/onboarding/routes/onboarding.js",
@@ -10414,6 +10419,11 @@
10414
10419
  "mode": "0000644",
10415
10420
  "sha256": "91ef53244d6290440eafec263168a70dc74085f9ad12cb14c4278ff3ba515293"
10416
10421
  },
10422
+ {
10423
+ "path": "modules/provisioning/project-facts.js",
10424
+ "mode": "0000644",
10425
+ "sha256": "510d25be60459e2a04b2441608d44ae80dfe379b70fef5fdad381eecbe94d13a"
10426
+ },
10417
10427
  {
10418
10428
  "path": "modules/provisioning/project-refusal.js",
10419
10429
  "mode": "0000644",
@@ -10422,7 +10432,7 @@
10422
10432
  {
10423
10433
  "path": "modules/provisioning/provisioning.js",
10424
10434
  "mode": "0000644",
10425
- "sha256": "a947d71cacba76538a51f6ec687b7a68b22dd99bd215fc85c36301e530bb6999"
10435
+ "sha256": "754b1ffbc4ec4ccad42944f576d779407a86cbd34c3f162cb2506a46328477e4"
10426
10436
  },
10427
10437
  {
10428
10438
  "path": "modules/provisioning/public-refusal.js",
@@ -10452,7 +10462,7 @@
10452
10462
  {
10453
10463
  "path": "modules/provisioning/render-sandbox.js",
10454
10464
  "mode": "0000644",
10455
- "sha256": "4bae78107ff351f73d27162aa9462215f383918a44f5ffda649a01e42ea2c558"
10465
+ "sha256": "9061d1444dfcb216ffc0a7a63c27338aa2655ce711b75fa4be680b3a902429b0"
10456
10466
  },
10457
10467
  {
10458
10468
  "path": "modules/provisioning/render-standup.js",
@@ -11437,7 +11447,7 @@
11437
11447
  {
11438
11448
  "path": "modules/public-landing/public/projects.html",
11439
11449
  "mode": "0000644",
11440
- "sha256": "5732456fd9b1ad4c96295a9648cec0079d59e83f5f4ca153d68394ab5b9bff89"
11450
+ "sha256": "8797889f6b40d5bb0f006ee4e8e7b11403e14365272896654860854c9e19ca65"
11441
11451
  },
11442
11452
  {
11443
11453
  "path": "modules/public-landing/public/projects.probes.json",
@@ -12507,12 +12517,12 @@
12507
12517
  {
12508
12518
  "path": "package-lock.json",
12509
12519
  "mode": "0000644",
12510
- "sha256": "05428b8be0243029ed46a428993ca620906b0ee1f57e3429e4781b1f7edf3ee9"
12520
+ "sha256": "fb52a39386be4cbb092a7112152fee766f3e249d0569bfc3171f3cfafe08738d"
12511
12521
  },
12512
12522
  {
12513
12523
  "path": "package.json",
12514
12524
  "mode": "0000644",
12515
- "sha256": "4154f2c35e85c1fca115795e41e798e9cb2961b3df795e70e0f85ab095fca6da"
12525
+ "sha256": "19858223618afc07847976141572ba53768e53959b06a858b7c6311c1609425d"
12516
12526
  },
12517
12527
  {
12518
12528
  "path": "public-docs/index.html",
@@ -12532,7 +12542,7 @@
12532
12542
  {
12533
12543
  "path": "release-notes.json",
12534
12544
  "mode": "0000644",
12535
- "sha256": "781944afcbb4c680e67701912d7e5480e3abaa4b9130c91aedfcb488fda5b4b9"
12545
+ "sha256": "9af40f9fbb9bc2657ff9836096bcba8105ab9bb1325003733cd02e0ddb60c914"
12536
12546
  },
12537
12547
  {
12538
12548
  "path": "scripts/bongos/CLAUDE.md",
@@ -13202,7 +13212,7 @@
13202
13212
  {
13203
13213
  "path": "scripts/bongos/genesis.js",
13204
13214
  "mode": "0000644",
13205
- "sha256": "de894ba7c88ff237c9852360482a683ef30b0b55e64a516e83a180303e7c3fb0"
13215
+ "sha256": "ce17d715c254a00de8f000a8aa3e5d6c5dd3d21cfd877e1e6ce29d3d13767aed"
13206
13216
  },
13207
13217
  {
13208
13218
  "path": "scripts/bongos/git-merge-regen.js",
@@ -13277,7 +13287,7 @@
13277
13287
  {
13278
13288
  "path": "scripts/bongos/init.js",
13279
13289
  "mode": "0000644",
13280
- "sha256": "ac30376e6e1987bbd3768ab171734d57552b24314003d6d5efea1eab8285347e"
13290
+ "sha256": "4a95fd486ff36ffa673669885caf7f0feb36d4f66ab103a10275beffee518804"
13281
13291
  },
13282
13292
  {
13283
13293
  "path": "scripts/bongos/install-git-hooks.js",
@@ -13527,7 +13537,7 @@
13527
13537
  {
13528
13538
  "path": "scripts/bongos/package-core.js",
13529
13539
  "mode": "0000644",
13530
- "sha256": "a4b7f10de4674acfbcd6fb310c39b0e30d8ea4b4cdb81b4eeb0c5be05708ed1b"
13540
+ "sha256": "f3d161dafdf2e051018aef11d813ac5a479f592d44d542252a0f9342b081a787"
13531
13541
  },
13532
13542
  {
13533
13543
  "path": "scripts/bongos/page-inventory.js",
@@ -13647,7 +13657,7 @@
13647
13657
  {
13648
13658
  "path": "scripts/bongos/provision-render-sandbox.js",
13649
13659
  "mode": "0000644",
13650
- "sha256": "14399a81a19ab80d2ce59c9ed27eb5741618c6305a9505716114e5354d4004e9"
13660
+ "sha256": "c30bfde5525f3d93e6da60c9c6f4861c7f17196307fe42d72574b517c7180af1"
13651
13661
  },
13652
13662
  {
13653
13663
  "path": "scripts/bongos/provision-render.js",
@@ -13787,7 +13797,7 @@
13787
13797
  {
13788
13798
  "path": "scripts/bongos/render-payload.js",
13789
13799
  "mode": "0000644",
13790
- "sha256": "31b53f494f011ce8eb0de4058b60842eca72a843f885f2619e9db8f99490958a"
13800
+ "sha256": "54292fba8eec8c63adee38eafa605edd18adf473e0fca42ec1fd19c04073b87a"
13791
13801
  },
13792
13802
  {
13793
13803
  "path": "scripts/bongos/repo-metrics.js",
@@ -15947,7 +15957,7 @@
15947
15957
  {
15948
15958
  "path": "scripts/hall-preview/README.md",
15949
15959
  "mode": "0000644",
15950
- "sha256": "5ebfcc1c49fecb023da46731d4149f29f479a1fb1bec7acb2bfdd1706d75da95"
15960
+ "sha256": "b9c84c8fdbb9a3c5a3956dbdb0a3e2fde619d5b9e8f11b1b0811689194afaae8"
15951
15961
  },
15952
15962
  {
15953
15963
  "path": "scripts/hall-preview/live-identity.js",
@@ -15972,7 +15982,7 @@
15972
15982
  {
15973
15983
  "path": "scripts/hall-preview/server.js",
15974
15984
  "mode": "0000644",
15975
- "sha256": "c3d56c9926dfcacde1e279ec66708891c0cde3f27a66703bdcbe84847a19131d"
15985
+ "sha256": "c7e9c7aca0d3cd56831ac26804a274cf0a2857224725469564c587949d6ed57d"
15976
15986
  },
15977
15987
  {
15978
15988
  "path": "scripts/hall-preview/task-visual.js",
@@ -16154,6 +16164,11 @@
16154
16164
  "mode": "0000644",
16155
16165
  "sha256": "f34153ac5fd891904dd6ef06e2c4b3c1f860f487a2b11c9a41c1109369ac570f"
16156
16166
  },
16167
+ {
16168
+ "path": "src/bongos/folder-upload.js",
16169
+ "mode": "0000644",
16170
+ "sha256": "8085da5ea9ba68253edb02293770bfc1c65f626d0bcc71fdba597dab792c3be1"
16171
+ },
16157
16172
  {
16158
16173
  "path": "src/bongos/founding-page-gate.js",
16159
16174
  "mode": "0000644",
@@ -16362,7 +16377,7 @@
16362
16377
  {
16363
16378
  "path": "src/bongos/routes.js",
16364
16379
  "mode": "0000644",
16365
- "sha256": "72df63aadd1a96a5eaf2f0c2721f3db6b8767f7b3f7f569ba8354c60378e2463"
16380
+ "sha256": "a7c3cbf705fee36ce45fdf49e27956274eb14ded9af24c32cc0632f90d8078de"
16366
16381
  },
16367
16382
  {
16368
16383
  "path": "src/bongos/routes/CLAUDE.md",
@@ -16422,7 +16437,7 @@
16422
16437
  {
16423
16438
  "path": "src/bongos/routes/github.js",
16424
16439
  "mode": "0000644",
16425
- "sha256": "336f1cbca753a05e590d7877c625ebc62043f0d39f266e88f1cc6cb7c63e3778"
16440
+ "sha256": "d5b236595cf55552c988e7259217c93423de666a4cc22dfda5526b15f6fe5e1f"
16426
16441
  },
16427
16442
  {
16428
16443
  "path": "src/bongos/routes/healthz.js",
@@ -16562,7 +16577,7 @@
16562
16577
  {
16563
16578
  "path": "src/branding.js",
16564
16579
  "mode": "0000644",
16565
- "sha256": "421b6bfb2878807d015f6f3de9e7a615713901d6d6e99cc4cf264025f0e4ad7e"
16580
+ "sha256": "f0803ec719002667edd05f8c20653081ea9b86d6232b8f5a65ab2b464498e754"
16566
16581
  },
16567
16582
  {
16568
16583
  "path": "src/build-info.js",
@@ -16607,7 +16622,7 @@
16607
16622
  {
16608
16623
  "path": "src/module-api.js",
16609
16624
  "mode": "0000644",
16610
- "sha256": "821750045960b4c9db0c3e1ccd95a0d74e7139d1746c19f81020bc66f54d9c9a"
16625
+ "sha256": "8cfb866517943458ee73f0c88d6b57db10b7f57aed7adbf6ee9e8df4afb6f83f"
16611
16626
  },
16612
16627
  {
16613
16628
  "path": "src/module-loader/catalog.js",
@@ -16664,6 +16679,16 @@
16664
16679
  "mode": "0000644",
16665
16680
  "sha256": "cd93b675c2567887c29528bfe0cc36f5975b992d564f75ef5179230161da4439"
16666
16681
  },
16682
+ {
16683
+ "path": "src/sandbox/gate.js",
16684
+ "mode": "0000644",
16685
+ "sha256": "56f9c561130c5fb74ac119bf9e398a53eb163af7a7ba7c275c984796da05b6a6"
16686
+ },
16687
+ {
16688
+ "path": "src/sandbox/index.js",
16689
+ "mode": "0000644",
16690
+ "sha256": "589d7fe4ac8a7213eaa432e337dd00cf5855e1387a8d771f738c0e5cb2a62555"
16691
+ },
16667
16692
  {
16668
16693
  "path": "src/sleep.js",
16669
16694
  "mode": "0000644",
@@ -18599,6 +18624,11 @@
18599
18624
  "mode": "0000644",
18600
18625
  "sha256": "0217525dea3e388ea5ce6a2a32287824aadbfe8f0118bfac85a5c8de01dee67e"
18601
18626
  },
18627
+ {
18628
+ "path": "tests/folder_upload_project.mjs",
18629
+ "mode": "0000644",
18630
+ "sha256": "6430a507884d07b9fa1c6990ebe494a0f49f7265bc508e43e88f8640ccf2349d"
18631
+ },
18602
18632
  {
18603
18633
  "path": "tests/founding_birth.mjs",
18604
18634
  "mode": "0000644",
@@ -18692,7 +18722,7 @@
18692
18722
  {
18693
18723
  "path": "tests/genesis_work_routes.mjs",
18694
18724
  "mode": "0000644",
18695
- "sha256": "3d91108a7cb6ddb1bfc3b0ca8a10459c52658f90e50be93397fd9964caee3eb7"
18725
+ "sha256": "5ada4e8783c322abab4f5e30ad405abab6a1a514f3186b9e7413b0eec2a3aa7e"
18696
18726
  },
18697
18727
  {
18698
18728
  "path": "tests/git_guard.mjs",
@@ -19762,7 +19792,7 @@
19762
19792
  {
19763
19793
  "path": "tests/hall_palette.mjs",
19764
19794
  "mode": "0000644",
19765
- "sha256": "b2f567dc83c9c68cc1d7793df5334cd61d390b51e55be21a869f9a4cb0b8ad7e"
19795
+ "sha256": "86614581ff3bf9b07210d88d2fea5d4f7ffbd8361339209cff07f3036a5c9fee"
19766
19796
  },
19767
19797
  {
19768
19798
  "path": "tests/hall_preview_encoded_paths.mjs",
@@ -21759,6 +21789,11 @@
21759
21789
  "mode": "0000644",
21760
21790
  "sha256": "97d570d16414bb5c71d54223702058018a13c58cdf563448c7d28e2fcf80488e"
21761
21791
  },
21792
+ {
21793
+ "path": "tests/project_facts.mjs",
21794
+ "mode": "0000644",
21795
+ "sha256": "284f2b969f2d6133df16a3d557af1b4378fbb983619082aa2c8c15a609462ca7"
21796
+ },
21762
21797
  {
21763
21798
  "path": "tests/project_invite_ownership.mjs",
21764
21799
  "mode": "0000644",
@@ -21837,7 +21872,7 @@
21837
21872
  {
21838
21873
  "path": "tests/projects_hub.mjs",
21839
21874
  "mode": "0000644",
21840
- "sha256": "923adae7fafc44c933deb8eef4d8861d90d150d4af4f9c52d055143957f5ea16"
21875
+ "sha256": "83728120344e4c62cf70cfa82d5b7bdd7de38ebc87dae0f752e874b3d9e102d1"
21841
21876
  },
21842
21877
  {
21843
21878
  "path": "tests/projects_hub_app_status.mjs",
@@ -21967,7 +22002,7 @@
21967
22002
  {
21968
22003
  "path": "tests/provision_settings_apply.mjs",
21969
22004
  "mode": "0000644",
21970
- "sha256": "789c04d0ad40943d288597ee3217121160dea94f1033e451f743808dd5ce2b1e"
22005
+ "sha256": "c48b2964fd343ce9fb000b181bdaf5f630945bbca71adfd38958764f399b958a"
21971
22006
  },
21972
22007
  {
21973
22008
  "path": "tests/provision_teardown_address.mjs",
@@ -22132,7 +22167,7 @@
22132
22167
  {
22133
22168
  "path": "tests/provisioning_settings_env.mjs",
22134
22169
  "mode": "0000644",
22135
- "sha256": "8f3735a2b63020d617312827b5594c2cb2ee6aecbffcf4aabbf7083a4306990b"
22170
+ "sha256": "481fa827c79c2d2a0d89d5029e5b991fe8bc62200906b1b560f0d725863aff67"
22136
22171
  },
22137
22172
  {
22138
22173
  "path": "tests/provisioning_slug_available.mjs",
@@ -22177,7 +22212,7 @@
22177
22212
  {
22178
22213
  "path": "tests/public_landing_projects.mjs",
22179
22214
  "mode": "0000644",
22180
- "sha256": "5c4afce4ed9e455816aa72bb307751e393dc483de21e9fde4624e7788c0a40fa"
22215
+ "sha256": "fbad66e017c8234900903b248f1f0caa26b54ce6b886b40e2389c6d7c329aa5e"
22181
22216
  },
22182
22217
  {
22183
22218
  "path": "tests/public_mirror_export.mjs",
@@ -22402,7 +22437,7 @@
22402
22437
  {
22403
22438
  "path": "tests/render_sandbox.mjs",
22404
22439
  "mode": "0000644",
22405
- "sha256": "680d32b52f8bc4a9d04d7bd469ef64e42a236ba230d8b46bab7c08680f80ae60"
22440
+ "sha256": "61229d01a0498a0fa83bf68079ef3d8634b1c89d1f95fef1e8d5eb128768d62c"
22406
22441
  },
22407
22442
  {
22408
22443
  "path": "tests/repo_info_binding.mjs",
@@ -22529,6 +22564,11 @@
22529
22564
  "mode": "0000644",
22530
22565
  "sha256": "285f803272da6da754355017a32eda02b0639ed45c0fdf13366fcb5ad64b9b2e"
22531
22566
  },
22567
+ {
22568
+ "path": "tests/sandbox_gate.mjs",
22569
+ "mode": "0000644",
22570
+ "sha256": "805b16f338cfc69e9b9c0a9ef606258942c349ddad985a050d10cff541129caf"
22571
+ },
22532
22572
  {
22533
22573
  "path": "tests/sandbox_stage.mjs",
22534
22574
  "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
- - 736 operations across 88 resource groups
8
+ - 740 operations across 88 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -497,8 +497,14 @@ function createClient(opts = {}) {
497
497
  getFoundingContext: (args) => request("GET", "/founding/context", { hasBody: false }, args),
498
498
  // PUT /founding/enabled — rank: any-builder — PUT /founding/enabled
499
499
  putFoundingEnabled: (args) => request("PUT", "/founding/enabled", { hasBody: true }, args),
500
+ // GET /founding/facts — rank: any-builder — GET /founding/facts
501
+ getFoundingFacts: (args) => request("GET", "/founding/facts", { hasBody: false }, args),
502
+ // PUT /founding/facts — rank: any-builder — PUT /founding/facts
503
+ putFoundingFacts: (args) => request("PUT", "/founding/facts", { hasBody: true }, args),
500
504
  // GET /founding/genesis — rank: any-builder — GET /founding/genesis
501
505
  getFoundingGenesis: (args) => request("GET", "/founding/genesis", { hasBody: false }, args),
506
+ // GET /founding/legalize/options — rank: any-builder — GET /founding/legalize/options
507
+ getFoundingLegalizeOptions: (args) => request("GET", "/founding/legalize/options", { hasBody: false }, args),
502
508
  // POST /founding/plan — rank: any-builder — POST /founding/plan
503
509
  postFoundingPlan: (args) => request("POST", "/founding/plan", { hasBody: true }, args),
504
510
  // POST /founding/skip — rank: any-builder — POST /founding/skip
@@ -563,6 +569,8 @@ function createClient(opts = {}) {
563
569
  getGithubRepos: (args) => request("GET", "/github/repos", { hasBody: false }, args),
564
570
  // POST /github/repos — rank: any-builder — POST /github/repos
565
571
  postGithubRepos: (args) => request("POST", "/github/repos", { hasBody: true }, args),
572
+ // POST /github/repos/upload — rank: any-builder — POST /github/repos/upload
573
+ postGithubReposUpload: (args) => request("POST", "/github/repos/upload", { hasBody: true }, args),
566
574
  },
567
575
  "goalTaskRelevance": {
568
576
  // POST /goal-task-relevance/{id}/decide — rank: metic+archon — POST /goal-task-relevance/:id/decide
@@ -496,8 +496,14 @@ function createClient(opts = {}) {
496
496
  getFoundingContext: (args) => request("GET", "/founding/context", { hasBody: false }, args),
497
497
  // PUT /founding/enabled — rank: any-builder — PUT /founding/enabled
498
498
  putFoundingEnabled: (args) => request("PUT", "/founding/enabled", { hasBody: true }, args),
499
+ // GET /founding/facts — rank: any-builder — GET /founding/facts
500
+ getFoundingFacts: (args) => request("GET", "/founding/facts", { hasBody: false }, args),
501
+ // PUT /founding/facts — rank: any-builder — PUT /founding/facts
502
+ putFoundingFacts: (args) => request("PUT", "/founding/facts", { hasBody: true }, args),
499
503
  // GET /founding/genesis — rank: any-builder — GET /founding/genesis
500
504
  getFoundingGenesis: (args) => request("GET", "/founding/genesis", { hasBody: false }, args),
505
+ // GET /founding/legalize/options — rank: any-builder — GET /founding/legalize/options
506
+ getFoundingLegalizeOptions: (args) => request("GET", "/founding/legalize/options", { hasBody: false }, args),
501
507
  // POST /founding/plan — rank: any-builder — POST /founding/plan
502
508
  postFoundingPlan: (args) => request("POST", "/founding/plan", { hasBody: true }, args),
503
509
  // POST /founding/skip — rank: any-builder — POST /founding/skip
@@ -562,6 +568,8 @@ function createClient(opts = {}) {
562
568
  getGithubRepos: (args) => request("GET", "/github/repos", { hasBody: false }, args),
563
569
  // POST /github/repos — rank: any-builder — POST /github/repos
564
570
  postGithubRepos: (args) => request("POST", "/github/repos", { hasBody: true }, args),
571
+ // POST /github/repos/upload — rank: any-builder — POST /github/repos/upload
572
+ postGithubReposUpload: (args) => request("POST", "/github/repos/upload", { hasBody: true }, args),
565
573
  },
566
574
  "goalTaskRelevance": {
567
575
  // POST /goal-task-relevance/{id}/decide — rank: metic+archon — POST /goal-task-relevance/:id/decide
@@ -407,6 +407,8 @@ export interface PostGithubRepoVisibilityRequest { repo: string; visibility: "pu
407
407
  export interface PostGithubRepoVisibilityResponse { ok: boolean; repo: unknown; private_deployable: boolean }
408
408
  export interface PostGithubReposRequest { name: string; org?: string }
409
409
  export interface PostGithubReposResponse { repo: unknown }
410
+ export interface PostGithubReposUploadRequest { name?: string; org?: string; into?: string; files?: unknown[] }
411
+ export interface PostGithubReposUploadResponse { repo: unknown; uploaded: unknown }
410
412
  export interface PostGoalTaskRelevanceIdDecideRequest { decision: "confirmed_gaming" | "false_positive"; note?: string }
411
413
  export interface PostGoalTaskRelevanceIdDecideResponse { ok: boolean; flag: unknown }
412
414
  export interface PostGoalsIdArchiveRequest { reason?: string; dispositions?: Record<string, unknown> }
@@ -741,6 +743,7 @@ export interface PutCopyDeskPagesPageIdDraftResponse { ok: boolean; outcome: unk
741
743
  export interface PutDoneWhenCriterionIdBackendOnlyRequest { backend_only: boolean }
742
744
  export interface PutDoneWhenCriterionIdBackendOnlyResponse { ok: boolean; criterion_id: unknown; backend_only: unknown }
743
745
  export interface PutFoundingEnabledRequest { enabled?: boolean }
746
+ export interface PutFoundingFactsRequest { facts: Record<string, unknown> }
744
747
  export interface PutFoundingWorkStageAnswersQuestionRequest { state?: string; text?: string; origin?: string; if_empty?: boolean }
745
748
  export interface PutFoundingWorkStageDoorRequest { door: string }
746
749
  export interface PutFoundingWorkStageLinkRequest { url?: string }
@@ -1194,8 +1197,14 @@ export interface BongosClient {
1194
1197
  getFoundingContext(args?: RequestArgs): Promise<ApiResponse>;
1195
1198
  /** PUT /founding/enabled — rank: any-builder */
1196
1199
  putFoundingEnabled(args?: RequestArgs & { body?: PutFoundingEnabledRequest }): Promise<ApiResponse>;
1200
+ /** GET /founding/facts — rank: any-builder */
1201
+ getFoundingFacts(args?: RequestArgs): Promise<ApiResponse>;
1202
+ /** PUT /founding/facts — rank: any-builder */
1203
+ putFoundingFacts(args: RequestArgs & { body: PutFoundingFactsRequest }): Promise<ApiResponse>;
1197
1204
  /** GET /founding/genesis — rank: any-builder */
1198
1205
  getFoundingGenesis(args?: RequestArgs): Promise<ApiResponse>;
1206
+ /** GET /founding/legalize/options — rank: any-builder */
1207
+ getFoundingLegalizeOptions(args?: RequestArgs): Promise<ApiResponse>;
1199
1208
  /** POST /founding/plan — rank: any-builder */
1200
1209
  postFoundingPlan(args?: RequestArgs & { body?: PostFoundingPlanRequest }): Promise<ApiResponse>;
1201
1210
  /** POST /founding/skip — rank: any-builder */
@@ -1260,6 +1269,8 @@ export interface BongosClient {
1260
1269
  getGithubRepos(args?: RequestArgs): Promise<GetGithubReposResponse>;
1261
1270
  /** POST /github/repos — rank: any-builder */
1262
1271
  postGithubRepos(args: RequestArgs & { body: PostGithubReposRequest }): Promise<PostGithubReposResponse>;
1272
+ /** POST /github/repos/upload — rank: any-builder */
1273
+ postGithubReposUpload(args?: RequestArgs & { body?: PostGithubReposUploadRequest }): Promise<PostGithubReposUploadResponse>;
1263
1274
  };
1264
1275
  "goalTaskRelevance": {
1265
1276
  /** POST /goal-task-relevance/{id}/decide — rank: metic+archon */
@@ -493,8 +493,14 @@ export function createClient(opts = {}) {
493
493
  getFoundingContext: (args) => request("GET", "/founding/context", { hasBody: false }, args),
494
494
  // PUT /founding/enabled — rank: any-builder — PUT /founding/enabled
495
495
  putFoundingEnabled: (args) => request("PUT", "/founding/enabled", { hasBody: true }, args),
496
+ // GET /founding/facts — rank: any-builder — GET /founding/facts
497
+ getFoundingFacts: (args) => request("GET", "/founding/facts", { hasBody: false }, args),
498
+ // PUT /founding/facts — rank: any-builder — PUT /founding/facts
499
+ putFoundingFacts: (args) => request("PUT", "/founding/facts", { hasBody: true }, args),
496
500
  // GET /founding/genesis — rank: any-builder — GET /founding/genesis
497
501
  getFoundingGenesis: (args) => request("GET", "/founding/genesis", { hasBody: false }, args),
502
+ // GET /founding/legalize/options — rank: any-builder — GET /founding/legalize/options
503
+ getFoundingLegalizeOptions: (args) => request("GET", "/founding/legalize/options", { hasBody: false }, args),
498
504
  // POST /founding/plan — rank: any-builder — POST /founding/plan
499
505
  postFoundingPlan: (args) => request("POST", "/founding/plan", { hasBody: true }, args),
500
506
  // POST /founding/skip — rank: any-builder — POST /founding/skip
@@ -559,6 +565,8 @@ export function createClient(opts = {}) {
559
565
  getGithubRepos: (args) => request("GET", "/github/repos", { hasBody: false }, args),
560
566
  // POST /github/repos — rank: any-builder — POST /github/repos
561
567
  postGithubRepos: (args) => request("POST", "/github/repos", { hasBody: true }, args),
568
+ // POST /github/repos/upload — rank: any-builder — POST /github/repos/upload
569
+ postGithubReposUpload: (args) => request("POST", "/github/repos/upload", { hasBody: true }, args),
562
570
  },
563
571
  "goalTaskRelevance": {
564
572
  // POST /goal-task-relevance/{id}/decide — rank: metic+archon — POST /goal-task-relevance/:id/decide
@@ -124,3 +124,11 @@ Each sibling task's description now opens with a dated note, *"Re-read against A
124
124
  - **Ship mode is untouched.** No ship, in Auto or Manual mode, reaches the promote leg; landing reaches the sandbox only.
125
125
  - **What this cannot stop, said plainly.** The owner can still deploy the live service from Render's own dashboard, or turn its automatic deploys back on there. Bongos does not see or record those. "Nothing reaches the main site without a recorded promotion" holds for everything Bongos does, not for what the owner does in Render directly.
126
126
 
127
+ ## 12. Amendment — the sandbox's safety, as built (2026-11-13, [task 1005291](https://cloudbongos.com/builders#/task/1005291))
128
+
129
+ - **Fake by default, by construction.** The sandbox service is created with only `BONGOS_SANDBOX=1` and its own `DATABASE_URL`; none of the live app's keys are copied to it. A sandbox the owner has not touched holds no real key, so nothing it does can reach a real customer. Test keys and test data are added by the owner or seeded by the app (`isSandbox()`).
130
+ - **The gate ships in the core package** as `@bongos/core/sandbox` (`src/sandbox/`). One line at the top of a Node app — `require('@bongos/core/sandbox').install()` — does nothing on the live site and, under `BONGOS_SANDBOX=1`, puts the gate in front of `fetch`, `http` and `https`. For each known provider (payments, email, messaging, code hosting and a few data services) a read passes; a send, a charge or a write is refused, never sent, written to the log as `[bongos-sandbox] refused …` (Render shows it), and kept for the owner. A Stripe **test-mode** key is let through, since it cannot move real money.
131
+ - **Visibly a sandbox.** `sandbox.middleware` puts a fixed "Sandbox" band on every HTML page and serves `/__bongos/sandbox`, which tells anyone what a sandbox is and what the gate cannot catch. The refusals and which real keys are lent (by variable name, never value) show only to a visitor carrying the sandbox's page key — a random value the platform sets on the sandbox (`BONGOS_SANDBOX_PAGE_KEY`) and keeps on the project's row, so only the owner's project page links with it. A passer-by on the sandbox's public address learns nothing about the owner's keys.
132
+ - **The starter says how.** The scaffold's README (`bongos init`) carries the one line, and the advice to lend a read-only key.
133
+ - **What it cannot catch, said plainly — here, on the sandbox page, and on the project page.** Only calls the app makes through Node's own web requests, and only to providers in its table. Code that goes around them, an app not written in Node, or an unknown provider is not stopped. A read-only key is the floor; the gate is the second wall. The free plan also blocks outgoing email ports.
134
+