@bongos/core 1.20.5 → 1.20.7
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 +113 -53
- package/.claude/skills/goal-review/SKILL.md +16 -24
- package/.claude/skills/goal-uat/SKILL.md +84 -0
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +12 -0
- package/clients/bongos-client/index.cjs +12 -0
- package/clients/bongos-client/index.d.ts +18 -1
- package/clients/bongos-client/index.mjs +12 -0
- package/docs/adr/0183-criteria-close-themselves.md +1 -1
- package/docs/adr/0310-a-speciality-offers-skills-and-the-adopter-chooses-them.md +1 -1
- package/docs/adr/0351-a-criterion-closes-on-a-uat.md +73 -0
- package/docs/adr/README.md +28 -0
- package/docs/api/openapi.json +385 -5
- package/docs/api-reference.md +14 -4
- package/docs/architecture.md +7 -0
- package/docs/copy-inventory.md +22 -22
- package/docs/copy-registry.json +23 -23
- package/docs/file-map.md +2 -1
- package/docs/module-api-changelog.md +5 -1
- package/docs/page-readings.json +3 -3
- package/modules/hall-ui/public/goals-page.js +8 -3
- package/modules/hall-ui/public/tweak-editor.css +4 -7
- package/modules/hall-ui/public/tweak-editor.html +3 -3
- package/modules/hall-ui/public/tweak-editor.js +3 -0
- package/modules/lifecycle/criterion-uat-db.js +267 -0
- package/modules/lifecycle/criterion-uat.js +303 -0
- package/modules/lifecycle/db-goals.js +25 -12
- package/modules/lifecycle/done-when.js +84 -17
- package/modules/lifecycle/migrations/lifecycle_015_criterion_uat.sql +73 -0
- package/modules/lifecycle/module.json +1 -0
- package/modules/lifecycle/routes/criterion-uat.js +169 -0
- package/modules/lifecycle/routes/done-when.js +25 -1
- package/modules/npm-release/module.json +3 -1
- package/modules/npm-release/routes/task-where.js +18 -1
- package/modules/npm-release/work.js +38 -7
- package/modules/specialities/routes/specialities.js +8 -1
- package/modules/specialities/specialities.js +26 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +24 -0
- package/scripts/gds/cli-lib.js +4 -1
- package/scripts/gds/find-untested.js +371 -0
- package/scripts/gds/fitness-checks-write-validation.js +4 -0
- package/scripts/gds/newcomer-floor.templates.json +1 -1
- package/scripts/gds/status.js +14 -3
- package/scripts/gds/uat.js +120 -0
- package/src/bongos/route-rank-check.js +9 -0
- package/src/module-api.js +1 -1
- package/tests/auto_satisfy_criteria.mjs +4 -2
- package/tests/criterion_uat.mjs +467 -0
- package/tests/criterion_uat_routes.mjs +232 -0
- package/tests/find_untested.mjs +137 -0
- package/tests/fitness.mjs +3 -1
- package/tests/goal_achievement.mjs +4 -2
- package/tests/goal_routes.mjs +4 -2
- package/tests/ideator_full_idea_shapes_space_proof.mjs +3 -2
- package/tests/npm_release_where.mjs +18 -2
- package/tests/speciality_session_skills.mjs +150 -0
package/docs/api/openapi.json
CHANGED
|
@@ -105,6 +105,10 @@
|
|
|
105
105
|
"name": "cost",
|
|
106
106
|
"description": "Endpoints under `/api/bongos/cost`."
|
|
107
107
|
},
|
|
108
|
+
{
|
|
109
|
+
"name": "criterion-uats",
|
|
110
|
+
"description": "Endpoints under `/api/bongos/criterion-uats`."
|
|
111
|
+
},
|
|
108
112
|
{
|
|
109
113
|
"name": "dependencies",
|
|
110
114
|
"description": "Endpoints under `/api/bongos/dependencies`."
|
|
@@ -4921,6 +4925,51 @@
|
|
|
4921
4925
|
]
|
|
4922
4926
|
}
|
|
4923
4927
|
},
|
|
4928
|
+
"/criterion-uats/recordings/{name}": {
|
|
4929
|
+
"get": {
|
|
4930
|
+
"operationId": "get_criterion_uats_recordings_name",
|
|
4931
|
+
"tags": [
|
|
4932
|
+
"criterion-uats"
|
|
4933
|
+
],
|
|
4934
|
+
"summary": "GET /criterion-uats/recordings/:name",
|
|
4935
|
+
"description": "evidence about a criterion any builder can read. The audience is the criterion's: any signed-in builder of THIS instance (criteria are readable by every builder, ADR 0112). One instance is one project, so this never crosses a tenant; the server-minted name is not the access control.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
4936
|
+
"x-rank": "any-builder",
|
|
4937
|
+
"x-source": "modules/lifecycle/routes/criterion-uat.js",
|
|
4938
|
+
"parameters": [
|
|
4939
|
+
{
|
|
4940
|
+
"name": "name",
|
|
4941
|
+
"in": "path",
|
|
4942
|
+
"required": true,
|
|
4943
|
+
"schema": {
|
|
4944
|
+
"type": "string"
|
|
4945
|
+
},
|
|
4946
|
+
"description": "Path parameter `name`."
|
|
4947
|
+
}
|
|
4948
|
+
],
|
|
4949
|
+
"responses": {
|
|
4950
|
+
"200": {
|
|
4951
|
+
"description": "Success."
|
|
4952
|
+
},
|
|
4953
|
+
"400": {
|
|
4954
|
+
"$ref": "#/components/responses/BadRequest"
|
|
4955
|
+
},
|
|
4956
|
+
"401": {
|
|
4957
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
4958
|
+
},
|
|
4959
|
+
"403": {
|
|
4960
|
+
"$ref": "#/components/responses/Forbidden"
|
|
4961
|
+
},
|
|
4962
|
+
"404": {
|
|
4963
|
+
"$ref": "#/components/responses/NotFound"
|
|
4964
|
+
}
|
|
4965
|
+
},
|
|
4966
|
+
"security": [
|
|
4967
|
+
{
|
|
4968
|
+
"builderSession": []
|
|
4969
|
+
}
|
|
4970
|
+
]
|
|
4971
|
+
}
|
|
4972
|
+
},
|
|
4924
4973
|
"/dependencies": {
|
|
4925
4974
|
"post": {
|
|
4926
4975
|
"operationId": "post_dependencies",
|
|
@@ -5231,6 +5280,72 @@
|
|
|
5231
5280
|
]
|
|
5232
5281
|
}
|
|
5233
5282
|
},
|
|
5283
|
+
"/done-when/{criterionId}/backend-only": {
|
|
5284
|
+
"put": {
|
|
5285
|
+
"operationId": "put_done_when_criterionId_backend_only",
|
|
5286
|
+
"tags": [
|
|
5287
|
+
"done-when"
|
|
5288
|
+
],
|
|
5289
|
+
"summary": "PUT /done-when/:criterionId/backend-only",
|
|
5290
|
+
"description": "perm criterion.create + the per-goal authoring wall (ADR 0154).\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `criterion.create` (all required).",
|
|
5291
|
+
"x-rank": "metic+archon",
|
|
5292
|
+
"x-source": "modules/lifecycle/routes/criterion-uat.js",
|
|
5293
|
+
"x-permissions": [
|
|
5294
|
+
"criterion.create"
|
|
5295
|
+
],
|
|
5296
|
+
"parameters": [
|
|
5297
|
+
{
|
|
5298
|
+
"name": "criterionId",
|
|
5299
|
+
"in": "path",
|
|
5300
|
+
"required": true,
|
|
5301
|
+
"schema": {
|
|
5302
|
+
"type": "string"
|
|
5303
|
+
},
|
|
5304
|
+
"description": "Path parameter `criterionId`."
|
|
5305
|
+
}
|
|
5306
|
+
],
|
|
5307
|
+
"requestBody": {
|
|
5308
|
+
"required": true,
|
|
5309
|
+
"content": {
|
|
5310
|
+
"application/json": {
|
|
5311
|
+
"schema": {
|
|
5312
|
+
"$ref": "#/components/schemas/PutDoneWhenCriterionIdBackendOnlyRequest"
|
|
5313
|
+
}
|
|
5314
|
+
}
|
|
5315
|
+
},
|
|
5316
|
+
"x-validated": true
|
|
5317
|
+
},
|
|
5318
|
+
"responses": {
|
|
5319
|
+
"200": {
|
|
5320
|
+
"description": "Success.",
|
|
5321
|
+
"content": {
|
|
5322
|
+
"application/json": {
|
|
5323
|
+
"schema": {
|
|
5324
|
+
"$ref": "#/components/schemas/PutDoneWhenCriterionIdBackendOnlyResponse"
|
|
5325
|
+
}
|
|
5326
|
+
}
|
|
5327
|
+
}
|
|
5328
|
+
},
|
|
5329
|
+
"400": {
|
|
5330
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
5331
|
+
},
|
|
5332
|
+
"401": {
|
|
5333
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
5334
|
+
},
|
|
5335
|
+
"403": {
|
|
5336
|
+
"$ref": "#/components/responses/Forbidden"
|
|
5337
|
+
},
|
|
5338
|
+
"404": {
|
|
5339
|
+
"$ref": "#/components/responses/NotFound"
|
|
5340
|
+
}
|
|
5341
|
+
},
|
|
5342
|
+
"security": [
|
|
5343
|
+
{
|
|
5344
|
+
"builderSession": []
|
|
5345
|
+
}
|
|
5346
|
+
]
|
|
5347
|
+
}
|
|
5348
|
+
},
|
|
5234
5349
|
"/done-when/{criterionId}/satisfy": {
|
|
5235
5350
|
"post": {
|
|
5236
5351
|
"operationId": "post_done_when_criterionId_satisfy",
|
|
@@ -5238,7 +5353,7 @@
|
|
|
5238
5353
|
"done-when"
|
|
5239
5354
|
],
|
|
5240
5355
|
"summary": "POST /done-when/:criterionId/satisfy",
|
|
5241
|
-
"description": "Auth (Metic+): confirm a criterion — flip it to satisfied. Accepts optional satisfied_by_task_id so the UI can show which ship-task fulfilled it. When the criterion belongs to a goal and was its LAST unsatisfied one, the goal auto- flips open→achieved (ADR 0086 §6 / BV1.R63). Re-ranked Archon→Metic+ so the planner — not only the Archon — closes the criterion/goal loop; the route is pinned in route-rank-check.MODULE_EXPECTED_RANKS.lifecycle so a further downgrade is caught. rank: metic+archon — criterion confirmation + goal auto-achieve (the closing loop).\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `criterion.satisfy` (all required).",
|
|
5356
|
+
"description": "Auth (Metic+): confirm a criterion — flip it to satisfied. Accepts optional satisfied_by_task_id so the UI can show which ship-task fulfilled it. When the criterion belongs to a goal and was its LAST unsatisfied one, the goal auto- flips open→achieved (ADR 0086 §6 / BV1.R63). Re-ranked Archon→Metic+ so the planner — not only the Archon — closes the criterion/goal loop; the route is pinned in route-rank-check.MODULE_EXPECTED_RANKS.lifecycle so a further downgrade is caught. rank: metic+archon — criterion confirmation + goal auto-achieve (the closing loop). ⚠ SINCE TASK 1004392 (ADR 0351) THIS IS THE OVERRIDE, NOT THE CLOSE. A criterion closes on a UAT sign-off (POST /done-when/:id/uat); flipping it here skips the UAT, which is exactly how a criterion gets closed without anyone checking its words. So it now REQUIRES `override_reason`, writes an `override` sign-off row carrying it, and the criterion then reads \"Satisfied (override)\" everywhere — never as a UAT. The escape hatch stays (an all-abandoned criterion that was met another way still needs one); it is just no longer silent.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `criterion.satisfy` (all required).",
|
|
5242
5357
|
"x-rank": "metic+archon",
|
|
5243
5358
|
"x-source": "modules/lifecycle/routes/done-when.js",
|
|
5244
5359
|
"x-permissions": [
|
|
@@ -5290,6 +5405,183 @@
|
|
|
5290
5405
|
]
|
|
5291
5406
|
}
|
|
5292
5407
|
},
|
|
5408
|
+
"/done-when/{criterionId}/uat": {
|
|
5409
|
+
"get": {
|
|
5410
|
+
"operationId": "get_done_when_criterionId_uat",
|
|
5411
|
+
"tags": [
|
|
5412
|
+
"done-when"
|
|
5413
|
+
],
|
|
5414
|
+
"summary": "GET /done-when/:criterionId/uat",
|
|
5415
|
+
"description": "a criterion and its goal are readable by any builder.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
5416
|
+
"x-rank": "any-builder",
|
|
5417
|
+
"x-source": "modules/lifecycle/routes/criterion-uat.js",
|
|
5418
|
+
"parameters": [
|
|
5419
|
+
{
|
|
5420
|
+
"name": "criterionId",
|
|
5421
|
+
"in": "path",
|
|
5422
|
+
"required": true,
|
|
5423
|
+
"schema": {
|
|
5424
|
+
"type": "string"
|
|
5425
|
+
},
|
|
5426
|
+
"description": "Path parameter `criterionId`."
|
|
5427
|
+
}
|
|
5428
|
+
],
|
|
5429
|
+
"responses": {
|
|
5430
|
+
"200": {
|
|
5431
|
+
"description": "Success."
|
|
5432
|
+
},
|
|
5433
|
+
"400": {
|
|
5434
|
+
"$ref": "#/components/responses/BadRequest"
|
|
5435
|
+
},
|
|
5436
|
+
"401": {
|
|
5437
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
5438
|
+
},
|
|
5439
|
+
"403": {
|
|
5440
|
+
"$ref": "#/components/responses/Forbidden"
|
|
5441
|
+
},
|
|
5442
|
+
"404": {
|
|
5443
|
+
"$ref": "#/components/responses/NotFound"
|
|
5444
|
+
}
|
|
5445
|
+
},
|
|
5446
|
+
"security": [
|
|
5447
|
+
{
|
|
5448
|
+
"builderSession": []
|
|
5449
|
+
}
|
|
5450
|
+
]
|
|
5451
|
+
},
|
|
5452
|
+
"post": {
|
|
5453
|
+
"operationId": "post_done_when_criterionId_uat",
|
|
5454
|
+
"tags": [
|
|
5455
|
+
"done-when"
|
|
5456
|
+
],
|
|
5457
|
+
"summary": "POST /done-when/:criterionId/uat",
|
|
5458
|
+
"description": "perm criterion.review; the non-shipper wall is in-handler.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `criterion.review` (all required).",
|
|
5459
|
+
"x-rank": "metic+archon",
|
|
5460
|
+
"x-source": "modules/lifecycle/routes/criterion-uat.js",
|
|
5461
|
+
"x-permissions": [
|
|
5462
|
+
"criterion.review"
|
|
5463
|
+
],
|
|
5464
|
+
"parameters": [
|
|
5465
|
+
{
|
|
5466
|
+
"name": "criterionId",
|
|
5467
|
+
"in": "path",
|
|
5468
|
+
"required": true,
|
|
5469
|
+
"schema": {
|
|
5470
|
+
"type": "string"
|
|
5471
|
+
},
|
|
5472
|
+
"description": "Path parameter `criterionId`."
|
|
5473
|
+
}
|
|
5474
|
+
],
|
|
5475
|
+
"requestBody": {
|
|
5476
|
+
"required": true,
|
|
5477
|
+
"content": {
|
|
5478
|
+
"application/json": {
|
|
5479
|
+
"schema": {
|
|
5480
|
+
"$ref": "#/components/schemas/PostDoneWhenCriterionIdUatRequest"
|
|
5481
|
+
}
|
|
5482
|
+
}
|
|
5483
|
+
},
|
|
5484
|
+
"x-validated": true
|
|
5485
|
+
},
|
|
5486
|
+
"responses": {
|
|
5487
|
+
"200": {
|
|
5488
|
+
"description": "Success.",
|
|
5489
|
+
"content": {
|
|
5490
|
+
"application/json": {
|
|
5491
|
+
"schema": {
|
|
5492
|
+
"$ref": "#/components/schemas/PostDoneWhenCriterionIdUatResponse"
|
|
5493
|
+
}
|
|
5494
|
+
}
|
|
5495
|
+
}
|
|
5496
|
+
},
|
|
5497
|
+
"400": {
|
|
5498
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
5499
|
+
},
|
|
5500
|
+
"401": {
|
|
5501
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
5502
|
+
},
|
|
5503
|
+
"403": {
|
|
5504
|
+
"$ref": "#/components/responses/Forbidden"
|
|
5505
|
+
},
|
|
5506
|
+
"404": {
|
|
5507
|
+
"$ref": "#/components/responses/NotFound"
|
|
5508
|
+
}
|
|
5509
|
+
},
|
|
5510
|
+
"security": [
|
|
5511
|
+
{
|
|
5512
|
+
"builderSession": []
|
|
5513
|
+
}
|
|
5514
|
+
]
|
|
5515
|
+
}
|
|
5516
|
+
},
|
|
5517
|
+
"/done-when/{criterionId}/uat/recording": {
|
|
5518
|
+
"post": {
|
|
5519
|
+
"operationId": "post_done_when_criterionId_uat_recording",
|
|
5520
|
+
"tags": [
|
|
5521
|
+
"done-when"
|
|
5522
|
+
],
|
|
5523
|
+
"summary": "POST /done-when/:criterionId/uat/recording",
|
|
5524
|
+
"description": "perm criterion.review: evidence for a UAT sign-off.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `criterion.review` (all required).",
|
|
5525
|
+
"x-rank": "metic+archon",
|
|
5526
|
+
"x-source": "modules/lifecycle/routes/criterion-uat.js",
|
|
5527
|
+
"x-permissions": [
|
|
5528
|
+
"criterion.review"
|
|
5529
|
+
],
|
|
5530
|
+
"parameters": [
|
|
5531
|
+
{
|
|
5532
|
+
"name": "criterionId",
|
|
5533
|
+
"in": "path",
|
|
5534
|
+
"required": true,
|
|
5535
|
+
"schema": {
|
|
5536
|
+
"type": "string"
|
|
5537
|
+
},
|
|
5538
|
+
"description": "Path parameter `criterionId`."
|
|
5539
|
+
}
|
|
5540
|
+
],
|
|
5541
|
+
"requestBody": {
|
|
5542
|
+
"required": false,
|
|
5543
|
+
"content": {
|
|
5544
|
+
"application/json": {
|
|
5545
|
+
"schema": {
|
|
5546
|
+
"type": "object",
|
|
5547
|
+
"additionalProperties": true
|
|
5548
|
+
}
|
|
5549
|
+
}
|
|
5550
|
+
},
|
|
5551
|
+
"x-validated": false,
|
|
5552
|
+
"x-body-undocumented": true
|
|
5553
|
+
},
|
|
5554
|
+
"responses": {
|
|
5555
|
+
"200": {
|
|
5556
|
+
"description": "Success.",
|
|
5557
|
+
"content": {
|
|
5558
|
+
"application/json": {
|
|
5559
|
+
"schema": {
|
|
5560
|
+
"$ref": "#/components/schemas/PostDoneWhenCriterionIdUatRecordingResponse"
|
|
5561
|
+
}
|
|
5562
|
+
}
|
|
5563
|
+
}
|
|
5564
|
+
},
|
|
5565
|
+
"400": {
|
|
5566
|
+
"$ref": "#/components/responses/BadRequest"
|
|
5567
|
+
},
|
|
5568
|
+
"401": {
|
|
5569
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
5570
|
+
},
|
|
5571
|
+
"403": {
|
|
5572
|
+
"$ref": "#/components/responses/Forbidden"
|
|
5573
|
+
},
|
|
5574
|
+
"404": {
|
|
5575
|
+
"$ref": "#/components/responses/NotFound"
|
|
5576
|
+
}
|
|
5577
|
+
},
|
|
5578
|
+
"security": [
|
|
5579
|
+
{
|
|
5580
|
+
"builderSession": []
|
|
5581
|
+
}
|
|
5582
|
+
]
|
|
5583
|
+
}
|
|
5584
|
+
},
|
|
5293
5585
|
"/done-when/{criterionId}/unsatisfy": {
|
|
5294
5586
|
"post": {
|
|
5295
5587
|
"operationId": "post_done_when_criterionId_unsatisfy",
|
|
@@ -25365,10 +25657,71 @@
|
|
|
25365
25657
|
"satisfied_by_task_id": {
|
|
25366
25658
|
"type": "integer",
|
|
25367
25659
|
"minimum": 1
|
|
25660
|
+
},
|
|
25661
|
+
"override_reason": {
|
|
25662
|
+
"type": "string",
|
|
25663
|
+
"maxLength": 2000
|
|
25368
25664
|
}
|
|
25369
25665
|
},
|
|
25370
25666
|
"additionalProperties": false
|
|
25371
25667
|
},
|
|
25668
|
+
"PostDoneWhenCriterionIdUatRecordingResponse": {
|
|
25669
|
+
"type": "object",
|
|
25670
|
+
"properties": {
|
|
25671
|
+
"ok": {
|
|
25672
|
+
"type": "boolean"
|
|
25673
|
+
},
|
|
25674
|
+
"recording": {},
|
|
25675
|
+
"bytes": {}
|
|
25676
|
+
},
|
|
25677
|
+
"required": [
|
|
25678
|
+
"ok",
|
|
25679
|
+
"recording",
|
|
25680
|
+
"bytes"
|
|
25681
|
+
]
|
|
25682
|
+
},
|
|
25683
|
+
"PostDoneWhenCriterionIdUatRequest": {
|
|
25684
|
+
"type": "object",
|
|
25685
|
+
"properties": {
|
|
25686
|
+
"kind": {
|
|
25687
|
+
"type": "string",
|
|
25688
|
+
"maxLength": 32
|
|
25689
|
+
},
|
|
25690
|
+
"recording": {
|
|
25691
|
+
"type": "string",
|
|
25692
|
+
"maxLength": 80
|
|
25693
|
+
},
|
|
25694
|
+
"live_attested": {
|
|
25695
|
+
"type": "boolean"
|
|
25696
|
+
},
|
|
25697
|
+
"note": {
|
|
25698
|
+
"type": "string"
|
|
25699
|
+
}
|
|
25700
|
+
},
|
|
25701
|
+
"required": [
|
|
25702
|
+
"kind"
|
|
25703
|
+
],
|
|
25704
|
+
"additionalProperties": false
|
|
25705
|
+
},
|
|
25706
|
+
"PostDoneWhenCriterionIdUatResponse": {
|
|
25707
|
+
"type": "object",
|
|
25708
|
+
"properties": {
|
|
25709
|
+
"ok": {
|
|
25710
|
+
"type": "boolean"
|
|
25711
|
+
},
|
|
25712
|
+
"signoff": {},
|
|
25713
|
+
"criterion_closed": {},
|
|
25714
|
+
"achieved_goals": {},
|
|
25715
|
+
"closed_versions": {}
|
|
25716
|
+
},
|
|
25717
|
+
"required": [
|
|
25718
|
+
"ok",
|
|
25719
|
+
"signoff",
|
|
25720
|
+
"criterion_closed",
|
|
25721
|
+
"achieved_goals",
|
|
25722
|
+
"closed_versions"
|
|
25723
|
+
]
|
|
25724
|
+
},
|
|
25372
25725
|
"PostDoneWhenCriterionIdUnsatisfyResponse": {
|
|
25373
25726
|
"type": "object",
|
|
25374
25727
|
"properties": {
|
|
@@ -28844,6 +29197,33 @@
|
|
|
28844
29197
|
"counter"
|
|
28845
29198
|
]
|
|
28846
29199
|
},
|
|
29200
|
+
"PutDoneWhenCriterionIdBackendOnlyRequest": {
|
|
29201
|
+
"type": "object",
|
|
29202
|
+
"properties": {
|
|
29203
|
+
"backend_only": {
|
|
29204
|
+
"type": "boolean"
|
|
29205
|
+
}
|
|
29206
|
+
},
|
|
29207
|
+
"required": [
|
|
29208
|
+
"backend_only"
|
|
29209
|
+
],
|
|
29210
|
+
"additionalProperties": false
|
|
29211
|
+
},
|
|
29212
|
+
"PutDoneWhenCriterionIdBackendOnlyResponse": {
|
|
29213
|
+
"type": "object",
|
|
29214
|
+
"properties": {
|
|
29215
|
+
"ok": {
|
|
29216
|
+
"type": "boolean"
|
|
29217
|
+
},
|
|
29218
|
+
"criterion_id": {},
|
|
29219
|
+
"backend_only": {}
|
|
29220
|
+
},
|
|
29221
|
+
"required": [
|
|
29222
|
+
"ok",
|
|
29223
|
+
"criterion_id",
|
|
29224
|
+
"backend_only"
|
|
29225
|
+
]
|
|
29226
|
+
},
|
|
28847
29227
|
"PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse": {
|
|
28848
29228
|
"type": "object",
|
|
28849
29229
|
"properties": {
|
|
@@ -29094,9 +29474,9 @@
|
|
|
29094
29474
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
29095
29475
|
}
|
|
29096
29476
|
},
|
|
29097
|
-
"x-endpoint-count":
|
|
29098
|
-
"x-schema-count":
|
|
29099
|
-
"x-undocumented-bodies":
|
|
29100
|
-
"x-response-schemas":
|
|
29477
|
+
"x-endpoint-count": 460,
|
|
29478
|
+
"x-schema-count": 492,
|
|
29479
|
+
"x-undocumented-bodies": 12,
|
|
29480
|
+
"x-response-schemas": 334,
|
|
29101
29481
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
29102
29482
|
}
|
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. 460 endpoints across 82 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/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -215,6 +215,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
215
215
|
|---|---|---|---|---|
|
|
216
216
|
| POST | `/api/bongos/cost` | `any-builder` | `task_id`, `amount_usd`, `category`, `description`, `source`, `source_ref`, `recorded_at`, `fresh_input_usd`, `cache_read_usd`, `cache_write_usd`, `output_usd`, `builder_id`, `skill_name` | log cost on own claim (idempotent via source/source_ref). |
|
|
217
217
|
|
|
218
|
+
## `criterion-uats` (1)
|
|
219
|
+
|
|
220
|
+
| Method | Path | Rank | Body | Description |
|
|
221
|
+
|---|---|---|---|---|
|
|
222
|
+
| GET | `/api/bongos/criterion-uats/recordings/:name` | `any-builder` | — | evidence about a criterion any builder can read. |
|
|
223
|
+
|
|
218
224
|
## `dependencies` (2)
|
|
219
225
|
|
|
220
226
|
| Method | Path | Rank | Body | Description |
|
|
@@ -230,12 +236,16 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
230
236
|
| POST | `/api/bongos/discord/channels/reconcile` | `metic+archon` | — | POST /api/bongos/discord/channels/reconcile — apply the config to Discord now. |
|
|
231
237
|
| GET | `/api/bongos/discord/channels/snapshot` | `metic+archon` | — | GET /api/bongos/discord/channels/snapshot — what docs/discord/channels.json WOULD say if it described the guild exactly as it is right no… |
|
|
232
238
|
|
|
233
|
-
## `done-when` (
|
|
239
|
+
## `done-when` (8)
|
|
234
240
|
|
|
235
241
|
| Method | Path | Rank | Body | Description |
|
|
236
242
|
|---|---|---|---|---|
|
|
237
243
|
| PATCH | `/api/bongos/done-when/:criterionId` | `metic+archon` | `criterion_md`, `goal_id` | PATCH /done-when/:criterionId — amend a criterion's TEXT (task 1003102) and/or MOVE it between goals (task 1003509). |
|
|
238
|
-
|
|
|
244
|
+
| PUT | `/api/bongos/done-when/:criterionId/backend-only` | `metic+archon` | `backend_only` | perm criterion.create + the per-goal authoring wall (ADR 0154). |
|
|
245
|
+
| POST | `/api/bongos/done-when/:criterionId/satisfy` | `metic+archon` | `satisfied_by_task_id`, `override_reason` | Auth (Metic+): confirm a criterion — flip it to satisfied. |
|
|
246
|
+
| GET | `/api/bongos/done-when/:criterionId/uat` | `any-builder` | — | a criterion and its goal are readable by any builder. |
|
|
247
|
+
| POST | `/api/bongos/done-when/:criterionId/uat` | `metic+archon` | `kind`, `recording`, `live_attested`, `note` | perm criterion.review; the non-shipper wall is in-handler. |
|
|
248
|
+
| POST | `/api/bongos/done-when/:criterionId/uat/recording` | `metic+archon` | _undocumented_ | perm criterion.review: evidence for a UAT sign-off. |
|
|
239
249
|
| POST | `/api/bongos/done-when/:criterionId/unsatisfy` | `metic+archon` | — | Auth: flip a criterion back to unsatisfied (rare; for corrections). |
|
|
240
250
|
| GET | `/api/bongos/done-when/pending-review` | `metic+archon` | — | Auth (Metic+): the criterion review queue — every criterion auto-flagged "met — pending review" (≥1 linked task, all shipped, not yet con… |
|
|
241
251
|
|
|
@@ -809,5 +819,5 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
809
819
|
|
|
810
820
|
---
|
|
811
821
|
|
|
812
|
-
>
|
|
822
|
+
> 12 write endpoint(s) take a JSON body with no declared validator schema — their fields are not yet machine-documented. Adding a `validateOrRespond` schema (`src/bongos/routes/_helpers.js`) surfaces them here automatically.
|
|
813
823
|
|
package/docs/architecture.md
CHANGED
|
@@ -183,6 +183,13 @@ task_criteria(task_id FK tasks, criterion_id FK done_when_criteria, source 'back
|
|
|
183
183
|
-- ship that CLOSED it). Backed GET /versions/:id/progress + /status. Populated on task-create
|
|
184
184
|
-- via POST /tasks { criterion_ids } + the /tasks/:id/criteria manage endpoints (#438); "Cn" is
|
|
185
185
|
-- the 1-based position by (sort_order, criterion_id). idx on (criterion_id) + (task_id).
|
|
186
|
+
lifecycle_criterion_uats(id, criterion_id FK done_when_criteria, kind 'uat'|'backend_signoff'|'override',
|
|
187
|
+
signed_off_by FK builders, recording_file, live_basis 'deploy_reading'|'attested'|'not_checked',
|
|
188
|
+
note, created_at) -- lifecycle_015 (task 1004392, ADR 0351): APPEND-ONLY sign-offs. A criterion
|
|
189
|
+
-- closes only with a uat/backend_signoff row no older than its newest linked ship; until then
|
|
190
|
+
-- it reads "Awaiting UAT". An `override` row is what POST /done-when/:id/satisfy writes now.
|
|
191
|
+
lifecycle_criterion_backend_only(criterion_id PK FK done_when_criteria, marked_by, marked_at)
|
|
192
|
+
-- presence = backend-only (no screen to record); settable only while the criterion is open.
|
|
186
193
|
session_pulses(claim_id PK, builder_id, last_pulse_at) -- heartbeat for stale-claim detection
|
|
187
194
|
task_grades(id, task_id UNIQUE, score NUMERIC(3,1), passed bool, threshold NUMERIC(3,1),
|
|
188
195
|
grader_kind 'auto'|'subagent'|'lars', grader_version, rubric_scores jsonb,
|