@bongos/core 1.19.880 → 1.19.882
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 +40 -35
- package/clients/bongos-client/index.d.ts +1 -1
- package/docs/adr/0304-routine-reads-run-without-a-prompt-and-anything-a-flag-can-turn-into-a-write-is-exact-form.md +79 -4
- package/docs/api/openapi.json +0 -4
- package/docs/api-reference.md +1 -1
- package/docs/copy-inventory.md +46 -46
- package/docs/copy-registry.json +57 -57
- package/docs/file-map.md +1 -0
- package/docs/module-api-changelog.md +4 -0
- package/docs/project-context.template.md +2 -2
- package/modules/hall-ui/public/primer.js +0 -1
- package/modules/hall-ui/public/roadmap.css +0 -11
- package/modules/hall-ui/public/roadmap.js +7 -15
- package/modules/lifecycle/db-versions.js +17 -13
- package/modules/lifecycle/routes/versions.js +1 -11
- package/modules/lifecycle/version-autoclose.js +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/claude-materialize.js +39 -34
- package/scripts/gds/init.js +0 -3
- package/scripts/gds/provision-repo.js +5 -4
- package/src/module-api.js +1 -1
- package/tests/allow_rule_guard.mjs +192 -0
- package/tests/box_ship_permissions.mjs +143 -62
- package/tests/claude_materialize.mjs +8 -4
- package/tests/host_topology_skips.mjs +1 -0
- package/tests/init.mjs +15 -12
- package/tests/provision.mjs +8 -3
- package/tests/version_first_goal.mjs +4 -2
- package/tests/versions_route.mjs +37 -12
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.882",
|
|
6
|
+
"core_contract": "1.19.882",
|
|
7
|
+
"source_commit": "53773e5b697f506fc84dd9bea64f16a7bf5e3ed7",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-19T18:55:17.107Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 501,
|
|
13
13
|
"agent_docs_stubbed": 26,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2312,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2839,
|
|
20
|
+
"tree_sha256": "75c8382243dd3244295f5de5f2f89f988899b41aaee0d8f212952a215c78bf00",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -367,7 +367,7 @@
|
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "97df7667d10d5678cfdbdcd496b51bec50add8ce83fb1b642ad7d42fcb362cec"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/index.mjs",
|
|
@@ -2012,7 +2012,7 @@
|
|
|
2012
2012
|
{
|
|
2013
2013
|
"path": "docs/adr/0304-routine-reads-run-without-a-prompt-and-anything-a-flag-can-turn-into-a-write-is-exact-form.md",
|
|
2014
2014
|
"mode": "0000644",
|
|
2015
|
-
"sha256": "
|
|
2015
|
+
"sha256": "07f8739f97ff38414993a4d7e4ca62ad24c540e77e54e3aedb631d584da9ada0"
|
|
2016
2016
|
},
|
|
2017
2017
|
{
|
|
2018
2018
|
"path": "docs/adr/0305-a-recipe-lives-with-what-it-documents.md",
|
|
@@ -2042,12 +2042,12 @@
|
|
|
2042
2042
|
{
|
|
2043
2043
|
"path": "docs/api-reference.md",
|
|
2044
2044
|
"mode": "0000644",
|
|
2045
|
-
"sha256": "
|
|
2045
|
+
"sha256": "6ea97c68b9346b508489108ef1dde08daea5354ab8276ae0959f25e4528289f9"
|
|
2046
2046
|
},
|
|
2047
2047
|
{
|
|
2048
2048
|
"path": "docs/api/openapi.json",
|
|
2049
2049
|
"mode": "0000644",
|
|
2050
|
-
"sha256": "
|
|
2050
|
+
"sha256": "5ca72d280163127bea9ec0867c80023041b22040e47531a290481e15c6e26fba"
|
|
2051
2051
|
},
|
|
2052
2052
|
{
|
|
2053
2053
|
"path": "docs/architecture.md",
|
|
@@ -2072,12 +2072,12 @@
|
|
|
2072
2072
|
{
|
|
2073
2073
|
"path": "docs/copy-inventory.md",
|
|
2074
2074
|
"mode": "0000644",
|
|
2075
|
-
"sha256": "
|
|
2075
|
+
"sha256": "975590f5b51bb0fbdcace395fe2700ebb6113ed463d29e479072ed1b00476053"
|
|
2076
2076
|
},
|
|
2077
2077
|
{
|
|
2078
2078
|
"path": "docs/copy-registry.json",
|
|
2079
2079
|
"mode": "0000644",
|
|
2080
|
-
"sha256": "
|
|
2080
|
+
"sha256": "5f70fd3dc4880222ab4cf6b98a8ed8a848dd06e4e88b9a0481541a7fc5030cac"
|
|
2081
2081
|
},
|
|
2082
2082
|
{
|
|
2083
2083
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2592,7 +2592,7 @@
|
|
|
2592
2592
|
{
|
|
2593
2593
|
"path": "docs/file-map.md",
|
|
2594
2594
|
"mode": "0000644",
|
|
2595
|
-
"sha256": "
|
|
2595
|
+
"sha256": "89bfd7d8da1430abf5d67caf8cba4bf18be0ea934f656145068a0e5622d8efa5"
|
|
2596
2596
|
},
|
|
2597
2597
|
{
|
|
2598
2598
|
"path": "docs/handoff-template.md",
|
|
@@ -2602,7 +2602,7 @@
|
|
|
2602
2602
|
{
|
|
2603
2603
|
"path": "docs/module-api-changelog.md",
|
|
2604
2604
|
"mode": "0000644",
|
|
2605
|
-
"sha256": "
|
|
2605
|
+
"sha256": "9be0e20f1f760b01e4fdbd63ab26034c7b327be17ffd56898f775d40e12aad1f"
|
|
2606
2606
|
},
|
|
2607
2607
|
{
|
|
2608
2608
|
"path": "docs/modules-contract.md",
|
|
@@ -2692,7 +2692,7 @@
|
|
|
2692
2692
|
{
|
|
2693
2693
|
"path": "docs/project-context.template.md",
|
|
2694
2694
|
"mode": "0000644",
|
|
2695
|
-
"sha256": "
|
|
2695
|
+
"sha256": "ce903d2f7e9df2b8fb1448e0ef7de4269beb0fa5f509aa5d8aea03d043370684"
|
|
2696
2696
|
},
|
|
2697
2697
|
{
|
|
2698
2698
|
"path": "docs/recipes/README.md",
|
|
@@ -5187,7 +5187,7 @@
|
|
|
5187
5187
|
{
|
|
5188
5188
|
"path": "modules/hall-ui/public/primer.js",
|
|
5189
5189
|
"mode": "0000644",
|
|
5190
|
-
"sha256": "
|
|
5190
|
+
"sha256": "862be6ec9f2846f7caeabbfd982ec04a7c65a56d4b042dc9fb8e899b4735284e"
|
|
5191
5191
|
},
|
|
5192
5192
|
{
|
|
5193
5193
|
"path": "modules/hall-ui/public/primer.states.json",
|
|
@@ -5277,7 +5277,7 @@
|
|
|
5277
5277
|
{
|
|
5278
5278
|
"path": "modules/hall-ui/public/roadmap.css",
|
|
5279
5279
|
"mode": "0000644",
|
|
5280
|
-
"sha256": "
|
|
5280
|
+
"sha256": "ea64e6904225470e20d8bb4a0d18f39f7a1e70406ecdec67ed9abaaf2880fc85"
|
|
5281
5281
|
},
|
|
5282
5282
|
{
|
|
5283
5283
|
"path": "modules/hall-ui/public/roadmap.html",
|
|
@@ -5287,7 +5287,7 @@
|
|
|
5287
5287
|
{
|
|
5288
5288
|
"path": "modules/hall-ui/public/roadmap.js",
|
|
5289
5289
|
"mode": "0000644",
|
|
5290
|
-
"sha256": "
|
|
5290
|
+
"sha256": "cddeb1d315e7222724199fef9a3045f2c7def92a63c56d0151c5e45a38ff7b3d"
|
|
5291
5291
|
},
|
|
5292
5292
|
{
|
|
5293
5293
|
"path": "modules/hall-ui/public/roadmap.states.json",
|
|
@@ -5692,7 +5692,7 @@
|
|
|
5692
5692
|
{
|
|
5693
5693
|
"path": "modules/lifecycle/db-versions.js",
|
|
5694
5694
|
"mode": "0000644",
|
|
5695
|
-
"sha256": "
|
|
5695
|
+
"sha256": "f5f056b9d8f8147956e7bc088b9cf729d0e5563d0f36cbd260388ea1deba0a8a"
|
|
5696
5696
|
},
|
|
5697
5697
|
{
|
|
5698
5698
|
"path": "modules/lifecycle/db.js",
|
|
@@ -5967,7 +5967,7 @@
|
|
|
5967
5967
|
{
|
|
5968
5968
|
"path": "modules/lifecycle/routes/versions.js",
|
|
5969
5969
|
"mode": "0000644",
|
|
5970
|
-
"sha256": "
|
|
5970
|
+
"sha256": "f26de67bbb2bc311e3c258cb8946402006c8705653edbb020435a9e7653945d7"
|
|
5971
5971
|
},
|
|
5972
5972
|
{
|
|
5973
5973
|
"path": "modules/lifecycle/routes/visuals.js",
|
|
@@ -6027,7 +6027,7 @@
|
|
|
6027
6027
|
{
|
|
6028
6028
|
"path": "modules/lifecycle/version-autoclose.js",
|
|
6029
6029
|
"mode": "0000644",
|
|
6030
|
-
"sha256": "
|
|
6030
|
+
"sha256": "28b656a9c2688246ca3da7c9eb20da552a3487e2a7412315a49577db9570dc4f"
|
|
6031
6031
|
},
|
|
6032
6032
|
{
|
|
6033
6033
|
"path": "modules/lifecycle/version-close.js",
|
|
@@ -7927,12 +7927,12 @@
|
|
|
7927
7927
|
{
|
|
7928
7928
|
"path": "package-lock.json",
|
|
7929
7929
|
"mode": "0000644",
|
|
7930
|
-
"sha256": "
|
|
7930
|
+
"sha256": "3062290396748c314e30d2e8d5fc37771f16add79c0a3e2260ff0c4f75fa1244"
|
|
7931
7931
|
},
|
|
7932
7932
|
{
|
|
7933
7933
|
"path": "package.json",
|
|
7934
7934
|
"mode": "0000644",
|
|
7935
|
-
"sha256": "
|
|
7935
|
+
"sha256": "1c24014839d73e6c52495564dbf5b7c62a56770849a6985575f7ae6715dd088f"
|
|
7936
7936
|
},
|
|
7937
7937
|
{
|
|
7938
7938
|
"path": "public-docs/index.html",
|
|
@@ -8282,7 +8282,7 @@
|
|
|
8282
8282
|
{
|
|
8283
8283
|
"path": "scripts/gds/claude-materialize.js",
|
|
8284
8284
|
"mode": "0000644",
|
|
8285
|
-
"sha256": "
|
|
8285
|
+
"sha256": "8ac759488eef696a18a0035f51deed3b537c44f28d0191a108692b2399ae1787"
|
|
8286
8286
|
},
|
|
8287
8287
|
{
|
|
8288
8288
|
"path": "scripts/gds/claude-md-template.js",
|
|
@@ -8662,7 +8662,7 @@
|
|
|
8662
8662
|
{
|
|
8663
8663
|
"path": "scripts/gds/init.js",
|
|
8664
8664
|
"mode": "0000644",
|
|
8665
|
-
"sha256": "
|
|
8665
|
+
"sha256": "f24475957efcba217133ef05c297e5a9f11d78ae884a6e7286084723d9daf912"
|
|
8666
8666
|
},
|
|
8667
8667
|
{
|
|
8668
8668
|
"path": "scripts/gds/install-git-hooks.js",
|
|
@@ -8907,7 +8907,7 @@
|
|
|
8907
8907
|
{
|
|
8908
8908
|
"path": "scripts/gds/provision-repo.js",
|
|
8909
8909
|
"mode": "0000644",
|
|
8910
|
-
"sha256": "
|
|
8910
|
+
"sha256": "d0ddb9cbd67fdef45d72d29994e772239044bcfb45ccaf81e3e54783c588d970"
|
|
8911
8911
|
},
|
|
8912
8912
|
{
|
|
8913
8913
|
"path": "scripts/gds/provision-teardown.js",
|
|
@@ -9937,7 +9937,7 @@
|
|
|
9937
9937
|
{
|
|
9938
9938
|
"path": "src/module-api.js",
|
|
9939
9939
|
"mode": "0000644",
|
|
9940
|
-
"sha256": "
|
|
9940
|
+
"sha256": "8f029fa54f8656711dea16cd051c3c13eb3e6b277d9f8786980bab6361b75bfb"
|
|
9941
9941
|
},
|
|
9942
9942
|
{
|
|
9943
9943
|
"path": "src/module-loader/catalog.js",
|
|
@@ -10119,6 +10119,11 @@
|
|
|
10119
10119
|
"mode": "0000644",
|
|
10120
10120
|
"sha256": "51274ba95e93269568b1df338fbadd9345bebbe8e09484d821682dd78a72b120"
|
|
10121
10121
|
},
|
|
10122
|
+
{
|
|
10123
|
+
"path": "tests/allow_rule_guard.mjs",
|
|
10124
|
+
"mode": "0000644",
|
|
10125
|
+
"sha256": "f4c30504e6240d68774e8960d031888616074d90e60e0edb5adddec2c820ac75"
|
|
10126
|
+
},
|
|
10122
10127
|
{
|
|
10123
10128
|
"path": "tests/api_alias_exceptions.mjs",
|
|
10124
10129
|
"mode": "0000644",
|
|
@@ -10552,7 +10557,7 @@
|
|
|
10552
10557
|
{
|
|
10553
10558
|
"path": "tests/box_ship_permissions.mjs",
|
|
10554
10559
|
"mode": "0000644",
|
|
10555
|
-
"sha256": "
|
|
10560
|
+
"sha256": "19f3547c2ba64e7b965512f2da3bc2689b39e79739b60deee7b4b750b588345c"
|
|
10556
10561
|
},
|
|
10557
10562
|
{
|
|
10558
10563
|
"path": "tests/box_sweep_docs.mjs",
|
|
@@ -10712,7 +10717,7 @@
|
|
|
10712
10717
|
{
|
|
10713
10718
|
"path": "tests/claude_materialize.mjs",
|
|
10714
10719
|
"mode": "0000644",
|
|
10715
|
-
"sha256": "
|
|
10720
|
+
"sha256": "6354cd31332b41d64ada0c89363c5a17b9bbb5e5589e3bcf993afc7614591782"
|
|
10716
10721
|
},
|
|
10717
10722
|
{
|
|
10718
10723
|
"path": "tests/clawback_confirmed_backlog.mjs",
|
|
@@ -11942,7 +11947,7 @@
|
|
|
11942
11947
|
{
|
|
11943
11948
|
"path": "tests/host_topology_skips.mjs",
|
|
11944
11949
|
"mode": "0000644",
|
|
11945
|
-
"sha256": "
|
|
11950
|
+
"sha256": "73d41870f08c804771fff35796fcfab41b67fec27954f9434025e12d8db5fe86"
|
|
11946
11951
|
},
|
|
11947
11952
|
{
|
|
11948
11953
|
"path": "tests/hub_disconnect_ui.mjs",
|
|
@@ -12112,7 +12117,7 @@
|
|
|
12112
12117
|
{
|
|
12113
12118
|
"path": "tests/init.mjs",
|
|
12114
12119
|
"mode": "0000644",
|
|
12115
|
-
"sha256": "
|
|
12120
|
+
"sha256": "26629f6a3882b35f6844b8f0f9af9221e53a0906bb89401e8e23b3e5aee8d1f0"
|
|
12116
12121
|
},
|
|
12117
12122
|
{
|
|
12118
12123
|
"path": "tests/instance_config.mjs",
|
|
@@ -12907,7 +12912,7 @@
|
|
|
12907
12912
|
{
|
|
12908
12913
|
"path": "tests/provision.mjs",
|
|
12909
12914
|
"mode": "0000644",
|
|
12910
|
-
"sha256": "
|
|
12915
|
+
"sha256": "642ba54a20f08df1514f94114d39cdb70427f93542f4c060c83251ad1f46c80a"
|
|
12911
12916
|
},
|
|
12912
12917
|
{
|
|
12913
12918
|
"path": "tests/provision_caddy_wiring.mjs",
|
|
@@ -14092,7 +14097,7 @@
|
|
|
14092
14097
|
{
|
|
14093
14098
|
"path": "tests/version_first_goal.mjs",
|
|
14094
14099
|
"mode": "0000644",
|
|
14095
|
-
"sha256": "
|
|
14100
|
+
"sha256": "c1c7f1ecb7bc675f1fef7bdecda8a9116f8f3dc753efdd0805821690c188e160"
|
|
14096
14101
|
},
|
|
14097
14102
|
{
|
|
14098
14103
|
"path": "tests/version_literals.mjs",
|
|
@@ -14117,7 +14122,7 @@
|
|
|
14117
14122
|
{
|
|
14118
14123
|
"path": "tests/versions_route.mjs",
|
|
14119
14124
|
"mode": "0000644",
|
|
14120
|
-
"sha256": "
|
|
14125
|
+
"sha256": "e6bb09694e578571273ecf8997776b5b9879fbbb33a90811d24c5d0592d39c41"
|
|
14121
14126
|
},
|
|
14122
14127
|
{
|
|
14123
14128
|
"path": "tests/visibility_pull.mjs",
|
|
@@ -434,7 +434,7 @@ export interface PostVersionsIdCloseRequest { reason?: string; dispositions?: Re
|
|
|
434
434
|
export interface PostVersionsIdCloseResponse { ok: boolean; version: unknown; applied: unknown; promoted: unknown; carried: unknown }
|
|
435
435
|
export interface PostVersionsIdDoneWhenRequest { criterion_id: string; criterion_md: string; goal_id?: number; sort_order?: number }
|
|
436
436
|
export interface PostVersionsIdDoneWhenResponse { ok: boolean; criterion: unknown }
|
|
437
|
-
export interface PostVersionsRequest { id: string; name: string; status?: string;
|
|
437
|
+
export interface PostVersionsRequest { id: string; name: string; status?: string; done_when?: string; scope_doc_path?: string; criteria?: unknown[]; first_goal?: Record<string, unknown> }
|
|
438
438
|
export interface PostVersionsResponse { version: unknown; goal: unknown; criteria: unknown }
|
|
439
439
|
export interface PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; granted: unknown }
|
|
440
440
|
export interface PutMingleOptInRequest { opted_in: boolean }
|
|
@@ -62,13 +62,88 @@ widening it is a deliberate, reviewed edit.
|
|
|
62
62
|
boundary. That is why the dangerous cases are handled by *not writing the rule* rather than by an
|
|
63
63
|
`ask` or `deny` pattern for `--output` — Claude Code's own docs note such argument patterns are
|
|
64
64
|
evaded by quoting (`--out''put`).
|
|
65
|
-
- Rules
|
|
66
|
-
|
|
67
|
-
[task 1003999](https://cloudbongos.com/builders#/task/1003999)
|
|
68
|
-
guards; allowing first and guarding second was the wrong order.
|
|
65
|
+
- Rules were `Bash` only at first — the evidence was a hosted Linux box. The `PowerShell(...)`
|
|
66
|
+
twins landed in [task 1004014](https://cloudbongos.com/builders#/task/1004014), once
|
|
67
|
+
[task 1003999](https://cloudbongos.com/builders#/task/1003999) had put that tool behind the same
|
|
68
|
+
guards; allowing first and guarding second was the wrong order. See the amendment below.
|
|
69
69
|
- An instance that already has a `.claude/settings.json` keeps its own; only a fresh starter carries
|
|
70
70
|
the new rules (the never-clobber rule of task 1003962).
|
|
71
71
|
|
|
72
|
+
## Amendment — 2026-09-17: every rule has a `PowerShell(...)` twin ([task 1004014](https://cloudbongos.com/builders#/task/1004014))
|
|
73
|
+
|
|
74
|
+
On a Windows laptop Claude Code's shell tool is `PowerShell`, and a `Bash(...)` rule says nothing
|
|
75
|
+
about a PowerShell command, so those sessions still met the prompt on every routine read.
|
|
76
|
+
|
|
77
|
+
**Decision.** One list of commands, carried by every shell tool the guards see
|
|
78
|
+
(`.claude/hooks/shell-tools.js`): 31 commands × `Bash`, `PowerShell`. The twins are the *same*
|
|
79
|
+
commands in the *same* forms — prefix where the Bash rule is a prefix, exact where it is exact,
|
|
80
|
+
and still no `git diff | log | show`. **The six blessed writers are twinned too.** ADR 0104's
|
|
81
|
+
argument is tool-independent (the server decides per request from live rank; the rule grants
|
|
82
|
+
nothing), and twinning only the reads would let a Windows session look around freely and then
|
|
83
|
+
dead-end on `ship.js` — the #1027 failure, moved to a different machine.
|
|
84
|
+
|
|
85
|
+
**What made it safe to mirror rather than re-derive.** Documented by Claude Code: PowerShell rules
|
|
86
|
+
have the same shape as Bash rules; `|`, `;`, `&&`, `||` split a command and *every* part must
|
|
87
|
+
match, so `gh pr view 1 | Set-Content <path>` and `git status; Remove-Item …` still ask.
|
|
88
|
+
|
|
89
|
+
Not documented — redirection, `$(…)`, `$env:` assignments — so the installed client (2.1.274) was
|
|
90
|
+
read instead: a string probe of the binary, down to its PowerShell permission function. In order,
|
|
91
|
+
it (1) applies deny rules; (2) collects a list of decisions, where each of these is an **ask**:
|
|
92
|
+
a `$(…)` subexpression, an expandable string, splatting, `--%`, a .NET member call, a script block,
|
|
93
|
+
a command that modifies `$env:`, a write into `.git/`, a `cd` compounded with `git`, and **any
|
|
94
|
+
real file redirection** ("could write to arbitrary paths" — in-tree or not, `$null` and `2>&1`
|
|
95
|
+
excepted); (3) returns the first deny, **else the first ask, and only then an allow**. Prefix
|
|
96
|
+
allow-rules are consulted after all of that, one pipeline element at a time, and a statement that
|
|
97
|
+
is not a command — an assignment — is never "allowed". So `$env:NODE_OPTIONS='…'; node
|
|
98
|
+
scripts/gds/status.js`, `git status $(…)` and `gh pr view 1 > scripts/gds/status.js` all still ask.
|
|
99
|
+
|
|
100
|
+
That is a reading of one version's minified code, not a contract — so **the repo does not lean on
|
|
101
|
+
it.** The grader's objection to the first cut was exact: nothing here enforced that ordering, and
|
|
102
|
+
nothing would turn red if a release changed it. `.claude/hooks/allow-rule-guard.js` now does, through
|
|
103
|
+
the one part of the contract that IS documented: a PreToolUse hook may answer
|
|
104
|
+
`permissionDecision: "ask"`, the most restrictive hook answer applies, and hooks "can tighten
|
|
105
|
+
restrictions but not loosen them". On the PowerShell tool, a command that names anything this
|
|
106
|
+
project pre-allows is put in front of a person **unless it is plain**: command names, bare-word
|
|
107
|
+
arguments from a fixed alphabet, `$name` reads, literal strings, the separators `; | && ||`, and
|
|
108
|
+
`2>&1` / `> $null`. It never blocks, fails open, and stays silent for commands nobody pre-allowed —
|
|
109
|
+
or every `>` on a Windows laptop would prompt and the prompts this task removed would be back.
|
|
110
|
+
`tests/allow_rule_guard.mjs` runs every PowerShell allow-rule through it, so a new rule cannot
|
|
111
|
+
outrun the guard.
|
|
112
|
+
|
|
113
|
+
**That hook is an allowlist of shape because the denylist version failed — this ADR's own lesson,
|
|
114
|
+
relearned.** Its first cut listed dangerous constructs (`$(`, `>`, `{`, `env:` …). A security
|
|
115
|
+
review of it found eleven commands that smuggle a write or an exec and still answered "no ask":
|
|
116
|
+
a bare `( … )` runs a pipeline in argument mode; a quote inside a `<# comment #>` blinds a quote
|
|
117
|
+
scanner; PowerShell reads smart quotes as quotes; `> $null\path` is a file, not a discard; a block
|
|
118
|
+
comment can split the command's name. Every one is a disagreement between a pattern and
|
|
119
|
+
PowerShell's tokenizer, which is exactly why this ADR refuses an `ask` pattern for `--output`
|
|
120
|
+
("evaded by quoting"). Recognising the safe case and asking for everything else has no such list
|
|
121
|
+
to keep up with: a `(`, `#`, backtick, `<`, real redirect, lone `&`, newline, smart quote or
|
|
122
|
+
assignment is simply not in the grammar. The eleven are kept as test cases.
|
|
123
|
+
|
|
124
|
+
Chained and piped commands pass the grammar on purpose — `git status; Remove-Item x` is "plain" —
|
|
125
|
+
because the split on `|`, `;`, `&&`, `||` with every part needing its own match is the DOCUMENTED
|
|
126
|
+
half, and the hook stands in only for the undocumented one.
|
|
127
|
+
|
|
128
|
+
Today the hook is redundant with the client, which is the point: it pins the behaviour instead of
|
|
129
|
+
trusting it. `allowCovers` in `tests/box_ship_permissions.mjs` still models only rule shape,
|
|
130
|
+
separators and case folding, and says so. NOT traced in the client: how `git.exe` is canonicalized
|
|
131
|
+
before matching — the hook folds case, quotes, backticks, comments, `\` and `.exe` itself, and is
|
|
132
|
+
deliberately loose there, since that step only decides whether it has an opinion at all.
|
|
133
|
+
|
|
134
|
+
**The restrictive list is twinned too.** `permissions.deny` carried `Bash(git stash:*)` alone — a
|
|
135
|
+
hard stop on a Linux box and nothing on a Windows laptop. It now has its PowerShell twin, and the
|
|
136
|
+
suite fails if any shell rule in `deny` or `ask` exists for one tool and not the other.
|
|
137
|
+
|
|
138
|
+
**The one PowerShell-specific trap.** Its rules match **case-insensitively**, and git's flags do
|
|
139
|
+
not: `-d` and `-D` are different commands. No rule here sits next to such a pair — `git branch`
|
|
140
|
+
appears only as four exact read forms — and `tests/box_ship_permissions.mjs` now runs every check
|
|
141
|
+
once per tool with the matcher's case folding modelled, plus a twin check: the tools must carry
|
|
142
|
+
identical lists, and a rule for a tool outside `shell-tools.js` fails the suite.
|
|
143
|
+
|
|
144
|
+
**Left alone.** A session that writes `node .\scripts\gds\status.js` (backslashes) matches no rule
|
|
145
|
+
and asks — fail-safe, and the skills all spell it with forward slashes.
|
|
146
|
+
|
|
72
147
|
## Rejected
|
|
73
148
|
|
|
74
149
|
- **`Bash(git:*)` or `Bash(gh:*)`.** One rule instead of thirteen, and it pre-allows `git push`,
|
package/docs/api/openapi.json
CHANGED
|
@@ -25115,10 +25115,6 @@
|
|
|
25115
25115
|
"type": "string",
|
|
25116
25116
|
"maxLength": 32
|
|
25117
25117
|
},
|
|
25118
|
-
"track": {
|
|
25119
|
-
"type": "string",
|
|
25120
|
-
"maxLength": 16
|
|
25121
|
-
},
|
|
25122
25118
|
"done_when": {
|
|
25123
25119
|
"type": "string",
|
|
25124
25120
|
"maxLength": 8000
|
package/docs/api-reference.md
CHANGED
|
@@ -691,7 +691,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
691
691
|
| Method | Path | Rank | Body | Description |
|
|
692
692
|
|---|---|---|---|---|
|
|
693
693
|
| GET | `/api/bongos/versions` | `public` | — | read-only version list; mirrors /public/versions. |
|
|
694
|
-
| POST | `/api/bongos/versions` | `archon` | `id`, `name`, `status`, `
|
|
694
|
+
| POST | `/api/bongos/versions` | `archon` | `id`, `name`, `status`, `done_when`, `scope_doc_path`, `criteria`, `first_goal` | POST /versions — create a version + its done-when criteria in one call. |
|
|
695
695
|
| POST | `/api/bongos/versions/:id/close` | `archon` | `reason`, `dispositions` | POST /versions/:id/close — the move a version has never had (BV1.R12, task 1003599, goal 1000086, ADR 0250 D5, ADR 0263 §5). |
|
|
696
696
|
| GET | `/api/bongos/versions/:id/done-when` | `public` | — | Public: the status dashboard (status.<apex>) fetches this every 60s alongside other public/* surfaces. |
|
|
697
697
|
| POST | `/api/bongos/versions/:id/done-when` | `metic+archon` | `criterion_id`, `criterion_md`, `goal_id`, `sort_order` | Auth (Metic+, then the goal's own authority): create a done-when criterion at RUNTIME. |
|