@bongos/core 1.19.332 → 1.19.334
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 +173 -43
- package/docs/adr/0187-oauth-handshake-cookie-lifetime.md +84 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +2 -2
- package/docs/api-reference.md +1 -1
- package/docs/copy-inventory.md +202 -202
- package/docs/copy-registry.json +384 -384
- package/modules/grading/grader-config.js +98 -0
- package/modules/grading/grader-model.js +150 -0
- package/modules/grading/grader-prompt.js +139 -0
- package/modules/grading/grader-score.js +706 -0
- package/modules/grading/grader-subagent.js +328 -0
- package/modules/grading/grader.js +5 -1287
- package/modules/hall-ui/public/builders.js +19 -1182
- package/modules/hall-ui/public/goals-page.js +11 -997
- package/modules/hall-ui/public/goals-render.js +1032 -0
- package/modules/hall-ui/public/goals.html +4 -0
- package/modules/hall-ui/public/hall-render.js +1211 -0
- package/modules/hall-ui/public/index.html +6 -0
- package/modules/lifecycle/routes/goal-route-authz.js +400 -0
- package/modules/lifecycle/routes/goals.js +1 -367
- package/modules/lifecycle/routes/task-route-helpers.js +219 -0
- package/modules/lifecycle/routes/task-write-routes.js +542 -0
- package/modules/lifecycle/routes/tasks.js +3 -696
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/box-infra.js +280 -0
- package/scripts/gds/box.js +1 -245
- package/scripts/gds/fitness-checks-identity.js +320 -0
- package/scripts/gds/fitness-checks-vocabulary.js +230 -0
- package/scripts/gds/fitness-checks-write-validation.js +144 -0
- package/scripts/gds/fitness-lib.js +82 -0
- package/scripts/gds/fitness.js +55 -668
- package/scripts/gds/provision-config.js +204 -0
- package/scripts/gds/provision-net.js +221 -0
- package/scripts/gds/provision-repo.js +849 -0
- package/scripts/gds/provision-units.js +262 -0
- package/scripts/gds/provision.js +4 -1395
- package/src/bongos/auth-admission.js +264 -0
- package/src/bongos/auth-config.js +151 -0
- package/src/bongos/auth-discord.js +198 -0
- package/src/bongos/auth-github.js +336 -0
- package/src/bongos/auth-idp.js +330 -0
- package/src/bongos/auth.js +5 -1100
- package/src/bongos/routes/auth.js +54 -10
- package/src/module-api.js +5 -1
- package/tests/auth_admission_gate.mjs +3 -1
- package/tests/auth_web_recovery.mjs +63 -0
- package/tests/est_advisory.mjs +3 -1
- package/tests/goal_advisory.mjs +3 -2
- package/tests/goal_criterion_confirm_ui.mjs +6 -0
- package/tests/goal_subtitle.mjs +5 -2
- package/tests/goals_card_view.mjs +10 -3
- package/tests/grader_generated_provenance.mjs +3 -1
- package/tests/hall_palette.mjs +3 -1
- package/tests/helpers.mjs +58 -25
- package/tests/lib_sh_resolution.mjs +3 -1
- package/tests/membership_kind_lockstep.mjs +3 -1
- package/tests/migration_allocation.mjs +5 -2
- package/tests/patch_gate_ordering.mjs +3 -1
- package/tests/rank_tier_single_source.mjs +16 -3
- package/tests/reward_gate.mjs +3 -2
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.334",
|
|
6
|
+
"core_contract": "1.19.334",
|
|
7
|
+
"source_commit": "17d7b23f872fb3f64737ae5ffe270b91ace779a0",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-25T00:
|
|
9
|
+
"built_at": "2026-08-25T00:36:48.394Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 325,
|
|
13
13
|
"agent_docs_stubbed": 22,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1490,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1837,
|
|
20
|
+
"tree_sha256": "15089adb0fd9a51245746cbd141dd57dceadee53a5e640beb0d7059c7f219610",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -1414,20 +1414,25 @@
|
|
|
1414
1414
|
"mode": "0000644",
|
|
1415
1415
|
"sha256": "749040f16b59cc1cd1c49ca40453fed838f31b36af8c8eed2b5de7db00ddb0d0"
|
|
1416
1416
|
},
|
|
1417
|
+
{
|
|
1418
|
+
"path": "docs/adr/0187-oauth-handshake-cookie-lifetime.md",
|
|
1419
|
+
"mode": "0000644",
|
|
1420
|
+
"sha256": "d59906a447f2459efdef6c3eb97cf8629813ec74776ead700017f02ef76aed9e"
|
|
1421
|
+
},
|
|
1417
1422
|
{
|
|
1418
1423
|
"path": "docs/adr/README.md",
|
|
1419
1424
|
"mode": "0000644",
|
|
1420
|
-
"sha256": "
|
|
1425
|
+
"sha256": "87606f8e07f470f0ff55d7ac733de9d1004d3d15eddf1003a8958566b4147077"
|
|
1421
1426
|
},
|
|
1422
1427
|
{
|
|
1423
1428
|
"path": "docs/api-reference.md",
|
|
1424
1429
|
"mode": "0000644",
|
|
1425
|
-
"sha256": "
|
|
1430
|
+
"sha256": "bc46270167b3d63df4dac08b92fcfa5fb2fcf7b2ba243bde906aa84e54541299"
|
|
1426
1431
|
},
|
|
1427
1432
|
{
|
|
1428
1433
|
"path": "docs/api/openapi.json",
|
|
1429
1434
|
"mode": "0000644",
|
|
1430
|
-
"sha256": "
|
|
1435
|
+
"sha256": "7afa3f34e447b946f948e2629e6529b3b98ed91ead3ff0f9535933e756d2936b"
|
|
1431
1436
|
},
|
|
1432
1437
|
{
|
|
1433
1438
|
"path": "docs/architecture.md",
|
|
@@ -1452,12 +1457,12 @@
|
|
|
1452
1457
|
{
|
|
1453
1458
|
"path": "docs/copy-inventory.md",
|
|
1454
1459
|
"mode": "0000644",
|
|
1455
|
-
"sha256": "
|
|
1460
|
+
"sha256": "5468f593a35bdbe5d655b79d578f81b6dde532af6f32e48653c4a91066f3dee3"
|
|
1456
1461
|
},
|
|
1457
1462
|
{
|
|
1458
1463
|
"path": "docs/copy-registry.json",
|
|
1459
1464
|
"mode": "0000644",
|
|
1460
|
-
"sha256": "
|
|
1465
|
+
"sha256": "93d1091d0acf93aeede8ac44552780b58dd78174c46a076215f171e4af99cc7f"
|
|
1461
1466
|
},
|
|
1462
1467
|
{
|
|
1463
1468
|
"path": "docs/design-contract.md",
|
|
@@ -3214,11 +3219,36 @@
|
|
|
3214
3219
|
"mode": "0000644",
|
|
3215
3220
|
"sha256": "43e94be02fe20891633f7fbe7abe0caf774d86743cbce4c5ec34b8499e22e125"
|
|
3216
3221
|
},
|
|
3222
|
+
{
|
|
3223
|
+
"path": "modules/grading/grader-config.js",
|
|
3224
|
+
"mode": "0000644",
|
|
3225
|
+
"sha256": "125d5fab993fd4276eaf3df731bdf03afe25ef1032a8bec7c1bf5a16f781b73a"
|
|
3226
|
+
},
|
|
3227
|
+
{
|
|
3228
|
+
"path": "modules/grading/grader-model.js",
|
|
3229
|
+
"mode": "0000644",
|
|
3230
|
+
"sha256": "0cb389410b461af69baa29dede5ca3b8ec8f6d0770c87c8a7cf2fe4f8075207d"
|
|
3231
|
+
},
|
|
3232
|
+
{
|
|
3233
|
+
"path": "modules/grading/grader-prompt.js",
|
|
3234
|
+
"mode": "0000644",
|
|
3235
|
+
"sha256": "a2facb7de1293722b0b085a24dd4658f8205d88dd0fbebcd6d85aa634ffdc78b"
|
|
3236
|
+
},
|
|
3217
3237
|
{
|
|
3218
3238
|
"path": "modules/grading/grader-rubric.json",
|
|
3219
3239
|
"mode": "0000644",
|
|
3220
3240
|
"sha256": "6a0a2205fee2a4b0efc422c884826a9fd2af3d8785b393d5f7123e1758f1ebfc"
|
|
3221
3241
|
},
|
|
3242
|
+
{
|
|
3243
|
+
"path": "modules/grading/grader-score.js",
|
|
3244
|
+
"mode": "0000644",
|
|
3245
|
+
"sha256": "fe36685ad575e49d30b9251c9e781668473ca609ebc6be627c979adde76a2896"
|
|
3246
|
+
},
|
|
3247
|
+
{
|
|
3248
|
+
"path": "modules/grading/grader-subagent.js",
|
|
3249
|
+
"mode": "0000644",
|
|
3250
|
+
"sha256": "2f8d48c2eace701ef6e4c256be74a0893e45476eb46b20763a442e9dc6c21214"
|
|
3251
|
+
},
|
|
3222
3252
|
{
|
|
3223
3253
|
"path": "modules/grading/grader-workers/efficiency.js",
|
|
3224
3254
|
"mode": "0000644",
|
|
@@ -3272,7 +3302,7 @@
|
|
|
3272
3302
|
{
|
|
3273
3303
|
"path": "modules/grading/grader.js",
|
|
3274
3304
|
"mode": "0000644",
|
|
3275
|
-
"sha256": "
|
|
3305
|
+
"sha256": "bb66bece4bf5d1364be931b39d7b1e179615b59613d74e491ff48b399291ff24"
|
|
3276
3306
|
},
|
|
3277
3307
|
{
|
|
3278
3308
|
"path": "modules/grading/module.json",
|
|
@@ -3322,7 +3352,7 @@
|
|
|
3322
3352
|
{
|
|
3323
3353
|
"path": "modules/hall-ui/public/builders.js",
|
|
3324
3354
|
"mode": "0000644",
|
|
3325
|
-
"sha256": "
|
|
3355
|
+
"sha256": "df08dadd4a184a595319209e761d5de3aaa217623048972db7161a29b3db19ac"
|
|
3326
3356
|
},
|
|
3327
3357
|
{
|
|
3328
3358
|
"path": "modules/hall-ui/public/chime.wav",
|
|
@@ -3427,7 +3457,12 @@
|
|
|
3427
3457
|
{
|
|
3428
3458
|
"path": "modules/hall-ui/public/goals-page.js",
|
|
3429
3459
|
"mode": "0000644",
|
|
3430
|
-
"sha256": "
|
|
3460
|
+
"sha256": "d99cbf101ba10a46d7a612aadec417c31679a77b1deb5e02e1824dc1d8d52b5e"
|
|
3461
|
+
},
|
|
3462
|
+
{
|
|
3463
|
+
"path": "modules/hall-ui/public/goals-render.js",
|
|
3464
|
+
"mode": "0000644",
|
|
3465
|
+
"sha256": "65bc90adc3eaf46c8aa38b1bcbf197fd17e302ef8128e1e8f8ff22f95fd28229"
|
|
3431
3466
|
},
|
|
3432
3467
|
{
|
|
3433
3468
|
"path": "modules/hall-ui/public/goals.css",
|
|
@@ -3437,7 +3472,7 @@
|
|
|
3437
3472
|
{
|
|
3438
3473
|
"path": "modules/hall-ui/public/goals.html",
|
|
3439
3474
|
"mode": "0000644",
|
|
3440
|
-
"sha256": "
|
|
3475
|
+
"sha256": "e43d555d74a57c13be28a8ea91c0e98940f265c70cc2ab012e2565ce67474e55"
|
|
3441
3476
|
},
|
|
3442
3477
|
{
|
|
3443
3478
|
"path": "modules/hall-ui/public/goals.js",
|
|
@@ -3464,6 +3499,11 @@
|
|
|
3464
3499
|
"mode": "0000644",
|
|
3465
3500
|
"sha256": "4d5ec8f334fc00f23e81fe21283b7ea2fb173b253c638a08ef48b97111cc654f"
|
|
3466
3501
|
},
|
|
3502
|
+
{
|
|
3503
|
+
"path": "modules/hall-ui/public/hall-render.js",
|
|
3504
|
+
"mode": "0000644",
|
|
3505
|
+
"sha256": "704726830539538f916a8d6a704f6aff77084dcec0445619c185feb5ecb0c43f"
|
|
3506
|
+
},
|
|
3467
3507
|
{
|
|
3468
3508
|
"path": "modules/hall-ui/public/hall-widgets.js",
|
|
3469
3509
|
"mode": "0000644",
|
|
@@ -3517,7 +3557,7 @@
|
|
|
3517
3557
|
{
|
|
3518
3558
|
"path": "modules/hall-ui/public/index.html",
|
|
3519
3559
|
"mode": "0000644",
|
|
3520
|
-
"sha256": "
|
|
3560
|
+
"sha256": "6564fe67e5987fbc25a4dd84d0288302ddcd81050e6afa1e5ab1b1dea873c0d8"
|
|
3521
3561
|
},
|
|
3522
3562
|
{
|
|
3523
3563
|
"path": "modules/hall-ui/public/md-reader.js",
|
|
@@ -4019,10 +4059,15 @@
|
|
|
4019
4059
|
"mode": "0000644",
|
|
4020
4060
|
"sha256": "edc71d69d25fa1b4e01db5a02cbed235215ab59b6216699cd55d384237b1787d"
|
|
4021
4061
|
},
|
|
4062
|
+
{
|
|
4063
|
+
"path": "modules/lifecycle/routes/goal-route-authz.js",
|
|
4064
|
+
"mode": "0000644",
|
|
4065
|
+
"sha256": "b796c445009803c3567ab1361ca33aed53c00044f7d8959fc72a2044231d15e7"
|
|
4066
|
+
},
|
|
4022
4067
|
{
|
|
4023
4068
|
"path": "modules/lifecycle/routes/goals.js",
|
|
4024
4069
|
"mode": "0000644",
|
|
4025
|
-
"sha256": "
|
|
4070
|
+
"sha256": "1184ba92761bf7d7a478b8a45bf87f22637ee7429ef83a1e7459b86946596321"
|
|
4026
4071
|
},
|
|
4027
4072
|
{
|
|
4028
4073
|
"path": "modules/lifecycle/routes/help-requests.js",
|
|
@@ -4034,10 +4079,20 @@
|
|
|
4034
4079
|
"mode": "0000644",
|
|
4035
4080
|
"sha256": "637c442875fbe297e3aba54f4b6b16f9d06b740782e3506f65c58f34b67ea81d"
|
|
4036
4081
|
},
|
|
4082
|
+
{
|
|
4083
|
+
"path": "modules/lifecycle/routes/task-route-helpers.js",
|
|
4084
|
+
"mode": "0000644",
|
|
4085
|
+
"sha256": "e7e709127d13bdbe0333adaae6c9ed97afc6ca66d9476ccc0239c3ec2bbeacce"
|
|
4086
|
+
},
|
|
4087
|
+
{
|
|
4088
|
+
"path": "modules/lifecycle/routes/task-write-routes.js",
|
|
4089
|
+
"mode": "0000644",
|
|
4090
|
+
"sha256": "8adc74bb5d37e31ef56392ea7b48c59c982559f46ab4674664b936da5a5ce786"
|
|
4091
|
+
},
|
|
4037
4092
|
{
|
|
4038
4093
|
"path": "modules/lifecycle/routes/tasks.js",
|
|
4039
4094
|
"mode": "0000644",
|
|
4040
|
-
"sha256": "
|
|
4095
|
+
"sha256": "bede51a6892901088de9ea75e12250efa5f5cfb85b0e25403f92820eef622cd4"
|
|
4041
4096
|
},
|
|
4042
4097
|
{
|
|
4043
4098
|
"path": "modules/lifecycle/routes/versions.js",
|
|
@@ -4667,12 +4722,12 @@
|
|
|
4667
4722
|
{
|
|
4668
4723
|
"path": "package-lock.json",
|
|
4669
4724
|
"mode": "0000644",
|
|
4670
|
-
"sha256": "
|
|
4725
|
+
"sha256": "27cc593724db16a7e292e6f8287d3fadfbda3a6eaff49c1c97a08fe5bf175ce5"
|
|
4671
4726
|
},
|
|
4672
4727
|
{
|
|
4673
4728
|
"path": "package.json",
|
|
4674
4729
|
"mode": "0000644",
|
|
4675
|
-
"sha256": "
|
|
4730
|
+
"sha256": "5d2f06a29143a871ca7dd2f20d46ba2b05389a57aafddc6891147baa2a00e124"
|
|
4676
4731
|
},
|
|
4677
4732
|
{
|
|
4678
4733
|
"path": "public-docs/index.html",
|
|
@@ -5104,6 +5159,11 @@
|
|
|
5104
5159
|
"mode": "0000644",
|
|
5105
5160
|
"sha256": "73172141b376910a6b6bc5a326e6bebae1fb8d0a80441e18c9f5f7acf689b67d"
|
|
5106
5161
|
},
|
|
5162
|
+
{
|
|
5163
|
+
"path": "scripts/gds/box-infra.js",
|
|
5164
|
+
"mode": "0000644",
|
|
5165
|
+
"sha256": "bfbe7348ddc9895d4eed1a23efe9246b44850e1bfe6d6015d63a0b2a4433373d"
|
|
5166
|
+
},
|
|
5107
5167
|
{
|
|
5108
5168
|
"path": "scripts/gds/box-sync.js",
|
|
5109
5169
|
"mode": "0000644",
|
|
@@ -5112,7 +5172,7 @@
|
|
|
5112
5172
|
{
|
|
5113
5173
|
"path": "scripts/gds/box.js",
|
|
5114
5174
|
"mode": "0000644",
|
|
5115
|
-
"sha256": "
|
|
5175
|
+
"sha256": "d6533af0ebd1e75cda7816694871b4bac812b972b9e67b6f9cbbdaeaaf3f75a8"
|
|
5116
5176
|
},
|
|
5117
5177
|
{
|
|
5118
5178
|
"path": "scripts/gds/build-bongos.js",
|
|
@@ -5314,6 +5374,26 @@
|
|
|
5314
5374
|
"mode": "0000644",
|
|
5315
5375
|
"sha256": "7a7721155c8c7cb169a48e6f279e5d7c0ba0dc4462678a4a2ec41a2686501962"
|
|
5316
5376
|
},
|
|
5377
|
+
{
|
|
5378
|
+
"path": "scripts/gds/fitness-checks-identity.js",
|
|
5379
|
+
"mode": "0000644",
|
|
5380
|
+
"sha256": "5d731cf4703ca47be3dfd272f4bc74f6f49471f6b027474285cca4221fac47d5"
|
|
5381
|
+
},
|
|
5382
|
+
{
|
|
5383
|
+
"path": "scripts/gds/fitness-checks-vocabulary.js",
|
|
5384
|
+
"mode": "0000644",
|
|
5385
|
+
"sha256": "0834f2b0d48fab0644dcc2ae6dfd8b6f5b2dca96990072428d1f91a855827eb1"
|
|
5386
|
+
},
|
|
5387
|
+
{
|
|
5388
|
+
"path": "scripts/gds/fitness-checks-write-validation.js",
|
|
5389
|
+
"mode": "0000644",
|
|
5390
|
+
"sha256": "7ee041817c06a56d4801f4367a618384ad856235a5034d3abdafa9f9344bff0b"
|
|
5391
|
+
},
|
|
5392
|
+
{
|
|
5393
|
+
"path": "scripts/gds/fitness-lib.js",
|
|
5394
|
+
"mode": "0000644",
|
|
5395
|
+
"sha256": "765b21df77a1e9c31281e0321778da0cd204913d0485918f6a8f6ab291637dc0"
|
|
5396
|
+
},
|
|
5317
5397
|
{
|
|
5318
5398
|
"path": "scripts/gds/fitness-ratchets.js",
|
|
5319
5399
|
"mode": "0000644",
|
|
@@ -5322,7 +5402,7 @@
|
|
|
5322
5402
|
{
|
|
5323
5403
|
"path": "scripts/gds/fitness.js",
|
|
5324
5404
|
"mode": "0000644",
|
|
5325
|
-
"sha256": "
|
|
5405
|
+
"sha256": "c338e450fff2710b9d6b0abade5de212040b0c05e24c5538c7dc5c119919b487"
|
|
5326
5406
|
},
|
|
5327
5407
|
{
|
|
5328
5408
|
"path": "scripts/gds/gate-review.js",
|
|
@@ -5624,10 +5704,30 @@
|
|
|
5624
5704
|
"mode": "0000644",
|
|
5625
5705
|
"sha256": "9898b6f8e60b9f5ee4aeb9a023d1b68bb5bfbdf589eed10923a8e492716340ed"
|
|
5626
5706
|
},
|
|
5707
|
+
{
|
|
5708
|
+
"path": "scripts/gds/provision-config.js",
|
|
5709
|
+
"mode": "0000644",
|
|
5710
|
+
"sha256": "359674dd4ba6c7c4dd446882ec88f7d9feffd474300e17736d3129c2526082c1"
|
|
5711
|
+
},
|
|
5712
|
+
{
|
|
5713
|
+
"path": "scripts/gds/provision-net.js",
|
|
5714
|
+
"mode": "0000644",
|
|
5715
|
+
"sha256": "6ace73f27f37f5ec4807d92203dab42e11e114b1f87f2384f227be3f5440b490"
|
|
5716
|
+
},
|
|
5717
|
+
{
|
|
5718
|
+
"path": "scripts/gds/provision-repo.js",
|
|
5719
|
+
"mode": "0000644",
|
|
5720
|
+
"sha256": "bc1b8850038c8aaa8c0cbf2d5d9881f671b7cb959533802bc5d6b23b48ba15bd"
|
|
5721
|
+
},
|
|
5722
|
+
{
|
|
5723
|
+
"path": "scripts/gds/provision-units.js",
|
|
5724
|
+
"mode": "0000644",
|
|
5725
|
+
"sha256": "6fe61c756ca409fd4e7967144cf53a064a7095ab09006f71642d5cac860e93d7"
|
|
5726
|
+
},
|
|
5627
5727
|
{
|
|
5628
5728
|
"path": "scripts/gds/provision.js",
|
|
5629
5729
|
"mode": "0000644",
|
|
5630
|
-
"sha256": "
|
|
5730
|
+
"sha256": "2f9e608632b147602b8e141a0cba2071bf36e27fafadd410b7fea399f448250c"
|
|
5631
5731
|
},
|
|
5632
5732
|
{
|
|
5633
5733
|
"path": "scripts/gds/publish-credential-check.js",
|
|
@@ -6204,10 +6304,35 @@
|
|
|
6204
6304
|
"mode": "0000644",
|
|
6205
6305
|
"sha256": "4aafd99a0f8f83cb63f76ca8058ccffb57af651c1c8a4c999d64843289c6ad81"
|
|
6206
6306
|
},
|
|
6307
|
+
{
|
|
6308
|
+
"path": "src/bongos/auth-admission.js",
|
|
6309
|
+
"mode": "0000644",
|
|
6310
|
+
"sha256": "0895bbe37edb0d82d155c544f12ab6700dcaaf56ba1cee70df824ec1f40c3816"
|
|
6311
|
+
},
|
|
6312
|
+
{
|
|
6313
|
+
"path": "src/bongos/auth-config.js",
|
|
6314
|
+
"mode": "0000644",
|
|
6315
|
+
"sha256": "30ab3753d5ac33f6abcb1af3d76d2f63bfef2587557bb93a5d5cf7d11cb91ab0"
|
|
6316
|
+
},
|
|
6317
|
+
{
|
|
6318
|
+
"path": "src/bongos/auth-discord.js",
|
|
6319
|
+
"mode": "0000644",
|
|
6320
|
+
"sha256": "8c14f3184fafc669875632cb506c412b53cb290a1067a3a5dd6a1262c81d89bd"
|
|
6321
|
+
},
|
|
6322
|
+
{
|
|
6323
|
+
"path": "src/bongos/auth-github.js",
|
|
6324
|
+
"mode": "0000644",
|
|
6325
|
+
"sha256": "3edda18b71a5b0745b41d38b1d7b4597d8b9c1d5ec71ca65b37b3e93e7440cd1"
|
|
6326
|
+
},
|
|
6327
|
+
{
|
|
6328
|
+
"path": "src/bongos/auth-idp.js",
|
|
6329
|
+
"mode": "0000644",
|
|
6330
|
+
"sha256": "47cdcf53619cb7f534f7642fd2d4ba2a501bdd039bef5749ff9b3a605bc7ddff"
|
|
6331
|
+
},
|
|
6207
6332
|
{
|
|
6208
6333
|
"path": "src/bongos/auth.js",
|
|
6209
6334
|
"mode": "0000644",
|
|
6210
|
-
"sha256": "
|
|
6335
|
+
"sha256": "9d8dcaf0d20f418d3be9ce81b718613770719410b3273b5f5afdc50612280711"
|
|
6211
6336
|
},
|
|
6212
6337
|
{
|
|
6213
6338
|
"path": "src/bongos/cascade-dispatch.js",
|
|
@@ -6342,7 +6467,7 @@
|
|
|
6342
6467
|
{
|
|
6343
6468
|
"path": "src/bongos/routes/auth.js",
|
|
6344
6469
|
"mode": "0000644",
|
|
6345
|
-
"sha256": "
|
|
6470
|
+
"sha256": "e2195c0f80c1a7ae3a07e2234d2b97e6a20366b740fe3d0329dd8d8d6f9c1969"
|
|
6346
6471
|
},
|
|
6347
6472
|
{
|
|
6348
6473
|
"path": "src/bongos/routes/backup.js",
|
|
@@ -6452,7 +6577,7 @@
|
|
|
6452
6577
|
{
|
|
6453
6578
|
"path": "src/module-api.js",
|
|
6454
6579
|
"mode": "0000644",
|
|
6455
|
-
"sha256": "
|
|
6580
|
+
"sha256": "717fc58e2725b43ec1bc0a0e995172992ed0b42cba603c68482292b70da67c57"
|
|
6456
6581
|
},
|
|
6457
6582
|
{
|
|
6458
6583
|
"path": "src/module-loader/catalog.js",
|
|
@@ -6627,7 +6752,7 @@
|
|
|
6627
6752
|
{
|
|
6628
6753
|
"path": "tests/auth_admission_gate.mjs",
|
|
6629
6754
|
"mode": "0000644",
|
|
6630
|
-
"sha256": "
|
|
6755
|
+
"sha256": "0ecd7b6bd81ddd65f2da7a2c4be38097ae22cc6a2f31a71cfc2204d7dce2a0ca"
|
|
6631
6756
|
},
|
|
6632
6757
|
{
|
|
6633
6758
|
"path": "tests/auth_anthropic_identity.mjs",
|
|
@@ -6674,6 +6799,11 @@
|
|
|
6674
6799
|
"mode": "0000644",
|
|
6675
6800
|
"sha256": "92b7033ab16d9d4472fcca4695d9df47938a45bdc62feda87b8771f5a2d59ff2"
|
|
6676
6801
|
},
|
|
6802
|
+
{
|
|
6803
|
+
"path": "tests/auth_web_recovery.mjs",
|
|
6804
|
+
"mode": "0000644",
|
|
6805
|
+
"sha256": "84b20e0bd1d014ebec22d0ed9b50c45d9b79e26fe509af1444a2fa46a52f03ec"
|
|
6806
|
+
},
|
|
6677
6807
|
{
|
|
6678
6808
|
"path": "tests/authorship_audit.mjs",
|
|
6679
6809
|
"mode": "0000644",
|
|
@@ -7262,7 +7392,7 @@
|
|
|
7262
7392
|
{
|
|
7263
7393
|
"path": "tests/est_advisory.mjs",
|
|
7264
7394
|
"mode": "0000644",
|
|
7265
|
-
"sha256": "
|
|
7395
|
+
"sha256": "79f06c3bcfa41250519bdb784841fa10cd473dd881e996a04e7af046fd06cc2a"
|
|
7266
7396
|
},
|
|
7267
7397
|
{
|
|
7268
7398
|
"path": "tests/event_sound_prefs.mjs",
|
|
@@ -7392,7 +7522,7 @@
|
|
|
7392
7522
|
{
|
|
7393
7523
|
"path": "tests/goal_advisory.mjs",
|
|
7394
7524
|
"mode": "0000644",
|
|
7395
|
-
"sha256": "
|
|
7525
|
+
"sha256": "7488d41a0d962f681f9482e4c06f518f38be824e8fa936b5bd7b1c1b70838c3d"
|
|
7396
7526
|
},
|
|
7397
7527
|
{
|
|
7398
7528
|
"path": "tests/goal_cli.mjs",
|
|
@@ -7407,7 +7537,7 @@
|
|
|
7407
7537
|
{
|
|
7408
7538
|
"path": "tests/goal_criterion_confirm_ui.mjs",
|
|
7409
7539
|
"mode": "0000644",
|
|
7410
|
-
"sha256": "
|
|
7540
|
+
"sha256": "4f3979378f660463df2af31a3e56252ba839f6d63e70fd27441cf13fe05743f2"
|
|
7411
7541
|
},
|
|
7412
7542
|
{
|
|
7413
7543
|
"path": "tests/goal_dependencies_read.mjs",
|
|
@@ -7437,7 +7567,7 @@
|
|
|
7437
7567
|
{
|
|
7438
7568
|
"path": "tests/goal_subtitle.mjs",
|
|
7439
7569
|
"mode": "0000644",
|
|
7440
|
-
"sha256": "
|
|
7570
|
+
"sha256": "b963d8a8e5d5a405de841a5f965b99e5f4d34bdb33bdbf7964f961f0901c1cc8"
|
|
7441
7571
|
},
|
|
7442
7572
|
{
|
|
7443
7573
|
"path": "tests/goal_suggest.mjs",
|
|
@@ -7457,7 +7587,7 @@
|
|
|
7457
7587
|
{
|
|
7458
7588
|
"path": "tests/goals_card_view.mjs",
|
|
7459
7589
|
"mode": "0000644",
|
|
7460
|
-
"sha256": "
|
|
7590
|
+
"sha256": "053bedab4ef9ba95128237e18cbc850b4fdfe02f631493ddad992a7695f370b2"
|
|
7461
7591
|
},
|
|
7462
7592
|
{
|
|
7463
7593
|
"path": "tests/goals_lib.mjs",
|
|
@@ -7667,7 +7797,7 @@
|
|
|
7667
7797
|
{
|
|
7668
7798
|
"path": "tests/grader_generated_provenance.mjs",
|
|
7669
7799
|
"mode": "0000644",
|
|
7670
|
-
"sha256": "
|
|
7800
|
+
"sha256": "9c41daaad5111afb380b878cb0d3374d014bbadf5c2dc1e06b8f319712024fc4"
|
|
7671
7801
|
},
|
|
7672
7802
|
{
|
|
7673
7803
|
"path": "tests/grader_panel.mjs",
|
|
@@ -7712,7 +7842,7 @@
|
|
|
7712
7842
|
{
|
|
7713
7843
|
"path": "tests/hall_palette.mjs",
|
|
7714
7844
|
"mode": "0000644",
|
|
7715
|
-
"sha256": "
|
|
7845
|
+
"sha256": "a53080637382b2313c6ed16d013fec6102a604fe7b8c72260945b5c85cb9303b"
|
|
7716
7846
|
},
|
|
7717
7847
|
{
|
|
7718
7848
|
"path": "tests/hall_signout.mjs",
|
|
@@ -7732,7 +7862,7 @@
|
|
|
7732
7862
|
{
|
|
7733
7863
|
"path": "tests/helpers.mjs",
|
|
7734
7864
|
"mode": "0000644",
|
|
7735
|
-
"sha256": "
|
|
7865
|
+
"sha256": "89d0ebdf842108bcf807bd08663e9f83566d9b0ae80e72ba038f8d4f0b30b0f8"
|
|
7736
7866
|
},
|
|
7737
7867
|
{
|
|
7738
7868
|
"path": "tests/hierarchy-config.mjs",
|
|
@@ -7942,7 +8072,7 @@
|
|
|
7942
8072
|
{
|
|
7943
8073
|
"path": "tests/lib_sh_resolution.mjs",
|
|
7944
8074
|
"mode": "0000644",
|
|
7945
|
-
"sha256": "
|
|
8075
|
+
"sha256": "4ec5ac626d9f8a72fe0e0066b266feb1f87b38c0dd8ac52f107c23e37a6a2e97"
|
|
7946
8076
|
},
|
|
7947
8077
|
{
|
|
7948
8078
|
"path": "tests/lifecycle-card.mjs",
|
|
@@ -8007,7 +8137,7 @@
|
|
|
8007
8137
|
{
|
|
8008
8138
|
"path": "tests/membership_kind_lockstep.mjs",
|
|
8009
8139
|
"mode": "0000644",
|
|
8010
|
-
"sha256": "
|
|
8140
|
+
"sha256": "9df3e7bdc46fc7dc19840ef29a6a20a98478c7776b090664ab4e55fe6e8eff6a"
|
|
8011
8141
|
},
|
|
8012
8142
|
{
|
|
8013
8143
|
"path": "tests/memory_isolation.mjs",
|
|
@@ -8047,7 +8177,7 @@
|
|
|
8047
8177
|
{
|
|
8048
8178
|
"path": "tests/migration_allocation.mjs",
|
|
8049
8179
|
"mode": "0000644",
|
|
8050
|
-
"sha256": "
|
|
8180
|
+
"sha256": "7b0e40f4b3e348a45ccdc543dd1f3dfd78113ae86348823001e4eabb78f126de"
|
|
8051
8181
|
},
|
|
8052
8182
|
{
|
|
8053
8183
|
"path": "tests/migration_namespace.mjs",
|
|
@@ -8252,7 +8382,7 @@
|
|
|
8252
8382
|
{
|
|
8253
8383
|
"path": "tests/patch_gate_ordering.mjs",
|
|
8254
8384
|
"mode": "0000644",
|
|
8255
|
-
"sha256": "
|
|
8385
|
+
"sha256": "0412f6874d6046b7f74025b2b14c90cf345e904769502c2679365cd6d1fb8b11"
|
|
8256
8386
|
},
|
|
8257
8387
|
{
|
|
8258
8388
|
"path": "tests/path_match.mjs",
|
|
@@ -8437,7 +8567,7 @@
|
|
|
8437
8567
|
{
|
|
8438
8568
|
"path": "tests/rank_tier_single_source.mjs",
|
|
8439
8569
|
"mode": "0000644",
|
|
8440
|
-
"sha256": "
|
|
8570
|
+
"sha256": "572da54574a1f86c4cc7bf3ecc361941931ee71db5db0f8d0496d355e57f2871"
|
|
8441
8571
|
},
|
|
8442
8572
|
{
|
|
8443
8573
|
"path": "tests/rate_limit_public.mjs",
|
|
@@ -8497,7 +8627,7 @@
|
|
|
8497
8627
|
{
|
|
8498
8628
|
"path": "tests/reward_gate.mjs",
|
|
8499
8629
|
"mode": "0000644",
|
|
8500
|
-
"sha256": "
|
|
8630
|
+
"sha256": "02236ab849caabdf886f99aff4821c813b9f7548839ab9ee3b548fa522b9f3fb"
|
|
8501
8631
|
},
|
|
8502
8632
|
{
|
|
8503
8633
|
"path": "tests/reward_mode_cost_plus_only.mjs",
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# 0187 — The OAuth web-handshake cookies live 30 minutes, and move together
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-08-24
|
|
5
|
+
- **Tasks:** [#1003234](https://cloudbongos.com/builders#/task/1003234) (goal 1000058 — the non-cloudbongos project lifecycle; a walk finding from the 2026-08-24 stranger's-walk review, task 1003232)
|
|
6
|
+
- **Builds on:** [ADR 0143](<redacted>.md) (the `gds_oauth_repos` opt-in cookie), #726/#734 (the `gds_return` return cookie and the apex-scoped state)
|
|
7
|
+
- **Related:** [ADR 0141](<redacted>.md) (the federated leg shares the same state cookie)
|
|
8
|
+
|
|
9
|
+
## 1. Context
|
|
10
|
+
|
|
11
|
+
`GET /api/gds/auth/web/start` sets three cookies before bouncing the visitor to
|
|
12
|
+
GitHub: the CSRF **state** (`gds_oauth_state`), the validated **return target**
|
|
13
|
+
(`gds_return`) and the **repo-scope opt-in** (`gds_oauth_repos`). All three were
|
|
14
|
+
`maxAge: 10 minutes` — written for a hall builder who already has a GitHub
|
|
15
|
+
account and is back in seconds.
|
|
16
|
+
|
|
17
|
+
A founder's first sign-in is not that. The project wizard's gate sends them to
|
|
18
|
+
GitHub with `?repos=1`; a stranger with no GitHub account signs up there first,
|
|
19
|
+
verifies an email, sometimes sets up 2FA, and comes back. Past ten minutes the
|
|
20
|
+
callback found no state cookie and answered **"State mismatch"** — and because
|
|
21
|
+
the return and repos cookies had expired with it, the page's "try signing in
|
|
22
|
+
again" door was a bare `/auth/web/start`: the founder re-entered without the
|
|
23
|
+
repository scope and landed on the default post-login landing, nowhere near
|
|
24
|
+
the wizard. The review filed it as a founder-shaped dead end.
|
|
25
|
+
|
|
26
|
+
The state cookie is CSRF protection for the OAuth callback. Lengthening it is a
|
|
27
|
+
security-posture change, not a copy tweak, and the task said so; hence this
|
|
28
|
+
record.
|
|
29
|
+
|
|
30
|
+
## 2. Decision
|
|
31
|
+
|
|
32
|
+
1. **One lifetime, `HANDSHAKE_COOKIE_MS = 30 * 60 * 1000`, for all three
|
|
33
|
+
cookies.** They MUST move together: a state that outlives its return cookie
|
|
34
|
+
lands a founder on the default landing with no repo scope; a return that
|
|
35
|
+
outlives its state lands them on "State mismatch". The constant lives beside
|
|
36
|
+
the cookie names in `src/bongos/routes/auth.js`; the State-mismatch copy
|
|
37
|
+
reads it rather than hardcoding a number.
|
|
38
|
+
2. **Every OAuth error page rebuilds its retry door from whatever cookies are
|
|
39
|
+
still valid** (`recoveryStartHref(req)`: `return` through the same
|
|
40
|
+
open-redirect allowlist as the callback, `repos=1` from the opt-in cookie),
|
|
41
|
+
and so does the access-pending page's auto-walk-in. The lifetime change
|
|
42
|
+
makes the dead end rare; the door change makes it recoverable when it
|
|
43
|
+
still happens.
|
|
44
|
+
3. The Discord account-link state cookie is a different flow (an already
|
|
45
|
+
signed-in builder linking an account) and keeps its 10 minutes.
|
|
46
|
+
|
|
47
|
+
## 3. What did NOT change — the posture, stated plainly
|
|
48
|
+
|
|
49
|
+
- The state is still **single-use**: the callback clears it (apex-scoped and
|
|
50
|
+
host-only forms) on every path, and GitHub's authorization code is itself
|
|
51
|
+
single-use, so a captured state cannot be replayed into a session.
|
|
52
|
+
- Still `httpOnly`, `sameSite=lax`, `secure` behind TLS, apex-scoped — a
|
|
53
|
+
cross-site page cannot read or send it.
|
|
54
|
+
- The redirect_uri is still pinned to the canonical origin (#734), and
|
|
55
|
+
`safeReturnTo` still bounds every return target.
|
|
56
|
+
|
|
57
|
+
What grew is only the **window in which a legitimate handshake may complete**:
|
|
58
|
+
an attacker who could fixate a victim's state cookie (already requiring a
|
|
59
|
+
foothold this cookie's flags deny) has thirty minutes instead of ten to
|
|
60
|
+
complete a login-CSRF against a browser that has not itself finished the
|
|
61
|
+
handshake. Thirty was chosen as the smallest round number that comfortably
|
|
62
|
+
covers a GitHub signup with email verification; sixty was not needed.
|
|
63
|
+
|
|
64
|
+
## 4. Rejected
|
|
65
|
+
|
|
66
|
+
- **Keep the state at 10 minutes and lengthen only `return` + `repos`.** That
|
|
67
|
+
makes the "State mismatch" page recoverable (its door would still carry the
|
|
68
|
+
return + scope) but keeps the dead-end page itself as the founder's
|
|
69
|
+
experience — and it breaks the one-lifetime invariant in the other
|
|
70
|
+
direction, so a builder who *did* come back inside ten minutes could see a
|
|
71
|
+
return cookie from an older, abandoned start. The three move together.
|
|
72
|
+
- **A server-side state store with a long TTL.** Correct in the abstract, a new
|
|
73
|
+
table and a sweep for a problem a cookie lifetime solves; not for this task.
|
|
74
|
+
- **Sixty minutes.** Wider than the failure needs.
|
|
75
|
+
|
|
76
|
+
## 5. Consequences
|
|
77
|
+
|
|
78
|
+
- `tests/auth_web_recovery.mjs` pins the constant, the three `maxAge` sites in
|
|
79
|
+
`/auth/web/start`, the copy that reads it, and the recovery helper by value
|
|
80
|
+
(including the allowlist dropping foreign, protocol-relative and
|
|
81
|
+
`javascript:` returns).
|
|
82
|
+
- If GitHub's signup flow ever grows past thirty minutes for a typical
|
|
83
|
+
founder, the constant is the one place to move — and the invariant is that
|
|
84
|
+
all three cookies move with it.
|
package/docs/adr/README.md
CHANGED
|
@@ -260,5 +260,6 @@ This keeps the decision history honest and traceable.
|
|
|
260
260
|
| 0184 | [**A ship must account for itself: `shipTask` requires a land proof or a declared no-artifact** ([task 1002483](https://cloudbongos.com/builders#/task/1002483), goal 1000024). `db.shipTask` is the confirmed→shipped flip and, since [ADR 0120](<redacted>.md), where the CREDIT is booked — yet its only precondition was `WHERE status = 'confirmed'`, nothing about whether code reached main. The two AUTOMATED paths each proved the land first; the MANUAL route passed nothing, so a task confirmed with no pushed code could be shipped by its claim holder **or by any Metic+ sweeping `/merge-mode`**, booking its `task.shipped` credit. It stayed untracked for two months because its tracking task was closed in June asserting task 1001547 had delivered the gate — it had not, blocker 1000047's own final update says so, and the code agreed with the blocker rather than the closure note: **a hole hidden by a record nobody checked**, which is the same failure the gate is about. Decision: the gate lives at the WRITE, not the route (a route gate leaves the invariant unenforced at the layer that moves the ledger, so the next caller reopens it silently), and `shipTask` is FAIL-CLOSED on a required `landAssurance`. TWO kinds, and the second is why this does not make things worse: `proof` (this task's commit is on main) and **`no_artifact`** — a deliberate DB-only ship, an explicitly supported shape (CLAUDE.md "Direct DB writes are work too") that [task 1002478](https://cloudbongos.com/builders#/task/1002478) documents as a dead end below Archon. A naive proof-only gate would have made 1002478 strictly worse; naming no-artifact as a KIND turns it from an absence the gate must be talked out of into a recorded answer. Both carry a reason, audited post-commit and best-effort (an audit miss must never roll back a landed ship). `ship.js` now declares its own `--db-only`/`--allow-empty` lands, without which this fix would have regressed the very flow CLAUDE.md calls supported. Rejected: (b) gate only the route — leaves the write unguarded; (c) record the residual as tolerable — defensible on blast radius and genuinely close, but it would have been the FOURTH record asserting this was handled with nothing checkable behind it. Does NOT gate confirm: a codeless confirm is still accepted, it simply cannot reach `shipped` or pay.](<redacted>.md) | lifecycle / integrity |
|
|
261
261
|
| 0185 | [**The spark-handoff credit split: 70% developer, 30% spark author** ([task 1002923](https://cloudbongos.com/builders#/task/1002923), BV1.R147, goal 1000062 — completing the chain [task 1002920](https://cloudbongos.com/builders#/task/1002920) mark → [task 1002921](https://cloudbongos.com/builders#/task/1002921) queue → [task 1002922](https://cloudbongos.com/builders#/task/1002922) pickup). [ADR 0172](<redacted>.md) built the ideator streams and paid `captured_by`, the only person an idea then had. The spark handoff created a second: R146 develops a spark IN PLACE, preserving the author while recording a `developed_by`. **R146 therefore shipped paying NOTHING on purpose** — not an oversight but a refusal to guess, because `awardIdeaFullPassCredit`'s idempotency predicate is `(builder_id, reason)`, so paying the DEVELOPER would not have blocked a later payment to the AUTHOR and one idea would have paid twice; the cost of that caution was that a developed Full Idea received stream 2 **never** unless its author resubmitted. Owner decision (2026-08-22): **70/30 favouring the developer**, on BOTH existing streams, one ratio so there is one rule to explain. The reasoning is behavioural, not sentimental — developing someone else's spark is the scarce act the queue depends on, and at an even split it pays HALF what authoring your own Full Idea pays for the same writing work, so the rational move is always to write your own and the R145 queue stays a list nobody reads. The author keeps 30% plus their share of stream 1 on every task shipped under the idea, forever. `IDEA_DEVELOPER_SHARE = 0.70` is a **policy constant in `credits.js`** beside the pass bar and quick factor (ADR 0172's own consequence, the ADR 0023 precedent): a share of someone's earnings deserves a review and a commit, not a runtime edit. **The structural half is what retires R146's caution:** the economy module now derives the payees itself (`ideaCreditParties` reads `captured_by` + `developed_by`), so the caller can no longer choose a recipient — the develop route hands over an idea and a score, never a payee, and books the split like any other path (fail-open; the development has already committed). Three arithmetic properties, each a real bug if missed: the total is **conserved** (developer rounded, author gets the REMAINDER — rounding both pays 6 out of a 5-credit payout); a **self-developed** idea collapses to ONE payee, because two rows for one builder would silently UNDER-pay under the per-builder idempotency predicate, not double-pay (the comparison normalises via `String()` since `bigint` arrives as a string, so a type mismatch cannot become a phantom payee); and **zero-value rows are dropped**. Ids otherwise pass through unconverted — `Number()`-ing a `bigint` risks precision. `builder_id` in the idempotency predicate, which entered as an index optimisation (the R143/IC2 grader finding), is now **load-bearing for correctness**: two payees share one `reason`, so a reason-only predicate would refuse the second, and a partially-booked split completes on the next call. **Not decided here:** stream 3's split (ships with the Board Room, task 1002999), and whether `origin='develop'` in `ideas_task_lineage` belongs to whoever promotes a DEVELOPED idea into a task — ADR 0172 §5 says the row is "set at promotion and at develop (R146)", but R146 creates no task, so that origin stays deliberately unwired rather than invented; it changes who stream 1 pays.](<redacted>.md) | economy / ideator lane |
|
|
262
262
|
| 0186 | [**Per-project idea templates: the seam is already built; the economics are the open problem** ([task 1002932](https://cloudbongos.com/builders#/task/1002932), BV1.R156, goal 1000062 — a SPIKE, output is this ADR plus a task list, no implementation). The literal question — how does a founder define their own idea shape without a schema change or forking the scorer — is **already answered by shipped work**: R141 gave every template function an optional `registry` defaulting to the built-in one, so validation and scoring both read the declaration as data; `ideas_grades.template_key` is per-row with a format CHECK whose own comment says a project key "stays addressable"; and `provisioning_instances.settings jsonb` is an existing per-project home. **No schema change, no fork.** Decision A: a **`project-settings` kernel port**, sibling of `builder-settings`, read via `resolveOptional` so a vanilla instance with no provisioning module degrades to the built-in registry; `base-v1` stays the default and the fallback for an unresolvable key. Rejected a new `ideas_templates` table (second home for data that has one) and a config file (per-instance, but one instance hosts many projects). **Decision B is the finding that matters.** Completeness is normalised 0–100 WITHIN its template (mean of per-field ratios), while karma reads it against an absolute bar (`IDEA_FULL_PASS_BAR = 60`, `IDEA_FULL_PASS_CREDIT = 5`) — so template choice becomes a credit-minting lever: `base-v1` needs ~200 characters for 5 credits, a 1-field template with `substanceMin` 10 needs ~10, a ~20× arbitrage handed to exactly the projects this ADR empowers. Shipping A without B would make the feature a way to print credits. The fix separates the two questions one number is answering: **completeness stays relative** (it is the right signal for triage ordering and the hall meter) and **karma stops reading it**, switching to an absolute substance total the scorer already computes per field and currently discards after averaging. An interim guard (≥3 required fields, ≥120 total `substanceMin`) bounds the arbitrage without fixing it. Decision C: an optional per-field `weight` (default 1) turning the unweighted mean into a weighted one — today's behaviour is the all-weights-1 case, so it is a data addition and one arithmetic line. Decision D: the five base fields are **not** mandatory (forcing them would make "define your own" cosmetic), replaced by two constraints — a template must declare ≥1 required field, and a stored template is validated at WRITE time so a malformed one is refused there rather than discovered inside the capture path, which must never throw. **Boundary note:** goal 1000062's wall is `[ideas, hall-ui]`, so the port task (provisioning + kernel) and the karma task (economy) cannot be claimed under it.](<redacted>.md) | ideas / templates |
|
|
263
|
+
| 0187 | [**The OAuth web-handshake cookies live 30 minutes, and move together** ([task 1003234](https://cloudbongos.com/builders#/task/1003234), goal 1000058). The three cookies `/auth/web/start` sets — the CSRF state, the validated return target, the repo-scope opt-in — were 10 minutes each, a hall builder's timescale; a founder's first sign-in can include a GitHub SIGNUP with email verification and came back past ten minutes to "State mismatch" with the return + repo scope gone, and the page's retry door was a bare start. Decision: one `HANDSHAKE_COOKIE_MS = 30 min` for all three (they MUST move together — a state outliving its return cookie lands on the default landing with no scope, a return outliving its state lands on State mismatch), and every OAuth error page plus the access-pending auto-walk-in rebuilds its door from whatever cookies are still valid (`recoveryStartHref`, through the same open-redirect allowlist). What did NOT change: the state is still single-use, still `httpOnly`/`sameSite=lax`/apex-scoped, the code still the bearer — only the window for a legitimate handshake grew. Rejected: lengthening only return + repos (keeps the dead end and breaks the one-lifetime invariant the other way), a server-side state store, sixty minutes. The Discord-link state cookie is a different flow and keeps 10.](<redacted>.md) | auth / security posture |
|
|
263
264
|
|
|
264
265
|
> ⚠️ **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
|
@@ -12133,7 +12133,7 @@
|
|
|
12133
12133
|
"summary": "POST /tasks",
|
|
12134
12134
|
"description": "Task create/promote/edit (plan/scope mutation) is Metic+ as of ADR 0090 (owner decision 2026-06-26): a Metic who can run idea-triage may also seed + shape tasks. Was Archon-only (task task 106 / ADR 0016; three-rank model task 360 / ADR 0018). A Xenos/Thetes still cannot author — they file ideas. Setting rank and closing versions stay Archon. The every-route audit is task task 231 (V3.R06). rank: metic+archon — create work (plan/scope mutation); ADR 0090 (was ADR 0016/0018 archon).\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `task.create` (all required).",
|
|
12135
12135
|
"x-rank": "metic+archon",
|
|
12136
|
-
"x-source": "modules/lifecycle/routes/
|
|
12136
|
+
"x-source": "modules/lifecycle/routes/task-write-routes.js",
|
|
12137
12137
|
"x-permissions": [
|
|
12138
12138
|
"task.create"
|
|
12139
12139
|
],
|
|
@@ -12410,7 +12410,7 @@
|
|
|
12410
12410
|
"summary": "PATCH /tasks/:id",
|
|
12411
12411
|
"description": "PATCH /tasks/:id — supports body.parent_task_id (V2 C2), body.kind (V2 B1), body.discipline (mig 014), body.parallel_safe (mig 028), and body.newcomer_friendly (task 360 / ADR 0018 + V3.R15 task 239 — body.touches was removed in touches[] cleanup [4/8] (task 879) along with the drift scanner — open a task to the Xenos sandbox; alias body.xenos_claimable accepted for pre-rename callers). Pass parent_task_id: null to detach; parallel_safe accepts true|false|null; newcomer_friendly is a boolean. Validation lives in hierarchy.js for parent; the rest are validated inline. rank: metic+archon — edit work (incl. newcomer_friendly flag); ADR 0090 (was ADR 0016 archon).\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `task.edit` (all required).",
|
|
12412
12412
|
"x-rank": "metic+archon",
|
|
12413
|
-
"x-source": "modules/lifecycle/routes/
|
|
12413
|
+
"x-source": "modules/lifecycle/routes/task-write-routes.js",
|
|
12414
12414
|
"x-permissions": [
|
|
12415
12415
|
"task.edit"
|
|
12416
12416
|
],
|
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. 304 endpoints across
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 304 endpoints across 49 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`.
|