@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,64 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
5
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-pending-feature-chain-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- OUT="$ROOT/propose.out"
8
- APPROVE_ERR="$ROOT/approve.err"
9
-
10
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
11
-
12
- python3 "$SCRIPT" feature-chain-propose \
13
- --root "$ROOT" \
14
- --title "Markdown 公式预览" \
15
- --entry "编辑器输入 Markdown" \
16
- --exit-check "预览正确渲染" \
17
- --node-title "公式渲染回归" \
18
- --check "单行、多行和矩阵公式都被 MathJax 正常排版" \
19
- --coverage-pending-reason "用户先确认功能测试,后续遇到 bad case 再挂到 checkpoint" >"$OUT"
20
-
21
- grep -q "feature chain proposed:" "$OUT"
22
- grep -q "status: proposed; this chain is not executable" "$OUT"
23
- grep -q "checkpoint: 公式渲染回归 | coverage pending" "$OUT"
24
- grep -q "coverage pending reason: 用户先确认功能测试" "$OUT"
25
-
26
- CHAIN_ID="$(grep 'feature chain proposed:' "$OUT" | awk '{print $NF}')"
27
- test -n "$CHAIN_ID"
28
-
29
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$CHAIN_ID" <<'PY'
30
- from pathlib import Path
31
- import json
32
- import sys
33
-
34
- path = Path(sys.argv[1])
35
- chain_id = sys.argv[2]
36
- data = json.loads(path.read_text(encoding="utf-8"))
37
- chains = data.get("chains", [])
38
- assert len(chains) == 1, data
39
- chain = chains[0]
40
- assert chain["id"] == chain_id, chain
41
- assert chain["status"] == "proposed", chain
42
- assert chain["type"] == "manual", chain
43
- assert chain["command"] == "", chain
44
- node = chain["nodes"][0]
45
- assert node["title"] == "公式渲染回归", node
46
- assert node["bad_cases"] == [], node
47
- assert "用户先确认功能测试" in node["coverage_pending_reason"], node
48
- PY
49
-
50
- if python3 "$SCRIPT" feature-chain-approve \
51
- --root "$ROOT" \
52
- --chain-id "$CHAIN_ID" \
53
- --command-text "printf 'CG_CHECKPOINT:公式渲染回归:PASS\n'" 2>"$APPROVE_ERR"; then
54
- cat "$APPROVE_ERR"
55
- exit 1
56
- fi
57
- grep -q "requires a checkpoint with check text and linked bad-case coverage" "$APPROVE_ERR"
58
-
59
- python3 "$SCRIPT" dev-complete --root "$ROOT" >"$ROOT/dev-complete.out"
60
- grep -q "no approved every-dev-completion tests" "$ROOT/dev-complete.out"
61
-
62
- python3 "$SCRIPT" validate-feature-chains --root "$ROOT" >"$ROOT/validate.out"
63
- grep -q "feature-chain validation passed: 1 chain" "$ROOT/validate.out"
64
- grep -q "pending bad-case coverage" "$ROOT/validate.out"
@@ -1,80 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
5
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-pending-chain-attach-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- PROPOSE_OUT="$ROOT/propose.out"
8
- PLAN_OUT="$ROOT/plan.out"
9
- ATTACH_OUT="$ROOT/attach.out"
10
-
11
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
12
-
13
- python3 "$SCRIPT" feature-chain-propose \
14
- --root "$ROOT" \
15
- --title "Markdown 公式预览" \
16
- --entry "编辑器输入 Markdown" \
17
- --exit-check "预览正确渲染" \
18
- --node-title "公式渲染回归" \
19
- --check "单行、多行和矩阵公式都被 MathJax 正常排版" \
20
- --coverage-pending-reason "用户先确认功能测试,后续遇到 MathJax 公式渲染 bad case 再挂到 checkpoint" >"$PROPOSE_OUT"
21
-
22
- CHAIN_ID="$(grep 'feature chain proposed:' "$PROPOSE_OUT" | awk '{print $NF}')"
23
- test -n "$CHAIN_ID"
24
-
25
- cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
26
- ### BC-20260707-900: Markdown 公式预览没有渲染
27
-
28
- - Status: resolved
29
- - First observed: 2026-07-07
30
- - Last checked: 2026-07-07
31
- - Scope: Markdown editor preview
32
- - Tags: #feature-chain #mathjax #rendering
33
- - Display summary: Markdown 编辑器里的公式没有被 MathJax 正常渲染。
34
- - Phenomenon: 单行、多行或矩阵公式在预览里显示为原始文本。
35
- - Trigger / reproduction: 在编辑器输入 Markdown 公式并打开预览。
36
- - Root cause: 预览渲染链路没有触发 MathJax 排版。
37
- - Fix method: 确保预览更新后执行 MathJax typeset。
38
- - Guard / verification: 功能链 checkpoint 应验证公式预览已渲染。
39
- - Red condition: 预览仍显示原始公式文本。
40
- - Green condition: 预览显示排版后的公式。
41
- - Expected failure reason: 如果公式渲染回归,功能链 checkpoint 会失败。
42
- MD
43
-
44
- python3 "$SCRIPT" feature-chain-plan \
45
- --root "$ROOT" \
46
- --query "BC-20260707-900" >"$PLAN_OUT"
47
-
48
- grep -q "action: review-existing-chain" "$PLAN_OUT"
49
- grep -q "$CHAIN_ID" "$PLAN_OUT"
50
- grep -q "checkpoint: 公式渲染回归" "$PLAN_OUT"
51
- grep -q "after-confirmation command: .*feature-chain-attach-bc" "$PLAN_OUT"
52
- grep -q -- "--bad-case BC-20260707-900" "$PLAN_OUT"
53
-
54
- python3 "$SCRIPT" feature-chain-attach-bc \
55
- --root "$ROOT" \
56
- --chain-id "$CHAIN_ID" \
57
- --node-title "公式渲染回归" \
58
- --bad-case "BC-20260707-900" \
59
- --check "公式预览必须触发 MathJax 排版" >"$ATTACH_OUT"
60
-
61
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$CHAIN_ID" <<'PY'
62
- from pathlib import Path
63
- import json
64
- import sys
65
-
66
- path = Path(sys.argv[1])
67
- chain_id = sys.argv[2]
68
- data = json.loads(path.read_text(encoding="utf-8"))
69
- chain = next(item for item in data["chains"] if item["id"] == chain_id)
70
- node = chain["nodes"][0]
71
- assert "BC-20260707-900" in node["bad_cases"], node
72
- assert "coverage_pending_reason" not in node, node
73
- assert "公式预览必须触发 MathJax 排版" in node["checks"], node
74
- PY
75
-
76
- python3 "$SCRIPT" validate-feature-chains --root "$ROOT" >"$ROOT/validate.out"
77
- grep -q "feature-chain validation passed: 1 chain(s), 0 warning(s)" "$ROOT/validate.out"
78
-
79
- python3 "$SCRIPT" dev-complete --root "$ROOT" >"$ROOT/dev-complete.out"
80
- grep -q "no approved every-dev-completion tests" "$ROOT/dev-complete.out"
@@ -1,88 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
5
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-summary-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- OUT="$ROOT/summary.out"
8
-
9
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
-
11
- cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
12
- ### BC-20260707-901: Markdown 公式预览没有渲染
13
-
14
- - Status: resolved
15
- - First observed: 2026-07-07
16
- - Last checked: 2026-07-07
17
- - Scope: Markdown editor preview
18
- - Tags: #feature-chain #mathjax
19
- - Display summary: Markdown 编辑器里的公式没有被 MathJax 正常渲染。
20
- - Phenomenon: 单行、多行或矩阵公式在预览里显示为原始文本。
21
- - Trigger / reproduction: 在编辑器输入 Markdown 公式并打开预览。
22
- - Root cause: 预览渲染链路没有触发 MathJax 排版。
23
- - Fix method: 确保预览更新后执行 MathJax typeset。
24
- - Guard / verification: 功能链 checkpoint 应验证公式预览已渲染。
25
- - Red condition: 预览仍显示原始公式文本。
26
- - Green condition: 预览显示排版后的公式。
27
- - Expected failure reason: 如果公式渲染回归,功能链 checkpoint 会失败。
28
-
29
- ### BC-20260707-902: Markdown 公式换行错乱
30
-
31
- - Status: resolved
32
- - First observed: 2026-07-07
33
- - Last checked: 2026-07-07
34
- - Scope: Markdown editor preview
35
- - Tags: #feature-chain #mathjax
36
- - Display summary: 多行公式和矩阵公式在预览里换行错乱。
37
- - Phenomenon: 多行公式和矩阵公式没有保持正确排版。
38
- - Trigger / reproduction: 输入包含矩阵公式的 Markdown 并打开预览。
39
- - Root cause: 渲染后没有等待 MathJax 完成排版。
40
- - Fix method: 等待 MathJax 渲染完成再判定预览稳定。
41
- - Guard / verification: 功能链 checkpoint 应验证多行公式和矩阵公式。
42
- - Red condition: 多行公式或矩阵公式排版错乱。
43
- - Green condition: 多行公式和矩阵公式排版稳定。
44
- - Expected failure reason: 如果异步排版回归,功能链 checkpoint 会失败。
45
- MD
46
-
47
- python3 "$SCRIPT" feature-chain-propose \
48
- --root "$ROOT" \
49
- --title "Markdown 公式预览" \
50
- --entry "编辑器输入 Markdown" \
51
- --exit-check "预览正确渲染" \
52
- --node-title "公式渲染回归" \
53
- --bad-cases "BC-20260707-901,BC-20260707-902" \
54
- --check "单行、多行和矩阵公式都被 MathJax 正常排版" >/dev/null
55
-
56
- python3 "$SCRIPT" feature-chain-propose \
57
- --root "$ROOT" \
58
- --title "Markdown 图片预览" \
59
- --entry "编辑器插入图片" \
60
- --exit-check "预览正确显示图片" \
61
- --node-title "图片资源加载" \
62
- --coverage-pending-reason "用户先确认图片预览流程,后续遇到具体图片 bad case 再挂到 checkpoint" \
63
- --check "图片链接在预览里加载成功" >/dev/null
64
-
65
- REGISTRY="$ROOT/.codex/context/test-hub/feature-chains.json"
66
- BEFORE="$(shasum "$REGISTRY" | awk '{print $1}')"
67
- python3 "$SCRIPT" feature-chain-summary --root "$ROOT" >"$OUT"
68
- AFTER="$(shasum "$REGISTRY" | awk '{print $1}')"
69
-
70
- test "$BEFORE" = "$AFTER"
71
- grep -q "feature-chain summary" "$OUT"
72
- grep -q "chains: 2" "$OUT"
73
- grep -q "approved every-dev-completion: 0" "$OUT"
74
- grep -q "proposed: 2" "$OUT"
75
- grep -q "covered bad cases: 2" "$OUT"
76
- grep -q "pending checkpoints: 1" "$OUT"
77
- grep -q "coverage density: 2.0 bad case(s) per covered chain" "$OUT"
78
- grep -q "reuse signal: one workflow covers up to 2 bad case(s)" "$OUT"
79
- grep -q "chain: FC-" "$OUT"
80
- grep -q "next: prefer extending this workflow before creating another test for similar symptoms" "$OUT"
81
- grep -q "Markdown 公式预览没有渲染" "$OUT"
82
- grep -q "Markdown 公式换行错乱" "$OUT"
83
- grep -q "coverage pending: 用户先确认图片预览流程" "$OUT"
84
- grep -q "next: attach the first matching real bad case here before approval" "$OUT"
85
- grep -q "next: review pending checkpoints before proposing new chains" "$OUT"
86
-
87
- python3 "$SCRIPT" dev-complete --root "$ROOT" >"$ROOT/dev-complete.out"
88
- grep -q "no approved every-dev-completion tests" "$ROOT/dev-complete.out"
@@ -1,59 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
5
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-overlap-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- OUT="$ROOT/overlap.out"
8
-
9
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
-
11
- python3 "$SCRIPT" feature-chain-propose \
12
- --root "$ROOT" \
13
- --title "Markdown 公式预览" \
14
- --entry "编辑器输入 Markdown 公式" \
15
- --exit-check "预览完成 MathJax 渲染" \
16
- --node-title "公式渲染回归" \
17
- --bad-cases "BC-20260707-901" \
18
- --check "单行、多行和矩阵公式都被 MathJax 正常排版" >/dev/null
19
-
20
- python3 "$SCRIPT" feature-chain-propose \
21
- --root "$ROOT" \
22
- --title "Markdown 数学公式渲染" \
23
- --entry "编辑器输入 Markdown 公式" \
24
- --exit-check "预览完成 MathJax 渲染" \
25
- --node-title "数学公式预览稳定" \
26
- --bad-cases "BC-20260707-902" \
27
- --check "公式预览不会显示原始文本" >/dev/null
28
-
29
- python3 "$SCRIPT" feature-chain-propose \
30
- --root "$ROOT" \
31
- --title "GPU 监控链接" \
32
- --entry "点击 GPU 监控按钮" \
33
- --exit-check "打开对应 Grafana 页面" \
34
- --node-title "监控 URL 可用" \
35
- --bad-cases "BC-20260707-903" \
36
- --check "按钮跳转到真实 grafana_url" >/dev/null
37
-
38
- REGISTRY="$ROOT/.codex/context/test-hub/feature-chains.json"
39
- BEFORE="$(shasum "$REGISTRY" | awk '{print $1}')"
40
- python3 "$SCRIPT" feature-chain-overlap --root "$ROOT" --min-score 4 >"$OUT"
41
- AFTER="$(shasum "$REGISTRY" | awk '{print $1}')"
42
-
43
- test "$BEFORE" = "$AFTER"
44
- grep -q "feature-chain overlap audit" "$OUT"
45
- grep -q "chains: 3" "$OUT"
46
- grep -q "overlapping candidates: 1" "$OUT"
47
- grep -q "Markdown 公式预览" "$OUT"
48
- grep -q "Markdown 数学公式渲染" "$OUT"
49
- grep -q "match evidence:" "$OUT"
50
- grep -q "next: review whether one workflow should absorb the other before approving automation" "$OUT"
51
- grep -q "next: merge or extend an existing feature chain" "$OUT"
52
- if grep -q "with: .*GPU 监控链接" "$OUT"; then
53
- echo "unrelated GPU chain should not be flagged as an overlap" >&2
54
- cat "$OUT" >&2
55
- exit 1
56
- fi
57
-
58
- python3 "$SCRIPT" dev-complete --root "$ROOT" >"$ROOT/dev-complete.out"
59
- grep -q "no approved every-dev-completion tests" "$ROOT/dev-complete.out"
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
5
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-plan-propose-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
- NATURAL_OUT="$ROOT/natural.out"
8
- BAD_CASE_OUT="$ROOT/bad-case.out"
9
-
10
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
11
-
12
- python3 "$SCRIPT" feature-chain-plan \
13
- --root "$ROOT" \
14
- --query "创建一个测试任务:从编辑器输入 Markdown 到预览正确渲染,主要验证公式渲染回归" >"$NATURAL_OUT"
15
-
16
- grep -q "action: propose-new-chain" "$NATURAL_OUT"
17
- grep -q "confirmation prompt: 测试创建识别" "$NATURAL_OUT"
18
- grep -q "从「编辑器输入 Markdown」到「预览正确渲染」" "$NATURAL_OUT"
19
- grep -q "主要验证「公式渲染回归」" "$NATURAL_OUT"
20
- grep -q "after-confirmation command: .*feature-chain-propose" "$NATURAL_OUT"
21
- grep -q -- "--node-title '公式渲染回归'" "$NATURAL_OUT"
22
- grep -q -- "--check '<confirmed checkpoint check>'" "$NATURAL_OUT"
23
- grep -q -- "--coverage-pending-reason '<confirmed reason this chain has no linked bad case yet>'" "$NATURAL_OUT"
24
- if grep -q "feature-chain-add" "$NATURAL_OUT"; then
25
- cat "$NATURAL_OUT"
26
- exit 1
27
- fi
28
-
29
- cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
30
- # Bad Case Register
31
-
32
- ### BC-20260707-930: Markdown 公式预览没有渲染
33
-
34
- - Status: resolved
35
- - Tags: #markdown #formula
36
- - Display summary: Markdown 编辑器预览区没有渲染公式。
37
- - Phenomenon: 输入公式后预览仍显示原始文本。
38
- - Trigger / reproduction: 用户在编辑器输入公式,预览区没有经过 MathJax 渲染。
39
- MD
40
-
41
- python3 "$SCRIPT" feature-chain-plan --root "$ROOT" --query "BC-20260707-930" >"$BAD_CASE_OUT"
42
-
43
- grep -q "query expanded from bad-case register: BC-20260707-930 Markdown 公式预览没有渲染" "$BAD_CASE_OUT"
44
- grep -q "action: propose-new-chain" "$BAD_CASE_OUT"
45
- grep -q "confirmation prompt: 测试创建识别" "$BAD_CASE_OUT"
46
- grep -q "after-confirmation command: .*feature-chain-propose" "$BAD_CASE_OUT"
47
- grep -q -- "--node-title 'Markdown 公式预览没有渲染'" "$BAD_CASE_OUT"
48
- grep -q -- "--bad-cases BC-20260707-930" "$BAD_CASE_OUT"
49
- if grep -q -- "--coverage-pending-reason" "$BAD_CASE_OUT"; then
50
- cat "$BAD_CASE_OUT"
51
- exit 1
52
- fi
53
- if grep -q "feature-chain-add" "$BAD_CASE_OUT"; then
54
- cat "$BAD_CASE_OUT"
55
- exit 1
56
- fi
57
-
58
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
59
- from pathlib import Path
60
- import json
61
- import sys
62
-
63
- path = Path(sys.argv[1])
64
- data = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"chains": []}
65
- assert data.get("chains", []) == [], data
66
- PY
67
-
68
- DEV_OUT="$(python3 "$SCRIPT" dev-complete --root "$ROOT")"
69
- printf '%s\n' "$DEV_OUT" | grep -q "test hub: no approved every-dev-completion tests"
@@ -1,140 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py"
5
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-lifecycle-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
-
8
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
9
- mkdir -p "$ROOT/.codex/context/test-hub/fixtures"
10
-
11
- PROPOSE_OUT="$ROOT/propose.out"
12
- PLAN_OUT="$ROOT/plan.out"
13
- ATTACH_OUT="$ROOT/attach.out"
14
- SUMMARY_OUT="$ROOT/summary.out"
15
- OVERLAP_OUT="$ROOT/overlap.out"
16
- APPROVE_OUT="$ROOT/approve.out"
17
- COMPLETE_OUT="$ROOT/dev-complete.out"
18
-
19
- python3 "$SCRIPT" feature-chain-plan \
20
- --root "$ROOT" \
21
- --query "创建一个测试任务:从编辑器输入 Markdown 到预览正确渲染,主要验证公式渲染回归" >"$PLAN_OUT"
22
-
23
- grep -q "after-confirmation command: .*feature-chain-propose" "$PLAN_OUT"
24
- grep -q -- "--coverage-pending-reason" "$PLAN_OUT"
25
-
26
- python3 "$SCRIPT" feature-chain-propose \
27
- --root "$ROOT" \
28
- --title "Markdown 公式预览" \
29
- --entry "编辑器输入 Markdown" \
30
- --exit-check "预览正确渲染" \
31
- --node-title "公式渲染回归" \
32
- --check "单行、多行和矩阵公式都被 MathJax 正常排版" \
33
- --coverage-pending-reason "用户先确认功能测试,后续遇到 MathJax 公式渲染 bad case 再挂到 checkpoint" >"$PROPOSE_OUT"
34
-
35
- CHAIN_ID="$(grep 'feature chain proposed:' "$PROPOSE_OUT" | awk '{print $NF}')"
36
- test -n "$CHAIN_ID"
37
-
38
- cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
39
- ### BC-20260707-940: Markdown 公式预览没有渲染
40
-
41
- - Status: resolved
42
- - First observed: 2026-07-07
43
- - Last checked: 2026-07-07
44
- - Scope: Markdown editor preview
45
- - Tags: #feature-chain #mathjax #rendering
46
- - Display summary: Markdown 编辑器里的公式没有被 MathJax 正常渲染。
47
- - Phenomenon: 单行、多行或矩阵公式在预览里显示为原始文本。
48
- - Trigger / reproduction: 在编辑器输入 Markdown 公式并打开预览。
49
- - Root cause: 预览渲染链路没有触发 MathJax 排版。
50
- - Fix method: 确保预览更新后执行 MathJax typeset。
51
- - Guard / verification: 功能链 checkpoint 应验证公式预览已渲染。
52
- - Red condition: 预览仍显示原始公式文本。
53
- - Green condition: 预览显示排版后的公式。
54
- - Expected failure reason: 如果公式渲染回归,功能链 checkpoint 会失败。
55
- MD
56
-
57
- python3 "$SCRIPT" feature-chain-plan --root "$ROOT" --query "BC-20260707-940" >"$PLAN_OUT"
58
- grep -q "action: review-existing-chain" "$PLAN_OUT"
59
- grep -q "$CHAIN_ID" "$PLAN_OUT"
60
- grep -q "checkpoint: 公式渲染回归" "$PLAN_OUT"
61
- grep -q "after-confirmation command: .*feature-chain-attach-bc" "$PLAN_OUT"
62
-
63
- python3 "$SCRIPT" feature-chain-attach-bc \
64
- --root "$ROOT" \
65
- --chain-id "$CHAIN_ID" \
66
- --node-title "公式渲染回归" \
67
- --bad-case "BC-20260707-940" \
68
- --check "公式预览必须触发 MathJax 排版" >"$ATTACH_OUT"
69
-
70
- python3 "$SCRIPT" feature-chain-summary --root "$ROOT" >"$SUMMARY_OUT"
71
- grep -q "chains: 1" "$SUMMARY_OUT"
72
- grep -q "covered bad cases: 1" "$SUMMARY_OUT"
73
- grep -q "Markdown 公式预览没有渲染" "$SUMMARY_OUT"
74
- grep -q "coverage density:" "$SUMMARY_OUT"
75
- if grep -q "coverage pending" "$SUMMARY_OUT"; then
76
- cat "$SUMMARY_OUT"
77
- exit 1
78
- fi
79
-
80
- python3 "$SCRIPT" feature-chain-propose \
81
- --root "$ROOT" \
82
- --title "Markdown 数学公式渲染" \
83
- --entry "编辑器输入 Markdown" \
84
- --exit-check "预览正确渲染" \
85
- --node-title "数学公式预览稳定" \
86
- --bad-cases "BC-20260707-941" \
87
- --check "公式预览不会显示原始文本" >/dev/null
88
-
89
- python3 "$SCRIPT" feature-chain-overlap --root "$ROOT" --min-score 4 >"$OVERLAP_OUT"
90
- grep -q "overlapping candidates: 1" "$OVERLAP_OUT"
91
- grep -q "Markdown 公式预览" "$OVERLAP_OUT"
92
- grep -q "Markdown 数学公式渲染" "$OVERLAP_OUT"
93
-
94
- cat >"$ROOT/.codex/context/test-hub/fixtures/markdown_preview_chain.sh" <<'SH'
95
- #!/usr/bin/env bash
96
- set -euo pipefail
97
- echo "CG_CHECKPOINT:公式渲染回归:PASS"
98
- SH
99
- chmod +x "$ROOT/.codex/context/test-hub/fixtures/markdown_preview_chain.sh"
100
-
101
- python3 "$SCRIPT" feature-chain-approve \
102
- --root "$ROOT" \
103
- --chain-id "$CHAIN_ID" \
104
- --command-text "bash .codex/context/test-hub/fixtures/markdown_preview_chain.sh" >"$APPROVE_OUT"
105
-
106
- grep -q "feature chain approved: $CHAIN_ID" "$APPROVE_OUT"
107
- grep -q "approval dry-run: passed" "$APPROVE_OUT"
108
-
109
- python3 "$SCRIPT" dev-complete --root "$ROOT" >"$COMPLETE_OUT"
110
- grep -q "test hub: 1 passed, 0 failed, 0 blocked" "$COMPLETE_OUT"
111
- grep -q "passed: Markdown 公式预览" "$COMPLETE_OUT"
112
-
113
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$ROOT/.codex/context/test-hub/last-run.json" "$CHAIN_ID" <<'PY'
114
- from pathlib import Path
115
- import json
116
- import sys
117
-
118
- chains_path = Path(sys.argv[1])
119
- run_path = Path(sys.argv[2])
120
- chain_id = sys.argv[3]
121
-
122
- chains = json.loads(chains_path.read_text(encoding="utf-8"))["chains"]
123
- chain = next(item for item in chains if item["id"] == chain_id)
124
- assert chain["status"] == "approved", chain
125
- assert chain["run_policy"] == "every-dev-completion", chain
126
- node = chain["nodes"][0]
127
- assert node["title"] == "公式渲染回归", node
128
- assert "BC-20260707-940" in node["bad_cases"], node
129
- assert "coverage_pending_reason" not in node, node
130
-
131
- last_run = json.loads(run_path.read_text(encoding="utf-8"))
132
- results = last_run.get("results", [])
133
- assert len(results) == 1, last_run
134
- result = results[0]
135
- assert result["status"] == "passed", result
136
- assert any(item.get("label") == "公式渲染回归" and item.get("status") == "pass" for item in result.get("checkpoints", [])), result
137
- PY
138
-
139
- python3 "$SCRIPT" validate-feature-chains --root "$ROOT" >"$ROOT/validate.out"
140
- grep -q "feature-chain validation passed: 2 chain(s), 0 warning(s)" "$ROOT/validate.out"
@@ -1,150 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- SCRIPT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/scripts/context_guard.py}"
5
- ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-chain-rerun-XXXXXX")"
6
- trap 'rm -rf "$ROOT"' EXIT
7
-
8
- python3 "$SCRIPT" init --root "$ROOT" >/dev/null
9
- mkdir -p "$ROOT/.codex/context/test-hub/fixtures"
10
-
11
- cat >"$ROOT/.codex/context/bad-cases.md" <<'MD'
12
- ### BC-20260707-950: Markdown 公式输入没有进入预览流程
13
-
14
- - Status: resolved
15
- - First observed: 2026-07-07
16
- - Last checked: 2026-07-07
17
- - Scope: Markdown editor preview
18
- - Tags: #feature-chain #mathjax #input
19
- - Display summary: 公式输入后预览流程没有被触发。
20
- - Phenomenon: 用户输入公式后,预览仍停在旧内容。
21
- - Trigger / reproduction: 在编辑器输入包含公式的 Markdown。
22
- - Root cause: 输入事件没有触发预览更新。
23
- - Fix method: 预览链路监听输入并进入渲染流程。
24
- - Guard / verification: 功能链 checkpoint 检查公式输入进入预览流程。
25
- - Red condition: 输入公式后预览流程没有执行。
26
- - Green condition: 输入公式后预览流程开始并进入渲染阶段。
27
- - Expected failure reason: 输入阶段回归时,功能链第一 checkpoint 会失败。
28
-
29
- ### BC-20260707-951: Markdown 公式预览仍显示原始文本
30
-
31
- - Status: resolved
32
- - First observed: 2026-07-07
33
- - Last checked: 2026-07-07
34
- - Scope: Markdown editor preview
35
- - Tags: #feature-chain #mathjax #rendering
36
- - Display summary: 公式预览没有完成 MathJax 渲染。
37
- - Phenomenon: 预览区显示原始 LaTeX 文本,而不是排版后的公式。
38
- - Trigger / reproduction: 输入单行、多行或矩阵公式并打开预览。
39
- - Root cause: 渲染阶段没有执行 MathJax 排版。
40
- - Fix method: 预览更新后执行 MathJax typeset。
41
- - Guard / verification: 功能链 checkpoint 检查公式预览已渲染。
42
- - Red condition: 预览仍显示原始公式文本。
43
- - Green condition: 预览显示排版后的公式。
44
- - Expected failure reason: 渲染阶段回归时,功能链第二 checkpoint 会失败。
45
- MD
46
-
47
- PROPOSE_OUT="$ROOT/propose.out"
48
- python3 "$SCRIPT" feature-chain-propose \
49
- --root "$ROOT" \
50
- --title "Markdown 公式预览" \
51
- --entry "编辑器输入 Markdown 公式" \
52
- --exit-check "预览区显示排版后的公式" \
53
- --node-title "公式输入进入预览流程" \
54
- --bad-cases "BC-20260707-950" \
55
- --check "输入公式后预览流程必须开始" >"$PROPOSE_OUT"
56
-
57
- CHAIN_ID="$(grep 'feature chain proposed:' "$PROPOSE_OUT" | awk '{print $NF}')"
58
- test -n "$CHAIN_ID"
59
-
60
- python3 "$SCRIPT" feature-chain-attach-bc \
61
- --root "$ROOT" \
62
- --chain-id "$CHAIN_ID" \
63
- --node-title "公式预览完成渲染" \
64
- --bad-case "BC-20260707-951" \
65
- --check "单行、多行和矩阵公式都必须完成 MathJax 排版" >/dev/null
66
-
67
- RUNNER="$ROOT/.codex/context/test-hub/fixtures/markdown_formula_flow.sh"
68
- cat >"$RUNNER" <<'SH'
69
- #!/usr/bin/env bash
70
- set -euo pipefail
71
- echo "CG_CHECKPOINT:公式输入进入预览流程:PASS"
72
- echo "CG_CHECKPOINT:公式预览完成渲染:PASS"
73
- SH
74
- chmod +x "$RUNNER"
75
-
76
- python3 "$SCRIPT" feature-chain-approve \
77
- --root "$ROOT" \
78
- --chain-id "$CHAIN_ID" \
79
- --command-text "bash .codex/context/test-hub/fixtures/markdown_formula_flow.sh" >"$ROOT/approve.out"
80
- grep -q "approval dry-run: passed" "$ROOT/approve.out"
81
-
82
- cat >"$RUNNER" <<'SH'
83
- #!/usr/bin/env bash
84
- set -euo pipefail
85
- echo "CG_CHECKPOINT:公式输入进入预览流程:PASS"
86
- echo "CG_CHECKPOINT:公式预览完成渲染:FAIL:预览仍显示原始公式文本"
87
- printf "raw formula still visible\n" > "$CONTEXT_GUARD_TEST_RUN_DIR/render-evidence.txt"
88
- SH
89
- chmod +x "$RUNNER"
90
-
91
- if python3 "$SCRIPT" dev-complete --root "$ROOT" >"$ROOT/fail.out" 2>&1; then
92
- cat "$ROOT/fail.out"
93
- exit 1
94
- fi
95
- grep -q "test hub: 0 passed, 1 failed, 0 blocked" "$ROOT/fail.out"
96
- grep -q "checkpoint failed: 公式预览完成渲染 - 预览仍显示原始公式文本" "$ROOT/fail.out"
97
- grep -q "evidence preserved" "$ROOT/fail.out"
98
-
99
- python3 - "$ROOT/.codex/context/test-hub/last-run.json" <<'PY'
100
- from pathlib import Path
101
- import json
102
- import sys
103
-
104
- run = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
105
- result = run["results"][0]
106
- assert result["status"] == "failed", result
107
- assert result["reason"] == "checkpoint failed: 公式预览完成渲染 - 预览仍显示原始公式文本", result
108
- labels = [item["label"] for item in result["checkpoints"]]
109
- assert labels == ["公式输入进入预览流程", "公式预览完成渲染"], labels
110
- log_path = Path(result["log"])
111
- assert log_path.exists(), log_path
112
- evidence = log_path.parent / "render-evidence.txt"
113
- assert evidence.exists(), evidence
114
- assert "raw formula" in evidence.read_text(encoding="utf-8")
115
- PY
116
-
117
- cat >"$RUNNER" <<'SH'
118
- #!/usr/bin/env bash
119
- set -euo pipefail
120
- echo "CG_CHECKPOINT:公式输入进入预览流程:PASS"
121
- echo "CG_CHECKPOINT:公式预览完成渲染:PASS"
122
- printf "temporary success artifact\n" > "$CONTEXT_GUARD_TEST_RUN_DIR/success.tmp"
123
- SH
124
- chmod +x "$RUNNER"
125
-
126
- python3 "$SCRIPT" dev-complete --root "$ROOT" >"$ROOT/pass.out"
127
- grep -q "test hub: 1 passed, 0 failed, 0 blocked" "$ROOT/pass.out"
128
- grep -q "success artifacts cleaned" "$ROOT/pass.out"
129
-
130
- python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" "$ROOT/.codex/context/test-hub/last-run.json" "$CHAIN_ID" <<'PY'
131
- from pathlib import Path
132
- import json
133
- import sys
134
-
135
- chains = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))["chains"]
136
- chain = next(item for item in chains if item["id"] == sys.argv[3])
137
- assert chain["status"] == "approved", chain
138
- assert chain["run_policy"] == "every-dev-completion", chain
139
- covered = sorted(bc for node in chain["nodes"] for bc in node["bad_cases"])
140
- assert covered == ["BC-20260707-950", "BC-20260707-951"], covered
141
-
142
- last_run = json.loads(Path(sys.argv[2]).read_text(encoding="utf-8"))
143
- result = last_run["results"][0]
144
- assert result["status"] == "passed", result
145
- assert result["missing_checkpoints"] == [], result
146
- assert all(item["status"] == "pass" for item in result["checkpoints"]), result
147
- PY
148
-
149
- python3 "$SCRIPT" validate-feature-chains --root "$ROOT" >"$ROOT/validate.out"
150
- grep -q "feature-chain validation passed: 1 chain(s), 0 warning(s)" "$ROOT/validate.out"