@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.
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +19 -24
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +32 -32
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/manual-invocation-and-prompts.md +16 -14
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +24 -26
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/AGENTS.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +60 -209
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/init_policy_matrix.py +114 -367
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/parse_probe_result.py +52 -672
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +10 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/runtime-surface-verification-design.md +4 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +77 -444
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_init_policy_matrix.sh +33 -98
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_probe_result.sh +57 -173
- package/dist/assets/marketplace/plugins/ccl-skills/skills/defect-diagnosis/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/grill-me/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/rd-standards-doc-family-checklist.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-baseline/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-doc-writer/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/requirement-scope/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +14 -41
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/attention-budget-ratchet.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/correction-routing-map.md +22 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +7 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/description-authoring.md +26 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +8 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +7 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +4 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md +8 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/incident-postmortem-extraction.md +8 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/rule-consolidation.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +73 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/entrypoint_form_census.py +169 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-routing-bank.rb +62 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +114 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/reference-access-census.sh +157 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/review_ledger_binding.py +483 -109
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +188 -14
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +10 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_entrypoint_form_census.sh +174 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_eval_routing_bank_resolution.sh +253 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_verdict_differential.sh +49 -25
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_reference_access_census.sh +209 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_review_ledger_binding.sh +394 -5
- package/dist/assets/release.json +77 -47
- package/package.json +1 -1
package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh
CHANGED
|
@@ -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
|
|
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
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
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"
|
|
450
|
+
if has_help_flag "--safe-mode"; then
|
|
461
451
|
flags+=(--safe-mode)
|
|
462
452
|
else
|
|
463
|
-
emit_inconclusive_payload "Claude CLI
|
|
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
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
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
|
-
|
|
496
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|