@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.
- package/README.md +74 -6
- package/README.zh-CN.md +74 -6
- package/{skills/context-guard/SKILL.md → SKILL.md} +216 -77
- package/bin/context-guard-skill.js +88 -3
- package/hooks.json +25 -1
- package/package.json +7 -3
- package/{skills/context-guard/references → references}/context-template.md +52 -1
- package/references/feature-chain-methodology.md +228 -0
- package/{skills/context-guard/scripts → scripts}/context_guard.py +3119 -121
- package/{skills/context-guard/scripts → scripts}/context_guard_hook.py +344 -12
- package/{skills/context-guard/tests → tests}/BC-20260701-090.sh +8 -7
- package/{skills/context-guard/tests → tests}/BC-20260702-096.sh +6 -3
- package/tests/BC-20260706-098.sh +66 -0
- package/tests/BC-20260707-099.sh +47 -0
- package/tests/BC-20260707-100.sh +46 -0
- package/tests/BC-20260707-101.sh +47 -0
- package/tests/BC-20260707-102.sh +68 -0
- package/tests/BC-20260707-103.sh +59 -0
- package/tests/BC-20260707-104.sh +103 -0
- package/tests/BC-20260707-105.sh +109 -0
- package/tests/BC-20260707-106.sh +80 -0
- package/tests/BC-20260707-107.sh +74 -0
- package/tests/BC-20260707-108.sh +48 -0
- package/tests/BC-20260707-109.sh +56 -0
- package/tests/BC-20260707-110.sh +71 -0
- package/tests/BC-20260707-111.sh +70 -0
- package/tests/BC-20260707-112.sh +45 -0
- package/tests/BC-20260707-113.sh +73 -0
- package/tests/BC-20260707-115.sh +77 -0
- package/tests/BC-20260707-116.sh +77 -0
- package/tests/BC-20260707-118.sh +115 -0
- package/tests/BC-20260707-119.sh +47 -0
- package/tests/BC-20260707-120.sh +60 -0
- package/tests/BC-20260707-121.sh +66 -0
- package/tests/BC-20260707-122.sh +48 -0
- package/tests/BC-20260707-123.sh +43 -0
- package/tests/BC-20260707-124.sh +56 -0
- package/tests/BC-20260707-125.sh +64 -0
- package/tests/BC-20260707-126.sh +80 -0
- package/tests/BC-20260707-127.sh +88 -0
- package/tests/BC-20260707-129.sh +59 -0
- package/tests/BC-20260707-130.sh +69 -0
- package/tests/BC-20260707-131.sh +140 -0
- package/tests/BC-20260707-132.sh +150 -0
- package/tests/BC-20260707-133.sh +70 -0
- package/tests/BC-20260708-136.sh +210 -0
- package/tests/BC-20260708-137.sh +106 -0
- package/tests/BC-20260708-138.sh +168 -0
- package/tests/BC-20260708-139.sh +79 -0
- package/tests/BC-20260709-002.sh +63 -0
- package/tests/BC-20260709-003.sh +239 -0
- package/tests/BC-20260709-006.sh +76 -0
- package/tests/BC-20260709-008.sh +168 -0
- package/tests/BC-20260710-001.sh +61 -0
- package/tests/BC-20260710-002.sh +111 -0
- package/tests/npm-install-smoke.sh +53 -0
- package/skills/context-guard/README.md +0 -234
- package/skills/context-guard/README.zh-CN.md +0 -234
- /package/{skills/context-guard/agents → agents}/openai.yaml +0 -0
- /package/{skills/context-guard/references → references}/register-template.md +0 -0
- /package/{skills/context-guard/references → references}/task-case-template.md +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260618-063.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260618-065.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260626-080.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260626-081.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260626-082.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260626-083.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260627-084.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260630-086.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260630-087.sh +0 -0
- /package/{skills/context-guard/tests → tests}/BC-20260630-088.sh +0 -0
- /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"
|