@ccoalm/ccl-skills 0.3.0 → 0.4.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 (26) hide show
  1. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_envelope.py +34 -3
  2. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_abort_leak_state_helpers.sh +148 -0
  3. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_classify_envelope.sh +28 -0
  4. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_review_json.sh +7 -0
  5. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +13 -0
  6. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate_abort_leak.sh +271 -34
  7. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +8 -8
  8. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +7 -8
  9. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +3 -2
  10. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md +7 -6
  11. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/recurring-anti-patterns-checklist.md +18 -0
  12. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +29 -2
  13. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +28 -29
  14. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +153 -0
  15. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-health.rb +23 -10
  16. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +303 -1
  17. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +222 -91
  18. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +6 -0
  19. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh +6 -1
  20. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_verdict_differential.sh +1 -1
  21. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_round_attribution.sh +12 -12
  22. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh +455 -0
  23. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_source_refuted.sh +20 -20
  24. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_liveness_predicate_gate.sh +288 -0
  25. package/dist/assets/release.json +39 -24
  26. package/package.json +1 -1
@@ -53,7 +53,7 @@ FIRING_F="firing-path: file:skills/product-rd-workflow/SKILL.md#must record a RE
53
53
 
54
54
  # ---- A:合规撤回 —— 有类时必须绿,无类时必须红 ----
55
55
  new_case case-a; withdraw_fixture
56
- add_row "| A fixture claim is refuted by its primary source and is withdrawn wholesale | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
56
+ add_row "| A fixture claim is refuted by its primary source and is withdrawn wholesale | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
57
57
  commit_case "case A: compliant source-refuted withdrawal"; run_gate
58
58
  # A 的期望值在裁决后由绿改红:该类不再顶起 RED 底线(见 frozen-acceptance.md 的裁决记录)。
59
59
  # 合规撤回现在仍然被拦——它要么配一条 RED 行,要么由具名风险 owner 人工放行。
@@ -62,32 +62,32 @@ commit_case "case A: compliant source-refuted withdrawal"; run_gate
62
62
  # ---- B:真行为变更披该标签 —— 任何时候都必须红 ----
63
63
  new_case case-b
64
64
  printf '\n- Every fixture change must obtain approval before it lands.\n' >> "$REPO/$OWNER_REF"
65
- add_row "| A newly added normative rule wearing the withdrawal label | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
65
+ add_row "| A newly added normative rule wearing the withdrawal label | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
66
66
  commit_case "case B: real behaviour change wearing the label"; run_gate
67
67
  [ "$RC" != "0" ] && ok "B 真行为变更披标签 -> 仍红" || fail "B 不得通过(净增却用撤回类)"
68
68
 
69
69
  # ---- C:缺一手源 URL —— 必须红 ----
70
70
  new_case case-c; withdraw_fixture
71
- add_row "| A withdrawal whose row cites no refuting source | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; \`product-rd-workflow/SKILL.md\` |"
71
+ add_row "| A withdrawal whose row cites no refuting source | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; \`product-rd-workflow/SKILL.md\` |"
72
72
  commit_case "case C: missing refuting source"; run_gate
73
73
  [ "$RC" != "0" ] && ok "C 缺一手源 -> 仍红" || fail "C 不得通过(无源即无据)"
74
74
 
75
75
  # ---- D:缺零损失指针 —— 必须红 ----
76
76
  new_case case-d; withdraw_fixture
77
- add_row "| A withdrawal whose row carries no zero-loss map | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
77
+ add_row "| A withdrawal whose row carries no zero-loss map | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
78
78
  commit_case "case D: missing zero-loss pointer"; run_gate
79
79
  [ "$RC" != "0" ] && ok "D 缺零损失指针 -> 仍红" || fail "D 不得通过(义务保全无对照)"
80
80
 
81
- # ---- E:observed-failure: yes —— 必须红 ----
81
+ # ---- E:observed-failure: yes; result-class: failure —— 必须红 ----
82
82
  new_case case-e; withdraw_fixture
83
- add_row "| A withdrawal self-declaring an observed failure | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: yes | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
83
+ add_row "| A withdrawal self-declaring an observed failure | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: yes; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
84
84
  commit_case "case E: observed-failure yes"; run_gate
85
- [ "$RC" != "0" ] && ok "E observed-failure: yes -> 仍红" || fail "E 不得通过(分类语义不得自选)"
85
+ [ "$RC" != "0" ] && ok "E observed-failure: yes; result-class: failure -> 仍红" || fail "E 不得通过(分类语义不得自选)"
86
86
 
87
87
  # ---- F:既有类不得回归 ----
88
88
  new_case case-f
89
89
  printf '\n- Every fixture delivery must record a RED-baseline row before it lands.\n' >> "$REPO/$OWNER_REF"
90
- add_row "| An ordinary behaviour-changing rule with a RED-baseline row | \`downstream-executor\` | behavioral-evidence: RED-baseline; observed-failure: yes; $FIRING_F | \`updated\` | \`product-rd-workflow/SKILL.md\` |"
90
+ add_row "| An ordinary behaviour-changing rule with a RED-baseline row | \`downstream-executor\` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; $FIRING_F | \`updated\` | \`product-rd-workflow/SKILL.md\` |"
91
91
  commit_case "case F: existing RED-baseline path"; run_gate
92
92
  if [ "$RC" = "0" ]; then ok "F 既有 RED-baseline 路径 -> 绿(无回归)"; else echo "--- F 完整输出 ---"; printf '%s\n' "$OUT"; fail "F 回归"; fi
93
93
 
@@ -95,8 +95,8 @@ if [ "$RC" = "0" ]; then ok "F 既有 RED-baseline 路径 -> 绿(无回归)"
95
95
  # 独立评审 REVIEW-1:any? 顶起底线时,真行为变更会搭便车。
96
96
  new_case case-g; withdraw_fixture
97
97
  printf '\n- Every unrelated fixture delivery must obtain approval before it lands. zzmixedrule\n' >> "$REPO/$OWNER_REF"
98
- add_row "| A compliant withdrawal alongside an unrelated change | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
99
- add_row "| An unrelated behaviour change riding along on a stable-control label | \`downstream-executor\` | behavioral-evidence: semantic-control; observed-failure: no; firing-path: file:skills/product-rd-workflow/SKILL.md#must obtain approval before it lands | \`updated\` | \`product-rd-workflow/SKILL.md\` |"
98
+ add_row "| A compliant withdrawal alongside an unrelated change | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
99
+ add_row "| An unrelated behaviour change riding along on a stable-control label | \`downstream-executor\` | behavioral-evidence: semantic-control; observed-failure: no; result-class: failure; firing-path: file:skills/product-rd-workflow/SKILL.md#must obtain approval before it lands | \`updated\` | \`product-rd-workflow/SKILL.md\` |"
100
100
  commit_case "case G: mixed rows"; run_gate
101
101
  [ "$RC" != "0" ] && ok "G 混合行 -> 仍红" || fail "G 不得通过(真行为变更搭撤回的便车)"
102
102
 
@@ -104,21 +104,21 @@ commit_case "case G: mixed rows"; run_gate
104
104
  # 独立挑战 CHALLENGE-1:删无关文字凑净负、加一条新规则、指针写不存在的锚。
105
105
  new_case case-h; withdraw_fixture
106
106
  printf '\n- Every smuggled fixture rule must be rejected by the withdrawal class. zzsmuggled\n' >> "$REPO/$OWNER_REF"
107
- add_row "| A smuggled rule hidden behind an offsetting deletion | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`README.md#no-such-anchor-exists-here\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
107
+ add_row "| A smuggled rule hidden behind an offsetting deletion | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`README.md#no-such-anchor-exists-here\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
108
108
  commit_case "case H: offset addition with bogus anchor"; run_gate
109
109
  [ "$RC" != "0" ] && ok "H 抵消式新增 + 假锚点 -> 仍红" || fail "H 不得通过(新增规范行 / 锚点不解析)"
110
110
 
111
111
  # ---- I:脚本改动、零删除 —— 必须红(旧代理谓词看不见脚本)----
112
112
  new_case case-i
113
113
  printf '\n# fixture: an added shell line that changes behaviour without matching any prose predicate\n' >> "$REPO/skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh"
114
- add_row "| A script change wearing the withdrawal label with nothing deleted | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
114
+ add_row "| A script change wearing the withdrawal label with nothing deleted | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
115
115
  commit_case "case I: script change, no deletion"; run_gate
116
116
  [ "$RC" != "0" ] && ok "I 脚本改动零删除 -> 仍红" || fail "I 不得通过(非 .md、且无删除)"
117
117
 
118
118
  # ---- J:`Always` 规则、零删除 —— 必须红(旧谓词故意排除 always)----
119
119
  new_case case-j
120
120
  printf '\n- Always authenticate fixture requests before dispatch.\n' >> "$REPO/$OWNER_REF"
121
- add_row "| An Always-phrased rule wearing the withdrawal label with nothing deleted | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
121
+ add_row "| An Always-phrased rule wearing the withdrawal label with nothing deleted | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
122
122
  commit_case "case J: Always rule, no deletion"; run_gate
123
123
  [ "$RC" != "0" ] && ok "J Always 规则零删除 -> 仍红" || fail "J 不得通过(有新增行)"
124
124
 
@@ -126,33 +126,33 @@ commit_case "case J: Always rule, no deletion"; run_gate
126
126
  # 独立评审:chmod 在 --name-status 里显示为 M、在 --numstat 里记 0/0。
127
127
  new_case case-k; withdraw_fixture
128
128
  chmod 755 "$REPO/skills/product-rd-workflow/references/adr-convention.md"
129
- add_row "| A mode change riding along with a genuine deletion | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
129
+ add_row "| A mode change riding along with a genuine deletion | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
130
130
  commit_case "case K: chmod plus deletion"; run_gate
131
131
  [ "$RC" != "0" ] && ok "K 改权限 + 删除 -> 仍红" || fail "K 不得通过(mode 变更未被 numstat 反映)"
132
132
 
133
133
  # ---- L:指针路径穿越出仓 —— 必须红 ----
134
134
  new_case case-l; withdraw_fixture
135
- add_row "| A withdrawal whose zero-loss pointer escapes the repository | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`../../../etc/hosts#localhost\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
135
+ add_row "| A withdrawal whose zero-loss pointer escapes the repository | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`../../../etc/hosts#localhost\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
136
136
  commit_case "case L: traversal pointer"; run_gate
137
137
  [ "$RC" != "0" ] && ok "L 指针穿越出仓 -> 仍红" || fail "L 不得通过(路径逃出仓库)"
138
138
 
139
139
  # ---- M:锚点是存在但无意义的单字符子串 —— 必须红 ----
140
140
  new_case case-m; withdraw_fixture
141
- add_row "| A withdrawal whose anchor is a bare existing substring | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#a\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
141
+ add_row "| A withdrawal whose anchor is a bare existing substring | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#a\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
142
142
  commit_case "case M: one-character substring anchor"; run_gate
143
143
  [ "$RC" != "0" ] && ok "M 单字符子串锚 -> 仍红" || fail "M 不得通过(锚点未落在标题上)"
144
144
 
145
145
  # ---- N:锚点是存在但不相干的整词 —— 必须红 ----
146
146
  new_case case-n; withdraw_fixture
147
- add_row "| A withdrawal whose anchor is an unrelated existing word | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#survives-verbatim\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
147
+ add_row "| A withdrawal whose anchor is an unrelated existing word | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#survives-verbatim\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
148
148
  commit_case "case N: unrelated existing substring anchor"; run_gate
149
149
  [ "$RC" != "0" ] && ok "N 不相干整词锚 -> 仍红" || fail "N 不得通过(锚点未落在标题上)"
150
150
 
151
151
  # ---- O:既有 semantic-control 路径不得回归(配对 RED 行)----
152
152
  new_case case-o
153
153
  printf '\n- Every fixture control rule must be recorded before it lands. zzsemctl\n' >> "$REPO/$OWNER_REF"
154
- add_row "| An unchanged control alongside a RED-baseline row | \`downstream-executor\` | behavioral-evidence: semantic-control; observed-failure: no; firing-path: file:skills/product-rd-workflow/SKILL.md#must be recorded before it lands | \`updated\` | \`product-rd-workflow/SKILL.md\` |"
155
- add_row "| The behaviour change the control accompanies | \`downstream-executor\` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#must be recorded before it lands | \`updated\` | \`product-rd-workflow/SKILL.md\` |"
154
+ add_row "| An unchanged control alongside a RED-baseline row | \`downstream-executor\` | behavioral-evidence: semantic-control; observed-failure: no; result-class: failure; firing-path: file:skills/product-rd-workflow/SKILL.md#must be recorded before it lands | \`updated\` | \`product-rd-workflow/SKILL.md\` |"
155
+ add_row "| The behaviour change the control accompanies | \`downstream-executor\` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; firing-path: file:skills/product-rd-workflow/SKILL.md#must be recorded before it lands | \`updated\` | \`product-rd-workflow/SKILL.md\` |"
156
156
  commit_case "case O: semantic-control beside RED-baseline"; run_gate
157
157
  [ "$RC" = "0" ] && ok "O semantic-control + RED-baseline -> 绿(无回归)" || { echo "--- O ---"; printf '%s\n' "$OUT" | tail -3; fail "O 既有路径回归"; }
158
158
 
@@ -163,7 +163,7 @@ import io,sys
163
163
  p=sys.argv[1]
164
164
  io.open(p,'w',encoding='utf-8').write("# 零损失义务对照\n\n| before 义务 | 去向 |\n| --- | --- |\n| 某条义务 | survives-verbatim: 别处 |\n")
165
165
  PYP
166
- add_row "| A withdrawal whose map does not quote what was removed | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
166
+ add_row "| A withdrawal whose map does not quote what was removed | \`downstream-executor\` | behavioral-evidence: source-refuted; observed-failure: no; result-class: failure | \`updated\` | zero-loss: \`$ZLOSS#零损失义务对照\`; refuting source: $SRC; \`product-rd-workflow/SKILL.md\` |"
167
167
  commit_case "case P: map does not account for deleted text"; run_gate
168
168
  [ "$RC" != "0" ] && ok "P 对照表未逐字交代被删内容 -> 仍红" || fail "P 不得通过(删了什么没抄出来)"
169
169
 
@@ -0,0 +1,288 @@
1
+ #!/usr/bin/env bash
2
+ # Behavior suite for check-ccl-skills.sh's `liveness_predicate_scan` gate
3
+ # (recurring-anti-patterns-checklist.md, Anti-pattern 28).
4
+ #
5
+ # The gate exists because an existence-test liveness predicate fails in the direction
6
+ # that looks like a real defect: the probe reds, names the code under test, and the code
7
+ # under test was fine. Its value therefore rests on two properties that must BOTH be
8
+ # pinned — it fires on the shape that actually shipped, and it stays silent on the
9
+ # legitimate spellings. A gate that also flagged a ppid read used to identify a parent,
10
+ # or the fix's own documentation, is one a later maintainer loosens after the first false
11
+ # positive, and a loosened gate catches nothing.
12
+ #
13
+ # bash skills/skill-extraction-workflow/scripts/test_liveness_predicate_gate.sh
14
+ set -u
15
+
16
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
17
+ CHECKER="${CHECKER:-$SCRIPT_DIR/check-ccl-skills.sh}"
18
+ [ -f "$CHECKER" ] || { echo "FAIL: checker not found: $CHECKER" >&2; exit 1; }
19
+
20
+ pass=0; fail=0
21
+ note() { fail=$((fail+1)); printf 'FAIL %s\n' "$1" >&2; }
22
+ ok() { pass=$((pass+1)); }
23
+
24
+ TMP=$(mktemp -d "${TMPDIR:-/tmp}/liveness-gate-test.XXXXXX") || exit 1
25
+ TMP=$(cd "$TMP" && pwd -P)
26
+ trap 'rm -rf "$TMP"' EXIT
27
+
28
+ # Run the gate section in isolation rather than standing up a whole synthetic skill tree.
29
+ section=$TMP/gate-section.sh
30
+ {
31
+ echo '#!/usr/bin/env bash'
32
+ # MUST match the host checker's options, or a section that aborts the real checker
33
+ # still passes every probe here.
34
+ echo 'set -euo pipefail'
35
+ echo 'root="$1"'
36
+ awk '/^# Anti-pattern 28 —/{p=1} p; /^echo "liveness_predicate_scan_ok"$/{if(p) exit}' "$CHECKER"
37
+ } > "$section"
38
+ grep -q 'liveness_predicate_scan_ok' "$section" \
39
+ || { echo "FAIL: could not extract the gate section from $CHECKER (anchor moved?)" >&2; exit 1; }
40
+ grep -q 'ppid=' "$section" \
41
+ || { echo "FAIL: extracted section carries no predicate — extraction is bogus" >&2; exit 1; }
42
+
43
+ run_gate() { # run_gate <root> -> RC, OUT
44
+ OUT=$( bash "$section" "$1" 2>&1 ); RC=$?
45
+ }
46
+ mk_root() { local r="$TMP/$1"; mkdir -p "$r/scripts"; printf '%s' "$r"; }
47
+
48
+ # The banned spelling is assembled at runtime, never written literally in this file:
49
+ # this suite is itself a `test_*.sh` inside the scanned tree, so a literal would make the
50
+ # repo's own gate flag its regression test. (The scanner-matches-itself trap.)
51
+ PPID_READ='ps -o ppid= -p "$pid"'
52
+ VIOLATION='[ "$('"$PPID_READ"' 2>/dev/null | tr -d " ")" = "1" ] && echo orphan'
53
+
54
+ # --- P1: a clean tree passes ------------------------------------------------
55
+ r=$(mk_root clean)
56
+ printf '#!/usr/bin/env bash\necho hello\n' > "$r/scripts/test_clean.sh"
57
+ run_gate "$r"
58
+ if [ "$RC" -eq 0 ] && printf '%s' "$OUT" | grep -q 'liveness_predicate_scan_ok'; then ok
59
+ else note "p1 clean tree must pass with the ok token (rc=$RC): $OUT"; fi
60
+
61
+ # --- P2: the violation fires (the gate's whole reason to exist) -------------
62
+ r=$(mk_root violation)
63
+ printf '#!/usr/bin/env bash\n%s\n' "$VIOLATION" > "$r/scripts/test_probe.sh"
64
+ run_gate "$r"
65
+ if [ "$RC" -ne 0 ] && printf '%s' "$OUT" | grep -q 'liveness_predicate_scan_failed'; then ok
66
+ else note "p2 planted orphan-oracle must FAIL the gate (rc=$RC): $OUT"; fi
67
+
68
+ # --- P2b: the report names the offending file and line ----------------------
69
+ if printf '%s' "$OUT" | grep -q 'scripts/test_probe.sh:2'; then ok
70
+ else note "p2b failure output must locate the hit (file:line), got: $OUT"; fi
71
+
72
+ # --- P2c: the hit and the diagnosis must not run together on one line -------
73
+ # The sorted-hit list loses its trailing newline to command substitution; without an
74
+ # explicit one the last hit and the message concatenate and neither greps cleanly.
75
+ if printf '%s' "$OUT" | grep -q '^liveness_predicate_scan_failed'; then ok
76
+ else note "p2c the diagnosis must start its own line, got: $OUT"; fi
77
+
78
+ # --- P3: consulting process state clears it (this IS the documented fix) ----
79
+ r=$(mk_root fixed)
80
+ { printf '#!/usr/bin/env bash\n'
81
+ printf 'st="$(ps -o stat= -p "$pid")"\n'
82
+ printf '%s\n' "$VIOLATION"
83
+ } > "$r/scripts/test_probe.sh"
84
+ run_gate "$r"
85
+ if [ "$RC" -eq 0 ]; then ok
86
+ else note "p3 a state consult within the window must clear the line (rc=$RC): $OUT"; fi
87
+
88
+ # --- P3b: a *_state helper THIS FILE DEFINES over process state clears it ---
89
+ # The real fix's shape: one helper, defined in the same file, reading `ps -o stat=`.
90
+ r=$(mk_root fixed_helper)
91
+ { printf '#!/usr/bin/env bash\n'
92
+ printf 'wrapper_state() {\n ps -o stat= -p "$1"\n}\n'
93
+ printf 'case "$(wrapper_state "$pid")" in live) : ;; esac\n'
94
+ printf '%s\n' "$VIOLATION"
95
+ } > "$r/scripts/test_probe.sh"
96
+ run_gate "$r"
97
+ if [ "$RC" -eq 0 ]; then ok
98
+ else note "p3b a file-defined state helper must clear the line (rc=$RC): $OUT"; fi
99
+
100
+ # --- P3c: an unrelated *_state call is NOT remediation ----------------------
101
+ # Found by adversarial review: accepting any `*_state` token let a bookkeeping helper
102
+ # that never reads process state clear a real hit, so the blocking gate printed ok.
103
+ r=$(mk_root fake_helper)
104
+ { printf '#!/usr/bin/env bash\n'
105
+ printf 'record_state "$other_pid"\n'
106
+ printf '%s\n' "$VIOLATION"
107
+ } > "$r/scripts/test_probe.sh"
108
+ run_gate "$r"
109
+ if [ "$RC" -ne 0 ] && printf '%s' "$OUT" | grep -q 'liveness_predicate_scan_failed'; then ok
110
+ else note "p3c an unrelated *_state call must NOT clear the violation (rc=$RC): $OUT"; fi
111
+
112
+ # --- P3d: a defined helper that does NOT read process state is not remediation
113
+ r=$(mk_root hollow_helper)
114
+ { printf '#!/usr/bin/env bash\n'
115
+ printf 'record_state() {\n echo "$1" >>"$log"\n}\n'
116
+ printf 'record_state "$other_pid"\n'
117
+ printf '%s\n' "$VIOLATION"
118
+ } > "$r/scripts/test_probe.sh"
119
+ run_gate "$r"
120
+ if [ "$RC" -ne 0 ]; then ok
121
+ else note "p3d a defined helper that never reads process state must not clear it (rc=$RC): $OUT"; fi
122
+
123
+ # --- P4: a whole-line comment carrying the spelling is documentation --------
124
+ # The checklist row and the gate's own comment block name the banned spelling; a gate
125
+ # that flags its own documentation gets loosened.
126
+ r=$(mk_root commented)
127
+ printf '#!/usr/bin/env bash\n# %s\n' "$VIOLATION" > "$r/scripts/test_doc.sh"
128
+ run_gate "$r"
129
+ if [ "$RC" -eq 0 ]; then ok
130
+ else note "p4 a whole-line comment must not be flagged (rc=$RC): $OUT"; fi
131
+
132
+ # --- P5: scope is test scripts — a signalling guard elsewhere is legitimate --
133
+ # Outside a test, asking whether a pid exists before signalling it is the right
134
+ # question; flagging it would trade a real false-positive cost for nothing.
135
+ r=$(mk_root nontest)
136
+ printf '#!/usr/bin/env bash\n%s\n' "$VIOLATION" > "$r/scripts/helper.sh"
137
+ run_gate "$r"
138
+ if [ "$RC" -eq 0 ]; then ok
139
+ else note "p5 non-test shell is out of scope and must not fire (rc=$RC): $OUT"; fi
140
+
141
+ # --- P6: a ppid read that IDENTIFIES a parent is not an orphan oracle -------
142
+ # The common, correct use. Flagging it is what would make precision collapse.
143
+ r=$(mk_root identify)
144
+ { printf '#!/usr/bin/env bash\n'
145
+ printf 'parent="$(%s 2>/dev/null | tr -d " ")"\n' "$PPID_READ"
146
+ printf 'cmd="$(ps -o command= -p "$parent")"\n'
147
+ } > "$r/scripts/test_identify.sh"
148
+ run_gate "$r"
149
+ if [ "$RC" -eq 0 ]; then ok
150
+ else note "p6 a ppid read used for parent identity must not fire (rc=$RC): $OUT"; fi
151
+
152
+ # --- P7: a COMMENT naming the helper must not clear a real violation ---------
153
+ # The waiver has to be code that consults process state, not a note saying someone
154
+ # should. Found by adversarial review of this gate: the window grep read raw text, so a
155
+ # TODO beside the violation made the blocking checker print ok for a line it had found.
156
+ r=$(mk_root comment_waiver)
157
+ { printf '#!/usr/bin/env bash\n'
158
+ printf '# TODO: use wrapper_state here instead\n'
159
+ printf '%s\n' "$VIOLATION"
160
+ } > "$r/scripts/test_probe.sh"
161
+ run_gate "$r"
162
+ if [ "$RC" -ne 0 ] && printf '%s' "$OUT" | grep -q 'liveness_predicate_scan_failed'; then ok
163
+ else note "p7 a comment mentioning the helper must NOT clear the violation (rc=$RC): $OUT"; fi
164
+
165
+ # --- P8: parameter expansion carrying '#' must not be mistaken for a comment --
166
+ # Stripping trailing comments with a naive `#`-to-end rule would truncate `${var#pre}`
167
+ # and could drop the real state consult that follows it, turning the fix into a hit.
168
+ r=$(mk_root hash_expansion)
169
+ { printf '#!/usr/bin/env bash\n'
170
+ printf 'rel="${path#"$root"/}"; st="$(ps -o stat= -p "$pid")"\n'
171
+ printf '%s\n' "$VIOLATION"
172
+ } > "$r/scripts/test_probe.sh"
173
+ run_gate "$r"
174
+ if [ "$RC" -eq 0 ]; then ok
175
+ else note "p8 a '#' inside parameter expansion must not void the state consult (rc=$RC): $OUT"; fi
176
+
177
+ # --- P9: the NEGATED assertion is the opposite check and must not fire ------
178
+ # `!= "1"` asserts a process is NOT reparented. An unrestricted `.*=` in the predicate
179
+ # swallowed the `!`, so the gate flagged the very check that does the right thing —
180
+ # found by adversarial review, and the false-positive direction this gate must avoid.
181
+ r=$(mk_root negated)
182
+ { printf '#!/usr/bin/env bash\n'
183
+ printf '[ "$(%s 2>/dev/null | tr -d " ")" != "1" ] && echo still-parented\n' "$PPID_READ"
184
+ } > "$r/scripts/test_probe.sh"
185
+ run_gate "$r"
186
+ if [ "$RC" -eq 0 ]; then ok
187
+ else note "p9 a negated ppid assertion must NOT fire (rc=$RC): $OUT"; fi
188
+
189
+ # --- P9b: the positive oracle still fires with the tightened operator match --
190
+ # Guards the tightening itself: narrowing the operator must not blunt the real catch.
191
+ r=$(mk_root still_fires)
192
+ printf '#!/usr/bin/env bash\n%s\n' "$VIOLATION" > "$r/scripts/test_probe.sh"
193
+ run_gate "$r"
194
+ if [ "$RC" -ne 0 ] && printf '%s' "$OUT" | grep -q 'liveness_predicate_scan_failed'; then ok
195
+ else note "p9b the real orphan oracle must still fire after tightening (rc=$RC): $OUT"; fi
196
+
197
+ # --- P10: a bare `stat=` assignment is not a process-state read ---------------
198
+ # Found by adversarial review: the waiver grepped bare `stat=`, so an unrelated
199
+ # assignment two lines away cleared a genuine hit and the blocking gate printed ok.
200
+ r=$(mk_root fake_stat)
201
+ { printf '#!/usr/bin/env bash\n'
202
+ printf 'stat=unknown\n'
203
+ printf '%s\n' "$VIOLATION"
204
+ } > "$r/scripts/test_probe.sh"
205
+ run_gate "$r"
206
+ if [ "$RC" -ne 0 ] && printf '%s' "$OUT" | grep -q 'liveness_predicate_scan_failed'; then ok
207
+ else note "p10 a bare stat= assignment must NOT clear the violation (rc=$RC): $OUT"; fi
208
+
209
+ # --- P10b: the genuine `ps -o stat=` read still clears it --------------------
210
+ r=$(mk_root real_stat)
211
+ { printf '#!/usr/bin/env bash\n'
212
+ printf 'st="$(ps -o stat= -p "$pid")"\n'
213
+ printf '%s\n' "$VIOLATION"
214
+ } > "$r/scripts/test_probe.sh"
215
+ run_gate "$r"
216
+ if [ "$RC" -eq 0 ]; then ok
217
+ else note "p10b a real ps -o stat= read must still clear the line (rc=$RC): $OUT"; fi
218
+
219
+ # --- P11: a HOLLOW helper plus an unrelated state read elsewhere is not a fix --
220
+ # Found by adversarial review: "the file defines *_state" and "the file reads process
221
+ # state somewhere" were checked independently, so the two were never tied together and a
222
+ # do-nothing helper borrowed an unrelated read to clear a real hit.
223
+ r=$(mk_root hollow_plus_elsewhere)
224
+ { printf '#!/usr/bin/env bash\n'
225
+ printf 'wrapper_state() {\n echo unknown\n}\n'
226
+ printf 'other() {\n ps -o stat= -p "$1"\n}\n'
227
+ printf 'case "$(wrapper_state "$pid")" in live) : ;; esac\n'
228
+ printf '%s\n' "$VIOLATION"
229
+ } > "$r/scripts/test_probe.sh"
230
+ run_gate "$r"
231
+ if [ "$RC" -ne 0 ] && printf '%s' "$OUT" | grep -q 'liveness_predicate_scan_failed'; then ok
232
+ else note "p11 a hollow helper must NOT borrow an unrelated state read (rc=$RC): $OUT"; fi
233
+
234
+ # --- P12: a ONE-LINE hollow helper must not borrow a later function's read -----
235
+ # Found by the adversarial challenge: the awk rule set inbody and ran `next`, so a
236
+ # definition that opens and closes on one line never met its `}` and stayed "in body"
237
+ # across the following functions, crediting their state read to the hollow helper.
238
+ r=$(mk_root oneline_hollow)
239
+ { printf '#!/usr/bin/env bash\n'
240
+ printf 'wrapper_state() { echo live; }\n'
241
+ printf 'other() {\n ps -o stat= -p "$other_pid"\n}\n'
242
+ printf 'case "$(wrapper_state "$pid")" in live) : ;; esac\n'
243
+ printf '%s\n' "$VIOLATION"
244
+ } > "$r/scripts/test_probe.sh"
245
+ run_gate "$r"
246
+ if [ "$RC" -ne 0 ] && printf '%s' "$OUT" | grep -q 'liveness_predicate_scan_failed'; then ok
247
+ else note "p12 a one-line hollow helper must NOT borrow a later read (rc=$RC): $OUT"; fi
248
+
249
+ # --- P12b: a genuine ONE-LINE helper that does read state still clears it ------
250
+ r=$(mk_root oneline_real)
251
+ { printf '#!/usr/bin/env bash\n'
252
+ printf 'wrapper_state() { ps -o stat= -p "$1"; }\n'
253
+ printf 'case "$(wrapper_state "$pid")" in live) : ;; esac\n'
254
+ printf '%s\n' "$VIOLATION"
255
+ } > "$r/scripts/test_probe.sh"
256
+ run_gate "$r"
257
+ if [ "$RC" -eq 0 ]; then ok
258
+ else note "p12b a real one-line state helper must clear the line (rc=$RC): $OUT"; fi
259
+
260
+ # --- P13/P14: the DOCUMENTED limit, pinned rather than left in prose -----------
261
+ # These two assert the gate does NOT fire, which is a hole, not a feature: a state read
262
+ # of a different pid, or one whose result is discarded, still clears the window. Proving
263
+ # a read GOVERNS the verdict needs dataflow over a parsed shell, so the mechanical gate
264
+ # stops here by design (recurring-anti-patterns-checklist.md, Anti-pattern 28).
265
+ # They are here so the limit is exercised, not merely described: if a future change makes
266
+ # the gate stricter these go red, and whoever tightened it must update the checklist
267
+ # rather than discover the prose had silently gone stale.
268
+ r=$(mk_root limit_other_pid)
269
+ { printf '#!/usr/bin/env bash\n'
270
+ printf 'ps -o stat= -p "$other_pid" >/dev/null\n'
271
+ printf '%s\n' "$VIOLATION"
272
+ } > "$r/scripts/test_probe.sh"
273
+ run_gate "$r"
274
+ if [ "$RC" -eq 0 ]; then ok
275
+ else note "p13 KNOWN LIMIT CHANGED: a different-pid state read now fires — update the checklist (rc=$RC)"; fi
276
+
277
+ r=$(mk_root limit_discarded)
278
+ { printf '#!/usr/bin/env bash\n'
279
+ printf 'ps -o stat= -p "$pid" >/dev/null\n'
280
+ printf '%s\n' "$VIOLATION"
281
+ } > "$r/scripts/test_probe.sh"
282
+ run_gate "$r"
283
+ if [ "$RC" -eq 0 ]; then ok
284
+ else note "p14 KNOWN LIMIT CHANGED: a discarded same-pid state read now fires — update the checklist (rc=$RC)"; fi
285
+
286
+ printf 'liveness_predicate_gate: pass=%s fail=%s\n' "$pass" "$fail"
287
+ [ "$fail" -eq 0 ] || exit 1
288
+ echo "liveness_predicate_gate_ok"
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schema": 1,
3
3
  "npmPackage": "@ccoalm/ccl-skills",
4
- "version": "0.3.0",
5
- "sourceCommit": "0e8a42aee6ffd691679245331af0ad346baf4fdc",
4
+ "version": "0.4.0",
5
+ "sourceCommit": "b6a56485f7e4764e36a2c2ac14693db25964f018",
6
6
  "sourceState": "clean",
7
7
  "files": [
8
8
  {
@@ -287,7 +287,7 @@
287
287
  },
288
288
  {
289
289
  "path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_envelope.py",
290
- "sha256": "30401c9fb101a3d5b37de1af939c14ad5590e1bf3f23e71f58bb20d92b23601a",
290
+ "sha256": "72956ebdfc3c22281b86fb6ada6c2e88a6e21c3a2aa6a80b09767adb62fb18b0",
291
291
  "mode": 493
292
292
  },
293
293
  {
@@ -375,9 +375,14 @@
375
375
  "sha256": "b92a8b2ae91608081665eabcee482b7550415d66df8ad654f1d041add6b3de8f",
376
376
  "mode": 420
377
377
  },
378
+ {
379
+ "path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/test_abort_leak_state_helpers.sh",
380
+ "sha256": "6696d671f0aa071537e35fe93f9f39453659bafeb17a5ab5441407b557a2bdb1",
381
+ "mode": 493
382
+ },
378
383
  {
379
384
  "path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/test_classify_envelope.sh",
380
- "sha256": "dd3167c61b1443cb8661a53efc29fde86ef383a646bc866dde83a3a927dc5f16",
385
+ "sha256": "6ced09a9338753975d12fe81d45b513c276cd38470ef1b2a16849561d88bf19f",
381
386
  "mode": 493
382
387
  },
383
388
  {
@@ -437,7 +442,7 @@
437
442
  },
438
443
  {
439
444
  "path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_review_json.sh",
440
- "sha256": "2362221e654e0d5f9378cd1be1eca9bc0633b3c6b1ed4a7dc4e77f0df986254b",
445
+ "sha256": "62be1010b6f01dfef76c3e6e6b96a8ff5d400c4d9c68060b33b0982ff2b8c754",
441
446
  "mode": 493
442
447
  },
443
448
  {
@@ -452,12 +457,12 @@
452
457
  },
453
458
  {
454
459
  "path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate_abort_leak.sh",
455
- "sha256": "9434aa303e93754ef5a8dfdaf6453bab86f0c253eb787b80fecc00b5f7b3e984",
460
+ "sha256": "b4bd03c04e822eb8ed212e9624ce9ca8c93bdcd363885cfdcf2fd77e74dd21a8",
456
461
  "mode": 493
457
462
  },
458
463
  {
459
464
  "path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh",
460
- "sha256": "6659beaca736d91c9498157766b3d90ce1cbdff828d12fb91b4fff17b9857166",
465
+ "sha256": "244a56a2dbc3b02d11024ec7c4a5d45d31f98938a438b0bfd4ba5be3ea3bf60b",
461
466
  "mode": 493
462
467
  },
463
468
  {
@@ -1912,7 +1917,7 @@
1912
1917
  },
1913
1918
  {
1914
1919
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md",
1915
- "sha256": "f42096bd6667a932b92c6cf0cd1c3e363e483145b08c09572089b1da88055a32",
1920
+ "sha256": "73ce45ed4bb5ca29f9e9b5e286c5da8bbad9d39d48fb8405b43050990814554d",
1916
1921
  "mode": 420
1917
1922
  },
1918
1923
  {
@@ -1937,7 +1942,7 @@
1937
1942
  },
1938
1943
  {
1939
1944
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md",
1940
- "sha256": "50c5edb90fbf923aa2851341bb39c69500e829e6e1cd0e403b2d1ffa0fbd7483",
1945
+ "sha256": "4c3660c0bf33bf742e7d690c11661f7edef1eab0d63a100866e8001ad3adfddb",
1941
1946
  "mode": 420
1942
1947
  },
1943
1948
  {
@@ -1947,7 +1952,7 @@
1947
1952
  },
1948
1953
  {
1949
1954
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md",
1950
- "sha256": "280be0406cbbe42a4f8b0470c27eab666a99c4643be6b3165053d334fe088f29",
1955
+ "sha256": "2c106cb1df85e13b4034866fafbd32c0f9dacf89be7f15ffe8cd7089a8c8d7ef",
1951
1956
  "mode": 420
1952
1957
  },
1953
1958
  {
@@ -1977,7 +1982,7 @@
1977
1982
  },
1978
1983
  {
1979
1984
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/recurring-anti-patterns-checklist.md",
1980
- "sha256": "a463977152868bae7ca534e95a166ad23d027d9c9ec3f4efdc6886fbc6e60074",
1985
+ "sha256": "38a2abe3391b245fef430d334f6aac91a62f75a6f32d2f2a76ad9f946fabb6ec",
1981
1986
  "mode": 420
1982
1987
  },
1983
1988
  {
@@ -2012,12 +2017,12 @@
2012
2017
  },
2013
2018
  {
2014
2019
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md",
2015
- "sha256": "b028098c3d5fdcdb49b6e26fde4a162f958fa236085532e8975e4e7ce2e7de14",
2020
+ "sha256": "bfc26af574b990ce5a8e7dcfcd42b17eaf302e1ba0ec61b10f1db774e85c2a30",
2016
2021
  "mode": 420
2017
2022
  },
2018
2023
  {
2019
2024
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md",
2020
- "sha256": "1c4c99821e26a36a3b82a6194dc82997ce509f50f03f963b7db5a5126e2c5e21",
2025
+ "sha256": "63f3e920df63add61965cefbb5673f6ef2b30249473b548af81fb3a89520b8cb",
2021
2026
  "mode": 420
2022
2027
  },
2023
2028
  {
@@ -2047,7 +2052,7 @@
2047
2052
  },
2048
2053
  {
2049
2054
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh",
2050
- "sha256": "c377934dc7b4f005970bd81a7747e91f0c374aed0f76ee44253a8fbce1a3eb8d",
2055
+ "sha256": "4addb9d800b78b8cc2eb1c8f4429959631bcf092ef00d28306b95b9cd5f209da",
2051
2056
  "mode": 493
2052
2057
  },
2053
2058
  {
@@ -2077,7 +2082,7 @@
2077
2082
  },
2078
2083
  {
2079
2084
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-health.rb",
2080
- "sha256": "35a9b8488e9c8fbe56859fb01634fa9faaa4a993cc6fef816af0ec310b8abc0a",
2085
+ "sha256": "c44e09befe49a5dd9491772bd1bdffb2c881df478fe2705e94d6006543aabadc",
2081
2086
  "mode": 493
2082
2087
  },
2083
2088
  {
@@ -2102,7 +2107,7 @@
2102
2107
  },
2103
2108
  {
2104
2109
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb",
2105
- "sha256": "f15d8b1d1932589e981ad1c104e73bfb9e057f61e5ceae60c3a75004422b7ae9",
2110
+ "sha256": "af64b8f307c75943c81553af22ddb3702cdc1e3ecd77d7a9a3052b680874eaed",
2106
2111
  "mode": 493
2107
2112
  },
2108
2113
  {
@@ -2132,7 +2137,7 @@
2132
2137
  },
2133
2138
  {
2134
2139
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh",
2135
- "sha256": "81be5e3078121140402f88e1e56995dea3d2c70320490eb329e3460eadc1a2b3",
2140
+ "sha256": "04e4b75799c9e6e97402a6515f063dd1c59dc0b4d5f02cc9448142dc99459fea",
2136
2141
  "mode": 493
2137
2142
  },
2138
2143
  {
@@ -2147,7 +2152,7 @@
2147
2152
  },
2148
2153
  {
2149
2154
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh",
2150
- "sha256": "c6ff1fe420383ec343281678a96ba9b7b2905c8946ea6cd145a7c38da0ff28f2",
2155
+ "sha256": "afaa9197cd4e0bf0e0b8d6e3189f0e939561b8142ec1e76c9baf9dd968a3af90",
2151
2156
  "mode": 493
2152
2157
  },
2153
2158
  {
@@ -2217,22 +2222,32 @@
2217
2222
  },
2218
2223
  {
2219
2224
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh",
2220
- "sha256": "493443e08b635ac1acd47339fcd0fe966646374e4224baa68a99f46dba932ae1",
2225
+ "sha256": "08e707048810264e6d74d5df4d9415601b14749204eed55f9f160ae5dc782a60",
2221
2226
  "mode": 493
2222
2227
  },
2223
2228
  {
2224
2229
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_verdict_differential.sh",
2225
- "sha256": "3c6d27086a7c0d97b636f09faef811ed7d1a53806dbcce21de69707cc6f3dc0a",
2230
+ "sha256": "30d94cbf6d2255d1a9eb38eb558ef2d8c638b4d1a65d739b1c713f339b9b22ad",
2226
2231
  "mode": 493
2227
2232
  },
2228
2233
  {
2229
2234
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_round_attribution.sh",
2230
- "sha256": "a8e9bc8a8d60dae6c037c8fa760d15b5a0633e575a9831b9ab11235f3ca12da3",
2235
+ "sha256": "034179e057ff3dbba0ecf3077fad6836caf45536a68479742ace8bbd016ab283",
2236
+ "mode": 493
2237
+ },
2238
+ {
2239
+ "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh",
2240
+ "sha256": "85dbe8967dabe779b99d0e9543b7a6cc24d525f26e6f55eadd6995e16679fb76",
2231
2241
  "mode": 493
2232
2242
  },
2233
2243
  {
2234
2244
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_source_refuted.sh",
2235
- "sha256": "e52069f1ab54e431d62db309c752ded5d7d148e221900a201235ef879e8d3af5",
2245
+ "sha256": "f2f24a5e16d90b11ab0878004612c59a56091bca26f3f4a030490c3dd64a8449",
2246
+ "mode": 493
2247
+ },
2248
+ {
2249
+ "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_liveness_predicate_gate.sh",
2250
+ "sha256": "59a64a65c1998a18506164f93100cb270319ee9c6eddd485d32d78520b064e6a",
2236
2251
  "mode": 493
2237
2252
  },
2238
2253
  {
@@ -2287,7 +2302,7 @@
2287
2302
  },
2288
2303
  {
2289
2304
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md",
2290
- "sha256": "081a7d21813d00a462f2c77c53923edf60cd6f740138d6c028b84ea4675c1aeb",
2305
+ "sha256": "bff6bbfcc86cf5a2c523331621e113c2032a84130237ce1a89b79b5faf0b97dc",
2291
2306
  "mode": 420
2292
2307
  },
2293
2308
  {
@@ -2843,5 +2858,5 @@
2843
2858
  "mode": 420
2844
2859
  }
2845
2860
  ],
2846
- "snapshotHash": "f339a0ca319bb93956aebf42d2f63143ae37de54484398b0a3f87af313064436"
2861
+ "snapshotHash": "6bf3d196d1ce59b751b9082bbb62b0c93cda0ceeb7e3c16431576522a5d9158e"
2847
2862
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ccoalm/ccl-skills",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Self-contained CCL Skills installer for Claude Code, Codex, and OpenCode",
5
5
  "keywords": ["agent-skills", "claude-code", "codex", "opencode", "developer-tools"],
6
6
  "type": "module",