@bongos/core 1.19.645 → 1.19.647
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 +36 -31
- package/.claude/skills/grade-recover/SKILL.md +4 -2
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -0
- package/clients/bongos-client/index.cjs +4 -0
- package/clients/bongos-client/index.d.ts +7 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/api/openapi.json +137 -3
- package/docs/api-reference.md +4 -2
- package/docs/module-api-changelog.md +4 -0
- package/migrations/core_237_box_widen_paths.sql +40 -0
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +4 -0
- package/modules/dev-box/box-access.js +128 -4
- package/modules/dev-box/boxes.js +21 -0
- package/modules/dev-box/routes/box.js +108 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/box-sync.js +84 -1
- package/scripts/gds/claude-materialize.js +14 -1
- package/scripts/gds/ship-flow.js +27 -1
- package/scripts/gds/ship-honesty.js +53 -0
- package/src/module-api.js +1 -1
- package/tests/box_access.mjs +155 -0
- package/tests/box_sync_scope_report.mjs +45 -0
- package/tests/claude_materialize.mjs +30 -0
- package/tests/ship_cannot_lie.mjs +103 -1
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.647",
|
|
6
|
+
"core_contract": "1.19.647",
|
|
7
|
+
"source_commit": "8fa0f8d28d7d61f52297185e5c669d70a60480de",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-10T18:
|
|
9
|
+
"built_at": "2026-09-10T18:40:35.458Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 470,
|
|
13
13
|
"agent_docs_stubbed": 24,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2107,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2601,
|
|
20
|
+
"tree_sha256": "7cebbe4108e45c224a38f2068e1e7a1d00552500b0b6f6d7f5c111d45f63a037",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/backlog-review/SKILL.md",
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
{
|
|
173
173
|
"path": ".claude/skills/grade-recover/SKILL.md",
|
|
174
174
|
"mode": "0000644",
|
|
175
|
-
"sha256": "
|
|
175
|
+
"sha256": "4dbbf04c19558b33332d9ba1bb8747198ded19e1a3af06ef72ede58ee4eb95ad"
|
|
176
176
|
},
|
|
177
177
|
{
|
|
178
178
|
"path": ".claude/skills/grader-health/SKILL.md",
|
|
@@ -362,12 +362,12 @@
|
|
|
362
362
|
{
|
|
363
363
|
"path": "clients/bongos-client/README.md",
|
|
364
364
|
"mode": "0000644",
|
|
365
|
-
"sha256": "
|
|
365
|
+
"sha256": "03379a98721207feab9a9b4c03862051ee6d52a29a0bc467ed73ae1d36bf49cd"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "ec75333abb0ee49b89320a86e73b56f2f3872c13c596b1e67f36e705b8ba1210"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -377,17 +377,17 @@
|
|
|
377
377
|
{
|
|
378
378
|
"path": "clients/bongos-client/index.cjs",
|
|
379
379
|
"mode": "0000644",
|
|
380
|
-
"sha256": "
|
|
380
|
+
"sha256": "bce3dcdbe37505e0fa526e02b7b379ca9ab378f6c34b41345621d55170d9f19d"
|
|
381
381
|
},
|
|
382
382
|
{
|
|
383
383
|
"path": "clients/bongos-client/index.d.ts",
|
|
384
384
|
"mode": "0000644",
|
|
385
|
-
"sha256": "
|
|
385
|
+
"sha256": "a6b15120b937f2a73d47ef180956068560eb3ac3efe5cf58f3a021b544ff9bc0"
|
|
386
386
|
},
|
|
387
387
|
{
|
|
388
388
|
"path": "clients/bongos-client/index.mjs",
|
|
389
389
|
"mode": "0000644",
|
|
390
|
-
"sha256": "
|
|
390
|
+
"sha256": "3fbcb50de89350e95b86180e828a16b897be32a1f8b4cdf78cc060e1c5afff86"
|
|
391
391
|
},
|
|
392
392
|
{
|
|
393
393
|
"path": "clients/bongos-client/package.json",
|
|
@@ -1892,12 +1892,12 @@
|
|
|
1892
1892
|
{
|
|
1893
1893
|
"path": "docs/api-reference.md",
|
|
1894
1894
|
"mode": "0000644",
|
|
1895
|
-
"sha256": "
|
|
1895
|
+
"sha256": "0fa07d5f61ab66a43e0c51e51cfac8223afcb1aa12ea7342a226cb1832c0be62"
|
|
1896
1896
|
},
|
|
1897
1897
|
{
|
|
1898
1898
|
"path": "docs/api/openapi.json",
|
|
1899
1899
|
"mode": "0000644",
|
|
1900
|
-
"sha256": "
|
|
1900
|
+
"sha256": "02c082bff4c5bebbf13cefeeb46a6b9cdff430cc32b65dd4e78a72248c6fd74f"
|
|
1901
1901
|
},
|
|
1902
1902
|
{
|
|
1903
1903
|
"path": "docs/architecture.md",
|
|
@@ -2772,7 +2772,7 @@
|
|
|
2772
2772
|
{
|
|
2773
2773
|
"path": "docs/module-api-changelog.md",
|
|
2774
2774
|
"mode": "0000644",
|
|
2775
|
-
"sha256": "
|
|
2775
|
+
"sha256": "0f1d4f5ea01f97e24ee83708c35267828f6d7fb2c64a47db9b7b94c43205951a"
|
|
2776
2776
|
},
|
|
2777
2777
|
{
|
|
2778
2778
|
"path": "docs/modules-contract.md",
|
|
@@ -3814,6 +3814,11 @@
|
|
|
3814
3814
|
"mode": "0000644",
|
|
3815
3815
|
"sha256": "06b53d66e710dfbf602011459ec8d69adce8e281632927daea0735f8078b2f86"
|
|
3816
3816
|
},
|
|
3817
|
+
{
|
|
3818
|
+
"path": "migrations/core_237_box_widen_paths.sql",
|
|
3819
|
+
"mode": "0000644",
|
|
3820
|
+
"sha256": "2cda282b43ea71dd82ddf4e5ece90f11ad4013cbee0820f0a33391f202feff9c"
|
|
3821
|
+
},
|
|
3817
3822
|
{
|
|
3818
3823
|
"path": "modules/agents/lib/validate.js",
|
|
3819
3824
|
"mode": "0000644",
|
|
@@ -4212,7 +4217,7 @@
|
|
|
4212
4217
|
{
|
|
4213
4218
|
"path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
|
|
4214
4219
|
"mode": "0000644",
|
|
4215
|
-
"sha256": "
|
|
4220
|
+
"sha256": "bce3dcdbe37505e0fa526e02b7b379ca9ab378f6c34b41345621d55170d9f19d"
|
|
4216
4221
|
},
|
|
4217
4222
|
{
|
|
4218
4223
|
"path": "modules/dev-box/app/test/unit.mjs",
|
|
@@ -4222,7 +4227,7 @@
|
|
|
4222
4227
|
{
|
|
4223
4228
|
"path": "modules/dev-box/box-access.js",
|
|
4224
4229
|
"mode": "0000644",
|
|
4225
|
-
"sha256": "
|
|
4230
|
+
"sha256": "7bc7c746f2518cb465773a205c8e9fe7efc30852c857001255be92ad8e340bca"
|
|
4226
4231
|
},
|
|
4227
4232
|
{
|
|
4228
4233
|
"path": "modules/dev-box/box-credential.js",
|
|
@@ -4237,7 +4242,7 @@
|
|
|
4237
4242
|
{
|
|
4238
4243
|
"path": "modules/dev-box/boxes.js",
|
|
4239
4244
|
"mode": "0000644",
|
|
4240
|
-
"sha256": "
|
|
4245
|
+
"sha256": "667993d81db36e1ddd1307013044f3d40b6baca3c6f5271b77332d10fa290063"
|
|
4241
4246
|
},
|
|
4242
4247
|
{
|
|
4243
4248
|
"path": "modules/dev-box/db.js",
|
|
@@ -4252,7 +4257,7 @@
|
|
|
4252
4257
|
{
|
|
4253
4258
|
"path": "modules/dev-box/routes/box.js",
|
|
4254
4259
|
"mode": "0000644",
|
|
4255
|
-
"sha256": "
|
|
4260
|
+
"sha256": "b61996de3fa3dbdc9b8fb639fd53aba5c1c2567350dc602b39ebbbd3a93164ac"
|
|
4256
4261
|
},
|
|
4257
4262
|
{
|
|
4258
4263
|
"path": "modules/discord/CLAUDE.md",
|
|
@@ -7722,12 +7727,12 @@
|
|
|
7722
7727
|
{
|
|
7723
7728
|
"path": "package-lock.json",
|
|
7724
7729
|
"mode": "0000644",
|
|
7725
|
-
"sha256": "
|
|
7730
|
+
"sha256": "b271a576a07b28caf13c7d64f1ba8407e3a4d5e53d13accf0da4ad461f94382e"
|
|
7726
7731
|
},
|
|
7727
7732
|
{
|
|
7728
7733
|
"path": "package.json",
|
|
7729
7734
|
"mode": "0000644",
|
|
7730
|
-
"sha256": "
|
|
7735
|
+
"sha256": "e6e4d441aab1b961398eb377d6ac1e4cb9f072efcfa26bd5f51b878b116a8a3e"
|
|
7731
7736
|
},
|
|
7732
7737
|
{
|
|
7733
7738
|
"path": "public-docs/index.html",
|
|
@@ -7917,7 +7922,7 @@
|
|
|
7917
7922
|
{
|
|
7918
7923
|
"path": "scripts/gds/box-sync.js",
|
|
7919
7924
|
"mode": "0000644",
|
|
7920
|
-
"sha256": "
|
|
7925
|
+
"sha256": "33a79ddd2049419fe7df09cd7b5fe3da9163728a36bc8fe1351d89dcf2463a11"
|
|
7921
7926
|
},
|
|
7922
7927
|
{
|
|
7923
7928
|
"path": "scripts/gds/box.js",
|
|
@@ -7982,7 +7987,7 @@
|
|
|
7982
7987
|
{
|
|
7983
7988
|
"path": "scripts/gds/claude-materialize.js",
|
|
7984
7989
|
"mode": "0000644",
|
|
7985
|
-
"sha256": "
|
|
7990
|
+
"sha256": "cf333976f3c8fc9cfa1af57a121e5ee1f826d40fe7461bf1e32f939a59523663"
|
|
7986
7991
|
},
|
|
7987
7992
|
{
|
|
7988
7993
|
"path": "scripts/gds/claude-md-template.js",
|
|
@@ -8862,7 +8867,7 @@
|
|
|
8862
8867
|
{
|
|
8863
8868
|
"path": "scripts/gds/ship-flow.js",
|
|
8864
8869
|
"mode": "0000644",
|
|
8865
|
-
"sha256": "
|
|
8870
|
+
"sha256": "9853e719e4a695cc52ec9089298d05163210ed3b51ca9eceb7553bc0ed9c65bd"
|
|
8866
8871
|
},
|
|
8867
8872
|
{
|
|
8868
8873
|
"path": "scripts/gds/ship-git.js",
|
|
@@ -8882,7 +8887,7 @@
|
|
|
8882
8887
|
{
|
|
8883
8888
|
"path": "scripts/gds/ship-honesty.js",
|
|
8884
8889
|
"mode": "0000644",
|
|
8885
|
-
"sha256": "
|
|
8890
|
+
"sha256": "29116265032b48115c31df794aa4689e7ce3f5eaeef152ea1ca2390dc2078c39"
|
|
8886
8891
|
},
|
|
8887
8892
|
{
|
|
8888
8893
|
"path": "scripts/gds/ship-io.js",
|
|
@@ -9482,7 +9487,7 @@
|
|
|
9482
9487
|
{
|
|
9483
9488
|
"path": "src/module-api.js",
|
|
9484
9489
|
"mode": "0000644",
|
|
9485
|
-
"sha256": "
|
|
9490
|
+
"sha256": "5394603956c3ec34e8377f82a7f493d7c029f0db1d99b236a0e024fd619fe869"
|
|
9486
9491
|
},
|
|
9487
9492
|
{
|
|
9488
9493
|
"path": "src/module-loader/catalog.js",
|
|
@@ -9862,7 +9867,7 @@
|
|
|
9862
9867
|
{
|
|
9863
9868
|
"path": "tests/box_access.mjs",
|
|
9864
9869
|
"mode": "0000644",
|
|
9865
|
-
"sha256": "
|
|
9870
|
+
"sha256": "911a764f72976298daa17855acb836d0ada3215b480961ae8607e1fc3634f882"
|
|
9866
9871
|
},
|
|
9867
9872
|
{
|
|
9868
9873
|
"path": "tests/box_auth_check.mjs",
|
|
@@ -9932,7 +9937,7 @@
|
|
|
9932
9937
|
{
|
|
9933
9938
|
"path": "tests/box_sync_scope_report.mjs",
|
|
9934
9939
|
"mode": "0000644",
|
|
9935
|
-
"sha256": "
|
|
9940
|
+
"sha256": "4b1df674e2e53ce9d521bab3c43c2b3959dee7daa51b97dfa9b23c20e2a41f94"
|
|
9936
9941
|
},
|
|
9937
9942
|
{
|
|
9938
9943
|
"path": "tests/box_task_scope.mjs",
|
|
@@ -10067,7 +10072,7 @@
|
|
|
10067
10072
|
{
|
|
10068
10073
|
"path": "tests/claude_materialize.mjs",
|
|
10069
10074
|
"mode": "0000644",
|
|
10070
|
-
"sha256": "
|
|
10075
|
+
"sha256": "b0474476af85716848114d345f4be67beb2e01ad3ceab36a25d474c3e9e536c5"
|
|
10071
10076
|
},
|
|
10072
10077
|
{
|
|
10073
10078
|
"path": "tests/clawback_confirmed_backlog.mjs",
|
|
@@ -12517,7 +12522,7 @@
|
|
|
12517
12522
|
{
|
|
12518
12523
|
"path": "tests/ship_cannot_lie.mjs",
|
|
12519
12524
|
"mode": "0000644",
|
|
12520
|
-
"sha256": "
|
|
12525
|
+
"sha256": "d8d99b6cd465b04eaf13790b0bdfe9a76ce36d77660407d3a2c6a17ac7852e8c"
|
|
12521
12526
|
},
|
|
12522
12527
|
{
|
|
12523
12528
|
"path": "tests/ship_card.mjs",
|
|
@@ -58,12 +58,14 @@ The panel ran and rejected the work. Recover by fixing, not by re-rolling:
|
|
|
58
58
|
1. **Group `issues[]` by severity, then by worker.** Nit/minor findings are advisory by rubric policy — they cannot have caused the fail on their own, so do not start there. The fail came from blocker/major findings (or a gating axis under threshold).
|
|
59
59
|
2. **For each blocker/major finding, add a checked-in `tests/*.mjs` case** that reproduces it, then fix until green. The grader treats throwaway verification as unverified — the committed test is what makes the fix real.
|
|
60
60
|
3. **Fix real findings once; do not chase re-worded restatements** of a point you already answered (answer it in the commit or with a tracked task ref instead).
|
|
61
|
-
4. Commit on the claim branch — the grader reads committed history — then:
|
|
61
|
+
4. Commit on the claim branch — the grader reads committed history — then re-grade, saying how each finding was answered:
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
|
-
node scripts/gds/ship.js <id> --regrade
|
|
64
|
+
node scripts/gds/ship.js <id> --regrade --response-file response.md
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
+
**`--response` is how you answer a finding; `--notes` is not** (task 1003702). The panel is given the task, your value summary, the changed files and the diff — it never reads ship notes, on a re-grade or on the first ship. `--response` rides to the panel fenced as the prior round's answer, so an already-answered finding cannot re-veto on re-wording alone. Passing `--notes` used to be accepted and silently dropped; it is now refused with this same guidance. Evidence itself still belongs in the **diff** — a committed test is what makes a fix real (step 2), and the panel can read every changed file.
|
|
68
|
+
|
|
67
69
|
### Not recoverable here — `REFUSED (authorization)`
|
|
68
70
|
|
|
69
71
|
A grade block naming protected surfaces above your rank is an authorization wall, not a quality verdict: no re-grade at your rank can land that diff as-is. Split the protected files out of the diff and re-ship the rest, or hand the task to a builder at/above the floor the refusal names.
|
|
@@ -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
|
-
-
|
|
8
|
+
- 362 operations across 55 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -205,6 +205,10 @@ function createClient(opts = {}) {
|
|
|
205
205
|
postBoxTerminal: (args) => request("POST", "/box/terminal", { hasBody: true }, args),
|
|
206
206
|
// POST /box/version — rank: any-builder — POST /box/version
|
|
207
207
|
postBoxVersion: (args) => request("POST", "/box/version", { hasBody: true }, args),
|
|
208
|
+
// GET /box/widen — rank: any-builder — GET /box/widen
|
|
209
|
+
getBoxWiden: (args) => request("GET", "/box/widen", { hasBody: false }, args),
|
|
210
|
+
// POST /box/widen — rank: any-builder — POST /box/widen
|
|
211
|
+
postBoxWiden: (args) => request("POST", "/box/widen", { hasBody: true }, args),
|
|
208
212
|
},
|
|
209
213
|
"boxes": {
|
|
210
214
|
// GET /boxes — rank: metic+archon — GET /boxes
|
|
@@ -204,6 +204,10 @@ function createClient(opts = {}) {
|
|
|
204
204
|
postBoxTerminal: (args) => request("POST", "/box/terminal", { hasBody: true }, args),
|
|
205
205
|
// POST /box/version — rank: any-builder — POST /box/version
|
|
206
206
|
postBoxVersion: (args) => request("POST", "/box/version", { hasBody: true }, args),
|
|
207
|
+
// GET /box/widen — rank: any-builder — GET /box/widen
|
|
208
|
+
getBoxWiden: (args) => request("GET", "/box/widen", { hasBody: false }, args),
|
|
209
|
+
// POST /box/widen — rank: any-builder — POST /box/widen
|
|
210
|
+
postBoxWiden: (args) => request("POST", "/box/widen", { hasBody: true }, args),
|
|
207
211
|
},
|
|
208
212
|
"boxes": {
|
|
209
213
|
// GET /boxes — rank: metic+archon — GET /boxes
|
|
@@ -29,6 +29,7 @@ export interface GetBoxMeResponse { box: unknown; open_intent: unknown; cost: un
|
|
|
29
29
|
export interface GetBoxSourceAccessResponse { scope: unknown; mode: unknown; sparse_paths: unknown; repo_url: unknown; credential: unknown; configured: unknown; separate_starter_repo: unknown; expires_at: unknown; ttl_seconds: unknown; guidance: unknown }
|
|
30
30
|
export interface GetBoxSshKeyResponse { keys: unknown }
|
|
31
31
|
export interface GetBoxTerminalResponse { state: unknown; url: unknown; credential: unknown; hint: unknown; warming_up?: boolean; terminal_at?: unknown }
|
|
32
|
+
export interface GetBoxWidenResponse { widen_paths: unknown; admitted: unknown; ignored: unknown; max: unknown }
|
|
32
33
|
export interface GetBoxesResponse { boxes: unknown }
|
|
33
34
|
export interface GetBuildersDirectoryResponse { builders: unknown }
|
|
34
35
|
export interface GetBuildersIdActiveClaimsResponse { builder_id: unknown; claims: unknown; stale_hours: unknown; stale_hours_source: unknown }
|
|
@@ -222,6 +223,8 @@ export interface PostBoxTerminalRequest { url: string; credential?: string }
|
|
|
222
223
|
export interface PostBoxTerminalResponse { ok: boolean; state: unknown }
|
|
223
224
|
export interface PostBoxVersionRequest { sha: string; committed_at?: string }
|
|
224
225
|
export interface PostBoxVersionResponse { ok: boolean; state: unknown }
|
|
226
|
+
export interface PostBoxWidenRequest { add?: unknown[]; remove?: unknown[]; clear?: boolean }
|
|
227
|
+
export interface PostBoxWidenResponse { ok: boolean; widen_paths: unknown; admitted: unknown; ignored: unknown; max: unknown }
|
|
225
228
|
export interface PostBoxesBuilderIdCloseResponse { ok: boolean; queued: unknown; action: unknown; state: unknown; message: unknown }
|
|
226
229
|
export interface PostClaimsBatchReleaseRequest { claim_ids: unknown[]; force?: boolean }
|
|
227
230
|
export interface PostClaimsBatchReleaseResponse { released: unknown; failures: unknown }
|
|
@@ -536,6 +539,10 @@ export interface BongosClient {
|
|
|
536
539
|
postBoxTerminal(args: RequestArgs & { body: PostBoxTerminalRequest }): Promise<PostBoxTerminalResponse>;
|
|
537
540
|
/** POST /box/version — rank: any-builder */
|
|
538
541
|
postBoxVersion(args: RequestArgs & { body: PostBoxVersionRequest }): Promise<PostBoxVersionResponse>;
|
|
542
|
+
/** GET /box/widen — rank: any-builder */
|
|
543
|
+
getBoxWiden(args?: RequestArgs): Promise<GetBoxWidenResponse>;
|
|
544
|
+
/** POST /box/widen — rank: any-builder */
|
|
545
|
+
postBoxWiden(args?: RequestArgs & { body?: PostBoxWidenRequest }): Promise<PostBoxWidenResponse>;
|
|
539
546
|
};
|
|
540
547
|
"boxes": {
|
|
541
548
|
/** GET /boxes — rank: metic+archon */
|
|
@@ -201,6 +201,10 @@ export function createClient(opts = {}) {
|
|
|
201
201
|
postBoxTerminal: (args) => request("POST", "/box/terminal", { hasBody: true }, args),
|
|
202
202
|
// POST /box/version — rank: any-builder — POST /box/version
|
|
203
203
|
postBoxVersion: (args) => request("POST", "/box/version", { hasBody: true }, args),
|
|
204
|
+
// GET /box/widen — rank: any-builder — GET /box/widen
|
|
205
|
+
getBoxWiden: (args) => request("GET", "/box/widen", { hasBody: false }, args),
|
|
206
|
+
// POST /box/widen — rank: any-builder — POST /box/widen
|
|
207
|
+
postBoxWiden: (args) => request("POST", "/box/widen", { hasBody: true }, args),
|
|
204
208
|
},
|
|
205
209
|
"boxes": {
|
|
206
210
|
// GET /boxes — rank: metic+archon — GET /boxes
|
package/docs/api/openapi.json
CHANGED
|
@@ -2275,6 +2275,91 @@
|
|
|
2275
2275
|
]
|
|
2276
2276
|
}
|
|
2277
2277
|
},
|
|
2278
|
+
"/box/widen": {
|
|
2279
|
+
"get": {
|
|
2280
|
+
"operationId": "get_box_widen",
|
|
2281
|
+
"tags": [
|
|
2282
|
+
"box"
|
|
2283
|
+
],
|
|
2284
|
+
"summary": "GET /box/widen",
|
|
2285
|
+
"description": "GET /box/widen — the caller's own recorded widen set (task 1003087). rank: any authenticated builder, own resource. Reports what is STORED plus what is currently ADMITTED, because those differ whenever a request sits outside the builder's rank scope — showing only the stored list would let a Xenos believe a widen took effect that the fetch quietly drops.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
2286
|
+
"x-rank": "any-builder",
|
|
2287
|
+
"x-source": "modules/dev-box/routes/box.js",
|
|
2288
|
+
"responses": {
|
|
2289
|
+
"200": {
|
|
2290
|
+
"description": "Success.",
|
|
2291
|
+
"content": {
|
|
2292
|
+
"application/json": {
|
|
2293
|
+
"schema": {
|
|
2294
|
+
"$ref": "#/components/schemas/GetBoxWidenResponse"
|
|
2295
|
+
}
|
|
2296
|
+
}
|
|
2297
|
+
}
|
|
2298
|
+
},
|
|
2299
|
+
"400": {
|
|
2300
|
+
"$ref": "#/components/responses/BadRequest"
|
|
2301
|
+
},
|
|
2302
|
+
"401": {
|
|
2303
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
2304
|
+
},
|
|
2305
|
+
"403": {
|
|
2306
|
+
"$ref": "#/components/responses/Forbidden"
|
|
2307
|
+
}
|
|
2308
|
+
},
|
|
2309
|
+
"security": [
|
|
2310
|
+
{
|
|
2311
|
+
"builderSession": []
|
|
2312
|
+
}
|
|
2313
|
+
]
|
|
2314
|
+
},
|
|
2315
|
+
"post": {
|
|
2316
|
+
"operationId": "post_box_widen",
|
|
2317
|
+
"tags": [
|
|
2318
|
+
"box"
|
|
2319
|
+
],
|
|
2320
|
+
"summary": "POST /box/widen",
|
|
2321
|
+
"description": "POST /box/widen — record extra sparse-checkout directories that must SURVIVE the */10 source-fetch (task 1003087, idea 1000793). rank: any authenticated builder, OWN box (builder_id-scoped in SQL, so no id from the body can point this at someone else's box). Deliberately NOT allowBoxScope. The on-box crons read source-access with a box-scoped session (ADR 0053); this is a WRITE that changes what the box pulls forever after, so it takes the builder's own session — the same posture that keeps a stolen box token from re-scoping the checkout it was stolen from. add/remove are applied to the stored set and the result is re-normalized, so the endpoint is idempotent: widening twice is not an error, and neither is removing something that was never there. A path outside the caller's rank scope is ACCEPTED into storage but reported in `ignored` rather than refused. That is the honest shape: rank can change, and a builder promoted to Metic should find the widen they asked for as a Xenos simply start working, instead of having been silently discarded months earlier. What it can never do is take effect early — admissibleWidenPaths is re-evaluated against the LIVE rank on every single fetch.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
2322
|
+
"x-rank": "any-builder",
|
|
2323
|
+
"x-source": "modules/dev-box/routes/box.js",
|
|
2324
|
+
"requestBody": {
|
|
2325
|
+
"required": false,
|
|
2326
|
+
"content": {
|
|
2327
|
+
"application/json": {
|
|
2328
|
+
"schema": {
|
|
2329
|
+
"$ref": "#/components/schemas/PostBoxWidenRequest"
|
|
2330
|
+
}
|
|
2331
|
+
}
|
|
2332
|
+
},
|
|
2333
|
+
"x-validated": true
|
|
2334
|
+
},
|
|
2335
|
+
"responses": {
|
|
2336
|
+
"200": {
|
|
2337
|
+
"description": "Success.",
|
|
2338
|
+
"content": {
|
|
2339
|
+
"application/json": {
|
|
2340
|
+
"schema": {
|
|
2341
|
+
"$ref": "#/components/schemas/PostBoxWidenResponse"
|
|
2342
|
+
}
|
|
2343
|
+
}
|
|
2344
|
+
}
|
|
2345
|
+
},
|
|
2346
|
+
"400": {
|
|
2347
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
2348
|
+
},
|
|
2349
|
+
"401": {
|
|
2350
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
2351
|
+
},
|
|
2352
|
+
"403": {
|
|
2353
|
+
"$ref": "#/components/responses/Forbidden"
|
|
2354
|
+
}
|
|
2355
|
+
},
|
|
2356
|
+
"security": [
|
|
2357
|
+
{
|
|
2358
|
+
"builderSession": []
|
|
2359
|
+
}
|
|
2360
|
+
]
|
|
2361
|
+
}
|
|
2362
|
+
},
|
|
2278
2363
|
"/boxes": {
|
|
2279
2364
|
"get": {
|
|
2280
2365
|
"operationId": "get_boxes",
|
|
@@ -16801,6 +16886,21 @@
|
|
|
16801
16886
|
"hint"
|
|
16802
16887
|
]
|
|
16803
16888
|
},
|
|
16889
|
+
"GetBoxWidenResponse": {
|
|
16890
|
+
"type": "object",
|
|
16891
|
+
"properties": {
|
|
16892
|
+
"widen_paths": {},
|
|
16893
|
+
"admitted": {},
|
|
16894
|
+
"ignored": {},
|
|
16895
|
+
"max": {}
|
|
16896
|
+
},
|
|
16897
|
+
"required": [
|
|
16898
|
+
"widen_paths",
|
|
16899
|
+
"admitted",
|
|
16900
|
+
"ignored",
|
|
16901
|
+
"max"
|
|
16902
|
+
]
|
|
16903
|
+
},
|
|
16804
16904
|
"GetBoxesResponse": {
|
|
16805
16905
|
"type": "object",
|
|
16806
16906
|
"properties": {
|
|
@@ -19429,6 +19529,40 @@
|
|
|
19429
19529
|
"state"
|
|
19430
19530
|
]
|
|
19431
19531
|
},
|
|
19532
|
+
"PostBoxWidenRequest": {
|
|
19533
|
+
"type": "object",
|
|
19534
|
+
"properties": {
|
|
19535
|
+
"add": {
|
|
19536
|
+
"type": "array"
|
|
19537
|
+
},
|
|
19538
|
+
"remove": {
|
|
19539
|
+
"type": "array"
|
|
19540
|
+
},
|
|
19541
|
+
"clear": {
|
|
19542
|
+
"type": "boolean"
|
|
19543
|
+
}
|
|
19544
|
+
},
|
|
19545
|
+
"additionalProperties": false
|
|
19546
|
+
},
|
|
19547
|
+
"PostBoxWidenResponse": {
|
|
19548
|
+
"type": "object",
|
|
19549
|
+
"properties": {
|
|
19550
|
+
"ok": {
|
|
19551
|
+
"type": "boolean"
|
|
19552
|
+
},
|
|
19553
|
+
"widen_paths": {},
|
|
19554
|
+
"admitted": {},
|
|
19555
|
+
"ignored": {},
|
|
19556
|
+
"max": {}
|
|
19557
|
+
},
|
|
19558
|
+
"required": [
|
|
19559
|
+
"ok",
|
|
19560
|
+
"widen_paths",
|
|
19561
|
+
"admitted",
|
|
19562
|
+
"ignored",
|
|
19563
|
+
"max"
|
|
19564
|
+
]
|
|
19565
|
+
},
|
|
19432
19566
|
"PostBoxesBuilderIdCloseResponse": {
|
|
19433
19567
|
"type": "object",
|
|
19434
19568
|
"properties": {
|
|
@@ -22806,9 +22940,9 @@
|
|
|
22806
22940
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
22807
22941
|
}
|
|
22808
22942
|
},
|
|
22809
|
-
"x-endpoint-count":
|
|
22810
|
-
"x-schema-count":
|
|
22943
|
+
"x-endpoint-count": 362,
|
|
22944
|
+
"x-schema-count": 401,
|
|
22811
22945
|
"x-undocumented-bodies": 9,
|
|
22812
|
-
"x-response-schemas":
|
|
22946
|
+
"x-response-schemas": 270,
|
|
22813
22947
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
22814
22948
|
}
|
package/docs/api-reference.md
CHANGED
|
@@ -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.
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 362 endpoints across 58 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/<redacted>.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -81,7 +81,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
81
81
|
| POST | `/api/bongos/blockers/:id/link` | `metic+archon` | `task_id` | Link an existing blocker to a task. |
|
|
82
82
|
| POST | `/api/bongos/blockers/:id/resolve` | `metic+archon` | `resolution_note` | Resolve. |
|
|
83
83
|
|
|
84
|
-
## `box` (
|
|
84
|
+
## `box` (20)
|
|
85
85
|
|
|
86
86
|
| Method | Path | Rank | Body | Description |
|
|
87
87
|
|---|---|---|---|---|
|
|
@@ -103,6 +103,8 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
103
103
|
| GET | `/api/bongos/box/terminal` | `any-builder` | — | GET /box/terminal — the caller reads their box's web-terminal URL + credential (the Chromebook on-ramp, ADR 0038: ttyd behind a Cloudflar… |
|
|
104
104
|
| POST | `/api/bongos/box/terminal` | `any-builder` | `url`, `credential` | POST /box/terminal — the box publishes its current web-terminal URL + the per-box basic-auth credential. |
|
|
105
105
|
| POST | `/api/bongos/box/version` | `any-builder` | `sha`, `committed_at` | POST /box/version — the box reports its /workspace HEAD commit so the server can flag a stale box (idea 332 / task 1316, ADR 0072). |
|
|
106
|
+
| GET | `/api/bongos/box/widen` | `any-builder` | — | GET /box/widen — the caller's own recorded widen set (task 1003087). |
|
|
107
|
+
| POST | `/api/bongos/box/widen` | `any-builder` | `add`, `remove`, `clear` | POST /box/widen — record extra sparse-checkout directories that must SURVIVE the */10 source-fetch (task 1003087, idea 1000793). |
|
|
106
108
|
|
|
107
109
|
## `boxes` (4)
|
|
108
110
|
|
|
@@ -1739,5 +1739,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1739
1739
|
landed since 1.19.643 with no explicit bump. run 34509682128. (task 1002620)
|
|
1740
1740
|
1.19.645 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1741
1741
|
landed since 1.19.644 with no explicit bump. run 34511775606. (task 1002620)
|
|
1742
|
+
1.19.646 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1743
|
+
landed since 1.19.645 with no explicit bump. run 34512629504. (task 1002620)
|
|
1744
|
+
1.19.647 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1745
|
+
landed since 1.19.646 with no explicit bump. run 34515733973. (task 1002620)
|
|
1742
1746
|
---------------------------------------------------------------------------
|
|
1743
1747
|
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
-- core_237_box_widen_paths.sql — let a builder's own sparse-checkout widening
|
|
2
|
+
-- survive the */10 source-fetch tick (task 1003087, goal 1000095, idea 1000793).
|
|
3
|
+
--
|
|
4
|
+
-- THE BUG THIS EXISTS FOR. The box's source-fetch cron re-applies the
|
|
5
|
+
-- SERVER-COMPUTED sparse set every ~10 minutes. A builder who runs
|
|
6
|
+
-- `git sparse-checkout add <path>` to see code their task scope did not pull gets
|
|
7
|
+
-- it deleted out from under them on the next tick — including WHILE A COMMAND IS
|
|
8
|
+
-- RUNNING. A live test suite died mid-run with MODULE_NOT_FOUND that read exactly
|
|
9
|
+
-- like a code bug. It also breaks gen-repo-map, whose output is TREE-DEPENDENT:
|
|
10
|
+
-- a sparse tree regenerates different nested CLAUDE.md symbol blocks than CI's
|
|
11
|
+
-- full tree, so a box-committed regen reds CI's freshness gate (learning 1000192;
|
|
12
|
+
-- it stranded PR #254 until the tree was widened).
|
|
13
|
+
--
|
|
14
|
+
-- WHY THE FIX LIVES IN THE DATABASE AND NOT IN THE FETCH SCRIPT. The obvious fix
|
|
15
|
+
-- is "make box-source-fetch.sh union the builder's additions". It cannot be done
|
|
16
|
+
-- there from this repo: the fetch script is INSTANCE-owned, not shipped by the
|
|
17
|
+
-- neutral core (ADR 0150). More importantly it would not work — the cron asks the
|
|
18
|
+
-- SERVER for the set on every tick, so anything the script remembers locally is
|
|
19
|
+
-- one `git sparse-checkout set` away from being overwritten anyway. Recording the
|
|
20
|
+
-- widening server-side is what makes it tick-surviving: the union is computed in
|
|
21
|
+
-- GET /box/source-access, so EVERY fetch — cron included — already returns it,
|
|
22
|
+
-- and no instance-owned file has to change.
|
|
23
|
+
--
|
|
24
|
+
-- ONE COLUMN, NOT A TABLE. A widen set is small (capped in box-access.js), has no
|
|
25
|
+
-- attributes of its own, and is meaningless apart from its box — the same shape
|
|
26
|
+
-- as the existing array-ish per-box state on this table. A join table would buy
|
|
27
|
+
-- nothing and cost a query on the hot source-fetch path.
|
|
28
|
+
--
|
|
29
|
+
-- NOT AN AUTHORITY GRANT. This column widens what is MATERIALIZED on the box, not
|
|
30
|
+
-- what the builder may author. The wall stays where ADR 0148 put it — goal-scope
|
|
31
|
+
-- -check against the module globs, not what happens to be on disk — and
|
|
32
|
+
-- box-access.js admits a widen path only when the builder's RANK scope already
|
|
33
|
+
-- reaches it, so a Xenos cannot widen past the starter surface. Empty default, so
|
|
34
|
+
-- every existing box is unchanged until its owner asks for something.
|
|
35
|
+
|
|
36
|
+
ALTER TABLE builder_boxes
|
|
37
|
+
ADD COLUMN IF NOT EXISTS widen_paths text[] NOT NULL DEFAULT '{}';
|
|
38
|
+
|
|
39
|
+
COMMENT ON COLUMN builder_boxes.widen_paths IS
|
|
40
|
+
'Builder-requested extra sparse-checkout directories, unioned into the server-computed set on every source fetch so they survive the */10 cron (task 1003087). Admitted only within the builder''s rank scope — see modules/dev-box/box-access.js admissibleWidenPaths.';
|
|
@@ -204,6 +204,10 @@ function createClient(opts = {}) {
|
|
|
204
204
|
postBoxTerminal: (args) => request("POST", "/box/terminal", { hasBody: true }, args),
|
|
205
205
|
// POST /box/version — rank: any-builder — POST /box/version
|
|
206
206
|
postBoxVersion: (args) => request("POST", "/box/version", { hasBody: true }, args),
|
|
207
|
+
// GET /box/widen — rank: any-builder — GET /box/widen
|
|
208
|
+
getBoxWiden: (args) => request("GET", "/box/widen", { hasBody: false }, args),
|
|
209
|
+
// POST /box/widen — rank: any-builder — POST /box/widen
|
|
210
|
+
postBoxWiden: (args) => request("POST", "/box/widen", { hasBody: true }, args),
|
|
207
211
|
},
|
|
208
212
|
"boxes": {
|
|
209
213
|
// GET /boxes — rank: metic+archon — GET /boxes
|