@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.
Files changed (161) hide show
  1. package/Coordinator.md +88 -0
  2. package/Executor.md +53 -0
  3. package/README.md +89 -224
  4. package/README.zh-CN.md +89 -224
  5. package/SKILL.md +26 -684
  6. package/THIRD_PARTY_NOTICES.md +47 -0
  7. package/Tester.md +53 -0
  8. package/agents/openai.yaml +2 -2
  9. package/bin/build-runtime.mjs +96 -0
  10. package/bin/context-guard-skill.js +399 -78
  11. package/bin/postinstall.js +2 -2
  12. package/hooks.json +89 -13
  13. package/licenses/JSONParse-MIT.txt +24 -0
  14. package/licenses/Marked-MIT.txt +44 -0
  15. package/licenses/Portless-Apache-2.0.txt +201 -0
  16. package/package.json +35 -6
  17. package/prototype/LICENSES/Marked-MIT.txt +44 -0
  18. package/prototype/LICENSES/Ready-redistribution.txt +14 -0
  19. package/prototype/attachments.mjs +75 -0
  20. package/prototype/coordinator-markdown.mjs +283 -0
  21. package/prototype/coordinator-working-blot.mjs +124 -0
  22. package/prototype/vendor/marked.mjs +2189 -0
  23. package/prototype/workbench-app.js +5197 -0
  24. package/prototype/workbench-data.js +33 -0
  25. package/prototype/workbench-sync.mjs +898 -0
  26. package/prototype/workbench.css +1050 -0
  27. package/prototype/workbench.html +211 -0
  28. package/prototype/working-blot-atlas.png +0 -0
  29. package/references/agent-handoff.md +40 -0
  30. package/references/claude-runtime.md +120 -0
  31. package/references/cloud-sync-interface.md +66 -0
  32. package/references/design-current.md +14 -0
  33. package/references/map-mount.md +41 -0
  34. package/references/map-read.md +50 -0
  35. package/references/memory-definition.md +120 -0
  36. package/references/memory-filesystem-v2/Bug.en.md +162 -0
  37. package/references/memory-filesystem-v2/Bug.md +162 -0
  38. package/references/memory-filesystem-v2/Bug_Coordinater.md +8 -0
  39. package/references/memory-filesystem-v2/Bug_Executor.md +8 -0
  40. package/references/memory-filesystem-v2/Bug_Tester.md +7 -0
  41. package/references/memory-filesystem-v2/Idea.en.md +36 -0
  42. package/references/memory-filesystem-v2/Idea.md +36 -0
  43. package/references/memory-filesystem-v2/Node_Module_Index.en.md +88 -0
  44. package/references/memory-filesystem-v2/Node_Module_Index.md +88 -0
  45. package/references/memory-filesystem-v2/README.md +60 -0
  46. package/references/memory-filesystem-v2/Todo.en.md +137 -0
  47. package/references/memory-filesystem-v2/Todo.md +137 -0
  48. package/references/memory-filesystem-v2/Todo_Coordinater.md +7 -0
  49. package/references/memory-filesystem-v2/Todo_Executor.md +7 -0
  50. package/references/memory-filesystem-v2/Todo_Tester.md +7 -0
  51. package/references/named-workbench.md +124 -0
  52. package/references/plan-review.md +12 -0
  53. package/references/server-memory.md +276 -0
  54. package/references/test-check.md +7 -0
  55. package/references/user-reply.md +38 -0
  56. package/references/workbench-interface.md +531 -0
  57. package/roles.md +13 -0
  58. package/scripts/context_guard.py +1366 -7602
  59. package/scripts/context_guard_hook.py +1960 -711
  60. package/scripts/map_owns.py +699 -0
  61. package/scripts/shared/LICENSES/JSONParse-MIT.txt +24 -0
  62. package/scripts/shared/filesystem-v2.mjs +430 -0
  63. package/scripts/shared/io.mjs +117 -0
  64. package/scripts/shared/map-model.mjs +506 -0
  65. package/scripts/shared/memory-schema.mjs +13 -0
  66. package/scripts/shared/protocol-blobs.mjs +112 -0
  67. package/scripts/shared/protocol-map.mjs +146 -0
  68. package/scripts/shared/protocol-snapshots.mjs +84 -0
  69. package/scripts/shared/protocol-store.mjs +624 -0
  70. package/scripts/shared/protocol-workflow.mjs +226 -0
  71. package/scripts/shared/protocol.mjs +125 -0
  72. package/scripts/shared/vendor/jsonparse.cjs +413 -0
  73. package/scripts/workbench/access.mjs +496 -0
  74. package/scripts/workbench/attachments.mjs +92 -0
  75. package/scripts/workbench/browser-login.mjs +78 -0
  76. package/scripts/workbench/claude-runtime.mjs +372 -0
  77. package/scripts/workbench/cli.mjs +980 -0
  78. package/scripts/workbench/device-heartbeat.mjs +72 -0
  79. package/scripts/workbench/hook-status.mjs +38 -0
  80. package/scripts/workbench/inbox.mjs +155 -0
  81. package/scripts/workbench/journal.mjs +56 -0
  82. package/scripts/workbench/memory-merge.mjs +65 -0
  83. package/scripts/workbench/memory.mjs +252 -0
  84. package/scripts/workbench/named-proxy.mjs +108 -0
  85. package/scripts/workbench/named.mjs +152 -0
  86. package/scripts/workbench/portless-routes.mjs +51 -0
  87. package/scripts/workbench/project.mjs +327 -0
  88. package/scripts/workbench/projections.mjs +68 -0
  89. package/scripts/workbench/protocol-client.mjs +165 -0
  90. package/scripts/workbench/protocol-delivery.mjs +133 -0
  91. package/scripts/workbench/protocol-device.mjs +316 -0
  92. package/scripts/workbench/protocol-events.mjs +53 -0
  93. package/scripts/workbench/protocol-repository.mjs +58 -0
  94. package/scripts/workbench/reconcile.mjs +244 -0
  95. package/scripts/workbench/registry.mjs +111 -0
  96. package/scripts/workbench/runtime.mjs +54 -0
  97. package/scripts/workbench/server.mjs +1171 -0
  98. package/scripts/workbench/store.mjs +243 -0
  99. package/scripts/workbench/sync-coordinator.mjs +518 -0
  100. package/scripts/workbench/sync.mjs +86 -0
  101. package/references/context-template.md +0 -341
  102. package/references/feature-chain-methodology.md +0 -228
  103. package/references/register-template.md +0 -85
  104. package/references/task-case-template.md +0 -63
  105. package/tests/BC-20260618-063.sh +0 -116
  106. package/tests/BC-20260618-065.sh +0 -66
  107. package/tests/BC-20260626-080.sh +0 -48
  108. package/tests/BC-20260626-081.sh +0 -40
  109. package/tests/BC-20260626-082.sh +0 -32
  110. package/tests/BC-20260626-083.sh +0 -66
  111. package/tests/BC-20260627-084.sh +0 -74
  112. package/tests/BC-20260630-086.sh +0 -50
  113. package/tests/BC-20260630-087.sh +0 -103
  114. package/tests/BC-20260630-088.sh +0 -32
  115. package/tests/BC-20260630-089.sh +0 -63
  116. package/tests/BC-20260701-090.sh +0 -84
  117. package/tests/BC-20260702-096.sh +0 -48
  118. package/tests/BC-20260706-098.sh +0 -66
  119. package/tests/BC-20260707-099.sh +0 -47
  120. package/tests/BC-20260707-100.sh +0 -46
  121. package/tests/BC-20260707-101.sh +0 -47
  122. package/tests/BC-20260707-102.sh +0 -68
  123. package/tests/BC-20260707-103.sh +0 -59
  124. package/tests/BC-20260707-104.sh +0 -103
  125. package/tests/BC-20260707-105.sh +0 -109
  126. package/tests/BC-20260707-106.sh +0 -80
  127. package/tests/BC-20260707-107.sh +0 -74
  128. package/tests/BC-20260707-108.sh +0 -48
  129. package/tests/BC-20260707-109.sh +0 -56
  130. package/tests/BC-20260707-110.sh +0 -71
  131. package/tests/BC-20260707-111.sh +0 -70
  132. package/tests/BC-20260707-112.sh +0 -45
  133. package/tests/BC-20260707-113.sh +0 -73
  134. package/tests/BC-20260707-115.sh +0 -77
  135. package/tests/BC-20260707-116.sh +0 -77
  136. package/tests/BC-20260707-118.sh +0 -115
  137. package/tests/BC-20260707-119.sh +0 -47
  138. package/tests/BC-20260707-120.sh +0 -60
  139. package/tests/BC-20260707-121.sh +0 -66
  140. package/tests/BC-20260707-122.sh +0 -48
  141. package/tests/BC-20260707-123.sh +0 -43
  142. package/tests/BC-20260707-124.sh +0 -56
  143. package/tests/BC-20260707-125.sh +0 -64
  144. package/tests/BC-20260707-126.sh +0 -80
  145. package/tests/BC-20260707-127.sh +0 -88
  146. package/tests/BC-20260707-129.sh +0 -59
  147. package/tests/BC-20260707-130.sh +0 -69
  148. package/tests/BC-20260707-131.sh +0 -140
  149. package/tests/BC-20260707-132.sh +0 -150
  150. package/tests/BC-20260707-133.sh +0 -70
  151. package/tests/BC-20260708-136.sh +0 -210
  152. package/tests/BC-20260708-137.sh +0 -106
  153. package/tests/BC-20260708-138.sh +0 -168
  154. package/tests/BC-20260708-139.sh +0 -79
  155. package/tests/BC-20260709-002.sh +0 -63
  156. package/tests/BC-20260709-003.sh +0 -239
  157. package/tests/BC-20260709-006.sh +0 -76
  158. package/tests/BC-20260709-008.sh +0 -168
  159. package/tests/BC-20260710-001.sh +0 -61
  160. package/tests/BC-20260710-002.sh +0 -111
  161. package/tests/npm-install-smoke.sh +0 -53
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"