@bongos/core 1.21.125 → 1.21.127
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +106 -51
- package/docs/adr/0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md +6 -0
- package/docs/adr/0354-a-builder-hosts-one-project-free-and-more-takes-the-fleet-permission.md +1 -1
- package/docs/api/openapi.json +4 -4
- package/docs/copy-inventory.md +128 -126
- package/docs/copy-registry.json +188 -170
- package/docs/module-api-changelog.md +5 -1
- package/docs/page-inventory.json +2 -1
- package/docs/page-readings.json +152 -143
- package/modules/hall-ui/public/goal-forest-lib.js +36 -0
- package/modules/hall-ui/public/goal-forest-render.js +50 -10
- package/modules/hall-ui/public/goals-page.js +19 -22
- package/modules/hall-ui/public/goals-render.js +6 -16
- package/modules/hall-ui/public/goals.css +13 -4
- package/modules/hall-ui/public/goals.html +22 -24
- package/modules/hall-ui/public/goals.states.json +19 -1
- package/modules/hall-ui/records/goal-dependency-forest.md +4 -3
- package/modules/platform-identity/invite-authz.js +1 -1
- package/modules/provisioning/catalog-bridge.js +1 -1
- package/modules/provisioning/provisioning.js +1 -1
- package/modules/provisioning/route-helpers.js +50 -0
- package/modules/provisioning/routes/disconnect.js +6 -5
- package/modules/provisioning/routes/env-manifest.js +11 -27
- package/modules/provisioning/routes/provisioning.js +58 -75
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +24 -0
- package/scripts/gds/exec-path-guard.js +1 -1
- package/scripts/gds/fitness.js +1 -0
- package/scripts/gds/module-assess-tests.js +40 -11
- package/scripts/gds/module-assess-version.js +10 -2
- package/scripts/gds/module-error-report.js +148 -0
- package/scripts/gds/module-test-runner/README.md +44 -0
- package/scripts/gds/module-test-runner/module-tests.yml +87 -0
- package/scripts/gds/module-test-runner.js +358 -0
- package/scripts/gds/module.js +1 -0
- package/scripts/gds/provision-caps.js +63 -0
- package/scripts/gds/provision-process.js +3 -0
- package/scripts/gds/provision-units.js +3 -0
- package/scripts/gds/provision.js +3 -1
- package/src/module-api.js +1 -1
- package/src/module-loader/error-tally.js +188 -0
- package/src/module-loader/loader.js +52 -4
- package/src/platform-server.js +7 -0
- package/tests/goal_forest_lib.mjs +28 -0
- package/tests/goal_forest_page.mjs +106 -11
- package/tests/module_assess_price_parity.mjs +2 -2
- package/tests/module_assess_score.mjs +13 -3
- package/tests/module_error_counts.mjs +265 -0
- package/tests/module_test_runner.mjs +294 -0
- package/tests/project_catalog_routes.mjs +1 -1
- package/tests/provision.mjs +2 -0
- package/tests/provision_resource_caps.mjs +117 -0
- package/tests/provisioning_module_selection.mjs +1 -1
- package/tests/provisioning_project_owner_gate.mjs +271 -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.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.127",
|
|
6
|
+
"core_contract": "1.21.127",
|
|
7
|
+
"source_commit": "ea6cb74e9eba8805eb016b8ac0420841e429c290",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-15T15:
|
|
9
|
+
"built_at": "2026-10-15T15:58:58.689Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 606,
|
|
13
13
|
"agent_docs_stubbed": 28,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 3138,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3773,
|
|
20
|
+
"tree_sha256": "2af5f5b320f78e843791c36c370aa8f198a28c9bd3b085c1875f39869558c2cd",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -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": "
|
|
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": "
|
|
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",
|
|
@@ -2382,7 +2382,7 @@
|
|
|
2382
2382
|
{
|
|
2383
2383
|
"path": "docs/api/openapi.json",
|
|
2384
2384
|
"mode": "0000644",
|
|
2385
|
-
"sha256": "
|
|
2385
|
+
"sha256": "cd89b6776167172503ef68a77b1cfa68a00bf886d8f586c456f67e3cfef84fba"
|
|
2386
2386
|
},
|
|
2387
2387
|
{
|
|
2388
2388
|
"path": "docs/architecture.md",
|
|
@@ -2407,12 +2407,12 @@
|
|
|
2407
2407
|
{
|
|
2408
2408
|
"path": "docs/copy-inventory.md",
|
|
2409
2409
|
"mode": "0000644",
|
|
2410
|
-
"sha256": "
|
|
2410
|
+
"sha256": "24ace5710d2fd5823ec9f1c030570e53b48ccdff5b356b193e5d055fe9209d9f"
|
|
2411
2411
|
},
|
|
2412
2412
|
{
|
|
2413
2413
|
"path": "docs/copy-registry.json",
|
|
2414
2414
|
"mode": "0000644",
|
|
2415
|
-
"sha256": "
|
|
2415
|
+
"sha256": "d1bf2d46cc50c80729a6b705eef2313753ea48b56eed76bb365b8bda635ca68f"
|
|
2416
2416
|
},
|
|
2417
2417
|
{
|
|
2418
2418
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2922,7 +2922,7 @@
|
|
|
2922
2922
|
{
|
|
2923
2923
|
"path": "docs/module-api-changelog.md",
|
|
2924
2924
|
"mode": "0000644",
|
|
2925
|
-
"sha256": "
|
|
2925
|
+
"sha256": "de498901b8143d15779aafd30051f97e04ae01f32c880902da3a8234a6e262e7"
|
|
2926
2926
|
},
|
|
2927
2927
|
{
|
|
2928
2928
|
"path": "docs/modules-contract.md",
|
|
@@ -3007,12 +3007,12 @@
|
|
|
3007
3007
|
{
|
|
3008
3008
|
"path": "docs/page-inventory.json",
|
|
3009
3009
|
"mode": "0000644",
|
|
3010
|
-
"sha256": "
|
|
3010
|
+
"sha256": "688c15d7b79c60a561be7fca61931627898d1544d52dd912a79ff3fa6c160876"
|
|
3011
3011
|
},
|
|
3012
3012
|
{
|
|
3013
3013
|
"path": "docs/page-readings.json",
|
|
3014
3014
|
"mode": "0000644",
|
|
3015
|
-
"sha256": "
|
|
3015
|
+
"sha256": "2ade456b9e5e4e51e4c4e541f3336360d694022bd43b6ea5da77ae63367bd809"
|
|
3016
3016
|
},
|
|
3017
3017
|
{
|
|
3018
3018
|
"path": "docs/project-context.template.md",
|
|
@@ -5917,12 +5917,12 @@
|
|
|
5917
5917
|
{
|
|
5918
5918
|
"path": "modules/hall-ui/public/goal-forest-lib.js",
|
|
5919
5919
|
"mode": "0000644",
|
|
5920
|
-
"sha256": "
|
|
5920
|
+
"sha256": "84ea32523a9bc1fdd34e00cd28f75b52189d18bd72491739dafd2b08b40be39e"
|
|
5921
5921
|
},
|
|
5922
5922
|
{
|
|
5923
5923
|
"path": "modules/hall-ui/public/goal-forest-render.js",
|
|
5924
5924
|
"mode": "0000644",
|
|
5925
|
-
"sha256": "
|
|
5925
|
+
"sha256": "19df08dd72ce42827c825c6ee32233a6bb51f534e060c33d42552aff6e39a8ba"
|
|
5926
5926
|
},
|
|
5927
5927
|
{
|
|
5928
5928
|
"path": "modules/hall-ui/public/goal-inbox.js",
|
|
@@ -5947,22 +5947,22 @@
|
|
|
5947
5947
|
{
|
|
5948
5948
|
"path": "modules/hall-ui/public/goals-page.js",
|
|
5949
5949
|
"mode": "0000644",
|
|
5950
|
-
"sha256": "
|
|
5950
|
+
"sha256": "3836cafa9edc429cdcd847f48f324f7f3aa412ca42b847ed1622126525e67c9a"
|
|
5951
5951
|
},
|
|
5952
5952
|
{
|
|
5953
5953
|
"path": "modules/hall-ui/public/goals-render.js",
|
|
5954
5954
|
"mode": "0000644",
|
|
5955
|
-
"sha256": "
|
|
5955
|
+
"sha256": "d7cbd599a69f43851bf6af8be33166cc4ddc949d22f28f36bf2282def0cfc6ba"
|
|
5956
5956
|
},
|
|
5957
5957
|
{
|
|
5958
5958
|
"path": "modules/hall-ui/public/goals.css",
|
|
5959
5959
|
"mode": "0000644",
|
|
5960
|
-
"sha256": "
|
|
5960
|
+
"sha256": "6042df284acac7f5af12688651aad7e8d0cf38829a9395a1e28e0e0ded7b8bf3"
|
|
5961
5961
|
},
|
|
5962
5962
|
{
|
|
5963
5963
|
"path": "modules/hall-ui/public/goals.html",
|
|
5964
5964
|
"mode": "0000644",
|
|
5965
|
-
"sha256": "
|
|
5965
|
+
"sha256": "11b681a246ba5a6a662e6fb0b0eae795460bd1f8cdf251f8cd0e2e52c4869756"
|
|
5966
5966
|
},
|
|
5967
5967
|
{
|
|
5968
5968
|
"path": "modules/hall-ui/public/goals.js",
|
|
@@ -5972,7 +5972,7 @@
|
|
|
5972
5972
|
{
|
|
5973
5973
|
"path": "modules/hall-ui/public/goals.states.json",
|
|
5974
5974
|
"mode": "0000644",
|
|
5975
|
-
"sha256": "
|
|
5975
|
+
"sha256": "8b458aa1afaaf9e122217d912bcf15390550cf75953414a94c6bd912c98574e5"
|
|
5976
5976
|
},
|
|
5977
5977
|
{
|
|
5978
5978
|
"path": "modules/hall-ui/public/gov-feeds.js",
|
|
@@ -6757,7 +6757,7 @@
|
|
|
6757
6757
|
{
|
|
6758
6758
|
"path": "modules/hall-ui/records/goal-dependency-forest.md",
|
|
6759
6759
|
"mode": "0000644",
|
|
6760
|
-
"sha256": "
|
|
6760
|
+
"sha256": "32d57c27724e1c6e263762a7b150a1db4fbe849f7e3ac3e05ee3af4edb0493d5"
|
|
6761
6761
|
},
|
|
6762
6762
|
{
|
|
6763
6763
|
"path": "modules/hall-ui/records/governor-street.md",
|
|
@@ -8137,7 +8137,7 @@
|
|
|
8137
8137
|
{
|
|
8138
8138
|
"path": "modules/platform-identity/invite-authz.js",
|
|
8139
8139
|
"mode": "0000644",
|
|
8140
|
-
"sha256": "
|
|
8140
|
+
"sha256": "dd54f1456e383de90c7440dbddeb3919718588bd4fb43621f1d192ae16061db5"
|
|
8141
8141
|
},
|
|
8142
8142
|
{
|
|
8143
8143
|
"path": "modules/platform-identity/invite-notices.js",
|
|
@@ -8487,7 +8487,7 @@
|
|
|
8487
8487
|
{
|
|
8488
8488
|
"path": "modules/provisioning/catalog-bridge.js",
|
|
8489
8489
|
"mode": "0000644",
|
|
8490
|
-
"sha256": "
|
|
8490
|
+
"sha256": "ddc1228706e8f8342bbbd7705acae6a99f1e65e700e72c701c8afe62cd67d732"
|
|
8491
8491
|
},
|
|
8492
8492
|
{
|
|
8493
8493
|
"path": "modules/provisioning/control-plane-guard.js",
|
|
@@ -8792,7 +8792,7 @@
|
|
|
8792
8792
|
{
|
|
8793
8793
|
"path": "modules/provisioning/provisioning.js",
|
|
8794
8794
|
"mode": "0000644",
|
|
8795
|
-
"sha256": "
|
|
8795
|
+
"sha256": "29ce4dc7dacfa6b9bdddf35ab80fd4b226c96ebcf9a4235297619defe0174119"
|
|
8796
8796
|
},
|
|
8797
8797
|
{
|
|
8798
8798
|
"path": "modules/provisioning/public-refusal.js",
|
|
@@ -8824,6 +8824,11 @@
|
|
|
8824
8824
|
"mode": "0000644",
|
|
8825
8825
|
"sha256": "aa3e794ed904157f8549d6ab8ce28ae4a9fa3c2235758b59fc4bd3a66a3b7049"
|
|
8826
8826
|
},
|
|
8827
|
+
{
|
|
8828
|
+
"path": "modules/provisioning/route-helpers.js",
|
|
8829
|
+
"mode": "0000644",
|
|
8830
|
+
"sha256": "8a4b7f5d8696a1f3e8c80f01e51663a98f14c6115fb76610b66d65e98e68545d"
|
|
8831
|
+
},
|
|
8827
8832
|
{
|
|
8828
8833
|
"path": "modules/provisioning/routes/body-validators.js",
|
|
8829
8834
|
"mode": "0000644",
|
|
@@ -8847,12 +8852,12 @@
|
|
|
8847
8852
|
{
|
|
8848
8853
|
"path": "modules/provisioning/routes/disconnect.js",
|
|
8849
8854
|
"mode": "0000644",
|
|
8850
|
-
"sha256": "
|
|
8855
|
+
"sha256": "eae0b840da488f3a9a9a1c0a4eb1de5a0f4fb72ec7120041af9101957e5661c0"
|
|
8851
8856
|
},
|
|
8852
8857
|
{
|
|
8853
8858
|
"path": "modules/provisioning/routes/env-manifest.js",
|
|
8854
8859
|
"mode": "0000644",
|
|
8855
|
-
"sha256": "
|
|
8860
|
+
"sha256": "53778501a1265d9e43d49281052e6dbc52730a8fb06fb644ff7c20745d086a6e"
|
|
8856
8861
|
},
|
|
8857
8862
|
{
|
|
8858
8863
|
"path": "modules/provisioning/routes/github-setup.js",
|
|
@@ -8867,7 +8872,7 @@
|
|
|
8867
8872
|
{
|
|
8868
8873
|
"path": "modules/provisioning/routes/provisioning.js",
|
|
8869
8874
|
"mode": "0000644",
|
|
8870
|
-
"sha256": "
|
|
8875
|
+
"sha256": "55e3e478e7a1978e1e12c5d5fc551fa9b58d51e6d0e920a4d71ef02618e7b78f"
|
|
8871
8876
|
},
|
|
8872
8877
|
{
|
|
8873
8878
|
"path": "modules/provisioning/routes/render-standup.js",
|
|
@@ -10477,12 +10482,12 @@
|
|
|
10477
10482
|
{
|
|
10478
10483
|
"path": "package-lock.json",
|
|
10479
10484
|
"mode": "0000644",
|
|
10480
|
-
"sha256": "
|
|
10485
|
+
"sha256": "efe64aff087c9fac228bb0502df35fdb706ea66215ba9a7b20a16575b4568a6d"
|
|
10481
10486
|
},
|
|
10482
10487
|
{
|
|
10483
10488
|
"path": "package.json",
|
|
10484
10489
|
"mode": "0000644",
|
|
10485
|
-
"sha256": "
|
|
10490
|
+
"sha256": "65dbc0fd1642caa7dd0907f8ca5f8d6e3808087637f31aaff0b5b3b2e22da1da"
|
|
10486
10491
|
},
|
|
10487
10492
|
{
|
|
10488
10493
|
"path": "public-docs/index.html",
|
|
@@ -10502,7 +10507,7 @@
|
|
|
10502
10507
|
{
|
|
10503
10508
|
"path": "release-notes.json",
|
|
10504
10509
|
"mode": "0000644",
|
|
10505
|
-
"sha256": "
|
|
10510
|
+
"sha256": "b3c808cc70f6d027e4dc58fad374f2dff423b73416eee5c5a96e8779ddd2d04f"
|
|
10506
10511
|
},
|
|
10507
10512
|
{
|
|
10508
10513
|
"path": "scripts/cron/style_guide_audit.sh",
|
|
@@ -11017,7 +11022,7 @@
|
|
|
11017
11022
|
{
|
|
11018
11023
|
"path": "scripts/gds/exec-path-guard.js",
|
|
11019
11024
|
"mode": "0000644",
|
|
11020
|
-
"sha256": "
|
|
11025
|
+
"sha256": "5b5f2b8b40d62dab10a0ea9b43768944dcbe60a8af550b35229ce278deaceffc"
|
|
11021
11026
|
},
|
|
11022
11027
|
{
|
|
11023
11028
|
"path": "scripts/gds/feedback-send.js",
|
|
@@ -11092,7 +11097,7 @@
|
|
|
11092
11097
|
{
|
|
11093
11098
|
"path": "scripts/gds/fitness.js",
|
|
11094
11099
|
"mode": "0000644",
|
|
11095
|
-
"sha256": "
|
|
11100
|
+
"sha256": "e2f483de1afd806d77fc5b62d6f1b08d762ea4fec9eaddb91d2ef1f25f00112e"
|
|
11096
11101
|
},
|
|
11097
11102
|
{
|
|
11098
11103
|
"path": "scripts/gds/gate-review.js",
|
|
@@ -11392,17 +11397,37 @@
|
|
|
11392
11397
|
{
|
|
11393
11398
|
"path": "scripts/gds/module-assess-tests.js",
|
|
11394
11399
|
"mode": "0000644",
|
|
11395
|
-
"sha256": "
|
|
11400
|
+
"sha256": "802ee523248df153dace07e364b29516f6c6dcfcf8eaa301aa97bb723c135983"
|
|
11396
11401
|
},
|
|
11397
11402
|
{
|
|
11398
11403
|
"path": "scripts/gds/module-assess-version.js",
|
|
11399
11404
|
"mode": "0000644",
|
|
11400
|
-
"sha256": "
|
|
11405
|
+
"sha256": "b21c85714a8b93e43857c26237eec9dca9830abb53f44146957525f262fb8e7b"
|
|
11406
|
+
},
|
|
11407
|
+
{
|
|
11408
|
+
"path": "scripts/gds/module-error-report.js",
|
|
11409
|
+
"mode": "0000644",
|
|
11410
|
+
"sha256": "dc8e6794d0c09479891136c8b0ab4da7ce73c1797522e03b9457db113b2534e2"
|
|
11411
|
+
},
|
|
11412
|
+
{
|
|
11413
|
+
"path": "scripts/gds/module-test-runner.js",
|
|
11414
|
+
"mode": "0000644",
|
|
11415
|
+
"sha256": "00c844922f5b465485847e45782c71c3103fe9d6aa0e09d4908121769aecbe78"
|
|
11416
|
+
},
|
|
11417
|
+
{
|
|
11418
|
+
"path": "scripts/gds/module-test-runner/README.md",
|
|
11419
|
+
"mode": "0000644",
|
|
11420
|
+
"sha256": "e6253ef4056f35355d5c19af247de840b0f925f7a2b8ead8f2598227be9e6d38"
|
|
11421
|
+
},
|
|
11422
|
+
{
|
|
11423
|
+
"path": "scripts/gds/module-test-runner/module-tests.yml",
|
|
11424
|
+
"mode": "0000644",
|
|
11425
|
+
"sha256": "d721ad7959afb899877aafd31c6a22287d6e479e0fb4fb4f600d12ce5e12a2fd"
|
|
11401
11426
|
},
|
|
11402
11427
|
{
|
|
11403
11428
|
"path": "scripts/gds/module.js",
|
|
11404
11429
|
"mode": "0000644",
|
|
11405
|
-
"sha256": "
|
|
11430
|
+
"sha256": "9391cc7d6881150cd5d196aa5e63245db032093063ce90e1e1ae5c26dafcb49c"
|
|
11406
11431
|
},
|
|
11407
11432
|
{
|
|
11408
11433
|
"path": "scripts/gds/move-escalation.js",
|
|
@@ -11529,6 +11554,11 @@
|
|
|
11529
11554
|
"mode": "0000644",
|
|
11530
11555
|
"sha256": "2102af404ac985f0d7b037da973600234b2ef8f90b6c689ca164b9ac1f46262f"
|
|
11531
11556
|
},
|
|
11557
|
+
{
|
|
11558
|
+
"path": "scripts/gds/provision-caps.js",
|
|
11559
|
+
"mode": "0000644",
|
|
11560
|
+
"sha256": "0dee61336a309cf3eda2cb715bb53680773c17d65186864384e3cb0bc9dadaba"
|
|
11561
|
+
},
|
|
11532
11562
|
{
|
|
11533
11563
|
"path": "scripts/gds/provision-config.js",
|
|
11534
11564
|
"mode": "0000644",
|
|
@@ -11567,7 +11597,7 @@
|
|
|
11567
11597
|
{
|
|
11568
11598
|
"path": "scripts/gds/provision-process.js",
|
|
11569
11599
|
"mode": "0000644",
|
|
11570
|
-
"sha256": "
|
|
11600
|
+
"sha256": "4689867d4925672e3e12c56620ef2e4e6ad2474dfaaa309571da9533af49b997"
|
|
11571
11601
|
},
|
|
11572
11602
|
{
|
|
11573
11603
|
"path": "scripts/gds/provision-render.js",
|
|
@@ -11597,12 +11627,12 @@
|
|
|
11597
11627
|
{
|
|
11598
11628
|
"path": "scripts/gds/provision-units.js",
|
|
11599
11629
|
"mode": "0000644",
|
|
11600
|
-
"sha256": "
|
|
11630
|
+
"sha256": "02173656cffc347b23b68fa5036826d16bfedbb0e490161b8e5853b5cbb9b8a9"
|
|
11601
11631
|
},
|
|
11602
11632
|
{
|
|
11603
11633
|
"path": "scripts/gds/provision.js",
|
|
11604
11634
|
"mode": "0000644",
|
|
11605
|
-
"sha256": "
|
|
11635
|
+
"sha256": "bf16a2ef196d64088c7755e3d6ccbdd8f7917eb907efdbb8ec132e7df9694a52"
|
|
11606
11636
|
},
|
|
11607
11637
|
{
|
|
11608
11638
|
"path": "scripts/gds/publish-credential-check.js",
|
|
@@ -12827,17 +12857,22 @@
|
|
|
12827
12857
|
{
|
|
12828
12858
|
"path": "src/module-api.js",
|
|
12829
12859
|
"mode": "0000644",
|
|
12830
|
-
"sha256": "
|
|
12860
|
+
"sha256": "8ff71d0200dd2b11afa13be91155669caee7ba000a537df94e37426a6485e7f1"
|
|
12831
12861
|
},
|
|
12832
12862
|
{
|
|
12833
12863
|
"path": "src/module-loader/catalog.js",
|
|
12834
12864
|
"mode": "0000644",
|
|
12835
12865
|
"sha256": "633042ab3228780fd18f96ce6a2dd0d84452a124948720678d4484c29df0acd8"
|
|
12836
12866
|
},
|
|
12867
|
+
{
|
|
12868
|
+
"path": "src/module-loader/error-tally.js",
|
|
12869
|
+
"mode": "0000644",
|
|
12870
|
+
"sha256": "00f37bb206c47a75c5ee1420831781a38eb88b9446a9ce1cc3e8ee5a47e09334"
|
|
12871
|
+
},
|
|
12837
12872
|
{
|
|
12838
12873
|
"path": "src/module-loader/loader.js",
|
|
12839
12874
|
"mode": "0000644",
|
|
12840
|
-
"sha256": "
|
|
12875
|
+
"sha256": "4520d7cb0a91dd3f6cb52c52ced8caf2039126fa7c942e3f0714e91600cebb80"
|
|
12841
12876
|
},
|
|
12842
12877
|
{
|
|
12843
12878
|
"path": "src/module-loader/manifest-schema.js",
|
|
@@ -12872,7 +12907,7 @@
|
|
|
12872
12907
|
{
|
|
12873
12908
|
"path": "src/platform-server.js",
|
|
12874
12909
|
"mode": "0000644",
|
|
12875
|
-
"sha256": "
|
|
12910
|
+
"sha256": "435a89e5f5becab510ee5ad3f4246f34ee6a6abac859d49823edc74fd1bcdf4f"
|
|
12876
12911
|
},
|
|
12877
12912
|
{
|
|
12878
12913
|
"path": "src/role-responsibilities.js",
|
|
@@ -14667,12 +14702,12 @@
|
|
|
14667
14702
|
{
|
|
14668
14703
|
"path": "tests/goal_forest_lib.mjs",
|
|
14669
14704
|
"mode": "0000644",
|
|
14670
|
-
"sha256": "
|
|
14705
|
+
"sha256": "a647398539783aed52b9cf7e5026ae6ab1e9f7337c5e7920d57c9cc106fd9581"
|
|
14671
14706
|
},
|
|
14672
14707
|
{
|
|
14673
14708
|
"path": "tests/goal_forest_page.mjs",
|
|
14674
14709
|
"mode": "0000644",
|
|
14675
|
-
"sha256": "
|
|
14710
|
+
"sha256": "143033e1a1d6178a6d7da40be7b649f61c48997327a34d53d0f32d5e0df08e3a"
|
|
14676
14711
|
},
|
|
14677
14712
|
{
|
|
14678
14713
|
"path": "tests/goal_graph.mjs",
|
|
@@ -16342,12 +16377,12 @@
|
|
|
16342
16377
|
{
|
|
16343
16378
|
"path": "tests/module_assess_price_parity.mjs",
|
|
16344
16379
|
"mode": "0000644",
|
|
16345
|
-
"sha256": "
|
|
16380
|
+
"sha256": "b0cbedfe78c04c5e7ec55d1d50e607c8730784d1e820a2ec64ace05689968c2a"
|
|
16346
16381
|
},
|
|
16347
16382
|
{
|
|
16348
16383
|
"path": "tests/module_assess_score.mjs",
|
|
16349
16384
|
"mode": "0000644",
|
|
16350
|
-
"sha256": "
|
|
16385
|
+
"sha256": "5e80628e696af499d95e7d59cc8c655902b9d3bdbe63473f68e573c0acaa2dd3"
|
|
16351
16386
|
},
|
|
16352
16387
|
{
|
|
16353
16388
|
"path": "tests/module_assess_security.mjs",
|
|
@@ -16389,6 +16424,11 @@
|
|
|
16389
16424
|
"mode": "0000644",
|
|
16390
16425
|
"sha256": "50e4d45bf544efe755dda538a93eafc40dcd9caa071e987d8833d97ecf1b7e0f"
|
|
16391
16426
|
},
|
|
16427
|
+
{
|
|
16428
|
+
"path": "tests/module_error_counts.mjs",
|
|
16429
|
+
"mode": "0000644",
|
|
16430
|
+
"sha256": "7c5e8009a416c72d5659677c0a23d90408001f33ff6b56b121ed06a2beceb739"
|
|
16431
|
+
},
|
|
16392
16432
|
{
|
|
16393
16433
|
"path": "tests/module_exports_unique_keys.mjs",
|
|
16394
16434
|
"mode": "0000644",
|
|
@@ -16474,6 +16514,11 @@
|
|
|
16474
16514
|
"mode": "0000644",
|
|
16475
16515
|
"sha256": "0db12d802203780f489e9a6d7abf970dfcde9099ac7011fcaaa6c575336804cd"
|
|
16476
16516
|
},
|
|
16517
|
+
{
|
|
16518
|
+
"path": "tests/module_test_runner.mjs",
|
|
16519
|
+
"mode": "0000644",
|
|
16520
|
+
"sha256": "e6fbb32fd8f43c748d89aca5a9025872582d1628e47de12c4ce4bca834c8be88"
|
|
16521
|
+
},
|
|
16477
16522
|
{
|
|
16478
16523
|
"path": "tests/module_toggle_restart.mjs",
|
|
16479
16524
|
"mode": "0000644",
|
|
@@ -16957,7 +17002,7 @@
|
|
|
16957
17002
|
{
|
|
16958
17003
|
"path": "tests/project_catalog_routes.mjs",
|
|
16959
17004
|
"mode": "0000644",
|
|
16960
|
-
"sha256": "
|
|
17005
|
+
"sha256": "52bb32c6e47676407b96e447969cd09cecf12d040d5aa0aef71d5f017b4b0a12"
|
|
16961
17006
|
},
|
|
16962
17007
|
{
|
|
16963
17008
|
"path": "tests/project_door_ui.mjs",
|
|
@@ -17107,7 +17152,7 @@
|
|
|
17107
17152
|
{
|
|
17108
17153
|
"path": "tests/provision.mjs",
|
|
17109
17154
|
"mode": "0000644",
|
|
17110
|
-
"sha256": "
|
|
17155
|
+
"sha256": "dc30483813143d76ed6597f4b68d61db3dd2ae9bf34d15b9ce8ddd57caf0f79f"
|
|
17111
17156
|
},
|
|
17112
17157
|
{
|
|
17113
17158
|
"path": "tests/provision_account_identity.mjs",
|
|
@@ -17144,6 +17189,11 @@
|
|
|
17144
17189
|
"mode": "0000644",
|
|
17145
17190
|
"sha256": "f99d0a4a54fa9d846efc772148156e06023d3ad4e2afbddce8dd1d9a62821b96"
|
|
17146
17191
|
},
|
|
17192
|
+
{
|
|
17193
|
+
"path": "tests/provision_resource_caps.mjs",
|
|
17194
|
+
"mode": "0000644",
|
|
17195
|
+
"sha256": "491c29cbeee40a677a01ee71f1f54a787017456b4baa8416219480f337e3c3e3"
|
|
17196
|
+
},
|
|
17147
17197
|
{
|
|
17148
17198
|
"path": "tests/provision_restart.mjs",
|
|
17149
17199
|
"mode": "0000644",
|
|
@@ -17237,7 +17287,7 @@
|
|
|
17237
17287
|
{
|
|
17238
17288
|
"path": "tests/provisioning_module_selection.mjs",
|
|
17239
17289
|
"mode": "0000644",
|
|
17240
|
-
"sha256": "
|
|
17290
|
+
"sha256": "6aa80d1dd73c9437429b37d8b8af375383a992d4fc8e68909c8346987f2ebc06"
|
|
17241
17291
|
},
|
|
17242
17292
|
{
|
|
17243
17293
|
"path": "tests/provisioning_onboard_mode.mjs",
|
|
@@ -17254,6 +17304,11 @@
|
|
|
17254
17304
|
"mode": "0000644",
|
|
17255
17305
|
"sha256": "2a7769c430da7f81509659eb592c16abe7f95b2b3a3a447dac85fd10f0c780ee"
|
|
17256
17306
|
},
|
|
17307
|
+
{
|
|
17308
|
+
"path": "tests/provisioning_project_owner_gate.mjs",
|
|
17309
|
+
"mode": "0000644",
|
|
17310
|
+
"sha256": "c632c7fd2b797f40cfda0e62be35f10769c836bc13164ecbc10cb28ab63f8320"
|
|
17311
|
+
},
|
|
17257
17312
|
{
|
|
17258
17313
|
"path": "tests/provisioning_public_refusal.mjs",
|
|
17259
17314
|
"mode": "0000644",
|
package/docs/adr/0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md
CHANGED
|
@@ -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.
|
package/docs/adr/0354-a-builder-hosts-one-project-free-and-more-takes-the-fleet-permission.md
CHANGED
|
@@ -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
|
package/docs/api/openapi.json
CHANGED
|
@@ -17838,7 +17838,7 @@
|
|
|
17838
17838
|
"provisioning"
|
|
17839
17839
|
],
|
|
17840
17840
|
"summary": "POST /provisioning/instances/:id/domain",
|
|
17841
|
-
"description": "POST /provisioning/instances/:id/domain — give the caller's OWN instance its address (task 1002692, gap 5: no path existed to add a domain after creation). Validates + records the domain; for an already-ACTIVE instance it also enqueues a 'domain-attach' intent the control-plane runner drains (web tier holds no cloud tokens — ADR 0111 §2). A requested/error instance only records it: the (re)provision run wires the domain itself. A bring-your-own address may be RE-POINTED (task 1003237, ADR 0200): the same guards the first attach applies decide it, and the address it moved off is queued for release. Body: { domain (required) }.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
17841
|
+
"description": "POST /provisioning/instances/:id/domain — give the caller's OWN instance its address (task 1002692, gap 5: no path existed to add a domain after creation). Validates + records the domain; for an already-ACTIVE instance it also enqueues a 'domain-attach' intent the control-plane runner drains (web tier holds no cloud tokens — ADR 0111 §2). A requested/error instance only records it: the (re)provision run wires the domain itself. A bring-your-own address may be RE-POINTED (task 1003237, ADR 0200): the same guards the first attach applies decide it, and the address it moved off is queued for release. Body: { domain (required) }. An archon may set any project's address; the override is audited via the actor.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
17842
17842
|
"x-rank": "any-builder",
|
|
17843
17843
|
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
17844
17844
|
"parameters": [
|
|
@@ -18193,7 +18193,7 @@
|
|
|
18193
18193
|
"provisioning"
|
|
18194
18194
|
],
|
|
18195
18195
|
"summary": "POST /provisioning/instances/:id/github-app",
|
|
18196
|
-
"description": "POST /provisioning/instances/:id/github-app — mint a GitHub-App-Manifest onboarding link for the caller's OWN instance (task 2080, ADR 0133). rank: any authenticated builder (own resource). Returns the pre-filled manifest + the GitHub form-POST target (personal + org variants) + a one-time `state`; the browser POSTs the manifest to GitHub, the owner approves, and GitHub redirects back to the public callback below. The web tier only RECORDS the attempt (state token) — the control-plane runner does the token exchange + cred placement (trust boundary intact, ADR 0111 §2). Body: { account? ('personal'|'org'), org? (a GitHub organisation login) }. A personal or an organisation account (task 1004651): account 'org' makes the app on the organisation the founder chose on the page (`org`), else on the repo's owner. The org name is checked against GitHub's login rules here, never trusted from the page; whether the founder may make an app there is GitHub's to enforce on its own page (this module holds no GitHub token to ask with, ADR 0111 §2). Anything other than account 'org' is the founder's personal account, exactly as before.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
18196
|
+
"description": "POST /provisioning/instances/:id/github-app — mint a GitHub-App-Manifest onboarding link for the caller's OWN instance (task 2080, ADR 0133). rank: any authenticated builder (own resource; archon may mint for any — audited via the actor). Returns the pre-filled manifest + the GitHub form-POST target (personal + org variants) + a one-time `state`; the browser POSTs the manifest to GitHub, the owner approves, and GitHub redirects back to the public callback below. The web tier only RECORDS the attempt (state token) — the control-plane runner does the token exchange + cred placement (trust boundary intact, ADR 0111 §2). Body: { account? ('personal'|'org'), org? (a GitHub organisation login) }. A personal or an organisation account (task 1004651): account 'org' makes the app on the organisation the founder chose on the page (`org`), else on the repo's owner. The org name is checked against GitHub's login rules here, never trusted from the page; whether the founder may make an app there is GitHub's to enforce on its own page (this module holds no GitHub token to ask with, ADR 0111 §2). Anything other than account 'org' is the founder's personal account, exactly as before.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
18197
18197
|
"x-rank": "any-builder",
|
|
18198
18198
|
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
18199
18199
|
"parameters": [
|
|
@@ -18301,7 +18301,7 @@
|
|
|
18301
18301
|
"provisioning"
|
|
18302
18302
|
],
|
|
18303
18303
|
"summary": "GET /provisioning/instances/:id/invite-suggestions",
|
|
18304
|
-
"description": "── Who is worth inviting (BV1.R28, task 1002347, goal 1000046 C6) ──────── GET /provisioning/instances/:id/invite-suggestions — turn the engine's `invites.seeking` into NAMES. ADR 0239 §6 left `invites.suggested` empty on purpose: ranking builders is a directory read the pure engine may not run. This is the resolution, and ADR 0251 is why it looks like this. rank: any authenticated builder, own resource — `
|
|
18304
|
+
"description": "── Who is worth inviting (BV1.R28, task 1002347, goal 1000046 C6) ──────── GET /provisioning/instances/:id/invite-suggestions — turn the engine's `invites.seeking` into NAMES. ADR 0239 §6 left `invites.suggested` empty on purpose: ranking builders is a directory read the pure engine may not run. This is the resolution, and ADR 0251 is why it looks like this. rank: any authenticated builder, own resource — `requireProjectOwner`, the same gate and the same 404 as the manage read above. That is deliberate and not a new authorization idea: REACHING this route IS the ownership answer (ADR 0249 §4), so the surface never re-derives \"is this theirs\" and can never become a weaker second copy of a server rule (ADR 0016). It also 404s rather than 403s, so it leaks no more instance existence than the read beside it. `seeking: null` COSTS NOTHING AND ASKS NOBODY. A solo owner is suggested nobody on purpose (ADR 0239 §6), which is a different statement from an empty list nobody filled — so that answer returns its own reason and never touches the directory at all.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
18305
18305
|
"x-rank": "any-builder",
|
|
18306
18306
|
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
18307
18307
|
"parameters": [
|
|
@@ -18913,7 +18913,7 @@
|
|
|
18913
18913
|
"provisioning"
|
|
18914
18914
|
],
|
|
18915
18915
|
"summary": "POST /provisioning/instances/:id/teardown",
|
|
18916
|
-
"description": "POST /provisioning/instances/:id/teardown — request teardown of the caller's OWN instance. rank: any authenticated builder (own resource). Enqueues a 'teardown' intent; the runner executes it (web tier holds no tokens). 404 when the id isn't the caller's; 409 when the instance isn't in a teardownable state.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
18916
|
+
"description": "POST /provisioning/instances/:id/teardown — request teardown of the caller's OWN instance. rank: any authenticated builder (own resource; archon may tear down any — the override is audited via the actor). Enqueues a 'teardown' intent; the runner executes it (web tier holds no tokens). 404 when the id isn't the caller's; 409 when the instance isn't in a teardownable state.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
18917
18917
|
"x-rank": "any-builder",
|
|
18918
18918
|
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
18919
18919
|
"parameters": [
|