@michelj/context-guard 0.4.1 → 0.4.3

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 (72) hide show
  1. package/README.md +74 -6
  2. package/README.zh-CN.md +74 -6
  3. package/{skills/context-guard/SKILL.md → SKILL.md} +216 -77
  4. package/bin/context-guard-skill.js +88 -3
  5. package/hooks.json +25 -1
  6. package/package.json +7 -3
  7. package/{skills/context-guard/references → references}/context-template.md +52 -1
  8. package/references/feature-chain-methodology.md +228 -0
  9. package/{skills/context-guard/scripts → scripts}/context_guard.py +3119 -121
  10. package/{skills/context-guard/scripts → scripts}/context_guard_hook.py +344 -12
  11. package/{skills/context-guard/tests → tests}/BC-20260701-090.sh +8 -7
  12. package/{skills/context-guard/tests → tests}/BC-20260702-096.sh +6 -3
  13. package/tests/BC-20260706-098.sh +66 -0
  14. package/tests/BC-20260707-099.sh +47 -0
  15. package/tests/BC-20260707-100.sh +46 -0
  16. package/tests/BC-20260707-101.sh +47 -0
  17. package/tests/BC-20260707-102.sh +68 -0
  18. package/tests/BC-20260707-103.sh +59 -0
  19. package/tests/BC-20260707-104.sh +103 -0
  20. package/tests/BC-20260707-105.sh +109 -0
  21. package/tests/BC-20260707-106.sh +80 -0
  22. package/tests/BC-20260707-107.sh +74 -0
  23. package/tests/BC-20260707-108.sh +48 -0
  24. package/tests/BC-20260707-109.sh +56 -0
  25. package/tests/BC-20260707-110.sh +71 -0
  26. package/tests/BC-20260707-111.sh +70 -0
  27. package/tests/BC-20260707-112.sh +45 -0
  28. package/tests/BC-20260707-113.sh +73 -0
  29. package/tests/BC-20260707-115.sh +77 -0
  30. package/tests/BC-20260707-116.sh +77 -0
  31. package/tests/BC-20260707-118.sh +115 -0
  32. package/tests/BC-20260707-119.sh +47 -0
  33. package/tests/BC-20260707-120.sh +60 -0
  34. package/tests/BC-20260707-121.sh +66 -0
  35. package/tests/BC-20260707-122.sh +48 -0
  36. package/tests/BC-20260707-123.sh +43 -0
  37. package/tests/BC-20260707-124.sh +56 -0
  38. package/tests/BC-20260707-125.sh +64 -0
  39. package/tests/BC-20260707-126.sh +80 -0
  40. package/tests/BC-20260707-127.sh +88 -0
  41. package/tests/BC-20260707-129.sh +59 -0
  42. package/tests/BC-20260707-130.sh +69 -0
  43. package/tests/BC-20260707-131.sh +140 -0
  44. package/tests/BC-20260707-132.sh +150 -0
  45. package/tests/BC-20260707-133.sh +70 -0
  46. package/tests/BC-20260708-136.sh +210 -0
  47. package/tests/BC-20260708-137.sh +106 -0
  48. package/tests/BC-20260708-138.sh +168 -0
  49. package/tests/BC-20260708-139.sh +79 -0
  50. package/tests/BC-20260709-002.sh +63 -0
  51. package/tests/BC-20260709-003.sh +239 -0
  52. package/tests/BC-20260709-006.sh +76 -0
  53. package/tests/BC-20260709-008.sh +168 -0
  54. package/tests/BC-20260710-001.sh +61 -0
  55. package/tests/BC-20260710-002.sh +111 -0
  56. package/tests/npm-install-smoke.sh +53 -0
  57. package/skills/context-guard/README.md +0 -234
  58. package/skills/context-guard/README.zh-CN.md +0 -234
  59. /package/{skills/context-guard/agents → agents}/openai.yaml +0 -0
  60. /package/{skills/context-guard/references → references}/register-template.md +0 -0
  61. /package/{skills/context-guard/references → references}/task-case-template.md +0 -0
  62. /package/{skills/context-guard/tests → tests}/BC-20260618-063.sh +0 -0
  63. /package/{skills/context-guard/tests → tests}/BC-20260618-065.sh +0 -0
  64. /package/{skills/context-guard/tests → tests}/BC-20260626-080.sh +0 -0
  65. /package/{skills/context-guard/tests → tests}/BC-20260626-081.sh +0 -0
  66. /package/{skills/context-guard/tests → tests}/BC-20260626-082.sh +0 -0
  67. /package/{skills/context-guard/tests → tests}/BC-20260626-083.sh +0 -0
  68. /package/{skills/context-guard/tests → tests}/BC-20260627-084.sh +0 -0
  69. /package/{skills/context-guard/tests → tests}/BC-20260630-086.sh +0 -0
  70. /package/{skills/context-guard/tests → tests}/BC-20260630-087.sh +0 -0
  71. /package/{skills/context-guard/tests → tests}/BC-20260630-088.sh +0 -0
  72. /package/{skills/context-guard/tests → tests}/BC-20260630-089.sh +0 -0
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-feature-dry-run.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
+ python3 "$SCRIPT" set-language --root "$ROOT" --language zh >/dev/null
11
+
12
+ python3 "$SCRIPT" feature-chain-propose \
13
+ --root "$ROOT" \
14
+ --title "Markdown 公式预览" \
15
+ --entry "在编辑器输入公式" \
16
+ --exit-check "预览区正确渲染公式" \
17
+ --node-title "公式渲染完成" \
18
+ --bad-cases "BC-TEST-001, BC-TEST-002" \
19
+ --check "确认单行和多行公式都进入渲染结果" >/dev/null
20
+
21
+ PASS_OUTPUT="$(
22
+ python3 "$SCRIPT" feature-chain-dry-run \
23
+ --root "$ROOT" \
24
+ --chain-id FC-20260707-001 \
25
+ --command-text "printf 'CG_CHECKPOINT:公式渲染完成:PASS\n'"
26
+ )"
27
+
28
+ grep -q "feature-chain dry run: passed" <<<"$PASS_OUTPUT"
29
+ grep -q "checkpoint pass: 公式渲染完成" <<<"$PASS_OUTPUT"
30
+ grep -q "dry-run success artifacts cleaned" <<<"$PASS_OUTPUT"
31
+
32
+ set +e
33
+ FAIL_OUTPUT="$(
34
+ python3 "$SCRIPT" feature-chain-dry-run \
35
+ --root "$ROOT" \
36
+ --chain-id FC-20260707-001 \
37
+ --command-text "true" 2>&1
38
+ )"
39
+ FAIL_STATUS=$?
40
+ set -e
41
+
42
+ test "$FAIL_STATUS" -ne 0
43
+ grep -q "feature-chain dry run: failed" <<<"$FAIL_OUTPUT"
44
+ grep -q "missing checkpoint marker: 公式渲染完成" <<<"$FAIL_OUTPUT"
45
+ grep -q "dry-run evidence preserved" <<<"$FAIL_OUTPUT"
46
+
47
+ python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
48
+ import json
49
+ import sys
50
+ path = sys.argv[1]
51
+ data = json.load(open(path, encoding="utf-8"))
52
+ chain = data["chains"][0]
53
+ assert chain["status"] == "proposed", chain
54
+ assert chain["type"] == "manual", chain
55
+ assert chain["command"] == "", chain
56
+ assert chain["nodes"][0]["bad_cases"] == ["BC-TEST-001", "BC-TEST-002"], chain
57
+ PY
58
+
59
+ python3 "$SCRIPT" dev-complete --root "$ROOT" | grep -q "no approved every-dev-completion tests"
60
+ test -f "$ROOT/.codex/context/test-hub/last-dry-run.json"
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-approval-preflight.XXXXXX")"
5
+ trap 'rm -rf "$ROOT"' EXIT
6
+
7
+ SCRIPT="/Users/bytedance/.agents/skills/context-guard/scripts/context_guard.py"
8
+ OUT="$ROOT/out.txt"
9
+
10
+ python3 "$SCRIPT" init --root "$ROOT" >/dev/null
11
+ python3 "$SCRIPT" set-language --root "$ROOT" --language zh >/dev/null
12
+
13
+ python3 "$SCRIPT" feature-chain-propose \
14
+ --root "$ROOT" \
15
+ --title "Markdown 公式预览" \
16
+ --entry "在编辑器输入公式" \
17
+ --exit-check "预览区正确渲染公式" \
18
+ --node-title "公式渲染完成" \
19
+ --bad-cases "BC-TEST-001" \
20
+ --check "确认公式进入渲染结果" >/dev/null
21
+
22
+ set +e
23
+ python3 "$SCRIPT" feature-chain-approve \
24
+ --root "$ROOT" \
25
+ --chain-id FC-20260707-001 \
26
+ --command-text "true" >"$OUT" 2>&1
27
+ STATUS=$?
28
+ set -e
29
+
30
+ test "$STATUS" -ne 0
31
+ grep -q "approval dry-run failed" "$OUT"
32
+ grep -q "missing checkpoint marker: 公式渲染完成" "$OUT"
33
+ grep -q "requires a passing dry run before approval" "$OUT"
34
+
35
+ python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
36
+ import json
37
+ import sys
38
+ chain = json.load(open(sys.argv[1], encoding="utf-8"))["chains"][0]
39
+ assert chain["status"] == "proposed", chain
40
+ assert chain["type"] == "manual", chain
41
+ assert chain["command"] == "", chain
42
+ PY
43
+
44
+ python3 "$SCRIPT" dev-complete --root "$ROOT" | grep -q "no approved every-dev-completion tests"
45
+ test -f "$ROOT/.codex/context/test-hub/last-approval-dry-run.json"
46
+
47
+ python3 "$SCRIPT" feature-chain-approve \
48
+ --root "$ROOT" \
49
+ --chain-id FC-20260707-001 \
50
+ --command-text "printf 'CG_CHECKPOINT:公式渲染完成:PASS\n'" >"$OUT"
51
+
52
+ grep -q "feature chain approved" "$OUT"
53
+ grep -q "approval dry-run: passed" "$OUT"
54
+
55
+ python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
56
+ import json
57
+ import sys
58
+ chain = json.load(open(sys.argv[1], encoding="utf-8"))["chains"][0]
59
+ assert chain["status"] == "approved", chain
60
+ assert chain["type"] == "command", chain
61
+ assert "CG_CHECKPOINT:公式渲染完成:PASS" in chain["command"], chain
62
+ PY
63
+
64
+ python3 "$SCRIPT" dev-complete --root "$ROOT" >"$OUT"
65
+ grep -q "1 passed, 0 failed, 0 blocked" "$OUT"
66
+ grep -q "success artifacts cleaned" "$OUT"
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT="$(mktemp -d "${TMPDIR:-/tmp}/context-guard-add-approved-bypass.XXXXXX")"
5
+ trap 'rm -rf "$ROOT"' EXIT
6
+
7
+ SCRIPT="/Users/bytedance/.agents/skills/context-guard/scripts/context_guard.py"
8
+ OUT="$ROOT/out.txt"
9
+
10
+ python3 "$SCRIPT" init --root "$ROOT" >/dev/null
11
+
12
+ set +e
13
+ python3 "$SCRIPT" feature-chain-add \
14
+ --root "$ROOT" \
15
+ --title "GPU 监控按钮" \
16
+ --entry "点击 GPU 监控按钮" \
17
+ --exit-check "打开监控页" \
18
+ --command-text "printf 'CG_CHECKPOINT:后端返回监控 URL:PASS\n'" \
19
+ --test-status approved >"$OUT" 2>&1
20
+ STATUS=$?
21
+ set -e
22
+
23
+ test "$STATUS" -ne 0
24
+ grep -q "feature-chain-add cannot create approved every-dev-completion chains" "$OUT"
25
+
26
+ python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
27
+ from pathlib import Path
28
+ import json
29
+ import sys
30
+ path = Path(sys.argv[1])
31
+ data = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"chains": []}
32
+ assert data["chains"] == [], data
33
+ PY
34
+
35
+ python3 "$SCRIPT" feature-chain-add \
36
+ --root "$ROOT" \
37
+ --title "GPU 监控按钮" \
38
+ --entry "点击 GPU 监控按钮" \
39
+ --exit-check "打开监控页" >"$OUT"
40
+ grep -q "feature chain:" "$OUT"
41
+
42
+ python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
43
+ import json
44
+ import sys
45
+ chain = json.load(open(sys.argv[1], encoding="utf-8"))["chains"][0]
46
+ assert chain["status"] == "proposed", chain
47
+ assert chain["command"] == "", chain
48
+ PY
@@ -0,0 +1,43 @@
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-natural-test-intake-XXXXXX")"
6
+ trap 'rm -rf "$ROOT"' EXIT
7
+ OUT="$ROOT/plan.out"
8
+
9
+ python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
+
11
+ python3 "$SCRIPT" feature-chain-plan \
12
+ --root "$ROOT" \
13
+ --query "写一个测试,检验每次开发完成后 Markdown 编辑器里的单行、多行和矩阵公式都能正常渲染" >"$OUT"
14
+
15
+ grep -q "action: propose-new-chain" "$OUT"
16
+ grep -q "confirmation prompt: 测试创建识别" "$OUT"
17
+ grep -q "Markdown 编辑器里的单行、多行和矩阵公式能正常渲染" "$OUT"
18
+ grep -q "after-confirmation command: .*feature-chain-propose" "$OUT"
19
+ grep -q -- "--node-title '<confirmed recurrence checkpoint>'" "$OUT"
20
+ grep -q -- "--coverage-pending-reason '<confirmed reason this chain has no linked bad case yet>'" "$OUT"
21
+ if grep -q "after-confirmation command: .*feature-chain-add" "$OUT"; then
22
+ cat "$OUT"
23
+ exit 1
24
+ fi
25
+
26
+ if grep -q "confirmation prompt: .*从「写一个测试" "$OUT"; then
27
+ cat "$OUT"
28
+ exit 1
29
+ fi
30
+ if grep -q "confirmation prompt: .*每次开发完成后 Markdown" "$OUT"; then
31
+ cat "$OUT"
32
+ exit 1
33
+ fi
34
+
35
+ python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
36
+ from pathlib import Path
37
+ import json
38
+ import sys
39
+
40
+ path = Path(sys.argv[1])
41
+ data = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"chains": []}
42
+ assert data.get("chains", []) == [], data
43
+ PY
@@ -0,0 +1,56 @@
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-from-to-intake-XXXXXX")"
6
+ trap 'rm -rf "$ROOT"' EXIT
7
+ OUT="$ROOT/plan.out"
8
+
9
+ python3 "$SCRIPT" init --root "$ROOT" >/dev/null
10
+
11
+ python3 "$SCRIPT" feature-chain-plan \
12
+ --root "$ROOT" \
13
+ --query "创建一个测试任务:从编辑器输入 Markdown 到预览正确渲染,主要验证公式渲染回归" >"$OUT"
14
+
15
+ grep -q "action: propose-new-chain" "$OUT"
16
+ grep -q "confirmation prompt: 测试创建识别" "$OUT"
17
+ grep -q "从「编辑器输入 Markdown」到「预览正确渲染」" "$OUT"
18
+ grep -q "主要验证「公式渲染回归」" "$OUT"
19
+ grep -q "suggested checkpoint after confirmation: 公式渲染回归" "$OUT"
20
+ grep -q "after-confirmation command: .*feature-chain-propose" "$OUT"
21
+ grep -q -- "--entry '编辑器输入 Markdown'" "$OUT"
22
+ grep -q -- "--exit-check '预览正确渲染'" "$OUT"
23
+ grep -q -- "--node-title '公式渲染回归'" "$OUT"
24
+ grep -q -- "--check '<confirmed checkpoint check>'" "$OUT"
25
+ grep -q -- "--coverage-pending-reason '<confirmed reason this chain has no linked bad case yet>'" "$OUT"
26
+ if grep -q "after-confirmation command: .*feature-chain-add" "$OUT"; then
27
+ cat "$OUT"
28
+ exit 1
29
+ fi
30
+
31
+ if grep -q "从「创建一个测试任务" "$OUT"; then
32
+ cat "$OUT"
33
+ exit 1
34
+ fi
35
+ if grep -q "相关入口到用户可见的正确结果" "$OUT"; then
36
+ cat "$OUT"
37
+ exit 1
38
+ fi
39
+ if grep -q "<confirmed user-visible entry>" "$OUT"; then
40
+ cat "$OUT"
41
+ exit 1
42
+ fi
43
+ if grep -q "<confirmed strict final green condition>" "$OUT"; then
44
+ cat "$OUT"
45
+ exit 1
46
+ fi
47
+
48
+ python3 - "$ROOT/.codex/context/test-hub/feature-chains.json" <<'PY'
49
+ from pathlib import Path
50
+ import json
51
+ import sys
52
+
53
+ path = Path(sys.argv[1])
54
+ data = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"chains": []}
55
+ assert data.get("chains", []) == [], data
56
+ PY
@@ -0,0 +1,64 @@
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"
@@ -0,0 +1,80 @@
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"
@@ -0,0 +1,88 @@
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"
@@ -0,0 +1,59 @@
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"
@@ -0,0 +1,69 @@
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"