@ccoalm/ccl-skills 0.6.2 → 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.
Files changed (139) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/marketplace/plugins/ccl-skills/hooks/hooks.json +11 -0
  3. package/dist/assets/marketplace/plugins/ccl-skills/hooks/remind-unverified-cli-flag.sh +309 -0
  4. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_remind_unverified_cli_flag.sh +483 -0
  5. package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/ccl-skills.ts +5 -0
  6. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/SKILL.md +10 -8
  7. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +1 -1
  8. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +16 -17
  9. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +1 -1
  10. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +195 -7
  11. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/timeout-auth-and-capabilities.md +3 -3
  12. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +13 -5
  13. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/codex_review.sh +9 -3
  14. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_review.sh +9 -3
  15. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/normalize_review_timeout.sh +22 -0
  16. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/opencode_review.sh +9 -3
  17. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +1540 -129
  18. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +8 -3
  19. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_compat.py +76 -1
  20. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +1858 -3
  21. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_update_review_plan_intent.sh +789 -0
  22. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/update_review_plan_intent.py +513 -0
  23. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/SKILL.md +1 -1
  24. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md +2 -0
  25. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-platform-architecture.md +1 -1
  26. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/event-driven-architecture.md +14 -11
  27. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md +2 -2
  28. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +5 -1
  29. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +2 -1
  30. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +13 -11
  31. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/SKILL.md +64 -0
  32. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/agents/openai.yaml +4 -0
  33. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/async-lifecycle-and-performance.md +72 -0
  34. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/runtime-and-project-contract.md +58 -0
  35. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/source-map.md +41 -0
  36. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/verification-diagnostics-and-security.md +63 -0
  37. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +1 -1
  38. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md +25 -9
  39. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/source-register.md +1 -0
  40. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +1 -1
  41. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md +16 -0
  42. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/secret-and-config-management.md +7 -0
  43. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/retry-timeout-circuit-breaker.md +11 -0
  44. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +8 -10
  45. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-routing-and-readiness.md +10 -14
  46. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/verify-developer-experience.md +1 -1
  47. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/SKILL.md +135 -86
  48. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/behavioral-aesthetic-logic.md +66 -80
  49. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/delivery-contract.md +275 -0
  50. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-execution-checklist.md +88 -214
  51. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-impl-naming-and-versioning.md +2 -2
  52. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-intake-and-acceptance.md +10 -8
  53. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +4 -5
  54. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md +112 -95
  55. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/frontend-code-evidence-map.md +30 -21
  56. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/interaction-design-patterns.md +22 -3
  57. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/layout-recipes-and-screenshot-acceptance.md +20 -17
  58. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-project-token-consistency.md +7 -9
  59. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-stack-strategy.md +14 -10
  60. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/operational-processing-workflows.md +2 -0
  61. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +1 -1
  62. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-lifecycle-acceptance-and-iteration.md +9 -6
  63. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-surface-patterns.md +3 -0
  64. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/source-map.md +37 -10
  65. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +7 -1
  66. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +8 -5
  67. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-design-development.md +16 -5
  68. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/visual-craft.md +4 -2
  69. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md +5 -1
  70. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/architecture-playbook.md +1 -1
  71. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/audit-history-architecture.md +31 -0
  72. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-platform-architecture.md +1 -1
  73. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/event-driven-architecture.md +7 -4
  74. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md +2 -2
  75. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/notification-architecture.md +28 -0
  76. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/packaging-runtime-readiness.md +1 -1
  77. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/replay-comparison-architecture.md +28 -0
  78. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/workflow-state-architecture.md +39 -0
  79. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +10 -7
  80. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/ai-service-wiring-patterns.md +8 -0
  81. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/audit-history-patterns.md +29 -0
  82. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/background-job-patterns.md +16 -0
  83. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/batch-and-artifact-patterns.md +25 -1
  84. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/notification-patterns.md +40 -0
  85. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/public-api-security-patterns.md +1 -1
  86. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/replay-comparison-patterns.md +30 -0
  87. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/state-machine-task-patterns.md +48 -0
  88. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/testing-and-quality-patterns.md +10 -1
  89. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md +2 -0
  90. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +4 -4
  91. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +45 -0
  92. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +142 -4
  93. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +21 -2
  94. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +11 -9
  95. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/firing-point-placement.md +8 -0
  96. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/parallel-stack-references-pattern.md +5 -4
  97. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/r0-leakage-audit.md +102 -0
  98. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +69 -0
  99. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +10 -0
  100. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +6 -6
  101. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +4 -3
  102. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +93 -2
  103. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-parallel-stack-parity.sh +119 -0
  104. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/extraction_review_gate.sh +22 -0
  105. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +49 -4
  106. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/obligation-ledger.py +2748 -0
  107. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/register-firing-path-resolution.rb +20 -5
  108. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/shared_git_surface_gate.py +1142 -0
  109. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_parallel_stack_parity.sh +183 -0
  110. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +19 -0
  111. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_skill_catalog.sh +41 -4
  112. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_ci_checkout_ref_binding.sh +120 -0
  113. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_entrypoint_domain_scan_terms.sh +82 -8
  114. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_extraction_review_gate.sh +336 -0
  115. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh +82 -10
  116. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger.sh +1416 -0
  117. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger_repo_audit.sh +57 -0
  118. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +141 -4
  119. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +3 -1
  120. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_shared_git_surface_gate.sh +1696 -0
  121. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_delivery_contract.sh +2117 -0
  122. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_loading_budget.sh +316 -0
  123. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_extraction_review_state.sh +1176 -0
  124. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_cross_refs.sh +31 -1
  125. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +9 -4
  126. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate_extraction_review_state.py +980 -0
  127. package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/SKILL.md +9 -6
  128. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +11 -11
  129. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/client-runtime-test-matrices.md +10 -2
  130. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/fitness-functions.md +16 -0
  131. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/scenario-testing.md +1 -1
  132. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md +16 -5
  133. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md +5 -3
  134. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/delivery-face-closeout.md +16 -6
  135. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/self-benchmark-baseline.md +37 -0
  136. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +7 -5
  137. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/complex-workspace-patterns.md +1 -1
  138. package/dist/assets/release.json +275 -105
  139. 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" = "14" ] \
33
- || fail "pass-call inventory drifted: counted $static_pass_calls, guard expects 14"
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 ALIAS_AUDIT_CMD='true' bash "$STUB_CHECK" "$REPO" 2>&1)"
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 14 ] || fail "expected 14 assertions, saw $passed"
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=19
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