@ccoalm/ccl-skills 0.18.6 → 0.18.7

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 (42) hide show
  1. package/dist/assets/marketplace/plugins/ccl-skills/agent-context/session-policy.md +2 -2
  2. package/dist/assets/marketplace/plugins/ccl-skills/agent-context/session-start.md +6 -6
  3. package/dist/assets/marketplace/plugins/ccl-skills/hooks/host-input.py +39 -4
  4. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_proposed_next.py +66 -0
  5. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/development-completion.md +3 -2
  6. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +30 -2
  7. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +5 -5
  8. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-review-gate-mechanics.md +1 -1
  9. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/pre-final-continuation-gate.md +2 -2
  10. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/review-reception.md +1 -1
  11. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md +1 -1
  12. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +4 -0
  13. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +28 -0
  14. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +2 -0
  15. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-size-budget.sh +2 -0
  16. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-sync-pointers.sh +2 -0
  17. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing-bank.rb +11 -2
  18. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_body_compliance_grading.sh +79 -0
  19. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +4 -2
  20. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_register_pending_exclusion.sh +2 -0
  21. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +4 -0
  22. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_route_drift.sh +2 -0
  23. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_size_budget.sh +4 -2
  24. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_source_register_lifecycle.sh +9 -1
  25. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_sync_pointers.sh +2 -0
  26. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_grader_diagnostics.sh +2 -0
  27. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_resolution.sh +32 -0
  28. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_surface_binding.sh +2 -0
  29. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_prose_target.sh +2 -0
  30. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh +3 -1
  31. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_verdict_differential.sh +2 -0
  32. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_round_attribution.sh +2 -0
  33. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh +2 -0
  34. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_source_refuted.sh +2 -0
  35. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_locale_independent_gates.sh +264 -0
  36. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_resolution.sh +2 -0
  37. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +2 -0
  38. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_delivery_contract.sh +2 -0
  39. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_loading_budget.sh +2 -0
  40. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +2 -0
  41. package/dist/assets/release.json +47 -42
  42. package/package.json +1 -1
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env bash
2
+ # Regression: the repository gates must not depend on the caller's locale.
3
+ # Under a POSIX/unset locale Ruby defaults to US-ASCII, so a gate that reads the
4
+ # UTF-8 skill text (or runs a `ruby -e` program with UTF-8 literals) crashed with
5
+ # "invalid byte sequence in US-ASCII" before checking anything, while CI (which
6
+ # runs C.UTF-8) stayed green. Each ruby-invoking script pins `RUBYOPT=-Ku`.
7
+ # (1) every tracked live shell script (skills/, hooks/, scripts/) and every
8
+ # Makefile target that invokes ruby carries the pin, and no other literal RUBYOPT mention drops it; the
9
+ # classifier is held by pinned bypass and near-miss rows; frozen evidence
10
+ # under specs/ and eval/ is exempt;
11
+ # (2) validate-skill.sh passes on a UTF-8 fixture under LC_ALL=C;
12
+ # (3) the same run with the pin deleted goes red for the encoding reason, which
13
+ # shows the pin is what makes leg (2) pass; on a host whose C locale already
14
+ # reads UTF-8 the pin is not load-bearing and leg (3) reports unevaluated.
15
+ set -euo pipefail
16
+ # Ruby takes its encoding from the locale; under a POSIX/unset locale it reads the UTF-8 skill text as US-ASCII and crashes. Pin UTF-8, as CI runs.
17
+ case " ${RUBYOPT:-} " in *" -Ku "*) ;; *) export RUBYOPT="-Ku${RUBYOPT:+ $RUBYOPT}" ;; esac
18
+
19
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
20
+ ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd -P)"
21
+ PIN='case " ${RUBYOPT:-} " in *" -Ku "*) ;; *) export RUBYOPT="-Ku${RUBYOPT:+ $RUBYOPT}" ;; esac'
22
+ fail() { printf 'FAIL: %b\n' "$*" >&2; exit 1; }
23
+
24
+ # Closed contract over the idiom this repo owns: a RUBYOPT mention keeps the pin
25
+ # only as the pin line itself, the keep idiom RUBYOPT="${RUBYOPT:+$RUBYOPT }..."
26
+ # whose suffix holds only `-r<lib>` requires or variables, or an empty RUBYOPT=
27
+ # before `bash "$script"` (that script pins itself). Any other literal mention -
28
+ # replacing, clearing, unset, env -u, any other Ruby option - drops the pin.
29
+ # Ruby's option names are not this repo's to enumerate, so the suffix is
30
+ # allowlisted, never denylisted. Returns 0 when allowed.
31
+ KEEP_TOKEN='(-r[^[:space:]"\\]+|[$][{]?[A-Za-z_0-9]+[}]?)'
32
+ pin_kept() {
33
+ local line="$1" rest
34
+ [ "$line" = "$PIN" ] && return 0
35
+ # An attribute builtin on the variable can unexport or rescope it even when
36
+ # the value is the keep idiom.
37
+ if printf '%s\n' "$line" | grep -qE '(^|[[:space:];&|({])(declare|typeset|local|readonly|export[[:space:]]+-n)([[:space:]]|$)[^;|&]*RUBYOPT'; then
38
+ return 1
39
+ fi
40
+ rest="$(printf '%s\n' "$line" | sed -E \
41
+ -e "s/^([^\"'\\\\]*)[[:space:]]#.*\$/\\1/" \
42
+ -e "s/RUBYOPT=\"[\$][{]RUBYOPT:[+][\$]RUBYOPT [}](${KEEP_TOKEN}([[:space:]]+${KEEP_TOKEN})*)?\"//g" \
43
+ -e 's/(^|[[:space:]])RUBYOPT=[[:space:]]+bash[[:space:]]+"[$][A-Za-z_{][^"]*"/\1/g')"
44
+ case "$rest" in *RUBYOPT*) return 1 ;; esac
45
+ return 0
46
+ }
47
+
48
+ # Every RUBYOPT line of one file that drops the pin, as "N:line". Whole-line
49
+ # comments are skipped; nothing else is pre-filtered, so a line that merely
50
+ # contains the pin text is still classified.
51
+ pin_drops() {
52
+ local hit
53
+ while IFS= read -r hit; do
54
+ pin_kept "${hit#*:}" || printf '%s\n' "$hit"
55
+ done < <(grep -nE 'RUBYOPT' "$1" | grep -vE '^[0-9]+:[[:space:]]*#' || true)
56
+ }
57
+
58
+ # (1a) The classifier itself: every bypass row must be flagged and every
59
+ # near-miss row must stay allowed, so a broken classifier cannot pass on a
60
+ # corpus that happens to hold only allowed shapes.
61
+ while IFS= read -r row; do
62
+ [ -n "$row" ] || continue
63
+ if pin_kept "$row"; then fail "classifier allowed a pin-dropping line: $row"; fi
64
+ done <<'ROWS'
65
+ RUBYOPT="-r$SHIM" ruby x.rb
66
+ RUBYOPT= ruby -e "p 1"
67
+ unset RUBYOPT
68
+ env -u RUBYOPT ruby -e 1
69
+ RUBYOPT="$RUBYOPT_EXTRA -rfoo" ruby -e 1
70
+ export RUBYOPT=
71
+ RUBYOPT=
72
+ RUBYOPT= LC_ALL=C ruby -e 1
73
+ LC_ALL=C RUBYOPT= LANG=C ruby -e 1
74
+ RUBYOPT= exec ruby -e 1
75
+ RUBYOPT= "${RUBY:-ruby}" -e 1
76
+ RUBYOPT= bash -c "ruby -e 1"
77
+ unset -v RUBYOPT
78
+ unset LANG RUBYOPT
79
+ env --unset=RUBYOPT ruby -e 1
80
+ env -uRUBYOPT ruby -e 1
81
+ RUBYOPT=-W0 ruby -e 1 "$RUBYOPT"
82
+ RUBYOPT="${RUBYOPT#-Ku}" ruby -e 1
83
+ RUBYOPT="" bash x.sh
84
+ export RUBYOPT=-W0
85
+ echo "a #b"; RUBYOPT=-Kn ruby -e 1
86
+ printf ' #' ; unset RUBYOPT
87
+ case " ${RUBYOPT:-} " in *" -Ku "*) ;; *) export RUBYOPT="-Ku${RUBYOPT:+ $RUBYOPT}" ;; esac; unset RUBYOPT
88
+ RUBYOPT="${RUBYOPT:+$RUBYOPT }-Kn" ruby x.rb
89
+ RUBYOPT="${RUBYOPT:+$RUBYOPT }-E ASCII" ruby x.rb
90
+ RUBYOPT="${RUBYOPT:+$RUBYOPT }--internal-encoding=US-ASCII" ruby x.rb
91
+ RUBYOPT="${RUBYOPT:+$RUBYOPT }--disable=rubyopt" ruby x.rb
92
+ RUBYOPT="${RUBYOPT:+$RUBYOPT }-r\" -Kn" ruby x.rb
93
+ export -n RUBYOPT="${RUBYOPT:+$RUBYOPT }-rdate"
94
+ declare +x RUBYOPT="${RUBYOPT:+$RUBYOPT }"
95
+ local RUBYOPT="${RUBYOPT:+$RUBYOPT }-rdate"
96
+ readonly RUBYOPT="${RUBYOPT:+$RUBYOPT }-rdate"
97
+ typeset -x RUBYOPT="${RUBYOPT:+$RUBYOPT }-rdate"
98
+ RUBYOPT="${RUBYOPT:+$RUBYOPT_EXTRA }" ruby x.rb
99
+ RUBYOPT="${RUBYOPT:+$RUBYOPT}-Kn" ruby x.rb
100
+ x=$#; unset RUBYOPT
101
+ echo a\ #b; unset RUBYOPT
102
+ local RUBYOPT
103
+ declare -x RUBYOPT=
104
+ ROWS
105
+ while IFS= read -r row; do
106
+ [ -n "$row" ] || continue
107
+ pin_kept "$row" || fail "classifier flagged an allowed line: $row"
108
+ done <<'ROWS'
109
+ out="$(RUBYOPT="${RUBYOPT:+$RUBYOPT }-rdate" ruby x.rb)"
110
+ env -u X LC_ALL=C RUBYOPT= bash "$SIZE_SCRIPT" "$REPO"
111
+ f() { # takes a RUBYOPT value
112
+ RUBYOPT= bash "$x"; ruby -e 1
113
+ RUBYOPT="${RUBYOPT:+$RUBYOPT }-r$SHIM -rdate" ruby x.rb
114
+ RUBYOPT="${RUBYOPT:+$RUBYOPT }$2" ruby "$1"
115
+ run_gate() { # <gate-path> <RUBYOPT value or empty>
116
+ locale=C RUBYOPT= bash "$x"
117
+ dir=/usr/local RUBYOPT="${RUBYOPT:+$RUBYOPT }-rdate" ruby x.rb
118
+ declared=1 RUBYOPT= bash "$s"
119
+ ROWS
120
+
121
+ # (1b) Static coverage over tracked live shell scripts.
122
+ tracked="$(git -C "$ROOT" ls-files -- 'skills/*.sh' 'hooks/*.sh' 'scripts/*.sh')" \
123
+ || fail "cannot list tracked scripts (not a git checkout?); leg 1 needs git ls-files"
124
+ [ -n "$tracked" ] || fail "git ls-files listed no tracked scripts under $ROOT; leg 1 would pass vacuously"
125
+ missing=""
126
+ dropped=""
127
+ while IFS= read -r rel; do
128
+ # A bare `ruby` word: catches `ruby -e`, `ruby<<`, `ruby;`, `${RUBY:-ruby}`;
129
+ # leaves `rubygems` / `ruby-build` alone. Over-matching only over-requires the pin.
130
+ grep -qE '(^|[^a-z_])ruby([^a-z0-9_.-]|$)' "$ROOT/$rel" || continue
131
+ grep -qxF "$PIN" "$ROOT/$rel" || missing="$missing\n $rel"
132
+ # This file names RUBYOPT in its own patterns and rows, so only its pin is checked.
133
+ [ "$rel" = "skills/skill-extraction-workflow/scripts/test_locale_independent_gates.sh" ] && continue
134
+ while IFS= read -r hit; do
135
+ [ -n "$hit" ] && dropped="$dropped\n $rel: $hit"
136
+ done < <(pin_drops "$ROOT/$rel")
137
+ done <<<"$tracked"
138
+ # Makefile targets that run ruby in a recipe must be on the target-specific
139
+ # RUBYOPT pin line. A rule line names every target before its first colon
140
+ # (`a b: deps`); `X := y` assignments and the pin line itself are not rules.
141
+ mk_pinned_of() { sed -nE 's/^([^#:]*):[[:space:]]*override RUBYOPT :=.*-Ku.*$/\1/p' "$1"; }
142
+ mk_ruby_of() {
143
+ awk '
144
+ /^\t/ { if ($0 ~ /(^|[^a-z_])ruby([^a-z0-9_.-]|$)/) for (i in cur) print cur[i]; next }
145
+ /^[^#[:space:]]/ {
146
+ c = index($0, ":"); if (c == 0) next
147
+ head = substr($0, 1, c - 1)
148
+ if (substr($0, c + 1, 1) == "=" || head ~ /=/) next
149
+ if ($0 ~ /RUBYOPT :=/) next
150
+ split("", cur); n = split(head, names, /[[:space:]]+/)
151
+ for (i = 1; i <= n; i++) if (names[i] != "") cur[i] = names[i]
152
+ }' "$1" | sort -u
153
+ }
154
+ mk_missing_of() { # <Makefile>: ruby-running targets absent from the pin line
155
+ local pinned t
156
+ grep -qxF 'export RUBYOPT' "$1" || { echo "(RUBYOPT is not exported)"; return; }
157
+ pinned="$(mk_pinned_of "$1")"
158
+ [ -n "$pinned" ] || { echo "(no target-specific RUBYOPT -Ku pin line)"; return; }
159
+ for t in $(mk_ruby_of "$1"); do
160
+ case " $pinned " in *" $t "*) ;; *) echo "$t" ;; esac
161
+ done
162
+ }
163
+ [ -n "$(mk_ruby_of "$ROOT/Makefile")" ] || fail "found no Makefile recipe that runs ruby; the Makefile check would pass vacuously"
164
+ for t in $(mk_missing_of "$ROOT/Makefile"); do missing="$missing\n Makefile target $t"; done
165
+ # The tracker itself, on a fixture: a multi-target ruby rule after a pinned one
166
+ # must be reported under its own names, and an assignment line must not reset it.
167
+ mk_fx="$(mktemp "${TMPDIR:-/tmp}/locale-mk.XXXXXX")"
168
+ printf 'X := 1\nexport RUBYOPT\np1 p2: override RUBYOPT := -Ku\np1:\n\truby a.rb\nnew-a new-b: dep\n\t@ruby b.rb\nY := 2\n\techo no\n' >"$mk_fx"
169
+ mk_fx_out="$(mk_missing_of "$mk_fx" | tr '\n' ' ')"
170
+ rm -f "$mk_fx"
171
+ [ "$mk_fx_out" = "new-a new-b " ] || fail "Makefile tracker must report exactly new-a new-b on its fixture, got: $mk_fx_out"
172
+ [ -z "$missing" ] || fail "ruby-invoking scripts without the RUBYOPT UTF-8 pin:$missing"
173
+ [ -z "$dropped" ] || fail "RUBYOPT mentions that drop the UTF-8 pin (use the keep idiom):$dropped"
174
+
175
+ TMP="$(mktemp -d "${TMPDIR:-/tmp}/locale-gates.XXXXXX")"
176
+ trap 'rm -rf "$TMP"' EXIT
177
+
178
+ # Exercise the actual Makefile declarations using inert recipes. In particular,
179
+ # command-line RUBYOPT must not override the UTF-8 pin. Replacing just the recipes
180
+ # keeps live evals offline and preserves Make's assignment/export semantics.
181
+ make_targets="$(mk_ruby_of "$ROOT/Makefile" | tr '\n' ' ')"
182
+ printf '%s:\n' "$make_targets" >"$TMP/probe.mk"
183
+ printf '\t@ruby -e '\''abort "make recipe lost UTF-8" unless Encoding.default_external == Encoding::UTF_8; abort "make recipe lost caller option" if ENV["CCL_MAKE_CALLER_OPTION"] == "yes" && !ENV.fetch("RUBYOPT").split.include?("-W0")'\''\n' >>"$TMP/probe.mk"
184
+ run_make_pin() {
185
+ local makefile="$1"
186
+ shift
187
+ env -u LANGUAGE -u RUBYOPT LC_ALL=C LANG=C make --no-print-directory \
188
+ -f "$makefile" -f "$TMP/probe.mk" "$@" $make_targets
189
+ }
190
+ if ! make_out="$(run_make_pin "$ROOT/Makefile" RUBYOPT=-W0 CCL_MAKE_CALLER_OPTION=yes 2>&1)"; then
191
+ fail "Makefile Ruby targets failed under LC_ALL=C with CLI RUBYOPT:\n$make_out"
192
+ fi
193
+ if ! make_out="$(run_make_pin "$ROOT/Makefile" 2>&1)"; then
194
+ fail "Makefile Ruby targets failed with RUBYOPT absent:\n$make_out"
195
+ fi
196
+ # Applied mutations prove both declarations matter at runtime, as well as in
197
+ # the static tracker. CLI variables are auto-exported by Make, so the export
198
+ # mutation must run without the CLI override to avoid masking a missing export.
199
+ sed 's/: override RUBYOPT :=/: RUBYOPT :=/' "$ROOT/Makefile" >"$TMP/no-override.mk"
200
+ sed '/^export RUBYOPT$/d' "$ROOT/Makefile" >"$TMP/no-export.mk"
201
+ for mutant in no-override no-export; do
202
+ cmp -s "$ROOT/Makefile" "$TMP/$mutant.mk" && fail "$mutant mutation was not applied"
203
+ [ -n "$(mk_missing_of "$TMP/$mutant.mk")" ] || fail "Makefile tracker accepted $mutant mutation"
204
+ make_args=()
205
+ [ "$mutant" != no-override ] || make_args=(RUBYOPT=-W0)
206
+ # Bash 3.2 treats an empty array as unset under nounset.
207
+ if make_out="$(run_make_pin "$TMP/$mutant.mk" ${make_args[@]+"${make_args[@]}"} 2>&1)"; then
208
+ fail "Makefile $mutant mutation still passed the UTF-8 assertion"
209
+ fi
210
+ case "$make_out" in *'make recipe lost UTF-8'*) : ;; *) fail "$mutant failed for an unrelated reason:\n$make_out" ;; esac
211
+ done
212
+
213
+ # (1c) The scan as a whole, on a fixture file: only a line that drops the pin is
214
+ # reported, including one that also contains the pin text.
215
+ {
216
+ printf '%s\n' "$PIN"
217
+ printf '%s; unset RUBYOPT\n' "$PIN"
218
+ printf '# unset RUBYOPT in a comment\n'
219
+ printf 'out="$(RUBYOPT="${RUBYOPT:+$RUBYOPT }-rdate" ruby x.rb)"\n'
220
+ } >"$TMP/scan-fixture.sh"
221
+ scan_out="$(pin_drops "$TMP/scan-fixture.sh")"
222
+ [ "${scan_out%%:*}" = "2" ] && [ "$(printf '%s\n' "$scan_out" | grep -c .)" = "1" ] \
223
+ || fail "pin_drops must report only line 2 of the scan fixture, got:\n$scan_out"
224
+ mkdir -p "$TMP/skill/references"
225
+ cat >"$TMP/skill/SKILL.md" <<'EOF'
226
+ ---
227
+ name: locale-fixture
228
+ description: 合成夹具 — synthetic fixture for locale independence.
229
+ ---
230
+
231
+ # 夹具
232
+
233
+ 见 `references/detail.md`。
234
+ EOF
235
+ printf '# 细节\n\n中文正文。\n' >"$TMP/skill/references/detail.md"
236
+
237
+ run_c_locale() { env -u LANGUAGE LC_ALL=C LANG=C RUBYOPT= bash "$1" "$TMP/skill"; }
238
+
239
+ # (2) The shipped gate passes under the C locale.
240
+ if ! out="$(run_c_locale "$SCRIPT_DIR/validate-skill.sh" 2>&1)"; then
241
+ fail "validate-skill.sh failed under LC_ALL=C:\n$out"
242
+ fi
243
+ case "$out" in *markdown_references_ok*) : ;; *) fail "validate-skill.sh did not reach the reference check under LC_ALL=C:\n$out" ;; esac
244
+
245
+ # (3) Applied mutation: the same script without the pin reds for the encoding reason.
246
+ cp -R "$SCRIPT_DIR" "$TMP/scripts"
247
+ grep -vxF "$PIN" "$SCRIPT_DIR/validate-skill.sh" >"$TMP/scripts/validate-skill.sh"
248
+ if mout="$(run_c_locale "$TMP/scripts/validate-skill.sh" 2>&1)"; then
249
+ # Unevaluated only when the host itself explains the pass: Ruby already reads
250
+ # UTF-8 under the C locale, so the pin is not load-bearing here. Any other
251
+ # reason the unpinned run passed means leg 2 may be vacuous.
252
+ if ! env -u LANGUAGE LC_ALL=C LANG=C ruby -e 'exit(Encoding.find("locale") == Encoding::UTF_8 ? 0 : 1)'; then
253
+ fail "pin removed, yet validate-skill.sh still passed under LC_ALL=C on a host whose Ruby reads US-ASCII there, so leg 2 proves nothing:\n$mout"
254
+ fi
255
+ echo "test_locale_independent_gates_leg3_unevaluated: this host's Ruby reads UTF-8 under LC_ALL=C, so removing the pin cannot be shown to matter here" >&2
256
+ echo "test_locale_independent_gates: ok (legs 1-2; leg 3 unevaluated on this host)"
257
+ exit 0
258
+ fi
259
+ case "$mout" in
260
+ *"invalid byte sequence"*|*"invalid multibyte char"*) : ;;
261
+ *) fail "pin removed: run failed, but not for the encoding reason:\n$mout" ;;
262
+ esac
263
+
264
+ echo "test_locale_independent_gates: ok"
@@ -13,6 +13,8 @@
13
13
  # locator. A test that only ever asserts "clean stays clean" would pass with the
14
14
  # whole detection deleted, so every RED case here has a paired GREEN control.
15
15
  set -euo pipefail
16
+ # Ruby takes its encoding from the locale; under a POSIX/unset locale it reads the UTF-8 skill text as US-ASCII and crashes. Pin UTF-8, as CI runs.
17
+ case " ${RUBYOPT:-} " in *" -Ku "*) ;; *) export RUBYOPT="-Ku${RUBYOPT:+ $RUBYOPT}" ;; esac
16
18
 
17
19
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
18
20
  GATE="$SCRIPT_DIR/register-firing-path-resolution.rb"
@@ -11,6 +11,8 @@
11
11
  # ALIAS_AUDIT_CMD=true stands in for a passing private R0 audit so the assertion
12
12
  # isolates firing-path enforcement from the separate R0 interim path.
13
13
  set -euo pipefail
14
+ # Ruby takes its encoding from the locale; under a POSIX/unset locale it reads the UTF-8 skill text as US-ASCII and crashes. Pin UTF-8, as CI runs.
15
+ case " ${RUBYOPT:-} " in *" -Ku "*) ;; *) export RUBYOPT="-Ku${RUBYOPT:+ $RUBYOPT}" ;; esac
14
16
 
15
17
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
16
18
  CHECK_SCRIPT="$SCRIPT_DIR/check-ccl-skills.sh"
@@ -3,6 +3,8 @@
3
3
  # The canonical reference owns the protocol; each participating skill keeps
4
4
  # only its local responsibility and a pointer to that reference.
5
5
  set -euo pipefail
6
+ # Ruby takes its encoding from the locale; under a POSIX/unset locale it reads the UTF-8 skill text as US-ASCII and crashes. Pin UTF-8, as CI runs.
7
+ case " ${RUBYOPT:-} " in *" -Ku "*) ;; *) export RUBYOPT="-Ku${RUBYOPT:+ $RUBYOPT}" ;; esac
6
8
 
7
9
  ROOT="${UIUX_CONTRACT_ROOT:-$(cd "$(dirname "$0")/../../.." && pwd -P)}"
8
10
  CONTRACT="$ROOT/skills/product-ui-ux-design/references/delivery-contract.md"
@@ -7,6 +7,8 @@
7
7
  # entry and every routed reference local and resolvable. Real provider load,
8
8
  # token, latency, correction, and task-quality claims still require task trials.
9
9
  set -euo pipefail
10
+ # Ruby takes its encoding from the locale; under a POSIX/unset locale it reads the UTF-8 skill text as US-ASCII and crashes. Pin UTF-8, as CI runs.
11
+ case " ${RUBYOPT:-} " in *" -Ku "*) ;; *) export RUBYOPT="-Ku${RUBYOPT:+ $RUBYOPT}" ;; esac
10
12
 
11
13
  ROOT="${UIUX_LOADING_ROOT:-$(cd "$(dirname "$0")/../../.." && pwd -P)}"
12
14
  DEFAULT_BASE_REF="e322db47abe5736e6e1fdf0e73e2ed3eb32c006b"
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
+ # Ruby takes its encoding from the locale; under a POSIX/unset locale it reads the UTF-8 skill text as US-ASCII and crashes. Pin UTF-8, as CI runs.
4
+ case " ${RUBYOPT:-} " in *" -Ku "*) ;; *) export RUBYOPT="-Ku${RUBYOPT:+ $RUBYOPT}" ;; esac
3
5
 
4
6
  target="${1:-.}"
5
7
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schema": 1,
3
3
  "npmPackage": "@ccoalm/ccl-skills",
4
- "version": "0.18.6",
5
- "sourceCommit": "404c29b2d42bda7a427676da5ba96b782c7d2f85",
4
+ "version": "0.18.7",
5
+ "sourceCommit": "dcdc9ba9c54f708348dbfc46fb4964ec8d452001",
6
6
  "sourceState": "clean",
7
7
  "files": [
8
8
  {
@@ -42,12 +42,12 @@
42
42
  },
43
43
  {
44
44
  "path": "marketplace/plugins/ccl-skills/agent-context/session-policy.md",
45
- "sha256": "b1372ffc5458516c51a32b09194a8480c521dc58dea4f5e1a4eb4547b0262278",
45
+ "sha256": "a47f7ff077f33da3efaa24fc1d55118330f23ef268e92355d2f281ee56237d2a",
46
46
  "mode": 420
47
47
  },
48
48
  {
49
49
  "path": "marketplace/plugins/ccl-skills/agent-context/session-start.md",
50
- "sha256": "8ce6cc34721028822a4ca0a215f747b0eb2d38b9763554a187a2827af12bf2b2",
50
+ "sha256": "a4292129978273e62a6975ed86abd383ea0b4cc3925ede8a1a8af5d6b39be1c8",
51
51
  "mode": 420
52
52
  },
53
53
  {
@@ -82,7 +82,7 @@
82
82
  },
83
83
  {
84
84
  "path": "marketplace/plugins/ccl-skills/hooks/host-input.py",
85
- "sha256": "99de6454efb550efe70c514d81fae8ed2bdca98b11b6b529618dae669b8b7611",
85
+ "sha256": "b737a74f0a664c52189e43b84539c7ab41e5e4817570b6b1c50c889056c3a9a6",
86
86
  "mode": 420
87
87
  },
88
88
  {
@@ -187,7 +187,7 @@
187
187
  },
188
188
  {
189
189
  "path": "marketplace/plugins/ccl-skills/hooks/test_proposed_next.py",
190
- "sha256": "771bbc6fa63b0803567e13a8af4d4d78b8c9a73fcad05f8aa6612c56101e7416",
190
+ "sha256": "db2df523107fa2b0896c769396e523171f77948526f9d39c8396b598e68fefbf",
191
191
  "mode": 493
192
192
  },
193
193
  {
@@ -347,7 +347,7 @@
347
347
  },
348
348
  {
349
349
  "path": "marketplace/plugins/ccl-skills/skills/code-review/references/development-completion.md",
350
- "sha256": "b2af745ca8dbd64ed3e87c5e93d24ce39298ae9530ec98ad663b724b8e4d4fc6",
350
+ "sha256": "1de7e7f7529d4399738cb1bf9447cb33654bb96443449456fc14d037ca8a94c9",
351
351
  "mode": 420
352
352
  },
353
353
  {
@@ -557,7 +557,7 @@
557
557
  },
558
558
  {
559
559
  "path": "marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh",
560
- "sha256": "bb054072877443d4c44c02843dc9cebdd786fb9e33248150887fb2991a96ce01",
560
+ "sha256": "b04fd9bd2bbd75195e5a3f1ca63aeba9d8a585403079a721c44f0275b0ea0208",
561
561
  "mode": 493
562
562
  },
563
563
  {
@@ -1417,7 +1417,7 @@
1417
1417
  },
1418
1418
  {
1419
1419
  "path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-review-gate-mechanics.md",
1420
- "sha256": "7852dd2f0a6a32b6f6fddd4f4884e8701c54be4b738f6520370b9c4826424c7c",
1420
+ "sha256": "6c07df6024da34e6494101c85959286049aed52db96567c2819c957566ca6ea2",
1421
1421
  "mode": 420
1422
1422
  },
1423
1423
  {
@@ -1477,7 +1477,7 @@
1477
1477
  },
1478
1478
  {
1479
1479
  "path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/pre-final-continuation-gate.md",
1480
- "sha256": "c0403e25446b74a732dcd6f927d805a265fac13b9b781e995833ac153290b042",
1480
+ "sha256": "b23c9822452402d26035218ea1e16f8cb3943a2d5812ff6ecd94399f66110644",
1481
1481
  "mode": 420
1482
1482
  },
1483
1483
  {
@@ -1507,7 +1507,7 @@
1507
1507
  },
1508
1508
  {
1509
1509
  "path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/review-reception.md",
1510
- "sha256": "34ffcb08689b244939cd501fc48dfdea1b8661c0e3fc33fd8317d1b7bf392d63",
1510
+ "sha256": "e00b62f2719fc8640b5632b9b1ca0bc2035880b0688441c8beebb3fd49cc781d",
1511
1511
  "mode": 420
1512
1512
  },
1513
1513
  {
@@ -1552,7 +1552,7 @@
1552
1552
  },
1553
1553
  {
1554
1554
  "path": "marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md",
1555
- "sha256": "cb4e2f2b246c444dcc005ea864949c1ba8eb83e340b80e5b188c0d99e1bb4c2f",
1555
+ "sha256": "5e1218771802f949cded19f40ddb03676b0e0be411d0616245fdd581425d0ef9",
1556
1556
  "mode": 420
1557
1557
  },
1558
1558
  {
@@ -1817,7 +1817,7 @@
1817
1817
  },
1818
1818
  {
1819
1819
  "path": "marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md",
1820
- "sha256": "c4bf4b3a18c7a9eb8ca5c73c889c192222dd1a659df12b7952ec313d15969d61",
1820
+ "sha256": "199b030335cfdb9f5255d5697326c97e48604fe2a46dcb3dd98f07793e2d40de",
1821
1821
  "mode": 420
1822
1822
  },
1823
1823
  {
@@ -2107,7 +2107,7 @@
2107
2107
  },
2108
2108
  {
2109
2109
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md",
2110
- "sha256": "bbe5ac36800a0c3301d82b467076863ab9b72c51be0656b14ec79a6c382f1bbc",
2110
+ "sha256": "f0bf6485aa236398045f6ab460ec6975566f78569862a7c1f94a29e58e05a9e2",
2111
2111
  "mode": 420
2112
2112
  },
2113
2113
  {
@@ -2207,7 +2207,7 @@
2207
2207
  },
2208
2208
  {
2209
2209
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md",
2210
- "sha256": "4694aa9cd45b4df1801067e537223badb6f127564db2eff89cedd9e8497347d6",
2210
+ "sha256": "1c0e95554f7b8d63860e23385d3b9d84b7d3c1790e4e4071e772b170b4a2b2c6",
2211
2211
  "mode": 420
2212
2212
  },
2213
2213
  {
@@ -2247,7 +2247,7 @@
2247
2247
  },
2248
2248
  {
2249
2249
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh",
2250
- "sha256": "9c3bb27f2cf8cffabfec633b33ee58a392fd7a4b464420bc6a3f02822380e94d",
2250
+ "sha256": "cc0b4c36f8f5c8cfe613a046117b4f569314be1f0cae94ba4b4133c21415b960",
2251
2251
  "mode": 493
2252
2252
  },
2253
2253
  {
@@ -2272,12 +2272,12 @@
2272
2272
  },
2273
2273
  {
2274
2274
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-size-budget.sh",
2275
- "sha256": "1e02c4309fff454bdafe1c840671ae29b1240cb9ad31a8295dee279001732a63",
2275
+ "sha256": "9a5f860bde439347e853ba4298705abe237ab18ca908e919204b1d5294570e60",
2276
2276
  "mode": 493
2277
2277
  },
2278
2278
  {
2279
2279
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-sync-pointers.sh",
2280
- "sha256": "2cefaf3db4db1bb12ba14982da924d57bcbfcd4c4ee2cd83a220ac3b3c2a5633",
2280
+ "sha256": "f2a12a889e8fe18b89c95cdb5a7ea9647661822de58270adf08a045c39cbf319",
2281
2281
  "mode": 493
2282
2282
  },
2283
2283
  {
@@ -2302,7 +2302,7 @@
2302
2302
  },
2303
2303
  {
2304
2304
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing-bank.rb",
2305
- "sha256": "6d1e2f0d13c0965ffe5b41e42a86bfd7e135158cbd1bdfbcbb6f01be9140bee0",
2305
+ "sha256": "224fbb07f3e1233510ee2493de9e4a8b98afd0d03e39c334a68df95109a0c936",
2306
2306
  "mode": 493
2307
2307
  },
2308
2308
  {
@@ -2382,12 +2382,12 @@
2382
2382
  },
2383
2383
  {
2384
2384
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_body_compliance_grading.sh",
2385
- "sha256": "d3a37c4ae39492325f71940099fe965862b6766a9b8ec3a3b5db3d8e59f7057a",
2385
+ "sha256": "c1c34a27011e77f367a758bb5d6f4abd1ab04d997119f718268343c73027604f",
2386
2386
  "mode": 493
2387
2387
  },
2388
2388
  {
2389
2389
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh",
2390
- "sha256": "dbc090be57b6f14795e6b7dcd79abe83bb1efa3d2f090040c4b7225b4e10d2fa",
2390
+ "sha256": "705f24a9cd5f8ed552fdeda3334d308bafa15922d1c311cba3c62866c2a07ae2",
2391
2391
  "mode": 493
2392
2392
  },
2393
2393
  {
@@ -2402,22 +2402,22 @@
2402
2402
  },
2403
2403
  {
2404
2404
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_register_pending_exclusion.sh",
2405
- "sha256": "44505ed0f4d7fa5e4acea3745388df12a6832955c97f1fc269e6534793353470",
2405
+ "sha256": "db83328728cd9579e910548d28a9096292d8140c8c447e714b2b28409158d46b",
2406
2406
  "mode": 493
2407
2407
  },
2408
2408
  {
2409
2409
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh",
2410
- "sha256": "6083c908561d71c2b62743a6e40e371de62fcd2627bf8c24a1e74f46f5b88ea2",
2410
+ "sha256": "3fac6685fe62945ac8733b58cc4826932cdaf243233d38f44979796dda3ec845",
2411
2411
  "mode": 493
2412
2412
  },
2413
2413
  {
2414
2414
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_route_drift.sh",
2415
- "sha256": "9d1ab92e6de53db37e14af26315a2bbc1e4d59c65149809cfc3a18024ba70821",
2415
+ "sha256": "4116943f04a4711a5b8ba1544f5165cd906cebcfe4ef200fa858ac2283e98ac4",
2416
2416
  "mode": 493
2417
2417
  },
2418
2418
  {
2419
2419
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_size_budget.sh",
2420
- "sha256": "2711bdaf188f37abfda41edde59821d812c7d5c38f08dab91b6d952a588454e1",
2420
+ "sha256": "12516de81258c0be905ca62ed9acef5afb5af0ff9b32aace6636fd5759e323f7",
2421
2421
  "mode": 493
2422
2422
  },
2423
2423
  {
@@ -2427,7 +2427,7 @@
2427
2427
  },
2428
2428
  {
2429
2429
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_source_register_lifecycle.sh",
2430
- "sha256": "20ad89c0eeeba8638a99854a5c25cc997e96796bc7548a4d977a4dd32058d73c",
2430
+ "sha256": "19421b4db0ed6f1e22f0bf8402a049f111018d69703313ecf1c961cc477f8d37",
2431
2431
  "mode": 493
2432
2432
  },
2433
2433
  {
@@ -2447,7 +2447,7 @@
2447
2447
  },
2448
2448
  {
2449
2449
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_sync_pointers.sh",
2450
- "sha256": "910070e5182a5202f92c0e6199e2d1a89ea72c112c1b6c79359d9f8dc0df7108",
2450
+ "sha256": "582e2c093d5a872db63d42001fa2ff4c5743ab4e8e5b2804e3f1718a8d355afa",
2451
2451
  "mode": 493
2452
2452
  },
2453
2453
  {
@@ -2472,22 +2472,22 @@
2472
2472
  },
2473
2473
  {
2474
2474
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_grader_diagnostics.sh",
2475
- "sha256": "10cacb2baf142dbedddbecb34ac2ee1bd9d043b9c946acff9ce83373be0d1553",
2475
+ "sha256": "1fd3bb148b94fa4fcdc9914075bec85f0b18ce2d57fb02bca5595d319c0f446f",
2476
2476
  "mode": 493
2477
2477
  },
2478
2478
  {
2479
2479
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_resolution.sh",
2480
- "sha256": "ea151e086c53d3cbf227e1e5cf6a3c3ef54d0e6460b4ec61275a097073499c11",
2480
+ "sha256": "f927bf7f2210d67611b9f2ee07b5e218f78bea3daa73173a4c06e6fab56fa80d",
2481
2481
  "mode": 493
2482
2482
  },
2483
2483
  {
2484
2484
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_surface_binding.sh",
2485
- "sha256": "68003f1b1bc58023236a021ca5272b598cb7d9080182548a012992322214b9e8",
2485
+ "sha256": "7388730731f38e6cb9042546b3c384241b7a9c7df2fe5f368de5f9b2b84d580d",
2486
2486
  "mode": 493
2487
2487
  },
2488
2488
  {
2489
2489
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_prose_target.sh",
2490
- "sha256": "8ddd704eac6f4ffdc5d5b6566f9a2b3d5e940b944af448586dfec0e920a54ee5",
2490
+ "sha256": "f64532ad4d50d4546f09994c38dd63dae05e7dd7f90ae8fe2b640e9987d1d814",
2491
2491
  "mode": 493
2492
2492
  },
2493
2493
  {
@@ -2532,27 +2532,27 @@
2532
2532
  },
2533
2533
  {
2534
2534
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh",
2535
- "sha256": "08e707048810264e6d74d5df4d9415601b14749204eed55f9f160ae5dc782a60",
2535
+ "sha256": "b3ea5fdcabf00d0df14710830c7c6860ef1d5476d19044ff7812000eaee6edb6",
2536
2536
  "mode": 493
2537
2537
  },
2538
2538
  {
2539
2539
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_verdict_differential.sh",
2540
- "sha256": "b53ec5cc1247bbcd068f43eacac190de2efcea531883f8e25828522870553a37",
2540
+ "sha256": "0028a9ffa2a9c344ce143377da5787975f488cb75dd04cf602de4d93c72b6496",
2541
2541
  "mode": 493
2542
2542
  },
2543
2543
  {
2544
2544
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_round_attribution.sh",
2545
- "sha256": "034179e057ff3dbba0ecf3077fad6836caf45536a68479742ace8bbd016ab283",
2545
+ "sha256": "e6417d70200377268f71bd445578687c27aa1994a0260626feca9e0e950b0738",
2546
2546
  "mode": 493
2547
2547
  },
2548
2548
  {
2549
2549
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh",
2550
- "sha256": "16c600bfaab47a810202307a61f3b9fcf1e1c2f5125530afb8eb7f3f0ee6114a",
2550
+ "sha256": "b84dcaa206ce9c95d95ec0a813d55450f5759422e67076ea473d2b775088acf2",
2551
2551
  "mode": 493
2552
2552
  },
2553
2553
  {
2554
2554
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_source_refuted.sh",
2555
- "sha256": "f2f24a5e16d90b11ab0878004612c59a56091bca26f3f4a030490c3dd64a8449",
2555
+ "sha256": "7afcf09d3bb2ed2405c685b9bd5d8f95cd0c3798d2dd7d119279cb6905b6372b",
2556
2556
  "mode": 493
2557
2557
  },
2558
2558
  {
@@ -2560,6 +2560,11 @@
2560
2560
  "sha256": "59a64a65c1998a18506164f93100cb270319ee9c6eddd485d32d78520b064e6a",
2561
2561
  "mode": 493
2562
2562
  },
2563
+ {
2564
+ "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_locale_independent_gates.sh",
2565
+ "sha256": "0f78f16b4193f2feeb72c3af102c3979ab76ce1322530be053c049fed7bf5aee",
2566
+ "mode": 493
2567
+ },
2563
2568
  {
2564
2569
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger_repo_audit.sh",
2565
2570
  "sha256": "57b64b2b2f9cfddf96ff723be42e93410cf2269f6b0fae184c6a68b3c7945968",
@@ -2582,12 +2587,12 @@
2582
2587
  },
2583
2588
  {
2584
2589
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_resolution.sh",
2585
- "sha256": "ba82e2d6506ad0845e1583e64bb8d28f91ae7411c8b75f40ed44295a6c3b4897",
2590
+ "sha256": "b5dfd026af42ccb67801e3e7325ccc909a0677c72bd37c29c4c5fcd4905bc71c",
2586
2591
  "mode": 493
2587
2592
  },
2588
2593
  {
2589
2594
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh",
2590
- "sha256": "5a138eb28549dc9fa9cc7bb290c448eedfa51857b49c7b416b35d036f81fac0f",
2595
+ "sha256": "8b8ae410afc61a8d4fde59e21f88af91cd90a4329b0cdc3183eb8b5f2a6dc630",
2591
2596
  "mode": 493
2592
2597
  },
2593
2598
  {
@@ -2617,12 +2622,12 @@
2617
2622
  },
2618
2623
  {
2619
2624
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_delivery_contract.sh",
2620
- "sha256": "1dc2f8ccba0451dd25560c58bdc2363ba8c295715fbe2a292612cf5878f8e18e",
2625
+ "sha256": "b58ec01810e0a226ff92bfd15b9d1f7bdc3c572591e7a68407b4a9fa8fa14ced",
2621
2626
  "mode": 493
2622
2627
  },
2623
2628
  {
2624
2629
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_loading_budget.sh",
2625
- "sha256": "76533e5dd88225ff5b4f710536b6a43e5139fd2691942e52737828c3098326ce",
2630
+ "sha256": "3e85121dd240eb88c8a1ce1b66de0ac700dd722a5680b5584d706b22bb6d10a7",
2626
2631
  "mode": 493
2627
2632
  },
2628
2633
  {
@@ -2642,7 +2647,7 @@
2642
2647
  },
2643
2648
  {
2644
2649
  "path": "marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh",
2645
- "sha256": "f2a92802a5d87032e85084ab2e05898f694b16b26da36be80216d354e2e02371",
2650
+ "sha256": "0422dbae4565e2df2582f3bedb6fb4b2a3f849a0b430e03ad27acd6bbdbf1846",
2646
2651
  "mode": 493
2647
2652
  },
2648
2653
  {
@@ -3518,5 +3523,5 @@
3518
3523
  "mode": 420
3519
3524
  }
3520
3525
  ],
3521
- "snapshotHash": "1c834267787c28801e4e6a233529d3974542ebdbf016f84c7745bd38fdbf794b"
3526
+ "snapshotHash": "ba46e55d708e08e62b84b47d83c333b50a91b1ea66c25a01c9b8430689cf3e3f"
3522
3527
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ccoalm/ccl-skills",
3
- "version": "0.18.6",
3
+ "version": "0.18.7",
4
4
  "description": "Reusable workflows that help coding agents plan, build, test, review, and release software — for Claude Code, Codex, and OpenCode",
5
5
  "keywords": ["skills", "agent-skills", "claude", "claude-code", "codex", "opencode", "agent", "ai", "ai-agents", "cli", "anthropic", "developer-tools"],
6
6
  "type": "module",