@michelj/context-guard 0.4.3 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Coordinator.md +88 -0
- package/Executor.md +53 -0
- package/README.md +89 -224
- package/README.zh-CN.md +89 -224
- package/SKILL.md +26 -684
- package/THIRD_PARTY_NOTICES.md +47 -0
- package/Tester.md +53 -0
- package/agents/openai.yaml +2 -2
- package/bin/build-runtime.mjs +96 -0
- package/bin/context-guard-skill.js +399 -78
- package/bin/postinstall.js +2 -2
- package/hooks.json +89 -13
- package/licenses/JSONParse-MIT.txt +24 -0
- package/licenses/Marked-MIT.txt +44 -0
- package/licenses/Portless-Apache-2.0.txt +201 -0
- package/package.json +35 -6
- package/prototype/LICENSES/Marked-MIT.txt +44 -0
- package/prototype/LICENSES/Ready-redistribution.txt +14 -0
- package/prototype/attachments.mjs +75 -0
- package/prototype/coordinator-markdown.mjs +283 -0
- package/prototype/coordinator-working-blot.mjs +124 -0
- package/prototype/vendor/marked.mjs +2189 -0
- package/prototype/workbench-app.js +5197 -0
- package/prototype/workbench-data.js +33 -0
- package/prototype/workbench-sync.mjs +898 -0
- package/prototype/workbench.css +1050 -0
- package/prototype/workbench.html +211 -0
- package/prototype/working-blot-atlas.png +0 -0
- package/references/agent-handoff.md +40 -0
- package/references/claude-runtime.md +120 -0
- package/references/cloud-sync-interface.md +66 -0
- package/references/design-current.md +14 -0
- package/references/map-mount.md +41 -0
- package/references/map-read.md +50 -0
- package/references/memory-definition.md +120 -0
- package/references/memory-filesystem-v2/Bug.en.md +162 -0
- package/references/memory-filesystem-v2/Bug.md +162 -0
- package/references/memory-filesystem-v2/Bug_Coordinater.md +8 -0
- package/references/memory-filesystem-v2/Bug_Executor.md +8 -0
- package/references/memory-filesystem-v2/Bug_Tester.md +7 -0
- package/references/memory-filesystem-v2/Idea.en.md +36 -0
- package/references/memory-filesystem-v2/Idea.md +36 -0
- package/references/memory-filesystem-v2/Node_Module_Index.en.md +88 -0
- package/references/memory-filesystem-v2/Node_Module_Index.md +88 -0
- package/references/memory-filesystem-v2/README.md +60 -0
- package/references/memory-filesystem-v2/Todo.en.md +137 -0
- package/references/memory-filesystem-v2/Todo.md +137 -0
- package/references/memory-filesystem-v2/Todo_Coordinater.md +7 -0
- package/references/memory-filesystem-v2/Todo_Executor.md +7 -0
- package/references/memory-filesystem-v2/Todo_Tester.md +7 -0
- package/references/named-workbench.md +124 -0
- package/references/plan-review.md +12 -0
- package/references/server-memory.md +276 -0
- package/references/test-check.md +7 -0
- package/references/user-reply.md +38 -0
- package/references/workbench-interface.md +531 -0
- package/roles.md +13 -0
- package/scripts/context_guard.py +1366 -7602
- package/scripts/context_guard_hook.py +1960 -711
- package/scripts/map_owns.py +699 -0
- package/scripts/shared/LICENSES/JSONParse-MIT.txt +24 -0
- package/scripts/shared/filesystem-v2.mjs +430 -0
- package/scripts/shared/io.mjs +117 -0
- package/scripts/shared/map-model.mjs +506 -0
- package/scripts/shared/memory-schema.mjs +13 -0
- package/scripts/shared/protocol-blobs.mjs +112 -0
- package/scripts/shared/protocol-map.mjs +146 -0
- package/scripts/shared/protocol-snapshots.mjs +84 -0
- package/scripts/shared/protocol-store.mjs +624 -0
- package/scripts/shared/protocol-workflow.mjs +226 -0
- package/scripts/shared/protocol.mjs +125 -0
- package/scripts/shared/vendor/jsonparse.cjs +413 -0
- package/scripts/workbench/access.mjs +496 -0
- package/scripts/workbench/attachments.mjs +92 -0
- package/scripts/workbench/browser-login.mjs +78 -0
- package/scripts/workbench/claude-runtime.mjs +372 -0
- package/scripts/workbench/cli.mjs +980 -0
- package/scripts/workbench/device-heartbeat.mjs +72 -0
- package/scripts/workbench/hook-status.mjs +38 -0
- package/scripts/workbench/inbox.mjs +155 -0
- package/scripts/workbench/journal.mjs +56 -0
- package/scripts/workbench/memory-merge.mjs +65 -0
- package/scripts/workbench/memory.mjs +252 -0
- package/scripts/workbench/named-proxy.mjs +108 -0
- package/scripts/workbench/named.mjs +152 -0
- package/scripts/workbench/portless-routes.mjs +51 -0
- package/scripts/workbench/project.mjs +327 -0
- package/scripts/workbench/projections.mjs +68 -0
- package/scripts/workbench/protocol-client.mjs +165 -0
- package/scripts/workbench/protocol-delivery.mjs +133 -0
- package/scripts/workbench/protocol-device.mjs +316 -0
- package/scripts/workbench/protocol-events.mjs +53 -0
- package/scripts/workbench/protocol-repository.mjs +58 -0
- package/scripts/workbench/reconcile.mjs +244 -0
- package/scripts/workbench/registry.mjs +111 -0
- package/scripts/workbench/runtime.mjs +54 -0
- package/scripts/workbench/server.mjs +1171 -0
- package/scripts/workbench/store.mjs +243 -0
- package/scripts/workbench/sync-coordinator.mjs +518 -0
- package/scripts/workbench/sync.mjs +86 -0
- package/references/context-template.md +0 -341
- package/references/feature-chain-methodology.md +0 -228
- package/references/register-template.md +0 -85
- package/references/task-case-template.md +0 -63
- package/tests/BC-20260618-063.sh +0 -116
- package/tests/BC-20260618-065.sh +0 -66
- package/tests/BC-20260626-080.sh +0 -48
- package/tests/BC-20260626-081.sh +0 -40
- package/tests/BC-20260626-082.sh +0 -32
- package/tests/BC-20260626-083.sh +0 -66
- package/tests/BC-20260627-084.sh +0 -74
- package/tests/BC-20260630-086.sh +0 -50
- package/tests/BC-20260630-087.sh +0 -103
- package/tests/BC-20260630-088.sh +0 -32
- package/tests/BC-20260630-089.sh +0 -63
- package/tests/BC-20260701-090.sh +0 -84
- package/tests/BC-20260702-096.sh +0 -48
- package/tests/BC-20260706-098.sh +0 -66
- package/tests/BC-20260707-099.sh +0 -47
- package/tests/BC-20260707-100.sh +0 -46
- package/tests/BC-20260707-101.sh +0 -47
- package/tests/BC-20260707-102.sh +0 -68
- package/tests/BC-20260707-103.sh +0 -59
- package/tests/BC-20260707-104.sh +0 -103
- package/tests/BC-20260707-105.sh +0 -109
- package/tests/BC-20260707-106.sh +0 -80
- package/tests/BC-20260707-107.sh +0 -74
- package/tests/BC-20260707-108.sh +0 -48
- package/tests/BC-20260707-109.sh +0 -56
- package/tests/BC-20260707-110.sh +0 -71
- package/tests/BC-20260707-111.sh +0 -70
- package/tests/BC-20260707-112.sh +0 -45
- package/tests/BC-20260707-113.sh +0 -73
- package/tests/BC-20260707-115.sh +0 -77
- package/tests/BC-20260707-116.sh +0 -77
- package/tests/BC-20260707-118.sh +0 -115
- package/tests/BC-20260707-119.sh +0 -47
- package/tests/BC-20260707-120.sh +0 -60
- package/tests/BC-20260707-121.sh +0 -66
- package/tests/BC-20260707-122.sh +0 -48
- package/tests/BC-20260707-123.sh +0 -43
- package/tests/BC-20260707-124.sh +0 -56
- package/tests/BC-20260707-125.sh +0 -64
- package/tests/BC-20260707-126.sh +0 -80
- package/tests/BC-20260707-127.sh +0 -88
- package/tests/BC-20260707-129.sh +0 -59
- package/tests/BC-20260707-130.sh +0 -69
- package/tests/BC-20260707-131.sh +0 -140
- package/tests/BC-20260707-132.sh +0 -150
- package/tests/BC-20260707-133.sh +0 -70
- package/tests/BC-20260708-136.sh +0 -210
- package/tests/BC-20260708-137.sh +0 -106
- package/tests/BC-20260708-138.sh +0 -168
- package/tests/BC-20260708-139.sh +0 -79
- package/tests/BC-20260709-002.sh +0 -63
- package/tests/BC-20260709-003.sh +0 -239
- package/tests/BC-20260709-006.sh +0 -76
- package/tests/BC-20260709-008.sh +0 -168
- package/tests/BC-20260710-001.sh +0 -61
- package/tests/BC-20260710-002.sh +0 -111
- package/tests/npm-install-smoke.sh +0 -53
package/tests/BC-20260707-125.sh
DELETED
|
@@ -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"
|
package/tests/BC-20260707-126.sh
DELETED
|
@@ -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"
|
package/tests/BC-20260707-127.sh
DELETED
|
@@ -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"
|
package/tests/BC-20260707-129.sh
DELETED
|
@@ -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"
|
package/tests/BC-20260707-130.sh
DELETED
|
@@ -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"
|
package/tests/BC-20260707-131.sh
DELETED
|
@@ -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"
|
package/tests/BC-20260707-132.sh
DELETED
|
@@ -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"
|