From 313fe0b37ce00ef61ad7dd26ca5314100ab39030 Mon Sep 17 00:00:00 2001 From: yaojingang Date: Sat, 13 Jun 2026 22:11:26 +0800 Subject: [PATCH] feat: add telemetry hook recipes --- AGENTS.md | 1 + Makefile | 9 +- README.md | 6 +- references/telemetry-drift-method.md | 17 +- registry/index.json | 2 +- registry/packages/yao-meta-skill.json | 6 +- reports/compiled_targets.json | 185 +++++++------ reports/context_budget.json | 6 +- reports/install_simulation.json | 2 +- reports/output_execution_runs.json | 20 +- reports/output_execution_runs.md | 20 +- reports/package_verification.json | 4 +- reports/package_verification.md | 2 +- reports/registry_audit.json | 8 +- reports/registry_audit.md | 4 +- reports/review-studio.html | 10 +- reports/review-studio.json | 325 +++++++++++++--------- reports/security_trust_report.json | 43 ++- reports/security_trust_report.md | 17 +- reports/skill-os-2-review.md | 21 +- reports/skill-overview.html | 10 +- reports/skill-overview.json | 46 +-- reports/skill_atlas.json | 5 +- reports/telemetry_hook_recipes.json | 338 +++++++++++++++++++++++ reports/telemetry_hook_recipes.md | 35 +++ reports/upgrade_check.json | 4 +- scripts/ci_test.py | 1 + scripts/export_skill_ir.py | 2 + scripts/render_telemetry_hook_recipes.py | 258 +++++++++++++++++ scripts/yao.py | 17 ++ scripts/yao_cli_parser.py | 10 + skill-ir/examples/yao-meta-skill.json | 3 + skill_atlas/catalog.json | 5 +- tests/verify_telemetry_hooks.py | 153 ++++++++++ tests/verify_yao_cli.py | 1 + 35 files changed, 1270 insertions(+), 326 deletions(-) create mode 100644 reports/telemetry_hook_recipes.json create mode 100644 reports/telemetry_hook_recipes.md create mode 100644 scripts/render_telemetry_hook_recipes.py create mode 100644 tests/verify_telemetry_hooks.py diff --git a/AGENTS.md b/AGENTS.md index 8ca7635..a06694f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -72,6 +72,7 @@ Clean test-only scratch directories after verification with `find tests -maxdept - `scripts/yao_cli_telemetry.py`: opt-in metadata-only CLI run telemetry. Keep it free of prompt, argument, output, transcript, note, or message capture. - `scripts/import_telemetry_events.py`: external telemetry importer. Validate the whole input before appending events, and keep raw prompt/output/transcript/message/note fields blocked. - `scripts/emit_telemetry_event.py`: external client telemetry emitter. It may append one normalized metadata event to a local spool, but must never accept or write raw prompt, output, transcript, message, note, argument, or private content. +- `scripts/render_telemetry_hook_recipes.py`: client hook recipe report. Keep recipes metadata-only, mark native auto-capture as unclaimed unless a real client integration exists, and preserve dry-run commands for Browser/Chrome/IDE/wrapper adapters. New helper modules that are imported by CLI/report scripts but are not standalone commands must declare: diff --git a/Makefile b/Makefile index 12a7824..0b1e155 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ PYTHON ?= python3 LOCAL_SKILL_INSTALL_DIR ?= $(HOME)/.agents/skills.disabled/yao-meta-skill ACTIVE_SKILL_INSTALL_DIR ?= $(HOME)/.agents/skills/yao-meta-skill -.PHONY: eval eval-suite route-scorecard route-confusion-check description-optimization judge-blind-eval description-optimization-check promotion-check yao-cli-check skill-overview-check skill-report-metrics-check skill-report-charts-check skill-ir-check compiler-check output-eval-check output-execution-check output-review-adjudication-check runtime-conformance-check runtime-permission-check trust-check skill-atlas-check registry-audit-check package-verify-check install-simulation-check upgrade-check review-viewer-check review-studio-check feedback-check adoption-drift-check telemetry-import-check telemetry-emit-check review-waivers-check review-annotations-check baseline-compare-check reference-scan-check github-benchmark-scan-check intent-confidence-check reference-synthesis-check output-risk-profile-check artifact-design-profile-check prompt-quality-profile-check system-model-check iteration-directions-check description-drift-history iteration-ledger results-panel regression-history context-reports portability-report portability-check failure-regression-check package-check package-failure-check security-boundary-check local-install-sync-check snapshot-check validate lint governance-check resource-boundary-check quality-check sync-local-install sync-active-install test ci-test clean +.PHONY: eval eval-suite route-scorecard route-confusion-check description-optimization judge-blind-eval description-optimization-check promotion-check yao-cli-check skill-overview-check skill-report-metrics-check skill-report-charts-check skill-ir-check compiler-check output-eval-check output-execution-check output-review-adjudication-check runtime-conformance-check runtime-permission-check trust-check skill-atlas-check registry-audit-check package-verify-check install-simulation-check upgrade-check review-viewer-check review-studio-check feedback-check adoption-drift-check telemetry-import-check telemetry-emit-check telemetry-hooks-check review-waivers-check review-annotations-check baseline-compare-check reference-scan-check github-benchmark-scan-check intent-confidence-check reference-synthesis-check output-risk-profile-check artifact-design-profile-check prompt-quality-profile-check system-model-check iteration-directions-check description-drift-history iteration-ledger results-panel regression-history context-reports portability-report portability-check failure-regression-check package-check package-failure-check security-boundary-check local-install-sync-check snapshot-check validate lint governance-check resource-boundary-check quality-check sync-local-install sync-active-install test ci-test clean eval: $(PYTHON) scripts/trigger_eval.py --description-file evals/improved_description.txt --cases evals/trigger_cases.json --baseline-description-file evals/baseline_description.txt @@ -97,6 +97,9 @@ telemetry-import-check: telemetry-emit-check: $(PYTHON) tests/verify_telemetry_emit.py +telemetry-hooks-check: + $(PYTHON) tests/verify_telemetry_hooks.py + review-waivers-check: $(PYTHON) tests/verify_review_waivers.py @@ -193,11 +196,11 @@ sync-local-install: package-check sync-active-install: package-check $(PYTHON) scripts/sync_local_install.py --install-dir "$(ACTIVE_SKILL_INSTALL_DIR)" -test: eval eval-suite route-scorecard route-confusion-check description-optimization description-optimization-check promotion-check yao-cli-check skill-overview-check skill-report-metrics-check skill-report-charts-check skill-ir-check compiler-check output-eval-check output-execution-check output-review-adjudication-check runtime-conformance-check runtime-permission-check trust-check skill-atlas-check registry-audit-check package-verify-check install-simulation-check upgrade-check review-viewer-check review-studio-check feedback-check adoption-drift-check telemetry-import-check telemetry-emit-check review-waivers-check review-annotations-check baseline-compare-check reference-scan-check github-benchmark-scan-check intent-confidence-check reference-synthesis-check output-risk-profile-check artifact-design-profile-check prompt-quality-profile-check system-model-check iteration-directions-check description-drift-history iteration-ledger regression-history context-reports portability-report portability-check failure-regression-check package-check package-failure-check security-boundary-check local-install-sync-check snapshot-check validate lint governance-check resource-boundary-check quality-check +test: eval eval-suite route-scorecard route-confusion-check description-optimization description-optimization-check promotion-check yao-cli-check skill-overview-check skill-report-metrics-check skill-report-charts-check skill-ir-check compiler-check output-eval-check output-execution-check output-review-adjudication-check runtime-conformance-check runtime-permission-check trust-check skill-atlas-check registry-audit-check package-verify-check install-simulation-check upgrade-check review-viewer-check review-studio-check feedback-check adoption-drift-check telemetry-import-check telemetry-emit-check telemetry-hooks-check review-waivers-check review-annotations-check baseline-compare-check reference-scan-check github-benchmark-scan-check intent-confidence-check reference-synthesis-check output-risk-profile-check artifact-design-profile-check prompt-quality-profile-check system-model-check iteration-directions-check description-drift-history iteration-ledger regression-history context-reports portability-report portability-check failure-regression-check package-check package-failure-check security-boundary-check local-install-sync-check snapshot-check validate lint governance-check resource-boundary-check quality-check ci-test: $(PYTHON) scripts/ci_test.py clean: - rm -rf dist tests/tmp tests/tmp_snapshot tests/tmp_cli tests/tmp_skill_overview tests/tmp_skill_report_metrics tests/tmp_skill_report_charts tests/tmp_skill_ir tests/tmp_compile_skill tests/tmp_output_eval tests/tmp_output_execution tests/tmp_output_review_adjudication tests/tmp_conformance tests/tmp_runtime_permission tests/tmp_trust tests/tmp_skill_atlas tests/tmp_registry tests/tmp_package_verification tests/tmp_install_simulation tests/tmp_upgrade_check tests/tmp_reference_scan tests/tmp_iteration_directions tests/tmp_review_viewer tests/tmp_review_studio tests/tmp_feedback tests/tmp_adoption_drift tests/tmp_telemetry_import tests/tmp_telemetry_emit tests/tmp_review_waivers tests/tmp_review_annotations tests/tmp_github_benchmark_scan tests/tmp_intent_confidence tests/tmp_reference_synthesis tests/tmp_output_risk_profile tests/tmp_artifact_design_profile tests/tmp_prompt_quality_profile tests/tmp_system_model tests/tmp_security tests/tmp_baseline_compare.json tests/tmp_baseline_compare.md + rm -rf dist tests/tmp tests/tmp_snapshot tests/tmp_cli tests/tmp_skill_overview tests/tmp_skill_report_metrics tests/tmp_skill_report_charts tests/tmp_skill_ir tests/tmp_compile_skill tests/tmp_output_eval tests/tmp_output_execution tests/tmp_output_review_adjudication tests/tmp_conformance tests/tmp_runtime_permission tests/tmp_trust tests/tmp_skill_atlas tests/tmp_registry tests/tmp_package_verification tests/tmp_install_simulation tests/tmp_upgrade_check tests/tmp_reference_scan tests/tmp_iteration_directions tests/tmp_review_viewer tests/tmp_review_studio tests/tmp_feedback tests/tmp_adoption_drift tests/tmp_telemetry_import tests/tmp_telemetry_emit tests/tmp_telemetry_hooks tests/tmp_review_waivers tests/tmp_review_annotations tests/tmp_github_benchmark_scan tests/tmp_intent_confidence tests/tmp_reference_synthesis tests/tmp_output_risk_profile tests/tmp_artifact_design_profile tests/tmp_prompt_quality_profile tests/tmp_system_model tests/tmp_security tests/tmp_baseline_compare.json tests/tmp_baseline_compare.md find . -type d -name __pycache__ -prune -exec rm -rf {} + diff --git a/README.md b/README.md index 18a0645..640e0cd 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ It turns rough workflows, transcripts, prompts, notes, and runbooks into reusabl - a systems-thinking model that maps boundaries, feedback loops, drift risks, recurring failure patterns, and highest-leverage quality moves - three high-value next iteration directions after the first package is created - a lightweight feedback log that does not require a full promotion cycle -- a local-first metadata-only adoption and drift report that turns real usage signals into next iteration candidates, with optional `yao.py` CLI run capture, external client event emit hooks, and JSONL import that record command names and outcomes without arguments or raw content +- a local-first metadata-only adoption and drift report that turns real usage signals into next iteration candidates, with optional `yao.py` CLI run capture, external client event emit hooks, hook recipes, and JSONL import that record command names and outcomes without arguments or raw content - a Skill Atlas drift layer that reads aggregate adoption reports and surfaces portfolio-level drift signals without packaging raw telemetry logs - a baseline compare report for with-skill vs baseline review - a conversation-style, archetype-aware quickstart that steers new packages toward scaffold, production, library, or governed fits @@ -110,6 +110,7 @@ python3 scripts/yao.py feedback my-skill --note "Tighten exclusions before addin python3 scripts/yao.py adoption-drift my-skill --record-event skill_activation --activation-type explicit --outcome accepted YAO_CLI_TELEMETRY=1 python3 scripts/yao.py validate my-skill python3 scripts/yao.py telemetry-emit my-skill --event skill_activation --activation-type explicit --outcome accepted --command browser-extension +python3 scripts/yao.py telemetry-hooks my-skill python3 scripts/yao.py telemetry-import my-skill --input-jsonl /tmp/external-client-events.jsonl --command browser-extension python3 scripts/yao.py review-waivers my-skill --add-waiver --gate-key trust-report --reviewer "Yao Team" --reason "Known warning accepted for this release with bounded follow-up." --expires-at 2026-09-30 python3 scripts/yao.py review-waivers my-skill --add-waiver --gate-key permission-gates --reviewer "Yao Team" --reason "Permission warning accepted only for this non-governed release window." --expires-at 2026-09-30 @@ -389,7 +390,7 @@ Utility scripts that make the meta-skill operational: - `run_description_optimization_suite.py`: runs description optimization across the root skill and governed examples, then writes reusable reports and optional drift snapshots with calibration and family summaries - `promotion_checker.py`: applies promotion policy to current description candidates, writes promotion decisions, builds candidate registries, and emits iteration bundles with review stubs - `create_iteration_snapshot.py`: freezes the current promotion decision into a versioned release snapshot with review, route, and context evidence -- `yao.py`: unified authoring CLI that exposes init, validate, optimize-description, promote-check, review, release-snapshot, workspace-flow, report, skill-ir, compile-skill, output-exec, output-review, telemetry-emit, telemetry-import, package, registry-audit, package-verify, install-simulate, upgrade-check, review-waivers, and test as one entrypoint +- `yao.py`: unified authoring CLI that exposes init, validate, optimize-description, promote-check, review, release-snapshot, workspace-flow, report, skill-ir, compile-skill, output-exec, output-review, telemetry-emit, telemetry-hooks, telemetry-import, package, registry-audit, package-verify, install-simulate, upgrade-check, review-waivers, and test as one entrypoint - `render_description_drift_history.py`: turns description-optimization snapshots into a readable drift-history report - `build_confusion_matrix.py`: scores route confusion across tracked sibling skills and `no_route` cases, then writes a route scorecard and optional milestone snapshot - `render_iteration_ledger.py`: compresses regression milestones, description optimization drift, and route scorecards into one iteration-facing ledger @@ -418,6 +419,7 @@ Utility scripts that make the meta-skill operational: - `render_adoption_drift_report.py`: records metadata-only local telemetry and renders adoption, missed-trigger, bad-output, script-error, and review-drift signals without packaging raw event logs - `import_telemetry_events.py`: imports external metadata-only telemetry JSONL after whole-file privacy validation, then refreshes the aggregate adoption drift report - `emit_telemetry_event.py`: emits one metadata-only external client event into a local spool for later `telemetry-import`, with dry-run validation and raw-content field blocking +- `render_telemetry_hook_recipes.py`: renders Browser, Chrome, VS Code, CLI wrapper, and provider-adapter telemetry hook recipes with dry-run commands and explicit native-integration caveats - `yao_cli_telemetry.py`: opt-in metadata-only `yao.py` run capture for command name, source, outcome, and failure class without command arguments or raw content - `render_review_waivers.py`: validates human reviewer risk approvals with gate keys, reasons, expiry dates, and blocker-safe waiver policy - `init_skill.py`, `lint_skill.py`, `validate_skill.py`, `diff_eval.py`: minimal authoring toolchain diff --git a/references/telemetry-drift-method.md b/references/telemetry-drift-method.md index 2ef0dbb..0f20480 100644 --- a/references/telemetry-drift-method.md +++ b/references/telemetry-drift-method.md @@ -92,6 +92,21 @@ After a client finishes a batch, import the spool: python3 scripts/yao.py telemetry-import . --input-jsonl .yao/telemetry_spool/external_events.jsonl ``` +## Client Hook Recipes + +Use `telemetry-hooks` to generate auditable Browser, Chrome, VS Code, CLI wrapper, and provider-adapter hook recipes: + +```bash +python3 scripts/yao.py telemetry-hooks . +``` + +The report is written to: + +- `reports/telemetry_hook_recipes.json` +- `reports/telemetry_hook_recipes.md` + +Each recipe includes a dry-run command, an emit command, the target local spool, trigger points, and the privacy contract. The report intentionally sets `native_auto_capture=false`; it proves the local hook contract and metadata-only command shape, not that a host client is already natively integrated. + ## External Client Import External clients, browser extensions, editor adapters, or wrapper scripts may hand off already-sanitized JSONL through `telemetry-import`: @@ -128,7 +143,7 @@ Package builders should exclude `reports/telemetry_events.jsonl`. The root repos ## Iteration Loop -1. Capture metadata-only events locally, either manually with `adoption-drift --record-event`, automatically with opt-in `yao.py` CLI capture, through `telemetry-emit` client hooks, or through validated external JSONL import. +1. Capture metadata-only events locally, either manually with `adoption-drift --record-event`, automatically with opt-in `yao.py` CLI capture, through `telemetry-emit` client hooks, through generated `telemetry-hooks` client recipes, or through validated external JSONL import. 2. Render `reports/adoption_drift_report.md`. 3. Convert missed triggers into trigger eval cases. 4. Convert bad outputs into Output Eval assertions and failure taxonomy entries. diff --git a/registry/index.json b/registry/index.json index 474b749..8e951a6 100644 --- a/registry/index.json +++ b/registry/index.json @@ -16,7 +16,7 @@ "vscode" ], "package_metadata": "registry/packages/yao-meta-skill.json", - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" } ] } diff --git a/registry/packages/yao-meta-skill.json b/registry/packages/yao-meta-skill.json index eaba237..701e765 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": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4", - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, "compatibility": { "openai": "pass", @@ -48,7 +48,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", "package_verification": "reports/package_verification.json", "install_simulated": true, "install_simulation": "reports/install_simulation.json" diff --git a/reports/compiled_targets.json b/reports/compiled_targets.json index d81a1ef..b6b888b 100644 --- a/reports/compiled_targets.json +++ b/reports/compiled_targets.json @@ -193,6 +193,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -258,6 +259,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -267,9 +270,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -373,7 +376,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -415,6 +418,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -460,14 +464,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -489,7 +493,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -510,9 +514,9 @@ "strategy": "Ship the neutral source tree and expose OpenAI-facing interface metadata as a generated companion file.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/openai/adapter.json", @@ -521,7 +525,7 @@ }, "scripts": { "strategy": "Keep scripts as local package resources; expose help-smoke and permission metadata for reviewer approval before execution.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -602,7 +606,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -644,6 +648,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -689,14 +694,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -716,7 +721,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -737,9 +742,9 @@ "strategy": "Ship the neutral source tree and expose OpenAI-facing interface metadata as a generated companion file.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/openai/adapter.json", @@ -748,7 +753,7 @@ }, "scripts": { "strategy": "Keep scripts as local package resources; expose help-smoke and permission metadata for reviewer approval before execution.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -998,6 +1003,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -1063,6 +1069,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -1072,9 +1080,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -1178,7 +1186,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -1220,6 +1228,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -1265,14 +1274,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -1294,7 +1303,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -1315,9 +1324,9 @@ "strategy": "Preserve the source tree directly; write target notes in targets/claude/README.md.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/claude/adapter.json", @@ -1326,7 +1335,7 @@ }, "scripts": { "strategy": "Scripts remain local package resources and must be reviewed through trust and permission reports before use.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -1407,7 +1416,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -1449,6 +1458,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -1494,14 +1504,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -1521,7 +1531,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -1542,9 +1552,9 @@ "strategy": "Preserve the source tree directly; write target notes in targets/claude/README.md.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/claude/adapter.json", @@ -1553,7 +1563,7 @@ }, "scripts": { "strategy": "Scripts remain local package resources and must be reviewed through trust and permission reports before use.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -1803,6 +1813,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -1868,6 +1879,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -1877,9 +1890,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -1983,7 +1996,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -2025,6 +2038,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -2070,14 +2084,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -2099,7 +2113,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -2120,9 +2134,9 @@ "strategy": "Preserve references, scripts, assets, evals, reports, and adapter metadata as relative package resources.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/generic/adapter.json" @@ -2130,7 +2144,7 @@ }, "scripts": { "strategy": "Expose script and permission metadata for downstream clients or installers to enforce.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -2205,7 +2219,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -2247,6 +2261,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -2292,14 +2307,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -2319,7 +2334,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -2340,9 +2355,9 @@ "strategy": "Preserve references, scripts, assets, evals, reports, and adapter metadata as relative package resources.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/generic/adapter.json" @@ -2350,7 +2365,7 @@ }, "scripts": { "strategy": "Expose script and permission metadata for downstream clients or installers to enforce.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -2592,6 +2607,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -2657,6 +2673,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -2666,9 +2684,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -2772,7 +2790,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -2814,6 +2832,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -2859,14 +2878,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -2888,7 +2907,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -2909,9 +2928,9 @@ "strategy": "Keep optional directories as relative resources next to SKILL.md.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "SKILL.md", @@ -2920,7 +2939,7 @@ }, "scripts": { "strategy": "Scripts remain local optional resources and should advertise --help when executable.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -2994,7 +3013,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -3036,6 +3055,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -3081,14 +3101,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -3108,7 +3128,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -3129,9 +3149,9 @@ "strategy": "Keep optional directories as relative resources next to SKILL.md.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "SKILL.md", @@ -3140,7 +3160,7 @@ }, "scripts": { "strategy": "Scripts remain local optional resources and should advertise --help when executable.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -3381,6 +3401,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -3446,6 +3467,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -3455,9 +3478,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -3561,7 +3584,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -3603,6 +3626,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -3648,14 +3672,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -3677,7 +3701,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -3698,9 +3722,9 @@ "strategy": "Install as project or user scoped skill source, preserving relative references and scripts.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/vscode/adapter.json", @@ -3709,7 +3733,7 @@ }, "scripts": { "strategy": "Scripts require workspace trust and operator/client approval outside this compiler.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -3787,7 +3811,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -3829,6 +3853,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -3874,14 +3899,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -3901,7 +3926,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -3922,9 +3947,9 @@ "strategy": "Install as project or user scoped skill source, preserving relative references and scripts.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/vscode/adapter.json", @@ -3933,7 +3958,7 @@ }, "scripts": { "strategy": "Scripts require workspace trust and operator/client approval outside this compiler.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { diff --git a/reports/context_budget.json b/reports/context_budget.json index 6026695..541568a 100644 --- a/reports/context_budget.json +++ b/reports/context_budget.json @@ -6,10 +6,10 @@ "context_budget_tier": "production", "context_budget_limit": 1000, "skill_body_tokens": 751, - "other_text_tokens": 927304, + "other_text_tokens": 936263, "estimated_initial_load_tokens": 944, - "estimated_total_text_tokens": 928055, - "relevant_file_count": 403, + "estimated_total_text_tokens": 937014, + "relevant_file_count": 409, "unused_resource_dirs": [], "quality_signal_points": 130, "quality_density": 137.7 diff --git a/reports/install_simulation.json b/reports/install_simulation.json index 0a4121d..801b752 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": 499, + "archive_entry_count": 503, "archive_extracted": true, "entrypoint_loaded": true, "manifest_loaded": true, diff --git a/reports/output_execution_runs.json b/reports/output_execution_runs.json index e31adb7..300044e 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": 31.02, + "duration_ms": 34.49, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -62,7 +62,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 32.55, + "duration_ms": 33.15, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -85,7 +85,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 30.25, + "duration_ms": 34.31, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -113,7 +113,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 31.2, + "duration_ms": 30.67, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -136,7 +136,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.99, + "duration_ms": 29.54, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -164,7 +164,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.64, + "duration_ms": 28.43, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -187,7 +187,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 30.23, + "duration_ms": 27.8, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -214,7 +214,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.91, + "duration_ms": 27.96, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -237,7 +237,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.16, + "duration_ms": 28.79, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -266,7 +266,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.25, + "duration_ms": 28.95, "provider": "local-output-eval-runner", "model": "", "usage": { diff --git a/reports/output_execution_runs.md b/reports/output_execution_runs.md index eb4fdfb..c42bcfa 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 | 31.02 | 33 | 0.0 | pass | -| skill-package-contract | with_skill | command | local-output-eval-runner | 32.55 | 73 | 100.0 | pass | -| output-eval-expectation | baseline | command | local-output-eval-runner | 30.25 | 36 | 0.0 | pass | -| output-eval-expectation | with_skill | command | local-output-eval-runner | 31.2 | 80 | 100.0 | pass | -| ir-before-packaging | baseline | command | local-output-eval-runner | 28.99 | 33 | 0.0 | pass | -| ir-before-packaging | with_skill | command | local-output-eval-runner | 29.64 | 80 | 100.0 | pass | -| near-neighbor-boundary | baseline | command | local-output-eval-runner | 30.23 | 36 | 0.0 | pass | -| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 28.91 | 65 | 100.0 | pass | -| file-backed-governed-package | baseline | command | local-output-eval-runner | 28.16 | 37 | 0.0 | pass | -| file-backed-governed-package | with_skill | command | local-output-eval-runner | 29.25 | 98 | 100.0 | pass | +| skill-package-contract | baseline | command | local-output-eval-runner | 34.49 | 33 | 0.0 | pass | +| skill-package-contract | with_skill | command | local-output-eval-runner | 33.15 | 73 | 100.0 | pass | +| output-eval-expectation | baseline | command | local-output-eval-runner | 34.31 | 36 | 0.0 | pass | +| output-eval-expectation | with_skill | command | local-output-eval-runner | 30.67 | 80 | 100.0 | pass | +| ir-before-packaging | baseline | command | local-output-eval-runner | 29.54 | 33 | 0.0 | pass | +| ir-before-packaging | with_skill | command | local-output-eval-runner | 28.43 | 80 | 100.0 | pass | +| near-neighbor-boundary | baseline | command | local-output-eval-runner | 27.8 | 36 | 0.0 | pass | +| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 27.96 | 65 | 100.0 | pass | +| file-backed-governed-package | baseline | command | local-output-eval-runner | 28.79 | 37 | 0.0 | pass | +| file-backed-governed-package | with_skill | command | local-output-eval-runner | 28.95 | 98 | 100.0 | pass | ## Next Fixes diff --git a/reports/package_verification.json b/reports/package_verification.json index 5cb7420..76b7f86 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": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", - "archive_entry_count": 499, + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", + "archive_entry_count": 503, "failure_count": 0, "warning_count": 0 }, diff --git a/reports/package_verification.md b/reports/package_verification.md index 07fd53d..298e422 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: `3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599` +- Archive SHA256: `15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf` - Failures: `0` - Warnings: `0` diff --git a/reports/registry_audit.json b/reports/registry_audit.json index 8803744..9037247 100644 --- a/reports/registry_audit.json +++ b/reports/registry_audit.json @@ -21,8 +21,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4", - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, "compatibility": { "openai": "pass", @@ -53,7 +53,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", "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": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" } ] }, diff --git a/reports/registry_audit.md b/reports/registry_audit.md index 116a1f6..ce16199 100644 --- a/reports/registry_audit.md +++ b/reports/registry_audit.md @@ -6,8 +6,8 @@ - Maturity: `governed` - Owner: `Yao Team` - License: `MIT` -- Package SHA256: `195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4` -- Archive SHA256: `3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599` +- Package SHA256: `25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339` +- Archive SHA256: `15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf` - Install simulated: `True` ## Compatibility diff --git a/reports/review-studio.html b/reports/review-studio.html index 7e3218d..96d4264 100644 --- a/reports/review-studio.html +++ b/reports/review-studio.html @@ -242,12 +242,12 @@

核心指标

-
Skill IR2.0.0

5 targets in platform-neutral contract

Compiler5/5

target contracts compiled from Skill IR

Output Delta100.0

5 cases; 1 file-backed

Exec Runs10

command 10; model 0; recorded 0

Blind A/B5

review pairs hide baseline vs with-skill labels

Review A/B0/5

adjudication decisions; pending 5

Runtime5/5

target conformance pass rate

Perm Probe4/4

0 native enforcement targets

Trust0

72 scripts scanned; secrets found

Atlas5

12 scanned skills; route collisions

Driftlow

1 metadata events; 0 missed triggers

Waivers0

0 gates covered; human risk decisions

Notes0/0

0 open blocker annotations

Registry1.1.0

5 targets; MIT license

Archivepass

499 zip entries; package verification

Installpass

4 adapters; 12 permissions enforced; 0 permission failures

Upgrademinor

declared minor; 0 breaking changes

+
Skill IR2.0.0

5 targets in platform-neutral contract

Compiler5/5

target contracts compiled from Skill IR

Output Delta100.0

5 cases; 1 file-backed

Exec Runs10

command 10; model 0; recorded 0

Blind A/B5

review pairs hide baseline vs with-skill labels

Review A/B0/5

adjudication decisions; pending 5

Runtime5/5

target conformance pass rate

Perm Probe4/4

0 native enforcement targets

Trust0

73 scripts scanned; secrets found

Atlas5

12 scanned skills; route collisions

Driftlow

1 metadata events; 0 missed triggers

Waivers0

0 gates covered; human risk decisions

Notes0/0

0 open blocker annotations

Registry1.1.0

5 targets; MIT license

Archivepass

503 zip entries; package verification

Installpass

4 adapters; 12 permissions enforced; 0 permission failures

Upgrademinor

declared minor; 0 breaking changes

审查闸门

-
通过

意图画布

intent confidence 100/100; Intent is clear enough to package the first routeable version.

reports/intent-confidence.json 证据
通过

触发实验

13 trigger cases; 0 misroutes; 0 ambiguous

reports/route_scorecard.json 证据
关注

输出实验

5/5 cases; with-skill 100.0; baseline 0.0; file-backed 1; near-neighbor 1; blind A/B 5; exec 10; command 10; model 0; recorded 0; reviewed 0/5; review pending 5

reports/output_quality_scorecard.json 证据
通过

上下文

initial load 944/1000; quality density 137.7

reports/context_budget.json 证据
通过

运行矩阵

5 / 5 targets pass

reports/conformance_matrix.json 证据
通过

信任报告

0 secrets; 72 scripts; 3 network-capable scripts; 0 help smoke failures

reports/security_trust_report.json 证据
通过

权限批准

3/3 permissions approved; gaps 0; required file_write, network, subprocess

reports/security_trust_report.json + security/permission_policy.json 证据
通过

权限探针

4/4 targets probed; native 0; metadata fallback 4; residual risks 4

reports/runtime_permission_probes.json 证据
通过

组合治理

12 skills, 1 actionable; 0 actionable route collisions; 0 actionable owner gaps; 0 actionable stale; 0 actionable drift; 24 scoped non-actionable issues

reports/skill_atlas.json 证据
通过

运营回路

1 metadata events; adoption 0; missed 0; bad-output 0; risk low

reports/adoption_drift_report.json 证据
关注

人工批准

0 active waivers; 1 warning gates still need reviewer decision

reports/review_waivers.json 证据
通过

注册审计

yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures

reports/registry_audit.json + reports/install_simulation.json 证据
通过

发布路线

0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended

reports/promotion_decisions.json + reports/upgrade_check.json + docs/migration-v2.md 证据
+
通过

意图画布

intent confidence 100/100; Intent is clear enough to package the first routeable version.

reports/intent-confidence.json 证据
通过

触发实验

13 trigger cases; 0 misroutes; 0 ambiguous

reports/route_scorecard.json 证据
关注

输出实验

5/5 cases; with-skill 100.0; baseline 0.0; file-backed 1; near-neighbor 1; blind A/B 5; exec 10; command 10; model 0; recorded 0; reviewed 0/5; review pending 5

reports/output_quality_scorecard.json 证据
通过

上下文

initial load 944/1000; quality density 137.7

reports/context_budget.json 证据
通过

运行矩阵

5 / 5 targets pass

reports/conformance_matrix.json 证据
通过

信任报告

0 secrets; 73 scripts; 3 network-capable scripts; 0 help smoke failures

reports/security_trust_report.json 证据
通过

权限批准

3/3 permissions approved; gaps 0; required file_write, network, subprocess

reports/security_trust_report.json + security/permission_policy.json 证据
通过

权限探针

4/4 targets probed; native 0; metadata fallback 4; residual risks 4

reports/runtime_permission_probes.json 证据
通过

组合治理

12 skills, 1 actionable; 0 actionable route collisions; 0 actionable owner gaps; 0 actionable stale; 0 actionable drift; 24 scoped non-actionable issues

reports/skill_atlas.json 证据
通过

运营回路

1 metadata events; adoption 0; missed 0; bad-output 0; risk low

reports/adoption_drift_report.json 证据
关注

人工批准

0 active waivers; 1 warning gates still need reviewer decision

reports/review_waivers.json 证据
通过

注册审计

yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures

reports/registry_audit.json + reports/install_simulation.json 证据
通过

发布路线

0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended

reports/promotion_decisions.json + reports/upgrade_check.json + docs/migration-v2.md 证据
@@ -313,7 +313,7 @@
-

信任报告

Secret
0
脚本数
72
网络脚本
3
Help 失败
0
包体哈希
195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4
+

信任报告

Secret
0
脚本数
73
网络脚本
3
Help 失败
0
包体哈希
25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339

安全边界

高风险 secret、远程 inline execution、缺失依赖策略或无法解释的脚本接口应阻断 governed release。

@@ -344,12 +344,12 @@

注册审计

yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures

-

包体元数据

名称
yao-meta-skill
版本
1.1.0
Maturity
governed
Owner
Yao Team
License
MIT
信任级别
local
目标平台
openai, claude, generic, agent-skills-compatible, vscode
兼容通过
6/6
归档哈希
3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599
+

包体元数据

名称
yao-meta-skill
版本
1.1.0
Maturity
governed
Owner
Yao Team
License
MIT
信任级别
local
目标平台
openai, claude, generic, agent-skills-compatible, vscode
兼容通过
6/6
归档哈希
15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf

发布路线

0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended

-

包体验证

目标数
4
Adapter
4
归档存在
Zip 条目
499
失败数
0
警告数
0
归档哈希
3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599
+

包体验证

目标数
4
Adapter
4
归档存在
Zip 条目
503
失败数
0
警告数
0
归档哈希
15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf
diff --git a/reports/review-studio.json b/reports/review-studio.json index 34a5995..bcf9a5b 100644 --- a/reports/review-studio.json +++ b/reports/review-studio.json @@ -59,7 +59,7 @@ "key": "trust-report", "label": "信任报告", "status": "pass", - "detail": "0 secrets; 72 scripts; 3 network-capable scripts; 0 help smoke failures", + "detail": "0 secrets; 73 scripts; 3 network-capable scripts; 0 help smoke failures", "evidence": "reports/security_trust_report.json", "link": "security_trust_report.md" }, @@ -355,7 +355,7 @@ "label": "上下文成本", "score": 42, "reasons": [ - "入口约 350 个词/字,references 约 15124 个词/字。", + "入口约 350 个词/字,references 约 15206 个词/字。", "分数越高代表上下文成本越低。", "上下文成本偏高,建议压缩入口或拆分 references。" ] @@ -459,7 +459,7 @@ "已生成 Output Review Adjudication,可记录盲评决策、一致率和待评审项。" ], "gaps": [ - "上下文成本需要补强:入口约 350 个词/字,references 约 15124 个词/字。" + "上下文成本需要补强:入口约 350 个词/字,references 约 15206 个词/字。" ], "recommendations": [ "先改触发边界,再扩展工作流。", @@ -692,7 +692,7 @@ "path": "scripts", "label": "Deterministic helpers or local tooling", "kind": "folder", - "file_count": 72 + "file_count": 73 }, { "path": "evals", @@ -704,10 +704,10 @@ "path": "reports", "label": "Generated evidence and overview artifacts", "kind": "folder", - "file_count": 171 + "file_count": 173 } ], - "file_count": 307, + "file_count": 310, "folder_count": 4, "distribution": [ { @@ -732,7 +732,7 @@ }, { "label": "scripts", - "value": 72 + "value": 73 }, { "label": "evals", @@ -740,7 +740,7 @@ }, { "label": "reports", - "value": 171 + "value": 173 } ] }, @@ -861,7 +861,7 @@ "path": "scripts", "label": "Deterministic helpers or local tooling", "kind": "folder", - "file_count": 72 + "file_count": 73 }, { "path": "evals", @@ -873,7 +873,7 @@ "path": "reports", "label": "Generated evidence and overview artifacts", "kind": "folder", - "file_count": 171 + "file_count": 173 } ], "strengths": [ @@ -1207,8 +1207,8 @@ "failures": [] }, "trust_security": { - "scanned_files": 156, - "script_count": 72, + "scanned_files": 157, + "script_count": 73, "internal_module_count": 10, "secret_findings": 0, "dependency_files": [ @@ -1217,18 +1217,18 @@ "network_script_count": 3, "network_policy_covered_count": 3, "network_policy_missing_count": 0, - "file_write_script_count": 49, + "file_write_script_count": 50, "permission_required_count": 3, "permission_approved_count": 3, "permission_missing_count": 0, "permission_invalid_count": 0, "permission_expired_count": 0, - "help_smoke_checked_count": 62, + "help_smoke_checked_count": 63, "help_smoke_failed_count": 0, "interactive_script_count": 0, "package_hash_scope": "source-contract-without-generated-reports", - "package_hash_file_count": 156, - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "package_hash_file_count": 157, + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" }, "skill_atlas": { "skill_count": 12, @@ -1266,8 +1266,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4", - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, "compatibility": { "openai": "pass", @@ -1298,7 +1298,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", "package_verification": "reports/package_verification.json", "install_simulated": true, "install_simulation": "reports/install_simulation.json" @@ -1314,8 +1314,8 @@ "target_count": 4, "adapter_count": 4, "archive_present": true, - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", - "archive_entry_count": 499, + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", + "archive_entry_count": 503, "failure_count": 0, "warning_count": 0 }, @@ -1326,7 +1326,7 @@ "ok": true, "summary": { "archive_present": true, - "archive_entry_count": 499, + "archive_entry_count": 503, "archive_extracted": true, "entrypoint_loaded": true, "manifest_loaded": true, @@ -1393,12 +1393,12 @@ { "field": "archive_sha256", "from": "", - "to": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "to": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, { "field": "package_sha256", "from": "0000000000000000000000000000000000000000000000000000000000000000", - "to": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "to": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" } ] }, @@ -3132,7 +3132,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 31.02, + "duration_ms": 34.49, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3160,7 +3160,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 32.55, + "duration_ms": 33.15, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3183,7 +3183,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 30.25, + "duration_ms": 34.31, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3211,7 +3211,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 31.2, + "duration_ms": 30.67, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3234,7 +3234,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.99, + "duration_ms": 29.54, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3262,7 +3262,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.64, + "duration_ms": 28.43, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3285,7 +3285,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 30.23, + "duration_ms": 27.8, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3312,7 +3312,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.91, + "duration_ms": 27.96, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3335,7 +3335,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.16, + "duration_ms": 28.79, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3364,7 +3364,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.25, + "duration_ms": 28.95, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -3866,6 +3866,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -3931,6 +3932,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -3940,9 +3943,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -4046,7 +4049,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -4088,6 +4091,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -4133,14 +4137,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -4162,7 +4166,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -4183,9 +4187,9 @@ "strategy": "Ship the neutral source tree and expose OpenAI-facing interface metadata as a generated companion file.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/openai/adapter.json", @@ -4194,7 +4198,7 @@ }, "scripts": { "strategy": "Keep scripts as local package resources; expose help-smoke and permission metadata for reviewer approval before execution.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -4275,7 +4279,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -4317,6 +4321,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -4362,14 +4367,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -4389,7 +4394,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -4410,9 +4415,9 @@ "strategy": "Ship the neutral source tree and expose OpenAI-facing interface metadata as a generated companion file.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/openai/adapter.json", @@ -4421,7 +4426,7 @@ }, "scripts": { "strategy": "Keep scripts as local package resources; expose help-smoke and permission metadata for reviewer approval before execution.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -4671,6 +4676,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -4736,6 +4742,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -4745,9 +4753,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -4851,7 +4859,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -4893,6 +4901,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -4938,14 +4947,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -4967,7 +4976,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -4988,9 +4997,9 @@ "strategy": "Preserve the source tree directly; write target notes in targets/claude/README.md.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/claude/adapter.json", @@ -4999,7 +5008,7 @@ }, "scripts": { "strategy": "Scripts remain local package resources and must be reviewed through trust and permission reports before use.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -5080,7 +5089,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -5122,6 +5131,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -5167,14 +5177,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -5194,7 +5204,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -5215,9 +5225,9 @@ "strategy": "Preserve the source tree directly; write target notes in targets/claude/README.md.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/claude/adapter.json", @@ -5226,7 +5236,7 @@ }, "scripts": { "strategy": "Scripts remain local package resources and must be reviewed through trust and permission reports before use.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -5476,6 +5486,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -5541,6 +5552,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -5550,9 +5563,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -5656,7 +5669,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -5698,6 +5711,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -5743,14 +5757,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -5772,7 +5786,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -5793,9 +5807,9 @@ "strategy": "Preserve references, scripts, assets, evals, reports, and adapter metadata as relative package resources.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/generic/adapter.json" @@ -5803,7 +5817,7 @@ }, "scripts": { "strategy": "Expose script and permission metadata for downstream clients or installers to enforce.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -5878,7 +5892,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -5920,6 +5934,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -5965,14 +5980,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -5992,7 +6007,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -6013,9 +6028,9 @@ "strategy": "Preserve references, scripts, assets, evals, reports, and adapter metadata as relative package resources.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/generic/adapter.json" @@ -6023,7 +6038,7 @@ }, "scripts": { "strategy": "Expose script and permission metadata for downstream clients or installers to enforce.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -6265,6 +6280,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -6330,6 +6346,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -6339,9 +6357,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -6445,7 +6463,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -6487,6 +6505,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -6532,14 +6551,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -6561,7 +6580,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -6582,9 +6601,9 @@ "strategy": "Keep optional directories as relative resources next to SKILL.md.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "SKILL.md", @@ -6593,7 +6612,7 @@ }, "scripts": { "strategy": "Scripts remain local optional resources and should advertise --help when executable.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -6667,7 +6686,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -6709,6 +6728,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -6754,14 +6774,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -6781,7 +6801,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -6802,9 +6822,9 @@ "strategy": "Keep optional directories as relative resources next to SKILL.md.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "SKILL.md", @@ -6813,7 +6833,7 @@ }, "scripts": { "strategy": "Scripts remain local optional resources and should advertise --help when executable.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -7054,6 +7074,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -7119,6 +7140,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", @@ -7128,9 +7151,9 @@ ], "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 } }, "eval_plan": { @@ -7234,7 +7257,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -7276,6 +7299,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -7321,14 +7345,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -7350,7 +7374,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -7371,9 +7395,9 @@ "strategy": "Install as project or user scoped skill source, preserving relative references and scripts.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/vscode/adapter.json", @@ -7382,7 +7406,7 @@ }, "scripts": { "strategy": "Scripts require workspace trust and operator/client approval outside this compiler.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -7460,7 +7484,7 @@ }, "file_write": { "required": true, - "script_count": 49, + "script_count": 50, "scripts": [ "scripts/adjudicate_output_review.py", "scripts/build_confusion_matrix.py", @@ -7502,6 +7526,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -7547,14 +7572,14 @@ }, "help_smoke": { "enabled": true, - "checked_count": 62, + "checked_count": 63, "failed_count": 0, "failed_scripts": [] }, "trust_summary": { "secret_findings": 0, "network_script_count": 3, - "file_write_script_count": 49, + "file_write_script_count": 50, "subprocess_script_count": 7, "interactive_script_count": 0, "help_smoke_failed_count": 0 @@ -7574,7 +7599,7 @@ ], "capability_counts": { "network": 3, - "file_write": 49, + "file_write": 50, "subprocess": 7, "interactive": 0 }, @@ -7595,9 +7620,9 @@ "strategy": "Install as project or user scoped skill source, preserving relative references and scripts.", "counts": { "references": 32, - "scripts": 72, + "scripts": 73, "assets": 2, - "reports": 41 + "reports": 43 }, "generated_files": [ "targets/vscode/adapter.json", @@ -7606,7 +7631,7 @@ }, "scripts": { "strategy": "Scripts require workspace trust and operator/client approval outside this compiler.", - "script_count": 72, + "script_count": 73, "help_smoke_failed_count": 0 }, "permissions": { @@ -8246,8 +8271,8 @@ "ok": true, "skill_dir": ".", "summary": { - "scanned_files": 156, - "script_count": 72, + "scanned_files": 157, + "script_count": 73, "internal_module_count": 10, "secret_findings": 0, "dependency_files": [ @@ -8256,18 +8281,18 @@ "network_script_count": 3, "network_policy_covered_count": 3, "network_policy_missing_count": 0, - "file_write_script_count": 49, + "file_write_script_count": 50, "permission_required_count": 3, "permission_approved_count": 3, "permission_missing_count": 0, "permission_invalid_count": 0, "permission_expired_count": 0, - "help_smoke_checked_count": 62, + "help_smoke_checked_count": 63, "help_smoke_failed_count": 0, "interactive_script_count": 0, "package_hash_scope": "source-contract-without-generated-reports", - "package_hash_file_count": 156, - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "package_hash_file_count": 157, + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" }, "failures": [], "warnings": [], @@ -8962,6 +8987,20 @@ "network_urls": [], "network_hosts": [] }, + { + "path": "scripts/render_telemetry_hook_recipes.py", + "interface": "cli", + "interface_declared": false, + "interface_reason": "Default CLI classification; add SCRIPT_INTERFACE for internal modules.", + "has_argparse": true, + "has_main_guard": true, + "uses_input": false, + "uses_network": false, + "uses_file_write": true, + "uses_subprocess": false, + "network_urls": [], + "network_hosts": [] + }, { "path": "scripts/resource_boundary_check.py", "interface": "cli", @@ -9329,9 +9368,9 @@ "help_smoke": { "enabled": true, "timeout_seconds": 5.0, - "candidate_count": 62, - "checked_count": 62, - "passed_count": 62, + "candidate_count": 63, + "checked_count": 63, + "passed_count": 63, "failed_count": 0, "skipped_count": 10, "failed_scripts": [], @@ -9816,6 +9855,16 @@ "stdout_excerpt": "usage: render_system_model.py [-h] [--output-md OUTPUT_MD]\n [--output-json OUTPUT_JSON]\n [skill_dir]\n\nRender a systems-thinking model for a skill package.\n\npositional arguments:\n sk", "stderr_excerpt": "" }, + { + "path": "scripts/render_telemetry_hook_recipes.py", + "command": "python3 scripts/render_telemetry_hook_recipes.py --help", + "returncode": 0, + "timed_out": false, + "passed": true, + "has_help_text": true, + "stdout_excerpt": "usage: render_telemetry_hook_recipes.py [-h] [--output-json OUTPUT_JSON]\n [--output-md OUTPUT_MD]\n [--output-jsonl OUTPUT_JSONL]\n ", + "stderr_excerpt": "" + }, { "path": "scripts/resource_boundary_check.py", "command": "python3 scripts/resource_boundary_check.py --help", @@ -10092,6 +10141,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", @@ -10167,10 +10217,10 @@ "context_budget_tier": "production", "context_budget_limit": 1000, "skill_body_tokens": 751, - "other_text_tokens": 927304, + "other_text_tokens": 936263, "estimated_initial_load_tokens": 944, - "estimated_total_text_tokens": 928055, - "relevant_file_count": 403, + "estimated_total_text_tokens": 937014, + "relevant_file_count": 409, "unused_resource_dirs": [], "quality_signal_points": 130, "quality_density": 137.7 @@ -11082,6 +11132,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -11169,8 +11220,8 @@ "report": "reports/adoption_drift_report.json", "risk_band": "low", "event_count": 1, - "adoption_sample_count": 1, - "adoption_rate": 100.0, + "adoption_sample_count": 0, + "adoption_rate": 0, "candidate_count": 0 } }, @@ -12169,8 +12220,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4", - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, "compatibility": { "openai": "pass", @@ -12201,7 +12252,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", "package_verification": "reports/package_verification.json", "install_simulated": true, "install_simulation": "reports/install_simulation.json" @@ -12226,7 +12277,7 @@ "vscode" ], "package_metadata": "registry/packages/yao-meta-skill.json", - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" } ] }, @@ -12249,8 +12300,8 @@ "target_count": 4, "adapter_count": 4, "archive_present": true, - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", - "archive_entry_count": 499, + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", + "archive_entry_count": 503, "failure_count": 0, "warning_count": 0 }, @@ -12915,7 +12966,7 @@ "installed_skill_dir": "dist/install-simulation/simulate-yao-meta-skill/yao-meta-skill", "summary": { "archive_present": true, - "archive_entry_count": 499, + "archive_entry_count": 503, "archive_extracted": true, "entrypoint_loaded": true, "manifest_loaded": true, @@ -13257,12 +13308,12 @@ { "field": "archive_sha256", "from": "", - "to": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "to": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, { "field": "package_sha256", "from": "0000000000000000000000000000000000000000000000000000000000000000", - "to": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "to": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" } ] }, diff --git a/reports/security_trust_report.json b/reports/security_trust_report.json index beb86c6..6b65e85 100644 --- a/reports/security_trust_report.json +++ b/reports/security_trust_report.json @@ -2,8 +2,8 @@ "ok": true, "skill_dir": ".", "summary": { - "scanned_files": 156, - "script_count": 72, + "scanned_files": 157, + "script_count": 73, "internal_module_count": 10, "secret_findings": 0, "dependency_files": [ @@ -12,18 +12,18 @@ "network_script_count": 3, "network_policy_covered_count": 3, "network_policy_missing_count": 0, - "file_write_script_count": 49, + "file_write_script_count": 50, "permission_required_count": 3, "permission_approved_count": 3, "permission_missing_count": 0, "permission_invalid_count": 0, "permission_expired_count": 0, - "help_smoke_checked_count": 62, + "help_smoke_checked_count": 63, "help_smoke_failed_count": 0, "interactive_script_count": 0, "package_hash_scope": "source-contract-without-generated-reports", - "package_hash_file_count": 156, - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "package_hash_file_count": 157, + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" }, "failures": [], "warnings": [], @@ -718,6 +718,20 @@ "network_urls": [], "network_hosts": [] }, + { + "path": "scripts/render_telemetry_hook_recipes.py", + "interface": "cli", + "interface_declared": false, + "interface_reason": "Default CLI classification; add SCRIPT_INTERFACE for internal modules.", + "has_argparse": true, + "has_main_guard": true, + "uses_input": false, + "uses_network": false, + "uses_file_write": true, + "uses_subprocess": false, + "network_urls": [], + "network_hosts": [] + }, { "path": "scripts/resource_boundary_check.py", "interface": "cli", @@ -1085,9 +1099,9 @@ "help_smoke": { "enabled": true, "timeout_seconds": 5.0, - "candidate_count": 62, - "checked_count": 62, - "passed_count": 62, + "candidate_count": 63, + "checked_count": 63, + "passed_count": 63, "failed_count": 0, "skipped_count": 10, "failed_scripts": [], @@ -1572,6 +1586,16 @@ "stdout_excerpt": "usage: render_system_model.py [-h] [--output-md OUTPUT_MD]\n [--output-json OUTPUT_JSON]\n [skill_dir]\n\nRender a systems-thinking model for a skill package.\n\npositional arguments:\n sk", "stderr_excerpt": "" }, + { + "path": "scripts/render_telemetry_hook_recipes.py", + "command": "python3 scripts/render_telemetry_hook_recipes.py --help", + "returncode": 0, + "timed_out": false, + "passed": true, + "has_help_text": true, + "stdout_excerpt": "usage: render_telemetry_hook_recipes.py [-h] [--output-json OUTPUT_JSON]\n [--output-md OUTPUT_MD]\n [--output-jsonl OUTPUT_JSONL]\n ", + "stderr_excerpt": "" + }, { "path": "scripts/resource_boundary_check.py", "command": "python3 scripts/resource_boundary_check.py --help", @@ -1848,6 +1872,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/run_conformance_suite.py", "scripts/run_description_optimization_suite.py", "scripts/run_output_eval.py", diff --git a/reports/security_trust_report.md b/reports/security_trust_report.md index 3243b77..f7cba36 100644 --- a/reports/security_trust_report.md +++ b/reports/security_trust_report.md @@ -1,22 +1,22 @@ # Security Trust Report - OK: `True` -- Scanned files: `156` -- Scripts: `72` +- Scanned files: `157` +- Scripts: `73` - Internal script modules: `10` - Secret findings: `0` - Network-capable scripts: `3` - Network policy covered scripts: `3` - Network policy missing scripts: `0` -- File-write scripts: `49` +- File-write scripts: `50` - Permission approvals: `3 / 3` - Permission approval gaps: `0` -- CLI help smoke checked: `62` +- CLI help smoke checked: `63` - CLI help smoke failures: `0` - Interactive scripts: `0` - Package hash scope: `source-contract-without-generated-reports` -- Package hash files: `156` -- Package SHA256: `195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4` +- Package hash files: `157` +- Package SHA256: `25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339` ## Failures @@ -54,8 +54,8 @@ - Enabled: `True` - Timeout seconds: `5.0` -- Checked scripts: `62` -- Passed scripts: `62` +- Checked scripts: `63` +- Passed scripts: `63` - Failed scripts: `none` ## Script Surface @@ -110,6 +110,7 @@ | scripts/render_skill_overview.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. | | scripts/render_social_preview.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. | | scripts/render_system_model.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. | +| scripts/render_telemetry_hook_recipes.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. | | scripts/resource_boundary_check.py | cli | False | True | True | False | False | False | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. | | scripts/review_studio_formatting.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_studio.py to format report dictionaries as audit UI panels. | | scripts/review_studio_gates.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_studio.py to keep Review Studio gate evaluation separate from HTML rendering. | diff --git a/reports/skill-os-2-review.md b/reports/skill-os-2-review.md index b39ea19..3ac584c 100644 --- a/reports/skill-os-2-review.md +++ b/reports/skill-os-2-review.md @@ -25,6 +25,7 @@ Yao Meta Skill is no longer only a Meta Skill factory. The current working tree - CLI Telemetry Capture v0 for opt-in `yao.py` command-run metadata that records command name, source, outcome, failure class, and timestamp without command arguments or raw user/model content. - External Telemetry Import v0 for whole-file validated metadata-only JSONL ingestion from non-CLI clients, with dry-run support and all-or-nothing rejection on raw content fields or schema violations. - Telemetry Emit Hook v0 for Browser/Chrome/IDE/wrapper integrations to append one validated metadata-only external event into a local spool before import, with dry-run validation and raw-content blocking. +- Telemetry Hook Recipes v0 for Browser, Chrome, VS Code, CLI wrapper, and provider-adapter recipe generation with dry-run commands, metadata-only privacy checks, and explicit non-claiming of native host integration. - Review Waivers v0 for human warning acceptance with reviewer, reason, scope, expiry, and blocker-safe policy. - Governed Permission Gates v0 for reviewer-approved network, file-write, and subprocess capabilities with scope, reason, expiry, evidence, and target-enforcement mapping. - Runtime Permission Probes v0 for packaged target adapter checks, explicit native-enforcement flags, metadata fallback evidence, and residual permission risks. @@ -36,7 +37,7 @@ Yao Meta Skill is no longer only a Meta Skill factory. The current working tree - Output Review Adjudication now preserves blind-review integrity by hiding expected winners for pending or invalid reviewer decisions; answer keys are revealed only after a valid A/B decision exists for that case. - Provider Output Eval Runner v0 so `python3 scripts/yao.py output-exec --provider-runner openai` can collect real provider-backed model evidence through a reviewed OpenAI Responses API compatible runner instead of ad hoc shell glue. -This is still not the final world-class state. Target-native behavior contracts are now explicit, VS Code / Copilot package metadata is auditable, local output-eval command execution is wired, blind-review answers remain hidden until valid decisions exist, a provider-backed output runner exists, installer-level permission coverage is now locally enforced during install simulation and local install sync, opt-in `yao.py` CLI telemetry can capture metadata-only real run signals, external clients can now emit one validated metadata-only event into a local spool, validated external JSONL imports can bring those non-CLI client signals into the same drift loop, and Skill Atlas now consumes aggregate drift reports. Review Studio keeps pending human adjudication visible as a warning instead of treating it as a clean pass. Deeper provider-native execution transforms, platform-native automatic client telemetry integrations, provider-native installer integration, real provider holdout runs, real human adjudication decisions, and native runtime permission enforcement remain open. +This is still not the final world-class state. Target-native behavior contracts are now explicit, VS Code / Copilot package metadata is auditable, local output-eval command execution is wired, blind-review answers remain hidden until valid decisions exist, a provider-backed output runner exists, installer-level permission coverage is now locally enforced during install simulation and local install sync, opt-in `yao.py` CLI telemetry can capture metadata-only real run signals, external clients can now emit one validated metadata-only event into a local spool, hook recipes now make Browser/Chrome/VS Code/wrapper/provider-adapter integration commands auditable, validated external JSONL imports can bring those non-CLI client signals into the same drift loop, and Skill Atlas now consumes aggregate drift reports. Review Studio keeps pending human adjudication visible as a warning instead of treating it as a clean pass. Deeper provider-native execution transforms, platform-native automatic client telemetry implementations, provider-native installer integration, real provider holdout runs, real human adjudication decisions, and native runtime permission enforcement remain open. ## Coverage Matrix @@ -57,7 +58,7 @@ This is still not the final world-class state. Target-native behavior contracts | Install Simulation | `scripts/simulate_install.py`, `reports/install_simulation.md`, `tests/verify_install_simulation.py` with installer permission coverage checks | v0 landed | | Local Install Sync Preflight | `scripts/sync_local_install.py`, `tests/verify_local_install_sync.py`, `Makefile` package-check prerequisites | v0 landed | | Upgrade Check | `scripts/upgrade_check.py`, `reports/upgrade_check.md`, `tests/verify_upgrade_check.py` | v0 landed | -| Telemetry & Drift | `scripts/render_adoption_drift_report.py`, `scripts/yao_cli_telemetry.py`, `scripts/emit_telemetry_event.py`, `scripts/import_telemetry_events.py`, `reports/adoption_drift_report.md`, `tests/verify_adoption_drift.py`, `tests/verify_telemetry_emit.py`, `tests/verify_telemetry_import.py`, `tests/verify_yao_cli.py`, `references/telemetry-drift-method.md` | v0 landed | +| Telemetry & Drift | `scripts/render_adoption_drift_report.py`, `scripts/yao_cli_telemetry.py`, `scripts/emit_telemetry_event.py`, `scripts/render_telemetry_hook_recipes.py`, `scripts/import_telemetry_events.py`, `reports/adoption_drift_report.md`, `reports/telemetry_hook_recipes.md`, `tests/verify_adoption_drift.py`, `tests/verify_telemetry_emit.py`, `tests/verify_telemetry_hooks.py`, `tests/verify_telemetry_import.py`, `tests/verify_yao_cli.py`, `references/telemetry-drift-method.md` | v0 landed | | Review Waivers | `scripts/render_review_waivers.py`, `reports/review_waivers.md`, `tests/verify_review_waivers.py`, `references/review-waiver-method.md` | v0 landed | | Governed Permission Gates | `security/permission_policy.json`, `scripts/trust_check.py`, `scripts/render_review_studio.py`, `tests/verify_trust_check.py`, `tests/verify_review_studio.py` | v0 landed | | Runtime Permission Probes | `scripts/probe_runtime_permissions.py`, `reports/runtime_permission_probes.md`, `tests/verify_runtime_permission_probes.py`, `tests/verify_review_studio.py` | v0 landed | @@ -87,9 +88,9 @@ Next move: add richer source-line anchors inside generated reports and record re ### 4. Multi-skill operation now links Atlas with drift, but needs platform-native capture -The new Skill Atlas can scan a workspace and report catalog, route overlap, dependency graph, stale skill, missing owner/review metadata, aggregate drift signals, and no-route opportunities. It now also supports `skill_atlas/policy.json` so release gates distinguish actionable library skills from examples and fixtures while keeping full visibility. Adoption Drift v0 can record metadata-only local events, block raw prompt/output fields, summarize missed-trigger, bad-output, script-error, and review-overdue signals, feed next iteration candidates into Review Studio, and publish aggregate drift input for Atlas. `yao.py` now adds opt-in automatic CLI run capture through `YAO_CLI_TELEMETRY=1` or `--record-cli-telemetry`, recording only `source=yao_cli`, normalized subcommand name, outcome, failure class, and timestamp. `telemetry-emit` gives Browser/Chrome/IDE/wrapper integrations a stable local hook for appending one normalized external event into `.yao/telemetry_spool/external_events.jsonl`, with dry-run validation and no raw content fields. `telemetry-import` accepts already-sanitized external client JSONL or the emitted spool, validates the whole file before appending, supports dry-run, defaults `source=external`, and rejects any raw content or unknown metadata fields without mutating the local event stream. It still needs platform-native integrations that call the emit hook automatically from real clients. +The new Skill Atlas can scan a workspace and report catalog, route overlap, dependency graph, stale skill, missing owner/review metadata, aggregate drift signals, and no-route opportunities. It now also supports `skill_atlas/policy.json` so release gates distinguish actionable library skills from examples and fixtures while keeping full visibility. Adoption Drift v0 can record metadata-only local events, block raw prompt/output fields, summarize missed-trigger, bad-output, script-error, and review-overdue signals, feed next iteration candidates into Review Studio, and publish aggregate drift input for Atlas. `yao.py` now adds opt-in automatic CLI run capture through `YAO_CLI_TELEMETRY=1` or `--record-cli-telemetry`, recording only `source=yao_cli`, normalized subcommand name, outcome, failure class, and timestamp. `telemetry-emit` gives Browser/Chrome/IDE/wrapper integrations a stable local hook for appending one normalized external event into `.yao/telemetry_spool/external_events.jsonl`, with dry-run validation and no raw content fields. `telemetry-hooks` renders Browser, Chrome, VS Code, CLI wrapper, and provider-adapter recipes with dry-run commands, import commands, trigger points, and explicit `native_auto_capture=false` caveats. `telemetry-import` accepts already-sanitized external client JSONL or the emitted spool, validates the whole file before appending, supports dry-run, defaults `source=external`, and rejects any raw content or unknown metadata fields without mutating the local event stream. It still needs platform-native implementations that call the emit hook automatically from real clients. -Next move: wire Browser, Chrome, IDE, and provider-native integrations to call the emit hook automatically, then let Atlas rank stale, drifting, or conflicting skills by real usage impact. +Next move: replace the recipes with real Browser, Chrome, IDE, and provider-native implementations that call the emit hook automatically, then let Atlas rank stale, drifting, or conflicting skills by real usage impact. ### 5. Trust report is structural, not full security review @@ -104,22 +105,22 @@ 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, `10` declared internal modules, `3 / 3` network-capable scripts covered by bounded host policy, `62 / 62` CLI help smoke checks passing across `72` scripts, source-contract hash scope explicit | +| Trust | `0` secret findings, `1` pinned dependency file, `10` declared internal modules, `3 / 3` network-capable scripts covered by bounded host policy, `63 / 63` CLI help smoke checks passing across `73` 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, `499` zip entries, `0` failures, `0` warnings | -| Install Simulation | archive with `499` 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, `503` zip entries, `0` failures, `0` warnings | +| Install Simulation | archive with `503` 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`, 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, `0` adoption samples, adoption `0`, risk band `low`; optional `yao.py` CLI capture, external client `telemetry-emit`, `5` `telemetry-hooks` recipes, 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 | | Review Annotations | ledger generated; current release has `0` reviewer annotations and `0` open annotation blockers | | Review Studio | decision `review`, world-class score `92`, `13` gates, `0` blockers, `2` warnings, `2` review actions, `0` open annotation blockers | | IR-first Packaging | `openai`, `claude`, `generic`, and `vscode` adapters include compiler contracts, permission contracts, target-native behavior contracts, IR provenance, semantic parity checks, and install-scope notes where applicable | | Context Budget | initial load `944/1000`, under the production budget | -| CI | `make ci-test` target count is `58` after the telemetry emit hook gate update | +| CI | `make ci-test` target count is `59` after the telemetry hook recipe gate update | ## Next Highest-Leverage Moves @@ -127,4 +128,4 @@ Next move: add real client or installer permission enforcement integration. 2. Add native client or installer runtime enforcement for approved high-permission capabilities. 3. Run the new provider-backed output runner against holdout cases with real credentials, then record the current blind A/B decisions before claiming fully ready status. 4. Add real reviewer annotation records during the next human review pass. -5. Wire platform-native clients to call `telemetry-emit` automatically, not only through wrapper scripts. +5. Replace `telemetry-hooks` recipes with platform-native clients that call `telemetry-emit` automatically. diff --git a/reports/skill-overview.html b/reports/skill-overview.html index 8a14c93..7843327 100644 --- a/reports/skill-overview.html +++ b/reports/skill-overview.html @@ -609,7 +609,7 @@
  • 把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。
  • Skill 作者、复用团队和后续 reviewer。Skill 作者、复用团队和后续 reviewer。
  • 创建完成后建议先打开 reports/skill-overview.html,再继续扩展包体。创建完成后建议先打开 reports/skill-overview.html,再继续扩展包体。
-
完整度100SKILL.md 已存在,是 Skill 的入口。SKILL.md 已存在,是 Skill 的入口。
触发清晰100frontmatter description 已存在,具备基础路由面。frontmatter description 已存在,具备基础路由面。
证据充分100已生成 20 / 20 类报告证据。已生成 20 / 20 类报告证据。
上下文成本42入口约 350 个词/字,references 约 15124 个词/字。入口约 350 个词/字,references 约 15124 个词/字。
+
完整度100SKILL.md 已存在,是 Skill 的入口。SKILL.md 已存在,是 Skill 的入口。
触发清晰100frontmatter description 已存在,具备基础路由面。frontmatter description 已存在,具备基础路由面。
证据充分100已生成 20 / 20 类报告证据。已生成 20 / 20 类报告证据。
上下文成本42入口约 350 个词/字,references 约 15206 个词/字。入口约 350 个词/字,references 约 15206 个词/字。
@@ -641,10 +641,10 @@

指标判读Reading

先看雷达图判断能力短板,再看下方每项分数的证据原因。分数不是装饰数字,必须和本地文件、reports 证据或证据不足提示对应。Read the radar first for weak spots, then inspect each score with its evidence. Scores must map to local files, reports, or explicit evidence gaps.

-
  1. 稳定Stable完整度100SKILL.md 已存在,是 Skill 的入口。SKILL.md 已存在,是 Skill 的入口。
  2. 稳定Stable触发清晰100frontmatter description 已存在,具备基础路由面。frontmatter description 已存在,具备基础路由面。
  3. 稳定Stable证据充分100已生成 20 / 20 类报告证据。已生成 20 / 20 类报告证据。
  4. 稳定Stable可维护性100SKILL.md 约 350 个词/字。SKILL.md 约 350 个词/字。
  5. 稳定Stable可迁移性100agents/interface.yaml 已存在。agents/interface.yaml 已存在。
  6. 关注Watch上下文成本42入口约 350 个词/字,references 约 15124 个词/字。入口约 350 个词/字,references 约 15124 个词/字。
+
  1. 稳定Stable完整度100SKILL.md 已存在,是 Skill 的入口。SKILL.md 已存在,是 Skill 的入口。
  2. 稳定Stable触发清晰100frontmatter description 已存在,具备基础路由面。frontmatter description 已存在,具备基础路由面。
  3. 稳定Stable证据充分100已生成 20 / 20 类报告证据。已生成 20 / 20 类报告证据。
  4. 稳定Stable可维护性100SKILL.md 约 350 个词/字。SKILL.md 约 350 个词/字。
  5. 稳定Stable可迁移性100agents/interface.yaml 已存在。agents/interface.yaml 已存在。
  6. 关注Watch上下文成本42入口约 350 个词/字,references 约 15206 个词/字。入口约 350 个词/字,references 约 15206 个词/字。
-
完整度100
  • SKILL.md 已存在,是 Skill 的入口。SKILL.md 已存在,是 Skill 的入口。
  • README.md 已存在,便于人工阅读。README.md 已存在,便于人工阅读。
  • agents/interface.yaml 已存在,便于跨平台适配。agents/interface.yaml 已存在,便于跨平台适配。
触发清晰100
  • frontmatter description 已存在,具备基础路由面。frontmatter description 已存在,具备基础路由面。
  • description 有足够长度说明任务边界。description 有足够长度说明任务边界。
  • description 已包含使用场景或排除边界信号。description 已包含使用场景或排除边界信号。
证据充分100
  • 已生成 20 / 20 类报告证据。已生成 20 / 20 类报告证据。
  • skill-ir.json 已存在。skill-ir.json 已存在。
  • compiled_targets.json 已存在。compiled_targets.json 已存在。
可维护性100
  • SKILL.md 约 350 个词/字。SKILL.md 约 350 个词/字。
  • 入口文件保持克制,可维护性较好。入口文件保持克制,可维护性较好。
  • references/ 已承载扩展指导。references/ 已承载扩展指导。
可迁移性100
  • agents/interface.yaml 已存在。agents/interface.yaml 已存在。
  • manifest.json 已存在。manifest.json 已存在。
  • 目标平台或 adapter target 已声明。目标平台或 adapter target 已声明。
上下文成本42
  • 入口约 350 个词/字,references 约 15124 个词/字。入口约 350 个词/字,references 约 15124 个词/字。
  • 分数越高代表上下文成本越低。分数越高代表上下文成本越低。
  • 上下文成本偏高,建议压缩入口或拆分 references。上下文成本偏高,建议压缩入口或拆分 references。
+
完整度100
  • SKILL.md 已存在,是 Skill 的入口。SKILL.md 已存在,是 Skill 的入口。
  • README.md 已存在,便于人工阅读。README.md 已存在,便于人工阅读。
  • agents/interface.yaml 已存在,便于跨平台适配。agents/interface.yaml 已存在,便于跨平台适配。
触发清晰100
  • frontmatter description 已存在,具备基础路由面。frontmatter description 已存在,具备基础路由面。
  • description 有足够长度说明任务边界。description 有足够长度说明任务边界。
  • description 已包含使用场景或排除边界信号。description 已包含使用场景或排除边界信号。
证据充分100
  • 已生成 20 / 20 类报告证据。已生成 20 / 20 类报告证据。
  • skill-ir.json 已存在。skill-ir.json 已存在。
  • compiled_targets.json 已存在。compiled_targets.json 已存在。
可维护性100
  • SKILL.md 约 350 个词/字。SKILL.md 约 350 个词/字。
  • 入口文件保持克制,可维护性较好。入口文件保持克制,可维护性较好。
  • references/ 已承载扩展指导。references/ 已承载扩展指导。
可迁移性100
  • agents/interface.yaml 已存在。agents/interface.yaml 已存在。
  • manifest.json 已存在。manifest.json 已存在。
  • 目标平台或 adapter target 已声明。目标平台或 adapter target 已声明。
上下文成本42
  • 入口约 350 个词/字,references 约 15206 个词/字。入口约 350 个词/字,references 约 15206 个词/字。
  • 分数越高代表上下文成本越低。分数越高代表上下文成本越低。
  • 上下文成本偏高,建议压缩入口或拆分 references。上下文成本偏高,建议压缩入口或拆分 references。
@@ -720,7 +720,7 @@
- +
类型Type证据Evidence建议Action
强项Strength触发面保持精简,并锚定在 frontmatter description。The trigger surface stays lean and anchored in the frontmatter description.保留并复用Keep
强项Strength已生成 Skill IR,核心语义可先于平台打包被审查和迁移。已生成 Skill IR,核心语义可先于平台打包被审查和迁移。保留并复用Keep
强项Strength已生成目标编译报告,可审查 IR 到 OpenAI、Claude、generic 等目标契约的映射。已生成目标编译报告,可审查 IR 到 OpenAI、Claude、generic 等目标契约的映射。保留并复用Keep
缺口Gap上下文成本需要补强:入口约 350 个词/字,references 约 15124 个词/字。上下文成本需要补强:入口约 350 个词/字,references 约 15124 个词/字。纳入下一轮修复Fix next
强项Strength触发面保持精简,并锚定在 frontmatter description。The trigger surface stays lean and anchored in the frontmatter description.保留并复用Keep
强项Strength已生成 Skill IR,核心语义可先于平台打包被审查和迁移。已生成 Skill IR,核心语义可先于平台打包被审查和迁移。保留并复用Keep
强项Strength已生成目标编译报告,可审查 IR 到 OpenAI、Claude、generic 等目标契约的映射。已生成目标编译报告,可审查 IR 到 OpenAI、Claude、generic 等目标契约的映射。保留并复用Keep
缺口Gap上下文成本需要补强:入口约 350 个词/字,references 约 15206 个词/字。上下文成本需要补强:入口约 350 个词/字,references 约 15206 个词/字。纳入下一轮修复Fix next
@@ -771,7 +771,7 @@

让 reviewer 快速确认关键文件、目录和资产分布。Lets reviewers confirm key files, directories, and asset distribution quickly.

-
资产分布307项SKILL.mdREADME.mdagents/interface.yamlmanifest.jsonreferencesscripts
资产分布图展示当前包体的文件和目录重心。
+
资产分布310项SKILL.mdREADME.mdagents/interface.yamlmanifest.jsonreferencesscripts
资产分布图展示当前包体的文件和目录重心。
diff --git a/reports/skill-overview.json b/reports/skill-overview.json index 03e940e..da970a6 100644 --- a/reports/skill-overview.json +++ b/reports/skill-overview.json @@ -96,7 +96,7 @@ "label": "上下文成本", "score": 42, "reasons": [ - "入口约 350 个词/字,references 约 15124 个词/字。", + "入口约 350 个词/字,references 约 15206 个词/字。", "分数越高代表上下文成本越低。", "上下文成本偏高,建议压缩入口或拆分 references。" ] @@ -200,7 +200,7 @@ "已生成 Output Review Adjudication,可记录盲评决策、一致率和待评审项。" ], "gaps": [ - "上下文成本需要补强:入口约 350 个词/字,references 约 15124 个词/字。" + "上下文成本需要补强:入口约 350 个词/字,references 约 15206 个词/字。" ], "recommendations": [ "先改触发边界,再扩展工作流。", @@ -433,7 +433,7 @@ "path": "scripts", "label": "Deterministic helpers or local tooling", "kind": "folder", - "file_count": 72 + "file_count": 73 }, { "path": "evals", @@ -445,10 +445,10 @@ "path": "reports", "label": "Generated evidence and overview artifacts", "kind": "folder", - "file_count": 171 + "file_count": 173 } ], - "file_count": 307, + "file_count": 310, "folder_count": 4, "distribution": [ { @@ -473,7 +473,7 @@ }, { "label": "scripts", - "value": 72 + "value": 73 }, { "label": "evals", @@ -481,7 +481,7 @@ }, { "label": "reports", - "value": 171 + "value": 173 } ] }, @@ -602,7 +602,7 @@ "path": "scripts", "label": "Deterministic helpers or local tooling", "kind": "folder", - "file_count": 72 + "file_count": 73 }, { "path": "evals", @@ -614,7 +614,7 @@ "path": "reports", "label": "Generated evidence and overview artifacts", "kind": "folder", - "file_count": 171 + "file_count": 173 } ], "strengths": [ @@ -948,8 +948,8 @@ "failures": [] }, "trust_security": { - "scanned_files": 156, - "script_count": 72, + "scanned_files": 157, + "script_count": 73, "internal_module_count": 10, "secret_findings": 0, "dependency_files": [ @@ -958,18 +958,18 @@ "network_script_count": 3, "network_policy_covered_count": 3, "network_policy_missing_count": 0, - "file_write_script_count": 49, + "file_write_script_count": 50, "permission_required_count": 3, "permission_approved_count": 3, "permission_missing_count": 0, "permission_invalid_count": 0, "permission_expired_count": 0, - "help_smoke_checked_count": 62, + "help_smoke_checked_count": 63, "help_smoke_failed_count": 0, "interactive_script_count": 0, "package_hash_scope": "source-contract-without-generated-reports", - "package_hash_file_count": 156, - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "package_hash_file_count": 157, + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" }, "skill_atlas": { "skill_count": 12, @@ -1007,8 +1007,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4", - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, "compatibility": { "openai": "pass", @@ -1039,7 +1039,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", "package_verification": "reports/package_verification.json", "install_simulated": true, "install_simulation": "reports/install_simulation.json" @@ -1055,8 +1055,8 @@ "target_count": 4, "adapter_count": 4, "archive_present": true, - "archive_sha256": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599", - "archive_entry_count": 499, + "archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf", + "archive_entry_count": 503, "failure_count": 0, "warning_count": 0 }, @@ -1067,7 +1067,7 @@ "ok": true, "summary": { "archive_present": true, - "archive_entry_count": 499, + "archive_entry_count": 503, "archive_extracted": true, "entrypoint_loaded": true, "manifest_loaded": true, @@ -1134,12 +1134,12 @@ { "field": "archive_sha256", "from": "", - "to": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "to": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, { "field": "package_sha256", "from": "0000000000000000000000000000000000000000000000000000000000000000", - "to": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "to": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" } ] }, diff --git a/reports/skill_atlas.json b/reports/skill_atlas.json index a2eb4bc..124f9e3 100644 --- a/reports/skill_atlas.json +++ b/reports/skill_atlas.json @@ -112,6 +112,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -199,8 +200,8 @@ "report": "reports/adoption_drift_report.json", "risk_band": "low", "event_count": 1, - "adoption_sample_count": 1, - "adoption_rate": 100.0, + "adoption_sample_count": 0, + "adoption_rate": 0, "candidate_count": 0 } }, diff --git a/reports/telemetry_hook_recipes.json b/reports/telemetry_hook_recipes.json new file mode 100644 index 0000000..b9a6db7 --- /dev/null +++ b/reports/telemetry_hook_recipes.json @@ -0,0 +1,338 @@ +{ + "ok": true, + "schema_version": "1.0", + "skill_dir": ".", + "summary": { + "recipe_count": 5, + "native_auto_capture_count": 0, + "metadata_only_recipe_count": 5 + }, + "privacy_contract": { + "raw_content_allowed": false, + "blocked_fields": [ + "content", + "input", + "inputs", + "message", + "messages", + "note", + "output", + "outputs", + "prompt", + "raw", + "text", + "transcript" + ], + "allowed_fields": [ + "event", + "skill", + "version", + "source", + "command", + "activation_type", + "outcome", + "failure_type", + "timestamp" + ] + }, + "recipes": [ + { + "id": "browser-extension", + "client": "Browser extension", + "command": "browser-extension", + "event": "skill_activation", + "activation_type": "explicit", + "outcome": "accepted", + "failure_type": "none", + "trigger_points": [ + "Skill is explicitly selected by the user.", + "Skill activation is accepted by the host client." + ], + "source": "external", + "native_auto_capture": false, + "integration_status": "client-hook-recipe", + "metadata_only": true, + "emit_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "skill_activation", + "--activation-type", + "explicit", + "--outcome", + "accepted", + "--failure-type", + "none", + "--command", + "browser-extension" + ], + "emit_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_activation --activation-type explicit --outcome accepted --failure-type none --command browser-extension", + "dry_run_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "skill_activation", + "--activation-type", + "explicit", + "--outcome", + "accepted", + "--failure-type", + "none", + "--command", + "browser-extension", + "--dry-run" + ], + "dry_run_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_activation --activation-type explicit --outcome accepted --failure-type none --command browser-extension --dry-run" + }, + { + "id": "chrome-extension", + "client": "Chrome extension", + "command": "chrome-extension", + "event": "skill_output", + "activation_type": "manual", + "outcome": "edited", + "failure_type": "none", + "trigger_points": [ + "User keeps or edits a skill-generated artifact.", + "Extension records only the final outcome class, not page content." + ], + "source": "external", + "native_auto_capture": false, + "integration_status": "client-hook-recipe", + "metadata_only": true, + "emit_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "skill_output", + "--activation-type", + "manual", + "--outcome", + "edited", + "--failure-type", + "none", + "--command", + "chrome-extension" + ], + "emit_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_output --activation-type manual --outcome edited --failure-type none --command chrome-extension", + "dry_run_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "skill_output", + "--activation-type", + "manual", + "--outcome", + "edited", + "--failure-type", + "none", + "--command", + "chrome-extension", + "--dry-run" + ], + "dry_run_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_output --activation-type manual --outcome edited --failure-type none --command chrome-extension --dry-run" + }, + { + "id": "vscode-extension", + "client": "VS Code extension", + "command": "vscode-extension", + "event": "skill_activation", + "activation_type": "implicit", + "outcome": "accepted", + "failure_type": "none", + "trigger_points": [ + "Workspace skill route chooses this skill.", + "Extension records route outcome without file paths or code snippets." + ], + "source": "external", + "native_auto_capture": false, + "integration_status": "client-hook-recipe", + "metadata_only": true, + "emit_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "skill_activation", + "--activation-type", + "implicit", + "--outcome", + "accepted", + "--failure-type", + "none", + "--command", + "vscode-extension" + ], + "emit_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_activation --activation-type implicit --outcome accepted --failure-type none --command vscode-extension", + "dry_run_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "skill_activation", + "--activation-type", + "implicit", + "--outcome", + "accepted", + "--failure-type", + "none", + "--command", + "vscode-extension", + "--dry-run" + ], + "dry_run_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_activation --activation-type implicit --outcome accepted --failure-type none --command vscode-extension --dry-run" + }, + { + "id": "cli-wrapper", + "client": "CLI wrapper", + "command": "cli-wrapper", + "event": "script_run", + "activation_type": "manual", + "outcome": "unknown", + "failure_type": "none", + "trigger_points": [ + "Wrapper starts or finishes a known skill workflow command.", + "Wrapper records command family only, never command arguments." + ], + "source": "external", + "native_auto_capture": false, + "integration_status": "client-hook-recipe", + "metadata_only": true, + "emit_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "script_run", + "--activation-type", + "manual", + "--outcome", + "unknown", + "--failure-type", + "none", + "--command", + "cli-wrapper" + ], + "emit_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event script_run --activation-type manual --outcome unknown --failure-type none --command cli-wrapper", + "dry_run_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "script_run", + "--activation-type", + "manual", + "--outcome", + "unknown", + "--failure-type", + "none", + "--command", + "cli-wrapper", + "--dry-run" + ], + "dry_run_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event script_run --activation-type manual --outcome unknown --failure-type none --command cli-wrapper --dry-run" + }, + { + "id": "provider-adapter", + "client": "Provider adapter", + "command": "provider-adapter", + "event": "skill_output", + "activation_type": "manual", + "outcome": "accepted", + "failure_type": "none", + "trigger_points": [ + "Provider adapter receives an accepted or rejected skill output signal.", + "Adapter records only normalized outcome metadata." + ], + "source": "external", + "native_auto_capture": false, + "integration_status": "client-hook-recipe", + "metadata_only": true, + "emit_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "skill_output", + "--activation-type", + "manual", + "--outcome", + "accepted", + "--failure-type", + "none", + "--command", + "provider-adapter" + ], + "emit_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_output --activation-type manual --outcome accepted --failure-type none --command provider-adapter", + "dry_run_argv": [ + "python3", + "scripts/yao.py", + "telemetry-emit", + ".", + "--output-jsonl", + ".yao/telemetry_spool/external_events.jsonl", + "--event", + "skill_output", + "--activation-type", + "manual", + "--outcome", + "accepted", + "--failure-type", + "none", + "--command", + "provider-adapter", + "--dry-run" + ], + "dry_run_command": "python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_output --activation-type manual --outcome accepted --failure-type none --command provider-adapter --dry-run" + } + ], + "artifacts": { + "json": "reports/telemetry_hook_recipes.json", + "markdown": "reports/telemetry_hook_recipes.md", + "spool_jsonl": ".yao/telemetry_spool/external_events.jsonl", + "import_command": "python3 scripts/yao.py telemetry-import . --input-jsonl .yao/telemetry_spool/external_events.jsonl", + "import_argv": [ + "python3", + "scripts/yao.py", + "telemetry-import", + ".", + "--input-jsonl", + ".yao/telemetry_spool/external_events.jsonl" + ] + }, + "warnings": [ + "These recipes do not prove native host-client integration; they define the local metadata-only hook contract for those integrations." + ], + "failures": [] +} diff --git a/reports/telemetry_hook_recipes.md b/reports/telemetry_hook_recipes.md new file mode 100644 index 0000000..b32e5be --- /dev/null +++ b/reports/telemetry_hook_recipes.md @@ -0,0 +1,35 @@ +# Telemetry Hook Recipes + +These recipes show how Browser, Chrome, IDE, wrapper, or provider-side integrations can call `telemetry-emit` without collecting raw prompts, outputs, transcripts, messages, notes, arguments, or file content. + +They are client hook recipes, not proof that a host client is already natively integrated. + +## Summary + +- Recipe count: `5` +- Native auto-capture integrations claimed: `0` +- Default spool: `.yao/telemetry_spool/external_events.jsonl` + +## Recipes + +| Client | Command | Event | Outcome | Dry run | +| --- | --- | --- | --- | --- | +| Browser extension | `browser-extension` | `skill_activation` | `accepted` | `python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_activation --activation-type explicit --outcome accepted --failure-type none --command browser-extension --dry-run` | +| Chrome extension | `chrome-extension` | `skill_output` | `edited` | `python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_output --activation-type manual --outcome edited --failure-type none --command chrome-extension --dry-run` | +| VS Code extension | `vscode-extension` | `skill_activation` | `accepted` | `python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_activation --activation-type implicit --outcome accepted --failure-type none --command vscode-extension --dry-run` | +| CLI wrapper | `cli-wrapper` | `script_run` | `unknown` | `python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event script_run --activation-type manual --outcome unknown --failure-type none --command cli-wrapper --dry-run` | +| Provider adapter | `provider-adapter` | `skill_output` | `accepted` | `python3 scripts/yao.py telemetry-emit . --output-jsonl .yao/telemetry_spool/external_events.jsonl --event skill_output --activation-type manual --outcome accepted --failure-type none --command provider-adapter --dry-run` | + +## Import + +After a client finishes a batch, import the local spool: + +```bash +python3 scripts/yao.py telemetry-import . --input-jsonl .yao/telemetry_spool/external_events.jsonl +``` + +## Privacy Contract + +- Allowed fields: `event`, `skill`, `version`, `source`, `command`, `activation_type`, `outcome`, `failure_type`, `timestamp`. +- Blocked raw-content fields: `content, input, inputs, message, messages, note, output, outputs, prompt, raw, text, transcript`. +- Client integrations must map local state to normalized outcome classes before calling the hook. diff --git a/reports/upgrade_check.json b/reports/upgrade_check.json index fd4e7e8..865512e 100644 --- a/reports/upgrade_check.json +++ b/reports/upgrade_check.json @@ -70,12 +70,12 @@ { "field": "archive_sha256", "from": "", - "to": "3c6223c609ef538fc3ff9a100c3896894cd8d443a304dcd77524d88a22e02599" + "to": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf" }, { "field": "package_sha256", "from": "0000000000000000000000000000000000000000000000000000000000000000", - "to": "195c77ccf18eb0dd72c429b4cbe6137de531a34c00a4ce4a97f9385b3a3b26f4" + "to": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339" } ] }, diff --git a/scripts/ci_test.py b/scripts/ci_test.py index 55d7eb7..dfb71cc 100644 --- a/scripts/ci_test.py +++ b/scripts/ci_test.py @@ -52,6 +52,7 @@ DEFAULT_TARGETS = [ "adoption-drift-check", "telemetry-import-check", "telemetry-emit-check", + "telemetry-hooks-check", "review-waivers-check", "review-annotations-check", "baseline-compare-check", diff --git a/scripts/export_skill_ir.py b/scripts/export_skill_ir.py index 08386a6..5e23126 100644 --- a/scripts/export_skill_ir.py +++ b/scripts/export_skill_ir.py @@ -51,6 +51,8 @@ KEY_REPORTS = [ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", diff --git a/scripts/render_telemetry_hook_recipes.py b/scripts/render_telemetry_hook_recipes.py new file mode 100644 index 0000000..cafee93 --- /dev/null +++ b/scripts/render_telemetry_hook_recipes.py @@ -0,0 +1,258 @@ +#!/usr/bin/env python3 +import argparse +import json +import shlex +from pathlib import Path +from typing import Any + +from render_adoption_drift_report import SENSITIVE_FIELDS, display_path + + +SCHEMA_VERSION = "1.0" +DEFAULT_RECIPES = [ + { + "id": "browser-extension", + "client": "Browser extension", + "command": "browser-extension", + "event": "skill_activation", + "activation_type": "explicit", + "outcome": "accepted", + "failure_type": "none", + "trigger_points": [ + "Skill is explicitly selected by the user.", + "Skill activation is accepted by the host client.", + ], + }, + { + "id": "chrome-extension", + "client": "Chrome extension", + "command": "chrome-extension", + "event": "skill_output", + "activation_type": "manual", + "outcome": "edited", + "failure_type": "none", + "trigger_points": [ + "User keeps or edits a skill-generated artifact.", + "Extension records only the final outcome class, not page content.", + ], + }, + { + "id": "vscode-extension", + "client": "VS Code extension", + "command": "vscode-extension", + "event": "skill_activation", + "activation_type": "implicit", + "outcome": "accepted", + "failure_type": "none", + "trigger_points": [ + "Workspace skill route chooses this skill.", + "Extension records route outcome without file paths or code snippets.", + ], + }, + { + "id": "cli-wrapper", + "client": "CLI wrapper", + "command": "cli-wrapper", + "event": "script_run", + "activation_type": "manual", + "outcome": "unknown", + "failure_type": "none", + "trigger_points": [ + "Wrapper starts or finishes a known skill workflow command.", + "Wrapper records command family only, never command arguments.", + ], + }, + { + "id": "provider-adapter", + "client": "Provider adapter", + "command": "provider-adapter", + "event": "skill_output", + "activation_type": "manual", + "outcome": "accepted", + "failure_type": "none", + "trigger_points": [ + "Provider adapter receives an accepted or rejected skill output signal.", + "Adapter records only normalized outcome metadata.", + ], + }, +] + + +def default_spool(skill_dir: Path) -> Path: + return skill_dir / ".yao" / "telemetry_spool" / "external_events.jsonl" + + +def command_text(argv: list[str]) -> str: + return shlex.join(argv) + + +def emit_argv(skill_dir: Path, output_jsonl: Path, recipe: dict[str, Any], dry_run: bool = False) -> list[str]: + argv = [ + "python3", + "scripts/yao.py", + "telemetry-emit", + display_path(skill_dir), + "--output-jsonl", + display_path(output_jsonl), + "--event", + recipe["event"], + "--activation-type", + recipe["activation_type"], + "--outcome", + recipe["outcome"], + "--failure-type", + recipe["failure_type"], + "--command", + recipe["command"], + ] + if dry_run: + argv.append("--dry-run") + return argv + + +def import_argv(skill_dir: Path, output_jsonl: Path) -> list[str]: + return [ + "python3", + "scripts/yao.py", + "telemetry-import", + display_path(skill_dir), + "--input-jsonl", + display_path(output_jsonl), + ] + + +def build_recipe(skill_dir: Path, output_jsonl: Path, recipe: dict[str, Any]) -> dict[str, Any]: + emit = emit_argv(skill_dir, output_jsonl, recipe) + dry_run = emit_argv(skill_dir, output_jsonl, recipe, dry_run=True) + return { + **recipe, + "source": "external", + "native_auto_capture": False, + "integration_status": "client-hook-recipe", + "metadata_only": True, + "emit_argv": emit, + "emit_command": command_text(emit), + "dry_run_argv": dry_run, + "dry_run_command": command_text(dry_run), + } + + +def render_markdown(report: dict[str, Any]) -> str: + lines = [ + "# Telemetry Hook Recipes", + "", + "These recipes show how Browser, Chrome, IDE, wrapper, or provider-side integrations can call `telemetry-emit` without collecting raw prompts, outputs, transcripts, messages, notes, arguments, or file content.", + "", + "They are client hook recipes, not proof that a host client is already natively integrated.", + "", + "## Summary", + "", + f"- Recipe count: `{report['summary']['recipe_count']}`", + f"- Native auto-capture integrations claimed: `{report['summary']['native_auto_capture_count']}`", + f"- Default spool: `{report['artifacts']['spool_jsonl']}`", + "", + "## Recipes", + "", + "| Client | Command | Event | Outcome | Dry run |", + "| --- | --- | --- | --- | --- |", + ] + for recipe in report["recipes"]: + lines.append( + f"| {recipe['client']} | `{recipe['command']}` | `{recipe['event']}` | `{recipe['outcome']}` | `{recipe['dry_run_command']}` |" + ) + lines.extend( + [ + "", + "## Import", + "", + "After a client finishes a batch, import the local spool:", + "", + "```bash", + report["artifacts"]["import_command"], + "```", + "", + "## Privacy Contract", + "", + "- Allowed fields: `event`, `skill`, `version`, `source`, `command`, `activation_type`, `outcome`, `failure_type`, `timestamp`.", + f"- Blocked raw-content fields: `{', '.join(report['privacy_contract']['blocked_fields'])}`.", + "- Client integrations must map local state to normalized outcome classes before calling the hook.", + ] + ) + return "\n".join(lines) + "\n" + + +def render_recipes( + skill_dir: Path, + output_json: Path | None = None, + output_md: Path | None = None, + output_jsonl: Path | None = None, +) -> dict[str, Any]: + skill_dir = skill_dir.resolve() + reports_dir = skill_dir / "reports" + output_json = (output_json or reports_dir / "telemetry_hook_recipes.json").resolve() + output_md = (output_md or reports_dir / "telemetry_hook_recipes.md").resolve() + output_jsonl = (output_jsonl or default_spool(skill_dir)).resolve() + recipes = [build_recipe(skill_dir, output_jsonl, recipe) for recipe in DEFAULT_RECIPES] + import_cmd = import_argv(skill_dir, output_jsonl) + report = { + "ok": True, + "schema_version": SCHEMA_VERSION, + "skill_dir": display_path(skill_dir), + "summary": { + "recipe_count": len(recipes), + "native_auto_capture_count": sum(1 for recipe in recipes if recipe["native_auto_capture"]), + "metadata_only_recipe_count": sum(1 for recipe in recipes if recipe["metadata_only"]), + }, + "privacy_contract": { + "raw_content_allowed": False, + "blocked_fields": sorted(SENSITIVE_FIELDS), + "allowed_fields": [ + "event", + "skill", + "version", + "source", + "command", + "activation_type", + "outcome", + "failure_type", + "timestamp", + ], + }, + "recipes": recipes, + "artifacts": { + "json": display_path(output_json), + "markdown": display_path(output_md), + "spool_jsonl": display_path(output_jsonl), + "import_command": command_text(import_cmd), + "import_argv": import_cmd, + }, + "warnings": [ + "These recipes do not prove native host-client integration; they define the local metadata-only hook contract for those integrations." + ], + "failures": [], + } + output_json.parent.mkdir(parents=True, exist_ok=True) + output_md.parent.mkdir(parents=True, exist_ok=True) + output_json.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + output_md.write_text(render_markdown(report), encoding="utf-8") + return report + + +def main() -> None: + parser = argparse.ArgumentParser(description="Render metadata-only telemetry client hook recipes.") + parser.add_argument("skill_dir", nargs="?", default=".") + parser.add_argument("--output-json") + parser.add_argument("--output-md") + parser.add_argument("--output-jsonl") + args = parser.parse_args() + report = render_recipes( + Path(args.skill_dir), + output_json=Path(args.output_json) if args.output_json else None, + output_md=Path(args.output_md) if args.output_md else None, + output_jsonl=Path(args.output_jsonl) if args.output_jsonl else None, + ) + print(json.dumps(report, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/scripts/yao.py b/scripts/yao.py index 0b7389c..0c9924d 100644 --- a/scripts/yao.py +++ b/scripts/yao.py @@ -462,6 +462,7 @@ def command_report(args: argparse.Namespace) -> int: run_script("run_output_execution.py", ["--runner-command", local_output_runner_command()]), run_script("adjudicate_output_review.py", []), run_script("render_adoption_drift_report.py", [str(ROOT)]), + run_script("render_telemetry_hook_recipes.py", [str(ROOT)]), run_script("render_review_waivers.py", [str(ROOT)]), run_script("render_review_annotations.py", [str(ROOT)]), ] @@ -487,6 +488,7 @@ def command_report(args: argparse.Namespace) -> int: "output_execution": "reports/output_execution_runs.json", "output_review_adjudication": "reports/output_review_adjudication.json", "adoption_drift": "reports/adoption_drift_report.json", + "telemetry_hooks": "reports/telemetry_hook_recipes.json", "review_waivers": "reports/review_waivers.json", "review_annotations": "reports/review_annotations.json", }, @@ -759,6 +761,20 @@ def command_telemetry_emit(args: argparse.Namespace) -> int: return 0 if result["ok"] else 2 +def command_telemetry_hooks(args: argparse.Namespace) -> int: + skill_dir = str(Path(args.skill_dir).resolve()) + cmd = [skill_dir] + if args.output_json: + cmd.extend(["--output-json", args.output_json]) + if args.output_md: + cmd.extend(["--output-md", args.output_md]) + if args.output_jsonl: + cmd.extend(["--output-jsonl", args.output_jsonl]) + result = run_script("render_telemetry_hook_recipes.py", cmd) + print(json.dumps(result["payload"] if result["payload"] is not None else result, ensure_ascii=False, indent=2)) + return 0 if result["ok"] else 2 + + def command_review_waivers(args: argparse.Namespace) -> int: skill_dir = str(Path(args.skill_dir).resolve()) cmd = [skill_dir] @@ -1134,6 +1150,7 @@ def command_workspace_flow(args: argparse.Namespace) -> int: {"phase": "report-refresh", "result": run_script("render_portability_report.py", [])}, {"phase": "report-refresh", "result": run_script("compile_skill.py", [str(ROOT)])}, {"phase": "report-refresh", "result": run_script("render_adoption_drift_report.py", [str(ROOT)])}, + {"phase": "report-refresh", "result": run_script("render_telemetry_hook_recipes.py", [str(ROOT)])}, {"phase": "report-refresh", "result": run_script("render_review_waivers.py", [str(ROOT)])}, {"phase": "report-refresh", "result": run_script("render_review_annotations.py", [str(ROOT)])}, ] diff --git a/scripts/yao_cli_parser.py b/scripts/yao_cli_parser.py index 765f6ee..5967ef5 100644 --- a/scripts/yao_cli_parser.py +++ b/scripts/yao_cli_parser.py @@ -341,6 +341,16 @@ def build_parser(command_handlers: dict[str, Callable[[argparse.Namespace], int] telemetry_emit_cmd.add_argument("--dry-run", action="store_true") telemetry_emit_cmd.set_defaults(func=_handler(command_handlers, "command_telemetry_emit")) + telemetry_hooks_cmd = subparsers.add_parser( + "telemetry-hooks", + help="Render metadata-only telemetry client hook recipes.", + ) + telemetry_hooks_cmd.add_argument("skill_dir", nargs="?", default=".") + telemetry_hooks_cmd.add_argument("--output-json") + telemetry_hooks_cmd.add_argument("--output-md") + telemetry_hooks_cmd.add_argument("--output-jsonl") + telemetry_hooks_cmd.set_defaults(func=_handler(command_handlers, "command_telemetry_hooks")) + review_waivers_cmd = subparsers.add_parser( "review-waivers", help="Render or update human reviewer waiver evidence for Review Studio.", diff --git a/skill-ir/examples/yao-meta-skill.json b/skill-ir/examples/yao-meta-skill.json index c4fb2cc..e43677d 100644 --- a/skill-ir/examples/yao-meta-skill.json +++ b/skill-ir/examples/yao-meta-skill.json @@ -156,6 +156,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -221,6 +222,8 @@ "reports/security_trust_report.md", "reports/runtime_permission_probes.json", "reports/runtime_permission_probes.md", + "reports/telemetry_hook_recipes.json", + "reports/telemetry_hook_recipes.md", "reports/skill_atlas.json", "reports/skill_atlas.html", "reports/skill-os-2-review.md", diff --git a/skill_atlas/catalog.json b/skill_atlas/catalog.json index fb72f16..5e870dc 100644 --- a/skill_atlas/catalog.json +++ b/skill_atlas/catalog.json @@ -68,6 +68,7 @@ "scripts/render_skill_overview.py", "scripts/render_social_preview.py", "scripts/render_system_model.py", + "scripts/render_telemetry_hook_recipes.py", "scripts/resource_boundary_check.py", "scripts/review_studio_formatting.py", "scripts/review_studio_gates.py", @@ -155,8 +156,8 @@ "report": "reports/adoption_drift_report.json", "risk_band": "low", "event_count": 1, - "adoption_sample_count": 1, - "adoption_rate": 100.0, + "adoption_sample_count": 0, + "adoption_rate": 0, "candidate_count": 0 } }, diff --git a/tests/verify_telemetry_hooks.py b/tests/verify_telemetry_hooks.py new file mode 100644 index 0000000..9ad98f7 --- /dev/null +++ b/tests/verify_telemetry_hooks.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 +import json +import shutil +import subprocess +import sys +from pathlib import Path + + +ROOT = Path(__file__).resolve().parent.parent +TMP = ROOT / "tests" / "tmp_telemetry_hooks" +HOOKS = ROOT / "scripts" / "render_telemetry_hook_recipes.py" +YAO = ROOT / "scripts" / "yao.py" +SENSITIVE_FLAGS = { + "--prompt", + "--content", + "--input", + "--inputs", + "--output", + "--outputs", + "--transcript", + "--message", + "--messages", + "--note", + "--raw", + "--text", +} + + +def run(cmd: list[str]) -> dict: + proc = subprocess.run(cmd, cwd=ROOT, capture_output=True, text=True) + payload = json.loads(proc.stdout) if proc.stdout.strip() else {} + return { + "ok": proc.returncode == 0, + "returncode": proc.returncode, + "payload": payload, + "stdout": proc.stdout, + "stderr": proc.stderr, + } + + +def read_jsonl(path: Path) -> list[dict]: + if not path.exists(): + return [] + return [json.loads(line) for line in path.read_text(encoding="utf-8").splitlines() if line.strip()] + + +def assert_metadata_only(argv: list[str]) -> None: + lowered = {item.lower() for item in argv} + assert not (lowered & SENSITIVE_FLAGS), argv + + +def main() -> None: + shutil.rmtree(TMP, ignore_errors=True) + TMP.mkdir(parents=True, exist_ok=True) + subprocess.run( + [ + sys.executable, + str(ROOT / "scripts" / "init_skill.py"), + "telemetry-hooks-demo", + "--description", + "Render local telemetry client hook recipes without collecting raw content.", + "--output-dir", + str(TMP), + ], + cwd=ROOT, + check=True, + capture_output=True, + text=True, + ) + skill_dir = TMP / "telemetry-hooks-demo" + output_json = TMP / "telemetry_hook_recipes.json" + output_md = TMP / "telemetry_hook_recipes.md" + spool = TMP / "client-spool.jsonl" + rendered = run( + [ + sys.executable, + str(HOOKS), + str(skill_dir), + "--output-json", + str(output_json), + "--output-md", + str(output_md), + "--output-jsonl", + str(spool), + ] + ) + assert rendered["ok"], rendered + payload = rendered["payload"] + assert payload["summary"]["recipe_count"] == 5, payload + assert payload["summary"]["native_auto_capture_count"] == 0, payload + assert payload["summary"]["metadata_only_recipe_count"] == 5, payload + assert payload["privacy_contract"]["raw_content_allowed"] is False, payload + assert {"browser-extension", "chrome-extension", "vscode-extension", "cli-wrapper", "provider-adapter"} == { + item["id"] for item in payload["recipes"] + }, payload + assert output_json.exists(), output_json + assert output_md.exists(), output_md + markdown = output_md.read_text(encoding="utf-8") + assert "Telemetry Hook Recipes" in markdown, markdown + assert "not proof that a host client is already natively integrated" in markdown, markdown + + for recipe in payload["recipes"]: + assert recipe["metadata_only"] is True, recipe + assert recipe["source"] == "external", recipe + assert recipe["integration_status"] == "client-hook-recipe", recipe + assert recipe["emit_argv"][:3] == ["python3", "scripts/yao.py", "telemetry-emit"], recipe + assert recipe["dry_run_argv"][-1] == "--dry-run", recipe + assert "--command" in recipe["emit_argv"], recipe + assert_metadata_only(recipe["emit_argv"]) + assert_metadata_only(recipe["dry_run_argv"]) + dry_run = run(recipe["dry_run_argv"]) + assert dry_run["ok"], dry_run + assert dry_run["payload"]["dry_run"] is True, dry_run + assert dry_run["payload"]["emitted"] is False, dry_run + assert read_jsonl(spool) == [], spool + + browser = next(item for item in payload["recipes"] if item["id"] == "browser-extension") + emitted = run(browser["emit_argv"]) + assert emitted["ok"], emitted + assert emitted["payload"]["emitted"] is True, emitted + events = read_jsonl(spool) + assert len(events) == 1, events + assert events[0]["command"] == "browser-extension", events + assert events[0]["event"] == "skill_activation", events + + imported = run(payload["artifacts"]["import_argv"]) + assert imported["ok"], imported + assert imported["payload"]["imported_count"] == 1, imported + assert imported["payload"]["adoption_drift"]["summary"]["source_types"]["external"] == 1, imported + assert imported["payload"]["adoption_drift"]["summary"]["command_counts"]["browser-extension"] == 1, imported + + cli_output_json = TMP / "cli_telemetry_hook_recipes.json" + cli = run( + [ + sys.executable, + str(YAO), + "telemetry-hooks", + str(skill_dir), + "--output-json", + str(cli_output_json), + "--output-jsonl", + str(spool), + ] + ) + assert cli["ok"], cli + assert cli["payload"]["summary"]["recipe_count"] == 5, cli + assert cli_output_json.exists(), cli_output_json + + print(json.dumps({"ok": True}, ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/tests/verify_yao_cli.py b/tests/verify_yao_cli.py index 96bae64..e1476da 100644 --- a/tests/verify_yao_cli.py +++ b/tests/verify_yao_cli.py @@ -75,6 +75,7 @@ def main() -> None: assert "review-studio" in parser_help, parser_help assert "telemetry-import" in parser_help, parser_help assert "telemetry-emit" in parser_help, parser_help + assert "telemetry-hooks" in parser_help, parser_help assert "--record-cli-telemetry" in parser_help, parser_help init_result = run("init", "cli-demo-skill", "--description", "CLI demo skill.", "--output-dir", str(tmp_root))
路径Path作用Role类型Type
SKILL.mdSkill 入口文件Skill entrypoint文件file
README.md人类可读使用说明Human-readable usage guide文件file
agents/interface.yaml跨平台接口元数据Neutral interface metadata文件file
manifest.json生命周期与打包元数据Lifecycle and portability metadata文件file
references扩展指导与复用资料Extended guidance and reusable notes目录folder
scripts确定性脚本或本地工具Deterministic helpers or local tooling目录folder
evals触发与质量检查Trigger and quality checks目录folder
reports生成的证据与总结报告Generated evidence and overview artifacts目录folder