@ccoalm/ccl-skills 0.13.0 → 0.15.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 (52) hide show
  1. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +19 -24
  2. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +32 -32
  3. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/manual-invocation-and-prompts.md +16 -14
  4. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +24 -26
  5. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/AGENTS.md +11 -0
  6. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +60 -209
  7. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/init_policy_matrix.py +114 -367
  8. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_probe_result.py +52 -672
  9. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +10 -2
  10. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/runtime-surface-verification-design.md +4 -2
  11. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +77 -444
  12. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_init_policy_matrix.sh +33 -98
  13. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_probe_result.sh +57 -173
  14. package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md +1 -1
  15. package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/SKILL.md +1 -1
  16. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +1 -1
  17. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +1 -1
  18. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +1 -1
  19. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +2 -2
  20. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/rd-standards-doc-family-checklist.md +2 -2
  21. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/SKILL.md +1 -1
  22. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/SKILL.md +1 -1
  23. package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/SKILL.md +1 -1
  24. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +14 -41
  25. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/attention-budget-ratchet.md +11 -0
  26. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/correction-routing-map.md +22 -0
  27. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +7 -0
  28. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/description-authoring.md +26 -0
  29. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +2 -2
  30. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +8 -0
  31. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +7 -1
  32. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +4 -2
  33. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md +8 -0
  34. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/incident-postmortem-extraction.md +8 -0
  35. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/rule-consolidation.md +1 -0
  36. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +73 -0
  37. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +11 -0
  38. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +11 -0
  39. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/entrypoint_form_census.py +169 -0
  40. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing-bank.rb +62 -3
  41. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +114 -10
  42. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/reference-access-census.sh +157 -0
  43. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/review_ledger_binding.py +483 -109
  44. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +188 -14
  45. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +10 -0
  46. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_entrypoint_form_census.sh +174 -0
  47. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_resolution.sh +253 -0
  48. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_verdict_differential.sh +49 -25
  49. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_reference_access_census.sh +209 -0
  50. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_review_ledger_binding.sh +394 -5
  51. package/dist/assets/release.json +77 -47
  52. package/package.json +1 -1
@@ -20,7 +20,6 @@ direct_schema=0
20
20
  host_remediation_attempted=0
21
21
  prompt_only=0
22
22
  allow_prompt_only_advisory=0
23
- registry_native_skills=()
24
23
  capture_signal_rc=198
25
24
  capture_timeout_rc=199
26
25
 
@@ -87,13 +86,6 @@ emit_runtime_inconclusive() {
87
86
  # of a breached boundary, so it falls back to another reviewer client
88
87
  # instead of terminating the review.
89
88
  *"unrecognized surface-shaped init field"*) emit_inconclusive_payload "$reason" capability_missing true fallback ;;
90
- # Must precede the tool-boundary branch for the same reason, and needs its
91
- # own arm rather than the late catch-all below: a bare command/skill name
92
- # outside the built-in snapshot is a vocabulary this repo does not own, so it
93
- # is unverifiable rather than a proven customization. The lane still refuses;
94
- # it just does not take the other reviewer clients down with it, which is
95
- # what one upstream CLI release used to do.
96
- *"unclassifiable host-vocabulary entry"*) emit_inconclusive_payload "$reason" capability_missing true fallback ;;
97
89
  *"permission"*|*"tool invocation"*|*"unexpected tool"*|*"runtime isolation"*|*"runtime capability"*|*"Bash tool"*) emit_inconclusive_payload "$reason" tool_boundary_violation false stop_reviewer_lane ;;
98
90
  *"auth-path false negative"*|*"not logged in"*|*"auth-path evidence"*)
99
91
  if [ "$host_remediation_attempted" -eq 1 ]; then
@@ -285,6 +277,14 @@ envelope_classifier="$script_dir/classify_envelope.py"
285
277
  result_parser="$script_dir/parse_review_json.py"
286
278
  skill_verifier="$script_dir/verify_native_skill_binding.py"
287
279
 
280
+ # Owner-skill binding is best effort. The review itself never depends on the
281
+ # installed CCL registry: when the controller selected owner skills but the
282
+ # installed registry is absent, older, or otherwise fails verification, the
283
+ # wrapper still reviews the packet and reports `native_skill_binding=unavailable`
284
+ # so the controller knows the owner skills were not natively invoked. Only a
285
+ # profile that names no owners yet fails its own consistency check, or owner
286
+ # arguments without a profile, are caller errors and stay terminal.
287
+ native_skill_binding="not_requested"
288
288
  if [ -n "$review_profile_file" ]; then
289
289
  if [ ! -f "$skill_verifier" ]; then
290
290
  emit_inconclusive_payload "native skill verifier is unavailable" local_tool_failure false stop_reviewer_lane
@@ -301,22 +301,17 @@ if [ -n "$review_profile_file" ]; then
301
301
  skill_verify_args+=(--review-skill "$review_skill")
302
302
  done
303
303
  fi
304
- if ! python3 "$skill_verifier" "${skill_verify_args[@]}" >/dev/null 2>&1; then
304
+ if python3 "$skill_verifier" "${skill_verify_args[@]}" >/dev/null 2>&1; then
305
+ if [ "$review_skill_count" -gt 0 ]; then
306
+ native_skill_binding="established"
307
+ fi
308
+ elif [ "$review_skill_count" -gt 0 ]; then
309
+ native_skill_binding="unavailable"
310
+ printf '%s\n' 'claude_review: installed CCL skill registry could not be verified; reviewing without native owner skills' >&2
311
+ else
305
312
  emit_inconclusive_payload "native skill binding does not match the controller profile" binding_mismatch false stop_reviewer_lane
306
313
  exit 2
307
314
  fi
308
- if [ "$review_skill_count" -gt 0 ]; then
309
- for skill_entrypoint in "$skill_registry_root"/*/SKILL.md; do
310
- [ -f "$skill_entrypoint" ] && [ ! -L "$skill_entrypoint" ] || continue
311
- registry_skill_name="$(basename "$(dirname "$skill_entrypoint")")"
312
- case "$registry_skill_name" in
313
- ''|*[!a-z0-9_-]*)
314
- emit_inconclusive_payload "installed CCL skill name is invalid" binding_mismatch false stop_reviewer_lane
315
- exit 2 ;;
316
- esac
317
- registry_native_skills+=("$registry_skill_name")
318
- done
319
- fi
320
315
  elif [ "$review_skill_count" -gt 0 ] || [ -n "$skill_registry_root" ]; then
321
316
  emit_inconclusive_payload "native skill binding is incomplete" invalid_input false stop_reviewer_lane
322
317
  exit 2
@@ -368,29 +363,24 @@ has_help_flag() {
368
363
  END { exit found ? 0 : 1 }
369
364
  ' <<<"$help_text"
370
365
  }
371
- safe_mode_disables_skills() {
372
- awk '
373
- /^[[:space:]]*--safe-mode([[:space:]]|$)/ {
374
- capture = 1
375
- }
376
- capture && seen && /^[[:space:]]*-{1,2}[[:alnum:]]/ {
377
- capture = 0
378
- }
379
- capture && seen && /^[[:space:]]*$/ {
380
- capture = 0
381
- }
382
- capture {
383
- text = text " " tolower($0)
384
- seen = 1
385
- }
386
- END {
387
- if (text ~ /skills[^.;]*(unaffected|remain(s)?[[:space:]]+enabled|not[[:space:]]+disabl)/) {
388
- exit 1
389
- }
390
- exit (text ~ /disabl[a-z]*[[:space:]]+(all[[:space:]]+)?(inherited[[:space:]]+)?skills/ ||
391
- text ~ /skills[^.;]*disabl[a-z]*/) ? 0 : 1
392
- }
393
- ' <<<"$help_text"
366
+ plugin_manifest_ok() {
367
+ # Load an installed CCL plugin only when its manifest declares nothing but
368
+ # skills. Hooks, commands, agents, or MCP servers would add an executable
369
+ # surface the pinned `tools` set does not describe; such a plugin is simply
370
+ # not loaded, and the review proceeds without owner skills.
371
+ python3 - "$1" <<'PY_PLUGIN_MANIFEST' >/dev/null 2>&1
372
+ import json
373
+ from pathlib import Path
374
+ import sys
375
+
376
+ manifest = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
377
+ if not isinstance(manifest, dict):
378
+ raise SystemExit(1)
379
+ if {"agents", "commands", "hooks", "mcpServers"}.intersection(manifest):
380
+ raise SystemExit(1)
381
+ if manifest.get("skills") not in {"./skills", "./skills/"}:
382
+ raise SystemExit(1)
383
+ PY_PLUGIN_MANIFEST
394
384
  }
395
385
  run_claude_prompt_file() {
396
386
  local run_timeout_s="$1"
@@ -457,49 +447,35 @@ else
457
447
  emit_inconclusive_payload "Claude CLI cannot disable inherited user/project/local settings; setting-source isolation is required" capability_missing true fallback
458
448
  exit 2
459
449
  fi
460
- if has_help_flag "--safe-mode" && safe_mode_disables_skills; then
450
+ if has_help_flag "--safe-mode"; then
461
451
  flags+=(--safe-mode)
462
452
  else
463
- emit_inconclusive_payload "Claude CLI cannot prove that safe mode disables inherited Claude skills and customizations" capability_missing true fallback
453
+ emit_inconclusive_payload "Claude CLI has no --safe-mode; inherited customizations cannot be isolated" capability_missing true fallback
464
454
  exit 2
465
455
  fi
466
- if [ "$review_skill_count" -gt 0 ]; then
467
- if ! has_help_flag "--max-budget-usd"; then
468
- emit_inconclusive_payload "Claude CLI cannot produce a bounded host-vocabulary baseline" capability_missing true fallback
469
- exit 2
470
- fi
471
- if has_help_flag "--plugin-dir"; then
472
- ccl_plugin_root="$(cd "$skill_registry_root/.." && pwd -P)" \
473
- || { emit_inconclusive_payload "cannot resolve installed CCL skill plugin" local_tool_failure false stop_reviewer_lane; exit 2; }
474
- [ -f "$ccl_plugin_root/.claude-plugin/plugin.json" ] && [ ! -L "$ccl_plugin_root/.claude-plugin/plugin.json" ] \
475
- || { emit_inconclusive_payload "installed CCL skill plugin is unavailable" capability_missing true fallback; exit 2; }
476
- if ! python3 - "$ccl_plugin_root/.claude-plugin/plugin.json" <<'PY_PLUGIN_MANIFEST' >/dev/null 2>&1
477
- import json
478
- from pathlib import Path
479
- import sys
480
-
481
- manifest = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
482
- if not isinstance(manifest, dict):
483
- raise SystemExit(1)
484
- if {"agents", "commands", "hooks", "mcpServers"}.intersection(manifest):
485
- raise SystemExit(1)
486
- if manifest.get("skills") not in {"./skills", "./skills/"}:
487
- raise SystemExit(1)
488
- PY_PLUGIN_MANIFEST
489
- then
490
- emit_inconclusive_payload "installed CCL skill plugin declares an unsupported executable surface" capability_missing true fallback
491
- exit 2
492
- fi
456
+ # Owner skills ride on the installed CCL plugin. Anything that stops the plugin
457
+ # from loading -- no --plugin-dir on this CLI, no manifest, a manifest that
458
+ # declares executable surfaces -- costs the owner-skill binding, not the review.
459
+ plugin_loaded=0
460
+ if [ "$native_skill_binding" = "established" ]; then
461
+ ccl_plugin_root="$(cd "$skill_registry_root/.." 2>/dev/null && pwd -P || true)"
462
+ if has_help_flag "--plugin-dir" \
463
+ && [ -n "$ccl_plugin_root" ] \
464
+ && [ -f "$ccl_plugin_root/.claude-plugin/plugin.json" ] \
465
+ && [ ! -L "$ccl_plugin_root/.claude-plugin/plugin.json" ] \
466
+ && plugin_manifest_ok "$ccl_plugin_root/.claude-plugin/plugin.json"; then
493
467
  flags+=(--plugin-dir "$ccl_plugin_root")
468
+ plugin_loaded=1
494
469
  else
495
- emit_inconclusive_payload "Claude CLI cannot load the selected CCL skills natively" capability_missing true fallback
496
- exit 2
470
+ native_skill_binding="unavailable"
471
+ printf '%s\n' 'claude_review: installed CCL skill plugin cannot be loaded by this Claude CLI; reviewing without native owner skills' >&2
497
472
  fi
498
- elif has_help_flag "--disable-slash-commands"; then
473
+ fi
474
+ # Skills and commands the host lists are vocabulary, not capability: they are
475
+ # invocable only through a tool, and the exact tool set is pinned separately.
476
+ # Disabling them is tidiness when the CLI offers it, never a prerequisite.
477
+ if [ "$plugin_loaded" -eq 0 ] && has_help_flag "--disable-slash-commands"; then
499
478
  flags+=(--disable-slash-commands)
500
- else
501
- emit_inconclusive_payload "Claude CLI cannot disable Claude skills and commands; command isolation is required" capability_missing true fallback
502
- exit 2
503
479
  fi
504
480
  export CLAUDE_CODE_DISABLE_AUTO_MEMORY=1
505
481
  export CLAUDE_CODE_DISABLE_CLAUDE_MDS=1
@@ -554,7 +530,7 @@ if ! has_help_flag "--output-format" || ! has_help_flag "--verbose"; then
554
530
  fi
555
531
  export CLAUDE_REVIEW_WRAPPER_MODE="$mode"
556
532
 
557
- # Validate every helper before the owner-aware host-vocabulary probe. A missing
533
+ # Validate every helper before the formal invocation. A missing
558
534
  # parser must stop locally rather than spending a provider request and only then
559
535
  # discovering that the resulting boundary evidence cannot be checked.
560
536
  if [ ! -r "$runtime_parser" ]; then
@@ -579,22 +555,10 @@ output_file="$(make_temp_file claude-review-output)"
579
555
  err_file="$(make_temp_file claude-review-error)"
580
556
  parsed_file="$(make_temp_file claude-review-parsed)"
581
557
  reply_text_file="$(make_temp_file claude-review-reply-text)"
582
- host_baseline_prompt_file="$(make_temp_file claude-review-host-baseline-prompt)"
583
- host_baseline_output_file="$(make_temp_file claude-review-host-baseline-output)"
584
- host_baseline_err_file="$(make_temp_file claude-review-host-baseline-error)"
585
- host_baseline_cwd=""
586
558
  formal_timeout_s="$timeout_s"
587
- chmod 600 "$prompt_file" "$output_file" "$err_file" "$parsed_file" "$reply_text_file" \
588
- "$host_baseline_prompt_file" "$host_baseline_output_file" "$host_baseline_err_file"
559
+ chmod 600 "$prompt_file" "$output_file" "$err_file" "$parsed_file" "$reply_text_file"
589
560
  cleanup() {
590
- rm -f "$prompt_file" "$output_file" "$err_file" "$parsed_file" "$reply_text_file" \
591
- "$host_baseline_prompt_file" "$host_baseline_output_file" "$host_baseline_err_file"
592
- if [ -n "$host_baseline_cwd" ]; then
593
- case "${host_baseline_cwd##*/}" in
594
- claude-review-host-baseline-cwd.*) rm -rf -- "$host_baseline_cwd" ;;
595
- *) rmdir "$host_baseline_cwd" 2>/dev/null || true ;;
596
- esac
597
- fi
561
+ rm -f "$prompt_file" "$output_file" "$err_file" "$parsed_file" "$reply_text_file"
598
562
  }
599
563
  trap cleanup EXIT
600
564
  signal_inconclusive() {
@@ -604,105 +568,6 @@ signal_inconclusive() {
604
568
  }
605
569
  trap signal_inconclusive TERM INT HUP
606
570
 
607
- if [ "$review_skill_count" -gt 0 ]; then
608
- # Keep the baseline's own prerequisites explicit at the call site. The main
609
- # invocation already requires these flags above; repeating the check here
610
- # prevents a future refactor from making host vocabulary less strict.
611
- for required_baseline_flag in \
612
- --tools --strict-mcp-config --mcp-config --setting-sources --safe-mode
613
- do
614
- if ! has_help_flag "$required_baseline_flag"; then
615
- emit_inconclusive_payload "Claude CLI cannot isolate the host-vocabulary baseline; required flag unavailable: $required_baseline_flag" capability_missing true fallback
616
- exit 2
617
- fi
618
- done
619
- host_baseline_cwd="$(mktemp -d "${TMPDIR:-/tmp}/claude-review-host-baseline-cwd.XXXXXX")" \
620
- || { emit_inconclusive_payload "cannot create isolated Claude host-vocabulary baseline directory" local_tool_failure false stop_reviewer_lane; exit 2; }
621
- chmod 700 "$host_baseline_cwd" \
622
- || { emit_inconclusive_payload "cannot secure isolated Claude host-vocabulary baseline directory" local_tool_failure false stop_reviewer_lane; exit 2; }
623
- printf '%s\n' 'Return a short acknowledgement.' > "$host_baseline_prompt_file"
624
- host_baseline_flags=(
625
- --print
626
- --tools ""
627
- --strict-mcp-config
628
- --mcp-config '{"mcpServers":{}}'
629
- --setting-sources ""
630
- --safe-mode
631
- --output-format stream-json
632
- --verbose
633
- --max-budget-usd 0.000001
634
- )
635
- if has_help_flag "--no-session-persistence"; then
636
- host_baseline_flags+=(--no-session-persistence)
637
- fi
638
- if has_help_flag "--effort"; then
639
- host_baseline_flags+=(--effort low)
640
- fi
641
- host_baseline_timeout_s="$timeout_s"
642
- if [ "$host_baseline_timeout_s" -gt 30 ]; then
643
- host_baseline_timeout_s=30
644
- fi
645
- host_baseline_started=$SECONDS
646
- set +e
647
- (
648
- cd "$host_baseline_cwd" \
649
- && run_claude_prompt_file \
650
- "$host_baseline_timeout_s" \
651
- "$host_baseline_output_file" \
652
- "$host_baseline_err_file" \
653
- "$host_baseline_prompt_file" \
654
- "$claude_bin_path" "${host_baseline_flags[@]}"
655
- )
656
- host_baseline_rc=$?
657
- set -e
658
- if [ "$host_baseline_rc" -eq "$capture_signal_rc" ]; then
659
- emit_inconclusive_payload "Claude host-vocabulary baseline was terminated by a signal" operator_interrupt false stop_reviewer_lane
660
- exit 2
661
- fi
662
- if [ "$host_baseline_rc" -eq "$capture_timeout_rc" ]; then
663
- emit_inconclusive_payload "Claude host-vocabulary baseline timed out" timeout true fallback
664
- exit 2
665
- fi
666
- # This detects writes only inside the isolated cwd; it is not proof that the
667
- # CLI made no writes elsewhere. External authority is constrained separately
668
- # by the required isolation flags and the validated zero-tool init surface.
669
- if [ -n "$(find "$host_baseline_cwd" -mindepth 1 -print -quit 2>/dev/null)" ]; then
670
- # This acknowledgement-only baseline never sees candidate bytes or concern
671
- # evidence. Refuse its vocabulary, but let an independent reviewer continue.
672
- emit_inconclusive_payload "Claude host-vocabulary baseline wrote into its isolated working directory" capability_missing true fallback
673
- exit 2
674
- fi
675
- set +e
676
- host_baseline_validation="$(
677
- python3 "$runtime_parser" \
678
- "$host_baseline_rc" \
679
- "$host_baseline_output_file" \
680
- "$host_baseline_err_file" \
681
- --validate-host-init-baseline
682
- )"
683
- host_baseline_validation_rc=$?
684
- set -e
685
- if [ "$host_baseline_validation_rc" -ne 0 ]; then
686
- host_baseline_reason="$(python3 - "$host_baseline_validation" <<'PY_HOST_BASELINE_REASON'
687
- import json
688
- import sys
689
-
690
- try:
691
- print(json.loads(sys.argv[1]).get("reason") or "Claude host-vocabulary baseline is invalid")
692
- except json.JSONDecodeError:
693
- print("Claude host-vocabulary baseline is invalid")
694
- PY_HOST_BASELINE_REASON
695
- )"
696
- emit_inconclusive_payload "$host_baseline_reason" capability_missing true fallback
697
- exit 2
698
- fi
699
- formal_timeout_s=$((timeout_s - (SECONDS - wrapper_started)))
700
- if [ "$formal_timeout_s" -lt 1 ]; then
701
- emit_inconclusive_payload "Claude host-vocabulary baseline exhausted the review timeout" timeout true fallback
702
- exit 2
703
- fi
704
- fi
705
-
706
571
  if [ "$no_tools_mode" -eq 1 ]; then
707
572
  no_tool_scope_verb="review"
708
573
  if [ "$mode" = "challenge" ]; then
@@ -1017,17 +882,6 @@ last_reason=""
1017
882
  last_reason_code="unknown"
1018
883
  last_fallback_eligible=false
1019
884
  last_next_action=stop_reviewer_lane
1020
- runtime_skill_args=()
1021
- native_skill_binding="not_requested"
1022
- if [ "$review_skill_count" -gt 0 ]; then
1023
- native_skill_binding="established"
1024
- native_skill_csv="$(IFS=,; printf '%s' "${registry_native_skills[*]}")"
1025
- required_native_skill_csv="$(IFS=,; printf '%s' "${review_skills[*]}")"
1026
- runtime_skill_args=(
1027
- --expected-native-skills "$native_skill_csv"
1028
- --required-native-skills "$required_native_skill_csv"
1029
- )
1030
- fi
1031
885
  while [ "$attempts" -lt "$max_attempts" ]; do
1032
886
  attempts=$((attempts + 1))
1033
887
  formal_timeout_s=$((timeout_s - (SECONDS - wrapper_started)))
@@ -1063,12 +917,9 @@ while [ "$attempts" -lt "$max_attempts" ]; do
1063
917
  main_runtime_args=(
1064
918
  --require-empty-init
1065
919
  --expected-tools "$main_expected_tools"
1066
- ${runtime_skill_args[@]+"${runtime_skill_args[@]}"}
920
+ --allow-expected-tool-use
921
+ --runtime-surface-only
1067
922
  )
1068
- if [ "$review_skill_count" -gt 0 ]; then
1069
- main_runtime_args+=(--host-init-baseline "$host_baseline_output_file")
1070
- fi
1071
- main_runtime_args+=(--allow-expected-tool-use --runtime-surface-only)
1072
923
  if ! main_runtime_result="$(python3 "$runtime_parser" "$rc" "$output_file" "$err_file" "${main_runtime_args[@]}")"; then
1073
924
  main_runtime_reason="$(python3 - "$main_runtime_result" <<'PY_REASON'
1074
925
  import json