refactor: split review viewer data assembly

This commit is contained in:
yaojingang
2026-06-14 02:28:03 +08:00
parent 479b098ccf
commit 628acc5c35
40 changed files with 624 additions and 576 deletions
+1 -1
View File
@@ -16,7 +16,7 @@
"vscode"
],
"package_metadata": "registry/packages/yao-meta-skill.json",
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
}
]
}
+3 -3
View File
@@ -16,8 +16,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49",
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
"compatibility": {
"openai": "pass",
@@ -48,7 +48,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
+1 -1
View File
@@ -1,7 +1,7 @@
{
"ok": true,
"schema_version": "2.0",
"generated_at": "2026-06-13T18:17:38Z",
"generated_at": "2026-06-13T18:27:31Z",
"skill_dir": ".",
"privacy_contract": {
"storage": "local-first",
+11 -23
View File
@@ -4,16 +4,16 @@
"generated_at": "2026-06-14",
"skill_dir": ".",
"summary": {
"python_file_count": 143,
"script_file_count": 87,
"python_file_count": 144,
"script_file_count": 88,
"test_file_count": 56,
"internal_module_count": 16,
"internal_module_count": 17,
"cli_script_count": 72,
"command_handler_count": 35,
"warn_line_threshold": 900,
"block_line_threshold": 1500,
"largest_file_lines": 1159,
"hotspot_count": 2,
"hotspot_count": 1,
"blocker_count": 0,
"decision": "watch-maintainability-hotspots"
},
@@ -25,13 +25,6 @@
"severity": "warn",
"recommendation": "Split command handlers by domain while keeping scripts/yao.py as the thin CLI orchestrator."
},
{
"path": "scripts/render_review_viewer.py",
"lines": 983,
"kind": "cli-script",
"severity": "warn",
"recommendation": "Split viewer data assembly from HTML section rendering."
},
{
"path": "scripts/render_review_studio.py",
"lines": 887,
@@ -81,6 +74,13 @@
"severity": "pass",
"recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates."
},
{
"path": "scripts/render_review_viewer.py",
"lines": 685,
"kind": "cli-script",
"severity": "pass",
"recommendation": "Split viewer data assembly from HTML section rendering."
},
{
"path": "scripts/build_skill_atlas.py",
"lines": 674,
@@ -110,13 +110,6 @@
"kind": "cli-script",
"severity": "warn",
"recommendation": "Split command handlers by domain while keeping scripts/yao.py as the thin CLI orchestrator."
},
{
"path": "scripts/render_review_viewer.py",
"lines": 983,
"kind": "cli-script",
"severity": "warn",
"recommendation": "Split viewer data assembly from HTML section rendering."
}
],
"actions": [
@@ -124,11 +117,6 @@
"path": "scripts/yao.py",
"severity": "warn",
"action": "Split command handlers by domain while keeping scripts/yao.py as the thin CLI orchestrator."
},
{
"path": "scripts/render_review_viewer.py",
"severity": "warn",
"action": "Split viewer data assembly from HTML section rendering."
}
],
"artifacts": {
+5 -6
View File
@@ -5,14 +5,14 @@ Generated at: `2026-06-14`
## Summary
- decision: `watch-maintainability-hotspots`
- python files: `143`
- scripts: `87`
- python files: `144`
- scripts: `88`
- tests: `56`
- internal modules: `16`
- internal modules: `17`
- CLI scripts: `72`
- Yao CLI command handlers: `35`
- largest file lines: `1159`
- hotspots: `2`
- hotspots: `1`
- blockers: `0`
This report keeps maintainability risk visible before the Meta Skill grows more gates, renderers, and CLI commands.
@@ -22,14 +22,12 @@ This report keeps maintainability risk visible before the Meta Skill grows more
| File | Lines | Kind | Severity | Recommended action |
| --- | ---: | --- | --- | --- |
| `scripts/yao.py` | `1159` | `cli-script` | `warn` | Split command handlers by domain while keeping scripts/yao.py as the thin CLI orchestrator. |
| `scripts/render_review_viewer.py` | `983` | `cli-script` | `warn` | Split viewer data assembly from HTML section rendering. |
## Largest Files
| File | Lines | Kind | Severity |
| --- | ---: | --- | --- |
| `scripts/yao.py` | `1159` | `cli-script` | `warn` |
| `scripts/render_review_viewer.py` | `983` | `cli-script` | `warn` |
| `scripts/render_review_studio.py` | `887` | `cli-script` | `pass` |
| `tests/verify_yao_cli.py` | `838` | `test` | `pass` |
| `scripts/skill_report_model.py` | `782` | `internal-module` | `pass` |
@@ -37,6 +35,7 @@ This report keeps maintainability risk visible before the Meta Skill grows more
| `scripts/optimize_description.py` | `723` | `cli-script` | `pass` |
| `scripts/trust_check.py` | `714` | `internal-module` | `pass` |
| `scripts/yao_cli_parser.py` | `691` | `internal-module` | `pass` |
| `scripts/render_review_viewer.py` | `685` | `cli-script` | `pass` |
| `scripts/build_skill_atlas.py` | `674` | `cli-script` | `pass` |
| `scripts/skill_report_layout.py` | `653` | `internal-module` | `pass` |
| `scripts/render_reference_synthesis.py` | `644` | `cli-script` | `pass` |
+13 -13
View File
@@ -3,11 +3,11 @@
"ok": true,
"generated_at": "2026-06-14",
"skill_dir": ".",
"commit": "d7018dac5583d8973d8544d5f02906e94e8b1f9b",
"commit": "479b098ccfe8756b15cbde1c8b97048ed53e9807",
"git_status": {
"available": true,
"dirty": true,
"changed_file_count": 39,
"changed_file_count": 40,
"sample": [
"MM registry/index.json",
"MM registry/packages/yao-meta-skill.json",
@@ -17,7 +17,7 @@
"MM reports/benchmark_reproducibility.json",
"MM reports/benchmark_reproducibility.md",
"M reports/compiled_targets.json",
"MM reports/context_budget.json",
"M reports/context_budget.json",
"M reports/install_simulation.json",
"MM reports/output_execution_runs.json",
"MM reports/output_execution_runs.md"
@@ -42,7 +42,7 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
"changed_file_count": 39
"changed_file_count": 40
},
"methodology": {
"path": "reports/benchmark_methodology.md",
@@ -116,7 +116,7 @@
"path": "reports/output_execution_runs.json",
"exists": true,
"bytes": 7966,
"sha256": "e1497671aeac5efe481d21880306d1cd156520f3c6981335a23bea04c4d11e5e"
"sha256": "d0eedcbfe9c349e51a3b99619a61fbcdb63dfbb91c6fc33d9826ba2f35aee653"
},
{
"label": "blind_review",
@@ -150,43 +150,43 @@
"label": "trust_report",
"path": "reports/security_trust_report.json",
"exists": true,
"bytes": 90767,
"sha256": "6a3b7738607ffef7d039e1ff913593ec9d5cd0242fc74d430c53bb62dc33df8a"
"bytes": 91352,
"sha256": "029777a16cc11e5b21f85c14e999f0d51f1a8f249803a9f601f13f0abe7b0e27"
},
{
"label": "python_compatibility",
"path": "reports/python_compatibility.json",
"exists": true,
"bytes": 19050,
"sha256": "648f17271e22805669eebc88486f47e891faa9b1fa9f2bf8cf21b14d00f9e1aa"
"bytes": 19171,
"sha256": "8c3be56386b732d17891fe596131c926b2f9caae4da5212596c54606f407480f"
},
{
"label": "registry_audit",
"path": "reports/registry_audit.json",
"exists": true,
"bytes": 3183,
"sha256": "e350e7b2d3d6a971b506c9d2d159059b19e692e0957498a502fe797057ebdb85"
"sha256": "87a5c389da2bc79ce7e17de455afab0478533efea07b41957d9438f6d5aa4ce8"
},
{
"label": "package_verification",
"path": "reports/package_verification.json",
"exists": true,
"bytes": 19325,
"sha256": "144cd592106a66b50e8464b96494f6ed0ad41dba11941a3d7de11765b818a800"
"sha256": "583dc48f80f27ec6400bf754c949a1bd2245a84c94ff7916d7ca08be7a54c35c"
},
{
"label": "install_simulation",
"path": "reports/install_simulation.json",
"exists": true,
"bytes": 8557,
"sha256": "097060e129d0d699a2e19c5802b03b14b28134983a87f7d78cc1d525e7e5c683"
"sha256": "efbddb4eb6c7dd1749c1499002da0d9890f9404b3dad204b02970f44a0bd2899"
},
{
"label": "skill_os2_audit",
"path": "reports/skill_os2_audit.json",
"exists": true,
"bytes": 13946,
"sha256": "52aff10d9877c50343b2caca9f2e3f6a721045662b6862551e22f5fe0555d878"
"sha256": "3066a5a9f46200667e2bc2e986bad281922d7546194f908594301930a0eeeac4"
},
{
"label": "world_class_evidence_plan",
+9 -9
View File
@@ -1,7 +1,7 @@
# Benchmark Reproducibility
Generated at: `2026-06-14`
Commit: `d7018dac5583d8973d8544d5f02906e94e8b1f9b`
Commit: `479b098ccfe8756b15cbde1c8b97048ed53e9807`
Working tree dirty at generation: `true`
## Summary
@@ -16,7 +16,7 @@ Working tree dirty at generation: `true`
- provider evidence complete: `false`
- human review complete: `false`
- world-class ready: `false`
- changed files at generation: `39`
- changed files at generation: `40`
This report proves local benchmark reproducibility only. It keeps external provider and human-review gaps visible instead of counting them as complete.
@@ -40,17 +40,17 @@ This report proves local benchmark reproducibility only. It keeps external provi
| output_cases | `evals/output/cases.jsonl` | present | `a6ae96857116` |
| output_schema | `evals/output/schema.json` | present | `8ee340c95064` |
| output_scorecard | `reports/output_quality_scorecard.json` | present | `0806258a8e08` |
| output_execution | `reports/output_execution_runs.json` | present | `e1497671aeac` |
| output_execution | `reports/output_execution_runs.json` | present | `d0eedcbfe9c3` |
| blind_review | `reports/output_blind_review_pack.json` | present | `bbe2db8ec277` |
| review_adjudication | `reports/output_review_adjudication.json` | present | `ddd9af90d42e` |
| trigger_scorecard | `reports/route_scorecard.json` | present | `c164e83e36d0` |
| runtime_conformance | `reports/conformance_matrix.json` | present | `8251329e663d` |
| trust_report | `reports/security_trust_report.json` | present | `6a3b7738607f` |
| python_compatibility | `reports/python_compatibility.json` | present | `648f17271e22` |
| registry_audit | `reports/registry_audit.json` | present | `e350e7b2d3d6` |
| package_verification | `reports/package_verification.json` | present | `144cd592106a` |
| install_simulation | `reports/install_simulation.json` | present | `097060e129d0` |
| skill_os2_audit | `reports/skill_os2_audit.json` | present | `52aff10d9877` |
| trust_report | `reports/security_trust_report.json` | present | `029777a16cc1` |
| python_compatibility | `reports/python_compatibility.json` | present | `8c3be56386b7` |
| registry_audit | `reports/registry_audit.json` | present | `87a5c389da2b` |
| package_verification | `reports/package_verification.json` | present | `583dc48f80f2` |
| install_simulation | `reports/install_simulation.json` | present | `efbddb4eb6c7` |
| skill_os2_audit | `reports/skill_os2_audit.json` | present | `3066a5a9f462` |
| world_class_evidence_plan | `reports/world_class_evidence_plan.json` | present | `ed1274b7c18c` |
| world_class_evidence_ledger | `reports/world_class_evidence_ledger.json` | present | `5ed043491c3d` |
| world_class_evidence_intake | `reports/world_class_evidence_intake.json` | present | `124b9239d7f3` |
+10 -10
View File
@@ -209,6 +209,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -223,8 +224,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -1050,6 +1050,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -1064,8 +1065,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -1891,6 +1891,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -1905,8 +1906,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -2716,6 +2716,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -2730,8 +2731,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -3541,6 +3541,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -3555,8 +3556,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
+3 -3
View File
@@ -6,10 +6,10 @@
"context_budget_tier": "production",
"context_budget_limit": 1000,
"skill_body_tokens": 751,
"other_text_tokens": 1084439,
"other_text_tokens": 1084834,
"estimated_initial_load_tokens": 944,
"estimated_total_text_tokens": 1085190,
"relevant_file_count": 473,
"estimated_total_text_tokens": 1085585,
"relevant_file_count": 475,
"unused_resource_dirs": [],
"quality_signal_points": 130,
"quality_density": 137.7
+1 -1
View File
@@ -8,7 +8,7 @@
"installed_skill_dir": "[temporary-install-root]/yao-meta-skill",
"summary": {
"archive_present": true,
"archive_entry_count": 555,
"archive_entry_count": 556,
"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": 27.82,
"duration_ms": 25.77,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -62,7 +62,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 26.16,
"duration_ms": 26.06,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -85,7 +85,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 27.01,
"duration_ms": 25.36,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -113,7 +113,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.68,
"duration_ms": 25.91,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -136,7 +136,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.7,
"duration_ms": 25.66,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -164,7 +164,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.64,
"duration_ms": 25.45,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -187,7 +187,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.83,
"duration_ms": 26.13,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -214,7 +214,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 26.02,
"duration_ms": 25.42,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -237,7 +237,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.66,
"duration_ms": 25.7,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -266,7 +266,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.68,
"duration_ms": 25.71,
"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 | 27.82 | 33 | 0.0 | pass |
| skill-package-contract | with_skill | command | local-output-eval-runner | 26.16 | 73 | 100.0 | pass |
| output-eval-expectation | baseline | command | local-output-eval-runner | 27.01 | 36 | 0.0 | pass |
| output-eval-expectation | with_skill | command | local-output-eval-runner | 25.68 | 80 | 100.0 | pass |
| ir-before-packaging | baseline | command | local-output-eval-runner | 25.7 | 33 | 0.0 | pass |
| ir-before-packaging | with_skill | command | local-output-eval-runner | 25.64 | 80 | 100.0 | pass |
| near-neighbor-boundary | baseline | command | local-output-eval-runner | 25.83 | 36 | 0.0 | pass |
| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 26.02 | 65 | 100.0 | pass |
| file-backed-governed-package | baseline | command | local-output-eval-runner | 25.66 | 37 | 0.0 | pass |
| file-backed-governed-package | with_skill | command | local-output-eval-runner | 25.68 | 98 | 100.0 | pass |
| skill-package-contract | baseline | command | local-output-eval-runner | 25.77 | 33 | 0.0 | pass |
| skill-package-contract | with_skill | command | local-output-eval-runner | 26.06 | 73 | 100.0 | pass |
| output-eval-expectation | baseline | command | local-output-eval-runner | 25.36 | 36 | 0.0 | pass |
| output-eval-expectation | with_skill | command | local-output-eval-runner | 25.91 | 80 | 100.0 | pass |
| ir-before-packaging | baseline | command | local-output-eval-runner | 25.66 | 33 | 0.0 | pass |
| ir-before-packaging | with_skill | command | local-output-eval-runner | 25.45 | 80 | 100.0 | pass |
| near-neighbor-boundary | baseline | command | local-output-eval-runner | 26.13 | 36 | 0.0 | pass |
| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 25.42 | 65 | 100.0 | pass |
| file-backed-governed-package | baseline | command | local-output-eval-runner | 25.7 | 37 | 0.0 | pass |
| file-backed-governed-package | with_skill | command | local-output-eval-runner | 25.71 | 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": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_entry_count": 555,
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"archive_entry_count": 556,
"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: `7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0`
- Archive SHA256: `43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f`
- Failures: `0`
- Warnings: `0`
+7 -1
View File
@@ -5,7 +5,7 @@
"root": ".",
"summary": {
"target_python": "3.11",
"file_count": 146,
"file_count": 147,
"issue_count": 0,
"syntax_error_count": 0,
"fstring_311_violation_count": 0,
@@ -424,6 +424,12 @@
"issue_count": 0,
"issues": []
},
{
"path": "scripts/review_viewer_data.py",
"ok": true,
"issue_count": 0,
"issues": []
},
{
"path": "scripts/run_conformance_suite.py",
"ok": true,
+1 -1
View File
@@ -6,7 +6,7 @@ Generated at: `2026-06-14`
- decision: `pass`
- target python: `3.11`
- files scanned: `146`
- files scanned: `147`
- issues: `0`
- syntax errors: `0`
- f-string 3.11 violations: `0`
+4 -4
View File
@@ -21,8 +21,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49",
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
"compatibility": {
"openai": "pass",
@@ -53,7 +53,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"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": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
}
]
},
+2 -2
View File
@@ -6,8 +6,8 @@
- Maturity: `governed`
- Owner: `Yao Team`
- License: `MIT`
- Package SHA256: `1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49`
- Archive SHA256: `7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0`
- Package SHA256: `38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc`
- Archive SHA256: `43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f`
- Install simulated: `True`
## Compatibility
File diff suppressed because one or more lines are too long
+103 -90
View File
@@ -59,7 +59,7 @@
"key": "trust-report",
"label": "信任报告",
"status": "pass",
"detail": "0 secrets; 87 scripts; 3 network-capable scripts; 0 help smoke failures",
"detail": "0 secrets; 88 scripts; 3 network-capable scripts; 0 help smoke failures",
"evidence": "reports/security_trust_report.json",
"link": "security_trust_report.md"
},
@@ -67,7 +67,7 @@
"key": "python-compat",
"label": "Python 兼容",
"status": "pass",
"detail": "Python 3.11; 146 files; 0 compatibility issues; 0 syntax; 0 f-string 3.11 hazards",
"detail": "Python 3.11; 147 files; 0 compatibility issues; 0 syntax; 0 f-string 3.11 hazards",
"evidence": "reports/python_compatibility.json",
"link": "python_compatibility.md"
},
@@ -75,7 +75,7 @@
"key": "architecture-maintainability",
"label": "架构维护",
"status": "warn",
"detail": "143 Python files; 2 hotspots; 0 blockers; largest 1159 lines; 35 CLI handlers",
"detail": "144 Python files; 1 hotspot; 0 blockers; largest 1159 lines; 35 CLI handlers",
"evidence": "reports/architecture_maintainability.json",
"link": "architecture_maintainability.md"
},
@@ -158,7 +158,7 @@
"key": "architecture-maintainability",
"label": "架构维护",
"status": "warn",
"detail": "143 Python files; 2 hotspots; 0 blockers; largest 1159 lines; 35 CLI handlers",
"detail": "144 Python files; 1 hotspot; 0 blockers; largest 1159 lines; 35 CLI handlers",
"evidence": "reports/architecture_maintainability.json",
"link": "architecture_maintainability.md"
},
@@ -249,7 +249,7 @@
"priority": "warning",
"summary": "处理大文件和 CLI command surface 的维护性热点,优先拆分稳定职责边界。",
"why": "Meta Skill 的门禁、报告和 CLI 会持续增长;如果不把架构债纳入审查,后续能力会越来越难验证和迁移。",
"source_fix": "reports/architecture_maintainability.md + scripts/yao.py + scripts/render_review_studio.py",
"source_fix": "reports/architecture_maintainability.md + scripts/yao.py + scripts/render_review_viewer.py",
"source_refs": [
{
"path": "reports/architecture_maintainability.md",
@@ -279,7 +279,7 @@
"path": "scripts/render_review_viewer.py",
"label": "review viewer renderer",
"kind": "source",
"line": 19,
"line": 18,
"exists": true,
"link": "../scripts/render_review_viewer.py"
}
@@ -891,7 +891,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 87
"file_count": 88
},
{
"path": "evals",
@@ -906,7 +906,7 @@
"file_count": 195
}
],
"file_count": 346,
"file_count": 347,
"folder_count": 4,
"distribution": [
{
@@ -931,7 +931,7 @@
},
{
"label": "scripts",
"value": 87
"value": 88
},
{
"label": "evals",
@@ -1060,7 +1060,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 87
"file_count": 88
},
{
"path": "evals",
@@ -1360,9 +1360,9 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
"changed_file_count": 39
"changed_file_count": 40
},
"commit": "d7018dac5583d8973d8544d5f02906e94e8b1f9b",
"commit": "479b098ccfe8756b15cbde1c8b97048ed53e9807",
"missing_artifacts": [],
"limitations": [
"Local command-runner evidence is reproducible but does not replace provider-backed model holdout evidence.",
@@ -1437,9 +1437,9 @@
"failures": []
},
"trust_security": {
"scanned_files": 171,
"script_count": 87,
"internal_module_count": 14,
"scanned_files": 172,
"script_count": 88,
"internal_module_count": 15,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -1457,8 +1457,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 171,
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"package_hash_file_count": 172,
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
},
"skill_atlas": {
"skill_count": 12,
@@ -1496,8 +1496,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49",
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
"compatibility": {
"openai": "pass",
@@ -1528,7 +1528,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
@@ -1544,8 +1544,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_entry_count": 555,
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"archive_entry_count": 556,
"failure_count": 0,
"warning_count": 0
},
@@ -1556,7 +1556,7 @@
"ok": true,
"summary": {
"archive_present": true,
"archive_entry_count": 555,
"archive_entry_count": 556,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -1623,12 +1623,12 @@
{
"field": "archive_sha256",
"from": "",
"to": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"to": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"to": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
}
]
},
@@ -3745,7 +3745,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 27.82,
"duration_ms": 25.77,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3773,7 +3773,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 26.16,
"duration_ms": 26.06,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3796,7 +3796,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 27.01,
"duration_ms": 25.36,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3824,7 +3824,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.68,
"duration_ms": 25.91,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3847,7 +3847,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.7,
"duration_ms": 25.66,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3875,7 +3875,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.64,
"duration_ms": 25.45,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3898,7 +3898,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.83,
"duration_ms": 26.13,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3925,7 +3925,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 26.02,
"duration_ms": 25.42,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3948,7 +3948,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.66,
"duration_ms": 25.7,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3977,7 +3977,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 25.68,
"duration_ms": 25.71,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -4408,7 +4408,7 @@
"label": "Trust Security",
"status": "pass",
"objective": "Scripts, dependencies, permissions, secrets, and package hash are reviewable for team distribution.",
"current": "87 scripts; secrets 0; help failures 0",
"current": "88 scripts; secrets 0; help failures 0",
"command": "python3 scripts/yao.py trust .",
"test": "python3 tests/verify_trust_check.py",
"evidence": [
@@ -4482,7 +4482,7 @@
"label": "Registry Distribution",
"status": "pass",
"objective": "Skill packages are installable, versioned, checksumed, and upgrade-reviewable.",
"current": "archive entries 555; install failures 0",
"current": "archive entries 556; install failures 0",
"command": "python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .",
"test": "python3 tests/verify_registry_audit.py",
"evidence": [
@@ -5111,6 +5111,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -5125,8 +5126,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -5952,6 +5952,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -5966,8 +5967,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -6793,6 +6793,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -6807,8 +6808,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -7618,6 +7618,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -7632,8 +7633,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -8443,6 +8443,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -8457,8 +8458,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -9655,9 +9655,9 @@
"ok": true,
"skill_dir": ".",
"summary": {
"scanned_files": 171,
"script_count": 87,
"internal_module_count": 14,
"scanned_files": 172,
"script_count": 88,
"internal_module_count": 15,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -9675,8 +9675,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 171,
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"package_hash_file_count": 172,
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
},
"failures": [],
"warnings": [],
@@ -10595,6 +10595,20 @@
"network_urls": [],
"network_hosts": []
},
{
"path": "scripts/review_viewer_data.py",
"interface": "internal-module",
"interface_declared": true,
"interface_reason": "Imported by render_review_viewer.py to assemble Review Viewer data before HTML rendering.",
"has_argparse": false,
"has_main_guard": false,
"uses_input": false,
"uses_network": false,
"uses_file_write": false,
"uses_subprocess": false,
"network_urls": [],
"network_hosts": []
},
{
"path": "scripts/run_conformance_suite.py",
"interface": "cli",
@@ -10952,7 +10966,7 @@
"checked_count": 73,
"passed_count": 73,
"failed_count": 0,
"skipped_count": 14,
"skipped_count": 15,
"failed_scripts": [],
"results": [
{
@@ -11707,6 +11721,10 @@
"path": "scripts/review_studio_world_class.py",
"reason": "internal module"
},
{
"path": "scripts/review_viewer_data.py",
"reason": "internal module"
},
{
"path": "scripts/skill_report_charts.py",
"reason": "internal module"
@@ -11924,7 +11942,7 @@
"root": ".",
"summary": {
"target_python": "3.11",
"file_count": 146,
"file_count": 147,
"issue_count": 0,
"syntax_error_count": 0,
"fstring_311_violation_count": 0,
@@ -12343,6 +12361,12 @@
"issue_count": 0,
"issues": []
},
{
"path": "scripts/review_viewer_data.py",
"ok": true,
"issue_count": 0,
"issues": []
},
{
"path": "scripts/run_conformance_suite.py",
"ok": true,
@@ -12830,16 +12854,16 @@
"generated_at": "2026-06-14",
"skill_dir": ".",
"summary": {
"python_file_count": 143,
"script_file_count": 87,
"python_file_count": 144,
"script_file_count": 88,
"test_file_count": 56,
"internal_module_count": 16,
"internal_module_count": 17,
"cli_script_count": 72,
"command_handler_count": 35,
"warn_line_threshold": 900,
"block_line_threshold": 1500,
"largest_file_lines": 1159,
"hotspot_count": 2,
"hotspot_count": 1,
"blocker_count": 0,
"decision": "watch-maintainability-hotspots"
},
@@ -12851,13 +12875,6 @@
"severity": "warn",
"recommendation": "Split command handlers by domain while keeping scripts/yao.py as the thin CLI orchestrator."
},
{
"path": "scripts/render_review_viewer.py",
"lines": 983,
"kind": "cli-script",
"severity": "warn",
"recommendation": "Split viewer data assembly from HTML section rendering."
},
{
"path": "scripts/render_review_studio.py",
"lines": 887,
@@ -12907,6 +12924,13 @@
"severity": "pass",
"recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates."
},
{
"path": "scripts/render_review_viewer.py",
"lines": 685,
"kind": "cli-script",
"severity": "pass",
"recommendation": "Split viewer data assembly from HTML section rendering."
},
{
"path": "scripts/build_skill_atlas.py",
"lines": 674,
@@ -12936,13 +12960,6 @@
"kind": "cli-script",
"severity": "warn",
"recommendation": "Split command handlers by domain while keeping scripts/yao.py as the thin CLI orchestrator."
},
{
"path": "scripts/render_review_viewer.py",
"lines": 983,
"kind": "cli-script",
"severity": "warn",
"recommendation": "Split viewer data assembly from HTML section rendering."
}
],
"actions": [
@@ -12950,11 +12967,6 @@
"path": "scripts/yao.py",
"severity": "warn",
"action": "Split command handlers by domain while keeping scripts/yao.py as the thin CLI orchestrator."
},
{
"path": "scripts/render_review_viewer.py",
"severity": "warn",
"action": "Split viewer data assembly from HTML section rendering."
}
],
"artifacts": {
@@ -12970,10 +12982,10 @@
"context_budget_tier": "production",
"context_budget_limit": 1000,
"skill_body_tokens": 751,
"other_text_tokens": 1084439,
"other_text_tokens": 1084834,
"estimated_initial_load_tokens": 944,
"estimated_total_text_tokens": 1085190,
"relevant_file_count": 473,
"estimated_total_text_tokens": 1085585,
"relevant_file_count": 475,
"unused_resource_dirs": [],
"quality_signal_points": 130,
"quality_density": 137.7
@@ -13901,6 +13913,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -14819,7 +14832,7 @@
"adoption_drift": {
"ok": true,
"schema_version": "2.0",
"generated_at": "2026-06-13T18:17:38Z",
"generated_at": "2026-06-13T18:27:31Z",
"skill_dir": ".",
"privacy_contract": {
"storage": "local-first",
@@ -15593,8 +15606,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49",
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
"compatibility": {
"openai": "pass",
@@ -15625,7 +15638,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
@@ -15650,7 +15663,7 @@
"vscode"
],
"package_metadata": "registry/packages/yao-meta-skill.json",
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
}
]
},
@@ -15673,8 +15686,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_entry_count": 555,
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"archive_entry_count": 556,
"failure_count": 0,
"warning_count": 0
},
@@ -16339,7 +16352,7 @@
"installed_skill_dir": "[temporary-install-root]/yao-meta-skill",
"summary": {
"archive_present": true,
"archive_entry_count": 555,
"archive_entry_count": 556,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -16681,12 +16694,12 @@
{
"field": "archive_sha256",
"from": "",
"to": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"to": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"to": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
}
]
},
+19 -19
View File
@@ -437,7 +437,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 87
"file_count": 88
},
{
"path": "evals",
@@ -452,7 +452,7 @@
"file_count": 195
}
],
"file_count": 346,
"file_count": 347,
"folder_count": 4,
"distribution": [
{
@@ -477,7 +477,7 @@
},
{
"label": "scripts",
"value": 87
"value": 88
},
{
"label": "evals",
@@ -606,7 +606,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 87
"file_count": 88
},
{
"path": "evals",
@@ -906,9 +906,9 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
"changed_file_count": 39
"changed_file_count": 40
},
"commit": "d7018dac5583d8973d8544d5f02906e94e8b1f9b",
"commit": "479b098ccfe8756b15cbde1c8b97048ed53e9807",
"missing_artifacts": [],
"limitations": [
"Local command-runner evidence is reproducible but does not replace provider-backed model holdout evidence.",
@@ -983,9 +983,9 @@
"failures": []
},
"trust_security": {
"scanned_files": 171,
"script_count": 87,
"internal_module_count": 14,
"scanned_files": 172,
"script_count": 88,
"internal_module_count": 15,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -1003,8 +1003,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 171,
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"package_hash_file_count": 172,
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
},
"skill_atlas": {
"skill_count": 12,
@@ -1042,8 +1042,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49",
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
"compatibility": {
"openai": "pass",
@@ -1074,7 +1074,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
@@ -1090,8 +1090,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_entry_count": 555,
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"archive_entry_count": 556,
"failure_count": 0,
"warning_count": 0
},
@@ -1102,7 +1102,7 @@
"ok": true,
"summary": {
"archive_present": true,
"archive_entry_count": 555,
"archive_entry_count": 556,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -1169,12 +1169,12 @@
{
"field": "archive_sha256",
"from": "",
"to": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"to": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"to": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
}
]
},
+24 -6
View File
@@ -2,9 +2,9 @@
"ok": true,
"skill_dir": ".",
"summary": {
"scanned_files": 171,
"script_count": 87,
"internal_module_count": 14,
"scanned_files": 172,
"script_count": 88,
"internal_module_count": 15,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -22,8 +22,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 171,
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"package_hash_file_count": 172,
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
},
"failures": [],
"warnings": [],
@@ -942,6 +942,20 @@
"network_urls": [],
"network_hosts": []
},
{
"path": "scripts/review_viewer_data.py",
"interface": "internal-module",
"interface_declared": true,
"interface_reason": "Imported by render_review_viewer.py to assemble Review Viewer data before HTML rendering.",
"has_argparse": false,
"has_main_guard": false,
"uses_input": false,
"uses_network": false,
"uses_file_write": false,
"uses_subprocess": false,
"network_urls": [],
"network_hosts": []
},
{
"path": "scripts/run_conformance_suite.py",
"interface": "cli",
@@ -1299,7 +1313,7 @@
"checked_count": 73,
"passed_count": 73,
"failed_count": 0,
"skipped_count": 14,
"skipped_count": 15,
"failed_scripts": [],
"results": [
{
@@ -2054,6 +2068,10 @@
"path": "scripts/review_studio_world_class.py",
"reason": "internal module"
},
{
"path": "scripts/review_viewer_data.py",
"reason": "internal module"
},
{
"path": "scripts/skill_report_charts.py",
"reason": "internal module"
+6 -5
View File
@@ -1,9 +1,9 @@
# Security Trust Report
- OK: `True`
- Scanned files: `171`
- Scripts: `87`
- Internal script modules: `14`
- Scanned files: `172`
- Scripts: `88`
- Internal script modules: `15`
- Secret findings: `0`
- Network-capable scripts: `3`
- Network policy covered scripts: `3`
@@ -15,8 +15,8 @@
- CLI help smoke failures: `0`
- Interactive scripts: `0`
- Package hash scope: `source-contract-without-generated-reports`
- Package hash files: `171`
- Package SHA256: `1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49`
- Package hash files: `172`
- Package SHA256: `38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc`
## Failures
@@ -126,6 +126,7 @@
| scripts/review_studio_gates.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_studio.py to keep Review Studio gate evaluation separate from HTML rendering. |
| scripts/review_studio_layout.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_studio.py to keep Review Studio layout and CSS out of gate logic. |
| scripts/review_studio_world_class.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_studio.py to render world-class evidence cards. |
| scripts/review_viewer_data.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_viewer.py to assemble Review Viewer data before HTML rendering. |
| scripts/run_conformance_suite.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/run_description_optimization_suite.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/run_eval_suite.py | cli | False | True | True | False | False | False | True | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
+1 -1
View File
@@ -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.8 99.2" 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.8 99.2" stroke-dashoffset="-0.8" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#D0DCE9" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-1.6" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#E4ECF5" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-2.4" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#e8e6dc" stroke-width="24" stroke-dasharray="26.0 74.0" stroke-dashoffset="-3.3" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#504e49" stroke-width="24" stroke-dasharray="70.7 29.3" stroke-dashoffset="-29.3" pathLength="100" transform="rotate(-90 130 130)"/><text x="130" y="136" text-anchor="middle">346</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.8 99.2" 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.8 99.2" stroke-dashoffset="-0.8" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#D0DCE9" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-1.6" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#E4ECF5" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-2.4" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#e8e6dc" stroke-width="24" stroke-dasharray="25.8 74.2" stroke-dashoffset="-3.2" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#504e49" stroke-width="24" stroke-dasharray="71.0 29.0" stroke-dashoffset="-29.0" pathLength="100" transform="rotate(-90 130 130)"/><text x="130" y="136" text-anchor="middle">347</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>
+19 -19
View File
@@ -436,7 +436,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 87
"file_count": 88
},
{
"path": "evals",
@@ -451,7 +451,7 @@
"file_count": 195
}
],
"file_count": 346,
"file_count": 347,
"folder_count": 4,
"distribution": [
{
@@ -476,7 +476,7 @@
},
{
"label": "scripts",
"value": 87
"value": 88
},
{
"label": "evals",
@@ -605,7 +605,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 87
"file_count": 88
},
{
"path": "evals",
@@ -905,9 +905,9 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
"changed_file_count": 39
"changed_file_count": 40
},
"commit": "d7018dac5583d8973d8544d5f02906e94e8b1f9b",
"commit": "479b098ccfe8756b15cbde1c8b97048ed53e9807",
"missing_artifacts": [],
"limitations": [
"Local command-runner evidence is reproducible but does not replace provider-backed model holdout evidence.",
@@ -982,9 +982,9 @@
"failures": []
},
"trust_security": {
"scanned_files": 171,
"script_count": 87,
"internal_module_count": 14,
"scanned_files": 172,
"script_count": 88,
"internal_module_count": 15,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -1002,8 +1002,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 171,
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"package_hash_file_count": 172,
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
},
"skill_atlas": {
"skill_count": 12,
@@ -1041,8 +1041,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49",
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"package_sha256": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
"compatibility": {
"openai": "pass",
@@ -1073,7 +1073,7 @@
},
"distribution": {
"archive_verified": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
@@ -1089,8 +1089,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
"archive_sha256": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0",
"archive_entry_count": 555,
"archive_sha256": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f",
"archive_entry_count": 556,
"failure_count": 0,
"warning_count": 0
},
@@ -1101,7 +1101,7 @@
"ok": true,
"summary": {
"archive_present": true,
"archive_entry_count": 555,
"archive_entry_count": 556,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -1168,12 +1168,12 @@
{
"field": "archive_sha256",
"from": "",
"to": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"to": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"to": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
}
]
},
+1
View File
@@ -128,6 +128,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
+2 -2
View File
@@ -197,7 +197,7 @@
"key": "trust-security",
"label": "Trust Security",
"status": "pass",
"current": "secrets 0; scripts 87; help failures 0",
"current": "secrets 0; scripts 88; help failures 0",
"target": "Secrets, scripts, dependencies, permissions, and package hash are reviewable",
"evidence": [
{
@@ -281,7 +281,7 @@
"key": "registry-distribution",
"label": "Registry Distribution",
"status": "pass",
"current": "zip entries 555; install failures 0; permission failures 0",
"current": "zip entries 556; install failures 0; permission failures 0",
"target": "Package metadata, archive checksum, package verification, and install simulation pass",
"evidence": [
{
+2 -2
View File
@@ -23,11 +23,11 @@ Generated at: `2026-06-14`
| Human Adjudication | human-required | 0/5 decisions; pending 5 | Real reviewer decisions recorded before claiming output review completion | Record real A/B choices in the decision template, then regenerate adjudication. |
| Benchmark Reproducibility | pass | artifacts 20; missing 0; failures 3 | Public methodology, reproducible commands, required artifacts, and failure disclosure are machine-checkable | Keep the manifest current with every benchmark, package, and release evidence change. |
| Runtime Conformance | pass | 5/5 targets pass | Target package structure, metadata, relative paths, and degradation notes pass | Keep target conformance fixtures updated as platform contracts change. |
| Trust Security | pass | secrets 0; scripts 87; help failures 0 | Secrets, scripts, dependencies, permissions, and package hash are reviewable | Keep high-permission approvals scoped, expiring, and target-mapped. |
| Trust Security | pass | secrets 0; scripts 88; help failures 0 | Secrets, scripts, dependencies, permissions, and package hash are reviewable | Keep high-permission approvals scoped, expiring, and target-mapped. |
| Permission Metadata | pass | 4/4 target probes pass; metadata fallback 4 | Packaged adapters expose explicit permission metadata and residual risks | Preserve residual-risk notes until real native enforcement exists. |
| Native Permission Enforcement | external-required | native-enforced targets 0 | At least one target/client enforces approved permissions at runtime | Integrate a real client or installer runtime guard before claiming native permission enforcement. |
| Skill Atlas | pass | 12 skills; actionable collisions 0 | Workspace catalog, route overlap, stale/owner gaps, drift, and no-route opportunities | Feed real drift data into Atlas once client telemetry is installed. |
| Registry Distribution | pass | zip entries 555; install failures 0; permission failures 0 | Package metadata, archive checksum, package verification, and install simulation pass | Regenerate registry after package verification so checksums stay aligned. |
| Registry Distribution | pass | zip entries 556; install failures 0; permission failures 0 | Package metadata, archive checksum, package verification, and install simulation pass | Regenerate registry after package verification so checksums stay aligned. |
| Review Studio | pass | decision review; warnings 4; score 89 | One page shows gates, evidence paths, blockers, warnings, actions, waivers, and annotations | Resolve human/external warning gates before claiming full release readiness. |
| Telemetry Drift | pass | events 1; risk low; recipes 5 | Local-first metadata-only event contract, aggregate drift report, hook recipes, and import path | Keep raw JSONL out of distributed packages and use aggregate reports for Atlas. |
| Native Client Telemetry | external-required | external source events 0; adoption samples 0 | A real Browser/Chrome/provider client sends production metadata events | Install a real client against the native host and import production metadata-only events. |
+2 -2
View File
@@ -122,7 +122,7 @@
"label": "Trust Security",
"status": "pass",
"objective": "Scripts, dependencies, permissions, secrets, and package hash are reviewable for team distribution.",
"current": "87 scripts; secrets 0; help failures 0",
"current": "88 scripts; secrets 0; help failures 0",
"command": "python3 scripts/yao.py trust .",
"test": "python3 tests/verify_trust_check.py",
"evidence": [
@@ -196,7 +196,7 @@
"label": "Registry Distribution",
"status": "pass",
"objective": "Skill packages are installable, versioned, checksumed, and upgrade-reviewable.",
"current": "archive entries 555; install failures 0",
"current": "archive entries 556; install failures 0",
"command": "python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .",
"test": "python3 tests/verify_registry_audit.py",
"evidence": [
+2 -2
View File
@@ -21,9 +21,9 @@ This report maps the Skill OS 2.0 upgrade blueprint to concrete local artifacts,
| Skill IR | `pass` | schema 2.0.0; targets 5 | `python3 scripts/yao.py skill-ir .` | `python3 tests/verify_skill_ir.py` |
| Output Eval Lab | `pass` | 5 cases; delta 100.0; execution 10 | `python3 scripts/yao.py output-exec . && python3 scripts/yao.py output-review .` | `python3 tests/verify_output_eval_lab.py` |
| Runtime Conformance | `pass` | 5/5 targets pass | `python3 scripts/yao.py conformance .` | `python3 tests/verify_conformance_suite.py` |
| Trust Security | `pass` | 87 scripts; secrets 0; help failures 0 | `python3 scripts/yao.py trust .` | `python3 tests/verify_trust_check.py` |
| Trust Security | `pass` | 88 scripts; secrets 0; help failures 0 | `python3 scripts/yao.py trust .` | `python3 tests/verify_trust_check.py` |
| Skill Atlas | `pass` | 12 scanned skills; actionable collisions 0 | `python3 scripts/yao.py skill-atlas --workspace-root .` | `python3 tests/verify_skill_atlas.py` |
| Registry Distribution | `pass` | archive entries 555; install failures 0 | `python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .` | `python3 tests/verify_registry_audit.py` |
| Registry Distribution | `pass` | archive entries 556; install failures 0 | `python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .` | `python3 tests/verify_registry_audit.py` |
| Review Studio | `pass` | 16 gates; decision review; warnings 4 | `python3 scripts/yao.py review-studio .` | `python3 tests/verify_review_studio.py` |
| Telemetry Drift | `pass` | events 1; recipes 5; risk low | `python3 scripts/yao.py telemetry-hooks . && python3 scripts/yao.py adoption-drift .` | `python3 tests/verify_telemetry_hooks.py` |
+2 -2
View File
@@ -70,12 +70,12 @@
{
"field": "archive_sha256",
"from": "",
"to": "7ebe0695052701dec068e1070b72aea19c865b039cf65e8773063b335395bdb0"
"to": "43e1251fe70c406ed6d0e5ec135bc2294492add1b5176427894f7df4dae8e14f"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "1636101ae369f5659d9a64e95bb19144e1271912f1ac5ce846fd7b569cb1ff49"
"to": "38e25604b3d11793a45c37b0680dc50e8233c5d0aecf982879109022fbed0cfc"
}
]
},
+1 -1
View File
@@ -199,7 +199,7 @@ ACTION_GUIDANCE: dict[str, dict[str, str]] = {
"architecture-maintainability": {
"summary": "处理大文件和 CLI command surface 的维护性热点,优先拆分稳定职责边界。",
"why": "Meta Skill 的门禁、报告和 CLI 会持续增长;如果不把架构债纳入审查,后续能力会越来越难验证和迁移。",
"source_fix": "reports/architecture_maintainability.md + scripts/yao.py + scripts/render_review_studio.py",
"source_fix": "reports/architecture_maintainability.md + scripts/yao.py + scripts/render_review_viewer.py",
"source_paths": [
{"path": "reports/architecture_maintainability.md", "label": "architecture maintainability", "kind": "report", "patterns": ["# Architecture"]},
{"path": "scripts/yao.py", "label": "Yao CLI orchestrator", "kind": "source", "patterns": ["def command_"]},
+9 -307
View File
@@ -2,315 +2,17 @@
import argparse
import html
import json
import re
from pathlib import Path
from render_intent_confidence import render_intent_confidence
from render_intent_dialogue import render_intent_dialogue
from render_iteration_directions import render_iteration_directions
from render_artifact_design_profile import render_artifact_design_profile
from render_output_risk_profile import render_output_risk_profile
from render_prompt_quality_profile import render_prompt_quality_profile
from render_reference_scan import render_reference_scan
from render_reference_synthesis import render_reference_synthesis
from render_skill_overview import render_skill_overview
def load_json(path: Path) -> dict:
if not path.exists():
return {}
return json.loads(path.read_text(encoding="utf-8"))
def load_feedback_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "feedback-log.json")
return payload if isinstance(payload, dict) else {}
def load_baseline_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "baseline-compare.json")
return payload if isinstance(payload, dict) else {}
def load_specific_compare(skill_dir: Path) -> dict:
candidates = [
skill_dir / "reports" / "description_optimization.json",
skill_dir.parent / "optimization" / "reports" / "description_optimization.json",
]
for path in candidates:
payload = load_json(path)
if isinstance(payload, dict) and payload:
return payload
return {}
def load_specific_promotion(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "promotion_decisions.json")
return payload if isinstance(payload, dict) else {}
def load_benchmark_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "github-benchmark-scan.json")
return payload if isinstance(payload, dict) else {}
def load_reference_synthesis_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "reference-synthesis.json")
return payload if isinstance(payload, dict) else {}
def load_output_risk_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "output-risk-profile.json")
return payload if isinstance(payload, dict) else {}
def load_artifact_design_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "artifact-design-profile.json")
return payload if isinstance(payload, dict) else {}
def load_prompt_quality_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "prompt-quality-profile.json")
return payload if isinstance(payload, dict) else {}
def ensure_report_inputs(skill_dir: Path) -> dict:
overview_json = skill_dir / "reports" / "skill-overview.json"
intent_confidence_json = skill_dir / "reports" / "intent-confidence.json"
intent_json = skill_dir / "reports" / "intent-dialogue.json"
reference_json = skill_dir / "reports" / "reference-scan.json"
reference_synthesis_json = skill_dir / "reports" / "reference-synthesis.json"
output_risk_json = skill_dir / "reports" / "output-risk-profile.json"
artifact_design_json = skill_dir / "reports" / "artifact-design-profile.json"
prompt_quality_json = skill_dir / "reports" / "prompt-quality-profile.json"
directions_json = skill_dir / "reports" / "iteration-directions.json"
overview_payload = load_json(overview_json) if overview_json.exists() else {}
intent_confidence_payload = load_json(intent_confidence_json) if intent_confidence_json.exists() else {}
intent_payload = load_json(intent_json) if intent_json.exists() else {}
reference_payload = load_json(reference_json) if reference_json.exists() else {}
reference_synthesis_payload = load_json(reference_synthesis_json) if reference_synthesis_json.exists() else {}
output_risk_payload = load_json(output_risk_json) if output_risk_json.exists() else {}
artifact_design_payload = load_json(artifact_design_json) if artifact_design_json.exists() else {}
prompt_quality_payload = load_json(prompt_quality_json) if prompt_quality_json.exists() else {}
directions_payload = load_json(directions_json) if directions_json.exists() else {}
intent_confidence = intent_confidence_payload or render_intent_confidence(skill_dir)["summary"]
intent = intent_payload or render_intent_dialogue(skill_dir)["summary"]
reference = reference_payload or render_reference_scan(skill_dir, [])["summary"]
reference_synthesis = reference_synthesis_payload or render_reference_synthesis(skill_dir)["summary"]
output_risk = output_risk_payload or render_output_risk_profile(skill_dir)["summary"]
artifact_design = artifact_design_payload or render_artifact_design_profile(skill_dir)["summary"]
prompt_quality = prompt_quality_payload or render_prompt_quality_profile(skill_dir)["summary"]
iteration_payload = directions_payload or render_iteration_directions(skill_dir)
iteration = iteration_payload.get("summary", {})
overview = overview_payload or render_skill_overview(skill_dir)["summary"]
feedback = load_feedback_summary(skill_dir)
baseline = load_baseline_summary(skill_dir)
compare = load_specific_compare(skill_dir)
promotion = load_specific_promotion(skill_dir)
benchmark = load_benchmark_summary(skill_dir)
reference_synthesis = load_reference_synthesis_summary(skill_dir)
output_risk = load_output_risk_summary(skill_dir) or output_risk
artifact_design = load_artifact_design_summary(skill_dir) or artifact_design
prompt_quality = load_prompt_quality_summary(skill_dir) or prompt_quality
return {
"overview": overview,
"intent_confidence": intent_confidence,
"intent": intent,
"reference": reference,
"iteration": iteration_payload,
"feedback": feedback,
"baseline": baseline,
"compare": compare,
"promotion": promotion,
"benchmark": benchmark,
"reference_synthesis": reference_synthesis,
"output_risk": output_risk,
"artifact_design": artifact_design,
"prompt_quality": prompt_quality,
}
def architecture_steps(overview: dict) -> list[dict]:
logic = overview.get("logic_steps", [])[:3]
usage = overview.get("usage_steps", [])[:2]
return [
{"label": "Inputs", "detail": "workflow, prompt, transcript, docs, or notes"},
{"label": "Boundary", "detail": overview.get("description", "Define the recurring job and exclusions.")},
{"label": "Logic", "detail": "; ".join(logic) if logic else "Understand, execute, and validate."},
{"label": "Usage", "detail": "; ".join(usage) if usage else "Load the skill and follow the workflow."},
{"label": "Next", "detail": "Review the top iteration directions before growing the package."},
]
def compare_rows(compare: dict) -> list[dict]:
if not compare:
return []
rows = []
items = [
("Baseline", compare.get("baseline", {})),
("Current", compare.get("current_candidate", {})),
(compare.get("winner", {}).get("label", "Winner"), compare.get("winner", {})),
]
for label, payload in items:
if not payload:
continue
dev = payload.get("dev", {})
holdout = payload.get("holdout", {})
rows.append(
{
"label": label,
"tokens": payload.get("estimated_tokens", 0),
"dev_errors": dev.get("total_errors", 0),
"holdout_errors": holdout.get("total_errors", 0),
"strategy": payload.get("strategy", "existing"),
}
)
return rows
def benchmark_cards(benchmark: dict) -> list[dict]:
cards = []
for repo in benchmark.get("repositories", [])[:3]:
cards.append(
{
"name": repo.get("full_name", "Unknown repo"),
"borrow": repo.get("borrow", [])[:2],
"avoid": repo.get("avoid", [])[:1],
}
)
return cards
def synthesis_cards(reference_synthesis: dict) -> list[dict]:
cards = []
for track in reference_synthesis.get("source_tracks", [])[:3]:
cards.append(
{
"name": track.get("name", "Unknown track"),
"borrow": [track.get("borrow", "")] if track.get("borrow") else [],
"avoid": [track.get("avoid", "")] if track.get("avoid") else [],
}
)
return cards
def split_sentences(text: str) -> list[str]:
if not text:
return []
parts = [item.strip() for item in re.split(r"(?<=[.!?])\s+", " ".join(text.split())) if item.strip()]
return parts
def metric_delta(current: int | float, baseline: int | float) -> str:
delta = current - baseline
if delta == 0:
return "0"
return f"{delta:+}"
def variant_diff_cards(compare: dict) -> list[dict]:
baseline = compare.get("baseline", {})
current = compare.get("current_candidate", {})
winner = compare.get("winner", {})
variants = [
("Baseline", baseline),
("Current", current),
(f"Winner — {winner.get('label', 'Winner')}", winner),
]
baseline_sentences = split_sentences(baseline.get("description", ""))
baseline_set = set(baseline_sentences)
baseline_dev = baseline.get("dev", {}).get("total_errors", 0)
baseline_holdout = baseline.get("holdout", {}).get("total_errors", 0)
cards = []
seen = set()
for label, payload in variants:
if not payload:
continue
unique_key = (payload.get("description"), payload.get("strategy"), label)
if unique_key in seen:
continue
seen.add(unique_key)
description = payload.get("description", "")
sentences = split_sentences(description)
sentence_set = set(sentences)
added = [item for item in sentences if item not in baseline_set][:3]
removed = [item for item in baseline_sentences if item not in sentence_set][:2]
dev_errors = payload.get("dev", {}).get("total_errors", 0)
holdout_errors = payload.get("holdout", {}).get("total_errors", 0)
cards.append(
{
"label": label,
"strategy": payload.get("strategy", "existing"),
"description": description,
"tokens": payload.get("estimated_tokens", 0),
"dev_errors": dev_errors,
"holdout_errors": holdout_errors,
"token_delta": metric_delta(payload.get("estimated_tokens", 0), baseline.get("estimated_tokens", 0)),
"dev_delta": metric_delta(dev_errors, baseline_dev),
"holdout_delta": metric_delta(holdout_errors, baseline_holdout),
"added": added if label != "Baseline" else baseline_sentences[:3],
"removed": removed,
}
)
return cards
def evidence_readiness(report: dict) -> dict:
intent_confidence = report.get("intent_confidence", {})
reference_synthesis = report.get("reference_synthesis", {})
output_risk = report.get("output_risk", {})
artifact_design = report.get("artifact_design", {})
prompt_quality = report.get("prompt_quality", {})
benchmark = report.get("benchmark", {})
synthesis = reference_synthesis.get("synthesis", {}) if isinstance(reference_synthesis, dict) else {}
pattern_gate = synthesis.get("pattern_gate", {}) if isinstance(synthesis, dict) else {}
accepted_patterns = pattern_gate.get("accepted", []) if isinstance(pattern_gate, dict) else []
conflicts = synthesis.get("conflicts", []) if isinstance(synthesis, dict) else []
checks = [
{
"label": "Intent clarity",
"status": "ready" if intent_confidence.get("gate_passed") else "needs review",
"detail": f"{intent_confidence.get('score', 0)}/100 intent confidence.",
},
{
"label": "Benchmark coverage",
"status": "ready" if len(benchmark.get("repositories", [])) >= 2 else "needs evidence",
"detail": f"{len(benchmark.get('repositories', []))} GitHub benchmark repositories attached.",
},
{
"label": "Pattern gate",
"status": "ready" if accepted_patterns else "needs review",
"detail": pattern_gate.get("summary", "No pattern gate summary attached."),
},
{
"label": "Conflict handling",
"status": "ready" if not conflicts else "decision needed",
"detail": "No material conflicts detected." if not conflicts else conflicts[0].get("summary", "Conflict detected."),
},
{
"label": "Output risk profile",
"status": "ready" if output_risk.get("risk_families") else "needs review",
"detail": f"{len(output_risk.get('risk_families', []))} output risk families attached.",
},
{
"label": "Artifact design profile",
"status": "ready" if artifact_design.get("primary_artifact") else "needs review",
"detail": artifact_design.get("primary_artifact", {}).get("direction", "No artifact design profile attached."),
},
{
"label": "Prompt quality profile",
"status": "ready" if prompt_quality.get("quality_matrix") else "needs review",
"detail": f"{prompt_quality.get('overall_quality_score', 0)}/100 prompt-facing quality score.",
},
]
ready_count = sum(1 for item in checks if item["status"] == "ready")
return {
"score": int(ready_count / len(checks) * 100),
"checks": checks,
"reviewer_note": "Use this section to decide whether the package is ready to deepen or should stay in discovery.",
}
from review_viewer_data import (
architecture_steps,
benchmark_cards,
compare_rows,
ensure_report_inputs,
evidence_readiness,
synthesis_cards,
variant_diff_cards,
)
def render_html(report: dict) -> str:
+4 -2
View File
@@ -304,10 +304,12 @@ def build_gates(skill_dir: Path, output_html: Path, data: dict[str, dict[str, An
hotspot_count = int(architecture_summary.get("hotspot_count", 0) or 0)
blocker_count = int(architecture_summary.get("blocker_count", 0) or 0)
architecture_status = "block" if not architecture.get("ok", True) or blocker_count else ("warn" if hotspot_count else "pass")
hotspot_label = "hotspot" if hotspot_count == 1 else "hotspots"
blocker_label = "blocker" if blocker_count == 1 else "blockers"
architecture_detail = (
f"{architecture_summary.get('python_file_count', 0)} Python files; "
f"{hotspot_count} hotspots; "
f"{blocker_count} blockers; "
f"{hotspot_count} {hotspot_label}; "
f"{blocker_count} {blocker_label}; "
f"largest {architecture_summary.get('largest_file_lines', 0)} lines; "
f"{architecture_summary.get('command_handler_count', 0)} CLI handlers"
)
+316
View File
@@ -0,0 +1,316 @@
#!/usr/bin/env python3
"""Data preparation helpers for the compact review viewer."""
import json
import re
from pathlib import Path
from render_intent_confidence import render_intent_confidence
from render_intent_dialogue import render_intent_dialogue
from render_iteration_directions import render_iteration_directions
from render_artifact_design_profile import render_artifact_design_profile
from render_output_risk_profile import render_output_risk_profile
from render_prompt_quality_profile import render_prompt_quality_profile
from render_reference_scan import render_reference_scan
from render_reference_synthesis import render_reference_synthesis
from render_skill_overview import render_skill_overview
SCRIPT_INTERFACE = "internal-module"
SCRIPT_INTERFACE_REASON = "Imported by render_review_viewer.py to assemble Review Viewer data before HTML rendering."
def load_json(path: Path) -> dict:
if not path.exists():
return {}
return json.loads(path.read_text(encoding="utf-8"))
def load_feedback_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "feedback-log.json")
return payload if isinstance(payload, dict) else {}
def load_baseline_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "baseline-compare.json")
return payload if isinstance(payload, dict) else {}
def load_specific_compare(skill_dir: Path) -> dict:
candidates = [
skill_dir / "reports" / "description_optimization.json",
skill_dir.parent / "optimization" / "reports" / "description_optimization.json",
]
for path in candidates:
payload = load_json(path)
if isinstance(payload, dict) and payload:
return payload
return {}
def load_specific_promotion(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "promotion_decisions.json")
return payload if isinstance(payload, dict) else {}
def load_benchmark_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "github-benchmark-scan.json")
return payload if isinstance(payload, dict) else {}
def load_reference_synthesis_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "reference-synthesis.json")
return payload if isinstance(payload, dict) else {}
def load_output_risk_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "output-risk-profile.json")
return payload if isinstance(payload, dict) else {}
def load_artifact_design_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "artifact-design-profile.json")
return payload if isinstance(payload, dict) else {}
def load_prompt_quality_summary(skill_dir: Path) -> dict:
payload = load_json(skill_dir / "reports" / "prompt-quality-profile.json")
return payload if isinstance(payload, dict) else {}
def ensure_report_inputs(skill_dir: Path) -> dict:
overview_json = skill_dir / "reports" / "skill-overview.json"
intent_confidence_json = skill_dir / "reports" / "intent-confidence.json"
intent_json = skill_dir / "reports" / "intent-dialogue.json"
reference_json = skill_dir / "reports" / "reference-scan.json"
reference_synthesis_json = skill_dir / "reports" / "reference-synthesis.json"
output_risk_json = skill_dir / "reports" / "output-risk-profile.json"
artifact_design_json = skill_dir / "reports" / "artifact-design-profile.json"
prompt_quality_json = skill_dir / "reports" / "prompt-quality-profile.json"
directions_json = skill_dir / "reports" / "iteration-directions.json"
overview_payload = load_json(overview_json) if overview_json.exists() else {}
intent_confidence_payload = load_json(intent_confidence_json) if intent_confidence_json.exists() else {}
intent_payload = load_json(intent_json) if intent_json.exists() else {}
reference_payload = load_json(reference_json) if reference_json.exists() else {}
reference_synthesis_payload = load_json(reference_synthesis_json) if reference_synthesis_json.exists() else {}
output_risk_payload = load_json(output_risk_json) if output_risk_json.exists() else {}
artifact_design_payload = load_json(artifact_design_json) if artifact_design_json.exists() else {}
prompt_quality_payload = load_json(prompt_quality_json) if prompt_quality_json.exists() else {}
directions_payload = load_json(directions_json) if directions_json.exists() else {}
intent_confidence = intent_confidence_payload or render_intent_confidence(skill_dir)["summary"]
intent = intent_payload or render_intent_dialogue(skill_dir)["summary"]
reference = reference_payload or render_reference_scan(skill_dir, [])["summary"]
reference_synthesis = reference_synthesis_payload or render_reference_synthesis(skill_dir)["summary"]
output_risk = output_risk_payload or render_output_risk_profile(skill_dir)["summary"]
artifact_design = artifact_design_payload or render_artifact_design_profile(skill_dir)["summary"]
prompt_quality = prompt_quality_payload or render_prompt_quality_profile(skill_dir)["summary"]
iteration_payload = directions_payload or render_iteration_directions(skill_dir)
iteration = iteration_payload.get("summary", {})
overview = overview_payload or render_skill_overview(skill_dir)["summary"]
feedback = load_feedback_summary(skill_dir)
baseline = load_baseline_summary(skill_dir)
compare = load_specific_compare(skill_dir)
promotion = load_specific_promotion(skill_dir)
benchmark = load_benchmark_summary(skill_dir)
reference_synthesis = load_reference_synthesis_summary(skill_dir)
output_risk = load_output_risk_summary(skill_dir) or output_risk
artifact_design = load_artifact_design_summary(skill_dir) or artifact_design
prompt_quality = load_prompt_quality_summary(skill_dir) or prompt_quality
return {
"overview": overview,
"intent_confidence": intent_confidence,
"intent": intent,
"reference": reference,
"iteration": iteration_payload,
"feedback": feedback,
"baseline": baseline,
"compare": compare,
"promotion": promotion,
"benchmark": benchmark,
"reference_synthesis": reference_synthesis,
"output_risk": output_risk,
"artifact_design": artifact_design,
"prompt_quality": prompt_quality,
}
def architecture_steps(overview: dict) -> list[dict]:
logic = overview.get("logic_steps", [])[:3]
usage = overview.get("usage_steps", [])[:2]
return [
{"label": "Inputs", "detail": "workflow, prompt, transcript, docs, or notes"},
{"label": "Boundary", "detail": overview.get("description", "Define the recurring job and exclusions.")},
{"label": "Logic", "detail": "; ".join(logic) if logic else "Understand, execute, and validate."},
{"label": "Usage", "detail": "; ".join(usage) if usage else "Load the skill and follow the workflow."},
{"label": "Next", "detail": "Review the top iteration directions before growing the package."},
]
def compare_rows(compare: dict) -> list[dict]:
if not compare:
return []
rows = []
items = [
("Baseline", compare.get("baseline", {})),
("Current", compare.get("current_candidate", {})),
(compare.get("winner", {}).get("label", "Winner"), compare.get("winner", {})),
]
for label, payload in items:
if not payload:
continue
dev = payload.get("dev", {})
holdout = payload.get("holdout", {})
rows.append(
{
"label": label,
"tokens": payload.get("estimated_tokens", 0),
"dev_errors": dev.get("total_errors", 0),
"holdout_errors": holdout.get("total_errors", 0),
"strategy": payload.get("strategy", "existing"),
}
)
return rows
def benchmark_cards(benchmark: dict) -> list[dict]:
cards = []
for repo in benchmark.get("repositories", [])[:3]:
cards.append(
{
"name": repo.get("full_name", "Unknown repo"),
"borrow": repo.get("borrow", [])[:2],
"avoid": repo.get("avoid", [])[:1],
}
)
return cards
def synthesis_cards(reference_synthesis: dict) -> list[dict]:
cards = []
for track in reference_synthesis.get("source_tracks", [])[:3]:
cards.append(
{
"name": track.get("name", "Unknown track"),
"borrow": [track.get("borrow", "")] if track.get("borrow") else [],
"avoid": [track.get("avoid", "")] if track.get("avoid") else [],
}
)
return cards
def split_sentences(text: str) -> list[str]:
if not text:
return []
parts = [item.strip() for item in re.split(r"(?<=[.!?])\s+", " ".join(text.split())) if item.strip()]
return parts
def metric_delta(current: int | float, baseline: int | float) -> str:
delta = current - baseline
if delta == 0:
return "0"
return f"{delta:+}"
def variant_diff_cards(compare: dict) -> list[dict]:
baseline = compare.get("baseline", {})
current = compare.get("current_candidate", {})
winner = compare.get("winner", {})
variants = [
("Baseline", baseline),
("Current", current),
(f"Winner — {winner.get('label', 'Winner')}", winner),
]
baseline_sentences = split_sentences(baseline.get("description", ""))
baseline_set = set(baseline_sentences)
baseline_dev = baseline.get("dev", {}).get("total_errors", 0)
baseline_holdout = baseline.get("holdout", {}).get("total_errors", 0)
cards = []
seen = set()
for label, payload in variants:
if not payload:
continue
unique_key = (payload.get("description"), payload.get("strategy"), label)
if unique_key in seen:
continue
seen.add(unique_key)
description = payload.get("description", "")
sentences = split_sentences(description)
sentence_set = set(sentences)
added = [item for item in sentences if item not in baseline_set][:3]
removed = [item for item in baseline_sentences if item not in sentence_set][:2]
dev_errors = payload.get("dev", {}).get("total_errors", 0)
holdout_errors = payload.get("holdout", {}).get("total_errors", 0)
cards.append(
{
"label": label,
"strategy": payload.get("strategy", "existing"),
"description": description,
"tokens": payload.get("estimated_tokens", 0),
"dev_errors": dev_errors,
"holdout_errors": holdout_errors,
"token_delta": metric_delta(payload.get("estimated_tokens", 0), baseline.get("estimated_tokens", 0)),
"dev_delta": metric_delta(dev_errors, baseline_dev),
"holdout_delta": metric_delta(holdout_errors, baseline_holdout),
"added": added if label != "Baseline" else baseline_sentences[:3],
"removed": removed,
}
)
return cards
def evidence_readiness(report: dict) -> dict:
intent_confidence = report.get("intent_confidence", {})
reference_synthesis = report.get("reference_synthesis", {})
output_risk = report.get("output_risk", {})
artifact_design = report.get("artifact_design", {})
prompt_quality = report.get("prompt_quality", {})
benchmark = report.get("benchmark", {})
synthesis = reference_synthesis.get("synthesis", {}) if isinstance(reference_synthesis, dict) else {}
pattern_gate = synthesis.get("pattern_gate", {}) if isinstance(synthesis, dict) else {}
accepted_patterns = pattern_gate.get("accepted", []) if isinstance(pattern_gate, dict) else []
conflicts = synthesis.get("conflicts", []) if isinstance(synthesis, dict) else []
checks = [
{
"label": "Intent clarity",
"status": "ready" if intent_confidence.get("gate_passed") else "needs review",
"detail": f"{intent_confidence.get('score', 0)}/100 intent confidence.",
},
{
"label": "Benchmark coverage",
"status": "ready" if len(benchmark.get("repositories", [])) >= 2 else "needs evidence",
"detail": f"{len(benchmark.get('repositories', []))} GitHub benchmark repositories attached.",
},
{
"label": "Pattern gate",
"status": "ready" if accepted_patterns else "needs review",
"detail": pattern_gate.get("summary", "No pattern gate summary attached."),
},
{
"label": "Conflict handling",
"status": "ready" if not conflicts else "decision needed",
"detail": "No material conflicts detected." if not conflicts else conflicts[0].get("summary", "Conflict detected."),
},
{
"label": "Output risk profile",
"status": "ready" if output_risk.get("risk_families") else "needs review",
"detail": f"{len(output_risk.get('risk_families', []))} output risk families attached.",
},
{
"label": "Artifact design profile",
"status": "ready" if artifact_design.get("primary_artifact") else "needs review",
"detail": artifact_design.get("primary_artifact", {}).get("direction", "No artifact design profile attached."),
},
{
"label": "Prompt quality profile",
"status": "ready" if prompt_quality.get("quality_matrix") else "needs review",
"detail": f"{prompt_quality.get('overall_quality_score', 0)}/100 prompt-facing quality score.",
},
]
ready_count = sum(1 for item in checks if item["status"] == "ready")
return {
"score": int(ready_count / len(checks) * 100),
"checks": checks,
"reviewer_note": "Use this section to decide whether the package is ready to deepen or should stay in discovery.",
}
+2 -2
View File
@@ -172,6 +172,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
@@ -186,8 +187,7 @@
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
"scripts/trust_check.py",
"scripts/upgrade_check.py",
"scripts/validate_skill.py"
"scripts/upgrade_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
+1
View File
@@ -84,6 +84,7 @@
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
"scripts/run_description_optimization_suite.py",
"scripts/run_eval_suite.py",
+3 -2
View File
@@ -38,15 +38,16 @@ def main() -> None:
payload = json.loads(proc.stdout)
assert payload["ok"], payload
assert payload["summary"]["decision"] == "watch-maintainability-hotspots", payload["summary"]
assert payload["summary"]["hotspot_count"] == 2, payload["summary"]
assert payload["summary"]["hotspot_count"] == 1, payload["summary"]
assert payload["summary"]["blocker_count"] == 0, payload["summary"]
assert 30 <= payload["summary"]["command_handler_count"] < 50, payload["summary"]
assert payload["summary"]["largest_file_lines"] >= 900, payload["summary"]
assert payload["largest_files"][0]["path"] == "scripts/yao.py", payload["largest_files"][0]
assert payload["largest_files"][0]["severity"] == "warn", payload["largest_files"][0]
hotspot_paths = {item["path"] for item in payload["hotspots"]}
assert {"scripts/yao.py", "scripts/render_review_viewer.py"} <= hotspot_paths, hotspot_paths
assert {"scripts/yao.py"} <= hotspot_paths, hotspot_paths
assert "scripts/render_review_studio.py" not in hotspot_paths, hotspot_paths
assert "scripts/render_review_viewer.py" not in hotspot_paths, hotspot_paths
assert output_json.exists(), output_json
markdown = output_md.read_text(encoding="utf-8")
assert "# Architecture Maintainability" in markdown, markdown
+2 -2
View File
@@ -319,7 +319,7 @@ def main() -> None:
assert python_compat_gate["evidence"] == "reports/python_compatibility.json", python_compat_gate
architecture_gate = next(item for item in payload["gates"] if item["key"] == "architecture-maintainability")
assert architecture_gate["status"] == "warn", architecture_gate
assert "2 hotspots" in architecture_gate["detail"], architecture_gate
assert "1 hotspot" in architecture_gate["detail"], architecture_gate
assert "0 blockers" in architecture_gate["detail"], architecture_gate
assert "CLI handlers" in architecture_gate["detail"], architecture_gate
assert architecture_gate["evidence"] == "reports/architecture_maintainability.json", architecture_gate
@@ -392,7 +392,7 @@ def main() -> None:
assert full_payload["evidence_paths"]["runtime_permissions"] == "reports/runtime_permission_probes.md", full_payload["evidence_paths"]
assert full_payload["data"]["python_compatibility"]["summary"]["target_python"] == "3.11", full_payload["data"]["python_compatibility"]
assert full_payload["data"]["python_compatibility"]["summary"]["issue_count"] == 0, full_payload["data"]["python_compatibility"]
assert full_payload["data"]["architecture_maintainability"]["summary"]["hotspot_count"] == 2, full_payload["data"]["architecture_maintainability"]
assert full_payload["data"]["architecture_maintainability"]["summary"]["hotspot_count"] == 1, full_payload["data"]["architecture_maintainability"]
assert full_payload["data"]["architecture_maintainability"]["summary"]["blocker_count"] == 0, full_payload["data"]["architecture_maintainability"]
action_keys = {item["gate_key"] for item in full_payload["review_actions"]}
assert action_keys == {"output-lab", "architecture-maintainability", "review-waivers", "world-class-evidence"}, full_payload["review_actions"]
+1 -1
View File
@@ -217,7 +217,7 @@ def main() -> None:
"2026-06-14",
)
assert architecture_result["ok"], architecture_result
assert architecture_result["payload"]["summary"]["hotspot_count"] == 2, architecture_result
assert architecture_result["payload"]["summary"]["hotspot_count"] == 1, architecture_result
assert architecture_result["payload"]["summary"]["blocker_count"] == 0, architecture_result
assert 30 <= architecture_result["payload"]["summary"]["command_handler_count"] < 50, architecture_result