@bongos/core 1.19.366 → 1.19.368
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 +57 -27
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +8 -0
- package/clients/bongos-client/index.cjs +8 -0
- package/clients/bongos-client/index.d.ts +9 -1
- package/clients/bongos-client/index.mjs +8 -0
- package/docs/adr/0192-a-category-orients-and-authorises-nothing.md +97 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +117 -1
- package/docs/api-reference.md +11 -3
- package/migrations/core_226_work_categories.sql +100 -0
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +8 -0
- package/modules/lifecycle/db-goals.js +5 -5
- package/modules/lifecycle/goal-category.js +273 -0
- package/modules/lifecycle/routes/goals.js +38 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/category-advisory-guard.js +153 -0
- package/scripts/gds/fitness.js +6 -1
- package/scripts/gds/redteam-patrol.js +48 -8
- package/src/bongos/route-rank-check.js +11 -0
- package/src/module-api.js +5 -1
- package/tests/category_advisory_guard.mjs +135 -0
- package/tests/goal_category.mjs +199 -0
- package/tests/goal_tier.mjs +7 -5
- package/tests/redteam_patrol.mjs +70 -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.368",
|
|
6
|
+
"core_contract": "1.19.368",
|
|
7
|
+
"source_commit": "17b78f620a5cdc6f01af878404e8b11ebd9b2f77",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-25T21:47:56.330Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 332,
|
|
13
13
|
"agent_docs_stubbed": 22,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1541,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1895,
|
|
20
|
+
"tree_sha256": "f3b82bb092f3f91eea0a51d84cc52e1b31042d4e9ae32a5a54972a00e9816c39",
|
|
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": "fc26e581e9ba06ec9fd798e982539f0bd8dc4c27a5f6c248b395f62214daaf78"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "e50696e5b7b9c1abab280665dd57ab6f8f8883d3bfd0f2701a45ee7d9a6fb728"
|
|
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": "b13e62181adbc47a9ba6d3349a4abcb63fca123f3b0202414a1f7a2ba5e7d088"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "f918564f73e753583651a8d963824c981cd82dc02d1e0d809d245e541219513e"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/index.mjs",
|
|
374
374
|
"mode": "0000644",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "d4f2e6c3b376c35679416efcd30bbe54bae396cbaa8ee1e4078c56b6175da3d4"
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
"path": "clients/bongos-client/package.json",
|
|
@@ -1449,20 +1449,25 @@
|
|
|
1449
1449
|
"mode": "0000644",
|
|
1450
1450
|
"sha256": "0ae7f6a69d9006c54210cea4f6a846445a6181f148bcb4de979011b46cca5188"
|
|
1451
1451
|
},
|
|
1452
|
+
{
|
|
1453
|
+
"path": "docs/adr/0192-a-category-orients-and-authorises-nothing.md",
|
|
1454
|
+
"mode": "0000644",
|
|
1455
|
+
"sha256": "4cb1023731d70965f544bfcde1a9bfa3165e2bc96e0825c7e2c3b5a02c464a63"
|
|
1456
|
+
},
|
|
1452
1457
|
{
|
|
1453
1458
|
"path": "docs/adr/README.md",
|
|
1454
1459
|
"mode": "0000644",
|
|
1455
|
-
"sha256": "
|
|
1460
|
+
"sha256": "804999c67653b53c81b68d97fe8be11137c6f19fb3048899d847844095467b11"
|
|
1456
1461
|
},
|
|
1457
1462
|
{
|
|
1458
1463
|
"path": "docs/api-reference.md",
|
|
1459
1464
|
"mode": "0000644",
|
|
1460
|
-
"sha256": "
|
|
1465
|
+
"sha256": "544b25f700d89d7f51dd84cb4faa740bc1c9bb4bf52853470e7d645040215033"
|
|
1461
1466
|
},
|
|
1462
1467
|
{
|
|
1463
1468
|
"path": "docs/api/openapi.json",
|
|
1464
1469
|
"mode": "0000644",
|
|
1465
|
-
"sha256": "
|
|
1470
|
+
"sha256": "ada26795f34a9ce26711b788abc87bf277c475aa14ee7bb1f92e9376f1e50cc8"
|
|
1466
1471
|
},
|
|
1467
1472
|
{
|
|
1468
1473
|
"path": "docs/architecture.md",
|
|
@@ -2509,6 +2514,11 @@
|
|
|
2509
2514
|
"mode": "0000644",
|
|
2510
2515
|
"sha256": "1913405bdb9de48ac3ca7ad6705cf44244d20c77d3a6f73700f88e717fb84043"
|
|
2511
2516
|
},
|
|
2517
|
+
{
|
|
2518
|
+
"path": "migrations/core_226_work_categories.sql",
|
|
2519
|
+
"mode": "0000644",
|
|
2520
|
+
"sha256": "322578d3d22b87eb07c4b9b4b521c66b0c986a937c3657d0b90123f73867461d"
|
|
2521
|
+
},
|
|
2512
2522
|
{
|
|
2513
2523
|
"path": "modules/agents/migrations/agents_001_definitions.sql",
|
|
2514
2524
|
"mode": "0000644",
|
|
@@ -2887,7 +2897,7 @@
|
|
|
2887
2897
|
{
|
|
2888
2898
|
"path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
|
|
2889
2899
|
"mode": "0000644",
|
|
2890
|
-
"sha256": "
|
|
2900
|
+
"sha256": "b13e62181adbc47a9ba6d3349a4abcb63fca123f3b0202414a1f7a2ba5e7d088"
|
|
2891
2901
|
},
|
|
2892
2902
|
{
|
|
2893
2903
|
"path": "modules/dev-box/app/test/unit.mjs",
|
|
@@ -4007,7 +4017,7 @@
|
|
|
4007
4017
|
{
|
|
4008
4018
|
"path": "modules/lifecycle/db-goals.js",
|
|
4009
4019
|
"mode": "0000644",
|
|
4010
|
-
"sha256": "
|
|
4020
|
+
"sha256": "85a87c86496a9f022983a61e7f3642c8f0029c0b07467e27109095a6b98fce61"
|
|
4011
4021
|
},
|
|
4012
4022
|
{
|
|
4013
4023
|
"path": "modules/lifecycle/db-grade.js",
|
|
@@ -4079,6 +4089,11 @@
|
|
|
4079
4089
|
"mode": "0000644",
|
|
4080
4090
|
"sha256": "3eb9d818e0e0d45a896a5c0a515842b5f5a01e102d02f8a9a605c271088c8e5d"
|
|
4081
4091
|
},
|
|
4092
|
+
{
|
|
4093
|
+
"path": "modules/lifecycle/goal-category.js",
|
|
4094
|
+
"mode": "0000644",
|
|
4095
|
+
"sha256": "6bc1bc0152900b49d79a6c09560020dc96ff5fae6c78d7dbb84d72dfed1953d2"
|
|
4096
|
+
},
|
|
4082
4097
|
{
|
|
4083
4098
|
"path": "modules/lifecycle/goal-conflicts.js",
|
|
4084
4099
|
"mode": "0000644",
|
|
@@ -4187,7 +4202,7 @@
|
|
|
4187
4202
|
{
|
|
4188
4203
|
"path": "modules/lifecycle/routes/goals.js",
|
|
4189
4204
|
"mode": "0000644",
|
|
4190
|
-
"sha256": "
|
|
4205
|
+
"sha256": "5e01d0da935758aa24c8f13d2f4e97d9f561c2b1044b326fb4184c5dbc4bf6fb"
|
|
4191
4206
|
},
|
|
4192
4207
|
{
|
|
4193
4208
|
"path": "modules/lifecycle/routes/help-requests.js",
|
|
@@ -4877,12 +4892,12 @@
|
|
|
4877
4892
|
{
|
|
4878
4893
|
"path": "package-lock.json",
|
|
4879
4894
|
"mode": "0000644",
|
|
4880
|
-
"sha256": "
|
|
4895
|
+
"sha256": "a58b49638d9cbd5aa528a08b7435d6be48d636cb2574e7ed9b84b11850b296dd"
|
|
4881
4896
|
},
|
|
4882
4897
|
{
|
|
4883
4898
|
"path": "package.json",
|
|
4884
4899
|
"mode": "0000644",
|
|
4885
|
-
"sha256": "
|
|
4900
|
+
"sha256": "225e8f6b5b696a25599e723f18cfb3d8da8382a8be2a85be2429b090445ce178"
|
|
4886
4901
|
},
|
|
4887
4902
|
{
|
|
4888
4903
|
"path": "public-docs/index.html",
|
|
@@ -5349,6 +5364,11 @@
|
|
|
5349
5364
|
"mode": "0000644",
|
|
5350
5365
|
"sha256": "946fa97d020eb481b7da559f0b5c99bfa16dc24b680a01e0ff3d3faeaf5bd701"
|
|
5351
5366
|
},
|
|
5367
|
+
{
|
|
5368
|
+
"path": "scripts/gds/category-advisory-guard.js",
|
|
5369
|
+
"mode": "0000644",
|
|
5370
|
+
"sha256": "008fc7268a1e58b7e87b5454d0ca698e25cba3229172031587e934fe73fc33da"
|
|
5371
|
+
},
|
|
5352
5372
|
{
|
|
5353
5373
|
"path": "scripts/gds/cf-tunnel.js",
|
|
5354
5374
|
"mode": "0000644",
|
|
@@ -5572,7 +5592,7 @@
|
|
|
5572
5592
|
{
|
|
5573
5593
|
"path": "scripts/gds/fitness.js",
|
|
5574
5594
|
"mode": "0000644",
|
|
5575
|
-
"sha256": "
|
|
5595
|
+
"sha256": "95f116e70ba6d6e890705ff862a5c5011002c42a58ba60553c50ec2d656dcf3b"
|
|
5576
5596
|
},
|
|
5577
5597
|
{
|
|
5578
5598
|
"path": "scripts/gds/gate-review.js",
|
|
@@ -5952,7 +5972,7 @@
|
|
|
5952
5972
|
{
|
|
5953
5973
|
"path": "scripts/gds/redteam-patrol.js",
|
|
5954
5974
|
"mode": "0000644",
|
|
5955
|
-
"sha256": "
|
|
5975
|
+
"sha256": "34e2a56646ad7b8f72c63ee3f8c6319ce523c3ee390d89740bf44d27190d2005"
|
|
5956
5976
|
},
|
|
5957
5977
|
{
|
|
5958
5978
|
"path": "scripts/gds/regen-instance-docs.js",
|
|
@@ -6622,7 +6642,7 @@
|
|
|
6622
6642
|
{
|
|
6623
6643
|
"path": "src/bongos/route-rank-check.js",
|
|
6624
6644
|
"mode": "0000644",
|
|
6625
|
-
"sha256": "
|
|
6645
|
+
"sha256": "b387d8af3a47e209139f40437c5cd855f58d4e37871869efb23069d575ddd041"
|
|
6626
6646
|
},
|
|
6627
6647
|
{
|
|
6628
6648
|
"path": "src/bongos/routes.js",
|
|
@@ -6757,7 +6777,7 @@
|
|
|
6757
6777
|
{
|
|
6758
6778
|
"path": "src/module-api.js",
|
|
6759
6779
|
"mode": "0000644",
|
|
6760
|
-
"sha256": "
|
|
6780
|
+
"sha256": "c66c224c5bf1755a79ce4bcb6da90bfb72079ae5195b0b8758be067602329ab7"
|
|
6761
6781
|
},
|
|
6762
6782
|
{
|
|
6763
6783
|
"path": "src/module-loader/catalog.js",
|
|
@@ -7194,6 +7214,11 @@
|
|
|
7194
7214
|
"mode": "0000644",
|
|
7195
7215
|
"sha256": "de9d8f8c1daab1e48122febd16699ac519890b6e1296edb7966d835434851786"
|
|
7196
7216
|
},
|
|
7217
|
+
{
|
|
7218
|
+
"path": "tests/category_advisory_guard.mjs",
|
|
7219
|
+
"mode": "0000644",
|
|
7220
|
+
"sha256": "8fd7b066c264ddaeccaa2dfa9a3c1fe6204a943933a1161c6a235f45b40ab121"
|
|
7221
|
+
},
|
|
7197
7222
|
{
|
|
7198
7223
|
"path": "tests/cf_ruleset_preflight.mjs",
|
|
7199
7224
|
"mode": "0000644",
|
|
@@ -7719,6 +7744,11 @@
|
|
|
7719
7744
|
"mode": "0000644",
|
|
7720
7745
|
"sha256": "7488d41a0d962f681f9482e4c06f518f38be824e8fa936b5bd7b1c1b70838c3d"
|
|
7721
7746
|
},
|
|
7747
|
+
{
|
|
7748
|
+
"path": "tests/goal_category.mjs",
|
|
7749
|
+
"mode": "0000644",
|
|
7750
|
+
"sha256": "19e6987712231ac54e58c4b6658d12bb7df3d6681344bf358c38c1655243f058"
|
|
7751
|
+
},
|
|
7722
7752
|
{
|
|
7723
7753
|
"path": "tests/goal_cli.mjs",
|
|
7724
7754
|
"mode": "0000644",
|
|
@@ -7777,7 +7807,7 @@
|
|
|
7777
7807
|
{
|
|
7778
7808
|
"path": "tests/goal_tier.mjs",
|
|
7779
7809
|
"mode": "0000644",
|
|
7780
|
-
"sha256": "
|
|
7810
|
+
"sha256": "7d8c1b8300c99be22b42ff25e8ce25e25b5af28cd29c314f9aee7ddee11fc0d5"
|
|
7781
7811
|
},
|
|
7782
7812
|
{
|
|
7783
7813
|
"path": "tests/goal_wall_proof.mjs",
|
|
@@ -8832,7 +8862,7 @@
|
|
|
8832
8862
|
{
|
|
8833
8863
|
"path": "tests/redteam_patrol.mjs",
|
|
8834
8864
|
"mode": "0000644",
|
|
8835
|
-
"sha256": "
|
|
8865
|
+
"sha256": "6dac9970bfdc8e5fd3940dc956b94963bc8ecdc345820de831078af614cf875f"
|
|
8836
8866
|
},
|
|
8837
8867
|
{
|
|
8838
8868
|
"path": "tests/regrade_eligibility.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
|
-
-
|
|
8
|
+
- 318 operations across 52 resource groups
|
|
9
9
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
@@ -323,6 +323,8 @@ function createClient(opts = {}) {
|
|
|
323
323
|
patchGoalsId: (args) => request("PATCH", "/goals/{id}", { hasBody: true }, args),
|
|
324
324
|
// POST /goals/{id}/archive — rank: metic+archon — POST /goals/:id/archive
|
|
325
325
|
postGoalsIdArchive: (args) => request("POST", "/goals/{id}/archive", { hasBody: true }, args),
|
|
326
|
+
// PATCH /goals/{id}/category — rank: any-builder — PATCH /goals/:id/category
|
|
327
|
+
patchGoalsIdCategory: (args) => request("PATCH", "/goals/{id}/category", { hasBody: true }, args),
|
|
326
328
|
// GET /goals/{id}/conflicts — rank: any-builder — GET /goals/:id/conflicts
|
|
327
329
|
getGoalsIdConflicts: (args) => request("GET", "/goals/{id}/conflicts", { hasBody: false }, args),
|
|
328
330
|
// POST /goals/{id}/conflicts/resolve — rank: any-builder — POST /goals/:id/conflicts/resolve
|
|
@@ -816,6 +818,12 @@ function createClient(opts = {}) {
|
|
|
816
818
|
// GET /versions/progress — rank: public — GET /versions/progress
|
|
817
819
|
getVersionsProgress: (args) => request("GET", "/versions/progress", { hasBody: false }, args),
|
|
818
820
|
},
|
|
821
|
+
"workCategories": {
|
|
822
|
+
// GET /work-categories — rank: any-builder — GET /work-categories
|
|
823
|
+
getWorkCategories: (args) => request("GET", "/work-categories", { hasBody: false }, args),
|
|
824
|
+
// POST /work-categories — rank: metic+archon — POST /work-categories
|
|
825
|
+
postWorkCategories: (args) => request("POST", "/work-categories", { hasBody: true }, args),
|
|
826
|
+
},
|
|
819
827
|
};
|
|
820
828
|
}
|
|
821
829
|
|
|
@@ -322,6 +322,8 @@ function createClient(opts = {}) {
|
|
|
322
322
|
patchGoalsId: (args) => request("PATCH", "/goals/{id}", { hasBody: true }, args),
|
|
323
323
|
// POST /goals/{id}/archive — rank: metic+archon — POST /goals/:id/archive
|
|
324
324
|
postGoalsIdArchive: (args) => request("POST", "/goals/{id}/archive", { hasBody: true }, args),
|
|
325
|
+
// PATCH /goals/{id}/category — rank: any-builder — PATCH /goals/:id/category
|
|
326
|
+
patchGoalsIdCategory: (args) => request("PATCH", "/goals/{id}/category", { hasBody: true }, args),
|
|
325
327
|
// GET /goals/{id}/conflicts — rank: any-builder — GET /goals/:id/conflicts
|
|
326
328
|
getGoalsIdConflicts: (args) => request("GET", "/goals/{id}/conflicts", { hasBody: false }, args),
|
|
327
329
|
// POST /goals/{id}/conflicts/resolve — rank: any-builder — POST /goals/:id/conflicts/resolve
|
|
@@ -815,6 +817,12 @@ function createClient(opts = {}) {
|
|
|
815
817
|
// GET /versions/progress — rank: public — GET /versions/progress
|
|
816
818
|
getVersionsProgress: (args) => request("GET", "/versions/progress", { hasBody: false }, args),
|
|
817
819
|
},
|
|
820
|
+
"workCategories": {
|
|
821
|
+
// GET /work-categories — rank: any-builder — GET /work-categories
|
|
822
|
+
getWorkCategories: (args) => request("GET", "/work-categories", { hasBody: false }, args),
|
|
823
|
+
// POST /work-categories — rank: metic+archon — POST /work-categories
|
|
824
|
+
postWorkCategories: (args) => request("POST", "/work-categories", { hasBody: true }, args),
|
|
825
|
+
},
|
|
818
826
|
};
|
|
819
827
|
}
|
|
820
828
|
|
|
@@ -251,7 +251,7 @@ export interface PostGoalsIdTransferRequest { builder_id?: StringifiableId }
|
|
|
251
251
|
export interface PostGoalsIdTransferResponse { ok: boolean; goal: unknown; changed: boolean }
|
|
252
252
|
export interface PostGoalsReorderRequest { version_id: string; ordered_ids: number[] }
|
|
253
253
|
export interface PostGoalsReorderResponse { ok: boolean; goals: unknown }
|
|
254
|
-
export interface PostGoalsRequest { version_id: string; title: string; subtitle?: string; description?: string; scope_modules?: string[]; succeeds_goal_id?: number }
|
|
254
|
+
export interface PostGoalsRequest { version_id: string; title: string; subtitle?: string; description?: string; scope_modules?: string[]; succeeds_goal_id?: number; category_id?: number }
|
|
255
255
|
export interface PostGoalsResponse { ok: boolean; goal: unknown; succeeds_goal_id: unknown }
|
|
256
256
|
export interface PostGovernmentAssignmentsRequest { builder_id: number; rank_key: string }
|
|
257
257
|
export interface PostGovernmentBoardItemsItemIdVotesRequest { direction: string; reason_md?: string; section_key?: string }
|
|
@@ -609,6 +609,8 @@ export interface BongosClient {
|
|
|
609
609
|
patchGoalsId(args?: RequestArgs): Promise<ApiResponse>;
|
|
610
610
|
/** POST /goals/{id}/archive — rank: metic+archon */
|
|
611
611
|
postGoalsIdArchive(args?: RequestArgs): Promise<PostGoalsIdArchiveResponse>;
|
|
612
|
+
/** PATCH /goals/{id}/category — rank: any-builder */
|
|
613
|
+
patchGoalsIdCategory(args?: RequestArgs): Promise<ApiResponse>;
|
|
612
614
|
/** GET /goals/{id}/conflicts — rank: any-builder */
|
|
613
615
|
getGoalsIdConflicts(args?: RequestArgs): Promise<GetGoalsIdConflictsResponse>;
|
|
614
616
|
/** POST /goals/{id}/conflicts/resolve — rank: any-builder */
|
|
@@ -1102,6 +1104,12 @@ export interface BongosClient {
|
|
|
1102
1104
|
/** GET /versions/progress — rank: public */
|
|
1103
1105
|
getVersionsProgress(args?: RequestArgs): Promise<GetVersionsProgressResponse>;
|
|
1104
1106
|
};
|
|
1107
|
+
"workCategories": {
|
|
1108
|
+
/** GET /work-categories — rank: any-builder */
|
|
1109
|
+
getWorkCategories(args?: RequestArgs): Promise<ApiResponse>;
|
|
1110
|
+
/** POST /work-categories — rank: metic+archon */
|
|
1111
|
+
postWorkCategories(args?: RequestArgs): Promise<ApiResponse>;
|
|
1112
|
+
};
|
|
1105
1113
|
}
|
|
1106
1114
|
export declare function createClient(opts?: ClientOptions): BongosClient;
|
|
1107
1115
|
export default createClient;
|
|
@@ -319,6 +319,8 @@ export function createClient(opts = {}) {
|
|
|
319
319
|
patchGoalsId: (args) => request("PATCH", "/goals/{id}", { hasBody: true }, args),
|
|
320
320
|
// POST /goals/{id}/archive — rank: metic+archon — POST /goals/:id/archive
|
|
321
321
|
postGoalsIdArchive: (args) => request("POST", "/goals/{id}/archive", { hasBody: true }, args),
|
|
322
|
+
// PATCH /goals/{id}/category — rank: any-builder — PATCH /goals/:id/category
|
|
323
|
+
patchGoalsIdCategory: (args) => request("PATCH", "/goals/{id}/category", { hasBody: true }, args),
|
|
322
324
|
// GET /goals/{id}/conflicts — rank: any-builder — GET /goals/:id/conflicts
|
|
323
325
|
getGoalsIdConflicts: (args) => request("GET", "/goals/{id}/conflicts", { hasBody: false }, args),
|
|
324
326
|
// POST /goals/{id}/conflicts/resolve — rank: any-builder — POST /goals/:id/conflicts/resolve
|
|
@@ -812,6 +814,12 @@ export function createClient(opts = {}) {
|
|
|
812
814
|
// GET /versions/progress — rank: public — GET /versions/progress
|
|
813
815
|
getVersionsProgress: (args) => request("GET", "/versions/progress", { hasBody: false }, args),
|
|
814
816
|
},
|
|
817
|
+
"workCategories": {
|
|
818
|
+
// GET /work-categories — rank: any-builder — GET /work-categories
|
|
819
|
+
getWorkCategories: (args) => request("GET", "/work-categories", { hasBody: false }, args),
|
|
820
|
+
// POST /work-categories — rank: metic+archon — POST /work-categories
|
|
821
|
+
postWorkCategories: (args) => request("POST", "/work-categories", { hasBody: true }, args),
|
|
822
|
+
},
|
|
815
823
|
};
|
|
816
824
|
}
|
|
817
825
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# 0192 — A work category orients a human and authorises nothing
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-08-25
|
|
5
|
+
- **Tasks:** [#1003275](https://cloudbongos.com/builders#/task/1003275) (this decision + the storage/API), with the hall surfaces in [#1003276](https://cloudbongos.com/builders#/task/1003276) and the assignment path in [#1003277](https://cloudbongos.com/builders#/task/1003277).
|
|
6
|
+
- **Goal:** [#1000072](https://cloudbongos.com/builders#/goal/1000072) — Human legibility, criterion `legibility-categories`.
|
|
7
|
+
- **Constrains, does not amend:** [ADR 0086](<redacted>.md) — the real work hierarchy. This decision adds a label *beside* that hierarchy and forbids it from behaving like part of it.
|
|
8
|
+
|
|
9
|
+
## 1. The problem
|
|
10
|
+
|
|
11
|
+
A person scanning the goal board cannot tell at a glance which goals are about
|
|
12
|
+
money, which are about the walls, and which are about the hall. Each goal's own
|
|
13
|
+
words say so — but only if you read all thirty-eight of them. The owner asked for
|
|
14
|
+
one word per goal that answers it, and named the set: Builders Hall, Context
|
|
15
|
+
Management, Government (Decision Making), Modules, Security, Economics, Legal,
|
|
16
|
+
User/ABI Experience.
|
|
17
|
+
|
|
18
|
+
That is the easy half. The hard half is the constraint the owner attached to it,
|
|
19
|
+
twice: this organisation "has no hierarchical purpose", and these categories have
|
|
20
|
+
"no effect on the creation and agentic management of these elements".
|
|
21
|
+
|
|
22
|
+
## 2. Why the constraint needs a decision record and not a comment
|
|
23
|
+
|
|
24
|
+
The system **already has** a hierarchy — Project → Version → Goal → Criteria →
|
|
25
|
+
Task ([ADR 0086](<redacted>.md)) — and that one is
|
|
26
|
+
load-bearing: the `scope_modules` wall, per-task rank floors, and goal membership
|
|
27
|
+
all refuse real work. Goal 1000072's own prose predicts what happens next: *"A
|
|
28
|
+
second thing that LOOKS like a hierarchy will be mistaken for one within a
|
|
29
|
+
release."*
|
|
30
|
+
|
|
31
|
+
The mistake does not arrive as a decision anybody announces. It arrives as one
|
|
32
|
+
plausible line inside a gate — *skip Legal goals in the claimable feed*, *require
|
|
33
|
+
Archon for Security ones* — and from that moment work is refused because of a
|
|
34
|
+
label nobody meant as a permission. Nothing in a comment can refuse that line.
|
|
35
|
+
|
|
36
|
+
## 3. Decision
|
|
37
|
+
|
|
38
|
+
**A category is advisory. It orients a human and steers Claude; it authorises
|
|
39
|
+
nothing.**
|
|
40
|
+
|
|
41
|
+
Concretely:
|
|
42
|
+
|
|
43
|
+
1. **No decision surface reads it.** Not authority, not claim eligibility, not the
|
|
44
|
+
claimable feed, not dependency satisfaction. Enforced by a fitness check,
|
|
45
|
+
`scripts/gds/category-advisory-guard.js`, which scans every such file with
|
|
46
|
+
comments stripped — so a gate may *cite* this rule but may never branch on it.
|
|
47
|
+
2. **The guard cannot pass vacuously.** It also asserts the category surface still
|
|
48
|
+
exists (migration, module, route). A guard whose subject was renamed away
|
|
49
|
+
passes silently and reads as proof — the assurance-of-assurance finding from
|
|
50
|
+
the [ADR 0022](0022-secrets-policy.md) audit that produced
|
|
51
|
+
`control-manifest.js`.
|
|
52
|
+
3. **Uncategorised is a legal state.** `goals.category_id` is nullable with no
|
|
53
|
+
default, and no write requires it. The criterion is explicit that Claude
|
|
54
|
+
failing to place a goal is *"a designed prompt, not an error"*: the human is
|
|
55
|
+
asked to name a new category, and asking is not refusing.
|
|
56
|
+
4. **A task stores no category.** It inherits its goal's through `tasks.goal_id`.
|
|
57
|
+
The criterion's own wording is "every goal (and task, **by inheritance**)", and
|
|
58
|
+
a stored copy would be a second answer to one question with no way to know
|
|
59
|
+
which is right.
|
|
60
|
+
5. **The set is data, not an enum.** A runtime-extensible set cannot be a `CHECK`
|
|
61
|
+
constraint or a pg enum without a migration per addition — and it must not be a
|
|
62
|
+
free-text column, or two spellings of "Security" stop it being a set at all.
|
|
63
|
+
Retiring is `active = false`, never a `DELETE`, so a goal already carrying a
|
|
64
|
+
category keeps rendering its label.
|
|
65
|
+
6. **The rank pins are a tripwire.** `GET /work-categories` is any-builder (a
|
|
66
|
+
vocabulary a client cannot read is a vocabulary a client hard-codes),
|
|
67
|
+
`POST /work-categories` sits at the same permission as authoring a goal
|
|
68
|
+
(extending the project's words is a planning act), and
|
|
69
|
+
`PATCH /goals/:id/category` rides the same owner|manager|Archon in-handler gate
|
|
70
|
+
as the prose edit. If one of these ever needs a *wider* gate than its
|
|
71
|
+
neighbours, that is the signal the label has grown into a permission.
|
|
72
|
+
|
|
73
|
+
## 4. What was deliberately not built
|
|
74
|
+
|
|
75
|
+
- **No per-category page or filtered navigation view.** A chip is a label; a
|
|
76
|
+
drill-down destination is a tier. Building the destination is how an advisory
|
|
77
|
+
label becomes the second hierarchy in practice regardless of what the code
|
|
78
|
+
gates on.
|
|
79
|
+
- **No category on a task, no category-scoped permissions, no category-ordered
|
|
80
|
+
work feed.**
|
|
81
|
+
|
|
82
|
+
## 5. If this ever needs to change
|
|
83
|
+
|
|
84
|
+
Making a category gate something is an **owner decision** and needs its own ADR
|
|
85
|
+
before the guard is relaxed. The guard's failure message says so, because the
|
|
86
|
+
person who trips it is the person who needs to read it.
|
|
87
|
+
|
|
88
|
+
## 6. Consequences
|
|
89
|
+
|
|
90
|
+
- A human can scan the goal board by kind, which is the whole point of goal
|
|
91
|
+
1000072.
|
|
92
|
+
- One more fitness check to maintain, and a `GATE_FILES` list that must grow when
|
|
93
|
+
a new decision surface lands. That maintenance *is* the mechanism — a new gate
|
|
94
|
+
either gets added to the list or is not a gate.
|
|
95
|
+
- The false-positive posture is deliberate: the scanner errs toward keeping text
|
|
96
|
+
when comment-stripping is ambiguous, because a guard that fails loudly is safer
|
|
97
|
+
than one that fails quietly.
|
package/docs/adr/README.md
CHANGED
|
@@ -268,5 +268,6 @@ This keeps the decision history honest and traceable.
|
|
|
268
268
|
| 0190 | [**A changed project setting reaches a running instance by an in-place env patch and a restart — never a template re-write** ([task 1003140](https://cloudbongos.com/builders#/task/1003140), goal 1000058). Task 1003139 made a NEW instance read `platform_visibility` / `joinability` from the web.env the runner writes; a RUNNING instance loads its branding pack once, memoized and deep-frozen for the process lifetime, so a changed value could not reach it at all — the settings were write-only state on the platform. Decision: `PATCH /provisioning/instances/:id/settings` writes the platform row first, then for an ACTIVE instance on a shape the runner can reach enqueues a `settings-apply` intent (migration provisioning_010); the control-plane runner reads the instance's web.env as it stands, upserts ONLY the two settings lines (`upsertEnvVars`), and RESTARTS the service. The in-place patch is the load-bearing choice: the natural move — re-running `webEnvBody` as domain-attach does — regenerates the file from the row, and the row does not know the OAuth client secret or the App private key that `placeManifestCreds` placed later, so a template re-write silently blanks sign-in on the very instance the owner just touched. `SETTINGS_APPLY_FROM = {active}` because a pre-active instance gets the same values at standup and a torn-down one has nothing to restart (the provision intent cannot stand in — it excludes `active`, task 1002691); `SETTINGS_APPLY_SHAPES = {co-tenant, standalone}` because a dedicated droplet has no post-hoc exec path, and a push that cannot land is refused at the route AND the runner rather than reported. The response is a receipt, not a claim: it says the restart is coming and that the instance keeps its current setting until then, and the read-back lives on the instance's own public `GET /instance` manifest, whose `brand.project` now carries the resolved policy (`clientBranding` allow-list widened deliberately). Rejected: the template re-write; re-provisioning as the push; skipping the restart (impossible while the pack is memoized); claiming the new state on PATCH return.](<redacted>.md) | provisioning / settings channel |
|
|
269
269
|
|
|
270
270
|
| 0191 | [**Majority, and an author who may vote but never decide alone** ([task 1003273](https://cloudbongos.com/builders#/task/1003273); diagnosis and companion in [task 1003271](https://cloudbongos.com/builders#/task/1003271)). Supersedes ADR 0175 §3's pass-rule set and §§7/11's flat anti-self rule. The owner reported voting as broken; nothing was broken. Nine items sat open under `first_ratifier` with four archons active — any one of three non-authors could have ratified any of them in a click — but every item was authored by the one person looking at them, and ADR 0175's anti-self rule was enforced by rendering NO BALLOT, so from the owner's seat the feature did not exist. The lesson: a rule enforced by removing the control is indistinguishable from a broken feature. Two decisions. (1) `majority` joins PASS_RULES: strictly more than half of the resolved MEMBERSHIP must vote yes — of the membership, not of the votes cast, so low turnout cannot quietly pass things; a tie is not a majority. The three rules are NOT a ladder of strictness, they differ on WHAT SILENCE MEANS — `first_ratifier` and `consent` pass an unvoted item, `majority` returns it — which is the axis that matters and now the comment in config.js. (2) An author MAY vote and may NEVER DECIDE ALONE: the rule moved from refusing the cast to the two places something is actually decided — `shouldCloseAfterVote` needs a non-author vote under every rule, and the majority tally needs a non-author YES. Their yes still counts toward the numerator; their `no` is excluded from the objection test (else silence would be an author's safest act); a self-cast earns no karma. The ADR 0175 §7 amendment carve-out survives as the author rule's SCOPE, not an exception: `authorRuleApplies` is full_idea-only, so a sole Archon still ratifies their own amendment. Also records why the CLOCK is a consequence of majority and not an independent fix — `tallyOutcome` passes on ZERO votes, so adding a deadline under `first_ratifier` would have closed all nine items as ratified-unread, paying karma and credits on ideas nobody read; `BOARD_DEFAULTS.window_minutes` therefore stays `null` in the neutral core. States the cost plainly: three affirmative votes are needed on a four-member board, and a solo instance still cannot ratify its own ideas. Discord stays outbound-only (ADR 0175 §8 re-affirmed).](<redacted>.md) | government / board room |
|
|
271
|
+
| 0192 | [**A work category orients a human and authorises nothing** ([task 1003275](https://cloudbongos.com/builders#/task/1003275), goal 1000072, criterion `legibility-categories`). A goal gains a human CATEGORY from an owner-named set of eight (Builders Hall, Context Management, Government (Decision Making), Modules, Security, Economics, Legal, User/ABI Experience) so a person scanning the board can tell at a glance which goals are about money, which about the walls, which about the hall — today each goal's own words say so, but only if you read all thirty-eight. The DECISION is the constraint, not the feature: the owner said twice that this organisation has no hierarchical purpose and no effect on the agentic management of the work, and the system ALREADY has a load-bearing hierarchy (ADR 0086 — the scope_modules wall, rank floors, goal membership). The goal's own prose predicts the failure: a second thing that looks like a hierarchy gets mistaken for one within a release, and the mistake arrives as ONE plausible line in a gate ('skip Legal goals in the feed'), after which work is refused because of a label nobody meant as a permission. So: no authority, claim-eligibility, feed or dependency surface may read a category — enforced by the `scripts/gds/category-advisory-guard.js` fitness check, which scans every decision surface with comments stripped (a gate may CITE the rule, never branch on it) AND asserts the feature still exists, so a renamed-away subject fails loudly instead of passing vacuously (the ADR 0022 assurance-of-assurance finding). Uncategorised is LEGAL — nullable, no default, required by no write — because the criterion is explicit that Claude failing to place a goal is a designed prompt, not an error. A task stores no category and INHERITS its goal's through `tasks.goal_id`; a stored copy would be a second answer to one question. The set is a table, not an enum (runtime-extensible without a migration per addition) and retiring is `active = false`, never a DELETE, so a goal keeps rendering a label someone tidied away. The three route-rank pins are a tripwire: if one ever needs a WIDER gate than its neighbours, the label has grown into a permission. Deliberately NOT built: a per-category page or filtered navigation view — a chip is a label, a drill-down destination is a tier. Making a category gate anything is an owner decision and needs its own ADR first.](<redacted>.md) | GDS / goals |
|
|
271
272
|
|
|
272
273
|
> ⚠️ **Numbering collision (known):** two ADRs share `0008`. The numbers were assigned in parallel sessions before the lock could be enforced. The files are kept under their existing filenames to preserve git history, but the table disambiguates them as `0008-a` / `0008-b`. New ADRs should resume at `0040` to avoid further collisions. (`0024` is also a real on-disk duplicate: the cloneable-repo/local-first-memory ADR and the multi-agent-system-architecture ADR were both numbered `0024` in parallel; both keep their filenames, disambiguated as `0024-a` / `0024-b` like `0008`. Likewise `0025` ended up with two on-disk files — the offsite-backup ADR and the structured-criterion↔task-link ADR — both kept under their existing filenames and disambiguated as `0025-a` / `0025-b`; separately, the BFG ADR had also claimed `0025` on 2026-05-30 and yielded to `0026`. A third happened 2026-06-06: `0036` was claimed in parallel by the builders-subdomain ADR ([#726](https://example.com/builders#/task/726)) and this Discord-channels ADR ([#727](https://example.com/builders#/task/727)); the Discord-channels ADR yielded to `0037`. A fourth landed 2026-06-10: `0044` was claimed in parallel by the palette-replacement ADR and the per-box game-preview ADR ([#897](https://example.com/builders#/task/897)); both keep their filenames, disambiguated as `0044-a` / `0044-b` like `0008`. A fifth was caught pre-land 2026-06-13: `0050` was claimed in parallel by the device-flow-admission ADR ([#1000](https://example.com/builders#/task/1000)) and the sandbox-for-everyone ADR ([#1001](https://example.com/builders#/task/1001)); the latter yielded to `0052` before merging, so there is no `0050` duplicate. A sixth was caught pre-land 2026-06-21: the tool-agnostic-design-layer ADR ([#1375](https://example.com/builders#/task/1375)) first collided at `0079` with the value-gated-autonomous-engagement ADR, then at `0080` with the llm-cache-api-transport ADR (both part of the 0075–0080 LLM-cost-reduction series, landed on `main` in parallel); it yielded to `0081` before merging, so there is no `0079`/`0080` design-layer duplicate. A seventh landed 2026-06-23: `0084` was claimed in parallel by the auto-derived-per-task-rank-floor ADR and the remove-default-spend-cap ADR (task 1499); the rank-floor ADR landed on `main` first, so the spend-cap ADR yielded to `0085`, leaving no `0084` duplicate. An eighth landed 2026-06-27: `0095` was claimed in parallel by the borrowed-memory-and-retrieval-concepts ADR (PR #459, landed first) and the cross-agent-context-management ADR ([#1651](https://example.com/builders#/task/1651), PR #460); both keep their filenames, disambiguated as `0095-a` / `0095-b` like `0008`. These two are companions — `0095-a` adopts the memory/retrieval concepts and explicitly defers the grep-vs-semantic question to `0095-b`.)
|
package/docs/api/openapi.json
CHANGED
|
@@ -224,6 +224,10 @@
|
|
|
224
224
|
{
|
|
225
225
|
"name": "versions",
|
|
226
226
|
"description": "Endpoints under `/api/bongos/versions`."
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"name": "work-categories",
|
|
230
|
+
"description": "Endpoints under `/api/bongos/work-categories`."
|
|
227
231
|
}
|
|
228
232
|
],
|
|
229
233
|
"paths": {
|
|
@@ -4553,6 +4557,51 @@
|
|
|
4553
4557
|
]
|
|
4554
4558
|
}
|
|
4555
4559
|
},
|
|
4560
|
+
"/goals/{id}/category": {
|
|
4561
|
+
"patch": {
|
|
4562
|
+
"operationId": "patch_goals_id_category",
|
|
4563
|
+
"tags": [
|
|
4564
|
+
"goals"
|
|
4565
|
+
],
|
|
4566
|
+
"summary": "PATCH /goals/:id/category",
|
|
4567
|
+
"description": "PATCH /goals/:id/category — body { category_id } (null clears it). Separate from PATCH /goals/:id because that route is the PROSE edit with its write-once posture and before/after audit delta; a label is neither. rank: any-builder (requireBuilder) + the in-handler owner|manager|Archon gate.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
4568
|
+
"x-rank": "any-builder",
|
|
4569
|
+
"x-source": "modules/lifecycle/routes/goals.js",
|
|
4570
|
+
"parameters": [
|
|
4571
|
+
{
|
|
4572
|
+
"name": "id",
|
|
4573
|
+
"in": "path",
|
|
4574
|
+
"required": true,
|
|
4575
|
+
"schema": {
|
|
4576
|
+
"type": "string"
|
|
4577
|
+
},
|
|
4578
|
+
"description": "Path parameter `id`."
|
|
4579
|
+
}
|
|
4580
|
+
],
|
|
4581
|
+
"responses": {
|
|
4582
|
+
"200": {
|
|
4583
|
+
"description": "Success."
|
|
4584
|
+
},
|
|
4585
|
+
"400": {
|
|
4586
|
+
"$ref": "#/components/responses/BadRequest"
|
|
4587
|
+
},
|
|
4588
|
+
"401": {
|
|
4589
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
4590
|
+
},
|
|
4591
|
+
"403": {
|
|
4592
|
+
"$ref": "#/components/responses/Forbidden"
|
|
4593
|
+
},
|
|
4594
|
+
"404": {
|
|
4595
|
+
"$ref": "#/components/responses/NotFound"
|
|
4596
|
+
}
|
|
4597
|
+
},
|
|
4598
|
+
"security": [
|
|
4599
|
+
{
|
|
4600
|
+
"builderSession": []
|
|
4601
|
+
}
|
|
4602
|
+
]
|
|
4603
|
+
}
|
|
4604
|
+
},
|
|
4556
4605
|
"/goals/{id}/conflicts": {
|
|
4557
4606
|
"get": {
|
|
4558
4607
|
"operationId": "get_goals_id_conflicts",
|
|
@@ -14324,6 +14373,69 @@
|
|
|
14324
14373
|
},
|
|
14325
14374
|
"security": []
|
|
14326
14375
|
}
|
|
14376
|
+
},
|
|
14377
|
+
"/work-categories": {
|
|
14378
|
+
"get": {
|
|
14379
|
+
"operationId": "get_work_categories",
|
|
14380
|
+
"tags": [
|
|
14381
|
+
"work-categories"
|
|
14382
|
+
],
|
|
14383
|
+
"summary": "GET /work-categories",
|
|
14384
|
+
"description": "---- the ADVISORY human category (task 1003275, criterion legibility-categories) ---- A category ORIENTS a person and steers Claude; it authorises nothing. Nothing in this file, in claim eligibility, or in the claimable feed may branch on it — scripts/gds/category-advisory-guard.js fails the build if that changes (ADR 0192). GET /work-categories — the project's set. rank: any-builder; it is a vocabulary, and a client that cannot read it hard-codes the labels instead.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
14385
|
+
"x-rank": "any-builder",
|
|
14386
|
+
"x-source": "modules/lifecycle/routes/goals.js",
|
|
14387
|
+
"responses": {
|
|
14388
|
+
"200": {
|
|
14389
|
+
"description": "Success."
|
|
14390
|
+
},
|
|
14391
|
+
"400": {
|
|
14392
|
+
"$ref": "#/components/responses/BadRequest"
|
|
14393
|
+
},
|
|
14394
|
+
"401": {
|
|
14395
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
14396
|
+
},
|
|
14397
|
+
"403": {
|
|
14398
|
+
"$ref": "#/components/responses/Forbidden"
|
|
14399
|
+
}
|
|
14400
|
+
},
|
|
14401
|
+
"security": [
|
|
14402
|
+
{
|
|
14403
|
+
"builderSession": []
|
|
14404
|
+
}
|
|
14405
|
+
]
|
|
14406
|
+
},
|
|
14407
|
+
"post": {
|
|
14408
|
+
"operationId": "post_work_categories",
|
|
14409
|
+
"tags": [
|
|
14410
|
+
"work-categories"
|
|
14411
|
+
],
|
|
14412
|
+
"summary": "POST /work-categories",
|
|
14413
|
+
"description": "POST /work-categories — the endpoint the \"Claude could not place this goal\" prompt writes into. Same permission as authoring a goal: extending the project's vocabulary is a planning act. A duplicate slug returns the existing row (200), so two people prompted at once converge instead of one being stranded.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `goal.create` (all required).",
|
|
14414
|
+
"x-rank": "metic+archon",
|
|
14415
|
+
"x-source": "modules/lifecycle/routes/goals.js",
|
|
14416
|
+
"x-permissions": [
|
|
14417
|
+
"goal.create"
|
|
14418
|
+
],
|
|
14419
|
+
"responses": {
|
|
14420
|
+
"200": {
|
|
14421
|
+
"description": "Success."
|
|
14422
|
+
},
|
|
14423
|
+
"400": {
|
|
14424
|
+
"$ref": "#/components/responses/BadRequest"
|
|
14425
|
+
},
|
|
14426
|
+
"401": {
|
|
14427
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
14428
|
+
},
|
|
14429
|
+
"403": {
|
|
14430
|
+
"$ref": "#/components/responses/Forbidden"
|
|
14431
|
+
}
|
|
14432
|
+
},
|
|
14433
|
+
"security": [
|
|
14434
|
+
{
|
|
14435
|
+
"builderSession": []
|
|
14436
|
+
}
|
|
14437
|
+
]
|
|
14438
|
+
}
|
|
14327
14439
|
}
|
|
14328
14440
|
},
|
|
14329
14441
|
"components": {
|
|
@@ -17888,6 +18000,10 @@
|
|
|
17888
18000
|
"succeeds_goal_id": {
|
|
17889
18001
|
"type": "integer",
|
|
17890
18002
|
"minimum": 1
|
|
18003
|
+
},
|
|
18004
|
+
"category_id": {
|
|
18005
|
+
"type": "integer",
|
|
18006
|
+
"minimum": 1
|
|
17891
18007
|
}
|
|
17892
18008
|
},
|
|
17893
18009
|
"required": [
|
|
@@ -19961,7 +20077,7 @@
|
|
|
19961
20077
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
19962
20078
|
}
|
|
19963
20079
|
},
|
|
19964
|
-
"x-endpoint-count":
|
|
20080
|
+
"x-endpoint-count": 318,
|
|
19965
20081
|
"x-schema-count": 353,
|
|
19966
20082
|
"x-undocumented-bodies": 8,
|
|
19967
20083
|
"x-response-schemas": 237,
|