@ccoalm/ccl-skills 0.7.0 → 0.8.0
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 +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/SKILL.md +8 -7
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +16 -17
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +195 -7
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/timeout-auth-and-capabilities.md +3 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +13 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/codex_review.sh +9 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_review.sh +9 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/normalize_review_timeout.sh +22 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/opencode_review.sh +9 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +1540 -129
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +8 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_compat.py +76 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +1858 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_update_review_plan_intent.sh +789 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/update_review_plan_intent.py +513 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +4 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +2 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +11 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/SKILL.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/async-lifecycle-and-performance.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/runtime-and-project-contract.md +58 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/source-map.md +41 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/verification-diagnostics-and-security.md +63 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +8 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-routing-and-readiness.md +10 -14
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/verify-developer-experience.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/SKILL.md +135 -86
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/behavioral-aesthetic-logic.md +66 -80
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/delivery-contract.md +275 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-execution-checklist.md +88 -214
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-impl-naming-and-versioning.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-intake-and-acceptance.md +10 -8
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +4 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md +112 -95
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/frontend-code-evidence-map.md +30 -21
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/interaction-design-patterns.md +22 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/layout-recipes-and-screenshot-acceptance.md +20 -17
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-project-token-consistency.md +7 -9
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-stack-strategy.md +14 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/operational-processing-workflows.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-lifecycle-acceptance-and-iteration.md +9 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-surface-patterns.md +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/source-map.md +37 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +7 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +8 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-design-development.md +16 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/visual-craft.md +4 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +4 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +4 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +95 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +11 -9
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/r0-leakage-audit.md +102 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +54 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +8 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +6 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +4 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +69 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/extraction_review_gate.sh +22 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +49 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/obligation-ledger.py +2748 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/register-firing-path-resolution.rb +20 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/shared_git_surface_gate.py +1142 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +17 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_skill_catalog.sh +41 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_ci_checkout_ref_binding.sh +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_entrypoint_domain_scan_terms.sh +82 -8
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_extraction_review_gate.sh +336 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh +82 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger.sh +1416 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger_repo_audit.sh +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +141 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +3 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_shared_git_surface_gate.sh +1696 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_delivery_contract.sh +2117 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_loading_budget.sh +316 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_extraction_review_state.sh +1176 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_cross_refs.sh +31 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +9 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate_extraction_review_state.py +980 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/SKILL.md +8 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +8 -7
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/client-runtime-test-matrices.md +10 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +6 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/complex-workspace-patterns.md +1 -1
- package/dist/assets/release.json +175 -70
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Real-repository audit of the checked-in obligation mapping/ledger.
|
|
3
|
+
#
|
|
4
|
+
# test_obligation_ledger.sh proves the TOOL against synthetic fixtures; it
|
|
5
|
+
# cannot see drift in the real specs/065 mapping — a later semantic edit to a
|
|
6
|
+
# carrier file invalidates checked-in carrier text/hashes while every synthetic
|
|
7
|
+
# suite stays green (this exact false green shipped once: the PR's own audit
|
|
8
|
+
# exited 1 at its head while validation evidence recorded it as passing).
|
|
9
|
+
#
|
|
10
|
+
# The base commit comes from the SHA pinned in the committed ledger header, so
|
|
11
|
+
# the audit stays reproducible after the base branch advances. Requires full
|
|
12
|
+
# history (CI checkouts use fetch-depth: 0); a missing base commit fails
|
|
13
|
+
# closed rather than skipping.
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
|
|
17
|
+
ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd -P)"
|
|
18
|
+
TOOL="$SCRIPT_DIR/obligation-ledger.py"
|
|
19
|
+
LEDGER="$ROOT/specs/065-uiux-evidence-delivery/obligation-preservation.md"
|
|
20
|
+
MAPPING="$ROOT/specs/065-uiux-evidence-delivery/obligation-mapping.jsonl"
|
|
21
|
+
|
|
22
|
+
fail() { printf 'FAIL: %b\n' "$*" >&2; exit 1; }
|
|
23
|
+
|
|
24
|
+
[ -f "$LEDGER" ] || fail "ledger missing: $LEDGER"
|
|
25
|
+
[ -f "$MAPPING" ] || fail "mapping missing: $MAPPING"
|
|
26
|
+
|
|
27
|
+
base="$(sed -n 's/^- Base revision: `\([0-9a-f]\{40\}\)`$/\1/p' "$LEDGER")"
|
|
28
|
+
[ -n "$base" ] || fail "no pinned 40-hex base SHA in the ledger header; the header must record the resolved base commit"
|
|
29
|
+
case "$base" in
|
|
30
|
+
*$'\n'*) fail "multiple base-revision lines in the ledger header" ;;
|
|
31
|
+
esac
|
|
32
|
+
|
|
33
|
+
# The head must be pinned too: an unbounded head makes this frozen ledger
|
|
34
|
+
# demand preservation rows from every later, unrelated skills/**/*.md change
|
|
35
|
+
# (observed: the first post-landing PR went red on rows it never owed).
|
|
36
|
+
head="$(sed -n 's/^- Head revision: `\([0-9a-f]\{40\}\)`$/\1/p' "$LEDGER")"
|
|
37
|
+
[ -n "$head" ] || fail "no pinned 40-hex head SHA in the ledger header; regenerate the ledger with --head at its landing commit"
|
|
38
|
+
case "$head" in
|
|
39
|
+
*$'\n'*) fail "multiple head-revision lines in the ledger header" ;;
|
|
40
|
+
esac
|
|
41
|
+
|
|
42
|
+
git -C "$ROOT" cat-file -e "$base^{commit}" 2>/dev/null \
|
|
43
|
+
|| fail "pinned base commit $base is absent; this audit needs full history (fetch-depth: 0)"
|
|
44
|
+
git -C "$ROOT" cat-file -e "$head^{commit}" 2>/dev/null \
|
|
45
|
+
|| fail "pinned head commit $head is absent; this audit needs full history (fetch-depth: 0)"
|
|
46
|
+
|
|
47
|
+
audit_output="$(python3 "$TOOL" audit \
|
|
48
|
+
--repo "$ROOT" --base "$base" --head "$head" \
|
|
49
|
+
--mapping "$MAPPING" --ledger "$LEDGER" 2>&1)" \
|
|
50
|
+
|| fail "real-repository obligation audit failed:\n$audit_output"
|
|
51
|
+
case "$audit_output" in
|
|
52
|
+
*audit_ok*) : ;;
|
|
53
|
+
*) fail "audit exited 0 without the audit_ok sentinel:\n$audit_output" ;;
|
|
54
|
+
esac
|
|
55
|
+
printf '%s\n' "$audit_output" | tail -1
|
|
56
|
+
|
|
57
|
+
echo "test_obligation_ledger_repo_audit_ok"
|
|
@@ -29,8 +29,8 @@ pass() { passed=$((passed + 1)); echo "PASS: $*"; }
|
|
|
29
29
|
# guard silently stale again (the observed drift shape: a 16 guarding 13
|
|
30
30
|
# executed cases, accumulated while this suite could not run).
|
|
31
31
|
static_pass_calls="$(grep -c '^pass "' "$0")"
|
|
32
|
-
[ "$static_pass_calls" = "
|
|
33
|
-
|| fail "pass-call inventory drifted: counted $static_pass_calls, guard expects
|
|
32
|
+
[ "$static_pass_calls" = "18" ] \
|
|
33
|
+
|| fail "pass-call inventory drifted: counted $static_pass_calls, guard expects 18"
|
|
34
34
|
pass "executed-count guard matches the script's own pass-call inventory"
|
|
35
35
|
|
|
36
36
|
REPO="$TMP/repo"
|
|
@@ -142,7 +142,8 @@ printf '%s\n' '#!/usr/bin/env ruby' 'exit 0' > "$STUB_GATE"
|
|
|
142
142
|
|
|
143
143
|
run_stub_check() {
|
|
144
144
|
set +e
|
|
145
|
-
out="$(env -u CCL_SKILL_BASE_REF
|
|
145
|
+
out="$(env -u CCL_SKILL_BASE_REF -u REGISTER_FIRING_PATH_EXEMPT_DIGESTS \
|
|
146
|
+
ALIAS_AUDIT_CMD='true' bash "$STUB_CHECK" "$REPO" 2>&1)"
|
|
146
147
|
rc=$?
|
|
147
148
|
set -e
|
|
148
149
|
}
|
|
@@ -378,6 +379,142 @@ case "$out" in
|
|
|
378
379
|
esac
|
|
379
380
|
pass "injected EXEMPT digest table downgrades to interim instead of silently bypassing"
|
|
380
381
|
|
|
382
|
+
# RED: deleting a real waived row must fail on the missing-row binding.
|
|
383
|
+
# Synthetic ledgers deliberately inject an empty digest table, so they cannot
|
|
384
|
+
# exercise the built-in bindings. Mutate one of the real historical rows in the
|
|
385
|
+
# throwaway clone instead: the repository ledger stays untouched, while the
|
|
386
|
+
# production checker and built-in table run exactly as they do for landing.
|
|
387
|
+
WAIVED_LOCATOR="file:skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md#Disabled semantics are real, not painted"
|
|
388
|
+
git -C "$REPO" checkout -- . >/dev/null 2>&1 \
|
|
389
|
+
|| fail "could not restore the clone before the missing waived-row case"
|
|
390
|
+
python3 - "$REGISTER" "$WAIVED_LOCATOR" <<'PY'
|
|
391
|
+
from pathlib import Path
|
|
392
|
+
import sys
|
|
393
|
+
|
|
394
|
+
path = Path(sys.argv[1])
|
|
395
|
+
locator = sys.argv[2]
|
|
396
|
+
lines = path.read_text(encoding="utf-8").splitlines(keepends=True)
|
|
397
|
+
matches = [index for index, line in enumerate(lines) if locator in line]
|
|
398
|
+
assert len(matches) == 1, f"expected one real waived row, found {len(matches)}"
|
|
399
|
+
del lines[matches[0]]
|
|
400
|
+
path.write_text("".join(lines), encoding="utf-8")
|
|
401
|
+
assert locator not in path.read_text(encoding="utf-8"), "waived-row deletion was a no-op"
|
|
402
|
+
PY
|
|
403
|
+
run_check
|
|
404
|
+
[ "$rc" = "1" ] || { dump; fail "deleting a real waived row must be an adjudicated rc=1 violation, got rc=$rc"; }
|
|
405
|
+
case "$out" in
|
|
406
|
+
*"EXEMPT entry has no citing row in the ledger"*) : ;;
|
|
407
|
+
*) dump; fail "deleted waived row failed, but not via the exact missing-row diagnostic" ;;
|
|
408
|
+
esac
|
|
409
|
+
case "$out" in
|
|
410
|
+
*ccl_skill_check_clean_ok*) dump; fail "a missing real waived row must never yield a clean-landing token" ;;
|
|
411
|
+
*) : ;;
|
|
412
|
+
esac
|
|
413
|
+
pass "deleting a real waived citing row fails closed with the missing-row diagnostic"
|
|
414
|
+
|
|
415
|
+
# RED: retaining the locator on a rewritten row must fail its digest.
|
|
416
|
+
# Use the same real row, but change only its claim text. The locator count stays
|
|
417
|
+
# at one, so a RED here proves row identity comes from the digest rather than the
|
|
418
|
+
# use-count layer or the missing-row branch.
|
|
419
|
+
git -C "$REPO" checkout -- . >/dev/null 2>&1 \
|
|
420
|
+
|| fail "could not restore the clone before the waived-row digest case"
|
|
421
|
+
python3 - "$REGISTER" "$WAIVED_LOCATOR" <<'PY'
|
|
422
|
+
from pathlib import Path
|
|
423
|
+
import sys
|
|
424
|
+
|
|
425
|
+
path = Path(sys.argv[1])
|
|
426
|
+
locator = sys.argv[2]
|
|
427
|
+
lines = path.read_text(encoding="utf-8").splitlines(keepends=True)
|
|
428
|
+
matches = [index for index, line in enumerate(lines) if locator in line]
|
|
429
|
+
assert len(matches) == 1, f"expected one real waived row, found {len(matches)}"
|
|
430
|
+
index = matches[0]
|
|
431
|
+
assert lines[index].startswith("| "), "waived row is not a markdown table row"
|
|
432
|
+
lines[index] = lines[index].replace("| ", "| Fixture-rewritten claim: ", 1)
|
|
433
|
+
path.write_text("".join(lines), encoding="utf-8")
|
|
434
|
+
rewritten = path.read_text(encoding="utf-8")
|
|
435
|
+
assert rewritten.count(locator) == 1, "fixture must retain exactly one waived locator"
|
|
436
|
+
PY
|
|
437
|
+
run_check
|
|
438
|
+
[ "$rc" = "1" ] || { dump; fail "rewriting a real waived row must be an adjudicated rc=1 violation, got rc=$rc"; }
|
|
439
|
+
case "$out" in
|
|
440
|
+
*"EXEMPT citing row does not match the waived row"*) : ;;
|
|
441
|
+
*) dump; fail "rewritten waived row failed, but not via the exact digest-mismatch diagnostic" ;;
|
|
442
|
+
esac
|
|
443
|
+
case "$out" in
|
|
444
|
+
*"EXEMPT entry has no citing row in the ledger"*) dump; fail "digest fixture lost its locator and hit the missing-row branch" ;;
|
|
445
|
+
*ccl_skill_check_clean_ok*) dump; fail "a digest-mismatched waived row must never yield a clean-landing token" ;;
|
|
446
|
+
*) : ;;
|
|
447
|
+
esac
|
|
448
|
+
pass "rewriting a real waived citing row fails closed with the digest-mismatch diagnostic"
|
|
449
|
+
|
|
450
|
+
# RED: a second row quoting the same retired locator is a new claim and cannot
|
|
451
|
+
# inherit the one-row historical waiver, even when the duplicated bytes have the
|
|
452
|
+
# same digest as the original row.
|
|
453
|
+
git -C "$REPO" checkout -- . >/dev/null 2>&1 \
|
|
454
|
+
|| fail "could not restore the clone before the waived-row reuse case"
|
|
455
|
+
python3 - "$REGISTER" "$WAIVED_LOCATOR" <<'PY'
|
|
456
|
+
from pathlib import Path
|
|
457
|
+
import sys
|
|
458
|
+
|
|
459
|
+
path = Path(sys.argv[1])
|
|
460
|
+
locator = sys.argv[2]
|
|
461
|
+
lines = path.read_text(encoding="utf-8").splitlines(keepends=True)
|
|
462
|
+
matches = [index for index, line in enumerate(lines) if locator in line]
|
|
463
|
+
assert len(matches) == 1, f"expected one real waived row, found {len(matches)}"
|
|
464
|
+
index = matches[0]
|
|
465
|
+
lines.insert(index + 1, lines[index])
|
|
466
|
+
path.write_text("".join(lines), encoding="utf-8")
|
|
467
|
+
assert path.read_text(encoding="utf-8").count(locator) == 2
|
|
468
|
+
PY
|
|
469
|
+
run_check
|
|
470
|
+
[ "$rc" = "1" ] || { dump; fail "reusing a waived locator in a second row must be rc=1, got rc=$rc"; }
|
|
471
|
+
case "$out" in
|
|
472
|
+
*"EXEMPT locator cited by 2 rows (allowance 1)"*) : ;;
|
|
473
|
+
*) dump; fail "second waived-row citation failed, but not via the over-use diagnostic" ;;
|
|
474
|
+
esac
|
|
475
|
+
case "$out" in
|
|
476
|
+
*ccl_skill_check_clean_ok*) dump; fail "waiver reuse must never yield a clean-landing token" ;;
|
|
477
|
+
*) : ;;
|
|
478
|
+
esac
|
|
479
|
+
pass "a second row cannot inherit a one-row historical locator waiver"
|
|
480
|
+
|
|
481
|
+
# RED: adding an EXEMPT key without a row digest silently downgrades identity
|
|
482
|
+
# binding unless the production gate rejects the incomplete waiver definition.
|
|
483
|
+
# The checker resolves the gate beside itself, so mutate STUB_GATE — never the
|
|
484
|
+
# stale gate inside the origin/dev fixture clone, which this execution path does
|
|
485
|
+
# not read. Restore the current candidate first so this case exercises the real
|
|
486
|
+
# built-in table and missing-digest branch.
|
|
487
|
+
FIXTURE_LOCATOR="file:$FIXTURE_NOTE_REL#$FIXTURE_ANCHOR"
|
|
488
|
+
cp "$SCRIPT_DIR/register-firing-path-resolution.rb" "$STUB_GATE"
|
|
489
|
+
python3 - "$STUB_GATE" "$FIXTURE_LOCATOR" <<'PY'
|
|
490
|
+
from pathlib import Path
|
|
491
|
+
import sys
|
|
492
|
+
|
|
493
|
+
path = Path(sys.argv[1])
|
|
494
|
+
locator = sys.argv[2]
|
|
495
|
+
text = path.read_text(encoding="utf-8")
|
|
496
|
+
assert locator not in text, "fixture locator unexpectedly exists before mutation"
|
|
497
|
+
needle = "EXEMPT = {\n"
|
|
498
|
+
assert text.count(needle) == 1, "EXEMPT table declaration shape changed"
|
|
499
|
+
text = text.replace(needle, needle + f' {locator!r} => "fixture missing digest",\n', 1)
|
|
500
|
+
path.write_text(text, encoding="utf-8")
|
|
501
|
+
mutated = path.read_text(encoding="utf-8")
|
|
502
|
+
assert mutated.count(locator) == 1, "fixture must add exactly one unbound EXEMPT key"
|
|
503
|
+
PY
|
|
504
|
+
ruby -c "$STUB_GATE" >/dev/null \
|
|
505
|
+
|| fail "missing-digest mutation produced invalid Ruby instead of a valid incomplete waiver"
|
|
506
|
+
run_stub_check
|
|
507
|
+
[ "$rc" = "1" ] || { dump; fail "an EXEMPT key without a digest must be rc=1, got rc=$rc"; }
|
|
508
|
+
case "$out" in
|
|
509
|
+
*"EXEMPT entry has no recorded citing-row digest"*) : ;;
|
|
510
|
+
*) dump; fail "missing EXEMPT digest failed, but not via the exact diagnostic" ;;
|
|
511
|
+
esac
|
|
512
|
+
case "$out" in
|
|
513
|
+
*ccl_skill_check_clean_ok*) dump; fail "an unbound EXEMPT entry must never yield a clean-landing token" ;;
|
|
514
|
+
*) : ;;
|
|
515
|
+
esac
|
|
516
|
+
pass "a new EXEMPT entry without a citing-row digest fails closed"
|
|
517
|
+
|
|
381
518
|
# ── RED: a failure while the cleanup trap is armed must keep its status ─────
|
|
382
519
|
# The narrow window between arming the temp-dir cleanup trap and disarming it.
|
|
383
520
|
# `rm -rf` succeeds inside the trap and overwrites the pending exit status, so a
|
|
@@ -410,5 +547,5 @@ case "$out" in
|
|
|
410
547
|
esac
|
|
411
548
|
pass "a failure inside the cleanup-trap window keeps its exit status"
|
|
412
549
|
|
|
413
|
-
[ "$passed" -eq
|
|
550
|
+
[ "$passed" -eq 18 ] || fail "expected 18 assertions, saw $passed"
|
|
414
551
|
echo "register_firing_path_wiring_tests_ok ($passed assertions)"
|
|
@@ -136,7 +136,7 @@ check_absent() { # <file> <token> <label> — file must exist AND token absent;
|
|
|
136
136
|
# Self-pin: an emptied or truncated suite must fail, not pass. Update EXPECTED
|
|
137
137
|
# when adding/removing checks deliberately (same diff). Runs FIRST: a truncated
|
|
138
138
|
# tail removes real checks and the count goes red.
|
|
139
|
-
EXPECTED_CHECKS=
|
|
139
|
+
EXPECTED_CHECKS=21
|
|
140
140
|
actual_checks=$(grep -cE '^check([_a-z]+)? ' "$0")
|
|
141
141
|
if [ "$actual_checks" -ne "$EXPECTED_CHECKS" ]; then
|
|
142
142
|
echo "FAIL: suite self-pin: expected $EXPECTED_CHECKS checks, found $actual_checks" >&2
|
|
@@ -168,6 +168,7 @@ check_frontmatter_present "$ROOT/skills/terminal-cli-dev/SKILL.md" "用 Python
|
|
|
168
168
|
# Both legs of that skip clause must be reciprocated by the named stack owner,
|
|
169
169
|
# or the pointer sends the request to a skill that never advertises the work.
|
|
170
170
|
check_frontmatter_present "$ROOT/skills/go-microservice-dev/SKILL.md" "用 Go 写个命令行工具" "go-microservice-dev CLI trigger (reciprocal of terminal-cli-dev skip)"
|
|
171
|
+
check_frontmatter_present "$ROOT/skills/nodejs-service-dev/SKILL.md" "用 Node.js 写个命令行工具" "nodejs-service-dev CLI trigger (reciprocal of terminal-cli-dev skip)"
|
|
171
172
|
# The coordinator surface must carry the same carve-out, or product-rd keeps
|
|
172
173
|
# advertising terminal-cli-dev for language-stack CLI implementation.
|
|
173
174
|
check "$ROOT/skills/product-rd-workflow/SKILL.md" "must go to that language's dev skill when one owns it" "product-rd coordinator CLI carve-out (owner branch)"
|
|
@@ -179,6 +180,7 @@ check "$ROOT/skills/product-rd-workflow/SKILL.md" "no such dev owner stays with
|
|
|
179
180
|
# the reciprocal trigger anchor above stays green, and the eval fixtures assert
|
|
180
181
|
# terminal-cli-dev must NOT receive either request.
|
|
181
182
|
check_frontmatter_present "$ROOT/skills/terminal-cli-dev/SKILL.md" "Go CLI → go-microservice-dev" "terminal-cli-dev Go skip leg"
|
|
183
|
+
check_frontmatter_present "$ROOT/skills/terminal-cli-dev/SKILL.md" "Node.js CLI → nodejs-service-dev" "terminal-cli-dev Node.js skip leg"
|
|
182
184
|
# CLI interface design ownership: both surfaces must say terminal-cli-dev owns the
|
|
183
185
|
# command/flag/help contract even with nothing rendered, or non-rendered CLI design
|
|
184
186
|
# goes back to having no owner (terminal skipped it, the stack skills scope to
|