@bongos/core 1.19.325 → 1.19.326

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.325",
6
- "core_contract": "1.19.325",
7
- "source_commit": "9a1a1c67f80e8d01c562568c4565b9c2b4fb9420",
5
+ "core_version": "1.19.326",
6
+ "core_contract": "1.19.326",
7
+ "source_commit": "e45bd1d46602e4398fd004b0f58482821d9272d2",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-24T14:28:39.280Z",
9
+ "built_at": "2026-08-24T21:08:08.576Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 324,
13
13
  "agent_docs_stubbed": 22,
14
- "functional_verbatim": 1460,
14
+ "functional_verbatim": 1464,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1806,
20
- "tree_sha256": "d455b7b84d748804468edea9e50ab188ef60da26a3538ede625b0766ca673f9b",
19
+ "file_count": 1810,
20
+ "tree_sha256": "56db7faea7aa522af7f8ce16375f10d64ccf6177d82985d1eb678f5e72cabc98",
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": "162edc8df3b6354b06337ad981f473ea798151002d6c2eda728b25c0545ea70c"
350
+ "sha256": "615510285a7e398d5f0c188fa32a8d915ecc3b8bc420fc0f0e6b476e1a819a9d"
351
351
  },
352
352
  {
353
353
  "path": "clients/bongos-client/bongos-client.global.js",
354
354
  "mode": "0000644",
355
- "sha256": "f8df65df7eaaccb15fe2a1aeda1c690e377cecc3617b408c4ff8a71f4c79edea"
355
+ "sha256": "4854a4975a05b0b7914a6c087f85c9b15130debefebde75e438fa73cc85df7d0"
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": "53dec4d0e2958ddb66fe794b74cdc0bb8823fa7d8a5da90a4c2dd731a1bb0e04"
365
+ "sha256": "482572aaeacfa0b195bcb7fa9b812c746a8304b85d4ca423674cff85bc46e71c"
366
366
  },
367
367
  {
368
368
  "path": "clients/bongos-client/index.d.ts",
369
369
  "mode": "0000644",
370
- "sha256": "356ef6ee04671774868423f5312cedd2ae194f1f4abcdcaaac01828b044c1c14"
370
+ "sha256": "ef27d2f4e7e92b3c47c8bb372dd1e4eba7358986471efab9b626597970e4d94e"
371
371
  },
372
372
  {
373
373
  "path": "clients/bongos-client/index.mjs",
374
374
  "mode": "0000644",
375
- "sha256": "f01af61309e843cf15fc8b5c4cb01e8383927890ea1734d91a2ed490424d2d77"
375
+ "sha256": "5d6cd728c907810d2a55e0c3ef1c73ed122cb2fbbd858c85654860ce42dbdf70"
376
376
  },
377
377
  {
378
378
  "path": "clients/bongos-client/package.json",
@@ -1422,12 +1422,12 @@
1422
1422
  {
1423
1423
  "path": "docs/api-reference.md",
1424
1424
  "mode": "0000644",
1425
- "sha256": "25a1978be80e817a5a9b54609aaa52dc0e172c941110183b9cfc93d193430f0b"
1425
+ "sha256": "7d9a216f5a2638037ba64868c4f6b0298417492f391c57ad38d1fa7920e6e937"
1426
1426
  },
1427
1427
  {
1428
1428
  "path": "docs/api/openapi.json",
1429
1429
  "mode": "0000644",
1430
- "sha256": "1cbc9af7fe828c5c81e6348a1a219b53ab484f9df67ec9ccb41e6f6cdef1693e"
1430
+ "sha256": "3f3d991bab5069ad0877c6a44f22de50a4f06b9d9835b9f75ce43f55e76fbf27"
1431
1431
  },
1432
1432
  {
1433
1433
  "path": "docs/architecture.md",
@@ -2497,7 +2497,7 @@
2497
2497
  {
2498
2498
  "path": "modules/builder-settings/builder-needs.js",
2499
2499
  "mode": "0000644",
2500
- "sha256": "3cb7478d9e347147e331f0954a9178a1770918067a678efdb8caef96241dfb5a"
2500
+ "sha256": "01f32e6f160ffbfde7240cfc1dd0e0bdc3501f13578e073c9397a2a0cccb793b"
2501
2501
  },
2502
2502
  {
2503
2503
  "path": "modules/builder-settings/db.js",
@@ -2827,7 +2827,7 @@
2827
2827
  {
2828
2828
  "path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
2829
2829
  "mode": "0000644",
2830
- "sha256": "53dec4d0e2958ddb66fe794b74cdc0bb8823fa7d8a5da90a4c2dd731a1bb0e04"
2830
+ "sha256": "482572aaeacfa0b195bcb7fa9b812c746a8304b85d4ca423674cff85bc46e71c"
2831
2831
  },
2832
2832
  {
2833
2833
  "path": "modules/dev-box/app/test/unit.mjs",
@@ -3944,6 +3944,11 @@
3944
3944
  "mode": "0000644",
3945
3945
  "sha256": "5fac15e501d6e5639b9e14d08ab34723b60e3569af913f4d15bb703a4e126a77"
3946
3946
  },
3947
+ {
3948
+ "path": "modules/lifecycle/help-requests.js",
3949
+ "mode": "0000644",
3950
+ "sha256": "140fce2462a0013d2d863cb9ae4ae8ca93aac8045917cb8906d1a6e52c6b2549"
3951
+ },
3947
3952
  {
3948
3953
  "path": "modules/lifecycle/hierarchy.js",
3949
3954
  "mode": "0000644",
@@ -3952,7 +3957,7 @@
3952
3957
  {
3953
3958
  "path": "modules/lifecycle/lifecycle.js",
3954
3959
  "mode": "0000644",
3955
- "sha256": "8f62f50c5a81d649df6b85ef7c89e57a0bf0e8877482693861a4f9cd5cfafe5a"
3960
+ "sha256": "07ea278ae8c0f0055d6ac332d7580af55e82fecefda2d1cf46dad1bf27678c59"
3956
3961
  },
3957
3962
  {
3958
3963
  "path": "modules/lifecycle/merge-lock.js",
@@ -3969,10 +3974,15 @@
3969
3974
  "mode": "0000644",
3970
3975
  "sha256": "b63517ec3b8c686a83c52e58a87b24a252b02e25833af9bfab1d647dcc068d62"
3971
3976
  },
3977
+ {
3978
+ "path": "modules/lifecycle/migrations/lifecycle_004_help_requests.sql",
3979
+ "mode": "0000644",
3980
+ "sha256": "d52627071dcfbf70e9bccef60803d246e49b08c22da4c374d706e1f5712fbb11"
3981
+ },
3972
3982
  {
3973
3983
  "path": "modules/lifecycle/module.json",
3974
3984
  "mode": "0000644",
3975
- "sha256": "1ccd8ce521c084ede265c318a71896b508aae0172fda2a67dd6e355c5dfefa0f"
3985
+ "sha256": "8f94f0609ee66725a31147da7ced78d4a9736ec1ee1f88daf6f3cf5df6b984c4"
3976
3986
  },
3977
3987
  {
3978
3988
  "path": "modules/lifecycle/pollers/publish-reconciler.js",
@@ -4014,6 +4024,11 @@
4014
4024
  "mode": "0000644",
4015
4025
  "sha256": "a58f01647120ce0b1143314f5edab2501bc18b8a748073dac788c92aaa0484ca"
4016
4026
  },
4027
+ {
4028
+ "path": "modules/lifecycle/routes/help-requests.js",
4029
+ "mode": "0000644",
4030
+ "sha256": "0e9430101ce99d0a84f1893d13bcf1434af13325c2ce531e693b6bce42cb9385"
4031
+ },
4017
4032
  {
4018
4033
  "path": "modules/lifecycle/routes/lifecycle.js",
4019
4034
  "mode": "0000644",
@@ -4652,12 +4667,12 @@
4652
4667
  {
4653
4668
  "path": "package-lock.json",
4654
4669
  "mode": "0000644",
4655
- "sha256": "1a460f0c695ba6d590ee9bab9b281626de4747e164ca416098658ae054843ad6"
4670
+ "sha256": "3bd132ca17ee7b22c34513aaa13a26bad931dfc74588117c6400bd2473c9a575"
4656
4671
  },
4657
4672
  {
4658
4673
  "path": "package.json",
4659
4674
  "mode": "0000644",
4660
- "sha256": "7cc398a8e7f341aee2272da252afc4abd5213349ece88962764c6bde65f27f25"
4675
+ "sha256": "6c02b85a00c26a316ccc71869f26bb4922e11b7a442afc86b76335efbb29bad6"
4661
4676
  },
4662
4677
  {
4663
4678
  "path": "public-docs/index.html",
@@ -6367,7 +6382,7 @@
6367
6382
  {
6368
6383
  "path": "src/bongos/routes/me.js",
6369
6384
  "mode": "0000644",
6370
- "sha256": "83657d8a2f8e1d81a80324350ddd983baf5346da3f88ce1f41c2211275f34440"
6385
+ "sha256": "dc32a25a531f9ea76c25df57930e0566259737bbd1c559409df61f5b5f87813e"
6371
6386
  },
6372
6387
  {
6373
6388
  "path": "src/bongos/routes/modules.js",
@@ -6437,7 +6452,7 @@
6437
6452
  {
6438
6453
  "path": "src/module-api.js",
6439
6454
  "mode": "0000644",
6440
- "sha256": "cc999c875729b68c2b78cf1f16a34184412b4d2b87b82be7b182627d313e9628"
6455
+ "sha256": "bdd8762b9a99257de8474de64cfc78cd7c38ab741847c41a370a4cb7a398de72"
6441
6456
  },
6442
6457
  {
6443
6458
  "path": "src/module-loader/catalog.js",
@@ -7709,6 +7724,11 @@
7709
7724
  "mode": "0000644",
7710
7725
  "sha256": "a86e615af8b148572abf562b3c7b0d556076286e76e2d8d576f782a90ba3d457"
7711
7726
  },
7727
+ {
7728
+ "path": "tests/help_requests.mjs",
7729
+ "mode": "0000644",
7730
+ "sha256": "19d743c063d5e35c63d33c163e3830175a129bea18ea662319997c4d416899bb"
7731
+ },
7712
7732
  {
7713
7733
  "path": "tests/helpers.mjs",
7714
7734
  "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
- - 300 operations across 47 resource groups
8
+ - 304 operations across 48 resource groups
9
9
 
10
10
  ## Install
11
11
 
@@ -394,6 +394,16 @@ function createClient(opts = {}) {
394
394
  // GET /healthz — rank: public — GET /healthz
395
395
  getHealthz: (args) => request("GET", "/healthz", { hasBody: false }, args),
396
396
  },
397
+ "helpRequests": {
398
+ // POST /help-requests — rank: any-builder — POST /help-requests
399
+ postHelpRequests: (args) => request("POST", "/help-requests", { hasBody: true }, args),
400
+ // PATCH /help-requests/{id} — rank: any-builder — PATCH /help-requests/:id
401
+ patchHelpRequestsId: (args) => request("PATCH", "/help-requests/{id}", { hasBody: true }, args),
402
+ // GET /help-requests/for-me — rank: any-builder — GET /help-requests/for-me
403
+ getHelpRequestsForMe: (args) => request("GET", "/help-requests/for-me", { hasBody: false }, args),
404
+ // GET /help-requests/mine — rank: any-builder — GET /help-requests/mine
405
+ getHelpRequestsMine: (args) => request("GET", "/help-requests/mine", { hasBody: false }, args),
406
+ },
397
407
  "inbox": {
398
408
  // GET /inbox — rank: any-builder — GET /inbox
399
409
  getInbox: (args) => request("GET", "/inbox", { hasBody: false }, args),
@@ -393,6 +393,16 @@ function createClient(opts = {}) {
393
393
  // GET /healthz — rank: public — GET /healthz
394
394
  getHealthz: (args) => request("GET", "/healthz", { hasBody: false }, args),
395
395
  },
396
+ "helpRequests": {
397
+ // POST /help-requests — rank: any-builder — POST /help-requests
398
+ postHelpRequests: (args) => request("POST", "/help-requests", { hasBody: true }, args),
399
+ // PATCH /help-requests/{id} — rank: any-builder — PATCH /help-requests/:id
400
+ patchHelpRequestsId: (args) => request("PATCH", "/help-requests/{id}", { hasBody: true }, args),
401
+ // GET /help-requests/for-me — rank: any-builder — GET /help-requests/for-me
402
+ getHelpRequestsForMe: (args) => request("GET", "/help-requests/for-me", { hasBody: false }, args),
403
+ // GET /help-requests/mine — rank: any-builder — GET /help-requests/mine
404
+ getHelpRequestsMine: (args) => request("GET", "/help-requests/mine", { hasBody: false }, args),
405
+ },
396
406
  "inbox": {
397
407
  // GET /inbox — rank: any-builder — GET /inbox
398
408
  getInbox: (args) => request("GET", "/inbox", { hasBody: false }, args),
@@ -47,6 +47,8 @@ export interface GetGovernmentPermissionsResponse { permissions: unknown; princi
47
47
  export interface GetGovernmentRanksResponse { ranks: unknown }
48
48
  export interface GetGradesByBuilderResponse { window_days: unknown; builders: unknown }
49
49
  export interface GetHealthzResponse { ok: boolean; auth_configured: unknown }
50
+ export interface GetHelpRequestsForMeResponse { help_requests: unknown; count: unknown; crafts: unknown }
51
+ export interface GetHelpRequestsMineResponse { help_requests: unknown; count: unknown }
50
52
  export interface GetInboxAwaitingNodResponse { awaiting: unknown; count: unknown }
51
53
  export interface GetInboxIdResponse { idea: unknown }
52
54
  export interface GetInboxResponse { ideas: unknown; open_count: unknown }
@@ -129,6 +131,8 @@ export interface PatchDoneWhenCriterionIdRequest { criterion_md: string }
129
131
  export interface PatchDoneWhenCriterionIdResponse { ok: boolean; criterion: unknown; deltas: unknown; unchanged: boolean }
130
132
  export interface PatchGoalsIdMembersBuilderIdRequest { membership_kind: string }
131
133
  export interface PatchGoalsIdMembersBuilderIdResponse { ok: boolean; member: unknown; changed: boolean }
134
+ export interface PatchHelpRequestsIdRequest { status: "answered" | "withdrawn" }
135
+ export interface PatchHelpRequestsIdResponse { ok: boolean; help_request: unknown }
132
136
  export interface PatchInboxIdBodyRequest { body_md: string }
133
137
  export interface PatchInboxIdBodyResponse { ok: boolean; idea: unknown; delta: unknown; unchanged: unknown }
134
138
  export interface PatchInboxIdRequest { status?: "open" | "promoted" | "discarded" | "merged"; kind?: string; promoted_to_task_id?: number; reviewed_at?: unknown; merged_into_idea_id?: number; triage_note?: string }
@@ -247,6 +251,8 @@ export interface PostGovernmentBoardItemsResponse { ok: boolean; amendment: unkn
247
251
  export interface PostGovernmentRanksRankKeyResetResponse { ok: boolean; rank_key: unknown; seeded_rank: unknown; permission_count: unknown }
248
252
  export interface PostGovernmentRanksRequest { rank_key: string; label: string; description?: string }
249
253
  export interface PostGovernmentRanksResponse { rank: unknown }
254
+ export interface PostHelpRequestsRequest { needs_craft?: string; needs_builder_id?: number; what_is_stuck: string; task_id?: number; goal_id?: number }
255
+ export interface PostHelpRequestsResponse { ok: boolean; help_request: unknown }
250
256
  export interface PostInboxIdDevelopRequest { field_values: Record<string, unknown>; template_key?: string }
251
257
  export interface PostInboxIdRatifyRequest { notes_md?: string }
252
258
  export interface PostInboxIdResubmitRequest { field_values: Record<string, unknown>; template_key?: string }
@@ -661,6 +667,16 @@ export interface BongosClient {
661
667
  /** GET /healthz — rank: public */
662
668
  getHealthz(args?: RequestArgs): Promise<GetHealthzResponse>;
663
669
  };
670
+ "helpRequests": {
671
+ /** POST /help-requests — rank: any-builder */
672
+ postHelpRequests(args: RequestArgs & { body: PostHelpRequestsRequest }): Promise<PostHelpRequestsResponse>;
673
+ /** PATCH /help-requests/{id} — rank: any-builder */
674
+ patchHelpRequestsId(args: RequestArgs & { body: PatchHelpRequestsIdRequest }): Promise<PatchHelpRequestsIdResponse>;
675
+ /** GET /help-requests/for-me — rank: any-builder */
676
+ getHelpRequestsForMe(args?: RequestArgs): Promise<GetHelpRequestsForMeResponse>;
677
+ /** GET /help-requests/mine — rank: any-builder */
678
+ getHelpRequestsMine(args?: RequestArgs): Promise<GetHelpRequestsMineResponse>;
679
+ };
664
680
  "inbox": {
665
681
  /** GET /inbox — rank: any-builder */
666
682
  getInbox(args?: RequestArgs): Promise<GetInboxResponse>;
@@ -390,6 +390,16 @@ export function createClient(opts = {}) {
390
390
  // GET /healthz — rank: public — GET /healthz
391
391
  getHealthz: (args) => request("GET", "/healthz", { hasBody: false }, args),
392
392
  },
393
+ "helpRequests": {
394
+ // POST /help-requests — rank: any-builder — POST /help-requests
395
+ postHelpRequests: (args) => request("POST", "/help-requests", { hasBody: true }, args),
396
+ // PATCH /help-requests/{id} — rank: any-builder — PATCH /help-requests/:id
397
+ patchHelpRequestsId: (args) => request("PATCH", "/help-requests/{id}", { hasBody: true }, args),
398
+ // GET /help-requests/for-me — rank: any-builder — GET /help-requests/for-me
399
+ getHelpRequestsForMe: (args) => request("GET", "/help-requests/for-me", { hasBody: false }, args),
400
+ // GET /help-requests/mine — rank: any-builder — GET /help-requests/mine
401
+ getHelpRequestsMine: (args) => request("GET", "/help-requests/mine", { hasBody: false }, args),
402
+ },
393
403
  "inbox": {
394
404
  // GET /inbox — rank: any-builder — GET /inbox
395
405
  getInbox: (args) => request("GET", "/inbox", { hasBody: false }, args),
@@ -117,6 +117,10 @@
117
117
  "name": "healthz",
118
118
  "description": "Endpoints under `/api/bongos/healthz`."
119
119
  },
120
+ {
121
+ "name": "help-requests",
122
+ "description": "Endpoints under `/api/bongos/help-requests`."
123
+ },
120
124
  {
121
125
  "name": "inbox",
122
126
  "description": "Endpoints under `/api/bongos/inbox`."
@@ -6188,6 +6192,194 @@
6188
6192
  "security": []
6189
6193
  }
6190
6194
  },
6195
+ "/help-requests": {
6196
+ "post": {
6197
+ "operationId": "post_help_requests",
6198
+ "tags": [
6199
+ "help-requests"
6200
+ ],
6201
+ "summary": "POST /help-requests",
6202
+ "description": "asking for help is not a privileged act, and gating it would exclude exactly the newcomers most likely to be stuck.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
6203
+ "x-rank": "any-builder",
6204
+ "x-source": "modules/lifecycle/routes/help-requests.js",
6205
+ "requestBody": {
6206
+ "required": true,
6207
+ "content": {
6208
+ "application/json": {
6209
+ "schema": {
6210
+ "$ref": "#/components/schemas/PostHelpRequestsRequest"
6211
+ }
6212
+ }
6213
+ },
6214
+ "x-validated": true
6215
+ },
6216
+ "responses": {
6217
+ "200": {
6218
+ "description": "Success.",
6219
+ "content": {
6220
+ "application/json": {
6221
+ "schema": {
6222
+ "$ref": "#/components/schemas/PostHelpRequestsResponse"
6223
+ }
6224
+ }
6225
+ }
6226
+ },
6227
+ "400": {
6228
+ "$ref": "#/components/responses/ValidationFailed"
6229
+ },
6230
+ "401": {
6231
+ "$ref": "#/components/responses/Unauthorized"
6232
+ },
6233
+ "403": {
6234
+ "$ref": "#/components/responses/Forbidden"
6235
+ }
6236
+ },
6237
+ "security": [
6238
+ {
6239
+ "builderSession": []
6240
+ }
6241
+ ]
6242
+ }
6243
+ },
6244
+ "/help-requests/for-me": {
6245
+ "get": {
6246
+ "operationId": "get_help_requests_for_me",
6247
+ "tags": [
6248
+ "help-requests"
6249
+ ],
6250
+ "summary": "GET /help-requests/for-me",
6251
+ "description": "The addressed read — C01's answer to \"and fires a notification\". A request is immediately visible to the person or craft it names. A true PUSH lives in the builder-needs feed (`builder-settings`), which is outside this goal's scope wall, so it is recorded as a gap rather than reached for. rank: any-builder — you only ever see what is addressed to you.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
6252
+ "x-rank": "any-builder",
6253
+ "x-source": "modules/lifecycle/routes/help-requests.js",
6254
+ "responses": {
6255
+ "200": {
6256
+ "description": "Success.",
6257
+ "content": {
6258
+ "application/json": {
6259
+ "schema": {
6260
+ "$ref": "#/components/schemas/GetHelpRequestsForMeResponse"
6261
+ }
6262
+ }
6263
+ }
6264
+ },
6265
+ "400": {
6266
+ "$ref": "#/components/responses/BadRequest"
6267
+ },
6268
+ "401": {
6269
+ "$ref": "#/components/responses/Unauthorized"
6270
+ },
6271
+ "403": {
6272
+ "$ref": "#/components/responses/Forbidden"
6273
+ }
6274
+ },
6275
+ "security": [
6276
+ {
6277
+ "builderSession": []
6278
+ }
6279
+ ]
6280
+ }
6281
+ },
6282
+ "/help-requests/mine": {
6283
+ "get": {
6284
+ "operationId": "get_help_requests_mine",
6285
+ "tags": [
6286
+ "help-requests"
6287
+ ],
6288
+ "summary": "GET /help-requests/mine",
6289
+ "description": "your own asks, so you can settle them.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
6290
+ "x-rank": "any-builder",
6291
+ "x-source": "modules/lifecycle/routes/help-requests.js",
6292
+ "responses": {
6293
+ "200": {
6294
+ "description": "Success.",
6295
+ "content": {
6296
+ "application/json": {
6297
+ "schema": {
6298
+ "$ref": "#/components/schemas/GetHelpRequestsMineResponse"
6299
+ }
6300
+ }
6301
+ }
6302
+ },
6303
+ "400": {
6304
+ "$ref": "#/components/responses/BadRequest"
6305
+ },
6306
+ "401": {
6307
+ "$ref": "#/components/responses/Unauthorized"
6308
+ },
6309
+ "403": {
6310
+ "$ref": "#/components/responses/Forbidden"
6311
+ }
6312
+ },
6313
+ "security": [
6314
+ {
6315
+ "builderSession": []
6316
+ }
6317
+ ]
6318
+ }
6319
+ },
6320
+ "/help-requests/{id}": {
6321
+ "patch": {
6322
+ "operationId": "patch_help_requests_id",
6323
+ "tags": [
6324
+ "help-requests"
6325
+ ],
6326
+ "summary": "PATCH /help-requests/:id",
6327
+ "description": "Only the ASKER settles their own request: 'answered' when someone helped, 'withdrawn' when they no longer need it. Nobody is assigned by being asked — the same consent posture ADR 0187 §3 gives task recommendations. rank: any-builder — ownership is enforced in the UPDATE's WHERE, not by rank.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
6328
+ "x-rank": "any-builder",
6329
+ "x-source": "modules/lifecycle/routes/help-requests.js",
6330
+ "parameters": [
6331
+ {
6332
+ "name": "id",
6333
+ "in": "path",
6334
+ "required": true,
6335
+ "schema": {
6336
+ "type": "string"
6337
+ },
6338
+ "description": "Path parameter `id`."
6339
+ }
6340
+ ],
6341
+ "requestBody": {
6342
+ "required": true,
6343
+ "content": {
6344
+ "application/json": {
6345
+ "schema": {
6346
+ "$ref": "#/components/schemas/PatchHelpRequestsIdRequest"
6347
+ }
6348
+ }
6349
+ },
6350
+ "x-validated": true
6351
+ },
6352
+ "responses": {
6353
+ "200": {
6354
+ "description": "Success.",
6355
+ "content": {
6356
+ "application/json": {
6357
+ "schema": {
6358
+ "$ref": "#/components/schemas/PatchHelpRequestsIdResponse"
6359
+ }
6360
+ }
6361
+ }
6362
+ },
6363
+ "400": {
6364
+ "$ref": "#/components/responses/ValidationFailed"
6365
+ },
6366
+ "401": {
6367
+ "$ref": "#/components/responses/Unauthorized"
6368
+ },
6369
+ "403": {
6370
+ "$ref": "#/components/responses/Forbidden"
6371
+ },
6372
+ "404": {
6373
+ "$ref": "#/components/responses/NotFound"
6374
+ }
6375
+ },
6376
+ "security": [
6377
+ {
6378
+ "builderSession": []
6379
+ }
6380
+ ]
6381
+ }
6382
+ },
6191
6383
  "/inbox": {
6192
6384
  "get": {
6193
6385
  "operationId": "get_inbox",
@@ -14178,6 +14370,30 @@
14178
14370
  "auth_configured"
14179
14371
  ]
14180
14372
  },
14373
+ "GetHelpRequestsForMeResponse": {
14374
+ "type": "object",
14375
+ "properties": {
14376
+ "help_requests": {},
14377
+ "count": {},
14378
+ "crafts": {}
14379
+ },
14380
+ "required": [
14381
+ "help_requests",
14382
+ "count",
14383
+ "crafts"
14384
+ ]
14385
+ },
14386
+ "GetHelpRequestsMineResponse": {
14387
+ "type": "object",
14388
+ "properties": {
14389
+ "help_requests": {},
14390
+ "count": {}
14391
+ },
14392
+ "required": [
14393
+ "help_requests",
14394
+ "count"
14395
+ ]
14396
+ },
14181
14397
  "GetInboxAwaitingNodResponse": {
14182
14398
  "type": "object",
14183
14399
  "properties": {
@@ -15235,6 +15451,35 @@
15235
15451
  "changed"
15236
15452
  ]
15237
15453
  },
15454
+ "PatchHelpRequestsIdRequest": {
15455
+ "type": "object",
15456
+ "properties": {
15457
+ "status": {
15458
+ "type": "string",
15459
+ "enum": [
15460
+ "answered",
15461
+ "withdrawn"
15462
+ ]
15463
+ }
15464
+ },
15465
+ "required": [
15466
+ "status"
15467
+ ],
15468
+ "additionalProperties": false
15469
+ },
15470
+ "PatchHelpRequestsIdResponse": {
15471
+ "type": "object",
15472
+ "properties": {
15473
+ "ok": {
15474
+ "type": "boolean"
15475
+ },
15476
+ "help_request": {}
15477
+ },
15478
+ "required": [
15479
+ "ok",
15480
+ "help_request"
15481
+ ]
15482
+ },
15238
15483
  "PatchInboxIdBodyRequest": {
15239
15484
  "type": "object",
15240
15485
  "properties": {
@@ -17153,6 +17398,48 @@
17153
17398
  "rank"
17154
17399
  ]
17155
17400
  },
17401
+ "PostHelpRequestsRequest": {
17402
+ "type": "object",
17403
+ "properties": {
17404
+ "needs_craft": {
17405
+ "type": "string",
17406
+ "maxLength": 32
17407
+ },
17408
+ "needs_builder_id": {
17409
+ "type": "integer",
17410
+ "minimum": 1
17411
+ },
17412
+ "what_is_stuck": {
17413
+ "type": "string",
17414
+ "minLength": 1
17415
+ },
17416
+ "task_id": {
17417
+ "type": "integer",
17418
+ "minimum": 1
17419
+ },
17420
+ "goal_id": {
17421
+ "type": "integer",
17422
+ "minimum": 1
17423
+ }
17424
+ },
17425
+ "required": [
17426
+ "what_is_stuck"
17427
+ ],
17428
+ "additionalProperties": false
17429
+ },
17430
+ "PostHelpRequestsResponse": {
17431
+ "type": "object",
17432
+ "properties": {
17433
+ "ok": {
17434
+ "type": "boolean"
17435
+ },
17436
+ "help_request": {}
17437
+ },
17438
+ "required": [
17439
+ "ok",
17440
+ "help_request"
17441
+ ]
17442
+ },
17156
17443
  "PostInboxIdDevelopRequest": {
17157
17444
  "type": "object",
17158
17445
  "properties": {
@@ -18956,9 +19243,9 @@
18956
19243
  "description": "A required dependency/feature is not configured or is temporarily down."
18957
19244
  }
18958
19245
  },
18959
- "x-endpoint-count": 300,
18960
- "x-schema-count": 334,
19246
+ "x-endpoint-count": 304,
19247
+ "x-schema-count": 340,
18961
19248
  "x-undocumented-bodies": 8,
18962
- "x-response-schemas": 223,
19249
+ "x-response-schemas": 227,
18963
19250
  "x-generated-by": "scripts/gds/gen-api-docs.js"
18964
19251
  }
@@ -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. 300 endpoints across 47 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 304 endpoints across 48 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,6 +258,15 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
258
258
  |---|---|---|---|---|
259
259
  | GET | `/api/bongos/healthz` | `public` | — | liveness probe; the status dashboard (status.<apex>) hits this anonymously. |
260
260
 
261
+ ## `help-requests` (4)
262
+
263
+ | Method | Path | Rank | Body | Description |
264
+ |---|---|---|---|---|
265
+ | POST | `/api/bongos/help-requests` | `any-builder` | `needs_craft`, `needs_builder_id`, `what_is_stuck`, `task_id`, `goal_id` | asking for help is not a privileged act, and gating it would exclude exactly the newcomers most likely to be stuck. |
266
+ | PATCH | `/api/bongos/help-requests/:id` | `any-builder` | `status` | Only the ASKER settles their own request: 'answered' when someone helped, 'withdrawn' when they no longer need it. |
267
+ | GET | `/api/bongos/help-requests/for-me` | `any-builder` | — | The addressed read — C01's answer to "and fires a notification". |
268
+ | GET | `/api/bongos/help-requests/mine` | `any-builder` | — | your own asks, so you can settle them. |
269
+
261
270
  ## `inbox` (14)
262
271
 
263
272
  | Method | Path | Rank | Body | Description |