peaks-loop 4.0.40 → 4.0.42
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/CHANGELOG.md +31 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- package/dist/services/hooks/write-gate.js +32 -9
- package/package.json +5 -5
- package/skills/bee/peaks-perf-audit/SKILL.md +13 -7
- package/skills/bee/peaks-prd/SKILL.md +13 -7
- package/skills/bee/peaks-qa/SKILL.md +13 -7
- package/skills/bee/peaks-rd/SKILL.md +13 -7
- package/skills/bee/peaks-reviewer/SKILL.md +13 -7
- package/skills/bee/peaks-sc/SKILL.md +13 -7
- package/skills/bee/peaks-security-audit/SKILL.md +13 -7
- package/skills/bee/peaks-txt/SKILL.md +13 -7
- package/skills/bee/peaks-ui/SKILL.md +13 -7
- package/skills/peaks-audit/SKILL.md +13 -7
- package/skills/peaks-code/SKILL.md +13 -7
- package/skills/peaks-content/SKILL.md +13 -7
- package/skills/peaks-doctor/SKILL.md +13 -7
- package/skills/peaks-final-review/SKILL.md +13 -7
- package/skills/peaks-ide/SKILL.md +13 -7
- package/skills/peaks-issue-fix-orchestrator/SKILL.md +13 -7
- package/skills/peaks-resume/SKILL.md +13 -7
- package/skills/peaks-slice-decompose/SKILL.md +13 -7
- package/skills/peaks-solo/SKILL.md +13 -7
- package/skills/peaks-sop/SKILL.md +13 -7
- package/skills/peaks-status/SKILL.md +13 -7
- package/skills/peaks-test/SKILL.md +13 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.0.42 — 2026-09-12 (peaks 自己的钩子在每次编辑时报错)
|
|
4
|
+
|
|
5
|
+
**Highlights**:
|
|
6
|
+
|
|
7
|
+
1. **`write-gate.js` 每次编辑都向模型报一次"钩子错误" —— 已修。** 这个钩子挂在 `Write|Edit|MultiEdit` 上,判定是 `p.includes('.peaks/_runtime/') ? 0 : 1`。**而开发者真正编辑的每一个文件都不在 `.peaks/_runtime/` 下**,所以它**每次编辑都返回退出码 1**。
|
|
8
|
+
|
|
9
|
+
Claude Code 的协议里,**只有 exit 2 会阻断**;任何其他非零退出码都是**非阻断错误** —— 工具照跑,但 transcript 里出现 `<hook> hook error` 加 `Failed with non-blocking status code:` 和 stderr 首行;stderr 为空时显示 `No stderr output`。**这正是用户 Mac 日志里那行。**
|
|
10
|
+
|
|
11
|
+
- 更糟的是**文档把它写成了契约**。`HOOKS.md` 与文件头都写着 *"exit 1 = fall through to the gate"* —— **没有 fall-through 这个概念**:所有匹配的 PreToolUse 钩子**并行运行**,结果按 `deny > defer > ask > allow` 合并,不存在"交给下一个"。正确的弃权是 **exit 0 + 无输出**,文档定义为 *"no decision"*。
|
|
12
|
+
- 所以"静默的 fall-through"实际上是**当时可用的最响的结果**。**行为对所有路径完全不变**(它从不阻断),变的只是它不再一边弃权一边报错。
|
|
13
|
+
- **同行早就做对了**:`pre-tool-code-gate.sh` 用 exit 0 弃权、只在拒绝路径用 exit 2;`pre-tool-superpowers-bridge.sh` 全路径 exit 0。`write-gate.js` 是唯一的异类 —— 这是收敛一个文件的偏差,不是重新设计。
|
|
14
|
+
- 三处一起改:代码、`.claude/HOOKS.md` 契约行、以及**钉着 exit-1 映射的 32 用例判定表**(已实测对旧 `decide` 会失败)。判定表现在是"路径清单 + 一条真属性":每条路径都弃权,且两个流都为空。
|
|
15
|
+
|
|
16
|
+
2. **一个必须说明的保留。** 已知有**独立**报告称钩子 exit 0 时标签仍显示 `hook error`。所以**修完不等于那行必然消失** —— 需要实测;若仍在,用 `claude --debug-file` 查看每个钩子的真实退出码。
|
|
17
|
+
|
|
18
|
+
**验证**:三个版本常量一致(4.0.42);`tsc -p tsconfig.build.json` exit 0;宽 `tsconfig.json` 保持 **142** 基线;`tests/unit` **188 files / 1794 passed / 3 skipped / 0 failed**。
|
|
19
|
+
|
|
20
|
+
## 4.0.41 — 2026-09-11 (闸门指导不再鼓励"每次编辑前念一遍")
|
|
21
|
+
|
|
22
|
+
**Highlights**:
|
|
23
|
+
|
|
24
|
+
1. **4.0.40 的措辞修好了"误读",但没修"频率" —— 这一版修频率。** 用户在 Mac 上继续工作时反馈:闸门仍然频繁打断。查下去发现**真正被烧掉的时间不是拒绝本身,而是一个仪式** —— 被告诉"预期每个文件被拦一次"之后,模型很自然地选择**预防**:在每次编辑前先把那四条事实念一遍,好让拒绝根本不出现。用户日志里那些重复的 `[Fact-Force Gate] 1..4` 块**是模型自己的话,不是闸门的输出**(闸门自称 `Fact-Forcing`,列的问题也不同)。每次编辑多一次「思考 10 秒 + 复述」,累起来就是他看到的 5 分钟。
|
|
25
|
+
|
|
26
|
+
- 现在指导明确要求:**不要预防性复述,闸门问的时候再答。** 拒绝是减速带,不是飞行前检查单。
|
|
27
|
+
|
|
28
|
+
2. **顺带记录了一条会读成"我退步了"的闸门行为。** 闲置约 30 分钟后,钩子会**删掉自己的状态文件**(`SESSION_TIMEOUT_MS`),清空"已通过"清单 —— 于是**之前已经放行的文件会再次被拦**。不知情的话,这读起来像模型又犯了错。指导里现在写明了:那是闸门在重置,不是你在退步。
|
|
29
|
+
|
|
30
|
+
3. **同时记下三个可用的旋钮**(闸门自带,非 peaks 引入):`GATEGUARD_EXEMPT_GLOBS`(逗号分隔 glob,加进去的路径直接豁免 —— peaks 写入时**取并集**,不会覆盖你写的)、`GATEGUARD_FACT_FORCE_FULL_DENIALS`(拒绝预算)、`GATEGUARD_DISABLED=1`(整个关掉)。**测试目录这类"没什么事实可建立"的路径,加一条 glob 就不再拦**。
|
|
31
|
+
|
|
32
|
+
**验证**:三个版本常量一致(4.0.41);`tsc -p tsconfig.build.json` exit 0;宽 `tsconfig.json` 保持 **142** 基线;`tests/unit` **188 files / 1794 passed / 3 skipped / 0 failed**。
|
|
33
|
+
|
|
3
34
|
## 4.0.40 — 2026-09-11 (两条被 4.0.39 暴露出来的既有缺陷)
|
|
4
35
|
|
|
5
36
|
**Highlights**:
|
package/README-en.md
CHANGED
|
@@ -140,7 +140,7 @@ Every lane opens with **one slash command**.
|
|
|
140
140
|
|
|
141
141
|
| | |
|
|
142
142
|
| --- | --- |
|
|
143
|
-
| **Latest** | [](https://www.npmjs.com/package/peaks-loop) — 4.0.
|
|
143
|
+
| **Latest** | [](https://www.npmjs.com/package/peaks-loop) — 4.0.42 (2026-09-12) |
|
|
144
144
|
| **Domains** | Code (`peaks-code`) · Content (`peaks-content`) · Project health (`peaks-doctor`) · Issue sweep (`peaks-issue-fix-orchestrator`) · Custom SOP (`peaks-sop`) · Cross-domain primitives (`peaks-solo` dispatcher · `peaks-resume` · `peaks-status` · `peaks-test` · `peaks-slice-decompose`) |
|
|
145
145
|
| **Sediment pool** | `~/.peaks/` local pool · twice-clean runs auto-promote to a bee · broken runs come back for you to redefine · the bee grows with your taste |
|
|
146
146
|
| **Test suite** | 285+ cases · 4 packages (peaks-loop / peaks-loop-mut / peaks-loop-shared-channel / peaks-loop-shared) · **0 timeouts** · 14 BDD caller-binding edge cases |
|
package/README.md
CHANGED
|
@@ -140,7 +140,7 @@ npm i -g peaks-loop
|
|
|
140
140
|
|
|
141
141
|
| | |
|
|
142
142
|
| --- | --- |
|
|
143
|
-
| **最新版本** | [](https://www.npmjs.com/package/peaks-loop) — 4.0.
|
|
143
|
+
| **最新版本** | [](https://www.npmjs.com/package/peaks-loop) — 4.0.42(2026-09-12) |
|
|
144
144
|
| **覆盖域** | 代码(`peaks-code`) · 内容(`peaks-content`) · 项目健康(`peaks-doctor`) · 批量修 issue(`peaks-issue-fix-orchestrator`) · 自定义 SOP(`peaks-sop`) · 通用原语(`peaks-solo` 分诊 / `peaks-resume` 续 / `peaks-status` 看 / `peaks-test` 测 / `peaks-slice-decompose` 切片) |
|
|
145
145
|
| **沉淀池** | `~/.peaks/` 本地池 · 跑两次自动晋升成 bee · 跑翻车让你重定义 · bee 跟着你的口味长 |
|
|
146
146
|
| **测试套件** | 1096 cases · 4 packages (peaks-loop 1015 / runtime 39 / mut 22 / shared-channel 20) · **CI 首次全绿**(ubuntu + windows) · 14 BDD caller-binding coverage |
|
|
@@ -31,10 +31,11 @@
|
|
|
31
31
|
* `scripts/copy-templates.mjs`), which lets one emitted path string be
|
|
32
32
|
* valid for both the repo and an installed consumer.
|
|
33
33
|
*
|
|
34
|
-
* Contract (`.claude/HOOKS.md`):
|
|
35
|
-
*
|
|
36
|
-
* returns it
|
|
37
|
-
*
|
|
34
|
+
* Contract (`.claude/HOOKS.md`): this handler ALWAYS ABSTAINS: exit 0, no
|
|
35
|
+
* output, on every path. Only exit 2 blocks a tool call, and this handler
|
|
36
|
+
* never returns it, so any other non-zero exit is a non-blocking ERROR
|
|
37
|
+
* rather than a decision. See `decide` below for the correction this file
|
|
38
|
+
* went through.
|
|
38
39
|
*
|
|
39
40
|
* Path source: the hook payload arrives as JSON on STDIN (Claude Code's
|
|
40
41
|
* documented channel; it appends no argv). `process.argv[2]` is honoured as a
|
|
@@ -57,11 +58,31 @@ function candidatePath(payload) {
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
61
|
+
* This handler ABSTAINS on every path, including `.peaks/_runtime/`.
|
|
62
|
+
*
|
|
63
|
+
* It used to return 1 for anything outside `.peaks/_runtime/`, documented as
|
|
64
|
+
* "fall through to the gate". That concept does not exist in the Claude Code
|
|
65
|
+
* hook protocol. Exit 2 is the only code that blocks; every other non-zero
|
|
66
|
+
* exit is a NON-BLOCKING ERROR — the action still proceeds, but the transcript
|
|
67
|
+
* shows `<hook> hook error` followed by `Failed with non-blocking status code:
|
|
68
|
+
* No stderr output`. The "silent fall-through" was therefore the LOUDEST
|
|
69
|
+
* available outcome, reported once per edit for every path a developer
|
|
70
|
+
* actually touches.
|
|
71
|
+
*
|
|
72
|
+
* The documented abstention is exit 0 with no output: "no decision". All
|
|
73
|
+
* matching PreToolUse hooks run in parallel and their results are merged
|
|
74
|
+
* (`deny` > `defer` > `ask` > `allow`), so abstaining neither approves the call
|
|
75
|
+
* nor suppresses a sibling's deny — the fact gate still applies to every path
|
|
76
|
+
* it always applied to.
|
|
77
|
+
*
|
|
78
|
+
* Runtime behaviour is unchanged for every path. What changes is that the
|
|
79
|
+
* handler stops reporting a spurious error while abstaining.
|
|
62
80
|
*/
|
|
63
81
|
function decide(p) {
|
|
64
|
-
|
|
82
|
+
// The path is still read (it is the payload's whole point) but no longer
|
|
83
|
+
// branches: every path abstains.
|
|
84
|
+
void p;
|
|
85
|
+
return 0;
|
|
65
86
|
}
|
|
66
87
|
|
|
67
88
|
const ARGV_PATH = typeof process.argv[2] === 'string' ? process.argv[2] : '';
|
|
@@ -80,8 +101,10 @@ process.stdin.on('end', () => {
|
|
|
80
101
|
try {
|
|
81
102
|
payload = JSON.parse(raw);
|
|
82
103
|
} catch {
|
|
83
|
-
// Malformed or empty payload → no path
|
|
84
|
-
//
|
|
104
|
+
// Malformed or empty payload → no path. This is NOT a deny: `decide`
|
|
105
|
+
// abstains for every input including the empty string, and a deny would
|
|
106
|
+
// take exit 2. The old comment here said "deny" while returning 1, which
|
|
107
|
+
// is the non-blocking error — the same misreading this file corrects.
|
|
85
108
|
payload = undefined;
|
|
86
109
|
}
|
|
87
110
|
process.exit(decide(candidatePath(payload) || ARGV_PATH));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "peaks-loop",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.42",
|
|
4
4
|
"description": "Loop Engineering CLI — workflow primitive / loop guards / evaluators / slice orchestration",
|
|
5
5
|
"author": "SquabbyZ",
|
|
6
6
|
"keywords": [
|
|
@@ -101,10 +101,10 @@
|
|
|
101
101
|
"fzf": "^0.5.2",
|
|
102
102
|
"yaml": "^2.9.0",
|
|
103
103
|
"zod": "^4.4.3",
|
|
104
|
-
"peaks-loop-internal-runtime": "0.0.
|
|
105
|
-
"peaks-loop-shared": "0.0.
|
|
106
|
-
"peaks-loop-
|
|
107
|
-
"peaks-loop-
|
|
104
|
+
"peaks-loop-internal-runtime": "0.0.27",
|
|
105
|
+
"peaks-loop-shared": "0.0.76",
|
|
106
|
+
"peaks-loop-mut": "0.1.40",
|
|
107
|
+
"peaks-loop-shared-channel": "0.0.44"
|
|
108
108
|
},
|
|
109
109
|
"devDependencies": {
|
|
110
110
|
"@changesets/cli": "2.31.1",
|
|
@@ -31,13 +31,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
31
31
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
32
32
|
config); `.peaks/**` writes are exempt.
|
|
33
33
|
|
|
34
|
-
**Expect one denial per file
|
|
35
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
36
|
-
prevent it
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
35
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
36
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
37
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
38
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
39
|
+
denial actually arrives.
|
|
40
|
+
|
|
41
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
42
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
43
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
44
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
45
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
46
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
41
47
|
<!-- /peaks:loop-hygiene -->
|
|
42
48
|
|
|
43
49
|
# peaks-perf-audit
|
|
@@ -27,13 +27,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
27
27
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
28
28
|
config); `.peaks/**` writes are exempt.
|
|
29
29
|
|
|
30
|
-
**Expect one denial per file
|
|
31
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
-
prevent it
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
31
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
33
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
34
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
35
|
+
denial actually arrives.
|
|
36
|
+
|
|
37
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
38
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
39
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
40
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
41
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
42
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
37
43
|
<!-- /peaks:loop-hygiene -->
|
|
38
44
|
---
|
|
39
45
|
|
|
@@ -27,13 +27,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
27
27
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
28
28
|
config); `.peaks/**` writes are exempt.
|
|
29
29
|
|
|
30
|
-
**Expect one denial per file
|
|
31
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
-
prevent it
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
31
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
33
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
34
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
35
|
+
denial actually arrives.
|
|
36
|
+
|
|
37
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
38
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
39
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
40
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
41
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
42
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
37
43
|
<!-- /peaks:loop-hygiene -->
|
|
38
44
|
---
|
|
39
45
|
|
|
@@ -28,13 +28,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
28
28
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
29
29
|
config); `.peaks/**` writes are exempt.
|
|
30
30
|
|
|
31
|
-
**Expect one denial per file
|
|
32
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
33
|
-
prevent it
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
32
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
33
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
34
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
35
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
36
|
+
denial actually arrives.
|
|
37
|
+
|
|
38
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
39
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
40
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
41
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
42
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
43
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
38
44
|
<!-- /peaks:loop-hygiene -->
|
|
39
45
|
---
|
|
40
46
|
|
|
@@ -23,13 +23,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
23
23
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
24
24
|
config); `.peaks/**` writes are exempt.
|
|
25
25
|
|
|
26
|
-
**Expect one denial per file
|
|
27
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
28
|
-
prevent it
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
27
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
28
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
29
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
30
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
31
|
+
denial actually arrives.
|
|
32
|
+
|
|
33
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
34
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
35
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
36
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
37
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
38
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
33
39
|
<!-- /peaks:loop-hygiene -->
|
|
34
40
|
|
|
35
41
|
## Single-scope-axis naming convention
|
|
@@ -27,13 +27,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
27
27
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
28
28
|
config); `.peaks/**` writes are exempt.
|
|
29
29
|
|
|
30
|
-
**Expect one denial per file
|
|
31
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
-
prevent it
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
31
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
33
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
34
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
35
|
+
denial actually arrives.
|
|
36
|
+
|
|
37
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
38
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
39
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
40
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
41
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
42
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
37
43
|
<!-- /peaks:loop-hygiene -->
|
|
38
44
|
---
|
|
39
45
|
|
|
@@ -31,13 +31,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
31
31
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
32
32
|
config); `.peaks/**` writes are exempt.
|
|
33
33
|
|
|
34
|
-
**Expect one denial per file
|
|
35
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
36
|
-
prevent it
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
35
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
36
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
37
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
38
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
39
|
+
denial actually arrives.
|
|
40
|
+
|
|
41
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
42
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
43
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
44
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
45
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
46
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
41
47
|
<!-- /peaks:loop-hygiene -->
|
|
42
48
|
|
|
43
49
|
# peaks-security-audit
|
|
@@ -27,13 +27,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
27
27
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
28
28
|
config); `.peaks/**` writes are exempt.
|
|
29
29
|
|
|
30
|
-
**Expect one denial per file
|
|
31
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
-
prevent it
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
31
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
33
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
34
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
35
|
+
denial actually arrives.
|
|
36
|
+
|
|
37
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
38
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
39
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
40
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
41
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
42
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
37
43
|
<!-- /peaks:loop-hygiene -->
|
|
38
44
|
---
|
|
39
45
|
|
|
@@ -27,13 +27,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
27
27
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
28
28
|
config); `.peaks/**` writes are exempt.
|
|
29
29
|
|
|
30
|
-
**Expect one denial per file
|
|
31
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
-
prevent it
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
31
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
32
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
33
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
34
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
35
|
+
denial actually arrives.
|
|
36
|
+
|
|
37
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
38
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
39
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
40
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
41
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
42
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
37
43
|
<!-- /peaks:loop-hygiene -->
|
|
38
44
|
---
|
|
39
45
|
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
## Single-scope-axis naming convention
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
> **Detached sub-agent mode (Phase A, slice 2026-08-10).** When the orchestrator requires true parallelism with isolated context windows and survives orchestrator session exit, dispatch sub-agents with `--mode detached --vendor <claude|codex|copilot>`. The CLI spawns a real OS process via `ProcessSupervisor` (Windows `DETACHED_PROCESS` + `CREATE_NEW_PROCESS_GROUP`, POSIX `setsid` + `nohup`); the child vendor LLM receives a 5–8KB minimum prompt slice (no orchestrator session history) and self-compacts at 0.85 / 0.95 against the vendor window via the `<peaks-auto-compact>` marker (G8 — unlimited spend authorized). Orchestrator MUST emit one line of prose before every detached dispatch: `⏳ Spawning detached sub-agent via <vendor>: rid=<rid> (ETA ~60s)`. Status is read from `.peaks/_runtime/<sid>/detached/<rid>/status.json`; `LifecycleOwner` enforces 100% cleanup of `pid` / `log.txt` / `status.json` / `owner-session` on every exit path. `--no-throttle --max-concurrent <N>` bypasses `ResourceBudgetGuard` (user accepts risk; default max=8). See `references/sub-agent-dispatch.md` §"Detached Mode" for the full contract. Default mode remains `in-process` for backward compat (existing 106+ dispatch tests untouched).
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
# peaks-content
|
|
@@ -23,13 +23,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
23
23
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
24
24
|
config); `.peaks/**` writes are exempt.
|
|
25
25
|
|
|
26
|
-
**Expect one denial per file
|
|
27
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
28
|
-
prevent it
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
27
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
28
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
29
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
30
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
31
|
+
denial actually arrives.
|
|
32
|
+
|
|
33
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
34
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
35
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
36
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
37
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
38
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
33
39
|
<!-- /peaks:loop-hygiene -->
|
|
34
40
|
---
|
|
35
41
|
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
## Single-scope-axis naming convention
|
|
@@ -23,13 +23,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
23
23
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
24
24
|
config); `.peaks/**` writes are exempt.
|
|
25
25
|
|
|
26
|
-
**Expect one denial per file
|
|
27
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
28
|
-
prevent it
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
27
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
28
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
29
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
30
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
31
|
+
denial actually arrives.
|
|
32
|
+
|
|
33
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
34
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
35
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
36
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
37
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
38
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
33
39
|
<!-- /peaks:loop-hygiene -->
|
|
34
40
|
---
|
|
35
41
|
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
# peaks-issue-fix-orchestrator
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
# Peaks-Loop Code Resume (wrapper)
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
## Single-scope-axis naming convention
|
|
@@ -33,13 +33,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
33
33
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
34
34
|
config); `.peaks/**` writes are exempt.
|
|
35
35
|
|
|
36
|
-
**Expect one denial per file
|
|
37
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
38
|
-
prevent it
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
37
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
38
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
39
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
40
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
41
|
+
denial actually arrives.
|
|
42
|
+
|
|
43
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
44
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
45
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
46
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
47
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
48
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
43
49
|
<!-- /peaks:loop-hygiene -->
|
|
44
50
|
|
|
45
51
|
# peaks-solo — Dispatcher (分诊员)
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
# Peaks-Loop SOP Authoring
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
# Peaks-Loop Code Status (wrapper)
|
|
@@ -22,13 +22,19 @@ mode** — standard *and* 24h. The mode moves the threshold, never the obligatio
|
|
|
22
22
|
it — the normal way to work here — for every path outside `.peaks/**` (source, tests, docs,
|
|
23
23
|
config); `.peaks/**` writes are exempt.
|
|
24
24
|
|
|
25
|
-
**Expect one denial per file
|
|
26
|
-
denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
-
prevent it
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
**Expect one denial per file anyway — and do NOT pre-empt it.** A `PreToolUse` gate (ECC's
|
|
26
|
+
"Fact-Forcing Gate") denies the FIRST edit a session makes to any given path, once, by
|
|
27
|
+
design. Reading does NOT prevent it: the gate keys on the path's first touch, not on whether
|
|
28
|
+
you read it. **Do not recite its four questions before every edit** — it asks when it wants
|
|
29
|
+
them, and reciting unprompted burns a round-trip per file for nothing. Answer only when a
|
|
30
|
+
denial actually arrives.
|
|
31
|
+
|
|
32
|
+
**When one does arrive:** a denial is not a failure and the tool is not broken — your edit
|
|
33
|
+
was NOT applied. State the facts it asks for (importers, affected API, data schemas if any,
|
|
34
|
+
the user's verbatim instruction), then retry the SAME operation. The retry is allowed. Do not
|
|
35
|
+
switch tools, do not give up, do not retry blindly. One more thing worth knowing: an idle gap
|
|
36
|
+
of ~30 minutes clears the gate's "already passed" list, so a file you cleared earlier can be
|
|
37
|
+
denied again after a long pause. That is the gate resetting, not you regressing.
|
|
32
38
|
<!-- /peaks:loop-hygiene -->
|
|
33
39
|
|
|
34
40
|
# Peaks-Loop Code Test (wrapper)
|