@bongos/core 1.19.646 → 1.19.648

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 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.646",
6
- "core_contract": "1.19.646",
7
- "source_commit": "9648a16f755cae6136582c0d0ca4930a566a11af",
5
+ "core_version": "1.19.648",
6
+ "core_contract": "1.19.648",
7
+ "source_commit": "0606a231569b44bdc2521fcee567031ea8ea6f08",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-10T18:10:26.956Z",
9
+ "built_at": "2026-09-10T19:06:50.891Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 470,
13
13
  "agent_docs_stubbed": 24,
14
- "functional_verbatim": 2106,
14
+ "functional_verbatim": 2109,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2600,
20
- "tree_sha256": "69d3719087a6b6e7fb7c1a0d4889c6bf272f0258a7d7cc72458179525775f6df",
19
+ "file_count": 2603,
20
+ "tree_sha256": "3260c3c3da2ae8a6b6630824444ada3145268a70b9194585231bb3391392db80",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/backlog-review/SKILL.md",
@@ -362,12 +362,12 @@
362
362
  {
363
363
  "path": "clients/bongos-client/README.md",
364
364
  "mode": "0000644",
365
- "sha256": "65fb7649709e966a90f431d57b8855bd39951684a754320c4a797da9e3ccac13"
365
+ "sha256": "03379a98721207feab9a9b4c03862051ee6d52a29a0bc467ed73ae1d36bf49cd"
366
366
  },
367
367
  {
368
368
  "path": "clients/bongos-client/bongos-client.global.js",
369
369
  "mode": "0000644",
370
- "sha256": "ea404e8d932d396796888692651965072cb8d828b3d6e9ebb93bc205fb00f7b9"
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": "a6fb1af25ba5d2ef74cee69f2e126811d535b193422d44ee6f2f4efb787d7584"
380
+ "sha256": "bce3dcdbe37505e0fa526e02b7b379ca9ab378f6c34b41345621d55170d9f19d"
381
381
  },
382
382
  {
383
383
  "path": "clients/bongos-client/index.d.ts",
384
384
  "mode": "0000644",
385
- "sha256": "c109144665c545407dc0a56a8d08e77b277d7a1636ab3740d0e81e43c563f616"
385
+ "sha256": "5ef1befd1a1b30e8ef9e8b8ca08f768361d2422f6ddba2160a5395d46a84d443"
386
386
  },
387
387
  {
388
388
  "path": "clients/bongos-client/index.mjs",
389
389
  "mode": "0000644",
390
- "sha256": "0b96a51d69f2aeb6485eea84d80254ee1a4f90a8292c6b33e9bb89075f8cc187"
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": "72bfc066767c1c7301516d4f747c8a29725c2d623b5be1d916e6baa11e20a988"
1895
+ "sha256": "6c5f26c9c00387ecc84ed80726a4d62eca0f017f1d75c304d758961749fe616f"
1896
1896
  },
1897
1897
  {
1898
1898
  "path": "docs/api/openapi.json",
1899
1899
  "mode": "0000644",
1900
- "sha256": "ac3c10aa8cc2cdad0d6878a7b2c51bb668b5207a2cd9649ee87da871e190494e"
1900
+ "sha256": "d63a4ab6e92a24d339a632360fb92246512e09eabbc5bff632881bda6d4abf50"
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": "f4ceea78bdb8f6ba5fec64415aed58610a8ab011d3a8b550e517515904c8cfce"
2775
+ "sha256": "f646af7c4521017e44e5dfef0b160c18907bfa0f07b5986603593485a34f2742"
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": "a6fb1af25ba5d2ef74cee69f2e126811d535b193422d44ee6f2f4efb787d7584"
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": "a51e16aba67547c0692d9422587f83d8ce40f0e45830463b80bfd188401eb6c0"
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": "a56b75218b3ac3fed0bb495b9c7f41b2794dafa5f3e6ec28cbb21a97e9b25b7b"
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": "bbe6ed7344f7e5dd1d4dba79e636f4bc02806d25193edb0609f41c850ffbad4c"
4260
+ "sha256": "b61996de3fa3dbdc9b8fb639fd53aba5c1c2567350dc602b39ebbbd3a93164ac"
4256
4261
  },
4257
4262
  {
4258
4263
  "path": "modules/discord/CLAUDE.md",
@@ -5657,7 +5662,7 @@
5657
5662
  {
5658
5663
  "path": "modules/lifecycle/db-tasks.js",
5659
5664
  "mode": "0000644",
5660
- "sha256": "d8cce5b44106009987d3d32b711a114e4505b4e504bbc6fdfc84f161024ee0cd"
5665
+ "sha256": "fb6503bdaf013a13752968844693cbf957484f033b9df27a66f93eacb91c2cfa"
5661
5666
  },
5662
5667
  {
5663
5668
  "path": "modules/lifecycle/db-versions.js",
@@ -5667,7 +5672,7 @@
5667
5672
  {
5668
5673
  "path": "modules/lifecycle/db.js",
5669
5674
  "mode": "0000644",
5670
- "sha256": "95ff6bc6e9f4ad652dc2aa6bc2c7c520409a2115c714cb4ba867fc80413691e8"
5675
+ "sha256": "a568b425560d8d8f4523995442454233b69016a31934810c5d4b7d83baab0b09"
5671
5676
  },
5672
5677
  {
5673
5678
  "path": "modules/lifecycle/dead-deps.js",
@@ -5897,7 +5902,7 @@
5897
5902
  {
5898
5903
  "path": "modules/lifecycle/routes/task-write-routes.js",
5899
5904
  "mode": "0000644",
5900
- "sha256": "cc86b3c05885c733cc28ba6e41f1b08cb8f0fe652e3181c1c88be4caabf18d61"
5905
+ "sha256": "25bfb492572d553dbd19595addc0c337706ac2c83df71fb04d7fa199b07b715b"
5901
5906
  },
5902
5907
  {
5903
5908
  "path": "modules/lifecycle/routes/tasks.js",
@@ -7722,12 +7727,12 @@
7722
7727
  {
7723
7728
  "path": "package-lock.json",
7724
7729
  "mode": "0000644",
7725
- "sha256": "8def408bd91446b93b180b2696465b9bedaf1f8ebe15c671cd4f66a41f6b03da"
7730
+ "sha256": "83135ce62c34647b4bc57872526cb9f550a9fef2148c585839d57c600763961b"
7726
7731
  },
7727
7732
  {
7728
7733
  "path": "package.json",
7729
7734
  "mode": "0000644",
7730
- "sha256": "62ee3c0059ddc570ef2fef4f2288b7714d9eb95f64d390f67720eb7d07c92cd5"
7735
+ "sha256": "a9a2455f79599041389b23a18607666ce74eba9be0199d21fbc62553824463f6"
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": "981544bfd56d486c2017edd744c86089659771a74399b4780455821c45e3b3a9"
7925
+ "sha256": "33a79ddd2049419fe7df09cd7b5fe3da9163728a36bc8fe1351d89dcf2463a11"
7921
7926
  },
7922
7927
  {
7923
7928
  "path": "scripts/gds/box.js",
@@ -8862,7 +8867,7 @@
8862
8867
  {
8863
8868
  "path": "scripts/gds/ship-flow.js",
8864
8869
  "mode": "0000644",
8865
- "sha256": "9853e719e4a695cc52ec9089298d05163210ed3b51ca9eceb7553bc0ed9c65bd"
8870
+ "sha256": "8bf28a3d4d15e83a1e94416ec2519d39bc2a3faa71303a4f2d22d429b6afaa95"
8866
8871
  },
8867
8872
  {
8868
8873
  "path": "scripts/gds/ship-git.js",
@@ -9482,7 +9487,7 @@
9482
9487
  {
9483
9488
  "path": "src/module-api.js",
9484
9489
  "mode": "0000644",
9485
- "sha256": "bb3a06612cea7d25b04efabda8659ed8a71b66859bab279f9b4e8a1e5dbadff3"
9490
+ "sha256": "dadc321fdd8e6a6f856bb9260c555284b9859361c556d47b14b25df45db900b0"
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": "fcad6c578c2d8698d6ad93fe04f500734d589013590f006910f1bc33fc908642"
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": "010525c500aa1d5133f85a1a2ea7c23e9a680b08493a6f3b78c69a5108501468"
9940
+ "sha256": "4b1df674e2e53ce9d521bab3c43c2b3959dee7daa51b97dfa9b23c20e2a41f94"
9936
9941
  },
9937
9942
  {
9938
9943
  "path": "tests/box_task_scope.mjs",
@@ -11142,7 +11147,7 @@
11142
11147
  {
11143
11148
  "path": "tests/home_bounded_reads.mjs",
11144
11149
  "mode": "0000644",
11145
- "sha256": "186a8ebd04cd4dc8021b3a36699468e9c0bcf78ca61ce9f7be7c3e25c632fb3e"
11150
+ "sha256": "6853241b64b5f71dfb782956a4fab468a05aa2a9ee41d5159a4cbea5f0424f38"
11146
11151
  },
11147
11152
  {
11148
11153
  "path": "tests/hook_core_resolve.mjs",
@@ -11429,6 +11434,11 @@
11429
11434
  "mode": "0000644",
11430
11435
  "sha256": "7fa36152b6dbb17b2855d261ddbea96af63d26f97001273cd131104235ea431d"
11431
11436
  },
11437
+ {
11438
+ "path": "tests/lifecycle_facade_surface.mjs",
11439
+ "mode": "0000644",
11440
+ "sha256": "cc14604bf130022ce2533247d29187da6260a791f850f73051bd522252d1b115"
11441
+ },
11432
11442
  {
11433
11443
  "path": "tests/linkify_check.mjs",
11434
11444
  "mode": "0000644",
@@ -11547,7 +11557,7 @@
11547
11557
  {
11548
11558
  "path": "tests/migration_allocation.mjs",
11549
11559
  "mode": "0000644",
11550
- "sha256": "0d1bc299555d98aa2ad8571e0a5a185776ca727f95577c3308a7e4b36efbfd97"
11560
+ "sha256": "e9271b1a67d201cfd075ce272b1a5a4f3b66c80dcfa5798ca3ea0d3f5048be43"
11551
11561
  },
11552
11562
  {
11553
11563
  "path": "tests/migration_namespace.mjs",
@@ -11787,7 +11797,12 @@
11787
11797
  {
11788
11798
  "path": "tests/patch_gate_ordering.mjs",
11789
11799
  "mode": "0000644",
11790
- "sha256": "27a3b5023b6857f3f53734966bc7685757383f2b8dadfa3c0bf1aca2e7db5517"
11800
+ "sha256": "db5e934ef61ddc8dc5804f25a9c84c04f30570db708fd6c77a157e101c69b4d4"
11801
+ },
11802
+ {
11803
+ "path": "tests/patch_value_summary_e2e.mjs",
11804
+ "mode": "0000644",
11805
+ "sha256": "86f60e682284c5f36fa23c6df0ec8b137f40cc548562d6c4496d11d200edb9bf"
11791
11806
  },
11792
11807
  {
11793
11808
  "path": "tests/path_match.mjs",
@@ -12517,7 +12532,7 @@
12517
12532
  {
12518
12533
  "path": "tests/ship_cannot_lie.mjs",
12519
12534
  "mode": "0000644",
12520
- "sha256": "d8d99b6cd465b04eaf13790b0bdfe9a76ce36d77660407d3a2c6a17ac7852e8c"
12535
+ "sha256": "18a3bb613fff3dcc0dfbffb2283a866726af4347c161fc28853b36b5bdd75512"
12521
12536
  },
12522
12537
  {
12523
12538
  "path": "tests/ship_card.mjs",
@@ -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
- - 360 operations across 55 resource groups
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 }
@@ -182,7 +183,7 @@ export interface PatchProvisioningInstancesIdDetailResponse { ok: boolean; descr
182
183
  export interface PatchProvisioningInstancesIdSettingsResponse { ok: boolean; saved: unknown; planet: unknown; push: unknown }
183
184
  export interface PatchTaskRecommendationsIdRequest { status: "declined" | "withdrawn" }
184
185
  export interface PatchTaskRecommendationsIdResponse { ok: boolean; recommendation: unknown }
185
- export interface PatchTasksIdRequest { kind?: string; discipline?: string; requires_rank?: string; module_key?: string; goal_id?: number; parent_task_id?: StringifiableId; parallel_safe?: unknown; newcomer_friendly?: boolean; xenos_claimable?: boolean; security_sensitive?: boolean; automation_tag?: string; needs_migration?: boolean; description?: string; title?: string; priority?: unknown; status?: unknown }
186
+ export interface PatchTasksIdRequest { kind?: string; discipline?: string; requires_rank?: string; module_key?: string; goal_id?: number; parent_task_id?: StringifiableId; parallel_safe?: unknown; newcomer_friendly?: boolean; xenos_claimable?: boolean; security_sensitive?: boolean; automation_tag?: string; needs_migration?: boolean; description?: string; title?: string; priority?: unknown; value_summary?: string; status?: unknown }
186
187
  export interface PostAccessRequestsInviteRequest { github_login: string }
187
188
  export interface PostAccessRequestsInviteResponse { ok: boolean; already_invited?: boolean; github_login?: unknown; request?: unknown }
188
189
  export interface PostAccessRequestsRequest { github_login: string; display_name?: string; note?: string }
@@ -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
@@ -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": {
@@ -18881,6 +18981,11 @@
18881
18981
  "maxLength": 200
18882
18982
  },
18883
18983
  "priority": {},
18984
+ "value_summary": {
18985
+ "type": "string",
18986
+ "minLength": 1,
18987
+ "maxLength": 1000
18988
+ },
18884
18989
  "status": {}
18885
18990
  },
18886
18991
  "additionalProperties": false
@@ -19429,6 +19534,40 @@
19429
19534
  "state"
19430
19535
  ]
19431
19536
  },
19537
+ "PostBoxWidenRequest": {
19538
+ "type": "object",
19539
+ "properties": {
19540
+ "add": {
19541
+ "type": "array"
19542
+ },
19543
+ "remove": {
19544
+ "type": "array"
19545
+ },
19546
+ "clear": {
19547
+ "type": "boolean"
19548
+ }
19549
+ },
19550
+ "additionalProperties": false
19551
+ },
19552
+ "PostBoxWidenResponse": {
19553
+ "type": "object",
19554
+ "properties": {
19555
+ "ok": {
19556
+ "type": "boolean"
19557
+ },
19558
+ "widen_paths": {},
19559
+ "admitted": {},
19560
+ "ignored": {},
19561
+ "max": {}
19562
+ },
19563
+ "required": [
19564
+ "ok",
19565
+ "widen_paths",
19566
+ "admitted",
19567
+ "ignored",
19568
+ "max"
19569
+ ]
19570
+ },
19432
19571
  "PostBoxesBuilderIdCloseResponse": {
19433
19572
  "type": "object",
19434
19573
  "properties": {
@@ -22806,9 +22945,9 @@
22806
22945
  "description": "A required dependency/feature is not configured or is temporarily down."
22807
22946
  }
22808
22947
  },
22809
- "x-endpoint-count": 360,
22810
- "x-schema-count": 398,
22948
+ "x-endpoint-count": 362,
22949
+ "x-schema-count": 401,
22811
22950
  "x-undocumented-bodies": 9,
22812
- "x-response-schemas": 268,
22951
+ "x-response-schemas": 270,
22813
22952
  "x-generated-by": "scripts/gds/gen-api-docs.js"
22814
22953
  }
@@ -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. 360 endpoints across 58 route files.
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` (18)
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
 
@@ -591,7 +593,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
591
593
  | GET | `/api/bongos/tasks` | `any-builder` | — | |
592
594
  | POST | `/api/bongos/tasks` | `metic+archon` | `version_id`, `title`, `description`, `status`, `touches`, `est_minutes`, `est_cost_usd`, `manual_degree`, `priority`, `automation_tag`, `credits_reward`, `source`, `source_ref`, `value_summary`, `kind`, `discipline`, `parallel_safe`, `newcomer_friendly`, `security_sensitive`, `requires_rank`, `auto_detect_touches`, `criterion_ids`, `module_key`, `goal_id` | Task create/promote/edit (plan/scope mutation) is Metic+ as of ADR 0090 (owner decision 2026-06-26): a Metic who can run idea-triage may … |
593
595
  | GET | `/api/bongos/tasks/:id` | `any-builder` | — | single-task read; preserved per CRITICAL §4 (supervisor hot path). |
594
- | PATCH | `/api/bongos/tasks/:id` | `metic+archon` | `kind`, `discipline`, `requires_rank`, `module_key`, `goal_id`, `parent_task_id`, `parallel_safe`, `newcomer_friendly`, `xenos_claimable`, `security_sensitive`, `automation_tag`, `needs_migration`, `description`, `title`, `priority`, `status` | PATCH /tasks/:id — supports body.parent_task_id (V2 C2), body.kind (V2 B1), body.discipline (mig 014), body.parallel_safe (mig 028), and … |
596
+ | PATCH | `/api/bongos/tasks/:id` | `metic+archon` | `kind`, `discipline`, `requires_rank`, `module_key`, `goal_id`, `parent_task_id`, `parallel_safe`, `newcomer_friendly`, `xenos_claimable`, `security_sensitive`, `automation_tag`, `needs_migration`, `description`, `title`, `priority`, `value_summary`, `status` | PATCH /tasks/:id — supports body.parent_task_id (V2 C2), body.kind (V2 B1), body.discipline (mig 014), body.parallel_safe (mig 028), and … |
595
597
  | POST | `/api/bongos/tasks/:id/abandon` | `metic+archon` | `reason` | POST /tasks/:id/abandon — terminal "retire this task" transition (task 987). |
596
598
  | POST | `/api/bongos/tasks/:id/attest-gate` | `any-builder` | `head_sha` | POST /tasks/:id/attest-gate — body: { head_sha }. |
597
599
  | POST | `/api/bongos/tasks/:id/confirm` | `any-builder` | `verified` | |
@@ -1741,5 +1741,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
1741
1741
  landed since 1.19.644 with no explicit bump. run 34511775606. (task 1002620)
1742
1742
  1.19.646 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1743
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)
1746
+ 1.19.648 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1747
+ landed since 1.19.647 with no explicit bump. run 34518387614. (task 1002620)
1744
1748
  ---------------------------------------------------------------------------
1745
1749
  ```
@@ -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