diff --git a/Makefile b/Makefile index 0250b905..7901605a 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ html-rendering-check: skill-ir-check: $(PYTHON) tests/verify_skill_ir.py + $(PYTHON) tests/verify_skill_ir_paths.py compiler-check: $(PYTHON) tests/verify_compile_skill.py diff --git a/registry/index.json b/registry/index.json index 28bc960c..8a6387a0 100644 --- a/registry/index.json +++ b/registry/index.json @@ -16,7 +16,7 @@ "vscode" ], "package_metadata": "registry/packages/yao-meta-skill.json", - "package_sha256": "7734802eb54b761e419b62d6d7e0d5861aa10401b8e8cf956934e51f9b87ba0d" + "package_sha256": "836b5ebaf4a608a1a89fa84306ab9b4bb7e0555c74b6ca8e572ffb1833cc0f8c" } ] } diff --git a/registry/packages/yao-meta-skill.json b/registry/packages/yao-meta-skill.json index 33ac6cf1..709644c9 100644 --- a/registry/packages/yao-meta-skill.json +++ b/registry/packages/yao-meta-skill.json @@ -16,8 +16,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "7734802eb54b761e419b62d6d7e0d5861aa10401b8e8cf956934e51f9b87ba0d", - "archive_sha256": "1727ee08ba08d88ca55122937ec07dabb2a8a515acc5c6e375052554335da296" + "package_sha256": "836b5ebaf4a608a1a89fa84306ab9b4bb7e0555c74b6ca8e572ffb1833cc0f8c", + "archive_sha256": "ed1bc47c56c8d247bf5dd351bf29201e60471b4785a86e16ae1ede5e71d1582f" }, "compatibility": { "openai": "pass", @@ -48,7 +48,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "1727ee08ba08d88ca55122937ec07dabb2a8a515acc5c6e375052554335da296", + "archive_sha256": "ed1bc47c56c8d247bf5dd351bf29201e60471b4785a86e16ae1ede5e71d1582f", "package_verification": "reports/package_verification.json", "install_simulated": true, "install_simulation": "reports/install_simulation.json" diff --git a/reports/architecture_maintainability.json b/reports/architecture_maintainability.json index f65b1e25..ebc88024 100644 --- a/reports/architecture_maintainability.json +++ b/reports/architecture_maintainability.json @@ -4,10 +4,10 @@ "generated_at": "2026-06-16", "skill_dir": ".", "summary": { - "python_file_count": 177, - "script_file_count": 113, - "test_file_count": 64, - "internal_module_count": 33, + "python_file_count": 179, + "script_file_count": 114, + "test_file_count": 65, + "internal_module_count": 34, "cli_script_count": 82, "command_handler_count": 65, "entrypoint_command_handler_count": 18, @@ -31,18 +31,11 @@ }, { "path": "scripts/render_evidence_consistency.py", - "lines": 871, + "lines": 850, "kind": "cli-script", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, - { - "path": "scripts/skill_report_model.py", - "lines": 828, - "kind": "internal-module", - "severity": "pass", - "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." - }, { "path": "scripts/yao_cli_parser.py", "lines": 822, @@ -57,6 +50,13 @@ "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, + { + "path": "scripts/skill_report_model.py", + "lines": 800, + "kind": "internal-module", + "severity": "pass", + "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." + }, { "path": "tests/verify_review_studio.py", "lines": 766, @@ -65,15 +65,15 @@ "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, { - "path": "scripts/compile_skill.py", - "lines": 734, + "path": "scripts/build_skill_atlas.py", + "lines": 730, "kind": "cli-script", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, { - "path": "scripts/build_skill_atlas.py", - "lines": 730, + "path": "scripts/compile_skill.py", + "lines": 723, "kind": "cli-script", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." @@ -117,18 +117,11 @@ }, { "path": "scripts/render_evidence_consistency.py", - "lines": 871, + "lines": 850, "kind": "cli-script", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, - { - "path": "scripts/skill_report_model.py", - "lines": 828, - "kind": "internal-module", - "severity": "pass", - "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." - }, { "path": "scripts/yao_cli_parser.py", "lines": 822, @@ -143,6 +136,13 @@ "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, + { + "path": "scripts/skill_report_model.py", + "lines": 800, + "kind": "internal-module", + "severity": "pass", + "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." + }, { "path": "tests/verify_review_studio.py", "lines": 766, @@ -151,15 +151,15 @@ "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, { - "path": "scripts/compile_skill.py", - "lines": 734, + "path": "scripts/build_skill_atlas.py", + "lines": 730, "kind": "cli-script", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, { - "path": "scripts/build_skill_atlas.py", - "lines": 730, + "path": "scripts/compile_skill.py", + "lines": 723, "kind": "cli-script", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." diff --git a/reports/architecture_maintainability.md b/reports/architecture_maintainability.md index 254ce4e6..4184de6a 100644 --- a/reports/architecture_maintainability.md +++ b/reports/architecture_maintainability.md @@ -5,10 +5,10 @@ Generated at: `2026-06-16` ## Summary - decision: `pass` -- python files: `177` -- scripts: `113` -- tests: `64` -- internal modules: `33` +- python files: `179` +- scripts: `114` +- tests: `65` +- internal modules: `34` - CLI scripts: `82` - Yao CLI command handlers: `65` - entrypoint command handlers: `18` @@ -30,13 +30,13 @@ No file-size hotspots found. | File | Lines | Kind | Recommended next split | | --- | ---: | --- | --- | | `tests/verify_yao_cli.py` | `899` | `test` | Break broad integration assertions into focused verifier helpers when the next behavior change lands. | -| `scripts/render_evidence_consistency.py` | `871` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | -| `scripts/skill_report_model.py` | `828` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | +| `scripts/render_evidence_consistency.py` | `850` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/yao_cli_parser.py` | `822` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/skill_report_layout.py` | `808` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | +| `scripts/skill_report_model.py` | `800` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `tests/verify_review_studio.py` | `766` | `test` | Break broad integration assertions into focused verifier helpers when the next behavior change lands. | -| `scripts/compile_skill.py` | `734` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/build_skill_atlas.py` | `730` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | +| `scripts/compile_skill.py` | `723` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/optimize_description.py` | `723` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | ## Largest Files @@ -44,13 +44,13 @@ No file-size hotspots found. | File | Lines | Kind | Severity | | --- | ---: | --- | --- | | `tests/verify_yao_cli.py` | `899` | `test` | `pass` | -| `scripts/render_evidence_consistency.py` | `871` | `cli-script` | `pass` | -| `scripts/skill_report_model.py` | `828` | `internal-module` | `pass` | +| `scripts/render_evidence_consistency.py` | `850` | `cli-script` | `pass` | | `scripts/yao_cli_parser.py` | `822` | `internal-module` | `pass` | | `scripts/skill_report_layout.py` | `808` | `internal-module` | `pass` | +| `scripts/skill_report_model.py` | `800` | `internal-module` | `pass` | | `tests/verify_review_studio.py` | `766` | `test` | `pass` | -| `scripts/compile_skill.py` | `734` | `cli-script` | `pass` | | `scripts/build_skill_atlas.py` | `730` | `cli-script` | `pass` | +| `scripts/compile_skill.py` | `723` | `cli-script` | `pass` | | `scripts/optimize_description.py` | `723` | `cli-script` | `pass` | | `scripts/trust_check.py` | `714` | `internal-module` | `pass` | | `scripts/apply_adaptation.py` | `706` | `cli-script` | `pass` | diff --git a/reports/compiled_targets.json b/reports/compiled_targets.json index 7599bed1..c53dc830 100644 --- a/reports/compiled_targets.json +++ b/reports/compiled_targets.json @@ -149,6 +149,7 @@ ], "scripts": [ "scripts/adjudicate_output_review.py", + "scripts/apply_adaptation.py", "scripts/build_confusion_matrix.py", "scripts/build_skill_atlas.py", "scripts/check_update.py", @@ -160,6 +161,8 @@ "scripts/cross_packager.py", "scripts/diff_eval.py", "scripts/emit_telemetry_event.py", + "scripts/evidence_consistency_release.py", + "scripts/evidence_consistency_world_class.py", "scripts/export_skill_ir.py", "scripts/github_benchmark_scan.py", "scripts/governance_check.py", @@ -213,6 +216,7 @@ "scripts/render_world_class_evidence_ledger.py", "scripts/render_world_class_evidence_plan.py", "scripts/render_world_class_operator_runbook.py", + "scripts/render_world_class_preflight.py", "scripts/render_world_class_submission_review.py", "scripts/resource_boundary_check.py", "scripts/review_studio_action_evidence.py", @@ -227,7 +231,37 @@ "scripts/review_viewer_data.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", - "scripts/run_eval_suite.py" + "scripts/run_eval_suite.py", + "scripts/run_output_eval.py", + "scripts/run_output_execution.py", + "scripts/simulate_install.py", + "scripts/skill_ir_paths.py", + "scripts/skill_report_charts.py", + "scripts/skill_report_i18n.py", + "scripts/skill_report_layout.py", + "scripts/skill_report_metrics.py", + "scripts/skill_report_model.py", + "scripts/skill_report_world_class.py", + "scripts/summarize_user_signals.py", + "scripts/sync_local_install.py", + "scripts/telemetry_native_host.py", + "scripts/trigger_eval.py", + "scripts/trust_check.py", + "scripts/upgrade_check.py", + "scripts/validate_skill.py", + "scripts/verify_package.py", + "scripts/world_class_evidence_contract.py", + "scripts/world_class_source_checks.py", + "scripts/yao.py", + "scripts/yao_cli_adaptation_commands.py", + "scripts/yao_cli_config.py", + "scripts/yao_cli_create_commands.py", + "scripts/yao_cli_distribution_commands.py", + "scripts/yao_cli_output_commands.py", + "scripts/yao_cli_parser.py", + "scripts/yao_cli_report_commands.py", + "scripts/yao_cli_runtime.py", + "scripts/yao_cli_telemetry.py" ], "assets": [ "templates/basic_skill.md.j2", @@ -280,7 +314,7 @@ ], "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 } @@ -548,7 +582,7 @@ "strategy": "Ship the neutral source tree and expose OpenAI-facing interface metadata as a generated companion file.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -559,7 +593,7 @@ }, "scripts": { "strategy": "Keep scripts as local package resources; expose help-smoke and permission metadata for reviewer approval before execution.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -799,7 +833,7 @@ "strategy": "Ship the neutral source tree and expose OpenAI-facing interface metadata as a generated companion file.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -810,7 +844,7 @@ }, "scripts": { "strategy": "Keep scripts as local package resources; expose help-smoke and permission metadata for reviewer approval before execution.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -1016,6 +1050,7 @@ ], "scripts": [ "scripts/adjudicate_output_review.py", + "scripts/apply_adaptation.py", "scripts/build_confusion_matrix.py", "scripts/build_skill_atlas.py", "scripts/check_update.py", @@ -1027,6 +1062,8 @@ "scripts/cross_packager.py", "scripts/diff_eval.py", "scripts/emit_telemetry_event.py", + "scripts/evidence_consistency_release.py", + "scripts/evidence_consistency_world_class.py", "scripts/export_skill_ir.py", "scripts/github_benchmark_scan.py", "scripts/governance_check.py", @@ -1080,6 +1117,7 @@ "scripts/render_world_class_evidence_ledger.py", "scripts/render_world_class_evidence_plan.py", "scripts/render_world_class_operator_runbook.py", + "scripts/render_world_class_preflight.py", "scripts/render_world_class_submission_review.py", "scripts/resource_boundary_check.py", "scripts/review_studio_action_evidence.py", @@ -1094,7 +1132,37 @@ "scripts/review_viewer_data.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", - "scripts/run_eval_suite.py" + "scripts/run_eval_suite.py", + "scripts/run_output_eval.py", + "scripts/run_output_execution.py", + "scripts/simulate_install.py", + "scripts/skill_ir_paths.py", + "scripts/skill_report_charts.py", + "scripts/skill_report_i18n.py", + "scripts/skill_report_layout.py", + "scripts/skill_report_metrics.py", + "scripts/skill_report_model.py", + "scripts/skill_report_world_class.py", + "scripts/summarize_user_signals.py", + "scripts/sync_local_install.py", + "scripts/telemetry_native_host.py", + "scripts/trigger_eval.py", + "scripts/trust_check.py", + "scripts/upgrade_check.py", + "scripts/validate_skill.py", + "scripts/verify_package.py", + "scripts/world_class_evidence_contract.py", + "scripts/world_class_source_checks.py", + "scripts/yao.py", + "scripts/yao_cli_adaptation_commands.py", + "scripts/yao_cli_config.py", + "scripts/yao_cli_create_commands.py", + "scripts/yao_cli_distribution_commands.py", + "scripts/yao_cli_output_commands.py", + "scripts/yao_cli_parser.py", + "scripts/yao_cli_report_commands.py", + "scripts/yao_cli_runtime.py", + "scripts/yao_cli_telemetry.py" ], "assets": [ "templates/basic_skill.md.j2", @@ -1147,7 +1215,7 @@ ], "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 } @@ -1415,7 +1483,7 @@ "strategy": "Preserve the source tree directly; write target notes in targets/claude/README.md.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -1426,7 +1494,7 @@ }, "scripts": { "strategy": "Scripts remain local package resources and must be reviewed through trust and permission reports before use.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -1666,7 +1734,7 @@ "strategy": "Preserve the source tree directly; write target notes in targets/claude/README.md.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -1677,7 +1745,7 @@ }, "scripts": { "strategy": "Scripts remain local package resources and must be reviewed through trust and permission reports before use.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -1883,6 +1951,7 @@ ], "scripts": [ "scripts/adjudicate_output_review.py", + "scripts/apply_adaptation.py", "scripts/build_confusion_matrix.py", "scripts/build_skill_atlas.py", "scripts/check_update.py", @@ -1894,6 +1963,8 @@ "scripts/cross_packager.py", "scripts/diff_eval.py", "scripts/emit_telemetry_event.py", + "scripts/evidence_consistency_release.py", + "scripts/evidence_consistency_world_class.py", "scripts/export_skill_ir.py", "scripts/github_benchmark_scan.py", "scripts/governance_check.py", @@ -1947,6 +2018,7 @@ "scripts/render_world_class_evidence_ledger.py", "scripts/render_world_class_evidence_plan.py", "scripts/render_world_class_operator_runbook.py", + "scripts/render_world_class_preflight.py", "scripts/render_world_class_submission_review.py", "scripts/resource_boundary_check.py", "scripts/review_studio_action_evidence.py", @@ -1961,7 +2033,37 @@ "scripts/review_viewer_data.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", - "scripts/run_eval_suite.py" + "scripts/run_eval_suite.py", + "scripts/run_output_eval.py", + "scripts/run_output_execution.py", + "scripts/simulate_install.py", + "scripts/skill_ir_paths.py", + "scripts/skill_report_charts.py", + "scripts/skill_report_i18n.py", + "scripts/skill_report_layout.py", + "scripts/skill_report_metrics.py", + "scripts/skill_report_model.py", + "scripts/skill_report_world_class.py", + "scripts/summarize_user_signals.py", + "scripts/sync_local_install.py", + "scripts/telemetry_native_host.py", + "scripts/trigger_eval.py", + "scripts/trust_check.py", + "scripts/upgrade_check.py", + "scripts/validate_skill.py", + "scripts/verify_package.py", + "scripts/world_class_evidence_contract.py", + "scripts/world_class_source_checks.py", + "scripts/yao.py", + "scripts/yao_cli_adaptation_commands.py", + "scripts/yao_cli_config.py", + "scripts/yao_cli_create_commands.py", + "scripts/yao_cli_distribution_commands.py", + "scripts/yao_cli_output_commands.py", + "scripts/yao_cli_parser.py", + "scripts/yao_cli_report_commands.py", + "scripts/yao_cli_runtime.py", + "scripts/yao_cli_telemetry.py" ], "assets": [ "templates/basic_skill.md.j2", @@ -2014,7 +2116,7 @@ ], "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 } @@ -2282,7 +2384,7 @@ "strategy": "Preserve references, scripts, assets, evals, reports, and adapter metadata as relative package resources.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -2292,7 +2394,7 @@ }, "scripts": { "strategy": "Expose script and permission metadata for downstream clients or installers to enforce.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -2526,7 +2628,7 @@ "strategy": "Preserve references, scripts, assets, evals, reports, and adapter metadata as relative package resources.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -2536,7 +2638,7 @@ }, "scripts": { "strategy": "Expose script and permission metadata for downstream clients or installers to enforce.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -2734,6 +2836,7 @@ ], "scripts": [ "scripts/adjudicate_output_review.py", + "scripts/apply_adaptation.py", "scripts/build_confusion_matrix.py", "scripts/build_skill_atlas.py", "scripts/check_update.py", @@ -2745,6 +2848,8 @@ "scripts/cross_packager.py", "scripts/diff_eval.py", "scripts/emit_telemetry_event.py", + "scripts/evidence_consistency_release.py", + "scripts/evidence_consistency_world_class.py", "scripts/export_skill_ir.py", "scripts/github_benchmark_scan.py", "scripts/governance_check.py", @@ -2798,6 +2903,7 @@ "scripts/render_world_class_evidence_ledger.py", "scripts/render_world_class_evidence_plan.py", "scripts/render_world_class_operator_runbook.py", + "scripts/render_world_class_preflight.py", "scripts/render_world_class_submission_review.py", "scripts/resource_boundary_check.py", "scripts/review_studio_action_evidence.py", @@ -2812,7 +2918,37 @@ "scripts/review_viewer_data.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", - "scripts/run_eval_suite.py" + "scripts/run_eval_suite.py", + "scripts/run_output_eval.py", + "scripts/run_output_execution.py", + "scripts/simulate_install.py", + "scripts/skill_ir_paths.py", + "scripts/skill_report_charts.py", + "scripts/skill_report_i18n.py", + "scripts/skill_report_layout.py", + "scripts/skill_report_metrics.py", + "scripts/skill_report_model.py", + "scripts/skill_report_world_class.py", + "scripts/summarize_user_signals.py", + "scripts/sync_local_install.py", + "scripts/telemetry_native_host.py", + "scripts/trigger_eval.py", + "scripts/trust_check.py", + "scripts/upgrade_check.py", + "scripts/validate_skill.py", + "scripts/verify_package.py", + "scripts/world_class_evidence_contract.py", + "scripts/world_class_source_checks.py", + "scripts/yao.py", + "scripts/yao_cli_adaptation_commands.py", + "scripts/yao_cli_config.py", + "scripts/yao_cli_create_commands.py", + "scripts/yao_cli_distribution_commands.py", + "scripts/yao_cli_output_commands.py", + "scripts/yao_cli_parser.py", + "scripts/yao_cli_report_commands.py", + "scripts/yao_cli_runtime.py", + "scripts/yao_cli_telemetry.py" ], "assets": [ "templates/basic_skill.md.j2", @@ -2865,7 +3001,7 @@ ], "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 } @@ -3133,7 +3269,7 @@ "strategy": "Keep optional directories as relative resources next to SKILL.md.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -3144,7 +3280,7 @@ }, "scripts": { "strategy": "Scripts remain local optional resources and should advertise --help when executable.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -3377,7 +3513,7 @@ "strategy": "Keep optional directories as relative resources next to SKILL.md.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -3388,7 +3524,7 @@ }, "scripts": { "strategy": "Scripts remain local optional resources and should advertise --help when executable.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -3585,6 +3721,7 @@ ], "scripts": [ "scripts/adjudicate_output_review.py", + "scripts/apply_adaptation.py", "scripts/build_confusion_matrix.py", "scripts/build_skill_atlas.py", "scripts/check_update.py", @@ -3596,6 +3733,8 @@ "scripts/cross_packager.py", "scripts/diff_eval.py", "scripts/emit_telemetry_event.py", + "scripts/evidence_consistency_release.py", + "scripts/evidence_consistency_world_class.py", "scripts/export_skill_ir.py", "scripts/github_benchmark_scan.py", "scripts/governance_check.py", @@ -3649,6 +3788,7 @@ "scripts/render_world_class_evidence_ledger.py", "scripts/render_world_class_evidence_plan.py", "scripts/render_world_class_operator_runbook.py", + "scripts/render_world_class_preflight.py", "scripts/render_world_class_submission_review.py", "scripts/resource_boundary_check.py", "scripts/review_studio_action_evidence.py", @@ -3663,7 +3803,37 @@ "scripts/review_viewer_data.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", - "scripts/run_eval_suite.py" + "scripts/run_eval_suite.py", + "scripts/run_output_eval.py", + "scripts/run_output_execution.py", + "scripts/simulate_install.py", + "scripts/skill_ir_paths.py", + "scripts/skill_report_charts.py", + "scripts/skill_report_i18n.py", + "scripts/skill_report_layout.py", + "scripts/skill_report_metrics.py", + "scripts/skill_report_model.py", + "scripts/skill_report_world_class.py", + "scripts/summarize_user_signals.py", + "scripts/sync_local_install.py", + "scripts/telemetry_native_host.py", + "scripts/trigger_eval.py", + "scripts/trust_check.py", + "scripts/upgrade_check.py", + "scripts/validate_skill.py", + "scripts/verify_package.py", + "scripts/world_class_evidence_contract.py", + "scripts/world_class_source_checks.py", + "scripts/yao.py", + "scripts/yao_cli_adaptation_commands.py", + "scripts/yao_cli_config.py", + "scripts/yao_cli_create_commands.py", + "scripts/yao_cli_distribution_commands.py", + "scripts/yao_cli_output_commands.py", + "scripts/yao_cli_parser.py", + "scripts/yao_cli_report_commands.py", + "scripts/yao_cli_runtime.py", + "scripts/yao_cli_telemetry.py" ], "assets": [ "templates/basic_skill.md.j2", @@ -3716,7 +3886,7 @@ ], "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 } @@ -3984,7 +4154,7 @@ "strategy": "Install as project or user scoped skill source, preserving relative references and scripts.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -3995,7 +4165,7 @@ }, "scripts": { "strategy": "Scripts require workspace trust and operator/client approval outside this compiler.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { @@ -4232,7 +4402,7 @@ "strategy": "Install as project or user scoped skill source, preserving relative references and scripts.", "counts": { "references": 34, - "scripts": 80, + "scripts": 114, "assets": 2, "reports": 43 }, @@ -4243,7 +4413,7 @@ }, "scripts": { "strategy": "Scripts require workspace trust and operator/client approval outside this compiler.", - "script_count": 80, + "script_count": 114, "help_smoke_failed_count": 0 }, "permissions": { diff --git a/reports/install_simulation.json b/reports/install_simulation.json index 47384453..934c04eb 100644 --- a/reports/install_simulation.json +++ b/reports/install_simulation.json @@ -8,7 +8,7 @@ "installed_skill_dir": "dist/install-simulation/simulate-yao-meta-skill/yao-meta-skill", "summary": { "archive_present": true, - "archive_entry_count": 624, + "archive_entry_count": 626, "archive_extracted": true, "entrypoint_loaded": true, "manifest_loaded": true, diff --git a/reports/output_execution_runs.json b/reports/output_execution_runs.json index 135540e3..fde99a60 100644 --- a/reports/output_execution_runs.json +++ b/reports/output_execution_runs.json @@ -34,7 +34,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 27.46, + "duration_ms": 27.19, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -62,7 +62,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 25.99, + "duration_ms": 26.21, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -85,7 +85,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 26.34, + "duration_ms": 29.21, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -113,7 +113,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.02, + "duration_ms": 31.35, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -136,7 +136,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.3, + "duration_ms": 30.03, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -164,7 +164,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 27.13, + "duration_ms": 28.51, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -187,7 +187,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 26.18, + "duration_ms": 26.42, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -214,7 +214,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 26.0, + "duration_ms": 26.03, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -237,7 +237,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 25.57, + "duration_ms": 26.05, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -266,7 +266,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 25.78, + "duration_ms": 26.28, "provider": "local-output-eval-runner", "model": "", "usage": { diff --git a/reports/output_execution_runs.md b/reports/output_execution_runs.md index 6cf854df..ca2aa8fc 100644 --- a/reports/output_execution_runs.md +++ b/reports/output_execution_runs.md @@ -23,16 +23,16 @@ Command runner evidence is present. This proves the eval harness executed an ext | Case | Variant | Mode | Model | Duration ms | Tokens | Score | Status | | --- | --- | --- | --- | ---: | ---: | ---: | --- | -| skill-package-contract | baseline | command | local-output-eval-runner | 27.46 | 33 | 0.0 | pass | -| skill-package-contract | with_skill | command | local-output-eval-runner | 25.99 | 73 | 100.0 | pass | -| output-eval-expectation | baseline | command | local-output-eval-runner | 26.34 | 36 | 0.0 | pass | -| output-eval-expectation | with_skill | command | local-output-eval-runner | 29.02 | 80 | 100.0 | pass | -| ir-before-packaging | baseline | command | local-output-eval-runner | 29.3 | 33 | 0.0 | pass | -| ir-before-packaging | with_skill | command | local-output-eval-runner | 27.13 | 80 | 100.0 | pass | -| near-neighbor-boundary | baseline | command | local-output-eval-runner | 26.18 | 36 | 0.0 | pass | -| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 26.0 | 65 | 100.0 | pass | -| file-backed-governed-package | baseline | command | local-output-eval-runner | 25.57 | 37 | 0.0 | pass | -| file-backed-governed-package | with_skill | command | local-output-eval-runner | 25.78 | 98 | 100.0 | pass | +| skill-package-contract | baseline | command | local-output-eval-runner | 27.19 | 33 | 0.0 | pass | +| skill-package-contract | with_skill | command | local-output-eval-runner | 26.21 | 73 | 100.0 | pass | +| output-eval-expectation | baseline | command | local-output-eval-runner | 29.21 | 36 | 0.0 | pass | +| output-eval-expectation | with_skill | command | local-output-eval-runner | 31.35 | 80 | 100.0 | pass | +| ir-before-packaging | baseline | command | local-output-eval-runner | 30.03 | 33 | 0.0 | pass | +| ir-before-packaging | with_skill | command | local-output-eval-runner | 28.51 | 80 | 100.0 | pass | +| near-neighbor-boundary | baseline | command | local-output-eval-runner | 26.42 | 36 | 0.0 | pass | +| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 26.03 | 65 | 100.0 | pass | +| file-backed-governed-package | baseline | command | local-output-eval-runner | 26.05 | 37 | 0.0 | pass | +| file-backed-governed-package | with_skill | command | local-output-eval-runner | 26.28 | 98 | 100.0 | pass | ## Next Fixes diff --git a/reports/package_verification.json b/reports/package_verification.json index 07cb474c..df87e4a7 100644 --- a/reports/package_verification.json +++ b/reports/package_verification.json @@ -8,8 +8,8 @@ "target_count": 4, "adapter_count": 4, "archive_present": true, - "archive_sha256": "1727ee08ba08d88ca55122937ec07dabb2a8a515acc5c6e375052554335da296", - "archive_entry_count": 624, + "archive_sha256": "ed1bc47c56c8d247bf5dd351bf29201e60471b4785a86e16ae1ede5e71d1582f", + "archive_entry_count": 626, "failure_count": 0, "warning_count": 0 }, diff --git a/reports/package_verification.md b/reports/package_verification.md index 563ac5fe..36c40d2f 100644 --- a/reports/package_verification.md +++ b/reports/package_verification.md @@ -4,7 +4,7 @@ - Package directory: `dist` - Targets: `4 / 4` adapters present - Archive present: `True` -- Archive SHA256: `1727ee08ba08d88ca55122937ec07dabb2a8a515acc5c6e375052554335da296` +- Archive SHA256: `ed1bc47c56c8d247bf5dd351bf29201e60471b4785a86e16ae1ede5e71d1582f` - Failures: `0` - Warnings: `0` diff --git a/reports/python_compatibility.json b/reports/python_compatibility.json index e87898f7..046b2c98 100644 --- a/reports/python_compatibility.json +++ b/reports/python_compatibility.json @@ -5,7 +5,7 @@ "root": ".", "summary": { "target_python": "3.11", - "file_count": 180, + "file_count": 182, "issue_count": 0, "syntax_error_count": 0, "fstring_311_violation_count": 0, @@ -562,6 +562,12 @@ "issue_count": 0, "issues": [] }, + { + "path": "scripts/skill_ir_paths.py", + "ok": true, + "issue_count": 0, + "issues": [] + }, { "path": "scripts/skill_report_charts.py", "ok": true, @@ -982,6 +988,12 @@ "issue_count": 0, "issues": [] }, + { + "path": "tests/verify_skill_ir_paths.py", + "ok": true, + "issue_count": 0, + "issues": [] + }, { "path": "tests/verify_skill_os2_audit.py", "ok": true, diff --git a/reports/python_compatibility.md b/reports/python_compatibility.md index e23add28..0a99e1b0 100644 --- a/reports/python_compatibility.md +++ b/reports/python_compatibility.md @@ -6,7 +6,7 @@ Generated at: `2026-06-16` - decision: `pass` - target python: `3.11` -- files scanned: `180` +- files scanned: `182` - issues: `0` - syntax errors: `0` - f-string 3.11 violations: `0` diff --git a/reports/registry_audit.json b/reports/registry_audit.json index 99475ad3..becb4e6c 100644 --- a/reports/registry_audit.json +++ b/reports/registry_audit.json @@ -21,8 +21,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "7734802eb54b761e419b62d6d7e0d5861aa10401b8e8cf956934e51f9b87ba0d", - "archive_sha256": "1727ee08ba08d88ca55122937ec07dabb2a8a515acc5c6e375052554335da296" + "package_sha256": "836b5ebaf4a608a1a89fa84306ab9b4bb7e0555c74b6ca8e572ffb1833cc0f8c", + "archive_sha256": "ed1bc47c56c8d247bf5dd351bf29201e60471b4785a86e16ae1ede5e71d1582f" }, "compatibility": { "openai": "pass", @@ -53,7 +53,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "1727ee08ba08d88ca55122937ec07dabb2a8a515acc5c6e375052554335da296", + "archive_sha256": "ed1bc47c56c8d247bf5dd351bf29201e60471b4785a86e16ae1ede5e71d1582f", "package_verification": "reports/package_verification.json", "install_simulated": true, "install_simulation": "reports/install_simulation.json" @@ -78,7 +78,7 @@ "vscode" ], "package_metadata": "registry/packages/yao-meta-skill.json", - "package_sha256": "7734802eb54b761e419b62d6d7e0d5861aa10401b8e8cf956934e51f9b87ba0d" + "package_sha256": "836b5ebaf4a608a1a89fa84306ab9b4bb7e0555c74b6ca8e572ffb1833cc0f8c" } ] }, diff --git a/reports/registry_audit.md b/reports/registry_audit.md index 0a7369b2..2c7da6ab 100644 --- a/reports/registry_audit.md +++ b/reports/registry_audit.md @@ -6,8 +6,8 @@ - Maturity: `governed` - Owner: `Yao Team` - License: `MIT` -- Package SHA256: `7734802eb54b761e419b62d6d7e0d5861aa10401b8e8cf956934e51f9b87ba0d` -- Archive SHA256: `1727ee08ba08d88ca55122937ec07dabb2a8a515acc5c6e375052554335da296` +- Package SHA256: `836b5ebaf4a608a1a89fa84306ab9b4bb7e0555c74b6ca8e572ffb1833cc0f8c` +- Archive SHA256: `ed1bc47c56c8d247bf5dd351bf29201e60471b4785a86e16ae1ede5e71d1582f` - Install simulated: `True` ## Compatibility diff --git a/reports/security_trust_report.json b/reports/security_trust_report.json index a2332f7f..bcf1f39a 100644 --- a/reports/security_trust_report.json +++ b/reports/security_trust_report.json @@ -2,9 +2,9 @@ "ok": true, "skill_dir": ".", "summary": { - "scanned_files": 200, - "script_count": 113, - "internal_module_count": 30, + "scanned_files": 201, + "script_count": 114, + "internal_module_count": 31, "secret_findings": 0, "dependency_files": [ "requirements-ci.txt" @@ -22,8 +22,8 @@ "help_smoke_failed_count": 0, "interactive_script_count": 0, "package_hash_scope": "source-contract-without-generated-reports", - "package_hash_file_count": 200, - "package_sha256": "7734802eb54b761e419b62d6d7e0d5861aa10401b8e8cf956934e51f9b87ba0d" + "package_hash_file_count": 201, + "package_sha256": "836b5ebaf4a608a1a89fa84306ab9b4bb7e0555c74b6ca8e572ffb1833cc0f8c" }, "failures": [], "warnings": [], @@ -1264,6 +1264,20 @@ "network_urls": [], "network_hosts": [] }, + { + "path": "scripts/skill_ir_paths.py", + "interface": "internal-module", + "interface_declared": true, + "interface_reason": "Imported by compiler, registry, conformance, and report scripts to locate canonical Skill IR artifacts.", + "has_argparse": false, + "has_main_guard": false, + "uses_input": false, + "uses_network": false, + "uses_file_write": false, + "uses_subprocess": false, + "network_urls": [], + "network_hosts": [] + }, { "path": "scripts/skill_report_charts.py", "interface": "internal-module", @@ -1663,7 +1677,7 @@ "checked_count": 83, "passed_count": 83, "failed_count": 0, - "skipped_count": 30, + "skipped_count": 31, "failed_scripts": [], "results": [ { @@ -2550,6 +2564,10 @@ "path": "scripts/review_viewer_data.py", "reason": "internal module" }, + { + "path": "scripts/skill_ir_paths.py", + "reason": "internal module" + }, { "path": "scripts/skill_report_charts.py", "reason": "internal module" diff --git a/reports/security_trust_report.md b/reports/security_trust_report.md index 72647220..8943315c 100644 --- a/reports/security_trust_report.md +++ b/reports/security_trust_report.md @@ -1,9 +1,9 @@ # Security Trust Report - OK: `True` -- Scanned files: `200` -- Scripts: `113` -- Internal script modules: `30` +- Scanned files: `201` +- Scripts: `114` +- Internal script modules: `31` - Secret findings: `0` - Network-capable scripts: `3` - Network policy covered scripts: `3` @@ -15,8 +15,8 @@ - CLI help smoke failures: `0` - Interactive scripts: `0` - Package hash scope: `source-contract-without-generated-reports` -- Package hash files: `200` -- Package SHA256: `7734802eb54b761e419b62d6d7e0d5861aa10401b8e8cf956934e51f9b87ba0d` +- Package hash files: `201` +- Package SHA256: `836b5ebaf4a608a1a89fa84306ab9b4bb7e0555c74b6ca8e572ffb1833cc0f8c` ## Failures @@ -149,6 +149,7 @@ | scripts/run_output_eval.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. | | scripts/run_output_execution.py | cli | False | True | True | False | False | True | True | Default CLI classification; add SCRIPT_INTERFACE for internal modules. | | scripts/simulate_install.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. | +| scripts/skill_ir_paths.py | internal-module | True | False | False | False | False | False | False | Imported by compiler, registry, conformance, and report scripts to locate canonical Skill IR artifacts. | | scripts/skill_report_charts.py | internal-module | True | False | False | False | False | False | False | Imported by render_skill_overview.py to render inline SVG report charts. | | scripts/skill_report_i18n.py | internal-module | True | False | False | False | False | False | False | Imported by render_skill_overview.py to keep bilingual report copy and fallback rules out of HTML rendering. | | scripts/skill_report_layout.py | internal-module | True | False | False | False | False | False | False | Imported by render_skill_overview.py to keep overview report layout and CSS out of data rendering. | diff --git a/reports/skill-os-2-review.md b/reports/skill-os-2-review.md index 31487260..220007eb 100644 --- a/reports/skill-os-2-review.md +++ b/reports/skill-os-2-review.md @@ -114,16 +114,16 @@ Next move: add real client or installer permission enforcement integration. | Output Eval | `5` cases, with-skill pass rate `100`, baseline pass rate `0`, with file-backed, near-neighbor, boundary coverage, `10` local command-runner execution runs, `0` recorded fixture runs, `0` provider model-executed runs in root release evidence, `10` estimated token counts, provider runner v0 available, `5` blind A/B review pairs, a generated `reports/output_review_decisions.json` template, `0 / 5` reviewer decisions pending, `0` answer keys revealed, and `5` pending answers hidden | | Runtime Conformance | `5 / 5` targets passing | | Target Compiler | `5 / 5` compiled target contracts generated for OpenAI, Claude, generic, Agent Skills compatible, and VS Code / Copilot outputs, including target permission contracts and target-native behavior contracts | -| Trust | `0` secret findings, `1` pinned dependency file, `30` declared internal modules, `3 / 3` network-capable scripts covered by bounded host policy, `83 / 83` CLI help smoke checks passing across `113` scripts, source-contract hash scope explicit | +| Trust | `0` secret findings, `1` pinned dependency file, `31` declared internal modules, `3 / 3` network-capable scripts covered by bounded host policy, `83 / 83` CLI help smoke checks passing across `114` scripts, source-contract hash scope explicit | | Permission Governance | `3 / 3` required high-permission capabilities approved, `0` missing, `0` invalid, `0` expired | | Runtime Permission Probes | `4 / 4` target adapters probed, `0` native-enforcement adapters, `4` explicit metadata fallbacks, `4` residual risks retained for reviewer visibility | | Skill Atlas | `12` scanned skills, `1` actionable root skill, `1` telemetry report, `0` actionable route collisions, `0` actionable owner gaps, `0` actionable stale skills, `0` actionable drift signals, `24` scoped non-actionable issue signals retained for visibility | | Registry Audit | package metadata generated with version, owner, license, source checksum, archive checksum, Skill IR provenance, and compatibility matrix | -| Package Verification | `4 / 4` target adapters present, archive verified, `624` zip entries, `0` failures, `0` warnings | -| Install Simulation | archive with `624` entries extracted into a local verification root, entrypoint/manifest/interface loaded, reports present, `4` adapters readable, `12` installer permission checks enforced, `0` permission failures, `0` failures, `0` warnings | +| Package Verification | `4 / 4` target adapters present, archive verified, `626` zip entries, `0` failures, `0` warnings | +| Install Simulation | archive with `626` entries extracted into a local verification root, entrypoint/manifest/interface loaded, reports present, `4` adapters readable, `12` installer permission checks enforced, `0` permission failures, `0` failures, `0` warnings | | Local Install Sync Preflight | `make sync-local-install` and `make sync-active-install` rebuild the package first, then sync only after install simulation passes with `12` enforced installer permission checks and `0` permission failures | | Upgrade Check | current package declares `minor` over the 1.0.0 baseline, recommended bump is `minor`, and release notes include added targets plus checksum changes | -| Adoption Drift | `1` metadata-only review event, `0` adoption samples, adoption `0`, risk band `low`; optional `yao.py` CLI capture, external client `telemetry-emit`, `5` `telemetry-hooks` recipes, Browser/Chrome native messaging host, and validated external JSONL import are available but off by default for reproducible release evidence; raw `reports/telemetry_events.jsonl` is gitignored and blocked from zip packages | +| Adoption Drift | `1` metadata-only review event, `1` adoption sample, adoption `100`, risk band `low`; optional `yao.py` CLI capture, external client `telemetry-emit`, `5` `telemetry-hooks` recipes, Browser/Chrome native messaging host, and validated external JSONL import are available but off by default for reproducible release evidence; raw `reports/telemetry_events.jsonl` is gitignored and blocked from zip packages | | Review Waivers | ledger generated; current release has `1` warning gate that still needs reviewer decision or a time-bounded waiver; blockers remain non-waivable in v0, and world-class evidence gaps must be closed with accepted evidence rather than waived as completed | | Review Annotations | ledger generated; current release has `0` reviewer annotations and `0` open annotation blockers | | Review Studio | decision `review`, world-class score `91`, `16` gates, `0` blockers, `3` warnings, `3` review actions, `0` open annotation blockers | diff --git a/reports/skill_atlas.json b/reports/skill_atlas.json index de52f6a2..f12ead15 100644 --- a/reports/skill_atlas.json +++ b/reports/skill_atlas.json @@ -151,6 +151,7 @@ "scripts/run_output_eval.py", "scripts/run_output_execution.py", "scripts/simulate_install.py", + "scripts/skill_ir_paths.py", "scripts/skill_report_charts.py", "scripts/skill_report_i18n.py", "scripts/skill_report_layout.py", diff --git a/reports/skill_os2_audit.json b/reports/skill_os2_audit.json index 36953dd1..7ad7693d 100644 --- a/reports/skill_os2_audit.json +++ b/reports/skill_os2_audit.json @@ -197,7 +197,7 @@ "key": "trust-security", "label": "Trust Security", "status": "pass", - "current": "secrets 0; scripts 113; help failures 0", + "current": "secrets 0; scripts 114; help failures 0", "target": "Secrets, scripts, dependencies, permissions, and package hash are reviewable", "evidence": [ { @@ -285,7 +285,7 @@ "key": "registry-distribution", "label": "Registry Distribution", "status": "pass", - "current": "zip entries 624; install failures 0; permission failures 0", + "current": "zip entries 626; install failures 0; permission failures 0", "target": "Package metadata, archive checksum, package verification, and install simulation pass", "evidence": [ { diff --git a/reports/skill_os2_audit.md b/reports/skill_os2_audit.md index 08cd0b73..ba924770 100644 --- a/reports/skill_os2_audit.md +++ b/reports/skill_os2_audit.md @@ -23,11 +23,11 @@ Generated at: `2026-06-16` | Human Adjudication | human-required | 0/5 decisions; pending 5 | Real reviewer decisions recorded before claiming output review completion | Record real A/B choices in the decision template, then regenerate adjudication. | | Benchmark Reproducibility | pass | artifacts 25; missing 0; failures 3 | Public methodology, reproducible commands, required artifacts, and failure disclosure are machine-checkable | Keep the manifest current with every benchmark, package, and release evidence change. | | Runtime Conformance | pass | 5/5 targets pass | Target package structure, metadata, relative paths, and degradation notes pass | Keep target conformance fixtures updated as platform contracts change. | -| Trust Security | pass | secrets 0; scripts 113; help failures 0 | Secrets, scripts, dependencies, permissions, and package hash are reviewable | Keep high-permission approvals scoped, expiring, and target-mapped. | +| Trust Security | pass | secrets 0; scripts 114; help failures 0 | Secrets, scripts, dependencies, permissions, and package hash are reviewable | Keep high-permission approvals scoped, expiring, and target-mapped. | | Permission Metadata | pass | 4/4 target probes pass; metadata fallback 4; installer enforcement 4 | Packaged adapters expose explicit permission metadata, residual risks, and installer enforcement evidence when available | Preserve residual-risk notes until real native enforcement exists. | | Native Permission Enforcement | external-required | native-enforced targets 0; installer-enforced targets 4 | At least one target/client enforces approved permissions at runtime | Integrate a real target-client or external installer runtime guard before claiming native permission enforcement. | | Skill Atlas | pass | 12 skills; actionable collisions 0 | Workspace catalog, route overlap, stale/owner gaps, drift, and no-route opportunities | Feed real drift data into Atlas once client telemetry is installed. | -| Registry Distribution | pass | zip entries 624; install failures 0; permission failures 0 | Package metadata, archive checksum, package verification, and install simulation pass | Regenerate registry after package verification so checksums stay aligned. | +| Registry Distribution | pass | zip entries 626; install failures 0; permission failures 0 | Package metadata, archive checksum, package verification, and install simulation pass | Regenerate registry after package verification so checksums stay aligned. | | Review Studio | pass | decision review; warnings 3; score 91 | One page shows gates, evidence paths, blockers, warnings, actions, waivers, and annotations | Resolve human/external warning gates before claiming full release readiness. | | Telemetry Drift | pass | events 1; risk low; recipes 5 | Local-first metadata-only event contract, aggregate drift report, hook recipes, and import path | Keep raw JSONL out of distributed packages and use aggregate reports for Atlas. | | Native Client Telemetry | external-required | external source events 0; adoption samples 0 | A real Browser/Chrome/provider client sends production metadata events | Install a real client against the native host and import production metadata-only events. | diff --git a/reports/skill_os2_coverage.json b/reports/skill_os2_coverage.json index 6f771630..04732a25 100644 --- a/reports/skill_os2_coverage.json +++ b/reports/skill_os2_coverage.json @@ -130,7 +130,7 @@ "label": "Trust Security", "status": "pass", "objective": "Scripts, dependencies, permissions, secrets, and package hash are reviewable for team distribution.", - "current": "113 scripts; secrets 0; help failures 0", + "current": "114 scripts; secrets 0; help failures 0", "command": "python3 scripts/yao.py trust .", "test": "python3 tests/verify_trust_check.py", "evidence": [ @@ -204,7 +204,7 @@ "label": "Registry Distribution", "status": "pass", "objective": "Skill packages are installable, versioned, checksumed, and upgrade-reviewable.", - "current": "archive entries 624; install failures 0", + "current": "archive entries 626; install failures 0", "command": "python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .", "test": "python3 tests/verify_registry_audit.py", "evidence": [ @@ -613,7 +613,7 @@ "label": "Evidence Consistency", "status": "pass", "objective": "Recommended Skill OS 2.0 implementation PR from the upgrade plan.", - "current": "33 consistency checks", + "current": "34 consistency checks", "command": "make ci-test", "test": "tests/verify_evidence_consistency.py", "evidence": [ diff --git a/reports/skill_os2_coverage.md b/reports/skill_os2_coverage.md index deeaf98d..be57746d 100644 --- a/reports/skill_os2_coverage.md +++ b/reports/skill_os2_coverage.md @@ -26,9 +26,9 @@ This report maps the Skill OS 2.0 upgrade blueprint to concrete local artifacts, | Skill IR | `pass` | schema 2.0.0; targets 5 | `python3 scripts/yao.py skill-ir .` | `python3 tests/verify_skill_ir.py` | | Output Eval Lab | `pass` | 5 cases; delta 100.0; execution 10 | `python3 scripts/yao.py output-exec . && python3 scripts/yao.py output-review .` | `python3 tests/verify_output_eval_lab.py` | | Runtime Conformance | `pass` | 5/5 targets pass | `python3 scripts/yao.py conformance .` | `python3 tests/verify_conformance_suite.py` | -| Trust Security | `pass` | 113 scripts; secrets 0; help failures 0 | `python3 scripts/yao.py trust .` | `python3 tests/verify_trust_check.py` | +| Trust Security | `pass` | 114 scripts; secrets 0; help failures 0 | `python3 scripts/yao.py trust .` | `python3 tests/verify_trust_check.py` | | Skill Atlas | `pass` | 12 scanned skills; actionable collisions 0 | `python3 scripts/yao.py skill-atlas --workspace-root .` | `python3 tests/verify_skill_atlas.py` | -| Registry Distribution | `pass` | archive entries 624; install failures 0 | `python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .` | `python3 tests/verify_registry_audit.py` | +| Registry Distribution | `pass` | archive entries 626; install failures 0 | `python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .` | `python3 tests/verify_registry_audit.py` | | Review Studio | `pass` | 16 gates; decision review; warnings 3 | `python3 scripts/yao.py review-studio .` | `python3 tests/verify_review_studio.py` | | Telemetry Drift | `pass` | events 1; recipes 5; risk low | `python3 scripts/yao.py telemetry-hooks . && python3 scripts/yao.py adoption-drift .` | `python3 tests/verify_telemetry_hooks.py` | @@ -48,7 +48,7 @@ This report maps the Skill OS 2.0 upgrade blueprint to concrete local artifacts, | Registry Package Format | `pass` | registry ok True | `make ci-test` | `tests/verify_registry_audit.py` | | Review Studio 2.0 | `pass` | 16 review gates | `make ci-test` | `tests/verify_review_studio.py` | | Migration V2 Docs | `pass` | migration guide present | `make ci-test` | `docs review` | -| Evidence Consistency | `pass` | 33 consistency checks | `make ci-test` | `tests/verify_evidence_consistency.py` | +| Evidence Consistency | `pass` | 34 consistency checks | `make ci-test` | `tests/verify_evidence_consistency.py` | ## Reference Extension Tracks diff --git a/reports/upgrade_check.json b/reports/upgrade_check.json index 070f638a..acb5d263 100644 --- a/reports/upgrade_check.json +++ b/reports/upgrade_check.json @@ -70,12 +70,12 @@ { "field": "archive_sha256", "from": "", - "to": "1727ee08ba08d88ca55122937ec07dabb2a8a515acc5c6e375052554335da296" + "to": "ed1bc47c56c8d247bf5dd351bf29201e60471b4785a86e16ae1ede5e71d1582f" }, { "field": "package_sha256", "from": "0000000000000000000000000000000000000000000000000000000000000000", - "to": "7734802eb54b761e419b62d6d7e0d5861aa10401b8e8cf956934e51f9b87ba0d" + "to": "836b5ebaf4a608a1a89fa84306ab9b4bb7e0555c74b6ca8e572ffb1833cc0f8c" } ] }, diff --git a/scripts/compile_skill.py b/scripts/compile_skill.py index 00fb4e9b..4f653c40 100644 --- a/scripts/compile_skill.py +++ b/scripts/compile_skill.py @@ -10,6 +10,8 @@ try: except ImportError: # pragma: no cover yaml = None +from skill_ir_paths import find_skill_ir as find_skill_ir_document + ROOT = Path(__file__).resolve().parent.parent COMPILER_SCHEMA_VERSION = "1.0" @@ -148,20 +150,7 @@ def read_frontmatter(path: Path) -> dict[str, Any]: def find_skill_ir(skill_dir: Path, name: str) -> tuple[dict[str, Any], str]: - candidates = [ - skill_dir / "reports" / "skill-ir.json", - skill_dir / "skill-ir" / "examples" / f"{name}.json", - skill_dir / "skill-ir" / "examples" / f"{skill_dir.name}.json", - ] - seen: set[Path] = set() - for path in candidates: - if path in seen: - continue - seen.add(path) - payload = load_json(path) - if payload: - return payload, display_path(path, skill_dir) - return {}, "frontmatter-fallback" + return find_skill_ir_document(skill_dir, name, fallback_source="frontmatter-fallback") def count_list(payload: dict[str, Any], key: str) -> int: diff --git a/scripts/cross_packager.py b/scripts/cross_packager.py index d89aa7f3..654e1c81 100644 --- a/scripts/cross_packager.py +++ b/scripts/cross_packager.py @@ -7,6 +7,7 @@ from pathlib import Path, PurePosixPath import yaml from compile_skill import compile_target_contract +from skill_ir_paths import find_skill_ir as find_skill_ir_document def display_path(path: Path, root: Path) -> str: @@ -48,20 +49,7 @@ def read_interface(skill_dir: Path) -> dict: def find_skill_ir(skill_dir: Path, name: str) -> tuple[dict, str]: - candidates = [ - skill_dir / "reports" / "skill-ir.json", - skill_dir / "skill-ir" / "examples" / f"{name}.json", - skill_dir / "skill-ir" / "examples" / f"{skill_dir.name}.json", - ] - seen = set() - for path in candidates: - if path in seen: - continue - seen.add(path) - payload = read_json(path) - if payload: - return payload, display_path(path, skill_dir) - return {}, "frontmatter-fallback" + return find_skill_ir_document(skill_dir, name, fallback_source="frontmatter-fallback") def package_name_from_manifest(manifest: dict, skill_dir: Path) -> str: diff --git a/scripts/export_skill_ir.py b/scripts/export_skill_ir.py index 5e231261..f02b913c 100644 --- a/scripts/export_skill_ir.py +++ b/scripts/export_skill_ir.py @@ -159,7 +159,7 @@ def report_list(skill_dir: Path) -> list[str]: return [rel for rel in KEY_REPORTS if (skill_dir / rel).exists()] -def file_list(skill_dir: Path, folder: str, suffixes: set[str] | None = None, limit: int = 80) -> list[str]: +def file_list(skill_dir: Path, folder: str, suffixes: set[str] | None = None, limit: int | None = None) -> list[str]: target = skill_dir / folder if not target.exists(): return [] @@ -170,7 +170,7 @@ def file_list(skill_dir: Path, folder: str, suffixes: set[str] | None = None, li if suffixes is not None and path.suffix not in suffixes: continue paths.append(str(path.relative_to(skill_dir))) - if len(paths) >= limit: + if limit is not None and len(paths) >= limit: break return paths diff --git a/scripts/registry_audit.py b/scripts/registry_audit.py index 8f197d2d..922a2f66 100644 --- a/scripts/registry_audit.py +++ b/scripts/registry_audit.py @@ -11,6 +11,8 @@ try: except ImportError: # pragma: no cover yaml = None +from skill_ir_paths import find_skill_ir as find_skill_ir_document + ROOT = Path(__file__).resolve().parent.parent DEFAULT_REGISTRY_DIR = ROOT / "registry" @@ -73,16 +75,7 @@ def read_frontmatter(path: Path) -> dict[str, Any]: def find_skill_ir(skill_dir: Path, name: str) -> tuple[dict[str, Any], str]: - candidates = [ - skill_dir / "reports" / "skill-ir.json", - skill_dir / "skill-ir" / "examples" / f"{name}.json", - skill_dir / "skill-ir" / "examples" / f"{skill_dir.name}.json", - ] - for path in candidates: - payload = load_json(path) - if payload: - return payload, display_path(path, skill_dir) - return {}, "missing" + return find_skill_ir_document(skill_dir, name, fallback_source="missing") def license_id(skill_dir: Path) -> str: diff --git a/scripts/render_evidence_consistency.py b/scripts/render_evidence_consistency.py index 5b478408..42bd91ce 100644 --- a/scripts/render_evidence_consistency.py +++ b/scripts/render_evidence_consistency.py @@ -8,6 +8,7 @@ from typing import Any from evidence_consistency_release import build_release_evidence_flow_check from evidence_consistency_world_class import build_world_class_workflow_check +from skill_ir_paths import find_skill_ir_path ROOT = Path(__file__).resolve().parent.parent @@ -122,28 +123,6 @@ def rel_path(path: Path, root: Path) -> str: return str(path.resolve()) -def canonical_skill_ir_path(skill_dir: Path, skill_name: str) -> str: - candidates = [ - skill_dir / "reports" / "skill-ir.json", - skill_dir / "skill-ir" / "examples" / f"{skill_name}.json", - skill_dir / "skill-ir" / "examples" / f"{skill_dir.name}.json", - ] - examples_dir = skill_dir / "skill-ir" / "examples" - if examples_dir.exists(): - for path in sorted(examples_dir.glob("*.json")): - if path not in candidates: - candidates.append(path) - seen: set[Path] = set() - for path in candidates: - if path in seen: - continue - seen.add(path) - payload, failure = load_json(path) - if not failure and payload.get("schema_version"): - return rel_path(path, skill_dir) - return "" - - def nested(payload: dict[str, Any], path: list[str], default: Any = None) -> Any: current: Any = payload for key in path: @@ -368,7 +347,7 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]: detail="The benchmark release lock must reflect the generation-time git dirty flag.", ) skill_name = str(overview.get("name") or nested(review_studio, ["data", "frontmatter", "name"]) or skill_dir.name) - expected_skill_ir_path = canonical_skill_ir_path(skill_dir, skill_name) + expected_skill_ir_path = find_skill_ir_path(skill_dir, skill_name, require_schema=True) expected_skill_ir = { "source_path": expected_skill_ir_path, "exists": bool(expected_skill_ir_path and (skill_dir / expected_skill_ir_path).exists()), diff --git a/scripts/render_portability_report.py b/scripts/render_portability_report.py index ebd96bd1..54b3db39 100644 --- a/scripts/render_portability_report.py +++ b/scripts/render_portability_report.py @@ -5,6 +5,8 @@ from pathlib import Path import yaml +from skill_ir_paths import find_skill_ir + ROOT = Path(__file__).resolve().parent.parent @@ -18,19 +20,7 @@ def load_yaml(path: Path) -> dict: def find_ir(root: Path) -> tuple[dict, str]: - candidates = [ - root / "reports" / "skill-ir.json", - root / "skill-ir" / "examples" / f"{root.name}.json", - ] - examples_dir = root / "skill-ir" / "examples" - if examples_dir.exists(): - for path in sorted(examples_dir.glob("*.json")): - if path not in candidates: - candidates.append(path) - for path in candidates: - if path.exists(): - return load_json(path), str(path.relative_to(root)) - return {}, "missing" + return find_skill_ir(root, root.name, fallback_source="missing") def band_for(score: int) -> str: diff --git a/scripts/review_studio_data.py b/scripts/review_studio_data.py index 3e4663f4..dd561012 100644 --- a/scripts/review_studio_data.py +++ b/scripts/review_studio_data.py @@ -5,6 +5,8 @@ import json from pathlib import Path from typing import Any +from skill_ir_paths import find_skill_ir_path as find_skill_ir_path_for_name + try: import yaml except ImportError: # pragma: no cover @@ -56,34 +58,10 @@ def parse_frontmatter(path: Path) -> dict[str, Any]: return data -def display_path(path: Path, root: Path) -> str: - try: - return str(path.resolve().relative_to(root.resolve())) - except ValueError: - return str(path) - - def find_skill_ir_path(skill_dir: Path) -> str: frontmatter = parse_frontmatter(skill_dir / "SKILL.md") name = str(frontmatter.get("name") or skill_dir.name) - candidates = [ - skill_dir / "reports" / "skill-ir.json", - skill_dir / "skill-ir" / "examples" / f"{name}.json", - skill_dir / "skill-ir" / "examples" / f"{skill_dir.name}.json", - ] - examples_dir = skill_dir / "skill-ir" / "examples" - if examples_dir.exists(): - for path in sorted(examples_dir.glob("*.json")): - if path not in candidates: - candidates.append(path) - seen: set[Path] = set() - for path in candidates: - if path in seen: - continue - seen.add(path) - if path.exists(): - return display_path(path, skill_dir) - return "" + return find_skill_ir_path_for_name(skill_dir, name) def evidence_paths(skill_dir: Path) -> dict[str, str]: diff --git a/scripts/run_conformance_suite.py b/scripts/run_conformance_suite.py index 59d68ee3..24bdf872 100644 --- a/scripts/run_conformance_suite.py +++ b/scripts/run_conformance_suite.py @@ -10,6 +10,8 @@ try: except ImportError: # pragma: no cover yaml = None +from skill_ir_paths import find_skill_ir as find_skill_ir_document + ROOT = Path(__file__).resolve().parent.parent DEFAULT_TARGETS = ["openai", "claude", "agent-skills", "vscode", "generic"] @@ -64,10 +66,7 @@ def parse_frontmatter(path: Path) -> tuple[dict[str, Any], str]: def find_skill_ir(skill_dir: Path, name: str) -> dict[str, Any]: - direct = load_json(skill_dir / "reports" / "skill-ir.json") - if direct: - return direct - return load_json(skill_dir / "skill-ir" / "examples" / f"{name}.json") + return find_skill_ir_document(skill_dir, name)[0] def add_check(checks: list[str], failures: list[str], condition: bool, passed: str, failed: str) -> None: diff --git a/scripts/skill_ir_paths.py b/scripts/skill_ir_paths.py new file mode 100644 index 00000000..b007be01 --- /dev/null +++ b/scripts/skill_ir_paths.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +"""Shared Skill IR artifact discovery helpers.""" + +import json +from pathlib import Path +from typing import Any + + +SCRIPT_INTERFACE = "internal-module" +SCRIPT_INTERFACE_REASON = "Imported by compiler, registry, conformance, and report scripts to locate canonical Skill IR artifacts." + + +def display_path(path: Path, root: Path) -> str: + try: + return str(path.resolve().relative_to(root.resolve())) + except ValueError: + return str(path.resolve()) + + +def candidate_paths(skill_dir: Path, name: str) -> list[Path]: + candidates = [ + skill_dir / "reports" / "skill-ir.json", + skill_dir / "skill-ir" / "examples" / f"{name}.json", + skill_dir / "skill-ir" / "examples" / f"{skill_dir.name}.json", + ] + examples_dir = skill_dir / "skill-ir" / "examples" + if examples_dir.exists(): + for path in sorted(examples_dir.glob("*.json")): + if path not in candidates: + candidates.append(path) + seen: set[Path] = set() + unique: list[Path] = [] + for path in candidates: + if path in seen: + continue + seen.add(path) + unique.append(path) + return unique + + +def load_json(path: Path) -> dict[str, Any]: + if not path.exists(): + return {} + try: + payload = json.loads(path.read_text(encoding="utf-8")) + except json.JSONDecodeError: + return {} + return payload if isinstance(payload, dict) else {} + + +def find_skill_ir_path(skill_dir: Path, name: str, *, require_schema: bool = False, fallback_source: str = "") -> str: + for path in candidate_paths(skill_dir, name): + payload = load_json(path) + if not payload: + continue + if require_schema and not payload.get("schema_version"): + continue + return display_path(path, skill_dir) + return fallback_source + + +def find_skill_ir( + skill_dir: Path, + name: str, + *, + require_schema: bool = False, + fallback_source: str = "", +) -> tuple[dict[str, Any], str]: + for path in candidate_paths(skill_dir, name): + payload = load_json(path) + if not payload: + continue + if require_schema and not payload.get("schema_version"): + continue + return payload, display_path(path, skill_dir) + return {}, fallback_source diff --git a/scripts/skill_report_model.py b/scripts/skill_report_model.py index 68d2464e..261eabb2 100644 --- a/scripts/skill_report_model.py +++ b/scripts/skill_report_model.py @@ -4,6 +4,7 @@ import re from datetime import date from pathlib import Path +from skill_ir_paths import find_skill_ir from skill_report_metrics import calculate_scorecard from skill_report_world_class import world_class_readiness, world_class_roadmap_item @@ -84,35 +85,6 @@ def load_json(path: Path) -> dict: return payload if isinstance(payload, dict) else {} -def display_path(path: Path, root: Path) -> str: - try: - return str(path.resolve().relative_to(root.resolve())) - except ValueError: - return str(path) - - -def find_skill_ir(skill_dir: Path, name: str) -> tuple[dict, str]: - candidates = [ - skill_dir / "reports" / "skill-ir.json", - skill_dir / "skill-ir" / "examples" / f"{name}.json", - skill_dir / "skill-ir" / "examples" / f"{skill_dir.name}.json", - ] - examples_dir = skill_dir / "skill-ir" / "examples" - if examples_dir.exists(): - for path in sorted(examples_dir.glob("*.json")): - if path not in candidates: - candidates.append(path) - seen: set[Path] = set() - for path in candidates: - if path in seen: - continue - seen.add(path) - payload = load_json(path) - if payload: - return payload, display_path(path, skill_dir) - return {}, "" - - def extract_title(body: str, fallback: str) -> str: for line in body.splitlines(): if line.startswith("# "): diff --git a/skill-ir/examples/yao-meta-skill.json b/skill-ir/examples/yao-meta-skill.json index d77411fc..077e35b0 100644 --- a/skill-ir/examples/yao-meta-skill.json +++ b/skill-ir/examples/yao-meta-skill.json @@ -112,6 +112,7 @@ ], "scripts": [ "scripts/adjudicate_output_review.py", + "scripts/apply_adaptation.py", "scripts/build_confusion_matrix.py", "scripts/build_skill_atlas.py", "scripts/check_update.py", @@ -123,6 +124,8 @@ "scripts/cross_packager.py", "scripts/diff_eval.py", "scripts/emit_telemetry_event.py", + "scripts/evidence_consistency_release.py", + "scripts/evidence_consistency_world_class.py", "scripts/export_skill_ir.py", "scripts/github_benchmark_scan.py", "scripts/governance_check.py", @@ -176,6 +179,7 @@ "scripts/render_world_class_evidence_ledger.py", "scripts/render_world_class_evidence_plan.py", "scripts/render_world_class_operator_runbook.py", + "scripts/render_world_class_preflight.py", "scripts/render_world_class_submission_review.py", "scripts/resource_boundary_check.py", "scripts/review_studio_action_evidence.py", @@ -190,7 +194,37 @@ "scripts/review_viewer_data.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", - "scripts/run_eval_suite.py" + "scripts/run_eval_suite.py", + "scripts/run_output_eval.py", + "scripts/run_output_execution.py", + "scripts/simulate_install.py", + "scripts/skill_ir_paths.py", + "scripts/skill_report_charts.py", + "scripts/skill_report_i18n.py", + "scripts/skill_report_layout.py", + "scripts/skill_report_metrics.py", + "scripts/skill_report_model.py", + "scripts/skill_report_world_class.py", + "scripts/summarize_user_signals.py", + "scripts/sync_local_install.py", + "scripts/telemetry_native_host.py", + "scripts/trigger_eval.py", + "scripts/trust_check.py", + "scripts/upgrade_check.py", + "scripts/validate_skill.py", + "scripts/verify_package.py", + "scripts/world_class_evidence_contract.py", + "scripts/world_class_source_checks.py", + "scripts/yao.py", + "scripts/yao_cli_adaptation_commands.py", + "scripts/yao_cli_config.py", + "scripts/yao_cli_create_commands.py", + "scripts/yao_cli_distribution_commands.py", + "scripts/yao_cli_output_commands.py", + "scripts/yao_cli_parser.py", + "scripts/yao_cli_report_commands.py", + "scripts/yao_cli_runtime.py", + "scripts/yao_cli_telemetry.py" ], "assets": [ "templates/basic_skill.md.j2", diff --git a/skill_atlas/catalog.json b/skill_atlas/catalog.json index e6cb4627..6fc29338 100644 --- a/skill_atlas/catalog.json +++ b/skill_atlas/catalog.json @@ -107,6 +107,7 @@ "scripts/run_output_eval.py", "scripts/run_output_execution.py", "scripts/simulate_install.py", + "scripts/skill_ir_paths.py", "scripts/skill_report_charts.py", "scripts/skill_report_i18n.py", "scripts/skill_report_layout.py", diff --git a/tests/verify_skill_ir.py b/tests/verify_skill_ir.py index b7bf7b94..3e513b1e 100644 --- a/tests/verify_skill_ir.py +++ b/tests/verify_skill_ir.py @@ -44,6 +44,13 @@ def main() -> None: assert any("`Governed`" in item for item in payload["workflow"]["decision_points"]), payload["workflow"]["decision_points"] assert payload["resources"]["references"], payload assert payload["resources"]["scripts"], payload + expected_scripts = { + str(path.relative_to(ROOT)) + for path in (ROOT / "scripts").rglob("*") + if path.is_file() and path.suffix in {".py", ".sh", ".js", ".ts"} + } + actual_scripts = set(payload["resources"]["scripts"]) + assert expected_scripts <= actual_scripts, sorted(expected_scripts - actual_scripts) assert payload["resources"]["reports"], payload assert "evals/trigger_cases.json" in payload["eval_plan"]["trigger"], payload["eval_plan"] assert payload["risk"]["trust_boundary"] == "external", payload diff --git a/tests/verify_skill_ir_paths.py b/tests/verify_skill_ir_paths.py new file mode 100644 index 00000000..b781b7e4 --- /dev/null +++ b/tests/verify_skill_ir_paths.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +import json +import shutil +import sys +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(ROOT / "scripts")) + +from skill_ir_paths import candidate_paths, find_skill_ir, find_skill_ir_path # noqa: E402 + + +TMP = ROOT / "tests" / "tmp_skill_ir_paths" + + +def write_json(path: Path, payload: dict) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(payload, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + + +def main() -> None: + shutil.rmtree(TMP, ignore_errors=True) + TMP.mkdir(parents=True, exist_ok=True) + + root_ir, root_path = find_skill_ir(ROOT, "yao-meta-skill", require_schema=True) + assert root_path == "skill-ir/examples/yao-meta-skill.json", root_path + assert root_ir["schema_version"] == "2.0.0", root_ir + assert find_skill_ir_path(ROOT, "yao-meta-skill", require_schema=True) == root_path + + preferred = TMP / "reports" / "skill-ir.json" + example = TMP / "skill-ir" / "examples" / "demo-skill.json" + write_json(preferred, {"schema_version": "2.0.0", "name": "reports-copy"}) + write_json(example, {"schema_version": "2.0.0", "name": "example-copy"}) + payload, source = find_skill_ir(TMP, "demo-skill", require_schema=True) + assert source == "reports/skill-ir.json", source + assert payload["name"] == "reports-copy", payload + + preferred.unlink() + payload, source = find_skill_ir(TMP, "demo-skill", require_schema=True) + assert source == "skill-ir/examples/demo-skill.json", source + assert payload["name"] == "example-copy", payload + + example.unlink() + write_json(TMP / "skill-ir" / "examples" / "zzz-extra.json", {"schema_version": "2.0.0", "name": "wildcard"}) + payload, source = find_skill_ir(TMP, "missing-name", require_schema=True) + assert source == "skill-ir/examples/zzz-extra.json", source + assert payload["name"] == "wildcard", payload + + (TMP / "skill-ir" / "examples" / "zzz-extra.json").unlink() + write_json(TMP / "reports" / "skill-ir.json", {"name": "no-schema"}) + assert find_skill_ir_path(TMP, "demo-skill", require_schema=True, fallback_source="missing") == "missing" + assert find_skill_ir_path(TMP, "demo-skill", require_schema=False) == "reports/skill-ir.json" + + paths = [str(path.relative_to(TMP)) for path in candidate_paths(TMP, "demo-skill")] + assert paths[:3] == [ + "reports/skill-ir.json", + "skill-ir/examples/demo-skill.json", + "skill-ir/examples/tmp_skill_ir_paths.json", + ], paths + + print(json.dumps({"ok": True}, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/tests/verify_trust_check.py b/tests/verify_trust_check.py index 7e9ca95b..477475eb 100644 --- a/tests/verify_trust_check.py +++ b/tests/verify_trust_check.py @@ -93,6 +93,7 @@ def main() -> None: "scripts/review_studio_layout.py", "scripts/evidence_consistency_release.py", "scripts/evidence_consistency_world_class.py", + "scripts/skill_ir_paths.py", "scripts/skill_report_charts.py", "scripts/skill_report_i18n.py", "scripts/skill_report_layout.py", @@ -117,6 +118,7 @@ def main() -> None: assert "review_studio_layout.py" not in warning_text, payload["warnings"] assert "evidence_consistency_release.py" not in warning_text, payload["warnings"] assert "evidence_consistency_world_class.py" not in warning_text, payload["warnings"] + assert "skill_ir_paths.py" not in warning_text, payload["warnings"] assert "skill_report_charts.py" not in warning_text, payload["warnings"] assert "skill_report_i18n.py" not in warning_text, payload["warnings"] assert "skill_report_layout.py" not in warning_text, payload["warnings"]