@bongos/core 1.19.294 → 1.19.296

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.294",
6
- "core_contract": "1.19.294",
7
- "source_commit": "fffe6738492ac7d113228cc4f9b1d5eae0ed16d3",
5
+ "core_version": "1.19.296",
6
+ "core_contract": "1.19.296",
7
+ "source_commit": "a0c264baf117184273d9a83f7c158844920f1d48",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-22T17:51:40.637Z",
9
+ "built_at": "2026-08-22T18:35:34.578Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 321,
13
13
  "agent_docs_stubbed": 22,
14
- "functional_verbatim": 1395,
14
+ "functional_verbatim": 1398,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1738,
20
- "tree_sha256": "70e835883854335f17289f54d647911185cfc4cfb1ec5b17424a88e6bbd8156f",
19
+ "file_count": 1741,
20
+ "tree_sha256": "a34c536a2753b233ccd552b62e7fcfbe3768304013f4130c641a9bb51d7e51d5",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -347,12 +347,12 @@
347
347
  {
348
348
  "path": "clients/bongos-client/README.md",
349
349
  "mode": "0000644",
350
- "sha256": "aaf0bb7dae10d271e9999093935fef5ae8d85c3a2e3d5b4c52e0c11fed8c581e"
350
+ "sha256": "cc15a1c79d2dd761b8b50190f72d69b2ccec0a56bdd812a82913213a4b811da6"
351
351
  },
352
352
  {
353
353
  "path": "clients/bongos-client/bongos-client.global.js",
354
354
  "mode": "0000644",
355
- "sha256": "372a5584ddad52fb524815fc7b50d1aab9163e974aac6f2c64f479e4034914a1"
355
+ "sha256": "b2add6cdda6bf67a34a33864f5c6c0a1bdaf7f3ac21314800d222b5f4be55eb5"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -362,17 +362,17 @@
362
362
  {
363
363
  "path": "clients/bongos-client/index.cjs",
364
364
  "mode": "0000644",
365
- "sha256": "7faac7fc48e714c76c2b19feaaf9c730b2c9b10ab71ddc5697c21497d02f10ef"
365
+ "sha256": "b6f803fa3594804e6781eab762eb91241c9146c1e3aa09a8883dd8015a55dc3b"
366
366
  },
367
367
  {
368
368
  "path": "clients/bongos-client/index.d.ts",
369
369
  "mode": "0000644",
370
- "sha256": "7aba0fe1d782cb6308f57dc2e5f6fe0d5ffe0f537d4ffe846bdc7a03e0f8064d"
370
+ "sha256": "ee350739d64eb2ddce22fa0378ece2eebc363eae96c7755f087363b87e9581fe"
371
371
  },
372
372
  {
373
373
  "path": "clients/bongos-client/index.mjs",
374
374
  "mode": "0000644",
375
- "sha256": "5f1d221bfbf8d329f883a5dc3e84414728c67201d66faceff04d48732e44b13c"
375
+ "sha256": "9f4db5e5579a3e401a9d56ee473436b8c6cd00e82f209de784c321131f6e420d"
376
376
  },
377
377
  {
378
378
  "path": "clients/bongos-client/package.json",
@@ -1412,12 +1412,12 @@
1412
1412
  {
1413
1413
  "path": "docs/api-reference.md",
1414
1414
  "mode": "0000644",
1415
- "sha256": "8fb83f272ef8810df2c517d9514495f44016da2e23cdd67937463f40c0d1605d"
1415
+ "sha256": "f7102579bfe64bb798e9ebc826849857218da439113c6f7b049cfc9a580f863f"
1416
1416
  },
1417
1417
  {
1418
1418
  "path": "docs/api/openapi.json",
1419
1419
  "mode": "0000644",
1420
- "sha256": "f51be43a281c9609980fca57d2fa11cafb460a414e506174715d53c08cef6965"
1420
+ "sha256": "a3d866c17cdb60660fb7603de26faccb0fd0fa345e47c26d9703e2fc1fdbfd40"
1421
1421
  },
1422
1422
  {
1423
1423
  "path": "docs/architecture.md",
@@ -1552,7 +1552,7 @@
1552
1552
  {
1553
1553
  "path": "docs/file-map.md",
1554
1554
  "mode": "0000644",
1555
- "sha256": "9762b7f69397c28e103cdb39a9987483e23bd800a827f0d83983b62ef962616b"
1555
+ "sha256": "9a2f67ab5989d068060bfe336d17ae88a33484fa8cbb5a92f23534b1c6de6289"
1556
1556
  },
1557
1557
  {
1558
1558
  "path": "docs/handoff-template.md",
@@ -2807,7 +2807,7 @@
2807
2807
  {
2808
2808
  "path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
2809
2809
  "mode": "0000644",
2810
- "sha256": "7faac7fc48e714c76c2b19feaaf9c730b2c9b10ab71ddc5697c21497d02f10ef"
2810
+ "sha256": "b6f803fa3594804e6781eab762eb91241c9146c1e3aa09a8883dd8015a55dc3b"
2811
2811
  },
2812
2812
  {
2813
2813
  "path": "modules/dev-box/app/test/unit.mjs",
@@ -3707,7 +3707,7 @@
3707
3707
  {
3708
3708
  "path": "modules/ideas/inbox.js",
3709
3709
  "mode": "0000644",
3710
- "sha256": "19af72245517260ac6ee670c93fa3cda99a678da25a7fa6a5d6ec565995201ce"
3710
+ "sha256": "33a25e6bd24ee0952c03e2aeab3e1edb68f8cf84989ee04206c9efdb7d202fa7"
3711
3711
  },
3712
3712
  {
3713
3713
  "path": "modules/ideas/migrations/ideas_001_grades.sql",
@@ -3742,7 +3742,7 @@
3742
3742
  {
3743
3743
  "path": "modules/ideas/routes/inbox.js",
3744
3744
  "mode": "0000644",
3745
- "sha256": "47c2a3beb6bed3b206ec36344950fe115189debf75a38cf202bfafaa5dbb2adb"
3745
+ "sha256": "7de2735020ddd526ded8ca252fbfba157ee5eb174895660d37ac713b9d0d6fd2"
3746
3746
  },
3747
3747
  {
3748
3748
  "path": "modules/ideas/routing.js",
@@ -4537,12 +4537,12 @@
4537
4537
  {
4538
4538
  "path": "package-lock.json",
4539
4539
  "mode": "0000644",
4540
- "sha256": "4555259c80ad21945412441d859ab9ff5f68be5adb28d7c02b2d405b42339398"
4540
+ "sha256": "b937444a6338c17ae2692d47f126d612f87c2429783a3d9a95e4c5d6076f3f5b"
4541
4541
  },
4542
4542
  {
4543
4543
  "path": "package.json",
4544
4544
  "mode": "0000644",
4545
- "sha256": "26ce6a3328f57b80487d9b5fd31db9cb1c200c93d8f5ec307f763b39e8b28e6e"
4545
+ "sha256": "ce72a3e5a70ae07f431f223dccf12d2c896474bcb1f0d62724aea22206b23dde"
4546
4546
  },
4547
4547
  {
4548
4548
  "path": "public-docs/index.html",
@@ -5779,6 +5779,11 @@
5779
5779
  "mode": "0000644",
5780
5780
  "sha256": "9c3a382def8c074a37bad66d7e3deef41c7f2bb9406f02f107be0e9a7dc7bfb3"
5781
5781
  },
5782
+ {
5783
+ "path": "scripts/gds/spark.js",
5784
+ "mode": "0000755",
5785
+ "sha256": "61ad614ec3fb8cbfc98d815629fd3ccafd179a8f2c058539103c9bf4e23e9504"
5786
+ },
5782
5787
  {
5783
5788
  "path": "scripts/gds/start.js",
5784
5789
  "mode": "0000644",
@@ -6057,7 +6062,7 @@
6057
6062
  {
6058
6063
  "path": "src/bongos/route-rank-check.js",
6059
6064
  "mode": "0000644",
6060
- "sha256": "97b8345a1d891151c3bc134926124a0ac929db661e0cfb26c6760c8c6030bafc"
6065
+ "sha256": "f2d893e0de84433cc99411e59aba98c1ca392fa8d5bd24449e1e9200f06d9ff8"
6061
6066
  },
6062
6067
  {
6063
6068
  "path": "src/bongos/routes.js",
@@ -6192,7 +6197,7 @@
6192
6197
  {
6193
6198
  "path": "src/module-api.js",
6194
6199
  "mode": "0000644",
6195
- "sha256": "ea4af468628d2a5b45ee1e1916622975f263fc4059cff13a49cadb898f35a4db"
6200
+ "sha256": "e5f489e0d2b9cc6d9c73cc853132a8a7a7e3fbcd8ea2325284d58143d4020a05"
6196
6201
  },
6197
6202
  {
6198
6203
  "path": "src/module-loader/catalog.js",
@@ -7509,6 +7514,16 @@
7509
7514
  "mode": "0000644",
7510
7515
  "sha256": "7bea2d388fad9a6b186c4712d6921a554f1d24c70dcae5760b381782149068e7"
7511
7516
  },
7517
+ {
7518
+ "path": "tests/idea_spark_mark.mjs",
7519
+ "mode": "0000644",
7520
+ "sha256": "fb5af0aa1b34116114a1c734c548cafaa52eefda57bd145c0008995bc69addee"
7521
+ },
7522
+ {
7523
+ "path": "tests/idea_spark_queue.mjs",
7524
+ "mode": "0000644",
7525
+ "sha256": "6bea289f0473d07e21acd0b45b50511f061d8d1f0d09b7437a909081ea83344a"
7526
+ },
7512
7527
  {
7513
7528
  "path": "tests/idea_task_lineage.mjs",
7514
7529
  "mode": "0000644",
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
5
5
  by hand; it regenerates when the spec changes, so it can never drift from the routes.
6
6
 
7
7
  - API version: **v1** (served at `/api/bongos/v1`)
8
- - 294 operations across 47 resource groups
8
+ - 297 operations across 47 resource groups
9
9
 
10
10
  ## Install
11
11
 
@@ -409,8 +409,14 @@ function createClient(opts = {}) {
409
409
  postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
410
410
  // POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
411
411
  postInboxIdResubmit: (args) => request("POST", "/inbox/{id}/resubmit", { hasBody: true }, args),
412
+ // DELETE /inbox/{id}/spark — rank: any-builder — DELETE /inbox/:id/spark
413
+ deleteInboxIdSpark: (args) => request("DELETE", "/inbox/{id}/spark", { hasBody: false }, args),
414
+ // POST /inbox/{id}/spark — rank: any-builder — POST /inbox/:id/spark
415
+ postInboxIdSpark: (args) => request("POST", "/inbox/{id}/spark", { hasBody: true }, args),
412
416
  // GET /inbox/awaiting-nod — rank: metic+archon — GET /inbox/awaiting-nod
413
417
  getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
418
+ // GET /inbox/sparks — rank: any-builder — GET /inbox/sparks
419
+ getInboxSparks: (args) => request("GET", "/inbox/sparks", { hasBody: false }, args),
414
420
  },
415
421
  "instance": {
416
422
  // GET /instance — rank: public — GET /instance
@@ -408,8 +408,14 @@ function createClient(opts = {}) {
408
408
  postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
409
409
  // POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
410
410
  postInboxIdResubmit: (args) => request("POST", "/inbox/{id}/resubmit", { hasBody: true }, args),
411
+ // DELETE /inbox/{id}/spark — rank: any-builder — DELETE /inbox/:id/spark
412
+ deleteInboxIdSpark: (args) => request("DELETE", "/inbox/{id}/spark", { hasBody: false }, args),
413
+ // POST /inbox/{id}/spark — rank: any-builder — POST /inbox/:id/spark
414
+ postInboxIdSpark: (args) => request("POST", "/inbox/{id}/spark", { hasBody: true }, args),
411
415
  // GET /inbox/awaiting-nod — rank: metic+archon — GET /inbox/awaiting-nod
412
416
  getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
417
+ // GET /inbox/sparks — rank: any-builder — GET /inbox/sparks
418
+ getInboxSparks: (args) => request("GET", "/inbox/sparks", { hasBody: false }, args),
413
419
  },
414
420
  "instance": {
415
421
  // GET /instance — rank: public — GET /instance
@@ -9,6 +9,7 @@ export interface DeleteBoxSshKeyIdResponse { ok: boolean; deleted: unknown }
9
9
  export interface DeleteDependenciesResponse { ok: boolean }
10
10
  export interface DeleteGovernmentAssignmentsBuilderIdRankKeyResponse { ok: boolean; builder_id: unknown; rank_key: unknown; removed: unknown }
11
11
  export interface DeleteGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; removed: unknown }
12
+ export interface DeleteInboxIdSparkResponse { idea: unknown; sparked: boolean; unchanged: boolean }
12
13
  export interface DeleteMemoryFileResponse { deleted: boolean; builder_id: unknown; path: unknown }
13
14
  export interface DeleteTasksIdCriteriaCriterionIdResponse { ok: boolean; removed: unknown }
14
15
  export interface DeleteTasksIdDependenciesDepIdResponse { ok: boolean; removed: unknown }
@@ -49,6 +50,7 @@ export interface GetHealthzResponse { ok: boolean; auth_configured: unknown }
49
50
  export interface GetInboxAwaitingNodResponse { awaiting: unknown; count: unknown }
50
51
  export interface GetInboxIdResponse { idea: unknown }
51
52
  export interface GetInboxResponse { ideas: unknown; open_count: unknown }
53
+ export interface GetInboxSparksResponse { sparks: unknown; count: unknown }
52
54
  export interface GetLeaderboardResponse { leaderboard: unknown; page: unknown }
53
55
  export interface GetLearningsResponse { learnings: unknown }
54
56
  export interface GetMeAchievementsResponse { unlocked: unknown }
@@ -246,6 +248,7 @@ export interface PostGovernmentRanksRequest { rank_key: string; label: string; d
246
248
  export interface PostGovernmentRanksResponse { rank: unknown }
247
249
  export interface PostInboxIdRatifyRequest { notes_md?: string }
248
250
  export interface PostInboxIdResubmitRequest { field_values: Record<string, unknown>; template_key?: string }
251
+ export interface PostInboxIdSparkResponse { idea: unknown; sparked: boolean; unchanged: boolean }
249
252
  export interface PostInboxRequest { title: string; body_md?: string; kind?: string; suggested_version?: string; suggested_priority?: number; goal_id?: number; grade?: string; template_key?: string; field_values?: Record<string, unknown> }
250
253
  export interface PostLearningsRequest { title: string; body_md: string; tags?: string[]; related_files?: string[]; source?: string; source_ref?: string; task_id?: number }
251
254
  export interface PostLearningsResponse { skipped?: boolean; reason?: unknown; learning?: unknown }
@@ -669,8 +672,14 @@ export interface BongosClient {
669
672
  postInboxIdRatify(args?: RequestArgs & { body?: PostInboxIdRatifyRequest }): Promise<ApiResponse>;
670
673
  /** POST /inbox/{id}/resubmit — rank: any-builder */
671
674
  postInboxIdResubmit(args: RequestArgs & { body: PostInboxIdResubmitRequest }): Promise<ApiResponse>;
675
+ /** DELETE /inbox/{id}/spark — rank: any-builder */
676
+ deleteInboxIdSpark(args?: RequestArgs): Promise<DeleteInboxIdSparkResponse>;
677
+ /** POST /inbox/{id}/spark — rank: any-builder */
678
+ postInboxIdSpark(args?: RequestArgs): Promise<PostInboxIdSparkResponse>;
672
679
  /** GET /inbox/awaiting-nod — rank: metic+archon */
673
680
  getInboxAwaitingNod(args?: RequestArgs): Promise<GetInboxAwaitingNodResponse>;
681
+ /** GET /inbox/sparks — rank: any-builder */
682
+ getInboxSparks(args?: RequestArgs): Promise<GetInboxSparksResponse>;
674
683
  };
675
684
  "instance": {
676
685
  /** GET /instance — rank: public */
@@ -405,8 +405,14 @@ export function createClient(opts = {}) {
405
405
  postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
406
406
  // POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
407
407
  postInboxIdResubmit: (args) => request("POST", "/inbox/{id}/resubmit", { hasBody: true }, args),
408
+ // DELETE /inbox/{id}/spark — rank: any-builder — DELETE /inbox/:id/spark
409
+ deleteInboxIdSpark: (args) => request("DELETE", "/inbox/{id}/spark", { hasBody: false }, args),
410
+ // POST /inbox/{id}/spark — rank: any-builder — POST /inbox/:id/spark
411
+ postInboxIdSpark: (args) => request("POST", "/inbox/{id}/spark", { hasBody: true }, args),
408
412
  // GET /inbox/awaiting-nod — rank: metic+archon — GET /inbox/awaiting-nod
409
413
  getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
414
+ // GET /inbox/sparks — rank: any-builder — GET /inbox/sparks
415
+ getInboxSparks: (args) => request("GET", "/inbox/sparks", { hasBody: false }, args),
410
416
  },
411
417
  "instance": {
412
418
  // GET /instance — rank: public — GET /instance
@@ -6307,6 +6307,44 @@
6307
6307
  ]
6308
6308
  }
6309
6309
  },
6310
+ "/inbox/sparks": {
6311
+ "get": {
6312
+ "operationId": "get_inbox_sparks",
6313
+ "tags": [
6314
+ "inbox"
6315
+ ],
6316
+ "summary": "GET /inbox/sparks",
6317
+ "description": "GET /inbox/sparks — THE SPARK QUEUE (task 1002921 / BV1.R145, goal 1000062). Big Idea Sparks awaiting development: the ideator craft's pickup surface, and the first place one craft sources work from another craft's output. READABLE BY ANY BUILDER, by design and by the done-when. A pickup surface that only trusted builders could read would defeat its own purpose — the whole point is that someone OTHER than the author comes along and develops the thought. The author's consent is already recorded (the R144 mark is what put the row here), so no further gate belongs on the read. Contrast /inbox/awaiting-nod directly above, which IS gated: that queue exists to be ACTED on by a triager, this one to be BROWSED by anyone. DECLARED BEFORE `GET /inbox/:id` DELIBERATELY — and this ordering is load-bearing, not stylistic. Express matches in declaration order, so with the routes the other way round `/inbox/sparks` binds `:id = 'sparks'` and parseId turns the whole queue into a 400 bad_id. Same reason /inbox/awaiting-nod sits above it. tests/idea_spark_queue.mjs pins the relative order so a future insertion cannot quietly re-shadow it. rank: any-builder — a pickup surface is public to builders (the R144 mark is the consent). Deliberately NOT pinned in route-rank-check: a read with no gate to protect has no downgrade to catch, and pinning it would only assert that a read stays open.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
6318
+ "x-rank": "any-builder",
6319
+ "x-source": "modules/ideas/routes/inbox.js",
6320
+ "responses": {
6321
+ "200": {
6322
+ "description": "Success.",
6323
+ "content": {
6324
+ "application/json": {
6325
+ "schema": {
6326
+ "$ref": "#/components/schemas/GetInboxSparksResponse"
6327
+ }
6328
+ }
6329
+ }
6330
+ },
6331
+ "400": {
6332
+ "$ref": "#/components/responses/BadRequest"
6333
+ },
6334
+ "401": {
6335
+ "$ref": "#/components/responses/Unauthorized"
6336
+ },
6337
+ "403": {
6338
+ "$ref": "#/components/responses/Forbidden"
6339
+ }
6340
+ },
6341
+ "security": [
6342
+ {
6343
+ "builderSession": []
6344
+ }
6345
+ ]
6346
+ }
6347
+ },
6310
6348
  "/inbox/{id}": {
6311
6349
  "get": {
6312
6350
  "operationId": "get_inbox_id",
@@ -6601,6 +6639,108 @@
6601
6639
  ]
6602
6640
  }
6603
6641
  },
6642
+ "/inbox/{id}/spark": {
6643
+ "post": {
6644
+ "operationId": "post_inbox_id_spark",
6645
+ "tags": [
6646
+ "inbox"
6647
+ ],
6648
+ "summary": "POST /inbox/:id/spark",
6649
+ "description": "Mark a Quick Idea as a Big Idea Spark — \"I have the spark but not the full picture, someone develop this\". AUTHOR-ONLY: the mark is the author's consent to have their idea developed, so only they can set it. A Full Idea is refused (409) and a non-open idea cannot be newly marked; re-marking is a 200 no-op.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
6650
+ "x-rank": "any-builder",
6651
+ "x-source": "modules/ideas/routes/inbox.js",
6652
+ "parameters": [
6653
+ {
6654
+ "name": "id",
6655
+ "in": "path",
6656
+ "required": true,
6657
+ "schema": {
6658
+ "type": "string"
6659
+ },
6660
+ "description": "Path parameter `id`."
6661
+ }
6662
+ ],
6663
+ "responses": {
6664
+ "200": {
6665
+ "description": "Success.",
6666
+ "content": {
6667
+ "application/json": {
6668
+ "schema": {
6669
+ "$ref": "#/components/schemas/PostInboxIdSparkResponse"
6670
+ }
6671
+ }
6672
+ }
6673
+ },
6674
+ "400": {
6675
+ "$ref": "#/components/responses/BadRequest"
6676
+ },
6677
+ "401": {
6678
+ "$ref": "#/components/responses/Unauthorized"
6679
+ },
6680
+ "403": {
6681
+ "$ref": "#/components/responses/Forbidden"
6682
+ },
6683
+ "404": {
6684
+ "$ref": "#/components/responses/NotFound"
6685
+ }
6686
+ },
6687
+ "security": [
6688
+ {
6689
+ "builderSession": []
6690
+ }
6691
+ ]
6692
+ },
6693
+ "delete": {
6694
+ "operationId": "delete_inbox_id_spark",
6695
+ "tags": [
6696
+ "inbox"
6697
+ ],
6698
+ "summary": "DELETE /inbox/:id/spark",
6699
+ "description": "Withdraw the Big Idea Spark mark — the reversibility half of R144. AUTHOR-ONLY like the mark itself, and legal at ANY status so a stale mark on a promoted or discarded idea can always be cleared. Writes an explicit grade='quick' row, which reads identically to no grade row at all. Un-marking a quick idea is a 200 no-op; a Full Idea is refused (409) — it is not a withdrawn spark.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
6700
+ "x-rank": "any-builder",
6701
+ "x-source": "modules/ideas/routes/inbox.js",
6702
+ "parameters": [
6703
+ {
6704
+ "name": "id",
6705
+ "in": "path",
6706
+ "required": true,
6707
+ "schema": {
6708
+ "type": "string"
6709
+ },
6710
+ "description": "Path parameter `id`."
6711
+ }
6712
+ ],
6713
+ "responses": {
6714
+ "200": {
6715
+ "description": "Success.",
6716
+ "content": {
6717
+ "application/json": {
6718
+ "schema": {
6719
+ "$ref": "#/components/schemas/DeleteInboxIdSparkResponse"
6720
+ }
6721
+ }
6722
+ }
6723
+ },
6724
+ "400": {
6725
+ "$ref": "#/components/responses/BadRequest"
6726
+ },
6727
+ "401": {
6728
+ "$ref": "#/components/responses/Unauthorized"
6729
+ },
6730
+ "403": {
6731
+ "$ref": "#/components/responses/Forbidden"
6732
+ },
6733
+ "404": {
6734
+ "$ref": "#/components/responses/NotFound"
6735
+ }
6736
+ },
6737
+ "security": [
6738
+ {
6739
+ "builderSession": []
6740
+ }
6741
+ ]
6742
+ }
6743
+ },
6604
6744
  "/instance": {
6605
6745
  "get": {
6606
6746
  "operationId": "get_instance",
@@ -13412,6 +13552,23 @@
13412
13552
  "removed"
13413
13553
  ]
13414
13554
  },
13555
+ "DeleteInboxIdSparkResponse": {
13556
+ "type": "object",
13557
+ "properties": {
13558
+ "idea": {},
13559
+ "sparked": {
13560
+ "type": "boolean"
13561
+ },
13562
+ "unchanged": {
13563
+ "type": "boolean"
13564
+ }
13565
+ },
13566
+ "required": [
13567
+ "idea",
13568
+ "sparked",
13569
+ "unchanged"
13570
+ ]
13571
+ },
13415
13572
  "DeleteMemoryFileResponse": {
13416
13573
  "type": "object",
13417
13574
  "properties": {
@@ -13909,6 +14066,17 @@
13909
14066
  "open_count"
13910
14067
  ]
13911
14068
  },
14069
+ "GetInboxSparksResponse": {
14070
+ "type": "object",
14071
+ "properties": {
14072
+ "sparks": {},
14073
+ "count": {}
14074
+ },
14075
+ "required": [
14076
+ "sparks",
14077
+ "count"
14078
+ ]
14079
+ },
13912
14080
  "GetLeaderboardResponse": {
13913
14081
  "type": "object",
13914
14082
  "properties": {
@@ -16855,6 +17023,23 @@
16855
17023
  ],
16856
17024
  "additionalProperties": false
16857
17025
  },
17026
+ "PostInboxIdSparkResponse": {
17027
+ "type": "object",
17028
+ "properties": {
17029
+ "idea": {},
17030
+ "sparked": {
17031
+ "type": "boolean"
17032
+ },
17033
+ "unchanged": {
17034
+ "type": "boolean"
17035
+ }
17036
+ },
17037
+ "required": [
17038
+ "idea",
17039
+ "sparked",
17040
+ "unchanged"
17041
+ ]
17042
+ },
16858
17043
  "PostInboxRequest": {
16859
17044
  "type": "object",
16860
17045
  "properties": {
@@ -18571,9 +18756,9 @@
18571
18756
  "description": "A required dependency/feature is not configured or is temporarily down."
18572
18757
  }
18573
18758
  },
18574
- "x-endpoint-count": 294,
18575
- "x-schema-count": 327,
18759
+ "x-endpoint-count": 297,
18760
+ "x-schema-count": 330,
18576
18761
  "x-undocumented-bodies": 8,
18577
- "x-response-schemas": 218,
18762
+ "x-response-schemas": 221,
18578
18763
  "x-generated-by": "scripts/gds/gen-api-docs.js"
18579
18764
  }
@@ -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. 294 endpoints across 47 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 297 endpoints across 47 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`.
@@ -258,7 +258,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
258
258
  |---|---|---|---|---|
259
259
  | GET | `/api/bongos/healthz` | `public` | — | liveness probe; status.example.com hits this anonymously. |
260
260
 
261
- ## `inbox` (8)
261
+ ## `inbox` (11)
262
262
 
263
263
  | Method | Path | Rank | Body | Description |
264
264
  |---|---|---|---|---|
@@ -269,7 +269,10 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
269
269
  | PATCH | `/api/bongos/inbox/:id/body` | `any-builder` | `body_md` | Metic+ (task 360 / ADR 0018): idea triage (promote/discard/merge) shapes the backlog. |
270
270
  | POST | `/api/bongos/inbox/:id/ratify` | `metic+archon` | `notes_md` | V3.R31 (task 252) — Archon ratifies a criterion-proposal idea, atomically: - INSERT done_when_criteria row on the target version - UPDATE… |
271
271
  | POST | `/api/bongos/inbox/:id/resubmit` | `any-builder` | `field_values`, `template_key` | RESUBMIT a Full Idea after a rejection (R13 of goal 1000069, criterion C2: an idea never dies and never stalls). |
272
+ | POST | `/api/bongos/inbox/:id/spark` | `any-builder` | — | Mark a Quick Idea as a Big Idea Spark — "I have the spark but not the full picture, someone develop this". |
273
+ | DELETE | `/api/bongos/inbox/:id/spark` | `any-builder` | — | Withdraw the Big Idea Spark mark — the reversibility half of R144. |
272
274
  | GET | `/api/bongos/inbox/awaiting-nod` | `metic+archon` | — | GET /inbox/awaiting-nod — the NOD QUEUE (task 1003066, BV1.R05). |
275
+ | GET | `/api/bongos/inbox/sparks` | `any-builder` | — | GET /inbox/sparks — THE SPARK QUEUE (task 1002921 / BV1.R145, goal 1000062). |
273
276
 
274
277
  ## `instance` (1)
275
278
 
package/docs/file-map.md CHANGED
@@ -175,6 +175,7 @@
175
175
  │ ├── smoke-box.sh ← (#598) hermetic box-lifecycle smoke (no DB/DO/network): runs tests/boxes.mjs + tests/cf_tunnel.mjs (#771 named tunnel) + route-rank + module-load
176
176
  │ ├── recall.js ← `/recall` CLI: two-call progressive-disclosure search (summary → `--expand <id>`) over Bongos retrieval layer (ADR 0060); `node scripts/gds/recall.js <query>`
177
177
  │ ├── capture.js ← file an idea_inbox row from the CLI (the ideas.capture kernel port); backs the "capture a tangent" flow across skills
178
+ │ ├── spark.js ← (tasks 1002920 / R144 + 1002921 / R145) mark one of your OWN quick ideas as a Big Idea Spark — "someone develop this"; `--undo` withdraws it; `--list` is the SPARK QUEUE (what awaits development, readable by any builder). Author-only server-side for the mark (it is the consent); its own command because sparking acts on an EXISTING idea, which is why capture.js refuses grade='spark'
178
179
  │ ├── worktree.js ← (task 1002809) junction-safe worktree add/remove/list — outside-repo worktrees get a node_modules junction via node (no shell quoting), removed BEFORE `git worktree remove`
179
180
  │ ├── learning-capture.js ← file a `learnings` row (DB-backed short-form rule capture, replacing hand-edited recipe files for a single gotcha)
180
181
  │ ├── docs-entropy.js ← ([#…] docs-entropy) markdown-corpus linter: broken internal links + cross-file duplicate-prose detector across every tracked `.md`; `--verbose` / `--file-ideas`
@@ -408,8 +408,14 @@ function createClient(opts = {}) {
408
408
  postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
409
409
  // POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
410
410
  postInboxIdResubmit: (args) => request("POST", "/inbox/{id}/resubmit", { hasBody: true }, args),
411
+ // DELETE /inbox/{id}/spark — rank: any-builder — DELETE /inbox/:id/spark
412
+ deleteInboxIdSpark: (args) => request("DELETE", "/inbox/{id}/spark", { hasBody: false }, args),
413
+ // POST /inbox/{id}/spark — rank: any-builder — POST /inbox/:id/spark
414
+ postInboxIdSpark: (args) => request("POST", "/inbox/{id}/spark", { hasBody: true }, args),
411
415
  // GET /inbox/awaiting-nod — rank: metic+archon — GET /inbox/awaiting-nod
412
416
  getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
417
+ // GET /inbox/sparks — rank: any-builder — GET /inbox/sparks
418
+ getInboxSparks: (args) => request("GET", "/inbox/sparks", { hasBody: false }, args),
413
419
  },
414
420
  "instance": {
415
421
  // GET /instance — rank: public — GET /instance