@bongos/core 1.19.295 → 1.19.297
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 +37 -22
- 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 +6 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/api/openapi.json +124 -3
- package/docs/api-reference.md +4 -2
- package/docs/file-map.md +1 -1
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +4 -0
- package/modules/ideas/inbox.js +174 -2
- package/modules/ideas/migrations/ideas_005_grade_developed_by.sql +85 -0
- package/modules/ideas/routes/inbox.js +191 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/spark.js +171 -5
- package/src/module-api.js +5 -1
- package/tests/idea_develop_spark.mjs +399 -0
- package/tests/idea_spark_queue.mjs +233 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.297",
|
|
6
|
+
"core_contract": "1.19.297",
|
|
7
|
+
"source_commit": "1f1b380614ecad230b7399a63883dd4aa65a5c51",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-22T19:02:34.784Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 321,
|
|
13
13
|
"agent_docs_stubbed": 22,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1400,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1743,
|
|
20
|
+
"tree_sha256": "39da631b7c0c17d3b63eb793e9e7b624bf55dbe877a2bdd2a568608076258bf7",
|
|
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": "
|
|
350
|
+
"sha256": "6e44e5da05194cc5aae1784d591d5f560dc36527939eda359de794e3d29fdb37"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "b05f34f719999b987f9ea6dcecec7bed016a0486ffb43a2ba95fcabbbe7457db"
|
|
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": "
|
|
365
|
+
"sha256": "5fbf0ea8c5b9eba86cc1d471407d8f4bb1df23af72d4fe7a618576bf67233a14"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "db6c391a39f2caea99486c5f03993b0cc52e3506835d750a28a4a0b2108bb441"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/index.mjs",
|
|
374
374
|
"mode": "0000644",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "5ef5dcc11f3713394c6a6225c4206ef8955b27b17c95a47fd51ca43b7965729f"
|
|
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": "
|
|
1415
|
+
"sha256": "0c2b5d0fd5e05cbe3b3c06ab10baf7e6af0414d85599519e3ef2eb289008b672"
|
|
1416
1416
|
},
|
|
1417
1417
|
{
|
|
1418
1418
|
"path": "docs/api/openapi.json",
|
|
1419
1419
|
"mode": "0000644",
|
|
1420
|
-
"sha256": "
|
|
1420
|
+
"sha256": "ef7e4fbdb912b077c49b15e7ba0dd6333196fe0d82d4462a83c507669fd82767"
|
|
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": "
|
|
1555
|
+
"sha256": "b017e7a4425f92cc5cbec8d0a5fc192e3225794fb97955acb3689b12dc0de667"
|
|
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": "
|
|
2810
|
+
"sha256": "5fbf0ea8c5b9eba86cc1d471407d8f4bb1df23af72d4fe7a618576bf67233a14"
|
|
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": "
|
|
3710
|
+
"sha256": "ceaa172a8e0338dd9202dae6abea8a5278594937bd980ddaf9ac2b2017b555a4"
|
|
3711
3711
|
},
|
|
3712
3712
|
{
|
|
3713
3713
|
"path": "modules/ideas/migrations/ideas_001_grades.sql",
|
|
@@ -3729,6 +3729,11 @@
|
|
|
3729
3729
|
"mode": "0000644",
|
|
3730
3730
|
"sha256": "eb1393f0ee8dccc57efcfe0acd0fdac7857389b74e0cb734042bb4293768b8e8"
|
|
3731
3731
|
},
|
|
3732
|
+
{
|
|
3733
|
+
"path": "modules/ideas/migrations/ideas_005_grade_developed_by.sql",
|
|
3734
|
+
"mode": "0000644",
|
|
3735
|
+
"sha256": "3c7a48505c922bd0742888bc9c0598d776a4de0cc3d2745bd08d6452e07f34b9"
|
|
3736
|
+
},
|
|
3732
3737
|
{
|
|
3733
3738
|
"path": "modules/ideas/module.json",
|
|
3734
3739
|
"mode": "0000644",
|
|
@@ -3742,7 +3747,7 @@
|
|
|
3742
3747
|
{
|
|
3743
3748
|
"path": "modules/ideas/routes/inbox.js",
|
|
3744
3749
|
"mode": "0000644",
|
|
3745
|
-
"sha256": "
|
|
3750
|
+
"sha256": "eafc7ff6f4d9567813cefe2b47333caa4ab79b77ab979e77eb65ac88102a78f1"
|
|
3746
3751
|
},
|
|
3747
3752
|
{
|
|
3748
3753
|
"path": "modules/ideas/routing.js",
|
|
@@ -4537,12 +4542,12 @@
|
|
|
4537
4542
|
{
|
|
4538
4543
|
"path": "package-lock.json",
|
|
4539
4544
|
"mode": "0000644",
|
|
4540
|
-
"sha256": "
|
|
4545
|
+
"sha256": "9fea7a7292ec0de1ea5fea27ec984796c150ed75f0e94e30eca8837f55cbcee6"
|
|
4541
4546
|
},
|
|
4542
4547
|
{
|
|
4543
4548
|
"path": "package.json",
|
|
4544
4549
|
"mode": "0000644",
|
|
4545
|
-
"sha256": "
|
|
4550
|
+
"sha256": "8b60b6155a3fd2c2d0110df0404319a6a5da35eeed3ee8d60f61ae009672ed35"
|
|
4546
4551
|
},
|
|
4547
4552
|
{
|
|
4548
4553
|
"path": "public-docs/index.html",
|
|
@@ -5782,7 +5787,7 @@
|
|
|
5782
5787
|
{
|
|
5783
5788
|
"path": "scripts/gds/spark.js",
|
|
5784
5789
|
"mode": "0000755",
|
|
5785
|
-
"sha256": "
|
|
5790
|
+
"sha256": "dfd5aa72caa26eb2c8cf3063e1b4f51e1f4bcd7fddcdd93d243279c130850628"
|
|
5786
5791
|
},
|
|
5787
5792
|
{
|
|
5788
5793
|
"path": "scripts/gds/start.js",
|
|
@@ -6197,7 +6202,7 @@
|
|
|
6197
6202
|
{
|
|
6198
6203
|
"path": "src/module-api.js",
|
|
6199
6204
|
"mode": "0000644",
|
|
6200
|
-
"sha256": "
|
|
6205
|
+
"sha256": "2bfcc90c50b5fd0945b97179e4445602f145896dd1821066cabcd411a8d7a9d9"
|
|
6201
6206
|
},
|
|
6202
6207
|
{
|
|
6203
6208
|
"path": "src/module-loader/catalog.js",
|
|
@@ -7484,6 +7489,11 @@
|
|
|
7484
7489
|
"mode": "0000644",
|
|
7485
7490
|
"sha256": "7e2024b3f1fa79a6bdec55b134be6337d4867df0a77fedb205f32b783a3d6193"
|
|
7486
7491
|
},
|
|
7492
|
+
{
|
|
7493
|
+
"path": "tests/idea_develop_spark.mjs",
|
|
7494
|
+
"mode": "0000644",
|
|
7495
|
+
"sha256": "03d2f692eaa02e85a5f53e89527d4ea1a20c032d4801e2a7acd421eda12ce76c"
|
|
7496
|
+
},
|
|
7487
7497
|
{
|
|
7488
7498
|
"path": "tests/idea_full_capture.mjs",
|
|
7489
7499
|
"mode": "0000644",
|
|
@@ -7519,6 +7529,11 @@
|
|
|
7519
7529
|
"mode": "0000644",
|
|
7520
7530
|
"sha256": "fb5af0aa1b34116114a1c734c548cafaa52eefda57bd145c0008995bc69addee"
|
|
7521
7531
|
},
|
|
7532
|
+
{
|
|
7533
|
+
"path": "tests/idea_spark_queue.mjs",
|
|
7534
|
+
"mode": "0000644",
|
|
7535
|
+
"sha256": "43f801610e37062c54e631904aecaa10aa2486139aba3aa9eeb820d84fd32368"
|
|
7536
|
+
},
|
|
7522
7537
|
{
|
|
7523
7538
|
"path": "tests/idea_task_lineage.mjs",
|
|
7524
7539
|
"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
|
-
-
|
|
8
|
+
- 298 operations across 47 resource groups
|
|
9
9
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
@@ -405,6 +405,8 @@ function createClient(opts = {}) {
|
|
|
405
405
|
patchInboxId: (args) => request("PATCH", "/inbox/{id}", { hasBody: true }, args),
|
|
406
406
|
// PATCH /inbox/{id}/body — rank: any-builder — PATCH /inbox/:id/body
|
|
407
407
|
patchInboxIdBody: (args) => request("PATCH", "/inbox/{id}/body", { hasBody: true }, args),
|
|
408
|
+
// POST /inbox/{id}/develop — rank: any-builder — POST /inbox/:id/develop
|
|
409
|
+
postInboxIdDevelop: (args) => request("POST", "/inbox/{id}/develop", { hasBody: true }, args),
|
|
408
410
|
// POST /inbox/{id}/ratify — rank: metic+archon — POST /inbox/:id/ratify
|
|
409
411
|
postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
|
|
410
412
|
// POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
|
|
@@ -415,6 +417,8 @@ function createClient(opts = {}) {
|
|
|
415
417
|
postInboxIdSpark: (args) => request("POST", "/inbox/{id}/spark", { hasBody: true }, args),
|
|
416
418
|
// GET /inbox/awaiting-nod — rank: metic+archon — GET /inbox/awaiting-nod
|
|
417
419
|
getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
|
|
420
|
+
// GET /inbox/sparks — rank: any-builder — GET /inbox/sparks
|
|
421
|
+
getInboxSparks: (args) => request("GET", "/inbox/sparks", { hasBody: false }, args),
|
|
418
422
|
},
|
|
419
423
|
"instance": {
|
|
420
424
|
// GET /instance — rank: public — GET /instance
|
|
@@ -404,6 +404,8 @@ function createClient(opts = {}) {
|
|
|
404
404
|
patchInboxId: (args) => request("PATCH", "/inbox/{id}", { hasBody: true }, args),
|
|
405
405
|
// PATCH /inbox/{id}/body — rank: any-builder — PATCH /inbox/:id/body
|
|
406
406
|
patchInboxIdBody: (args) => request("PATCH", "/inbox/{id}/body", { hasBody: true }, args),
|
|
407
|
+
// POST /inbox/{id}/develop — rank: any-builder — POST /inbox/:id/develop
|
|
408
|
+
postInboxIdDevelop: (args) => request("POST", "/inbox/{id}/develop", { hasBody: true }, args),
|
|
407
409
|
// POST /inbox/{id}/ratify — rank: metic+archon — POST /inbox/:id/ratify
|
|
408
410
|
postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
|
|
409
411
|
// POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
|
|
@@ -414,6 +416,8 @@ function createClient(opts = {}) {
|
|
|
414
416
|
postInboxIdSpark: (args) => request("POST", "/inbox/{id}/spark", { hasBody: true }, args),
|
|
415
417
|
// GET /inbox/awaiting-nod — rank: metic+archon — GET /inbox/awaiting-nod
|
|
416
418
|
getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
|
|
419
|
+
// GET /inbox/sparks — rank: any-builder — GET /inbox/sparks
|
|
420
|
+
getInboxSparks: (args) => request("GET", "/inbox/sparks", { hasBody: false }, args),
|
|
417
421
|
},
|
|
418
422
|
"instance": {
|
|
419
423
|
// GET /instance — rank: public — GET /instance
|
|
@@ -50,6 +50,7 @@ export interface GetHealthzResponse { ok: boolean; auth_configured: unknown }
|
|
|
50
50
|
export interface GetInboxAwaitingNodResponse { awaiting: unknown; count: unknown }
|
|
51
51
|
export interface GetInboxIdResponse { idea: unknown }
|
|
52
52
|
export interface GetInboxResponse { ideas: unknown; open_count: unknown }
|
|
53
|
+
export interface GetInboxSparksResponse { sparks: unknown; count: unknown }
|
|
53
54
|
export interface GetLeaderboardResponse { leaderboard: unknown; page: unknown }
|
|
54
55
|
export interface GetLearningsResponse { learnings: unknown }
|
|
55
56
|
export interface GetMeAchievementsResponse { unlocked: unknown }
|
|
@@ -245,6 +246,7 @@ export interface PostGovernmentBoardItemsResponse { ok: boolean; amendment: unkn
|
|
|
245
246
|
export interface PostGovernmentRanksRankKeyResetResponse { ok: boolean; rank_key: unknown; seeded_rank: unknown; permission_count: unknown }
|
|
246
247
|
export interface PostGovernmentRanksRequest { rank_key: string; label: string; description?: string }
|
|
247
248
|
export interface PostGovernmentRanksResponse { rank: unknown }
|
|
249
|
+
export interface PostInboxIdDevelopRequest { field_values: Record<string, unknown>; template_key?: string }
|
|
248
250
|
export interface PostInboxIdRatifyRequest { notes_md?: string }
|
|
249
251
|
export interface PostInboxIdResubmitRequest { field_values: Record<string, unknown>; template_key?: string }
|
|
250
252
|
export interface PostInboxIdSparkResponse { idea: unknown; sparked: boolean; unchanged: boolean }
|
|
@@ -667,6 +669,8 @@ export interface BongosClient {
|
|
|
667
669
|
patchInboxId(args?: RequestArgs & { body?: PatchInboxIdRequest }): Promise<PatchInboxIdResponse>;
|
|
668
670
|
/** PATCH /inbox/{id}/body — rank: any-builder */
|
|
669
671
|
patchInboxIdBody(args: RequestArgs & { body: PatchInboxIdBodyRequest }): Promise<PatchInboxIdBodyResponse>;
|
|
672
|
+
/** POST /inbox/{id}/develop — rank: any-builder */
|
|
673
|
+
postInboxIdDevelop(args: RequestArgs & { body: PostInboxIdDevelopRequest }): Promise<ApiResponse>;
|
|
670
674
|
/** POST /inbox/{id}/ratify — rank: metic+archon */
|
|
671
675
|
postInboxIdRatify(args?: RequestArgs & { body?: PostInboxIdRatifyRequest }): Promise<ApiResponse>;
|
|
672
676
|
/** POST /inbox/{id}/resubmit — rank: any-builder */
|
|
@@ -677,6 +681,8 @@ export interface BongosClient {
|
|
|
677
681
|
postInboxIdSpark(args?: RequestArgs): Promise<PostInboxIdSparkResponse>;
|
|
678
682
|
/** GET /inbox/awaiting-nod — rank: metic+archon */
|
|
679
683
|
getInboxAwaitingNod(args?: RequestArgs): Promise<GetInboxAwaitingNodResponse>;
|
|
684
|
+
/** GET /inbox/sparks — rank: any-builder */
|
|
685
|
+
getInboxSparks(args?: RequestArgs): Promise<GetInboxSparksResponse>;
|
|
680
686
|
};
|
|
681
687
|
"instance": {
|
|
682
688
|
/** GET /instance — rank: public */
|
|
@@ -401,6 +401,8 @@ export function createClient(opts = {}) {
|
|
|
401
401
|
patchInboxId: (args) => request("PATCH", "/inbox/{id}", { hasBody: true }, args),
|
|
402
402
|
// PATCH /inbox/{id}/body — rank: any-builder — PATCH /inbox/:id/body
|
|
403
403
|
patchInboxIdBody: (args) => request("PATCH", "/inbox/{id}/body", { hasBody: true }, args),
|
|
404
|
+
// POST /inbox/{id}/develop — rank: any-builder — POST /inbox/:id/develop
|
|
405
|
+
postInboxIdDevelop: (args) => request("POST", "/inbox/{id}/develop", { hasBody: true }, args),
|
|
404
406
|
// POST /inbox/{id}/ratify — rank: metic+archon — POST /inbox/:id/ratify
|
|
405
407
|
postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
|
|
406
408
|
// POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
|
|
@@ -411,6 +413,8 @@ export function createClient(opts = {}) {
|
|
|
411
413
|
postInboxIdSpark: (args) => request("POST", "/inbox/{id}/spark", { hasBody: true }, args),
|
|
412
414
|
// GET /inbox/awaiting-nod — rank: metic+archon — GET /inbox/awaiting-nod
|
|
413
415
|
getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
|
|
416
|
+
// GET /inbox/sparks — rank: any-builder — GET /inbox/sparks
|
|
417
|
+
getInboxSparks: (args) => request("GET", "/inbox/sparks", { hasBody: false }, args),
|
|
414
418
|
},
|
|
415
419
|
"instance": {
|
|
416
420
|
// GET /instance — rank: public — GET /instance
|
package/docs/api/openapi.json
CHANGED
|
@@ -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",
|
|
@@ -6486,6 +6524,62 @@
|
|
|
6486
6524
|
]
|
|
6487
6525
|
}
|
|
6488
6526
|
},
|
|
6527
|
+
"/inbox/{id}/develop": {
|
|
6528
|
+
"post": {
|
|
6529
|
+
"operationId": "post_inbox_id_develop",
|
|
6530
|
+
"tags": [
|
|
6531
|
+
"inbox"
|
|
6532
|
+
],
|
|
6533
|
+
"summary": "POST /inbox/:id/develop",
|
|
6534
|
+
"description": "POST /inbox/:id/develop — DEVELOP A SPARK INTO A FULL IDEA (task 1002922 / BV1.R146, goal 1000062). The pickup half of the handoff R144 and R145 set up: the author consented by marking the spark, the queue made it findable, and now another builder fills in the five template fields and the thought becomes a Full Idea. OPEN TO ANY BUILDER, INCLUDING THE AUTHOR. Cross-builder development is the entire point, so there is no author check here — the mirror image of R144, where the gate was the whole feature. The consent was already given and is already recorded (this row is a spark BECAUSE its author said so), and re-asking for it would make the queue unpickable. Self-development is likewise legal: an author may mark a thought and come back to it themselves. ONLY A SPARK CAN BE DEVELOPED, and \"only once\" is enforced by the DATABASE, not by this handler. developSpark's UPDATE carries `AND grade = 'spark'`, so two builders picking the same spark off the queue at the same instant cannot both succeed — the second matches zero rows. The pre-read below exists ONLY to tell a 404 apart from a 409 and to give a useful message; it is not the guard, and it deliberately does not try to be. WHAT THIS ROUTE DELIBERATELY DOES NOT DO: pay the stream-2 \"Full Idea passed\" credit. Capture and resubmit both fire it, but on those paths the recipient is unambiguously the author. Here there are two people, and choosing between them is R147's job (task 1002923 — \"karma for a ratified Full Idea, scaled by completeness and SPLIT WITH THE SPARK AUTHOR\"). Firing it here would not just pre-empt that decision, it would corrupt it: awardIdeaFullPassCredit's idempotency predicate is (builder_id, `idea.credit.full_pass:<id>`), so a payment to the DEVELOPER does not block a later payment to the AUTHOR — one idea would pay twice. The credit is idempotent per idea+builder, so R147 can still pay it at the right time, to the right people, in the right shares. The board window IS opened, because it is recipient-agnostic (it takes an idea and a score, not a builder) and without it a developed Full Idea could never reach ratification — the handoff would dead-end one step from done. Fail-open like every other caller of that port. rank: any-builder — development is the pickup, and the author's mark is the consent. Deliberately NOT pinned in route-rank-check: there is no gate here to protect, and pinning it would only assert that an open route stays open.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
6535
|
+
"x-rank": "any-builder",
|
|
6536
|
+
"x-source": "modules/ideas/routes/inbox.js",
|
|
6537
|
+
"parameters": [
|
|
6538
|
+
{
|
|
6539
|
+
"name": "id",
|
|
6540
|
+
"in": "path",
|
|
6541
|
+
"required": true,
|
|
6542
|
+
"schema": {
|
|
6543
|
+
"type": "string"
|
|
6544
|
+
},
|
|
6545
|
+
"description": "Path parameter `id`."
|
|
6546
|
+
}
|
|
6547
|
+
],
|
|
6548
|
+
"requestBody": {
|
|
6549
|
+
"required": true,
|
|
6550
|
+
"content": {
|
|
6551
|
+
"application/json": {
|
|
6552
|
+
"schema": {
|
|
6553
|
+
"$ref": "#/components/schemas/PostInboxIdDevelopRequest"
|
|
6554
|
+
}
|
|
6555
|
+
}
|
|
6556
|
+
},
|
|
6557
|
+
"x-validated": true
|
|
6558
|
+
},
|
|
6559
|
+
"responses": {
|
|
6560
|
+
"200": {
|
|
6561
|
+
"description": "Success."
|
|
6562
|
+
},
|
|
6563
|
+
"400": {
|
|
6564
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
6565
|
+
},
|
|
6566
|
+
"401": {
|
|
6567
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
6568
|
+
},
|
|
6569
|
+
"403": {
|
|
6570
|
+
"$ref": "#/components/responses/Forbidden"
|
|
6571
|
+
},
|
|
6572
|
+
"404": {
|
|
6573
|
+
"$ref": "#/components/responses/NotFound"
|
|
6574
|
+
}
|
|
6575
|
+
},
|
|
6576
|
+
"security": [
|
|
6577
|
+
{
|
|
6578
|
+
"builderSession": []
|
|
6579
|
+
}
|
|
6580
|
+
]
|
|
6581
|
+
}
|
|
6582
|
+
},
|
|
6489
6583
|
"/inbox/{id}/ratify": {
|
|
6490
6584
|
"post": {
|
|
6491
6585
|
"operationId": "post_inbox_id_ratify",
|
|
@@ -14028,6 +14122,17 @@
|
|
|
14028
14122
|
"open_count"
|
|
14029
14123
|
]
|
|
14030
14124
|
},
|
|
14125
|
+
"GetInboxSparksResponse": {
|
|
14126
|
+
"type": "object",
|
|
14127
|
+
"properties": {
|
|
14128
|
+
"sparks": {},
|
|
14129
|
+
"count": {}
|
|
14130
|
+
},
|
|
14131
|
+
"required": [
|
|
14132
|
+
"sparks",
|
|
14133
|
+
"count"
|
|
14134
|
+
]
|
|
14135
|
+
},
|
|
14031
14136
|
"GetLeaderboardResponse": {
|
|
14032
14137
|
"type": "object",
|
|
14033
14138
|
"properties": {
|
|
@@ -16948,6 +17053,22 @@
|
|
|
16948
17053
|
"rank"
|
|
16949
17054
|
]
|
|
16950
17055
|
},
|
|
17056
|
+
"PostInboxIdDevelopRequest": {
|
|
17057
|
+
"type": "object",
|
|
17058
|
+
"properties": {
|
|
17059
|
+
"field_values": {
|
|
17060
|
+
"type": "object"
|
|
17061
|
+
},
|
|
17062
|
+
"template_key": {
|
|
17063
|
+
"type": "string",
|
|
17064
|
+
"maxLength": 64
|
|
17065
|
+
}
|
|
17066
|
+
},
|
|
17067
|
+
"required": [
|
|
17068
|
+
"field_values"
|
|
17069
|
+
],
|
|
17070
|
+
"additionalProperties": false
|
|
17071
|
+
},
|
|
16951
17072
|
"PostInboxIdRatifyRequest": {
|
|
16952
17073
|
"type": "object",
|
|
16953
17074
|
"properties": {
|
|
@@ -18707,9 +18828,9 @@
|
|
|
18707
18828
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
18708
18829
|
}
|
|
18709
18830
|
},
|
|
18710
|
-
"x-endpoint-count":
|
|
18711
|
-
"x-schema-count":
|
|
18831
|
+
"x-endpoint-count": 298,
|
|
18832
|
+
"x-schema-count": 331,
|
|
18712
18833
|
"x-undocumented-bodies": 8,
|
|
18713
|
-
"x-response-schemas":
|
|
18834
|
+
"x-response-schemas": 221,
|
|
18714
18835
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
18715
18836
|
}
|
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. 298 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` (
|
|
261
|
+
## `inbox` (12)
|
|
262
262
|
|
|
263
263
|
| Method | Path | Rank | Body | Description |
|
|
264
264
|
|---|---|---|---|---|
|
|
@@ -267,11 +267,13 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
267
267
|
| GET | `/api/bongos/inbox/:id` | `any-builder` | — | single idea read for the "#NNN" deep-link resolver (task 1047). |
|
|
268
268
|
| PATCH | `/api/bongos/inbox/:id` | `metic+archon` | `status`, `kind`, `promoted_to_task_id`, `reviewed_at`, `merged_into_idea_id`, `triage_note` | |
|
|
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
|
+
| POST | `/api/bongos/inbox/:id/develop` | `any-builder` | `field_values`, `template_key` | POST /inbox/:id/develop — DEVELOP A SPARK INTO A FULL IDEA (task 1002922 / BV1.R146, goal 1000062). |
|
|
270
271
|
| 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
272
|
| 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
273
|
| 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
274
|
| DELETE | `/api/bongos/inbox/:id/spark` | `any-builder` | — | Withdraw the Big Idea Spark mark — the reversibility half of R144. |
|
|
274
275
|
| GET | `/api/bongos/inbox/awaiting-nod` | `metic+archon` | — | GET /inbox/awaiting-nod — the NOD QUEUE (task 1003066, BV1.R05). |
|
|
276
|
+
| GET | `/api/bongos/inbox/sparks` | `any-builder` | — | GET /inbox/sparks — THE SPARK QUEUE (task 1002921 / BV1.R145, goal 1000062). |
|
|
275
277
|
|
|
276
278
|
## `instance` (1)
|
|
277
279
|
|
package/docs/file-map.md
CHANGED
|
@@ -175,7 +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 ← (
|
|
178
|
+
│ ├── spark.js ← (tasks 1002920 / R144 + 1002921 / R145 + 1002922 / R146) the whole spark handoff from the terminal: mark one of your OWN quick ideas as a Big Idea Spark (`--undo` withdraws it), `--list` is the SPARK QUEUE, `--template` prints the five Full Idea fields, `--develop <id> --fields-file <json>` is the PICKUP (any builder; author + developer both recorded). 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'
|
|
179
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`
|
|
180
180
|
│ ├── learning-capture.js ← file a `learnings` row (DB-backed short-form rule capture, replacing hand-edited recipe files for a single gotcha)
|
|
181
181
|
│ ├── docs-entropy.js ← ([#…] docs-entropy) markdown-corpus linter: broken internal links + cross-file duplicate-prose detector across every tracked `.md`; `--verbose` / `--file-ideas`
|
|
@@ -404,6 +404,8 @@ function createClient(opts = {}) {
|
|
|
404
404
|
patchInboxId: (args) => request("PATCH", "/inbox/{id}", { hasBody: true }, args),
|
|
405
405
|
// PATCH /inbox/{id}/body — rank: any-builder — PATCH /inbox/:id/body
|
|
406
406
|
patchInboxIdBody: (args) => request("PATCH", "/inbox/{id}/body", { hasBody: true }, args),
|
|
407
|
+
// POST /inbox/{id}/develop — rank: any-builder — POST /inbox/:id/develop
|
|
408
|
+
postInboxIdDevelop: (args) => request("POST", "/inbox/{id}/develop", { hasBody: true }, args),
|
|
407
409
|
// POST /inbox/{id}/ratify — rank: metic+archon — POST /inbox/:id/ratify
|
|
408
410
|
postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
|
|
409
411
|
// POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
|
|
@@ -414,6 +416,8 @@ function createClient(opts = {}) {
|
|
|
414
416
|
postInboxIdSpark: (args) => request("POST", "/inbox/{id}/spark", { hasBody: true }, args),
|
|
415
417
|
// GET /inbox/awaiting-nod — rank: metic+archon — GET /inbox/awaiting-nod
|
|
416
418
|
getInboxAwaitingNod: (args) => request("GET", "/inbox/awaiting-nod", { hasBody: false }, args),
|
|
419
|
+
// GET /inbox/sparks — rank: any-builder — GET /inbox/sparks
|
|
420
|
+
getInboxSparks: (args) => request("GET", "/inbox/sparks", { hasBody: false }, args),
|
|
417
421
|
},
|
|
418
422
|
"instance": {
|
|
419
423
|
// GET /instance — rank: public — GET /instance
|