feat: add telemetry native host

This commit is contained in:
yaojingang
2026-06-13 22:33:28 +08:00
parent 313fe0b37c
commit 164f33f818
29 changed files with 844 additions and 281 deletions
+1
View File
@@ -73,6 +73,7 @@ Clean test-only scratch directories after verification with `find tests -maxdept
- `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.
- `scripts/telemetry_native_host.py`: Browser/Chrome Native Messaging telemetry bridge. Preserve length-prefixed stdio behavior, raw-content blocking, and launcher/manifest generation tests.
New helper modules that are imported by CLI/report scripts but are not standalone commands must declare:
+6 -3
View File
@@ -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 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
.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 telemetry-native-host-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
@@ -100,6 +100,9 @@ telemetry-emit-check:
telemetry-hooks-check:
$(PYTHON) tests/verify_telemetry_hooks.py
telemetry-native-host-check:
$(PYTHON) tests/verify_telemetry_native_host.py
review-waivers-check:
$(PYTHON) tests/verify_review_waivers.py
@@ -196,11 +199,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 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
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 telemetry-native-host-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_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
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_telemetry_native_host 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 {} +
+3
View File
@@ -32,6 +32,7 @@ It turns rough workflows, transcripts, prompts, notes, and runbooks into reusabl
- 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, hook recipes, and JSONL import that record command names and outcomes without arguments or raw content
- a Browser/Chrome Native Messaging telemetry host that can receive length-prefixed metadata-only client events and generate a local launcher plus manifest without storing 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
@@ -111,6 +112,7 @@ python3 scripts/yao.py adoption-drift my-skill --record-event skill_activation -
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/telemetry_native_host.py my-skill --write-launcher /tmp/yao-telemetry-host.sh --write-manifest /tmp/yao-telemetry-host.json --allowed-origin chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/
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
@@ -420,6 +422,7 @@ Utility scripts that make the meta-skill operational:
- `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
- `telemetry_native_host.py`: receives Browser/Chrome Native Messaging length-prefixed JSON events, rejects raw-content fields, appends metadata-only events, and writes local launcher/manifest files for operator installation
- `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
+22
View File
@@ -107,6 +107,28 @@ The report is written to:
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.
## Browser Native Host
`scripts/telemetry_native_host.py` implements the local side of Browser/Chrome Native Messaging. It accepts length-prefixed JSON messages on stdio, validates them with the same metadata-only telemetry contract, appends accepted events to the local spool, and rejects raw prompt/output/transcript/message/note fields.
Smoke-test one message without Browser installation:
```bash
python3 scripts/telemetry_native_host.py . \
--message-json '{"event":"skill_activation","activation_type":"explicit","outcome":"accepted","failure_type":"none","command":"chrome-native-host"}'
```
Generate a local launcher and Chrome native messaging manifest for an operator-installed extension:
```bash
python3 scripts/telemetry_native_host.py . \
--write-launcher /tmp/yao-telemetry-host.sh \
--write-manifest /tmp/yao-telemetry-host.json \
--allowed-origin chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/
```
This is an executable native host bridge and manifest generator. It still does not prove that a specific Browser/Chrome extension is installed or sending events in the user's environment.
## External Client Import
External clients, browser extensions, editor adapters, or wrapper scripts may hand off already-sanitized JSONL through `telemetry-import`:
+1 -1
View File
@@ -16,7 +16,7 @@
"vscode"
],
"package_metadata": "registry/packages/yao-meta-skill.json",
"package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339"
"package_sha256": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc"
}
]
}
+3 -3
View File
@@ -16,8 +16,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339",
"archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf"
"package_sha256": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc",
"archive_sha256": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3"
},
"compatibility": {
"openai": "pass",
@@ -48,7 +48,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf",
"archive_sha256": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
+80 -65
View File
@@ -209,6 +209,7 @@
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
@@ -270,7 +271,7 @@
],
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
}
@@ -376,7 +377,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -425,6 +426,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -464,14 +466,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -493,7 +495,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -514,7 +516,7 @@
"strategy": "Ship the neutral source tree and expose OpenAI-facing interface metadata as a generated companion file.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -525,7 +527,7 @@
},
"scripts": {
"strategy": "Keep scripts as local package resources; expose help-smoke and permission metadata for reviewer approval before execution.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -606,7 +608,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -655,6 +657,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -694,14 +697,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -721,7 +724,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -742,7 +745,7 @@
"strategy": "Ship the neutral source tree and expose OpenAI-facing interface metadata as a generated companion file.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -753,7 +756,7 @@
},
"scripts": {
"strategy": "Keep scripts as local package resources; expose help-smoke and permission metadata for reviewer approval before execution.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -1019,6 +1022,7 @@
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
@@ -1080,7 +1084,7 @@
],
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
}
@@ -1186,7 +1190,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -1235,6 +1239,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -1274,14 +1279,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -1303,7 +1308,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -1324,7 +1329,7 @@
"strategy": "Preserve the source tree directly; write target notes in targets/claude/README.md.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -1335,7 +1340,7 @@
},
"scripts": {
"strategy": "Scripts remain local package resources and must be reviewed through trust and permission reports before use.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -1416,7 +1421,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -1465,6 +1470,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -1504,14 +1510,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -1531,7 +1537,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -1552,7 +1558,7 @@
"strategy": "Preserve the source tree directly; write target notes in targets/claude/README.md.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -1563,7 +1569,7 @@
},
"scripts": {
"strategy": "Scripts remain local package resources and must be reviewed through trust and permission reports before use.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -1829,6 +1835,7 @@
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
@@ -1890,7 +1897,7 @@
],
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
}
@@ -1996,7 +2003,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -2045,6 +2052,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -2084,14 +2092,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -2113,7 +2121,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -2134,7 +2142,7 @@
"strategy": "Preserve references, scripts, assets, evals, reports, and adapter metadata as relative package resources.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -2144,7 +2152,7 @@
},
"scripts": {
"strategy": "Expose script and permission metadata for downstream clients or installers to enforce.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -2219,7 +2227,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -2268,6 +2276,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -2307,14 +2316,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -2334,7 +2343,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -2355,7 +2364,7 @@
"strategy": "Preserve references, scripts, assets, evals, reports, and adapter metadata as relative package resources.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -2365,7 +2374,7 @@
},
"scripts": {
"strategy": "Expose script and permission metadata for downstream clients or installers to enforce.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -2623,6 +2632,7 @@
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
@@ -2684,7 +2694,7 @@
],
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
}
@@ -2790,7 +2800,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -2839,6 +2849,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -2878,14 +2889,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -2907,7 +2918,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -2928,7 +2939,7 @@
"strategy": "Keep optional directories as relative resources next to SKILL.md.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -2939,7 +2950,7 @@
},
"scripts": {
"strategy": "Scripts remain local optional resources and should advertise --help when executable.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -3013,7 +3024,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -3062,6 +3073,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -3101,14 +3113,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -3128,7 +3140,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -3149,7 +3161,7 @@
"strategy": "Keep optional directories as relative resources next to SKILL.md.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -3160,7 +3172,7 @@
},
"scripts": {
"strategy": "Scripts remain local optional resources and should advertise --help when executable.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -3417,6 +3429,7 @@
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
@@ -3478,7 +3491,7 @@
],
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
}
@@ -3584,7 +3597,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -3633,6 +3646,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -3672,14 +3686,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -3701,7 +3715,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -3722,7 +3736,7 @@
"strategy": "Install as project or user scoped skill source, preserving relative references and scripts.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -3733,7 +3747,7 @@
},
"scripts": {
"strategy": "Scripts require workspace trust and operator/client approval outside this compiler.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
@@ -3811,7 +3825,7 @@
},
"file_write": {
"required": true,
"script_count": 50,
"script_count": 51,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -3860,6 +3874,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
@@ -3899,14 +3914,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 63,
"checked_count": 64,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 50,
"file_write_script_count": 51,
"subprocess_script_count": 7,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -3926,7 +3941,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 50,
"file_write": 51,
"subprocess": 7,
"interactive": 0
},
@@ -3947,7 +3962,7 @@
"strategy": "Install as project or user scoped skill source, preserving relative references and scripts.",
"counts": {
"references": 32,
"scripts": 73,
"scripts": 74,
"assets": 2,
"reports": 43
},
@@ -3958,7 +3973,7 @@
},
"scripts": {
"strategy": "Scripts require workspace trust and operator/client approval outside this compiler.",
"script_count": 73,
"script_count": 74,
"help_smoke_failed_count": 0
},
"permissions": {
+3 -3
View File
@@ -6,10 +6,10 @@
"context_budget_tier": "production",
"context_budget_limit": 1000,
"skill_body_tokens": 751,
"other_text_tokens": 936263,
"other_text_tokens": 941577,
"estimated_initial_load_tokens": 944,
"estimated_total_text_tokens": 937014,
"relevant_file_count": 409,
"estimated_total_text_tokens": 942328,
"relevant_file_count": 413,
"unused_resource_dirs": [],
"quality_signal_points": 130,
"quality_density": 137.7
+1 -1
View File
@@ -8,7 +8,7 @@
"installed_skill_dir": "dist/install-simulation/simulate-yao-meta-skill/yao-meta-skill",
"summary": {
"archive_present": true,
"archive_entry_count": 503,
"archive_entry_count": 505,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
+10 -10
View File
@@ -34,7 +34,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 34.49,
"duration_ms": 31.95,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -62,7 +62,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 33.15,
"duration_ms": 34.87,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -85,7 +85,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 34.31,
"duration_ms": 33.23,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -113,7 +113,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 30.67,
"duration_ms": 48.91,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -136,7 +136,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 29.54,
"duration_ms": 34.71,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -164,7 +164,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.43,
"duration_ms": 33.42,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -187,7 +187,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 27.8,
"duration_ms": 34.16,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -214,7 +214,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 27.96,
"duration_ms": 32.68,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -237,7 +237,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.79,
"duration_ms": 29.95,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -266,7 +266,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.95,
"duration_ms": 28.78,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
+10 -10
View File
@@ -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 | 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 |
| skill-package-contract | baseline | command | local-output-eval-runner | 31.95 | 33 | 0.0 | pass |
| skill-package-contract | with_skill | command | local-output-eval-runner | 34.87 | 73 | 100.0 | pass |
| output-eval-expectation | baseline | command | local-output-eval-runner | 33.23 | 36 | 0.0 | pass |
| output-eval-expectation | with_skill | command | local-output-eval-runner | 48.91 | 80 | 100.0 | pass |
| ir-before-packaging | baseline | command | local-output-eval-runner | 34.71 | 33 | 0.0 | pass |
| ir-before-packaging | with_skill | command | local-output-eval-runner | 33.42 | 80 | 100.0 | pass |
| near-neighbor-boundary | baseline | command | local-output-eval-runner | 34.16 | 36 | 0.0 | pass |
| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 32.68 | 65 | 100.0 | pass |
| file-backed-governed-package | baseline | command | local-output-eval-runner | 29.95 | 37 | 0.0 | pass |
| file-backed-governed-package | with_skill | command | local-output-eval-runner | 28.78 | 98 | 100.0 | pass |
## Next Fixes
+2 -2
View File
@@ -8,8 +8,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
"archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf",
"archive_entry_count": 503,
"archive_sha256": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3",
"archive_entry_count": 505,
"failure_count": 0,
"warning_count": 0
},
+1 -1
View File
@@ -4,7 +4,7 @@
- Package directory: `dist`
- Targets: `4 / 4` adapters present
- Archive present: `True`
- Archive SHA256: `15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf`
- Archive SHA256: `7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3`
- Failures: `0`
- Warnings: `0`
+4 -4
View File
@@ -21,8 +21,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339",
"archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf"
"package_sha256": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc",
"archive_sha256": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3"
},
"compatibility": {
"openai": "pass",
@@ -53,7 +53,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf",
"archive_sha256": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3",
"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": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339"
"package_sha256": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc"
}
]
},
+2 -2
View File
@@ -6,8 +6,8 @@
- Maturity: `governed`
- Owner: `Yao Team`
- License: `MIT`
- Package SHA256: `25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339`
- Archive SHA256: `15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf`
- Package SHA256: `e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc`
- Archive SHA256: `7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3`
- Install simulated: `True`
## Compatibility
+5 -5
View File
@@ -242,12 +242,12 @@
<section>
<h2>核心指标</h2>
<div class="metrics"><article class='metric'><span>Skill IR</span><strong>2.0.0</strong><p>5 targets in platform-neutral contract</p></article><article class='metric'><span>Compiler</span><strong>5/5</strong><p>target contracts compiled from Skill IR</p></article><article class='metric'><span>Output Delta</span><strong>100.0</strong><p>5 cases; 1 file-backed</p></article><article class='metric'><span>Exec Runs</span><strong>10</strong><p>command 10; model 0; recorded 0</p></article><article class='metric'><span>Blind A/B</span><strong>5</strong><p>review pairs hide baseline vs with-skill labels</p></article><article class='metric'><span>Review A/B</span><strong>0/5</strong><p>adjudication decisions; pending 5</p></article><article class='metric'><span>Runtime</span><strong>5/5</strong><p>target conformance pass rate</p></article><article class='metric'><span>Perm Probe</span><strong>4/4</strong><p>0 native enforcement targets</p></article><article class='metric'><span>Trust</span><strong>0</strong><p>73 scripts scanned; secrets found</p></article><article class='metric'><span>Atlas</span><strong>5</strong><p>12 scanned skills; route collisions</p></article><article class='metric'><span>Drift</span><strong>low</strong><p>1 metadata events; 0 missed triggers</p></article><article class='metric'><span>Waivers</span><strong>0</strong><p>0 gates covered; human risk decisions</p></article><article class='metric'><span>Notes</span><strong>0/0</strong><p>0 open blocker annotations</p></article><article class='metric'><span>Registry</span><strong>1.1.0</strong><p>5 targets; MIT license</p></article><article class='metric'><span>Archive</span><strong>pass</strong><p>503 zip entries; package verification</p></article><article class='metric'><span>Install</span><strong>pass</strong><p>4 adapters; 12 permissions enforced; 0 permission failures</p></article><article class='metric'><span>Upgrade</span><strong>minor</strong><p>declared minor; 0 breaking changes</p></article></div>
<div class="metrics"><article class='metric'><span>Skill IR</span><strong>2.0.0</strong><p>5 targets in platform-neutral contract</p></article><article class='metric'><span>Compiler</span><strong>5/5</strong><p>target contracts compiled from Skill IR</p></article><article class='metric'><span>Output Delta</span><strong>100.0</strong><p>5 cases; 1 file-backed</p></article><article class='metric'><span>Exec Runs</span><strong>10</strong><p>command 10; model 0; recorded 0</p></article><article class='metric'><span>Blind A/B</span><strong>5</strong><p>review pairs hide baseline vs with-skill labels</p></article><article class='metric'><span>Review A/B</span><strong>0/5</strong><p>adjudication decisions; pending 5</p></article><article class='metric'><span>Runtime</span><strong>5/5</strong><p>target conformance pass rate</p></article><article class='metric'><span>Perm Probe</span><strong>4/4</strong><p>0 native enforcement targets</p></article><article class='metric'><span>Trust</span><strong>0</strong><p>74 scripts scanned; secrets found</p></article><article class='metric'><span>Atlas</span><strong>5</strong><p>12 scanned skills; route collisions</p></article><article class='metric'><span>Drift</span><strong>low</strong><p>1 metadata events; 0 missed triggers</p></article><article class='metric'><span>Waivers</span><strong>0</strong><p>0 gates covered; human risk decisions</p></article><article class='metric'><span>Notes</span><strong>0/0</strong><p>0 open blocker annotations</p></article><article class='metric'><span>Registry</span><strong>1.1.0</strong><p>5 targets; MIT license</p></article><article class='metric'><span>Archive</span><strong>pass</strong><p>505 zip entries; package verification</p></article><article class='metric'><span>Install</span><strong>pass</strong><p>4 adapters; 12 permissions enforced; 0 permission failures</p></article><article class='metric'><span>Upgrade</span><strong>minor</strong><p>declared minor; 0 breaking changes</p></article></div>
</section>
<section>
<h2>审查闸门</h2>
<div class="gates"><article class='gate pass'><div><span>通过</span><h3>意图画布</h3></div><p>intent confidence 100/100; Intent is clear enough to package the first routeable version.</p><footer>reports/intent-confidence.json <a href='intent-confidence.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>触发实验</h3></div><p>13 trigger cases; 0 misroutes; 0 ambiguous</p><footer>reports/route_scorecard.json <a href='route_scorecard.md'>证据</a></footer></article><article class='gate warn'><div><span>关注</span><h3>输出实验</h3></div><p>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</p><footer>reports/output_quality_scorecard.json <a href='output_quality_scorecard.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>上下文</h3></div><p>initial load 944/1000; quality density 137.7</p><footer>reports/context_budget.json <a href='context_budget.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>运行矩阵</h3></div><p>5 / 5 targets pass</p><footer>reports/conformance_matrix.json <a href='conformance_matrix.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>信任报告</h3></div><p>0 secrets; 73 scripts; 3 network-capable scripts; 0 help smoke failures</p><footer>reports/security_trust_report.json <a href='security_trust_report.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>权限批准</h3></div><p>3/3 permissions approved; gaps 0; required file_write, network, subprocess</p><footer>reports/security_trust_report.json + security/permission_policy.json <a href='../security/permission_policy.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>权限探针</h3></div><p>4/4 targets probed; native 0; metadata fallback 4; residual risks 4</p><footer>reports/runtime_permission_probes.json <a href='runtime_permission_probes.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>组合治理</h3></div><p>12 skills, 1 actionable; 0 actionable route collisions; 0 actionable owner gaps; 0 actionable stale; 0 actionable drift; 24 scoped non-actionable issues</p><footer>reports/skill_atlas.json <a href='skill_atlas.html'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>运营回路</h3></div><p>1 metadata events; adoption 0; missed 0; bad-output 0; risk low</p><footer>reports/adoption_drift_report.json <a href='adoption_drift_report.md'>证据</a></footer></article><article class='gate warn'><div><span>关注</span><h3>人工批准</h3></div><p>0 active waivers; 1 warning gates still need reviewer decision</p><footer>reports/review_waivers.json <a href='review_waivers.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>注册审计</h3></div><p>yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures</p><footer>reports/registry_audit.json + reports/install_simulation.json <a href='registry_audit.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>发布路线</h3></div><p>0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended</p><footer>reports/promotion_decisions.json + reports/upgrade_check.json + docs/migration-v2.md <a href='promotion_decisions.md'>证据</a></footer></article></div>
<div class="gates"><article class='gate pass'><div><span>通过</span><h3>意图画布</h3></div><p>intent confidence 100/100; Intent is clear enough to package the first routeable version.</p><footer>reports/intent-confidence.json <a href='intent-confidence.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>触发实验</h3></div><p>13 trigger cases; 0 misroutes; 0 ambiguous</p><footer>reports/route_scorecard.json <a href='route_scorecard.md'>证据</a></footer></article><article class='gate warn'><div><span>关注</span><h3>输出实验</h3></div><p>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</p><footer>reports/output_quality_scorecard.json <a href='output_quality_scorecard.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>上下文</h3></div><p>initial load 944/1000; quality density 137.7</p><footer>reports/context_budget.json <a href='context_budget.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>运行矩阵</h3></div><p>5 / 5 targets pass</p><footer>reports/conformance_matrix.json <a href='conformance_matrix.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>信任报告</h3></div><p>0 secrets; 74 scripts; 3 network-capable scripts; 0 help smoke failures</p><footer>reports/security_trust_report.json <a href='security_trust_report.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>权限批准</h3></div><p>3/3 permissions approved; gaps 0; required file_write, network, subprocess</p><footer>reports/security_trust_report.json + security/permission_policy.json <a href='../security/permission_policy.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>权限探针</h3></div><p>4/4 targets probed; native 0; metadata fallback 4; residual risks 4</p><footer>reports/runtime_permission_probes.json <a href='runtime_permission_probes.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>组合治理</h3></div><p>12 skills, 1 actionable; 0 actionable route collisions; 0 actionable owner gaps; 0 actionable stale; 0 actionable drift; 24 scoped non-actionable issues</p><footer>reports/skill_atlas.json <a href='skill_atlas.html'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>运营回路</h3></div><p>1 metadata events; adoption 0; missed 0; bad-output 0; risk low</p><footer>reports/adoption_drift_report.json <a href='adoption_drift_report.md'>证据</a></footer></article><article class='gate warn'><div><span>关注</span><h3>人工批准</h3></div><p>0 active waivers; 1 warning gates still need reviewer decision</p><footer>reports/review_waivers.json <a href='review_waivers.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>注册审计</h3></div><p>yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures</p><footer>reports/registry_audit.json + reports/install_simulation.json <a href='registry_audit.md'>证据</a></footer></article><article class='gate pass'><div><span>通过</span><h3>发布路线</h3></div><p>0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended</p><footer>reports/promotion_decisions.json + reports/upgrade_check.json + docs/migration-v2.md <a href='promotion_decisions.md'>证据</a></footer></article></div>
</section>
<div class="twocol">
@@ -313,7 +313,7 @@
</section>
<section id="trust" class="twocol">
<div class="panel"><h2>信任报告</h2><dl class='kv-grid'><div><dt>Secret</dt><dd>0</dd></div><div><dt>脚本数</dt><dd>73</dd></div><div><dt>网络脚本</dt><dd>3</dd></div><div><dt>Help 失败</dt><dd>0</dd></div><div><dt>包体哈希</dt><dd><code>25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339</code></dd></div></dl></div>
<div class="panel"><h2>信任报告</h2><dl class='kv-grid'><div><dt>Secret</dt><dd>0</dd></div><div><dt>脚本数</dt><dd>74</dd></div><div><dt>网络脚本</dt><dd>3</dd></div><div><dt>Help 失败</dt><dd>0</dd></div><div><dt>包体哈希</dt><dd><code>e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc</code></dd></div></dl></div>
<div class="panel"><h2>安全边界</h2><p>高风险 secret、远程 inline execution、缺失依赖策略或无法解释的脚本接口应阻断 governed release。</p></div>
</section>
@@ -344,12 +344,12 @@
<section id="registry" class="twocol">
<div class="panel"><h2>注册审计</h2><p>yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures</p></div>
<div class="panel"><h2>包体元数据</h2><dl class='kv-grid'><div><dt>名称</dt><dd>yao-meta-skill</dd></div><div><dt>版本</dt><dd>1.1.0</dd></div><div><dt>Maturity</dt><dd>governed</dd></div><div><dt>Owner</dt><dd>Yao Team</dd></div><div><dt>License</dt><dd>MIT</dd></div><div><dt>信任级别</dt><dd>local</dd></div><div><dt>目标平台</dt><dd>openai, claude, generic, agent-skills-compatible, vscode</dd></div><div><dt>兼容通过</dt><dd>6/6</dd></div><div><dt>归档哈希</dt><dd><code>15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf</code></dd></div></dl></div>
<div class="panel"><h2>包体元数据</h2><dl class='kv-grid'><div><dt>名称</dt><dd>yao-meta-skill</dd></div><div><dt>版本</dt><dd>1.1.0</dd></div><div><dt>Maturity</dt><dd>governed</dd></div><div><dt>Owner</dt><dd>Yao Team</dd></div><div><dt>License</dt><dd>MIT</dd></div><div><dt>信任级别</dt><dd>local</dd></div><div><dt>目标平台</dt><dd>openai, claude, generic, agent-skills-compatible, vscode</dd></div><div><dt>兼容通过</dt><dd>6/6</dd></div><div><dt>归档哈希</dt><dd><code>7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3</code></dd></div></dl></div>
</section>
<section id="release" class="twocol">
<div class="panel"><h2>发布路线</h2><p>0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended</p></div>
<div class="panel"><h2>包体验证</h2><dl class='kv-grid'><div><dt>目标数</dt><dd>4</dd></div><div><dt>Adapter</dt><dd>4</dd></div><div><dt>归档存在</dt><dd></dd></div><div><dt>Zip 条目</dt><dd>503</dd></div><div><dt>失败数</dt><dd>0</dd></div><div><dt>警告数</dt><dd>0</dd></div><div><dt>归档哈希</dt><dd><code>15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf</code></dd></div></dl></div>
<div class="panel"><h2>包体验证</h2><dl class='kv-grid'><div><dt>目标数</dt><dd>4</dd></div><div><dt>Adapter</dt><dd>4</dd></div><div><dt>归档存在</dt><dd></dd></div><div><dt>Zip 条目</dt><dd>505</dd></div><div><dt>失败数</dt><dd>0</dd></div><div><dt>警告数</dt><dd>0</dd></div><div><dt>归档哈希</dt><dd><code>7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3</code></dd></div></dl></div>
</section>
<section class="twocol">
+158 -117
View File
File diff suppressed because it is too large Load Diff
+34 -9
View File
@@ -2,8 +2,8 @@
"ok": true,
"skill_dir": ".",
"summary": {
"scanned_files": 157,
"script_count": 73,
"scanned_files": 158,
"script_count": 74,
"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": 50,
"file_write_script_count": 51,
"permission_required_count": 3,
"permission_approved_count": 3,
"permission_missing_count": 0,
"permission_invalid_count": 0,
"permission_expired_count": 0,
"help_smoke_checked_count": 63,
"help_smoke_checked_count": 64,
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 157,
"package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339"
"package_hash_file_count": 158,
"package_sha256": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc"
},
"failures": [],
"warnings": [],
@@ -942,6 +942,20 @@
"network_urls": [],
"network_hosts": []
},
{
"path": "scripts/telemetry_native_host.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/trigger_eval.py",
"interface": "cli",
@@ -1099,9 +1113,9 @@
"help_smoke": {
"enabled": true,
"timeout_seconds": 5.0,
"candidate_count": 63,
"checked_count": 63,
"passed_count": 63,
"candidate_count": 64,
"checked_count": 64,
"passed_count": 64,
"failed_count": 0,
"skipped_count": 10,
"failed_scripts": [],
@@ -1676,6 +1690,16 @@
"stdout_excerpt": "usage: sync_local_install.py [-h] [--root ROOT] [--install-dir INSTALL_DIR]\n [--package-dir PACKAGE_DIR]\n [--generated-at GENERATED_AT]\n [--skip-install-pre",
"stderr_excerpt": ""
},
{
"path": "scripts/telemetry_native_host.py",
"command": "python3 scripts/telemetry_native_host.py --help",
"returncode": 0,
"timed_out": false,
"passed": true,
"has_help_text": true,
"stdout_excerpt": "usage: telemetry_native_host.py [-h] [--output-jsonl OUTPUT_JSONL]\n [--message-json MESSAGE_JSON] [--stdio]\n [--dry-run] [--write-manifest WRITE_MANIFEST]\n ",
"stderr_excerpt": ""
},
{
"path": "scripts/trigger_eval.py",
"command": "python3 scripts/trigger_eval.py --help",
@@ -1879,6 +1903,7 @@
"scripts/run_output_execution.py",
"scripts/simulate_install.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/verify_package.py"
+9 -8
View File
@@ -1,22 +1,22 @@
# Security Trust Report
- OK: `True`
- Scanned files: `157`
- Scripts: `73`
- Scanned files: `158`
- Scripts: `74`
- Internal script modules: `10`
- Secret findings: `0`
- Network-capable scripts: `3`
- Network policy covered scripts: `3`
- Network policy missing scripts: `0`
- File-write scripts: `50`
- File-write scripts: `51`
- Permission approvals: `3 / 3`
- Permission approval gaps: `0`
- CLI help smoke checked: `63`
- CLI help smoke checked: `64`
- CLI help smoke failures: `0`
- Interactive scripts: `0`
- Package hash scope: `source-contract-without-generated-reports`
- Package hash files: `157`
- Package SHA256: `25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339`
- Package hash files: `158`
- Package SHA256: `e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc`
## Failures
@@ -54,8 +54,8 @@
- Enabled: `True`
- Timeout seconds: `5.0`
- Checked scripts: `63`
- Passed scripts: `63`
- Checked scripts: `64`
- Passed scripts: `64`
- Failed scripts: `none`
## Script Surface
@@ -126,6 +126,7 @@
| scripts/skill_report_metrics.py | internal-module | True | False | False | False | False | False | False | Imported by skill_report_model.py to calculate overview report metrics. |
| scripts/skill_report_model.py | internal-module | True | False | False | False | False | False | False | Imported by render_skill_overview.py to build the v2 report data model. |
| scripts/sync_local_install.py | cli | False | True | True | False | False | True | True | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/telemetry_native_host.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/trigger_eval.py | cli | False | True | True | False | False | False | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/trust_check.py | cli | False | True | True | False | False | True | True | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/upgrade_check.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
+11 -10
View File
@@ -26,6 +26,7 @@ Yao Meta Skill is no longer only a Meta Skill factory. The current working tree
- 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.
- Telemetry Native Host v0 for Browser/Chrome Native Messaging length-prefixed stdio, metadata-only event validation, local launcher generation, and Chrome host manifest generation.
- 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.
@@ -37,7 +38,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, 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.
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, a Browser/Chrome Native Messaging host can receive length-prefixed metadata events and generate a local launcher plus manifest, 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, installed platform-native client telemetry implementations, provider-native installer integration, real provider holdout runs, real human adjudication decisions, and native runtime permission enforcement remain open.
## Coverage Matrix
@@ -58,7 +59,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/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 |
| 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/telemetry_native_host.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_native_host.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 |
@@ -88,9 +89,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-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.
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_native_host.py` now provides a tested Browser/Chrome Native Messaging host: it reads length-prefixed stdio JSON, rejects raw content fields, writes metadata-only events, and generates an operator-installable launcher plus Chrome host manifest. `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 an installed real extension or provider client that sends production events to the native host.
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.
Next move: install a real Browser/Chrome extension or provider client against the native host and record production metadata events, then let Atlas rank stale, drifting, or conflicting skills by real usage impact.
### 5. Trust report is structural, not full security review
@@ -105,22 +106,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, `63 / 63` CLI help smoke checks passing across `73` 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, `64 / 64` CLI help smoke checks passing across `74` 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, `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 |
| Package Verification | `4 / 4` target adapters present, archive verified, `505` zip entries, `0` failures, `0` warnings |
| Install Simulation | archive with `505` entries extracted into a local verification root, entrypoint/manifest/interface loaded, reports present, `4` adapters readable, `12` installer permission checks enforced, `0` permission failures, `0` failures, `0` warnings |
| Local Install Sync Preflight | `make sync-local-install` and `make sync-active-install` rebuild the package first, then sync only after install simulation passes with `12` enforced installer permission checks and `0` permission failures |
| Upgrade Check | current package declares `minor` over the 1.0.0 baseline, recommended bump is `minor`, and release notes include added targets plus checksum changes |
| Adoption Drift | `1` metadata-only review event, `0` adoption samples, adoption `0`, risk band `low`; optional `yao.py` CLI capture, external client `telemetry-emit`, `5` `telemetry-hooks` recipes, 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, Browser/Chrome native messaging host, and validated external JSONL import are available but off by default for reproducible release evidence; raw `reports/telemetry_events.jsonl` is gitignored and blocked from zip packages |
| Review Waivers | ledger generated; current release has `1` warning gate that still needs reviewer decision or a time-bounded waiver; blockers remain non-waivable in v0 |
| 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 `59` after the telemetry hook recipe gate update |
| CI | `make ci-test` target count is `60` after the telemetry native host gate update |
## Next Highest-Leverage Moves
@@ -128,4 +129,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. Replace `telemetry-hooks` recipes with platform-native clients that call `telemetry-emit` automatically.
5. Install a real Browser/Chrome extension or provider client against `telemetry_native_host.py` and record production metadata events.
+5 -5
View File
@@ -609,7 +609,7 @@
<ul class="list"><li><span data-lang="zh-CN">把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。</span><span data-lang="en">把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。</span></li><li><span data-lang="zh-CN">Skill 作者、复用团队和后续 reviewer。</span><span data-lang="en">Skill 作者、复用团队和后续 reviewer。</span></li><li><span data-lang="zh-CN">创建完成后建议先打开 reports/skill-overview.html,再继续扩展包体。</span><span data-lang="en">创建完成后建议先打开 reports/skill-overview.html,再继续扩展包体。</span></li></ul>
</aside>
</div>
<div class="score-strip" aria-label="报告关键指标"><article class='score-chip'><span>完整度</span><strong>100</strong><i style='--score:100%'></i><small><span data-lang="zh-CN">SKILL.md 已存在,是 Skill 的入口。</span><span data-lang="en">SKILL.md 已存在,是 Skill 的入口。</span></small></article><article class='score-chip'><span>触发清晰</span><strong>100</strong><i style='--score:100%'></i><small><span data-lang="zh-CN">frontmatter description 已存在,具备基础路由面。</span><span data-lang="en">frontmatter description 已存在,具备基础路由面。</span></small></article><article class='score-chip'><span>证据充分</span><strong>100</strong><i style='--score:100%'></i><small><span data-lang="zh-CN">已生成 20 / 20 类报告证据。</span><span data-lang="en">已生成 20 / 20 类报告证据。</span></small></article><article class='score-chip'><span>上下文成本</span><strong>42</strong><i style='--score:42%'></i><small><span data-lang="zh-CN">入口约 350 个词/字,references 约 15206 个词/字。</span><span data-lang="en">入口约 350 个词/字,references 约 15206 个词/字。</span></small></article></div>
<div class="score-strip" aria-label="报告关键指标"><article class='score-chip'><span>完整度</span><strong>100</strong><i style='--score:100%'></i><small><span data-lang="zh-CN">SKILL.md 已存在,是 Skill 的入口。</span><span data-lang="en">SKILL.md 已存在,是 Skill 的入口。</span></small></article><article class='score-chip'><span>触发清晰</span><strong>100</strong><i style='--score:100%'></i><small><span data-lang="zh-CN">frontmatter description 已存在,具备基础路由面。</span><span data-lang="en">frontmatter description 已存在,具备基础路由面。</span></small></article><article class='score-chip'><span>证据充分</span><strong>100</strong><i style='--score:100%'></i><small><span data-lang="zh-CN">已生成 20 / 20 类报告证据。</span><span data-lang="en">已生成 20 / 20 类报告证据。</span></small></article><article class='score-chip'><span>上下文成本</span><strong>42</strong><i style='--score:42%'></i><small><span data-lang="zh-CN">入口约 350 个词/字,references 约 15316 个词/字。</span><span data-lang="en">入口约 350 个词/字,references 约 15316 个词/字。</span></small></article></div>
</section>
<section id="overview">
@@ -641,10 +641,10 @@
<article class="panel metrics-note">
<h3><span data-lang="zh-CN">指标判读</span><span data-lang="en">Reading</span></h3>
<p><span data-lang="zh-CN">先看雷达图判断能力短板,再看下方每项分数的证据原因。分数不是装饰数字,必须和本地文件、reports 证据或证据不足提示对应。</span><span data-lang="en">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.</span></p>
<ol class='metric-summary-list'><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>完整度</b><em>100</em><small><span data-lang="zh-CN">SKILL.md 已存在,是 Skill 的入口。</span><span data-lang="en">SKILL.md 已存在,是 Skill 的入口。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>触发清晰</b><em>100</em><small><span data-lang="zh-CN">frontmatter description 已存在,具备基础路由面。</span><span data-lang="en">frontmatter description 已存在,具备基础路由面。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>证据充分</b><em>100</em><small><span data-lang="zh-CN">已生成 20 / 20 类报告证据。</span><span data-lang="en">已生成 20 / 20 类报告证据。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>可维护性</b><em>100</em><small><span data-lang="zh-CN">SKILL.md 约 350 个词/字。</span><span data-lang="en">SKILL.md 约 350 个词/字。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>可迁移性</b><em>100</em><small><span data-lang="zh-CN">agents/interface.yaml 已存在。</span><span data-lang="en">agents/interface.yaml 已存在。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">关注</span><span data-lang="en">Watch</span></span><b>上下文成本</b><em>42</em><small><span data-lang="zh-CN">入口约 350 个词/字,references 约 15206 个词/字。</span><span data-lang="en">入口约 350 个词/字,references 约 15206 个词/字。</span></small></li></ol>
<ol class='metric-summary-list'><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>完整度</b><em>100</em><small><span data-lang="zh-CN">SKILL.md 已存在,是 Skill 的入口。</span><span data-lang="en">SKILL.md 已存在,是 Skill 的入口。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>触发清晰</b><em>100</em><small><span data-lang="zh-CN">frontmatter description 已存在,具备基础路由面。</span><span data-lang="en">frontmatter description 已存在,具备基础路由面。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>证据充分</b><em>100</em><small><span data-lang="zh-CN">已生成 20 / 20 类报告证据。</span><span data-lang="en">已生成 20 / 20 类报告证据。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>可维护性</b><em>100</em><small><span data-lang="zh-CN">SKILL.md 约 350 个词/字。</span><span data-lang="en">SKILL.md 约 350 个词/字。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">稳定</span><span data-lang="en">Stable</span></span><b>可迁移性</b><em>100</em><small><span data-lang="zh-CN">agents/interface.yaml 已存在。</span><span data-lang="en">agents/interface.yaml 已存在。</span></small></li><li><span class='metric-status'><span data-lang="zh-CN">关注</span><span data-lang="en">Watch</span></span><b>上下文成本</b><em>42</em><small><span data-lang="zh-CN">入口约 350 个词/字,references 约 15316 个词/字。</span><span data-lang="en">入口约 350 个词/字,references 约 15316 个词/字。</span></small></li></ol>
</article>
</div>
<div class="metric-grid"><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>完整度</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">SKILL.md 已存在,是 Skill 的入口。</span><span data-lang="en">SKILL.md 已存在,是 Skill 的入口。</span></li><li><span data-lang="zh-CN">README.md 已存在,便于人工阅读。</span><span data-lang="en">README.md 已存在,便于人工阅读。</span></li><li><span data-lang="zh-CN">agents/interface.yaml 已存在,便于跨平台适配。</span><span data-lang="en">agents/interface.yaml 已存在,便于跨平台适配。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>触发清晰</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">frontmatter description 已存在,具备基础路由面。</span><span data-lang="en">frontmatter description 已存在,具备基础路由面。</span></li><li><span data-lang="zh-CN">description 有足够长度说明任务边界。</span><span data-lang="en">description 有足够长度说明任务边界。</span></li><li><span data-lang="zh-CN">description 已包含使用场景或排除边界信号。</span><span data-lang="en">description 已包含使用场景或排除边界信号。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>证据充分</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">已生成 20 / 20 类报告证据。</span><span data-lang="en">已生成 20 / 20 类报告证据。</span></li><li><span data-lang="zh-CN">skill-ir.json 已存在。</span><span data-lang="en">skill-ir.json 已存在。</span></li><li><span data-lang="zh-CN">compiled_targets.json 已存在。</span><span data-lang="en">compiled_targets.json 已存在。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>可维护性</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">SKILL.md 约 350 个词/字。</span><span data-lang="en">SKILL.md 约 350 个词/字。</span></li><li><span data-lang="zh-CN">入口文件保持克制,可维护性较好。</span><span data-lang="en">入口文件保持克制,可维护性较好。</span></li><li><span data-lang="zh-CN">references/ 已承载扩展指导。</span><span data-lang="en">references/ 已承载扩展指导。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>可迁移性</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">agents/interface.yaml 已存在。</span><span data-lang="en">agents/interface.yaml 已存在。</span></li><li><span data-lang="zh-CN">manifest.json 已存在。</span><span data-lang="en">manifest.json 已存在。</span></li><li><span data-lang="zh-CN">目标平台或 adapter target 已声明。</span><span data-lang="en">目标平台或 adapter target 已声明。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>上下文成本</span><strong>42</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">入口约 350 个词/字,references 约 15206 个词/字。</span><span data-lang="en">入口约 350 个词/字,references 约 15206 个词/字。</span></li><li><span data-lang="zh-CN">分数越高代表上下文成本越低。</span><span data-lang="en">分数越高代表上下文成本越低。</span></li><li><span data-lang="zh-CN">上下文成本偏高,建议压缩入口或拆分 references。</span><span data-lang="en">上下文成本偏高,建议压缩入口或拆分 references。</span></li></ul></div></article></div>
<div class="metric-grid"><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>完整度</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">SKILL.md 已存在,是 Skill 的入口。</span><span data-lang="en">SKILL.md 已存在,是 Skill 的入口。</span></li><li><span data-lang="zh-CN">README.md 已存在,便于人工阅读。</span><span data-lang="en">README.md 已存在,便于人工阅读。</span></li><li><span data-lang="zh-CN">agents/interface.yaml 已存在,便于跨平台适配。</span><span data-lang="en">agents/interface.yaml 已存在,便于跨平台适配。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>触发清晰</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">frontmatter description 已存在,具备基础路由面。</span><span data-lang="en">frontmatter description 已存在,具备基础路由面。</span></li><li><span data-lang="zh-CN">description 有足够长度说明任务边界。</span><span data-lang="en">description 有足够长度说明任务边界。</span></li><li><span data-lang="zh-CN">description 已包含使用场景或排除边界信号。</span><span data-lang="en">description 已包含使用场景或排除边界信号。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>证据充分</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">已生成 20 / 20 类报告证据。</span><span data-lang="en">已生成 20 / 20 类报告证据。</span></li><li><span data-lang="zh-CN">skill-ir.json 已存在。</span><span data-lang="en">skill-ir.json 已存在。</span></li><li><span data-lang="zh-CN">compiled_targets.json 已存在。</span><span data-lang="en">compiled_targets.json 已存在。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>可维护性</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">SKILL.md 约 350 个词/字。</span><span data-lang="en">SKILL.md 约 350 个词/字。</span></li><li><span data-lang="zh-CN">入口文件保持克制,可维护性较好。</span><span data-lang="en">入口文件保持克制,可维护性较好。</span></li><li><span data-lang="zh-CN">references/ 已承载扩展指导。</span><span data-lang="en">references/ 已承载扩展指导。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>可迁移性</span><strong>100</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">agents/interface.yaml 已存在。</span><span data-lang="en">agents/interface.yaml 已存在。</span></li><li><span data-lang="zh-CN">manifest.json 已存在。</span><span data-lang="en">manifest.json 已存在。</span></li><li><span data-lang="zh-CN">目标平台或 adapter target 已声明。</span><span data-lang="en">目标平台或 adapter target 已声明。</span></li></ul></div></article><article class='metric-card'><div class='metric-card-head'><span class='metric-label'>上下文成本</span><strong>42</strong></div><div class='metric-card-body'><ul class="compact-list"><li><span data-lang="zh-CN">入口约 350 个词/字,references 约 15316 个词/字。</span><span data-lang="en">入口约 350 个词/字,references 约 15316 个词/字。</span></li><li><span data-lang="zh-CN">分数越高代表上下文成本越低。</span><span data-lang="en">分数越高代表上下文成本越低。</span></li><li><span data-lang="zh-CN">上下文成本偏高,建议压缩入口或拆分 references。</span><span data-lang="en">上下文成本偏高,建议压缩入口或拆分 references。</span></li></ul></div></article></div>
</div>
</div>
</div>
@@ -720,7 +720,7 @@
<div>
<table>
<thead><tr><th><span data-lang="zh-CN">类型</span><span data-lang="en">Type</span></th><th><span data-lang="zh-CN">证据</span><span data-lang="en">Evidence</span></th><th><span data-lang="zh-CN">建议</span><span data-lang="en">Action</span></th></tr></thead>
<tbody><tr><td><span data-lang="zh-CN">强项</span><span data-lang="en">Strength</span></td><td><span data-lang="zh-CN">触发面保持精简,并锚定在 frontmatter description。</span><span data-lang="en">The trigger surface stays lean and anchored in the frontmatter description.</span></td><td><span data-lang="zh-CN">保留并复用</span><span data-lang="en">Keep</span></td></tr><tr><td><span data-lang="zh-CN">强项</span><span data-lang="en">Strength</span></td><td><span data-lang="zh-CN">已生成 Skill IR,核心语义可先于平台打包被审查和迁移。</span><span data-lang="en">已生成 Skill IR,核心语义可先于平台打包被审查和迁移。</span></td><td><span data-lang="zh-CN">保留并复用</span><span data-lang="en">Keep</span></td></tr><tr><td><span data-lang="zh-CN">强项</span><span data-lang="en">Strength</span></td><td><span data-lang="zh-CN">已生成目标编译报告,可审查 IR 到 OpenAI、Claude、generic 等目标契约的映射。</span><span data-lang="en">已生成目标编译报告,可审查 IR 到 OpenAI、Claude、generic 等目标契约的映射。</span></td><td><span data-lang="zh-CN">保留并复用</span><span data-lang="en">Keep</span></td></tr><tr><td><span data-lang="zh-CN">缺口</span><span data-lang="en">Gap</span></td><td><span data-lang="zh-CN">上下文成本需要补强:入口约 350 个词/字,references 约 15206 个词/字。</span><span data-lang="en">上下文成本需要补强:入口约 350 个词/字,references 约 15206 个词/字。</span></td><td><span data-lang="zh-CN">纳入下一轮修复</span><span data-lang="en">Fix next</span></td></tr></tbody>
<tbody><tr><td><span data-lang="zh-CN">强项</span><span data-lang="en">Strength</span></td><td><span data-lang="zh-CN">触发面保持精简,并锚定在 frontmatter description。</span><span data-lang="en">The trigger surface stays lean and anchored in the frontmatter description.</span></td><td><span data-lang="zh-CN">保留并复用</span><span data-lang="en">Keep</span></td></tr><tr><td><span data-lang="zh-CN">强项</span><span data-lang="en">Strength</span></td><td><span data-lang="zh-CN">已生成 Skill IR,核心语义可先于平台打包被审查和迁移。</span><span data-lang="en">已生成 Skill IR,核心语义可先于平台打包被审查和迁移。</span></td><td><span data-lang="zh-CN">保留并复用</span><span data-lang="en">Keep</span></td></tr><tr><td><span data-lang="zh-CN">强项</span><span data-lang="en">Strength</span></td><td><span data-lang="zh-CN">已生成目标编译报告,可审查 IR 到 OpenAI、Claude、generic 等目标契约的映射。</span><span data-lang="en">已生成目标编译报告,可审查 IR 到 OpenAI、Claude、generic 等目标契约的映射。</span></td><td><span data-lang="zh-CN">保留并复用</span><span data-lang="en">Keep</span></td></tr><tr><td><span data-lang="zh-CN">缺口</span><span data-lang="en">Gap</span></td><td><span data-lang="zh-CN">上下文成本需要补强:入口约 350 个词/字,references 约 15316 个词/字。</span><span data-lang="en">上下文成本需要补强:入口约 350 个词/字,references 约 15316 个词/字。</span></td><td><span data-lang="zh-CN">纳入下一轮修复</span><span data-lang="en">Fix next</span></td></tr></tbody>
</table>
<div class="two-col quality-panels">
<article class="panel">
@@ -771,7 +771,7 @@
<p><span data-lang="zh-CN">让 reviewer 快速确认关键文件、目录和资产分布。</span><span data-lang="en">Lets reviewers confirm key files, directories, and asset distribution quickly.</span></p>
</div>
<div class="two-col">
<figure class="chart-figure" data-chart="asset_donut"><svg viewBox="0 0 430 270" role="img" aria-label="资产分布"><text x="20" y="30" class="chart-title">资产分布</text><circle cx="130" cy="130" r="70" fill="none" stroke="#1B365D" stroke-width="24" stroke-dasharray="0.9 99.1" stroke-dashoffset="0.0" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#2D5A8A" stroke-width="24" stroke-dasharray="0.9 99.1" stroke-dashoffset="-0.9" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#D0DCE9" stroke-width="24" stroke-dasharray="0.9 99.1" stroke-dashoffset="-1.8" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#E4ECF5" stroke-width="24" stroke-dasharray="0.9 99.1" stroke-dashoffset="-2.8" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#e8e6dc" stroke-width="24" stroke-dasharray="29.4 70.6" stroke-dashoffset="-3.7" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#504e49" stroke-width="24" stroke-dasharray="67.0 33.0" stroke-dashoffset="-33.0" pathLength="100" transform="rotate(-90 130 130)"/><text x="130" y="136" text-anchor="middle">310</text><text x="235" y="78">SKILL.md</text><text x="235" y="100">README.md</text><text x="235" y="122">agents/interface.yaml</text><text x="235" y="144">manifest.json</text><text x="235" y="166">references</text><text x="235" y="188">scripts</text></svg><figcaption>资产分布图展示当前包体的文件和目录重心。</figcaption></figure>
<figure class="chart-figure" data-chart="asset_donut"><svg viewBox="0 0 430 270" role="img" aria-label="资产分布"><text x="20" y="30" class="chart-title">资产分布</text><circle cx="130" cy="130" r="70" fill="none" stroke="#1B365D" stroke-width="24" stroke-dasharray="0.9 99.1" stroke-dashoffset="0.0" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#2D5A8A" stroke-width="24" stroke-dasharray="0.9 99.1" stroke-dashoffset="-0.9" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#D0DCE9" stroke-width="24" stroke-dasharray="0.9 99.1" stroke-dashoffset="-1.8" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#E4ECF5" stroke-width="24" stroke-dasharray="0.9 99.1" stroke-dashoffset="-2.7" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#e8e6dc" stroke-width="24" stroke-dasharray="29.1 70.9" stroke-dashoffset="-3.6" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#504e49" stroke-width="24" stroke-dasharray="67.3 32.7" stroke-dashoffset="-32.7" pathLength="100" transform="rotate(-90 130 130)"/><text x="130" y="136" text-anchor="middle">311</text><text x="235" y="78">SKILL.md</text><text x="235" y="100">README.md</text><text x="235" y="122">agents/interface.yaml</text><text x="235" y="144">manifest.json</text><text x="235" y="166">references</text><text x="235" y="188">scripts</text></svg><figcaption>资产分布图展示当前包体的文件和目录重心。</figcaption></figure>
<table>
<thead><tr><th><span data-lang="zh-CN">路径</span><span data-lang="en">Path</span></th><th><span data-lang="zh-CN">作用</span><span data-lang="en">Role</span></th><th><span data-lang="zh-CN">类型</span><span data-lang="en">Type</span></th></tr></thead>
<tbody><tr><td>SKILL.md</td><td><span data-lang="zh-CN">Skill 入口文件</span><span data-lang="en">Skill entrypoint</span></td><td><span data-lang="zh-CN">文件</span><span data-lang="en">file</span></td></tr><tr><td>README.md</td><td><span data-lang="zh-CN">人类可读使用说明</span><span data-lang="en">Human-readable usage guide</span></td><td><span data-lang="zh-CN">文件</span><span data-lang="en">file</span></td></tr><tr><td>agents/interface.yaml</td><td><span data-lang="zh-CN">跨平台接口元数据</span><span data-lang="en">Neutral interface metadata</span></td><td><span data-lang="zh-CN">文件</span><span data-lang="en">file</span></td></tr><tr><td>manifest.json</td><td><span data-lang="zh-CN">生命周期与打包元数据</span><span data-lang="en">Lifecycle and portability metadata</span></td><td><span data-lang="zh-CN">文件</span><span data-lang="en">file</span></td></tr><tr><td>references</td><td><span data-lang="zh-CN">扩展指导与复用资料</span><span data-lang="en">Extended guidance and reusable notes</span></td><td><span data-lang="zh-CN">目录</span><span data-lang="en">folder</span></td></tr><tr><td>scripts</td><td><span data-lang="zh-CN">确定性脚本或本地工具</span><span data-lang="en">Deterministic helpers or local tooling</span></td><td><span data-lang="zh-CN">目录</span><span data-lang="en">folder</span></td></tr><tr><td>evals</td><td><span data-lang="zh-CN">触发与质量检查</span><span data-lang="en">Trigger and quality checks</span></td><td><span data-lang="zh-CN">目录</span><span data-lang="en">folder</span></td></tr><tr><td>reports</td><td><span data-lang="zh-CN">生成的证据与总结报告</span><span data-lang="en">Generated evidence and overview artifacts</span></td><td><span data-lang="zh-CN">目录</span><span data-lang="en">folder</span></td></tr></tbody>
+20 -20
View File
@@ -96,7 +96,7 @@
"label": "上下文成本",
"score": 42,
"reasons": [
"入口约 350 个词/字,references 约 15206 个词/字。",
"入口约 350 个词/字,references 约 15316 个词/字。",
"分数越高代表上下文成本越低。",
"上下文成本偏高,建议压缩入口或拆分 references。"
]
@@ -200,7 +200,7 @@
"已生成 Output Review Adjudication,可记录盲评决策、一致率和待评审项。"
],
"gaps": [
"上下文成本需要补强:入口约 350 个词/字,references 约 15206 个词/字。"
"上下文成本需要补强:入口约 350 个词/字,references 约 15316 个词/字。"
],
"recommendations": [
"先改触发边界,再扩展工作流。",
@@ -433,7 +433,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 73
"file_count": 74
},
{
"path": "evals",
@@ -448,7 +448,7 @@
"file_count": 173
}
],
"file_count": 310,
"file_count": 311,
"folder_count": 4,
"distribution": [
{
@@ -473,7 +473,7 @@
},
{
"label": "scripts",
"value": 73
"value": 74
},
{
"label": "evals",
@@ -602,7 +602,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 73
"file_count": 74
},
{
"path": "evals",
@@ -948,8 +948,8 @@
"failures": []
},
"trust_security": {
"scanned_files": 157,
"script_count": 73,
"scanned_files": 158,
"script_count": 74,
"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": 50,
"file_write_script_count": 51,
"permission_required_count": 3,
"permission_approved_count": 3,
"permission_missing_count": 0,
"permission_invalid_count": 0,
"permission_expired_count": 0,
"help_smoke_checked_count": 63,
"help_smoke_checked_count": 64,
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 157,
"package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339"
"package_hash_file_count": 158,
"package_sha256": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc"
},
"skill_atlas": {
"skill_count": 12,
@@ -1007,8 +1007,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339",
"archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf"
"package_sha256": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc",
"archive_sha256": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3"
},
"compatibility": {
"openai": "pass",
@@ -1039,7 +1039,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf",
"archive_sha256": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3",
"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": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf",
"archive_entry_count": 503,
"archive_sha256": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3",
"archive_entry_count": 505,
"failure_count": 0,
"warning_count": 0
},
@@ -1067,7 +1067,7 @@
"ok": true,
"summary": {
"archive_present": true,
"archive_entry_count": 503,
"archive_entry_count": 505,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -1134,12 +1134,12 @@
{
"field": "archive_sha256",
"from": "",
"to": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf"
"to": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339"
"to": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc"
}
]
},
+1
View File
@@ -128,6 +128,7 @@
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
+2 -2
View File
@@ -70,12 +70,12 @@
{
"field": "archive_sha256",
"from": "",
"to": "15aac04026bdedbd4c4e4a8eb9ac2cd95b2cda1ffe9735cdb706b0f4393aceaf"
"to": "7494bf9b978d58b663cc0e8b6ffe2531a84602385f6f517774320197d30170d3"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "25df24e0cb24e09a1a11819ca6c185b60c279a4f12851ef1ce9275e67a58d339"
"to": "e42a9c4cf0f22cd6fc047dff3da1a380f5cc9e17157a48d8a1ac2071f7c84fbc"
}
]
},
+1
View File
@@ -53,6 +53,7 @@ DEFAULT_TARGETS = [
"telemetry-import-check",
"telemetry-emit-check",
"telemetry-hooks-check",
"telemetry-native-host-check",
"review-waivers-check",
"review-annotations-check",
"baseline-compare-check",
+229
View File
@@ -0,0 +1,229 @@
#!/usr/bin/env python3
import argparse
import json
import os
import shlex
import stat
import struct
import sys
from pathlib import Path
from typing import Any, BinaryIO
from emit_telemetry_event import append_event, default_spool_path
from render_adoption_drift_report import display_path, normalize_event, skill_defaults
SCHEMA_VERSION = "1.0"
DEFAULT_HOST_NAME = "com.yao.meta_skill.telemetry"
DEFAULT_DESCRIPTION = "Yao metadata-only telemetry native messaging host"
SKILL_DIR_ENV = "YAO_TELEMETRY_SKILL_DIR"
EVENTS_ENV = "YAO_TELEMETRY_EVENTS"
MAX_MESSAGE_BYTES = 1024 * 1024
def read_native_message(stream: BinaryIO) -> dict[str, Any] | None:
header = stream.read(4)
if not header:
return None
if len(header) != 4:
raise ValueError("native message header must be exactly 4 bytes")
size = struct.unpack("<I", header)[0]
if size > MAX_MESSAGE_BYTES:
raise ValueError(f"native message is too large: {size} bytes")
payload = stream.read(size)
if len(payload) != size:
raise ValueError("native message payload ended before declared length")
message = json.loads(payload.decode("utf-8"))
if not isinstance(message, dict):
raise ValueError("native message must be a JSON object")
return message
def write_native_message(stream: BinaryIO, payload: dict[str, Any]) -> None:
data = json.dumps(payload, ensure_ascii=False, sort_keys=True).encode("utf-8")
stream.write(struct.pack("<I", len(data)))
stream.write(data)
stream.flush()
def emit_native_message(
skill_dir: Path,
output_jsonl: Path,
raw_message: dict[str, Any],
dry_run: bool = False,
) -> dict[str, Any]:
raw = dict(raw_message)
raw.setdefault("source", "external")
raw.setdefault("command", "native-messaging-host")
event, failures = normalize_event(raw, skill_defaults(skill_dir), "native-host-message")
if event and not failures and not dry_run:
append_event(output_jsonl, event)
return {
"ok": not failures,
"schema_version": SCHEMA_VERSION,
"mode": "native-messaging-host",
"skill_dir": display_path(skill_dir),
"output_jsonl": display_path(output_jsonl),
"dry_run": dry_run,
"emitted": bool(event and not failures and not dry_run),
"event": event or {},
"failures": failures,
}
def write_launcher(path: Path, host_script: Path, skill_dir: Path, output_jsonl: Path) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
script = "\n".join(
[
"#!/bin/sh",
"set -eu",
(
"exec python3 "
f"{shlex.quote(str(host_script.resolve()))} "
f"{shlex.quote(str(skill_dir.resolve()))} "
"--stdio "
f"--output-jsonl {shlex.quote(str(output_jsonl.resolve()))}"
),
"",
]
)
path.write_text(script, encoding="utf-8")
current = path.stat().st_mode
path.chmod(current | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
def write_manifest(
manifest_path: Path,
host_name: str,
description: str,
host_path: Path,
allowed_origins: list[str],
) -> dict[str, Any]:
failures: list[str] = []
if not allowed_origins:
failures.append("At least one --allowed-origin is required for a Chrome native messaging manifest.")
for origin in allowed_origins:
if not origin.startswith("chrome-extension://") or not origin.endswith("/"):
failures.append(f"Unsupported Chrome extension origin: {origin}")
if not host_path.exists():
failures.append(f"Native host path does not exist: {host_path}")
elif not os.access(host_path, os.X_OK):
failures.append(f"Native host path must be executable: {host_path}")
manifest = {
"name": host_name,
"description": description,
"path": str(host_path.resolve()),
"type": "stdio",
"allowed_origins": allowed_origins,
}
if not failures:
manifest_path.parent.mkdir(parents=True, exist_ok=True)
manifest_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
return {
"ok": not failures,
"schema_version": SCHEMA_VERSION,
"manifest": manifest,
"manifest_path": display_path(manifest_path),
"failures": failures,
}
def run_stdio(skill_dir: Path, output_jsonl: Path, dry_run: bool) -> int:
while True:
raw = read_native_message(sys.stdin.buffer)
if raw is None:
return 0
response = emit_native_message(skill_dir, output_jsonl, raw, dry_run=dry_run)
write_native_message(sys.stdout.buffer, response)
def env_default(name: str, fallback: str) -> str:
return os.environ.get(name) or fallback
def main() -> None:
parser = argparse.ArgumentParser(description="Run a metadata-only telemetry native messaging host.")
parser.add_argument("skill_dir", nargs="?", default=env_default(SKILL_DIR_ENV, "."))
parser.add_argument("--output-jsonl", default=os.environ.get(EVENTS_ENV))
parser.add_argument("--message-json", help="Emit one JSON object directly, useful for host smoke tests.")
parser.add_argument("--stdio", action="store_true", help="Use Chrome/Browser Native Messaging length-prefixed stdio.")
parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--write-manifest")
parser.add_argument("--write-launcher")
parser.add_argument("--host-name", default=DEFAULT_HOST_NAME)
parser.add_argument("--description", default=DEFAULT_DESCRIPTION)
parser.add_argument("--allowed-origin", action="append", default=[])
parser.add_argument("--host-path")
args = parser.parse_args()
skill_dir = Path(args.skill_dir).resolve()
output_jsonl = Path(args.output_jsonl).resolve() if args.output_jsonl else default_spool_path(skill_dir).resolve()
host_script = Path(__file__).resolve()
launcher_path = Path(args.write_launcher).resolve() if args.write_launcher else None
if launcher_path:
write_launcher(launcher_path, host_script, skill_dir, output_jsonl)
if args.write_manifest:
host_path = Path(args.host_path).resolve() if args.host_path else launcher_path or host_script
report = write_manifest(
Path(args.write_manifest).resolve(),
args.host_name,
args.description,
host_path,
args.allowed_origin,
)
if launcher_path:
report["launcher_path"] = display_path(launcher_path)
print(json.dumps(report, ensure_ascii=False, indent=2))
if not report["ok"]:
raise SystemExit(2)
return
if args.stdio:
try:
raise SystemExit(run_stdio(skill_dir, output_jsonl, args.dry_run))
except Exception as exc:
write_native_message(
sys.stdout.buffer,
{
"ok": False,
"schema_version": SCHEMA_VERSION,
"mode": "native-messaging-host",
"emitted": False,
"failures": [str(exc)],
},
)
raise SystemExit(2)
if args.message_json:
try:
message = json.loads(args.message_json)
except json.JSONDecodeError as exc:
print(json.dumps({"ok": False, "failures": [f"Invalid --message-json: {exc.msg}"]}, ensure_ascii=False, indent=2))
raise SystemExit(2)
if not isinstance(message, dict):
print(json.dumps({"ok": False, "failures": ["--message-json must decode to a JSON object"]}, ensure_ascii=False, indent=2))
raise SystemExit(2)
report = emit_native_message(skill_dir, output_jsonl, message, dry_run=args.dry_run)
print(json.dumps(report, ensure_ascii=False, indent=2))
if not report["ok"]:
raise SystemExit(2)
return
print(
json.dumps(
{
"ok": False,
"schema_version": SCHEMA_VERSION,
"failures": ["Use --message-json, --stdio, or --write-manifest."],
},
ensure_ascii=False,
indent=2,
)
)
raise SystemExit(2)
if __name__ == "__main__":
main()
+1
View File
@@ -172,6 +172,7 @@
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
+1
View File
@@ -84,6 +84,7 @@
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
+218
View File
@@ -0,0 +1,218 @@
#!/usr/bin/env python3
import json
import shutil
import struct
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
TMP = ROOT / "tests" / "tmp_telemetry_native_host"
HOST = ROOT / "scripts" / "telemetry_native_host.py"
YAO = ROOT / "scripts" / "yao.py"
ORIGIN = "chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/"
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 pack_message(payload: dict) -> bytes:
data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
return struct.pack("<I", len(data)) + data
def unpack_messages(data: bytes) -> list[dict]:
messages = []
offset = 0
while offset < len(data):
size = struct.unpack("<I", data[offset : offset + 4])[0]
offset += 4
payload = data[offset : offset + size]
offset += size
messages.append(json.loads(payload.decode("utf-8")))
return messages
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 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-native-host-demo",
"--description",
"Receive metadata-only telemetry events from a Browser native messaging host.",
"--output-dir",
str(TMP),
],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
skill_dir = TMP / "telemetry-native-host-demo"
spool = TMP / "native-spool.jsonl"
valid = run(
[
sys.executable,
str(HOST),
str(skill_dir),
"--output-jsonl",
str(spool),
"--message-json",
json.dumps(
{
"event": "skill_activation",
"activation_type": "explicit",
"outcome": "accepted",
"failure_type": "none",
"command": "chrome-native-host",
}
),
]
)
assert valid["ok"], valid
assert valid["payload"]["emitted"] is True, valid
events = read_jsonl(spool)
assert len(events) == 1, events
assert events[0]["command"] == "chrome-native-host", events
assert events[0]["source"] == "external", events
invalid = run(
[
sys.executable,
str(HOST),
str(skill_dir),
"--output-jsonl",
str(spool),
"--message-json",
json.dumps(
{
"event": "skill_activation",
"activation_type": "explicit",
"outcome": "accepted",
"failure_type": "none",
"command": "chrome-native-host",
"prompt": "raw prompt must not pass through native host",
}
),
]
)
assert invalid["returncode"] == 2, invalid
assert "raw content fields" in "\n".join(invalid["payload"]["failures"]), invalid
assert len(read_jsonl(spool)) == 1, read_jsonl(spool)
stdio_payload = pack_message(
{
"event": "skill_output",
"activation_type": "manual",
"outcome": "edited",
"failure_type": "none",
"command": "browser-native-host",
}
)
stdio = subprocess.run(
[
sys.executable,
str(HOST),
str(skill_dir),
"--output-jsonl",
str(spool),
"--stdio",
],
cwd=ROOT,
input=stdio_payload,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
assert stdio.returncode == 0, stdio.stderr
responses = unpack_messages(stdio.stdout)
assert len(responses) == 1, responses
assert responses[0]["ok"], responses
assert responses[0]["emitted"] is True, responses
assert len(read_jsonl(spool)) == 2, read_jsonl(spool)
manifest = TMP / "native-host-manifest.json"
launcher = TMP / "yao-telemetry-native-host.sh"
manifest_result = run(
[
sys.executable,
str(HOST),
str(skill_dir),
"--output-jsonl",
str(spool),
"--write-launcher",
str(launcher),
"--write-manifest",
str(manifest),
"--allowed-origin",
ORIGIN,
]
)
assert manifest_result["ok"], manifest_result
assert manifest.exists(), manifest
assert launcher.exists(), launcher
assert launcher.stat().st_mode & 0o111, launcher.stat().st_mode
manifest_payload = json.loads(manifest.read_text(encoding="utf-8"))
assert manifest_payload["name"] == "com.yao.meta_skill.telemetry", manifest_payload
assert manifest_payload["type"] == "stdio", manifest_payload
assert manifest_payload["path"] == str(launcher.resolve()), manifest_payload
assert manifest_payload["allowed_origins"] == [ORIGIN], manifest_payload
manifest_without_launcher = TMP / "native-host-manifest-without-launcher.json"
manifest_without_launcher_result = run(
[
sys.executable,
str(HOST),
str(skill_dir),
"--write-manifest",
str(manifest_without_launcher),
"--allowed-origin",
ORIGIN,
]
)
assert manifest_without_launcher_result["returncode"] == 2, manifest_without_launcher_result
assert not manifest_without_launcher.exists(), manifest_without_launcher
assert "must be executable" in "\n".join(manifest_without_launcher_result["payload"]["failures"])
imported = run(
[
sys.executable,
str(YAO),
"telemetry-import",
str(skill_dir),
"--input-jsonl",
str(spool),
"--generated-at",
"2026-06-13T12:30:00Z",
]
)
assert imported["ok"], imported
assert imported["payload"]["imported_count"] == 2, imported
assert imported["payload"]["adoption_drift"]["summary"]["source_types"]["external"] == 2, imported
assert imported["payload"]["adoption_drift"]["summary"]["command_counts"]["chrome-native-host"] == 1, imported
assert imported["payload"]["adoption_drift"]["summary"]["command_counts"]["browser-native-host"] == 1, imported
print(json.dumps({"ok": True}, ensure_ascii=False, indent=2))
if __name__ == "__main__":
main()