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 IR 2.0.0 5 targets in platform-neutral contract
Compiler 5/5 target contracts compiled from Skill IR
Output Delta 100.0 5 cases; 1 file-backed
Exec Runs 10 command 10; model 0; recorded 0
Blind A/B 5 review pairs hide baseline vs with-skill labels
Review A/B 0/5 adjudication decisions; pending 5
Runtime 5/5 target conformance pass rate
Perm Probe 4/4 0 native enforcement targets
Trust 0 72 scripts scanned; secrets found
Atlas 5 12 scanned skills; route collisions
Drift low 1 metadata events; 0 missed triggers
Waivers 0 0 gates covered; human risk decisions
Notes 0/0 0 open blocker annotations
Registry 1.1.0 5 targets; MIT license
Archive pass 499 zip entries; package verification
Install pass 4 adapters; 12 permissions enforced; 0 permission failures
Upgrade minor declared minor; 0 breaking changes
+ Skill IR 2.0.0 5 targets in platform-neutral contract
Compiler 5/5 target contracts compiled from Skill IR
Output Delta 100.0 5 cases; 1 file-backed
Exec Runs 10 command 10; model 0; recorded 0
Blind A/B 5 review pairs hide baseline vs with-skill labels
Review A/B 0/5 adjudication decisions; pending 5
Runtime 5/5 target conformance pass rate
Perm Probe 4/4 0 native enforcement targets
Trust 0 73 scripts scanned; secrets found
Atlas 5 12 scanned skills; route collisions
Drift low 1 metadata events; 0 missed triggers
Waivers 0 0 gates covered; human risk decisions
Notes 0/0 0 open blocker annotations
Registry 1.1.0 5 targets; MIT license
Archive pass 503 zip entries; package verification
Install pass 4 adapters; 12 permissions enforced; 0 permission failures
Upgrade minor 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,再继续扩展包体。
- 完整度 100 SKILL.md 已存在,是 Skill 的入口。 SKILL.md 已存在,是 Skill 的入口。 触发清晰 100 frontmatter description 已存在,具备基础路由面。 frontmatter description 已存在,具备基础路由面。 证据充分 100 已生成 20 / 20 类报告证据。 已生成 20 / 20 类报告证据。 上下文成本 42 入口约 350 个词/字,references 约 15124 个词/字。 入口约 350 个词/字,references 约 15124 个词/字。
+ 完整度 100 SKILL.md 已存在,是 Skill 的入口。 SKILL.md 已存在,是 Skill 的入口。 触发清晰 100 frontmatter 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.
- 稳定 Stable 完整度 100 SKILL.md 已存在,是 Skill 的入口。 SKILL.md 已存在,是 Skill 的入口。 稳定 Stable 触发清晰 100 frontmatter description 已存在,具备基础路由面。 frontmatter description 已存在,具备基础路由面。 稳定 Stable 证据充分 100 已生成 20 / 20 类报告证据。 已生成 20 / 20 类报告证据。 稳定 Stable 可维护性 100 SKILL.md 约 350 个词/字。 SKILL.md 约 350 个词/字。 稳定 Stable 可迁移性 100 agents/interface.yaml 已存在。 agents/interface.yaml 已存在。 关注 Watch 上下文成本 42 入口约 350 个词/字,references 约 15124 个词/字。 入口约 350 个词/字,references 约 15124 个词/字。
+ 稳定 Stable 完整度 100 SKILL.md 已存在,是 Skill 的入口。 SKILL.md 已存在,是 Skill 的入口。 稳定 Stable 触发清晰 100 frontmatter description 已存在,具备基础路由面。 frontmatter description 已存在,具备基础路由面。 稳定 Stable 证据充分 100 已生成 20 / 20 类报告证据。 已生成 20 / 20 类报告证据。 稳定 Stable 可维护性 100 SKILL.md 约 350 个词/字。 SKILL.md 约 350 个词/字。 稳定 Stable 可迁移性 100 agents/interface.yaml 已存在。 agents/interface.yaml 已存在。 关注 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.md README.md agents/interface.yaml manifest.json references scripts 资产分布图展示当前包体的文件和目录重心。
+
资产分布 310项 SKILL.md README.md agents/interface.yaml manifest.json references scripts 资产分布图展示当前包体的文件和目录重心。
路径 Path 作用 Role 类型 Type
SKILL.md Skill 入口文件 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
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))