@michelj/context-guard 0.4.3 → 0.6.1
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/Coordinator.md +88 -0
- package/Executor.md +53 -0
- package/README.md +89 -224
- package/README.zh-CN.md +89 -224
- package/SKILL.md +26 -684
- package/THIRD_PARTY_NOTICES.md +47 -0
- package/Tester.md +53 -0
- package/agents/openai.yaml +2 -2
- package/bin/build-runtime.mjs +96 -0
- package/bin/context-guard-skill.js +399 -78
- package/bin/postinstall.js +2 -2
- package/hooks.json +89 -13
- package/licenses/JSONParse-MIT.txt +24 -0
- package/licenses/Marked-MIT.txt +44 -0
- package/licenses/Portless-Apache-2.0.txt +201 -0
- package/package.json +35 -6
- package/prototype/LICENSES/Marked-MIT.txt +44 -0
- package/prototype/LICENSES/Ready-redistribution.txt +14 -0
- package/prototype/attachments.mjs +75 -0
- package/prototype/coordinator-markdown.mjs +283 -0
- package/prototype/coordinator-working-blot.mjs +124 -0
- package/prototype/vendor/marked.mjs +2189 -0
- package/prototype/workbench-app.js +5197 -0
- package/prototype/workbench-data.js +33 -0
- package/prototype/workbench-sync.mjs +898 -0
- package/prototype/workbench.css +1050 -0
- package/prototype/workbench.html +211 -0
- package/prototype/working-blot-atlas.png +0 -0
- package/references/agent-handoff.md +40 -0
- package/references/claude-runtime.md +120 -0
- package/references/cloud-sync-interface.md +66 -0
- package/references/design-current.md +14 -0
- package/references/map-mount.md +41 -0
- package/references/map-read.md +50 -0
- package/references/memory-definition.md +120 -0
- package/references/memory-filesystem-v2/Bug.en.md +162 -0
- package/references/memory-filesystem-v2/Bug.md +162 -0
- package/references/memory-filesystem-v2/Bug_Coordinater.md +8 -0
- package/references/memory-filesystem-v2/Bug_Executor.md +8 -0
- package/references/memory-filesystem-v2/Bug_Tester.md +7 -0
- package/references/memory-filesystem-v2/Idea.en.md +36 -0
- package/references/memory-filesystem-v2/Idea.md +36 -0
- package/references/memory-filesystem-v2/Node_Module_Index.en.md +88 -0
- package/references/memory-filesystem-v2/Node_Module_Index.md +88 -0
- package/references/memory-filesystem-v2/README.md +60 -0
- package/references/memory-filesystem-v2/Todo.en.md +137 -0
- package/references/memory-filesystem-v2/Todo.md +137 -0
- package/references/memory-filesystem-v2/Todo_Coordinater.md +7 -0
- package/references/memory-filesystem-v2/Todo_Executor.md +7 -0
- package/references/memory-filesystem-v2/Todo_Tester.md +7 -0
- package/references/named-workbench.md +124 -0
- package/references/plan-review.md +12 -0
- package/references/server-memory.md +276 -0
- package/references/test-check.md +7 -0
- package/references/user-reply.md +38 -0
- package/references/workbench-interface.md +531 -0
- package/roles.md +13 -0
- package/scripts/context_guard.py +1366 -7602
- package/scripts/context_guard_hook.py +1960 -711
- package/scripts/map_owns.py +699 -0
- package/scripts/shared/LICENSES/JSONParse-MIT.txt +24 -0
- package/scripts/shared/filesystem-v2.mjs +430 -0
- package/scripts/shared/io.mjs +117 -0
- package/scripts/shared/map-model.mjs +506 -0
- package/scripts/shared/memory-schema.mjs +13 -0
- package/scripts/shared/protocol-blobs.mjs +112 -0
- package/scripts/shared/protocol-map.mjs +146 -0
- package/scripts/shared/protocol-snapshots.mjs +84 -0
- package/scripts/shared/protocol-store.mjs +624 -0
- package/scripts/shared/protocol-workflow.mjs +226 -0
- package/scripts/shared/protocol.mjs +125 -0
- package/scripts/shared/vendor/jsonparse.cjs +413 -0
- package/scripts/workbench/access.mjs +496 -0
- package/scripts/workbench/attachments.mjs +92 -0
- package/scripts/workbench/browser-login.mjs +78 -0
- package/scripts/workbench/claude-runtime.mjs +372 -0
- package/scripts/workbench/cli.mjs +980 -0
- package/scripts/workbench/device-heartbeat.mjs +72 -0
- package/scripts/workbench/hook-status.mjs +38 -0
- package/scripts/workbench/inbox.mjs +155 -0
- package/scripts/workbench/journal.mjs +56 -0
- package/scripts/workbench/memory-merge.mjs +65 -0
- package/scripts/workbench/memory.mjs +252 -0
- package/scripts/workbench/named-proxy.mjs +108 -0
- package/scripts/workbench/named.mjs +152 -0
- package/scripts/workbench/portless-routes.mjs +51 -0
- package/scripts/workbench/project.mjs +327 -0
- package/scripts/workbench/projections.mjs +68 -0
- package/scripts/workbench/protocol-client.mjs +165 -0
- package/scripts/workbench/protocol-delivery.mjs +133 -0
- package/scripts/workbench/protocol-device.mjs +316 -0
- package/scripts/workbench/protocol-events.mjs +53 -0
- package/scripts/workbench/protocol-repository.mjs +58 -0
- package/scripts/workbench/reconcile.mjs +244 -0
- package/scripts/workbench/registry.mjs +111 -0
- package/scripts/workbench/runtime.mjs +54 -0
- package/scripts/workbench/server.mjs +1171 -0
- package/scripts/workbench/store.mjs +243 -0
- package/scripts/workbench/sync-coordinator.mjs +518 -0
- package/scripts/workbench/sync.mjs +86 -0
- package/references/context-template.md +0 -341
- package/references/feature-chain-methodology.md +0 -228
- package/references/register-template.md +0 -85
- package/references/task-case-template.md +0 -63
- package/tests/BC-20260618-063.sh +0 -116
- package/tests/BC-20260618-065.sh +0 -66
- package/tests/BC-20260626-080.sh +0 -48
- package/tests/BC-20260626-081.sh +0 -40
- package/tests/BC-20260626-082.sh +0 -32
- package/tests/BC-20260626-083.sh +0 -66
- package/tests/BC-20260627-084.sh +0 -74
- package/tests/BC-20260630-086.sh +0 -50
- package/tests/BC-20260630-087.sh +0 -103
- package/tests/BC-20260630-088.sh +0 -32
- package/tests/BC-20260630-089.sh +0 -63
- package/tests/BC-20260701-090.sh +0 -84
- package/tests/BC-20260702-096.sh +0 -48
- package/tests/BC-20260706-098.sh +0 -66
- package/tests/BC-20260707-099.sh +0 -47
- package/tests/BC-20260707-100.sh +0 -46
- package/tests/BC-20260707-101.sh +0 -47
- package/tests/BC-20260707-102.sh +0 -68
- package/tests/BC-20260707-103.sh +0 -59
- package/tests/BC-20260707-104.sh +0 -103
- package/tests/BC-20260707-105.sh +0 -109
- package/tests/BC-20260707-106.sh +0 -80
- package/tests/BC-20260707-107.sh +0 -74
- package/tests/BC-20260707-108.sh +0 -48
- package/tests/BC-20260707-109.sh +0 -56
- package/tests/BC-20260707-110.sh +0 -71
- package/tests/BC-20260707-111.sh +0 -70
- package/tests/BC-20260707-112.sh +0 -45
- package/tests/BC-20260707-113.sh +0 -73
- package/tests/BC-20260707-115.sh +0 -77
- package/tests/BC-20260707-116.sh +0 -77
- package/tests/BC-20260707-118.sh +0 -115
- package/tests/BC-20260707-119.sh +0 -47
- package/tests/BC-20260707-120.sh +0 -60
- package/tests/BC-20260707-121.sh +0 -66
- package/tests/BC-20260707-122.sh +0 -48
- package/tests/BC-20260707-123.sh +0 -43
- package/tests/BC-20260707-124.sh +0 -56
- package/tests/BC-20260707-125.sh +0 -64
- package/tests/BC-20260707-126.sh +0 -80
- package/tests/BC-20260707-127.sh +0 -88
- package/tests/BC-20260707-129.sh +0 -59
- package/tests/BC-20260707-130.sh +0 -69
- package/tests/BC-20260707-131.sh +0 -140
- package/tests/BC-20260707-132.sh +0 -150
- package/tests/BC-20260707-133.sh +0 -70
- package/tests/BC-20260708-136.sh +0 -210
- package/tests/BC-20260708-137.sh +0 -106
- package/tests/BC-20260708-138.sh +0 -168
- package/tests/BC-20260708-139.sh +0 -79
- package/tests/BC-20260709-002.sh +0 -63
- package/tests/BC-20260709-003.sh +0 -239
- package/tests/BC-20260709-006.sh +0 -76
- package/tests/BC-20260709-008.sh +0 -168
- package/tests/BC-20260710-001.sh +0 -61
- package/tests/BC-20260710-002.sh +0 -111
- package/tests/npm-install-smoke.sh +0 -53
package/tests/BC-20260709-002.sh
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${CONTEXT_GUARD_SCRIPT:-$(cd "$(dirname "$0")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-subagent-complete-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
mkdir -p "$ROOT/bin"
|
|
9
|
-
cat >"$ROOT/bin/subagent-smoke.sh" <<'SH'
|
|
10
|
-
#!/usr/bin/env bash
|
|
11
|
-
set -euo pipefail
|
|
12
|
-
echo "CG_CHECKPOINT:subagent smoke:PASS"
|
|
13
|
-
SH
|
|
14
|
-
chmod +x "$ROOT/bin/subagent-smoke.sh"
|
|
15
|
-
|
|
16
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
17
|
-
python3 "$SCRIPT" test-hub-add \
|
|
18
|
-
--root "$ROOT" \
|
|
19
|
-
--title "Subagent smoke approved test" \
|
|
20
|
-
--command-text "./bin/subagent-smoke.sh" \
|
|
21
|
-
--run-policy every-dev-completion \
|
|
22
|
-
--test-status approved >/dev/null
|
|
23
|
-
|
|
24
|
-
python3 "$SCRIPT" subagent-complete \
|
|
25
|
-
--root "$ROOT" \
|
|
26
|
-
--agent-id "agent-smoke-001" \
|
|
27
|
-
--summary "Created a small static page and completed local validation." >/tmp/subagent-complete.out
|
|
28
|
-
|
|
29
|
-
grep -Fq "[context-guard] subagent handoff:" /tmp/subagent-complete.out
|
|
30
|
-
grep -Fq "[context-guard] test hub: 1 passed, 0 failed, 0 blocked." /tmp/subagent-complete.out
|
|
31
|
-
test -f "$ROOT/.codex/context/subagents.md"
|
|
32
|
-
test -f "$ROOT/.codex/context/test-hub/last-run.json"
|
|
33
|
-
grep -Fq "agent-smoke-001" "$ROOT/.codex/context/subagents.md"
|
|
34
|
-
grep -Fq "Subagent completion handoff" "$ROOT/.codex/context/roadmap.md"
|
|
35
|
-
|
|
36
|
-
python3 - "$ROOT/.codex/context/test-hub/last-run.json" <<'PY'
|
|
37
|
-
import json
|
|
38
|
-
import sys
|
|
39
|
-
from pathlib import Path
|
|
40
|
-
|
|
41
|
-
data = json.loads(Path(sys.argv[1]).read_text())
|
|
42
|
-
results = data.get("results", [])
|
|
43
|
-
assert len(results) == 1, results
|
|
44
|
-
assert results[0].get("status") == "passed", results
|
|
45
|
-
PY
|
|
46
|
-
|
|
47
|
-
cat >"$ROOT/bin/subagent-smoke.sh" <<'SH'
|
|
48
|
-
#!/usr/bin/env bash
|
|
49
|
-
set -euo pipefail
|
|
50
|
-
echo "CG_CHECKPOINT:subagent smoke:FAIL:forced failure"
|
|
51
|
-
exit 1
|
|
52
|
-
SH
|
|
53
|
-
chmod +x "$ROOT/bin/subagent-smoke.sh"
|
|
54
|
-
|
|
55
|
-
if python3 "$SCRIPT" subagent-complete \
|
|
56
|
-
--root "$ROOT" \
|
|
57
|
-
--agent-id "agent-smoke-002" \
|
|
58
|
-
--summary "Forced failing handoff." >/tmp/subagent-complete-fail.out 2>&1; then
|
|
59
|
-
echo "subagent-complete should fail when approved Test Hub tests fail" >&2
|
|
60
|
-
exit 1
|
|
61
|
-
fi
|
|
62
|
-
grep -Fq "[context-guard] test hub: 0 passed, 1 failed, 0 blocked." /tmp/subagent-complete-fail.out
|
|
63
|
-
grep -Fq "[context-guard] evidence preserved:" /tmp/subagent-complete-fail.out
|
package/tests/BC-20260709-003.sh
DELETED
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${CONTEXT_GUARD_SCRIPT:-$(cd "$(dirname "$0")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-subagent-auto-chain-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
mkdir -p "$ROOT/bin"
|
|
9
|
-
cat >"$ROOT/bin/approved-smoke.sh" <<'SH'
|
|
10
|
-
#!/usr/bin/env bash
|
|
11
|
-
set -euo pipefail
|
|
12
|
-
test -f index.html
|
|
13
|
-
grep -Fq "Evening Reset" index.html
|
|
14
|
-
echo "CG_CHECKPOINT:approved smoke:PASS"
|
|
15
|
-
SH
|
|
16
|
-
chmod +x "$ROOT/bin/approved-smoke.sh"
|
|
17
|
-
|
|
18
|
-
cat >"$ROOT/index.html" <<'HTML'
|
|
19
|
-
<!doctype html>
|
|
20
|
-
<title>Evening Reset</title>
|
|
21
|
-
<main>Evening Reset</main>
|
|
22
|
-
HTML
|
|
23
|
-
|
|
24
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
25
|
-
python3 "$SCRIPT" test-hub-add \
|
|
26
|
-
--root "$ROOT" \
|
|
27
|
-
--title "Subagent approved smoke" \
|
|
28
|
-
--command-text "./bin/approved-smoke.sh" \
|
|
29
|
-
--run-policy every-dev-completion \
|
|
30
|
-
--test-status approved >/dev/null
|
|
31
|
-
|
|
32
|
-
cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
|
|
33
|
-
### BC-20260709-810: 次日清单没有恢复待完成
|
|
34
|
-
|
|
35
|
-
- Status: resolved
|
|
36
|
-
- First observed: 2026-07-09
|
|
37
|
-
- Last checked: 2026-07-09
|
|
38
|
-
- Scope: 晚间收纳重置清单
|
|
39
|
-
- Tags: #evening-reset #persistence
|
|
40
|
-
- Display summary: 第二天打开页面时,昨晚完成的项目仍显示已完成。
|
|
41
|
-
- Phenomenon: 用户第二天进入页面,清单没有恢复到待完成状态。
|
|
42
|
-
- Trigger / reproduction: 完成三项清单后模拟跨天,再重新打开页面。
|
|
43
|
-
- Root cause: 持久化只保存勾选状态,没有保存并比较完成日期。
|
|
44
|
-
- Fix method: 保存完成日期,启动时发现日期变化就重置当天状态。
|
|
45
|
-
- Guard / verification: 应归入晚间收纳功能链,用跨天打开流程验证。
|
|
46
|
-
- Guard type: feature-chain
|
|
47
|
-
- Red condition: 跨天后仍显示已完成。
|
|
48
|
-
- Green condition: 跨天后清单显示待完成。
|
|
49
|
-
- Expected failure reason: 如果跨天重置回归,晚间收纳功能链会在恢复状态节点失败。
|
|
50
|
-
|
|
51
|
-
### BC-20260709-811: 部分完成刷新后进度丢失
|
|
52
|
-
|
|
53
|
-
- Status: resolved
|
|
54
|
-
- First observed: 2026-07-09
|
|
55
|
-
- Last checked: 2026-07-09
|
|
56
|
-
- Scope: 晚间收纳重置清单
|
|
57
|
-
- Tags: #evening-reset #persistence
|
|
58
|
-
- Display summary: 只完成一部分后刷新页面,已勾选项目被清空。
|
|
59
|
-
- Phenomenon: 用户完成两项后刷新,页面回到 0/3。
|
|
60
|
-
- Trigger / reproduction: 勾选两项,不点击最终完成,刷新页面。
|
|
61
|
-
- Root cause: 只在最终完成时写入 localStorage,未保存中间状态。
|
|
62
|
-
- Fix method: 每次勾选变化都保存进度。
|
|
63
|
-
- Guard / verification: 应归入晚间收纳功能链,用部分完成恢复节点验证。
|
|
64
|
-
- Guard type: feature-chain
|
|
65
|
-
- Red condition: 刷新后部分进度丢失。
|
|
66
|
-
- Green condition: 刷新后保留已勾选项目。
|
|
67
|
-
- Expected failure reason: 如果中间状态持久化回归,晚间收纳功能链会在部分完成节点失败。
|
|
68
|
-
MD
|
|
69
|
-
|
|
70
|
-
python3 "$SCRIPT" subagent-complete \
|
|
71
|
-
--root "$ROOT" \
|
|
72
|
-
--agent-id "agent-auto-chain-001" \
|
|
73
|
-
--summary "Built the Evening Reset page and resolved persistence issues." >/tmp/subagent-auto-chain.out
|
|
74
|
-
|
|
75
|
-
grep -Fq "[context-guard] subagent handoff:" /tmp/subagent-auto-chain.out
|
|
76
|
-
grep -Fq "[context-guard] test hub: 1 passed, 0 failed, 0 blocked." /tmp/subagent-auto-chain.out
|
|
77
|
-
grep -Fq "created proposed chains: 1" /tmp/subagent-auto-chain.out
|
|
78
|
-
grep -Fq "next: ask the user to confirm" /tmp/subagent-auto-chain.out
|
|
79
|
-
|
|
80
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
|
|
81
|
-
from pathlib import Path
|
|
82
|
-
import json
|
|
83
|
-
import sys
|
|
84
|
-
|
|
85
|
-
path = Path(sys.argv[1])
|
|
86
|
-
data = json.loads(path.read_text(encoding="utf-8"))
|
|
87
|
-
chains = data.get("chains", [])
|
|
88
|
-
assert len(chains) == 1, chains
|
|
89
|
-
chain = chains[0]
|
|
90
|
-
assert chain["status"] == "proposed", chain
|
|
91
|
-
assert chain["run_policy"] == "every-dev-completion", chain
|
|
92
|
-
assert chain["auto_proposed"] is True, chain
|
|
93
|
-
assert chain["confirmation_required"] is True, chain
|
|
94
|
-
assert chain["source"] == "feature-chain-auto-propose", chain
|
|
95
|
-
assert chain.get("command", "") == "", chain
|
|
96
|
-
nodes = chain.get("nodes", [])
|
|
97
|
-
assert len(nodes) == 2, nodes
|
|
98
|
-
refs = [ref for node in nodes for ref in node.get("bad_cases", [])]
|
|
99
|
-
assert refs == ["BC-20260709-810", "BC-20260709-811"], refs
|
|
100
|
-
titles = [node.get("title", "") for node in nodes]
|
|
101
|
-
checks = [check for node in nodes for check in node.get("checks", [])]
|
|
102
|
-
assert any("次日清单没有恢复待完成" in title for title in titles), titles
|
|
103
|
-
assert any("部分完成刷新后进度丢失" in title for title in titles), titles
|
|
104
|
-
assert any("跨天打开流程" in check for check in checks), checks
|
|
105
|
-
assert any("部分完成恢复节点" in check for check in checks), checks
|
|
106
|
-
PY
|
|
107
|
-
|
|
108
|
-
python3 "$SCRIPT" dev-complete --root "$ROOT" >/tmp/subagent-auto-chain-dev-complete.out
|
|
109
|
-
grep -Fq "[context-guard] test hub: 1 passed, 0 failed, 0 blocked." /tmp/subagent-auto-chain-dev-complete.out
|
|
110
|
-
if grep -Fq "feature-chain" /tmp/subagent-auto-chain-dev-complete.out; then
|
|
111
|
-
echo "proposed feature chain should not run before user approval" >&2
|
|
112
|
-
exit 1
|
|
113
|
-
fi
|
|
114
|
-
|
|
115
|
-
cat >>"$ROOT/.codex/context/bad-cases.md" <<'MD'
|
|
116
|
-
|
|
117
|
-
### BC-20260709-812: 完成提示刷新后消失
|
|
118
|
-
|
|
119
|
-
- Status: resolved
|
|
120
|
-
- First observed: 2026-07-09
|
|
121
|
-
- Last checked: 2026-07-09
|
|
122
|
-
- Scope: 晚间收纳重置清单
|
|
123
|
-
- Tags: #evening-reset #persistence
|
|
124
|
-
- Display summary: 完成清单后刷新页面,完成提示没有保留。
|
|
125
|
-
- Phenomenon: 用户完成全部项目后刷新,页面不再显示完成提示。
|
|
126
|
-
- Trigger / reproduction: 勾选全部项目并刷新页面。
|
|
127
|
-
- Root cause: 完成提示没有和清单状态一起持久化。
|
|
128
|
-
- Fix method: 从持久化清单状态推导完成提示。
|
|
129
|
-
- Guard / verification: 应挂到已有晚间收纳功能链,而不是另建一条链。
|
|
130
|
-
- Guard type: feature-chain
|
|
131
|
-
- Red condition: 刷新后完成提示消失。
|
|
132
|
-
- Green condition: 刷新后仍能看到完成提示。
|
|
133
|
-
- Expected failure reason: 如果完成态持久化回归,晚间收纳功能链会在完成提示节点失败。
|
|
134
|
-
MD
|
|
135
|
-
|
|
136
|
-
python3 "$SCRIPT" subagent-complete \
|
|
137
|
-
--root "$ROOT" \
|
|
138
|
-
--agent-id "agent-auto-chain-002" \
|
|
139
|
-
--summary "Fixed another persistence issue in the same Evening Reset flow." >/tmp/subagent-auto-chain-attach.out
|
|
140
|
-
|
|
141
|
-
grep -Fq "[context-guard] test hub: 1 passed, 0 failed, 0 blocked." /tmp/subagent-auto-chain-attach.out
|
|
142
|
-
grep -Fq "created proposed chains: 0" /tmp/subagent-auto-chain-attach.out
|
|
143
|
-
grep -Fq "attached to proposed chains: 1" /tmp/subagent-auto-chain-attach.out
|
|
144
|
-
|
|
145
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
|
|
146
|
-
from pathlib import Path
|
|
147
|
-
import json
|
|
148
|
-
import sys
|
|
149
|
-
|
|
150
|
-
data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
151
|
-
chains = data.get("chains", [])
|
|
152
|
-
assert len(chains) == 1, chains
|
|
153
|
-
nodes = chains[0]["nodes"]
|
|
154
|
-
assert len(nodes) == 3, nodes
|
|
155
|
-
refs = [ref for node in nodes for ref in node.get("bad_cases", [])]
|
|
156
|
-
assert refs == ["BC-20260709-810", "BC-20260709-811", "BC-20260709-812"], refs
|
|
157
|
-
titles = [node.get("title", "") for node in nodes]
|
|
158
|
-
checks = [check for node in nodes for check in node.get("checks", [])]
|
|
159
|
-
assert any("完成提示刷新后消失" in item for item in titles), titles
|
|
160
|
-
assert any("已有晚间收纳功能链" in item for item in checks), checks
|
|
161
|
-
PY
|
|
162
|
-
|
|
163
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
|
|
164
|
-
from pathlib import Path
|
|
165
|
-
import json
|
|
166
|
-
import sys
|
|
167
|
-
|
|
168
|
-
path = Path(sys.argv[1])
|
|
169
|
-
data = json.loads(path.read_text(encoding="utf-8"))
|
|
170
|
-
chains = data.get("chains", [])
|
|
171
|
-
base = chains[0]
|
|
172
|
-
base_key = str(base.get("auto_group_key") or "persistence")
|
|
173
|
-
parts = [part for part in base_key.split("|") if part]
|
|
174
|
-
secondary_key = parts[0] if parts else "evening-reset"
|
|
175
|
-
chains.append(
|
|
176
|
-
{
|
|
177
|
-
"id": "FC-20260709-999",
|
|
178
|
-
"title": "secondary overlapping chain",
|
|
179
|
-
"status": "proposed",
|
|
180
|
-
"run_policy": "every-dev-completion",
|
|
181
|
-
"entry": "overlap test",
|
|
182
|
-
"exit_check": "overlap test",
|
|
183
|
-
"command": "",
|
|
184
|
-
"timeout_seconds": 300,
|
|
185
|
-
"artifact_policy": "cleanup-on-pass",
|
|
186
|
-
"resource": "local",
|
|
187
|
-
"created": "2026-07-09",
|
|
188
|
-
"source": "feature-chain-auto-propose",
|
|
189
|
-
"auto_proposed": True,
|
|
190
|
-
"auto_group_key": secondary_key,
|
|
191
|
-
"confirmation_required": True,
|
|
192
|
-
"nodes": [],
|
|
193
|
-
}
|
|
194
|
-
)
|
|
195
|
-
path.write_text(json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
|
196
|
-
PY
|
|
197
|
-
|
|
198
|
-
cat >>"$ROOT/.codex/context/bad-cases.md" <<'MD'
|
|
199
|
-
|
|
200
|
-
### BC-20260709-813: 下周模板提前污染今天清单
|
|
201
|
-
|
|
202
|
-
- Status: resolved
|
|
203
|
-
- First observed: 2026-07-09
|
|
204
|
-
- Last checked: 2026-07-09
|
|
205
|
-
- Scope: 晚间收纳重置清单
|
|
206
|
-
- Tags: #evening-reset #persistence
|
|
207
|
-
- Display summary: 下周计划确认后,今天的清单也被提前替换。
|
|
208
|
-
- Phenomenon: 用户在周复盘里确认下周模板,回到今天清单后发现今天的任务顺序或内容已经变了。
|
|
209
|
-
- Trigger / reproduction: 从周复盘生成下周模板,再回到今天清单。
|
|
210
|
-
- Root cause: 下周计划和今天模板共用同一份持久化状态。
|
|
211
|
-
- Fix method: 下周模板单独存储,到下周才应用。
|
|
212
|
-
- Guard / verification: 应只挂到一个最匹配的已有功能链,避免同一个 bad case 被多个 proposed 链重复覆盖。
|
|
213
|
-
- Guard type: feature-chain
|
|
214
|
-
- Red condition: 下周模板提前污染今天清单。
|
|
215
|
-
- Green condition: 下周模板确认后,今天清单保持原样。
|
|
216
|
-
- Expected failure reason: 如果自动挂载没有排除本轮已覆盖 BC,同一条 BC 会被多个 proposed 链重复挂载。
|
|
217
|
-
MD
|
|
218
|
-
|
|
219
|
-
python3 "$SCRIPT" subagent-complete \
|
|
220
|
-
--root "$ROOT" \
|
|
221
|
-
--agent-id "agent-auto-chain-overlap" \
|
|
222
|
-
--summary "Fixed next-week template persistence without changing today's checklist." >/tmp/subagent-auto-chain-overlap.out
|
|
223
|
-
|
|
224
|
-
grep -Fq "[context-guard] test hub: 1 passed, 0 failed, 0 blocked." /tmp/subagent-auto-chain-overlap.out
|
|
225
|
-
|
|
226
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
|
|
227
|
-
from pathlib import Path
|
|
228
|
-
import json
|
|
229
|
-
import sys
|
|
230
|
-
|
|
231
|
-
data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
232
|
-
refs = [
|
|
233
|
-
ref
|
|
234
|
-
for chain in data.get("chains", [])
|
|
235
|
-
for node in chain.get("nodes", [])
|
|
236
|
-
for ref in node.get("bad_cases", [])
|
|
237
|
-
]
|
|
238
|
-
assert refs.count("BC-20260709-813") == 1, refs
|
|
239
|
-
PY
|
package/tests/BC-20260709-006.sh
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${CONTEXT_GUARD_SCRIPT:-$(cd "$(dirname "$0")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-loose-bc-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
mkdir -p "$ROOT/bin"
|
|
9
|
-
cat >"$ROOT/bin/smoke.sh" <<'SH'
|
|
10
|
-
#!/usr/bin/env bash
|
|
11
|
-
set -euo pipefail
|
|
12
|
-
test -f index.html
|
|
13
|
-
grep -Fq "Evening Reset" index.html
|
|
14
|
-
SH
|
|
15
|
-
chmod +x "$ROOT/bin/smoke.sh"
|
|
16
|
-
|
|
17
|
-
cat >"$ROOT/index.html" <<'HTML'
|
|
18
|
-
<!doctype html>
|
|
19
|
-
<title>Evening Reset</title>
|
|
20
|
-
<main>Evening Reset</main>
|
|
21
|
-
HTML
|
|
22
|
-
|
|
23
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
24
|
-
python3 "$SCRIPT" test-hub-add \
|
|
25
|
-
--root "$ROOT" \
|
|
26
|
-
--title "Loose bad-case smoke" \
|
|
27
|
-
--command-text "./bin/smoke.sh" \
|
|
28
|
-
--run-policy every-dev-completion \
|
|
29
|
-
--test-status approved >/dev/null
|
|
30
|
-
|
|
31
|
-
cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
|
|
32
|
-
# Bad Case Register
|
|
33
|
-
|
|
34
|
-
## Active Cases
|
|
35
|
-
|
|
36
|
-
- BC-20260709-901 | 状态:resolved | 标签:日期切换, localStorage
|
|
37
|
-
- 现象:第二天打开页面时仍沿用前一天完成状态。
|
|
38
|
-
- 触发:localStorage 只保存勾选状态,不比较日期。
|
|
39
|
-
- 修复:保存日期并在跨天时重置当天状态。
|
|
40
|
-
- 验证:跨天打开后清单恢复待完成。
|
|
41
|
-
- BC-20260709-902 | 状态: resolved | 标题: 部分完成刷新后进度丢失
|
|
42
|
-
- 现象: 勾选两项后刷新,进度回到 0。
|
|
43
|
-
- 触发: 只在最终完成时写入 localStorage。
|
|
44
|
-
- 修复: 每次勾选变化都保存进度。
|
|
45
|
-
- 验证: 刷新后保留已勾选项目。
|
|
46
|
-
- 标签: 日期切换, localStorage
|
|
47
|
-
MD
|
|
48
|
-
|
|
49
|
-
python3 "$SCRIPT" subagent-complete \
|
|
50
|
-
--root "$ROOT" \
|
|
51
|
-
--agent-id "loose-bc-agent" \
|
|
52
|
-
--summary "Subagent wrote loose bad-case register entries." >/tmp/context-guard-loose-bc.out
|
|
53
|
-
|
|
54
|
-
grep -Fq "[context-guard] test hub: 1 passed, 0 failed, 0 blocked." /tmp/context-guard-loose-bc.out
|
|
55
|
-
grep -Fq "created proposed chains: 1" /tmp/context-guard-loose-bc.out
|
|
56
|
-
|
|
57
|
-
python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
|
|
58
|
-
from pathlib import Path
|
|
59
|
-
import json
|
|
60
|
-
import sys
|
|
61
|
-
|
|
62
|
-
data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
63
|
-
chains = data.get("chains", [])
|
|
64
|
-
assert len(chains) == 1, chains
|
|
65
|
-
chain = chains[0]
|
|
66
|
-
assert chain["status"] == "proposed", chain
|
|
67
|
-
assert chain["confirmation_required"] is True, chain
|
|
68
|
-
nodes = chain["nodes"]
|
|
69
|
-
assert len(nodes) == 2, nodes
|
|
70
|
-
refs = [ref for node in nodes for ref in node.get("bad_cases", [])]
|
|
71
|
-
assert refs == ["BC-20260709-901", "BC-20260709-902"], nodes
|
|
72
|
-
titles = [node.get("title", "") for node in nodes]
|
|
73
|
-
checks = [check for node in nodes for check in node.get("checks", [])]
|
|
74
|
-
assert any("部分完成刷新后进度丢失" in item for item in titles), nodes
|
|
75
|
-
assert any("刷新后保留已勾选项目" in item for item in checks), nodes
|
|
76
|
-
PY
|
package/tests/BC-20260709-008.sh
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/cg-risk-audit.XXXXXX")"
|
|
5
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
6
|
-
|
|
7
|
-
SCRIPT="/Users/bytedance/.agents/skills/context-guard/scripts/context_guard.py"
|
|
8
|
-
|
|
9
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
10
|
-
|
|
11
|
-
python3 "$SCRIPT" subagent-complete \
|
|
12
|
-
--root "$ROOT" \
|
|
13
|
-
--agent-id "risk-audit-smoke" \
|
|
14
|
-
--summary "加入练习模式、关闭倒计时选项、失败复盘里的逐步回放,以及最高分重置确认;smoke 通过。" \
|
|
15
|
-
>"$ROOT/out-risk.txt"
|
|
16
|
-
|
|
17
|
-
grep -q "risk audit: created bad-case candidate" "$ROOT/out-risk.txt"
|
|
18
|
-
grep -q "risk-audit" "$ROOT/.codex/context/bad-cases.md"
|
|
19
|
-
grep -q "游戏流程.*未验证" "$ROOT/.codex/context/bad-cases.md"
|
|
20
|
-
|
|
21
|
-
python3 "$SCRIPT" subagent-complete \
|
|
22
|
-
--root "$ROOT" \
|
|
23
|
-
--agent-id "risk-audit-duplicate" \
|
|
24
|
-
--summary "加入练习模式、关闭倒计时选项、失败复盘里的逐步回放,以及最高分重置确认;smoke 通过。" \
|
|
25
|
-
>"$ROOT/out-duplicate.txt"
|
|
26
|
-
|
|
27
|
-
grep -q "risk audit: no new bad-case candidate" "$ROOT/out-duplicate.txt"
|
|
28
|
-
if [[ "$(grep -c '^### BC-' "$ROOT/.codex/context/bad-cases.md")" != "1" ]]; then
|
|
29
|
-
echo "duplicate risk-audit summary should not create a second similar bad case" >&2
|
|
30
|
-
exit 1
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
python3 "$SCRIPT" subagent-complete \
|
|
34
|
-
--root "$ROOT" \
|
|
35
|
-
--agent-id "risk-audit-same-tags-new-step" \
|
|
36
|
-
--summary "继续加入关卡包切换和暂停恢复,失败后展示本轮序列复盘;smoke 通过。" \
|
|
37
|
-
>"$ROOT/out-same-tags-new-step.txt"
|
|
38
|
-
|
|
39
|
-
grep -q "risk audit: created bad-case candidate" "$ROOT/out-same-tags-new-step.txt"
|
|
40
|
-
if [[ "$(grep -c '^### BC-' "$ROOT/.codex/context/bad-cases.md")" != "2" ]]; then
|
|
41
|
-
echo "same-tag but different long-flow step should create another bad case candidate" >&2
|
|
42
|
-
exit 1
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
python3 "$SCRIPT" subagent-complete \
|
|
46
|
-
--root "$ROOT" \
|
|
47
|
-
--agent-id "risk-audit-distinct" \
|
|
48
|
-
--summary "加入复制结果和导出 Markdown,空输入时显示校验提示;smoke 通过。" \
|
|
49
|
-
>"$ROOT/out-distinct.txt"
|
|
50
|
-
|
|
51
|
-
grep -q "risk audit: created bad-case candidate" "$ROOT/out-distinct.txt"
|
|
52
|
-
if [[ "$(grep -c '^### BC-' "$ROOT/.codex/context/bad-cases.md")" != "3" ]]; then
|
|
53
|
-
echo "distinct risk-audit summary should create a second bad case candidate" >&2
|
|
54
|
-
exit 1
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
python3 "$SCRIPT" subagent-complete \
|
|
58
|
-
--root "$ROOT" \
|
|
59
|
-
--agent-id "risk-audit-edit-isolation" \
|
|
60
|
-
--summary "新增角色小队的章节计划,重生成单章时不影响其他章节,导出 Markdown 包含章节计划;smoke 通过。" \
|
|
61
|
-
>"$ROOT/out-edit-isolation.txt"
|
|
62
|
-
|
|
63
|
-
grep -q "risk audit: created bad-case candidate" "$ROOT/out-edit-isolation.txt"
|
|
64
|
-
grep -q "局部隔离" "$ROOT/.codex/context/bad-cases.md"
|
|
65
|
-
if [[ "$(grep -c '^### BC-' "$ROOT/.codex/context/bad-cases.md")" != "4" ]]; then
|
|
66
|
-
echo "long-flow edit isolation should create a risk-audit bad case candidate" >&2
|
|
67
|
-
exit 1
|
|
68
|
-
fi
|
|
69
|
-
|
|
70
|
-
ROOT_LOW="$(mktemp -d "${TMPDIR:-/tmp}/cg-risk-audit-low.XXXXXX")"
|
|
71
|
-
trap 'rm -rf "$ROOT" "$ROOT_LOW"' EXIT
|
|
72
|
-
python3 "$SCRIPT" init --root "$ROOT_LOW" >/dev/null
|
|
73
|
-
python3 "$SCRIPT" subagent-complete \
|
|
74
|
-
--root "$ROOT_LOW" \
|
|
75
|
-
--agent-id "risk-audit-low" \
|
|
76
|
-
--summary "更新 README 文案并修正两个错别字;smoke 通过。" \
|
|
77
|
-
>"$ROOT_LOW/out-low.txt"
|
|
78
|
-
|
|
79
|
-
grep -q "risk audit: no new bad-case candidate" "$ROOT_LOW/out-low.txt"
|
|
80
|
-
if grep -q "risk-audit" "$ROOT_LOW/.codex/context/bad-cases.md"; then
|
|
81
|
-
echo "low-risk summary should not create risk-audit bad case" >&2
|
|
82
|
-
exit 1
|
|
83
|
-
fi
|
|
84
|
-
|
|
85
|
-
ROOT_LEGACY="$(mktemp -d "${TMPDIR:-/tmp}/cg-risk-audit-legacy-chain.XXXXXX")"
|
|
86
|
-
trap 'rm -rf "$ROOT" "$ROOT_LOW" "$ROOT_LEGACY"' EXIT
|
|
87
|
-
python3 "$SCRIPT" init --root "$ROOT_LEGACY" >/dev/null
|
|
88
|
-
mkdir -p "$ROOT_LEGACY/.codex/context/test-hub"
|
|
89
|
-
cat >"$ROOT_LEGACY/.codex/context/bad-cases.md" <<'MD'
|
|
90
|
-
# Bad Case Register
|
|
91
|
-
|
|
92
|
-
## Active Cases
|
|
93
|
-
|
|
94
|
-
### BC-20260709-101: 状态切换风险未验证
|
|
95
|
-
|
|
96
|
-
- Status: open
|
|
97
|
-
- Scope: 状态切换
|
|
98
|
-
- Tags: #状态流程 #回放 #risk-audit #subagent
|
|
99
|
-
- Display summary: Subagent 本轮开发涉及状态切换和回放,但没有对应功能链节点。
|
|
100
|
-
- Phenomenon: 练习模式和普通模式来回切换后状态可能串线。
|
|
101
|
-
- Trigger / reproduction: 切换练习模式后退出,再继续普通模式。
|
|
102
|
-
- Guard / verification: 运行游戏入口,检查练习模式和普通模式状态互不污染。
|
|
103
|
-
|
|
104
|
-
### BC-20260709-102: 重置撤销风险未验证
|
|
105
|
-
|
|
106
|
-
- Status: open
|
|
107
|
-
- Scope: 状态切换
|
|
108
|
-
- Tags: #状态流程 #重置 #risk-audit #subagent
|
|
109
|
-
- Display summary: Subagent 本轮开发涉及重置撤销,但没有对应功能链节点。
|
|
110
|
-
- Phenomenon: 重置确认取消后仍可能清空游戏进度。
|
|
111
|
-
- Trigger / reproduction: 点击重置全部进度,再取消确认。
|
|
112
|
-
- Guard / verification: 运行游戏入口,检查取消重置后进度仍保留。
|
|
113
|
-
MD
|
|
114
|
-
cat >"$ROOT_LEGACY/.codex/context/test-hub/feature-chains.json" <<'JSON'
|
|
115
|
-
{
|
|
116
|
-
"version": 1,
|
|
117
|
-
"chains": [
|
|
118
|
-
{
|
|
119
|
-
"id": "FC-20260709-001",
|
|
120
|
-
"title": "Context Guard subagent completion risk audit",
|
|
121
|
-
"status": "proposed",
|
|
122
|
-
"run_policy": "every-dev-completion",
|
|
123
|
-
"entry": "触发内部审计",
|
|
124
|
-
"exit_check": "内部审计通过",
|
|
125
|
-
"command": "",
|
|
126
|
-
"timeout_seconds": 300,
|
|
127
|
-
"artifact_policy": "cleanup-on-pass",
|
|
128
|
-
"resource": "local",
|
|
129
|
-
"created": "2026-07-09",
|
|
130
|
-
"source": "feature-chain-auto-propose",
|
|
131
|
-
"auto_proposed": true,
|
|
132
|
-
"auto_group_key": "#risk-audit|#subagent",
|
|
133
|
-
"confirmation_required": true,
|
|
134
|
-
"nodes": [
|
|
135
|
-
{
|
|
136
|
-
"id": "FC-20260709-001-N1",
|
|
137
|
-
"title": "状态切换风险未验证",
|
|
138
|
-
"bad_cases": ["BC-20260709-101"],
|
|
139
|
-
"checks": ["检查练习模式和普通模式状态互不污染"]
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
"id": "FC-20260709-001-N2",
|
|
143
|
-
"title": "重置撤销风险未验证",
|
|
144
|
-
"bad_cases": ["BC-20260709-102"],
|
|
145
|
-
"checks": ["检查取消重置后进度仍保留"]
|
|
146
|
-
}
|
|
147
|
-
]
|
|
148
|
-
}
|
|
149
|
-
]
|
|
150
|
-
}
|
|
151
|
-
JSON
|
|
152
|
-
|
|
153
|
-
python3 "$SCRIPT" feature-chain-auto-propose --root "$ROOT_LEGACY" >/tmp/risk-audit-legacy-refresh.out
|
|
154
|
-
|
|
155
|
-
python3 - "$ROOT_LEGACY/.codex/context/test-hub/feature-chains.json" <<'PY'
|
|
156
|
-
from pathlib import Path
|
|
157
|
-
import json
|
|
158
|
-
import sys
|
|
159
|
-
|
|
160
|
-
data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
|
|
161
|
-
chain = data["chains"][0]
|
|
162
|
-
assert chain["title"] == "状态切换", chain
|
|
163
|
-
assert "risk-audit" not in chain.get("auto_group_key", ""), chain
|
|
164
|
-
assert "subagent" not in chain.get("auto_group_key", ""), chain
|
|
165
|
-
assert "#状态流程" in chain.get("auto_group_key", ""), chain
|
|
166
|
-
assert chain["entry"] == "触发「状态切换」相关用户流程", chain
|
|
167
|
-
assert chain["exit_check"] == "「状态切换」相关结果保持用户可见的正确状态", chain
|
|
168
|
-
PY
|
package/tests/BC-20260710-001.sh
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
SCRIPT="${CONTEXT_GUARD_SCRIPT:-$(cd "$(dirname "$0")/.." && pwd)/scripts/context_guard.py}"
|
|
5
|
-
ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-completion-evidence-XXXXXX")"
|
|
6
|
-
trap 'rm -rf "$ROOT"' EXIT
|
|
7
|
-
|
|
8
|
-
python3 "$SCRIPT" init --root "$ROOT" >/dev/null
|
|
9
|
-
cat >"$ROOT/evidence.txt" <<'TXT'
|
|
10
|
-
完成了跨空间移动和复制功能。
|
|
11
|
-
CG_BAD_CASE: 跨空间移动会误删同名物品
|
|
12
|
-
CG_PHENOMENON: 把一个物品移动到另一个空间时,源空间里名称相同但 ID 不同的物品也会被删除。
|
|
13
|
-
CG_TRIGGER: 在源空间建立两个同名物品,只移动其中一个。
|
|
14
|
-
CG_CAUSE: 删除源数据时使用名称匹配,而不是本次移动记录的物品 ID。
|
|
15
|
-
CG_FIX: 移动完成后只按本次移动成功的 item.id 删除源物品。
|
|
16
|
-
CG_VERIFICATION: 建立两个同名物品后移动其中一个,目标空间新增一项,源空间仍保留另一项。
|
|
17
|
-
CG_SCOPE: 跨空间复制与移动
|
|
18
|
-
TXT
|
|
19
|
-
|
|
20
|
-
python3 "$SCRIPT" subagent-complete \
|
|
21
|
-
--root "$ROOT" \
|
|
22
|
-
--agent-id "evidence-agent" \
|
|
23
|
-
--summary "完成跨空间移动功能。" \
|
|
24
|
-
--evidence-file "$ROOT/evidence.txt" >"$ROOT/first.out"
|
|
25
|
-
|
|
26
|
-
grep -Fq "completion evidence: archived concrete bad case(s)" "$ROOT/first.out"
|
|
27
|
-
grep -Fq "跨空间移动会误删同名物品" "$ROOT/.codex/context/bad-cases.md"
|
|
28
|
-
grep -Fq -- "- Status: resolved" "$ROOT/.codex/context/bad-cases.md"
|
|
29
|
-
grep -Fq "只按本次移动成功的 item.id 删除源物品" "$ROOT/.codex/context/bad-cases.md"
|
|
30
|
-
if grep -Fq "risk-audit" "$ROOT/.codex/context/bad-cases.md"; then
|
|
31
|
-
echo "concrete completion evidence must win over generic risk audit" >&2
|
|
32
|
-
exit 1
|
|
33
|
-
fi
|
|
34
|
-
|
|
35
|
-
python3 "$SCRIPT" subagent-complete \
|
|
36
|
-
--root "$ROOT" \
|
|
37
|
-
--agent-id "evidence-agent" \
|
|
38
|
-
--summary "完成跨空间移动功能。" \
|
|
39
|
-
--evidence-file "$ROOT/evidence.txt" >"$ROOT/repeat.out"
|
|
40
|
-
|
|
41
|
-
grep -Fq "subagent completion already processed" "$ROOT/repeat.out"
|
|
42
|
-
[[ "$(grep -c '^### BC-' "$ROOT/.codex/context/bad-cases.md")" == "1" ]]
|
|
43
|
-
[[ "$(grep -c 'Subagent completion handoff' "$ROOT/.codex/context/roadmap.md")" == "1" ]]
|
|
44
|
-
|
|
45
|
-
NATURAL_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-natural-evidence-XXXXXX")"
|
|
46
|
-
trap 'rm -rf "$ROOT" "$NATURAL_ROOT"' EXIT
|
|
47
|
-
python3 "$SCRIPT" init --root "$NATURAL_ROOT" >/dev/null
|
|
48
|
-
python3 "$SCRIPT" subagent-complete \
|
|
49
|
-
--root "$NATURAL_ROOT" \
|
|
50
|
-
--agent-id "natural-evidence-agent" \
|
|
51
|
-
--summary "修复了跨空间移动会按名称误删同名物品的问题,改为按 item.id 精确删除;验证两个同名物品只移动目标项。" \
|
|
52
|
-
>"$NATURAL_ROOT/out.txt"
|
|
53
|
-
|
|
54
|
-
grep -Fq "completion evidence: archived concrete bad case(s)" "$NATURAL_ROOT/out.txt"
|
|
55
|
-
grep -Fq "跨空间移动会按名称误删同名物品" "$NATURAL_ROOT/.codex/context/bad-cases.md"
|
|
56
|
-
if grep -Fq "risk-audit" "$NATURAL_ROOT/.codex/context/bad-cases.md"; then
|
|
57
|
-
echo "natural concrete repair evidence must not become generic risk audit" >&2
|
|
58
|
-
exit 1
|
|
59
|
-
fi
|
|
60
|
-
|
|
61
|
-
echo "BC-20260710-001 passed"
|