diff --git a/registry/index.json b/registry/index.json
index cd031c05..ff203d48 100644
--- a/registry/index.json
+++ b/registry/index.json
@@ -16,7 +16,7 @@
"vscode"
],
"package_metadata": "registry/packages/yao-meta-skill.json",
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
}
]
}
diff --git a/registry/packages/yao-meta-skill.json b/registry/packages/yao-meta-skill.json
index e50d5a0a..44be76e1 100644
--- a/registry/packages/yao-meta-skill.json
+++ b/registry/packages/yao-meta-skill.json
@@ -16,8 +16,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20",
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
"compatibility": {
"openai": "pass",
@@ -48,7 +48,7 @@
},
"distribution": {
"archive_verified": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
diff --git a/reports/adoption_drift_report.json b/reports/adoption_drift_report.json
index 5d2367ca..70cca4a0 100644
--- a/reports/adoption_drift_report.json
+++ b/reports/adoption_drift_report.json
@@ -1,7 +1,7 @@
{
"ok": true,
"schema_version": "2.0",
- "generated_at": "2026-06-13T21:28:44Z",
+ "generated_at": "2026-06-13T21:39:40Z",
"skill_dir": ".",
"privacy_contract": {
"storage": "local-first",
diff --git a/reports/architecture_maintainability.json b/reports/architecture_maintainability.json
index a79b471d..aa3c7574 100644
--- a/reports/architecture_maintainability.json
+++ b/reports/architecture_maintainability.json
@@ -4,15 +4,15 @@
"generated_at": "2026-06-14",
"skill_dir": ".",
"summary": {
- "python_file_count": 145,
- "script_file_count": 89,
+ "python_file_count": 146,
+ "script_file_count": 90,
"test_file_count": 56,
- "internal_module_count": 18,
+ "internal_module_count": 19,
"cli_script_count": 72,
"command_handler_count": 33,
"warn_line_threshold": 900,
"block_line_threshold": 1500,
- "largest_file_lines": 895,
+ "largest_file_lines": 899,
"hotspot_count": 0,
"blocker_count": 0,
"decision": "pass"
@@ -20,14 +20,14 @@
"largest_files": [
{
"path": "scripts/render_review_studio.py",
- "lines": 895,
+ "lines": 899,
"kind": "cli-script",
"severity": "pass",
"recommendation": "Move data loading and large section renderers into focused review_studio_* modules."
},
{
"path": "tests/verify_yao_cli.py",
- "lines": 845,
+ "lines": 848,
"kind": "test",
"severity": "pass",
"recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands."
diff --git a/reports/architecture_maintainability.md b/reports/architecture_maintainability.md
index a745a7c4..558b3e36 100644
--- a/reports/architecture_maintainability.md
+++ b/reports/architecture_maintainability.md
@@ -5,13 +5,13 @@ Generated at: `2026-06-14`
## Summary
- decision: `pass`
-- python files: `145`
-- scripts: `89`
+- python files: `146`
+- scripts: `90`
- tests: `56`
-- internal modules: `18`
+- internal modules: `19`
- CLI scripts: `72`
- Yao CLI command handlers: `33`
-- largest file lines: `895`
+- largest file lines: `899`
- hotspots: `0`
- blockers: `0`
@@ -25,8 +25,8 @@ No file-size hotspots found.
| File | Lines | Kind | Severity |
| --- | ---: | --- | --- |
-| `scripts/render_review_studio.py` | `895` | `cli-script` | `pass` |
-| `tests/verify_yao_cli.py` | `845` | `test` | `pass` |
+| `scripts/render_review_studio.py` | `899` | `cli-script` | `pass` |
+| `tests/verify_yao_cli.py` | `848` | `test` | `pass` |
| `scripts/yao.py` | `839` | `cli-script` | `pass` |
| `scripts/skill_report_model.py` | `782` | `internal-module` | `pass` |
| `scripts/compile_skill.py` | `734` | `cli-script` | `pass` |
diff --git a/reports/benchmark_reproducibility.json b/reports/benchmark_reproducibility.json
index 0df08e12..bbbed449 100644
--- a/reports/benchmark_reproducibility.json
+++ b/reports/benchmark_reproducibility.json
@@ -3,13 +3,12 @@
"ok": true,
"generated_at": "2026-06-14",
"skill_dir": ".",
- "commit": "088904f519e04981f30c5c8c225de90a4aee2682",
+ "commit": "810885d70e6ed0fa6b19cd5a0edf971057215f9d",
"git_status": {
"available": true,
"dirty": true,
- "changed_file_count": 31,
+ "changed_file_count": 42,
"sample": [
- " M evidence/world_class/README.md",
" M registry/index.json",
" M registry/packages/yao-meta-skill.json",
" M reports/adoption_drift_report.json",
@@ -17,10 +16,11 @@
" M reports/architecture_maintainability.md",
" M reports/benchmark_reproducibility.json",
" M reports/benchmark_reproducibility.md",
+ " M reports/compiled_targets.json",
" M reports/context_budget.json",
+ " M reports/install_simulation.json",
" M reports/output_execution_runs.json",
- " M reports/output_execution_runs.md",
- " M reports/package_verification.json"
+ " M reports/output_execution_runs.md"
]
},
"summary": {
@@ -42,7 +42,7 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
- "changed_file_count": 31
+ "changed_file_count": 42
},
"methodology": {
"path": "reports/benchmark_methodology.md",
@@ -115,8 +115,8 @@
"label": "output_execution",
"path": "reports/output_execution_runs.json",
"exists": true,
- "bytes": 7966,
- "sha256": "9bc795936ec9610a8a6f81e692c8839b9dcac917c9839e1b99c5460ba8919061"
+ "bytes": 7967,
+ "sha256": "c85fa48112afba2e022d3cf25f57e3062299b273bfa378777aaef11b1c84dc5d"
},
{
"label": "blind_review",
@@ -129,8 +129,8 @@
"label": "review_adjudication",
"path": "reports/output_review_adjudication.json",
"exists": true,
- "bytes": 2431,
- "sha256": "ddd9af90d42e2858d629ebe3f1d7505a675f7d95517fcd9a965c80102a63158d"
+ "bytes": 9125,
+ "sha256": "5765254c430947c7e2b05883831d7db0b886d607b59f9a8a2602dcfa925f400b"
},
{
"label": "trigger_scorecard",
@@ -150,43 +150,43 @@
"label": "trust_report",
"path": "reports/security_trust_report.json",
"exists": true,
- "bytes": 91959,
- "sha256": "29451ca6127d5d049f04978928110e97935e100a0e12f125ef7b4d4aae129271"
+ "bytes": 92549,
+ "sha256": "408b3a7c09218f486a29059a28a0aec12016299453ab256d61874e986389cf09"
},
{
"label": "python_compatibility",
"path": "reports/python_compatibility.json",
"exists": true,
- "bytes": 19297,
- "sha256": "f65de3392609ef1e9e2b9dde7991ba0d84b3803b128bd0a1277b2453eb05b41c"
+ "bytes": 19427,
+ "sha256": "809d07d66de33719b160b1a20d3bc86c546b3a69051cc662c840e5d16e10f5b8"
},
{
"label": "registry_audit",
"path": "reports/registry_audit.json",
"exists": true,
"bytes": 3183,
- "sha256": "6f2179a1a51a05a1e4455ed113fa2499e62d643a046aab2735fb516d6f2fad35"
+ "sha256": "2a086d4698852ccd6f99e954f5aebd0fea6e4aad1b5428d5c21fee3a222a56bc"
},
{
"label": "package_verification",
"path": "reports/package_verification.json",
"exists": true,
"bytes": 19325,
- "sha256": "69864577d09542dc4b20c4976516c7a6f20bdb95d76dd38e8fcc4f88691bceba"
+ "sha256": "9a48d94965ccaffd9021c0d58f6cdb1542dd0e3472adcc5e8495d3535b75c1a5"
},
{
"label": "install_simulation",
"path": "reports/install_simulation.json",
"exists": true,
"bytes": 8557,
- "sha256": "11985a19c3bcbe02fbe0146f57eb11992b3f298e99bad77149f0039787a96f18"
+ "sha256": "5e6e501706588c0eb431d71af38c4789c40991acca4531f667acb6a0610a70c3"
},
{
"label": "skill_os2_audit",
"path": "reports/skill_os2_audit.json",
"exists": true,
"bytes": 13946,
- "sha256": "0fcd7f82c65f1fd85323919e573e3b4910738684440acaf29ed2c6ebe26bd611"
+ "sha256": "ed1be043898a5550be37c93b3d8723dbaf2d537af3005a8a6476ec6d0d266318"
},
{
"label": "world_class_evidence_plan",
diff --git a/reports/benchmark_reproducibility.md b/reports/benchmark_reproducibility.md
index 4cb7041b..840bbe39 100644
--- a/reports/benchmark_reproducibility.md
+++ b/reports/benchmark_reproducibility.md
@@ -1,7 +1,7 @@
# Benchmark Reproducibility
Generated at: `2026-06-14`
-Commit: `088904f519e04981f30c5c8c225de90a4aee2682`
+Commit: `810885d70e6ed0fa6b19cd5a0edf971057215f9d`
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: `31`
+- changed files at generation: `42`
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 | `9bc795936ec9` |
+| output_execution | `reports/output_execution_runs.json` | present | `c85fa48112af` |
| blind_review | `reports/output_blind_review_pack.json` | present | `bbe2db8ec277` |
-| review_adjudication | `reports/output_review_adjudication.json` | present | `ddd9af90d42e` |
+| review_adjudication | `reports/output_review_adjudication.json` | present | `5765254c4309` |
| trigger_scorecard | `reports/route_scorecard.json` | present | `c164e83e36d0` |
| runtime_conformance | `reports/conformance_matrix.json` | present | `8251329e663d` |
-| trust_report | `reports/security_trust_report.json` | present | `29451ca6127d` |
-| python_compatibility | `reports/python_compatibility.json` | present | `f65de3392609` |
-| registry_audit | `reports/registry_audit.json` | present | `6f2179a1a51a` |
-| package_verification | `reports/package_verification.json` | present | `69864577d095` |
-| install_simulation | `reports/install_simulation.json` | present | `11985a19c3bc` |
-| skill_os2_audit | `reports/skill_os2_audit.json` | present | `0fcd7f82c65f` |
+| trust_report | `reports/security_trust_report.json` | present | `408b3a7c0921` |
+| python_compatibility | `reports/python_compatibility.json` | present | `809d07d66de3` |
+| registry_audit | `reports/registry_audit.json` | present | `2a086d469885` |
+| package_verification | `reports/package_verification.json` | present | `9a48d94965cc` |
+| install_simulation | `reports/install_simulation.json` | present | `5e6e50170658` |
+| skill_os2_audit | `reports/skill_os2_audit.json` | present | `ed1be043898a` |
| 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 | `6eae947a6e2f` |
diff --git a/reports/compiled_targets.json b/reports/compiled_targets.json
index bbc29e28..5d67f6ff 100644
--- a/reports/compiled_targets.json
+++ b/reports/compiled_targets.json
@@ -208,6 +208,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -223,8 +224,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -1049,6 +1049,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -1064,8 +1065,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -1890,6 +1890,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -1905,8 +1906,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -2715,6 +2715,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -2730,8 +2731,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -3540,6 +3540,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -3555,8 +3556,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
diff --git a/reports/context_budget.json b/reports/context_budget.json
index 8f37cc08..6c68778e 100644
--- a/reports/context_budget.json
+++ b/reports/context_budget.json
@@ -6,10 +6,10 @@
"context_budget_tier": "production",
"context_budget_limit": 1000,
"skill_body_tokens": 751,
- "other_text_tokens": 1096197,
+ "other_text_tokens": 1105224,
"estimated_initial_load_tokens": 944,
- "estimated_total_text_tokens": 1096948,
- "relevant_file_count": 477,
+ "estimated_total_text_tokens": 1105975,
+ "relevant_file_count": 479,
"unused_resource_dirs": [],
"quality_signal_points": 130,
"quality_density": 137.7
diff --git a/reports/install_simulation.json b/reports/install_simulation.json
index 30cde14b..67ca2c32 100644
--- a/reports/install_simulation.json
+++ b/reports/install_simulation.json
@@ -8,7 +8,7 @@
"installed_skill_dir": "[temporary-install-root]/yao-meta-skill",
"summary": {
"archive_present": true,
- "archive_entry_count": 557,
+ "archive_entry_count": 558,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
diff --git a/reports/output_execution_runs.json b/reports/output_execution_runs.json
index 7c0f15d7..d883d398 100644
--- a/reports/output_execution_runs.json
+++ b/reports/output_execution_runs.json
@@ -34,7 +34,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 27.65,
+ "duration_ms": 29.36,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -62,7 +62,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 27.96,
+ "duration_ms": 28.61,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -85,7 +85,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 27.98,
+ "duration_ms": 28.44,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -113,7 +113,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 28.3,
+ "duration_ms": 28.46,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -136,7 +136,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 29.47,
+ "duration_ms": 28.04,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -164,7 +164,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 28.72,
+ "duration_ms": 28.85,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -187,7 +187,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 29.11,
+ "duration_ms": 28.63,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -214,7 +214,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 28.16,
+ "duration_ms": 28.65,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -237,7 +237,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 27.95,
+ "duration_ms": 28.69,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -266,7 +266,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 28.03,
+ "duration_ms": 29.97,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
diff --git a/reports/output_execution_runs.md b/reports/output_execution_runs.md
index 8e551415..c0d7adf2 100644
--- a/reports/output_execution_runs.md
+++ b/reports/output_execution_runs.md
@@ -23,16 +23,16 @@ Command runner evidence is present. This proves the eval harness executed an ext
| Case | Variant | Mode | Model | Duration ms | Tokens | Score | Status |
| --- | --- | --- | --- | ---: | ---: | ---: | --- |
-| skill-package-contract | baseline | command | local-output-eval-runner | 27.65 | 33 | 0.0 | pass |
-| skill-package-contract | with_skill | command | local-output-eval-runner | 27.96 | 73 | 100.0 | pass |
-| output-eval-expectation | baseline | command | local-output-eval-runner | 27.98 | 36 | 0.0 | pass |
-| output-eval-expectation | with_skill | command | local-output-eval-runner | 28.3 | 80 | 100.0 | pass |
-| ir-before-packaging | baseline | command | local-output-eval-runner | 29.47 | 33 | 0.0 | pass |
-| ir-before-packaging | with_skill | command | local-output-eval-runner | 28.72 | 80 | 100.0 | pass |
-| near-neighbor-boundary | baseline | command | local-output-eval-runner | 29.11 | 36 | 0.0 | pass |
-| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 28.16 | 65 | 100.0 | pass |
-| file-backed-governed-package | baseline | command | local-output-eval-runner | 27.95 | 37 | 0.0 | pass |
-| file-backed-governed-package | with_skill | command | local-output-eval-runner | 28.03 | 98 | 100.0 | pass |
+| skill-package-contract | baseline | command | local-output-eval-runner | 29.36 | 33 | 0.0 | pass |
+| skill-package-contract | with_skill | command | local-output-eval-runner | 28.61 | 73 | 100.0 | pass |
+| output-eval-expectation | baseline | command | local-output-eval-runner | 28.44 | 36 | 0.0 | pass |
+| output-eval-expectation | with_skill | command | local-output-eval-runner | 28.46 | 80 | 100.0 | pass |
+| ir-before-packaging | baseline | command | local-output-eval-runner | 28.04 | 33 | 0.0 | pass |
+| ir-before-packaging | with_skill | command | local-output-eval-runner | 28.85 | 80 | 100.0 | pass |
+| near-neighbor-boundary | baseline | command | local-output-eval-runner | 28.63 | 36 | 0.0 | pass |
+| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 28.65 | 65 | 100.0 | pass |
+| file-backed-governed-package | baseline | command | local-output-eval-runner | 28.69 | 37 | 0.0 | pass |
+| file-backed-governed-package | with_skill | command | local-output-eval-runner | 29.97 | 98 | 100.0 | pass |
## Next Fixes
diff --git a/reports/output_review_adjudication.json b/reports/output_review_adjudication.json
index 178315f9..f484553c 100644
--- a/reports/output_review_adjudication.json
+++ b/reports/output_review_adjudication.json
@@ -12,7 +12,11 @@
"pending_answer_hidden_count": 5,
"agreement_rate": null,
"needs_review": true,
- "failure_count": 0
+ "failure_count": 0,
+ "reviewer_checklist_count": 5,
+ "reviewer_checklist_pending_count": 5,
+ "reviewer_checklist_invalid_count": 0,
+ "reviewer_checklist_ready_count": 0
},
"reviewer": "",
"reviewed_at": "",
@@ -76,5 +80,137 @@
"prompt": "Turn the attached release brief source into a governed skill package."
}
],
+ "reviewer_checklist": [
+ {
+ "case_id": "skill-package-contract",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "Turn this repeated workflow into a reusable team skill package.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ },
+ {
+ "case_id": "output-eval-expectation",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "Upgrade this production skill so we know whether the generated output is better than baseline.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ },
+ {
+ "case_id": "ir-before-packaging",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "Package this skill for OpenAI, Claude, Agent Skills, and generic targets.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ },
+ {
+ "case_id": "near-neighbor-boundary",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "I only need a one-off summary of these notes, not a reusable process.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ },
+ {
+ "case_id": "file-backed-governed-package",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "Turn the attached release brief source into a governed skill package.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ }
+ ],
"failures": []
}
diff --git a/reports/output_review_adjudication.md b/reports/output_review_adjudication.md
index 48d85c16..2fc622ce 100644
--- a/reports/output_review_adjudication.md
+++ b/reports/output_review_adjudication.md
@@ -9,6 +9,7 @@ This report adjudicates reviewer choices from the blind A/B output review pack a
- Invalid decisions: `0`
- Answer keys revealed: `0`
- Pending/invalid answers hidden: `5`
+- Reviewer checklist: `0` ready / `5` total
No reviewer decisions recorded yet.
@@ -25,6 +26,146 @@ Expected winners stay hidden until a valid reviewer decision is recorded.
| near-neighbor-boundary | pending | hidden | pending | | |
| file-backed-governed-package | pending | hidden | pending | | |
+## Reviewer Checklist
+
+| Case | Readiness | Answer key | Decision file |
+| --- | --- | --- | --- |
+| `skill-package-contract` | `awaiting-decision` | `hidden` | `reports/output_review_decisions.json` |
+| `output-eval-expectation` | `awaiting-decision` | `hidden` | `reports/output_review_decisions.json` |
+| `ir-before-packaging` | `awaiting-decision` | `hidden` | `reports/output_review_decisions.json` |
+| `near-neighbor-boundary` | `awaiting-decision` | `hidden` | `reports/output_review_decisions.json` |
+| `file-backed-governed-package` | `awaiting-decision` | `hidden` | `reports/output_review_decisions.json` |
+
+### skill-package-contract
+
+- readiness: `awaiting-decision`
+- blocking reason: Reviewer has not selected A or B yet; answer key remains hidden.
+- answer key visible: `false`
+- blind pack: `reports/output_blind_review_pack.json`
+- decisions: `reports/output_review_decisions.json`
+
+#### Commands
+
+- write_template: `python3 scripts/adjudicate_output_review.py --write-template`
+- adjudicate: `python3 scripts/yao.py output-review`
+- refresh_review_studio: `python3 scripts/yao.py review-studio .`
+
+#### Required Fields
+
+- winner_variant: A or B after reading only the blind review pack.
+- confidence: Optional number from 0 to 1.
+- reason: Short rationale; do not reveal baseline or with-skill labels before adjudication.
+
+#### Privacy Contract
+
+- Do not paste raw private user data into the decision reason.
+- Do not open the answer key before reviewer choices are recorded.
+- Leave winner_variant blank when the reviewer is not ready to decide.
+
+### output-eval-expectation
+
+- readiness: `awaiting-decision`
+- blocking reason: Reviewer has not selected A or B yet; answer key remains hidden.
+- answer key visible: `false`
+- blind pack: `reports/output_blind_review_pack.json`
+- decisions: `reports/output_review_decisions.json`
+
+#### Commands
+
+- write_template: `python3 scripts/adjudicate_output_review.py --write-template`
+- adjudicate: `python3 scripts/yao.py output-review`
+- refresh_review_studio: `python3 scripts/yao.py review-studio .`
+
+#### Required Fields
+
+- winner_variant: A or B after reading only the blind review pack.
+- confidence: Optional number from 0 to 1.
+- reason: Short rationale; do not reveal baseline or with-skill labels before adjudication.
+
+#### Privacy Contract
+
+- Do not paste raw private user data into the decision reason.
+- Do not open the answer key before reviewer choices are recorded.
+- Leave winner_variant blank when the reviewer is not ready to decide.
+
+### ir-before-packaging
+
+- readiness: `awaiting-decision`
+- blocking reason: Reviewer has not selected A or B yet; answer key remains hidden.
+- answer key visible: `false`
+- blind pack: `reports/output_blind_review_pack.json`
+- decisions: `reports/output_review_decisions.json`
+
+#### Commands
+
+- write_template: `python3 scripts/adjudicate_output_review.py --write-template`
+- adjudicate: `python3 scripts/yao.py output-review`
+- refresh_review_studio: `python3 scripts/yao.py review-studio .`
+
+#### Required Fields
+
+- winner_variant: A or B after reading only the blind review pack.
+- confidence: Optional number from 0 to 1.
+- reason: Short rationale; do not reveal baseline or with-skill labels before adjudication.
+
+#### Privacy Contract
+
+- Do not paste raw private user data into the decision reason.
+- Do not open the answer key before reviewer choices are recorded.
+- Leave winner_variant blank when the reviewer is not ready to decide.
+
+### near-neighbor-boundary
+
+- readiness: `awaiting-decision`
+- blocking reason: Reviewer has not selected A or B yet; answer key remains hidden.
+- answer key visible: `false`
+- blind pack: `reports/output_blind_review_pack.json`
+- decisions: `reports/output_review_decisions.json`
+
+#### Commands
+
+- write_template: `python3 scripts/adjudicate_output_review.py --write-template`
+- adjudicate: `python3 scripts/yao.py output-review`
+- refresh_review_studio: `python3 scripts/yao.py review-studio .`
+
+#### Required Fields
+
+- winner_variant: A or B after reading only the blind review pack.
+- confidence: Optional number from 0 to 1.
+- reason: Short rationale; do not reveal baseline or with-skill labels before adjudication.
+
+#### Privacy Contract
+
+- Do not paste raw private user data into the decision reason.
+- Do not open the answer key before reviewer choices are recorded.
+- Leave winner_variant blank when the reviewer is not ready to decide.
+
+### file-backed-governed-package
+
+- readiness: `awaiting-decision`
+- blocking reason: Reviewer has not selected A or B yet; answer key remains hidden.
+- answer key visible: `false`
+- blind pack: `reports/output_blind_review_pack.json`
+- decisions: `reports/output_review_decisions.json`
+
+#### Commands
+
+- write_template: `python3 scripts/adjudicate_output_review.py --write-template`
+- adjudicate: `python3 scripts/yao.py output-review`
+- refresh_review_studio: `python3 scripts/yao.py review-studio .`
+
+#### Required Fields
+
+- winner_variant: A or B after reading only the blind review pack.
+- confidence: Optional number from 0 to 1.
+- reason: Short rationale; do not reveal baseline or with-skill labels before adjudication.
+
+#### Privacy Contract
+
+- Do not paste raw private user data into the decision reason.
+- Do not open the answer key before reviewer choices are recorded.
+- Leave winner_variant blank when the reviewer is not ready to decide.
+
## Next Fixes
- Keep the blind review pack separate from the answer key until decisions are recorded.
diff --git a/reports/package_verification.json b/reports/package_verification.json
index 31298d3d..48e9d396 100644
--- a/reports/package_verification.json
+++ b/reports/package_verification.json
@@ -8,8 +8,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
- "archive_entry_count": 557,
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
+ "archive_entry_count": 558,
"failure_count": 0,
"warning_count": 0
},
diff --git a/reports/package_verification.md b/reports/package_verification.md
index a0fbe74a..f4d51886 100644
--- a/reports/package_verification.md
+++ b/reports/package_verification.md
@@ -4,7 +4,7 @@
- Package directory: `dist`
- Targets: `4 / 4` adapters present
- Archive present: `True`
-- Archive SHA256: `2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2`
+- Archive SHA256: `5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a`
- Failures: `0`
- Warnings: `0`
diff --git a/reports/python_compatibility.json b/reports/python_compatibility.json
index e235bf3e..b1c9b327 100644
--- a/reports/python_compatibility.json
+++ b/reports/python_compatibility.json
@@ -5,7 +5,7 @@
"root": ".",
"summary": {
"target_python": "3.11",
- "file_count": 148,
+ "file_count": 149,
"issue_count": 0,
"syntax_error_count": 0,
"fstring_311_violation_count": 0,
@@ -418,6 +418,12 @@
"issue_count": 0,
"issues": []
},
+ {
+ "path": "scripts/review_studio_output_review.py",
+ "ok": true,
+ "issue_count": 0,
+ "issues": []
+ },
{
"path": "scripts/review_studio_world_class.py",
"ok": true,
diff --git a/reports/python_compatibility.md b/reports/python_compatibility.md
index 3df4d50b..38fb4b1a 100644
--- a/reports/python_compatibility.md
+++ b/reports/python_compatibility.md
@@ -6,7 +6,7 @@ Generated at: `2026-06-14`
- decision: `pass`
- target python: `3.11`
-- files scanned: `148`
+- files scanned: `149`
- issues: `0`
- syntax errors: `0`
- f-string 3.11 violations: `0`
diff --git a/reports/registry_audit.json b/reports/registry_audit.json
index c2885a32..59a8b631 100644
--- a/reports/registry_audit.json
+++ b/reports/registry_audit.json
@@ -21,8 +21,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20",
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
"compatibility": {
"openai": "pass",
@@ -53,7 +53,7 @@
},
"distribution": {
"archive_verified": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
"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": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
}
]
},
diff --git a/reports/registry_audit.md b/reports/registry_audit.md
index 39a27c8a..cc44979e 100644
--- a/reports/registry_audit.md
+++ b/reports/registry_audit.md
@@ -6,8 +6,8 @@
- Maturity: `governed`
- Owner: `Yao Team`
- License: `MIT`
-- Package SHA256: `f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20`
-- Archive SHA256: `2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2`
+- Package SHA256: `60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c`
+- Archive SHA256: `5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a`
- Install simulated: `True`
## Compatibility
diff --git a/reports/review-studio.html b/reports/review-studio.html
index 26667a79..5f8eb2bd 100644
--- a/reports/review-studio.html
+++ b/reports/review-studio.html
@@ -220,6 +220,77 @@
margin: 0;
padding-left: 18px;
}
+ .output-review-grid {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr);
+ gap: 16px;
+ margin-top: 16px;
+ }
+ .output-review-card {
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ padding: 18px;
+ background: #fff;
+ display: grid;
+ gap: 12px;
+ min-width: 0;
+ }
+ .output-review-card.awaiting-decision,
+ .output-review-card.fix-decision { border-left: 4px solid var(--warn); }
+ .output-review-card.adjudicated { border-left: 4px solid var(--pass); }
+ .output-review-card span,
+ .output-review-card p,
+ .output-review-card dd,
+ .output-review-card li {
+ color: var(--muted);
+ font-size: 14px;
+ overflow-wrap: anywhere;
+ }
+ .output-review-card dl {
+ display: grid;
+ grid-template-columns: 86px minmax(0, 1fr);
+ gap: 6px 10px;
+ margin: 0;
+ }
+ .output-review-card dt { color: var(--ink); font-size: 14px; }
+ .output-review-card dd { margin: 0; min-width: 0; }
+ .output-review-steps {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 12px;
+ border-top: 1px solid var(--line);
+ padding-top: 12px;
+ }
+ .output-review-steps h4 {
+ margin: 0 0 6px;
+ color: var(--ink);
+ font-size: 14px;
+ font-weight: 500;
+ }
+ .output-review-steps ul {
+ margin: 0;
+ padding-left: 18px;
+ }
+ .output-review-commands,
+ .output-review-fields {
+ list-style: none;
+ padding: 0;
+ display: grid;
+ gap: 8px;
+ }
+ .output-review-commands li,
+ .output-review-fields li {
+ display: grid;
+ gap: 2px;
+ min-width: 0;
+ padding: 8px 0 0;
+ border-top: 1px solid var(--line);
+ }
+ .output-review-commands code {
+ overflow-wrap: anywhere;
+ white-space: normal;
+ display: block;
+ }
.world-intake-grid {
display: grid;
grid-template-columns: minmax(0, 1fr);
@@ -340,7 +411,7 @@
font-size: 13px;
}
@media (max-width: 980px) {
- .metrics, .gates, .twocol, .actions-grid, .annotations-grid, .world-evidence-grid, .world-evidence-columns, .world-intake-grid, .world-intake-steps, .kv-grid { grid-template-columns: 1fr; }
+ .metrics, .gates, .twocol, .actions-grid, .annotations-grid, .output-review-grid, .output-review-steps, .world-evidence-grid, .world-evidence-columns, .world-intake-grid, .world-intake-steps, .kv-grid { grid-template-columns: 1fr; }
main { padding: 32px 18px 60px; }
nav { justify-content: flex-start; overflow-x: auto; flex-wrap: nowrap; }
nav a { flex: 0 0 auto; }
@@ -363,12 +434,12 @@
核心指标
- Skill IR2.0.05 targets in platform-neutral contract
Compiler5/5target contracts compiled from Skill IR
Output Delta100.05 cases; 1 file-backed
Exec Runs10command 10; model 0; recorded 0
Blind A/B5review pairs hide baseline vs with-skill labels
Review A/B0/5adjudication decisions; pending 5
Blueprint20/202.0 coverage; evidence pending 4
Runtime5/5target conformance pass rate
Perm Probe4/40 native enforcement targets
Trust089 scripts scanned; secrets found
Py Compat0148 files scanned for Python 3.11
Arch Debt0895 largest lines; 33 CLI handlers
Atlas512 scanned skills; route collisions
Driftlow1 metadata events; 0 missed triggers
Waivers00 gates covered; human risk decisions
Intake4/40 valid submissions; 0 invalid
Claim Guard068 public surfaces scanned
Notes0/00 open blocker annotations
Registry1.1.05 targets; MIT license
Archivepass557 zip entries; package verification
Installpass4 adapters; 12 permissions enforced; 0 permission failures
Upgrademinordeclared minor; 0 breaking changes
+ Skill IR2.0.05 targets in platform-neutral contract
Compiler5/5target contracts compiled from Skill IR
Output Delta100.05 cases; 1 file-backed
Exec Runs10command 10; model 0; recorded 0
Blind A/B5review pairs hide baseline vs with-skill labels
Review A/B0/5adjudication decisions; pending 5
Blueprint20/202.0 coverage; evidence pending 4
Runtime5/5target conformance pass rate
Perm Probe4/40 native enforcement targets
Trust090 scripts scanned; secrets found
Py Compat0149 files scanned for Python 3.11
Arch Debt0899 largest lines; 33 CLI handlers
Atlas512 scanned skills; route collisions
Driftlow1 metadata events; 0 missed triggers
Waivers00 gates covered; human risk decisions
Intake4/40 valid submissions; 0 invalid
Claim Guard068 public surfaces scanned
Notes0/00 open blocker annotations
Registry1.1.05 targets; MIT license
Archivepass558 zip entries; package verification
Installpass4 adapters; 12 permissions enforced; 0 permission failures
Upgrademinordeclared minor; 0 breaking changes
审查闸门
- 通过
意图画布
intent confidence 100/100; Intent is clear enough to package the first routeable version.
通过
触发实验
13 trigger cases; 0 misroutes; 0 ambiguous
关注
输出实验
5/5 cases; with-skill 100.0; baseline 0.0; file-backed 1; near-neighbor 1; blind A/B 5; exec 10; command 10; model 0; recorded 0; reviewed 0/5; review pending 5
通过
上下文
initial load 944/1000; quality density 137.7
通过
运行矩阵
5 / 5 targets pass
通过
信任报告
0 secrets; 89 scripts; 3 network-capable scripts; 0 help smoke failures
通过
Python 兼容
Python 3.11; 148 files; 0 compatibility issues; 0 syntax; 0 f-string 3.11 hazards
通过
架构维护
145 Python files; 0 hotspots; 0 blockers; largest 895 lines; 33 CLI handlers
通过
权限批准
3/3 permissions approved; gaps 0; required file_write, network, subprocess
通过
权限探针
4/4 targets probed; native 0; metadata fallback 4; residual risks 4
通过
组合治理
12 skills, 1 actionable; 0 actionable route collisions; 0 actionable owner gaps; 0 actionable stale; 0 actionable drift; 24 scoped non-actionable issues
通过
运营回路
1 metadata events; adoption 0; missed 0; bad-output 0; risk low
关注
人工批准
0 active waivers; 1 warning gates still need reviewer decision
关注
世界证据
4 pending world-class evidence entries; 1 human pending; 3 external pending; overclaim guard true
通过
注册审计
yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures
通过
发布路线
0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended
+ 通过
意图画布
intent confidence 100/100; Intent is clear enough to package the first routeable version.
通过
触发实验
13 trigger cases; 0 misroutes; 0 ambiguous
关注
输出实验
5/5 cases; with-skill 100.0; baseline 0.0; file-backed 1; near-neighbor 1; blind A/B 5; exec 10; command 10; model 0; recorded 0; reviewed 0/5; review pending 5
通过
上下文
initial load 944/1000; quality density 137.7
通过
运行矩阵
5 / 5 targets pass
通过
信任报告
0 secrets; 90 scripts; 3 network-capable scripts; 0 help smoke failures
通过
Python 兼容
Python 3.11; 149 files; 0 compatibility issues; 0 syntax; 0 f-string 3.11 hazards
通过
架构维护
146 Python files; 0 hotspots; 0 blockers; largest 899 lines; 33 CLI handlers
通过
权限批准
3/3 permissions approved; gaps 0; required file_write, network, subprocess
通过
权限探针
4/4 targets probed; native 0; metadata fallback 4; residual risks 4
通过
组合治理
12 skills, 1 actionable; 0 actionable route collisions; 0 actionable owner gaps; 0 actionable stale; 0 actionable drift; 24 scoped non-actionable issues
通过
运营回路
1 metadata events; adoption 0; missed 0; bad-output 0; risk low
关注
人工批准
0 active waivers; 1 warning gates still need reviewer decision
关注
世界证据
4 pending world-class evidence entries; 1 human pending; 3 external pending; overclaim guard true
通过
注册审计
yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures
通过
发布路线
0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended
@@ -410,9 +481,10 @@
盲评包
- Pair Count
- 5
- Answer Key Separate
- 是
- With Skill Hidden Count
- 5
- 审定报告
- Pair Count
- 5
- Judgment Count
- 0
- 待审
- 5
- Agreement Count
- 0
- Disagreement Count
- 0
- Invalid Decision Count
- 0
- 答案揭示
- 0
- 答案隐藏
- 5
+ 审定报告
- Pair Count
- 5
- Judgment Count
- 0
- 待审
- 5
- Agreement Count
- 0
- Disagreement Count
- 0
- Invalid Decision Count
- 0
- 答案揭示
- 0
- 答案隐藏
- 5
- Reviewer Checklist Count
- 5
- Reviewer Checklist Pending Count
- 5
+
评审清单
每张卡片对应一个 blind A/B case,说明当前是否待判、答案是否仍隐藏、应填写的决策文件、有效字段和复跑命令。
awaiting-decision · 答案隐藏
skill-package-contract
Reviewer has not selected A or B yet; answer key remains hidden.
- 盲评包
reports/output_blind_review_pack.json- 决策表
reports/output_review_decisions.json- 提示词
- Turn this repeated workflow into a reusable team skill package.
操作命令
- write_template
python3 scripts/adjudicate_output_review.py --write-template - adjudicate
python3 scripts/yao.py output-review - refresh_review_studio
python3 scripts/yao.py review-studio .
字段要求
- winner_variantA or B after reading only the blind review pack.
- confidenceOptional number from 0 to 1.
- reasonShort rationale; do not reveal baseline or with-skill labels before adjudication.
隐私边界
- Do not paste raw private user data into the decision reason.
- Do not open the answer key before reviewer choices are recorded.
- Leave winner_variant blank when the reviewer is not ready to decide.
awaiting-decision · 答案隐藏
output-eval-expectation
Reviewer has not selected A or B yet; answer key remains hidden.
- 盲评包
reports/output_blind_review_pack.json- 决策表
reports/output_review_decisions.json- 提示词
- Upgrade this production skill so we know whether the generated output is better than baseline.
操作命令
- write_template
python3 scripts/adjudicate_output_review.py --write-template - adjudicate
python3 scripts/yao.py output-review - refresh_review_studio
python3 scripts/yao.py review-studio .
字段要求
- winner_variantA or B after reading only the blind review pack.
- confidenceOptional number from 0 to 1.
- reasonShort rationale; do not reveal baseline or with-skill labels before adjudication.
隐私边界
- Do not paste raw private user data into the decision reason.
- Do not open the answer key before reviewer choices are recorded.
- Leave winner_variant blank when the reviewer is not ready to decide.
awaiting-decision · 答案隐藏
ir-before-packaging
Reviewer has not selected A or B yet; answer key remains hidden.
- 盲评包
reports/output_blind_review_pack.json- 决策表
reports/output_review_decisions.json- 提示词
- Package this skill for OpenAI, Claude, Agent Skills, and generic targets.
操作命令
- write_template
python3 scripts/adjudicate_output_review.py --write-template - adjudicate
python3 scripts/yao.py output-review - refresh_review_studio
python3 scripts/yao.py review-studio .
字段要求
- winner_variantA or B after reading only the blind review pack.
- confidenceOptional number from 0 to 1.
- reasonShort rationale; do not reveal baseline or with-skill labels before adjudication.
隐私边界
- Do not paste raw private user data into the decision reason.
- Do not open the answer key before reviewer choices are recorded.
- Leave winner_variant blank when the reviewer is not ready to decide.
awaiting-decision · 答案隐藏
near-neighbor-boundary
Reviewer has not selected A or B yet; answer key remains hidden.
- 盲评包
reports/output_blind_review_pack.json- 决策表
reports/output_review_decisions.json- 提示词
- I only need a one-off summary of these notes, not a reusable process.
操作命令
- write_template
python3 scripts/adjudicate_output_review.py --write-template - adjudicate
python3 scripts/yao.py output-review - refresh_review_studio
python3 scripts/yao.py review-studio .
字段要求
- winner_variantA or B after reading only the blind review pack.
- confidenceOptional number from 0 to 1.
- reasonShort rationale; do not reveal baseline or with-skill labels before adjudication.
隐私边界
- Do not paste raw private user data into the decision reason.
- Do not open the answer key before reviewer choices are recorded.
- Leave winner_variant blank when the reviewer is not ready to decide.
awaiting-decision · 答案隐藏
file-backed-governed-package
Reviewer has not selected A or B yet; answer key remains hidden.
- 盲评包
reports/output_blind_review_pack.json- 决策表
reports/output_review_decisions.json- 提示词
- Turn the attached release brief source into a governed skill package.
操作命令
- write_template
python3 scripts/adjudicate_output_review.py --write-template - adjudicate
python3 scripts/yao.py output-review - refresh_review_studio
python3 scripts/yao.py review-studio .
字段要求
- winner_variantA or B after reading only the blind review pack.
- confidenceOptional number from 0 to 1.
- reasonShort rationale; do not reveal baseline or with-skill labels before adjudication.
隐私边界
- Do not paste raw private user data into the decision reason.
- Do not open the answer key before reviewer choices are recorded.
- Leave winner_variant blank when the reviewer is not ready to decide.
发布标准
Governed 和 Library 至少需要 5 个 output eval cases,并覆盖 file-backed、near-neighbor、boundary case、execution evidence 和 blind A/B review pack。
人工结论
没有 reviewer 决策时只显示 pending;只有真实决策文件会进入一致率和分歧统计。
@@ -434,12 +506,12 @@
- 信任报告
- Secret
- 0
- 脚本数
- 89
- 网络脚本
- 3
- Help 失败
- 0
- 包体哈希
f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20
+ 信任报告
- Secret
- 0
- 脚本数
- 90
- 网络脚本
- 3
- Help 失败
- 0
- 包体哈希
60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c
安全边界
高风险 secret、远程 inline execution、缺失依赖策略或无法解释的脚本接口应阻断 governed release。
- Python 兼容
- 目标 Python
- 3.11
- 文件数
- 148
- 问题数
- 0
- 语法错误
- 0
- F-string 3.11
- 0
+ Python 兼容
- 目标 Python
- 3.11
- 文件数
- 149
- 问题数
- 0
- 语法错误
- 0
- F-string 3.11
- 0
解释器边界
CI 和发布审查以 Python 3.11 兼容为底线;本地更高版本允许的新语法不能绕过兼容门禁。
@@ -502,12 +574,12 @@
注册审计
yao-meta-skill 1.1.0; 6/6 compatibility entries pass; install pass with 4 adapters; installer permissions 12 enforced / 0 failures
- 包体元数据
- 名称
- yao-meta-skill
- 版本
- 1.1.0
- Maturity
- governed
- Owner
- Yao Team
- License
- MIT
- 信任级别
- local
- 目标平台
- openai, claude, generic, agent-skills-compatible, vscode
- 兼容通过
- 6/6
- 归档哈希
2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2
+ 包体元数据
- 名称
- yao-meta-skill
- 版本
- 1.1.0
- Maturity
- governed
- Owner
- Yao Team
- License
- MIT
- 信任级别
- local
- 目标平台
- openai, claude, generic, agent-skills-compatible, vscode
- 兼容通过
- 6/6
- 归档哈希
5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a
发布路线
0 promote; 3 keep current; 0 blocked; upgrade minor declared / minor recommended
- 包体验证
- 目标数
- 4
- Adapter
- 4
- 归档存在
- 是
- Zip 条目
- 557
- 失败数
- 0
- 警告数
- 0
- 归档哈希
2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2
+ 包体验证
- 目标数
- 4
- Adapter
- 4
- 归档存在
- 是
- Zip 条目
- 558
- 失败数
- 0
- 警告数
- 0
- 归档哈希
5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a
diff --git a/reports/review-studio.json b/reports/review-studio.json
index 28c73a23..18687cbf 100644
--- a/reports/review-studio.json
+++ b/reports/review-studio.json
@@ -59,7 +59,7 @@
"key": "trust-report",
"label": "信任报告",
"status": "pass",
- "detail": "0 secrets; 89 scripts; 3 network-capable scripts; 0 help smoke failures",
+ "detail": "0 secrets; 90 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; 148 files; 0 compatibility issues; 0 syntax; 0 f-string 3.11 hazards",
+ "detail": "Python 3.11; 149 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": "pass",
- "detail": "145 Python files; 0 hotspots; 0 blockers; largest 895 lines; 33 CLI handlers",
+ "detail": "146 Python files; 0 hotspots; 0 blockers; largest 899 lines; 33 CLI handlers",
"evidence": "reports/architecture_maintainability.json",
"link": "architecture_maintainability.md"
},
@@ -837,7 +837,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
- "file_count": 89
+ "file_count": 90
},
{
"path": "evals",
@@ -852,7 +852,7 @@
"file_count": 195
}
],
- "file_count": 348,
+ "file_count": 349,
"folder_count": 4,
"distribution": [
{
@@ -877,7 +877,7 @@
},
{
"label": "scripts",
- "value": 89
+ "value": 90
},
{
"label": "evals",
@@ -1006,7 +1006,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
- "file_count": 89
+ "file_count": 90
},
{
"path": "evals",
@@ -1279,7 +1279,11 @@
"pending_answer_hidden_count": 5,
"agreement_rate": null,
"needs_review": true,
- "failure_count": 0
+ "failure_count": 0,
+ "reviewer_checklist_count": 5,
+ "reviewer_checklist_pending_count": 5,
+ "reviewer_checklist_invalid_count": 0,
+ "reviewer_checklist_ready_count": 0
},
"reviewer": "",
"reviewed_at": "",
@@ -1306,9 +1310,9 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
- "changed_file_count": 31
+ "changed_file_count": 42
},
- "commit": "088904f519e04981f30c5c8c225de90a4aee2682",
+ "commit": "810885d70e6ed0fa6b19cd5a0edf971057215f9d",
"missing_artifacts": [],
"limitations": [
"Local command-runner evidence is reproducible but does not replace provider-backed model holdout evidence.",
@@ -1383,9 +1387,9 @@
"failures": []
},
"trust_security": {
- "scanned_files": 173,
- "script_count": 89,
- "internal_module_count": 16,
+ "scanned_files": 174,
+ "script_count": 90,
+ "internal_module_count": 17,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -1403,8 +1407,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
- "package_hash_file_count": 173,
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "package_hash_file_count": 174,
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
},
"skill_atlas": {
"skill_count": 12,
@@ -1442,8 +1446,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20",
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
"compatibility": {
"openai": "pass",
@@ -1474,7 +1478,7 @@
},
"distribution": {
"archive_verified": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
@@ -1490,8 +1494,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
- "archive_entry_count": 557,
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
+ "archive_entry_count": 558,
"failure_count": 0,
"warning_count": 0
},
@@ -1502,7 +1506,7 @@
"ok": true,
"summary": {
"archive_present": true,
- "archive_entry_count": 557,
+ "archive_entry_count": 558,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -1569,12 +1573,12 @@
{
"field": "archive_sha256",
"from": "",
- "to": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "to": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
- "to": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "to": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
}
]
},
@@ -3691,7 +3695,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 27.65,
+ "duration_ms": 29.36,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3719,7 +3723,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 27.96,
+ "duration_ms": 28.61,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3742,7 +3746,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 27.98,
+ "duration_ms": 28.44,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3770,7 +3774,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 28.3,
+ "duration_ms": 28.46,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3793,7 +3797,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 29.47,
+ "duration_ms": 28.04,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3821,7 +3825,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 28.72,
+ "duration_ms": 28.85,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3844,7 +3848,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 29.11,
+ "duration_ms": 28.63,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3871,7 +3875,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 28.16,
+ "duration_ms": 28.65,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3894,7 +3898,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 27.95,
+ "duration_ms": 28.69,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -3923,7 +3927,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
- "duration_ms": 28.03,
+ "duration_ms": 29.97,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -4164,7 +4168,11 @@
"pending_answer_hidden_count": 5,
"agreement_rate": null,
"needs_review": true,
- "failure_count": 0
+ "failure_count": 0,
+ "reviewer_checklist_count": 5,
+ "reviewer_checklist_pending_count": 5,
+ "reviewer_checklist_invalid_count": 0,
+ "reviewer_checklist_ready_count": 0
},
"reviewer": "",
"reviewed_at": "",
@@ -4228,6 +4236,138 @@
"prompt": "Turn the attached release brief source into a governed skill package."
}
],
+ "reviewer_checklist": [
+ {
+ "case_id": "skill-package-contract",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "Turn this repeated workflow into a reusable team skill package.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ },
+ {
+ "case_id": "output-eval-expectation",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "Upgrade this production skill so we know whether the generated output is better than baseline.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ },
+ {
+ "case_id": "ir-before-packaging",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "Package this skill for OpenAI, Claude, Agent Skills, and generic targets.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ },
+ {
+ "case_id": "near-neighbor-boundary",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "I only need a one-off summary of these notes, not a reusable process.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ },
+ {
+ "case_id": "file-backed-governed-package",
+ "readiness": "awaiting-decision",
+ "blocking_reason": "Reviewer has not selected A or B yet; answer key remains hidden.",
+ "status": "pending",
+ "reviewer_winner_variant": "",
+ "answer_key_visible": false,
+ "prompt": "Turn the attached release brief source into a governed skill package.",
+ "blind_pack_path": "reports/output_blind_review_pack.json",
+ "decisions_path": "reports/output_review_decisions.json",
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio ."
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication."
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide."
+ ]
+ }
+ ],
"failures": []
},
"skill_os2_coverage": {
@@ -4354,7 +4494,7 @@
"label": "Trust Security",
"status": "pass",
"objective": "Scripts, dependencies, permissions, secrets, and package hash are reviewable for team distribution.",
- "current": "89 scripts; secrets 0; help failures 0",
+ "current": "90 scripts; secrets 0; help failures 0",
"command": "python3 scripts/yao.py trust .",
"test": "python3 tests/verify_trust_check.py",
"evidence": [
@@ -4428,7 +4568,7 @@
"label": "Registry Distribution",
"status": "pass",
"objective": "Skill packages are installable, versioned, checksumed, and upgrade-reviewable.",
- "current": "archive entries 557; install failures 0",
+ "current": "archive entries 558; 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": [
@@ -5056,6 +5196,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -5071,8 +5212,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -5897,6 +6037,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -5912,8 +6053,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -6738,6 +6878,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -6753,8 +6894,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -7563,6 +7703,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -7578,8 +7719,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -8388,6 +8528,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -8403,8 +8544,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -9601,9 +9741,9 @@
"ok": true,
"skill_dir": ".",
"summary": {
- "scanned_files": 173,
- "script_count": 89,
- "internal_module_count": 16,
+ "scanned_files": 174,
+ "script_count": 90,
+ "internal_module_count": 17,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -9621,8 +9761,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
- "package_hash_file_count": 173,
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "package_hash_file_count": 174,
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
},
"failures": [],
"warnings": [],
@@ -10527,6 +10667,20 @@
"network_urls": [],
"network_hosts": []
},
+ {
+ "path": "scripts/review_studio_output_review.py",
+ "interface": "internal-module",
+ "interface_declared": true,
+ "interface_reason": "Imported by render_review_studio.py to render output review checklist cards.",
+ "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/review_studio_world_class.py",
"interface": "internal-module",
@@ -10926,7 +11080,7 @@
"checked_count": 73,
"passed_count": 73,
"failed_count": 0,
- "skipped_count": 16,
+ "skipped_count": 17,
"failed_scripts": [],
"results": [
{
@@ -11677,6 +11831,10 @@
"path": "scripts/review_studio_layout.py",
"reason": "internal module"
},
+ {
+ "path": "scripts/review_studio_output_review.py",
+ "reason": "internal module"
+ },
{
"path": "scripts/review_studio_world_class.py",
"reason": "internal module"
@@ -11906,7 +12064,7 @@
"root": ".",
"summary": {
"target_python": "3.11",
- "file_count": 148,
+ "file_count": 149,
"issue_count": 0,
"syntax_error_count": 0,
"fstring_311_violation_count": 0,
@@ -12319,6 +12477,12 @@
"issue_count": 0,
"issues": []
},
+ {
+ "path": "scripts/review_studio_output_review.py",
+ "ok": true,
+ "issue_count": 0,
+ "issues": []
+ },
{
"path": "scripts/review_studio_world_class.py",
"ok": true,
@@ -12824,15 +12988,15 @@
"generated_at": "2026-06-14",
"skill_dir": ".",
"summary": {
- "python_file_count": 145,
- "script_file_count": 89,
+ "python_file_count": 146,
+ "script_file_count": 90,
"test_file_count": 56,
- "internal_module_count": 18,
+ "internal_module_count": 19,
"cli_script_count": 72,
"command_handler_count": 33,
"warn_line_threshold": 900,
"block_line_threshold": 1500,
- "largest_file_lines": 895,
+ "largest_file_lines": 899,
"hotspot_count": 0,
"blocker_count": 0,
"decision": "pass"
@@ -12840,14 +13004,14 @@
"largest_files": [
{
"path": "scripts/render_review_studio.py",
- "lines": 895,
+ "lines": 899,
"kind": "cli-script",
"severity": "pass",
"recommendation": "Move data loading and large section renderers into focused review_studio_* modules."
},
{
"path": "tests/verify_yao_cli.py",
- "lines": 845,
+ "lines": 848,
"kind": "test",
"severity": "pass",
"recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands."
@@ -12938,10 +13102,10 @@
"context_budget_tier": "production",
"context_budget_limit": 1000,
"skill_body_tokens": 751,
- "other_text_tokens": 1096197,
+ "other_text_tokens": 1105224,
"estimated_initial_load_tokens": 944,
- "estimated_total_text_tokens": 1096948,
- "relevant_file_count": 477,
+ "estimated_total_text_tokens": 1105975,
+ "relevant_file_count": 479,
"unused_resource_dirs": [],
"quality_signal_points": 130,
"quality_density": 137.7
@@ -13868,6 +14032,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -14789,7 +14954,7 @@
"adoption_drift": {
"ok": true,
"schema_version": "2.0",
- "generated_at": "2026-06-13T21:28:44Z",
+ "generated_at": "2026-06-13T21:39:40Z",
"skill_dir": ".",
"privacy_contract": {
"storage": "local-first",
@@ -15772,8 +15937,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20",
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
"compatibility": {
"openai": "pass",
@@ -15804,7 +15969,7 @@
},
"distribution": {
"archive_verified": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
@@ -15829,7 +15994,7 @@
"vscode"
],
"package_metadata": "registry/packages/yao-meta-skill.json",
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
}
]
},
@@ -15852,8 +16017,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
- "archive_entry_count": 557,
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
+ "archive_entry_count": 558,
"failure_count": 0,
"warning_count": 0
},
@@ -16518,7 +16683,7 @@
"installed_skill_dir": "[temporary-install-root]/yao-meta-skill",
"summary": {
"archive_present": true,
- "archive_entry_count": 557,
+ "archive_entry_count": 558,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -16860,12 +17025,12 @@
{
"field": "archive_sha256",
"from": "",
- "to": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "to": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
- "to": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "to": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
}
]
},
diff --git a/reports/review-viewer.json b/reports/review-viewer.json
index 3ceecf88..6372cd9c 100644
--- a/reports/review-viewer.json
+++ b/reports/review-viewer.json
@@ -437,7 +437,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
- "file_count": 89
+ "file_count": 90
},
{
"path": "evals",
@@ -452,7 +452,7 @@
"file_count": 195
}
],
- "file_count": 348,
+ "file_count": 349,
"folder_count": 4,
"distribution": [
{
@@ -477,7 +477,7 @@
},
{
"label": "scripts",
- "value": 89
+ "value": 90
},
{
"label": "evals",
@@ -606,7 +606,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
- "file_count": 89
+ "file_count": 90
},
{
"path": "evals",
@@ -879,7 +879,11 @@
"pending_answer_hidden_count": 5,
"agreement_rate": null,
"needs_review": true,
- "failure_count": 0
+ "failure_count": 0,
+ "reviewer_checklist_count": 5,
+ "reviewer_checklist_pending_count": 5,
+ "reviewer_checklist_invalid_count": 0,
+ "reviewer_checklist_ready_count": 0
},
"reviewer": "",
"reviewed_at": "",
@@ -906,9 +910,9 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
- "changed_file_count": 31
+ "changed_file_count": 42
},
- "commit": "088904f519e04981f30c5c8c225de90a4aee2682",
+ "commit": "810885d70e6ed0fa6b19cd5a0edf971057215f9d",
"missing_artifacts": [],
"limitations": [
"Local command-runner evidence is reproducible but does not replace provider-backed model holdout evidence.",
@@ -983,9 +987,9 @@
"failures": []
},
"trust_security": {
- "scanned_files": 173,
- "script_count": 89,
- "internal_module_count": 16,
+ "scanned_files": 174,
+ "script_count": 90,
+ "internal_module_count": 17,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -1003,8 +1007,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
- "package_hash_file_count": 173,
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "package_hash_file_count": 174,
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
},
"skill_atlas": {
"skill_count": 12,
@@ -1042,8 +1046,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20",
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
"compatibility": {
"openai": "pass",
@@ -1074,7 +1078,7 @@
},
"distribution": {
"archive_verified": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
@@ -1090,8 +1094,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
- "archive_entry_count": 557,
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
+ "archive_entry_count": 558,
"failure_count": 0,
"warning_count": 0
},
@@ -1102,7 +1106,7 @@
"ok": true,
"summary": {
"archive_present": true,
- "archive_entry_count": 557,
+ "archive_entry_count": 558,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -1169,12 +1173,12 @@
{
"field": "archive_sha256",
"from": "",
- "to": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "to": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
- "to": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "to": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
}
]
},
diff --git a/reports/security_trust_report.json b/reports/security_trust_report.json
index f8374c75..0d628fa7 100644
--- a/reports/security_trust_report.json
+++ b/reports/security_trust_report.json
@@ -2,9 +2,9 @@
"ok": true,
"skill_dir": ".",
"summary": {
- "scanned_files": 173,
- "script_count": 89,
- "internal_module_count": 16,
+ "scanned_files": 174,
+ "script_count": 90,
+ "internal_module_count": 17,
"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": 173,
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "package_hash_file_count": 174,
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
},
"failures": [],
"warnings": [],
@@ -928,6 +928,20 @@
"network_urls": [],
"network_hosts": []
},
+ {
+ "path": "scripts/review_studio_output_review.py",
+ "interface": "internal-module",
+ "interface_declared": true,
+ "interface_reason": "Imported by render_review_studio.py to render output review checklist cards.",
+ "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/review_studio_world_class.py",
"interface": "internal-module",
@@ -1327,7 +1341,7 @@
"checked_count": 73,
"passed_count": 73,
"failed_count": 0,
- "skipped_count": 16,
+ "skipped_count": 17,
"failed_scripts": [],
"results": [
{
@@ -2078,6 +2092,10 @@
"path": "scripts/review_studio_layout.py",
"reason": "internal module"
},
+ {
+ "path": "scripts/review_studio_output_review.py",
+ "reason": "internal module"
+ },
{
"path": "scripts/review_studio_world_class.py",
"reason": "internal module"
diff --git a/reports/security_trust_report.md b/reports/security_trust_report.md
index 9fc248ed..749d3532 100644
--- a/reports/security_trust_report.md
+++ b/reports/security_trust_report.md
@@ -1,9 +1,9 @@
# Security Trust Report
- OK: `True`
-- Scanned files: `173`
-- Scripts: `89`
-- Internal script modules: `16`
+- Scanned files: `174`
+- Scripts: `90`
+- Internal script modules: `17`
- 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: `173`
-- Package SHA256: `f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20`
+- Package hash files: `174`
+- Package SHA256: `60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c`
## Failures
@@ -125,6 +125,7 @@
| scripts/review_studio_formatting.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_studio.py to format report dictionaries as audit UI panels. |
| scripts/review_studio_gates.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_studio.py to keep Review Studio gate evaluation separate from HTML rendering. |
| 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_output_review.py | internal-module | True | False | False | False | False | False | False | Imported by render_review_studio.py to render output review checklist cards. |
| 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. |
diff --git a/reports/skill-overview.html b/reports/skill-overview.html
index 4d386a10..8dbc6831 100644
--- a/reports/skill-overview.html
+++ b/reports/skill-overview.html
@@ -771,7 +771,7 @@
让 reviewer 快速确认关键文件、目录和资产分布。Lets reviewers confirm key files, directories, and asset distribution quickly.
-
资产分布图展示当前包体的文件和目录重心。
+
资产分布图展示当前包体的文件和目录重心。
| 路径Path | 作用Role | 类型Type |
| SKILL.md | Skill 入口文件Skill entrypoint | 文件file |
| README.md | 人类可读使用说明Human-readable usage guide | 文件file |
| agents/interface.yaml | 跨平台接口元数据Neutral interface metadata | 文件file |
| manifest.json | 生命周期与打包元数据Lifecycle and portability metadata | 文件file |
| references | 扩展指导与复用资料Extended guidance and reusable notes | 目录folder |
| scripts | 确定性脚本或本地工具Deterministic helpers or local tooling | 目录folder |
| evals | 触发与质量检查Trigger and quality checks | 目录folder |
| reports | 生成的证据与总结报告Generated evidence and overview artifacts | 目录folder |
diff --git a/reports/skill-overview.json b/reports/skill-overview.json
index 8d562fe3..deb4f6c2 100644
--- a/reports/skill-overview.json
+++ b/reports/skill-overview.json
@@ -436,7 +436,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
- "file_count": 89
+ "file_count": 90
},
{
"path": "evals",
@@ -451,7 +451,7 @@
"file_count": 195
}
],
- "file_count": 348,
+ "file_count": 349,
"folder_count": 4,
"distribution": [
{
@@ -476,7 +476,7 @@
},
{
"label": "scripts",
- "value": 89
+ "value": 90
},
{
"label": "evals",
@@ -605,7 +605,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
- "file_count": 89
+ "file_count": 90
},
{
"path": "evals",
@@ -878,7 +878,11 @@
"pending_answer_hidden_count": 5,
"agreement_rate": null,
"needs_review": true,
- "failure_count": 0
+ "failure_count": 0,
+ "reviewer_checklist_count": 5,
+ "reviewer_checklist_pending_count": 5,
+ "reviewer_checklist_invalid_count": 0,
+ "reviewer_checklist_ready_count": 0
},
"reviewer": "",
"reviewed_at": "",
@@ -905,9 +909,9 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
- "changed_file_count": 31
+ "changed_file_count": 42
},
- "commit": "088904f519e04981f30c5c8c225de90a4aee2682",
+ "commit": "810885d70e6ed0fa6b19cd5a0edf971057215f9d",
"missing_artifacts": [],
"limitations": [
"Local command-runner evidence is reproducible but does not replace provider-backed model holdout evidence.",
@@ -982,9 +986,9 @@
"failures": []
},
"trust_security": {
- "scanned_files": 173,
- "script_count": 89,
- "internal_module_count": 16,
+ "scanned_files": 174,
+ "script_count": 90,
+ "internal_module_count": 17,
"secret_findings": 0,
"dependency_files": [
"requirements-ci.txt"
@@ -1002,8 +1006,8 @@
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
- "package_hash_file_count": 173,
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "package_hash_file_count": 174,
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
},
"skill_atlas": {
"skill_count": 12,
@@ -1041,8 +1045,8 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
- "package_sha256": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20",
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "package_sha256": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
"compatibility": {
"openai": "pass",
@@ -1073,7 +1077,7 @@
},
"distribution": {
"archive_verified": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
"package_verification": "reports/package_verification.json",
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
@@ -1089,8 +1093,8 @@
"target_count": 4,
"adapter_count": 4,
"archive_present": true,
- "archive_sha256": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2",
- "archive_entry_count": 557,
+ "archive_sha256": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a",
+ "archive_entry_count": 558,
"failure_count": 0,
"warning_count": 0
},
@@ -1101,7 +1105,7 @@
"ok": true,
"summary": {
"archive_present": true,
- "archive_entry_count": 557,
+ "archive_entry_count": 558,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -1168,12 +1172,12 @@
{
"field": "archive_sha256",
"from": "",
- "to": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "to": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
- "to": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "to": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
}
]
},
diff --git a/reports/skill_atlas.json b/reports/skill_atlas.json
index b7688da7..12b23844 100644
--- a/reports/skill_atlas.json
+++ b/reports/skill_atlas.json
@@ -127,6 +127,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
diff --git a/reports/skill_os2_audit.json b/reports/skill_os2_audit.json
index 4e888c1f..b8506c70 100644
--- a/reports/skill_os2_audit.json
+++ b/reports/skill_os2_audit.json
@@ -197,7 +197,7 @@
"key": "trust-security",
"label": "Trust Security",
"status": "pass",
- "current": "secrets 0; scripts 89; help failures 0",
+ "current": "secrets 0; scripts 90; 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 557; install failures 0; permission failures 0",
+ "current": "zip entries 558; install failures 0; permission failures 0",
"target": "Package metadata, archive checksum, package verification, and install simulation pass",
"evidence": [
{
diff --git a/reports/skill_os2_audit.md b/reports/skill_os2_audit.md
index 4d63f0fc..0a3ba09a 100644
--- a/reports/skill_os2_audit.md
+++ b/reports/skill_os2_audit.md
@@ -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 89; 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 90; 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 557; 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 558; install failures 0; permission failures 0 | Package metadata, archive checksum, package verification, and install simulation pass | Regenerate registry after package verification so checksums stay aligned. |
| Review Studio | pass | decision review; warnings 3; score 91 | One page shows gates, evidence paths, blockers, warnings, actions, waivers, and annotations | Resolve human/external warning gates before claiming full release readiness. |
| Telemetry Drift | pass | events 1; risk low; recipes 5 | Local-first metadata-only event contract, aggregate drift report, hook recipes, and import path | Keep raw JSONL out of distributed packages and use aggregate reports for Atlas. |
| Native Client Telemetry | external-required | external source events 0; adoption samples 0 | A real Browser/Chrome/provider client sends production metadata events | Install a real client against the native host and import production metadata-only events. |
diff --git a/reports/skill_os2_coverage.json b/reports/skill_os2_coverage.json
index 5cae860c..7ff45da7 100644
--- a/reports/skill_os2_coverage.json
+++ b/reports/skill_os2_coverage.json
@@ -122,7 +122,7 @@
"label": "Trust Security",
"status": "pass",
"objective": "Scripts, dependencies, permissions, secrets, and package hash are reviewable for team distribution.",
- "current": "89 scripts; secrets 0; help failures 0",
+ "current": "90 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 557; install failures 0",
+ "current": "archive entries 558; 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": [
diff --git a/reports/skill_os2_coverage.md b/reports/skill_os2_coverage.md
index 73d5d6b4..9f539e18 100644
--- a/reports/skill_os2_coverage.md
+++ b/reports/skill_os2_coverage.md
@@ -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` | 89 scripts; secrets 0; help failures 0 | `python3 scripts/yao.py trust .` | `python3 tests/verify_trust_check.py` |
+| Trust Security | `pass` | 90 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 557; 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 558; install failures 0 | `python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .` | `python3 tests/verify_registry_audit.py` |
| Review Studio | `pass` | 16 gates; decision review; warnings 3 | `python3 scripts/yao.py review-studio .` | `python3 tests/verify_review_studio.py` |
| Telemetry Drift | `pass` | events 1; recipes 5; risk low | `python3 scripts/yao.py telemetry-hooks . && python3 scripts/yao.py adoption-drift .` | `python3 tests/verify_telemetry_hooks.py` |
diff --git a/reports/upgrade_check.json b/reports/upgrade_check.json
index 772b438c..5091a54a 100644
--- a/reports/upgrade_check.json
+++ b/reports/upgrade_check.json
@@ -70,12 +70,12 @@
{
"field": "archive_sha256",
"from": "",
- "to": "2c2f2d3a4fffe1dfc54e282c1058efc1d3476b7de588f8e9167b26a7428a63d2"
+ "to": "5d160bd148b5febdf20537e481703a695dab8d8f8a2cfe21cc1ee101e375546a"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
- "to": "f34bc1b155763d5269ae0ae904de35383fd4d0000006af8ad7a6c85ab7ce4b20"
+ "to": "60817db29dd8d235751c67311b180e889b1c79577968883e3cf2df07dcb1875c"
}
]
},
diff --git a/scripts/adjudicate_output_review.py b/scripts/adjudicate_output_review.py
index 1200481d..b4e8ec8c 100644
--- a/scripts/adjudicate_output_review.py
+++ b/scripts/adjudicate_output_review.py
@@ -216,6 +216,96 @@ def build_summary(pairs: list[dict[str, Any]], failures: list[str]) -> dict[str,
}
+def checklist_readiness(pair: dict[str, Any]) -> tuple[str, str]:
+ status = pair.get("status")
+ if status in {"match", "disagree"}:
+ return "adjudicated", "Reviewer decision is valid; answer key is revealed for this case."
+ if status == "invalid":
+ return "fix-decision", "Reviewer decision exists but failed validation; answer key remains hidden."
+ return "awaiting-decision", "Reviewer has not selected A or B yet; answer key remains hidden."
+
+
+def build_reviewer_checklist(
+ pairs: list[dict[str, Any]],
+ blind_pack_path: Path,
+ decisions_path: Path,
+) -> list[dict[str, Any]]:
+ checklist = []
+ for pair in pairs:
+ readiness, blocking_reason = checklist_readiness(pair)
+ checklist.append(
+ {
+ "case_id": pair.get("case_id", ""),
+ "readiness": readiness,
+ "blocking_reason": blocking_reason,
+ "status": pair.get("status", "pending"),
+ "reviewer_winner_variant": pair.get("reviewer_winner_variant", ""),
+ "answer_key_visible": bool(pair.get("expected_revealed")),
+ "prompt": pair.get("prompt", ""),
+ "blind_pack_path": display_path(blind_pack_path),
+ "decisions_path": display_path(decisions_path),
+ "commands": {
+ "write_template": "python3 scripts/adjudicate_output_review.py --write-template",
+ "adjudicate": "python3 scripts/yao.py output-review",
+ "refresh_review_studio": "python3 scripts/yao.py review-studio .",
+ },
+ "required_fields": {
+ "winner_variant": "A or B after reading only the blind review pack.",
+ "confidence": "Optional number from 0 to 1.",
+ "reason": "Short rationale; do not reveal baseline or with-skill labels before adjudication.",
+ },
+ "privacy_contract": [
+ "Do not paste raw private user data into the decision reason.",
+ "Do not open the answer key before reviewer choices are recorded.",
+ "Leave winner_variant blank when the reviewer is not ready to decide.",
+ ],
+ }
+ )
+ return checklist
+
+
+def add_checklist_summary(summary: dict[str, Any], checklist: list[dict[str, Any]]) -> dict[str, Any]:
+ enriched = dict(summary)
+ enriched["reviewer_checklist_count"] = len(checklist)
+ enriched["reviewer_checklist_pending_count"] = sum(1 for item in checklist if item["readiness"] == "awaiting-decision")
+ enriched["reviewer_checklist_invalid_count"] = sum(1 for item in checklist if item["readiness"] == "fix-decision")
+ enriched["reviewer_checklist_ready_count"] = sum(1 for item in checklist if item["readiness"] == "adjudicated")
+ return enriched
+
+
+def render_reviewer_checklist(checklist: list[dict[str, Any]]) -> list[str]:
+ lines = [
+ "## Reviewer Checklist",
+ "",
+ "| Case | Readiness | Answer key | Decision file |",
+ "| --- | --- | --- | --- |",
+ ]
+ if not checklist:
+ lines.append("| `none` | `adjudicated` | n/a | none |")
+ return lines
+ for item in checklist:
+ answer_key = "visible" if item.get("answer_key_visible") else "hidden"
+ lines.append(
+ f"| `{item['case_id']}` | `{item['readiness']}` | `{answer_key}` | `{item['decisions_path']}` |"
+ )
+ for item in checklist:
+ lines.extend(["", f"### {item['case_id']}", ""])
+ lines.append(f"- readiness: `{item['readiness']}`")
+ lines.append(f"- blocking reason: {item['blocking_reason']}")
+ lines.append(f"- answer key visible: `{str(item['answer_key_visible']).lower()}`")
+ lines.append(f"- blind pack: `{item['blind_pack_path']}`")
+ lines.append(f"- decisions: `{item['decisions_path']}`")
+ lines.extend(["", "#### Commands", ""])
+ for label, command in item.get("commands", {}).items():
+ lines.append(f"- {label}: `{command}`")
+ lines.extend(["", "#### Required Fields", ""])
+ for label, description in item.get("required_fields", {}).items():
+ lines.append(f"- {label}: {description}")
+ lines.extend(["", "#### Privacy Contract", ""])
+ lines.extend(f"- {contract}" for contract in item.get("privacy_contract", []))
+ return lines
+
+
def render_markdown(payload: dict[str, Any]) -> str:
summary = payload["summary"]
lines = [
@@ -230,6 +320,7 @@ def render_markdown(payload: dict[str, Any]) -> str:
f"- Invalid decisions: `{summary['invalid_decision_count']}`",
f"- Answer keys revealed: `{summary['answer_revealed_count']}`",
f"- Pending/invalid answers hidden: `{summary['pending_answer_hidden_count']}`",
+ f"- Reviewer checklist: `{summary['reviewer_checklist_ready_count']}` ready / `{summary['reviewer_checklist_count']}` total",
"",
]
if summary["judgment_count"] == 0:
@@ -262,6 +353,7 @@ def render_markdown(payload: dict[str, Any]) -> str:
lines.extend(["", "## Failures", ""])
for failure in payload["failures"]:
lines.append(f"- {failure}")
+ lines.extend(["", *render_reviewer_checklist(payload.get("reviewer_checklist", []))])
lines.extend(
[
"",
@@ -314,6 +406,8 @@ def adjudicate_output_review(
failures.extend(pair_failures)
summary = build_summary(adjudicated_pairs, failures)
+ reviewer_checklist = build_reviewer_checklist(adjudicated_pairs, blind_pack_path, decisions_path)
+ summary = add_checklist_summary(summary, reviewer_checklist)
payload = {
"schema_version": "1.0",
"ok": not failures,
@@ -329,6 +423,7 @@ def adjudicate_output_review(
},
"template_written": template_written,
"pairs": adjudicated_pairs,
+ "reviewer_checklist": reviewer_checklist,
"failures": failures,
}
output_json.parent.mkdir(parents=True, exist_ok=True)
diff --git a/scripts/render_review_studio.py b/scripts/render_review_studio.py
index e9ac90ba..c8bbd5b5 100644
--- a/scripts/render_review_studio.py
+++ b/scripts/render_review_studio.py
@@ -10,13 +10,13 @@ from review_studio_data import evidence_paths, insight_cards, load_review_data
from review_studio_formatting import registry_package_summary, render_kv_grid
from review_studio_gates import add_blockers_from_gate, build_gates, status_label, weighted_score
from review_studio_layout import render_review_nav, review_studio_css
+from review_studio_output_review import render_output_review_section
from review_studio_world_class import render_world_class_evidence_entries, render_world_class_intake_checklist
ROOT = Path(__file__).resolve().parent.parent
-
def display_path(skill_dir: Path, path: Path) -> str:
try:
return str(path.resolve().relative_to(skill_dir.resolve()))
@@ -514,9 +514,12 @@ def render_html(report: dict[str, Any]) -> str:
"invalid_decision_count",
"answer_revealed_count",
"pending_answer_hidden_count",
+ "reviewer_checklist_count",
+ "reviewer_checklist_pending_count",
],
"review adjudication report missing",
)
+ output_review_section_html = render_output_review_section(report["data"].get("output_review_adjudication", {}))
blueprint_panel = render_kv_grid(
blueprint_summary,
[
@@ -723,6 +726,7 @@ def render_html(report: dict[str, Any]) -> str:
审定报告
{review_panel}
+ {output_review_section_html}
发布标准
Governed 和 Library 至少需要 5 个 output eval cases,并覆盖 file-backed、near-neighbor、boundary case、execution evidence 和 blind A/B review pack。
人工结论
没有 reviewer 决策时只显示 pending;只有真实决策文件会进入一致率和分歧统计。
diff --git a/scripts/review_studio_layout.py b/scripts/review_studio_layout.py
index 81c80e6e..3b38c35b 100644
--- a/scripts/review_studio_layout.py
+++ b/scripts/review_studio_layout.py
@@ -253,6 +253,77 @@ def review_studio_css() -> str:
margin: 0;
padding-left: 18px;
}
+ .output-review-grid {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr);
+ gap: 16px;
+ margin-top: 16px;
+ }
+ .output-review-card {
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ padding: 18px;
+ background: #fff;
+ display: grid;
+ gap: 12px;
+ min-width: 0;
+ }
+ .output-review-card.awaiting-decision,
+ .output-review-card.fix-decision { border-left: 4px solid var(--warn); }
+ .output-review-card.adjudicated { border-left: 4px solid var(--pass); }
+ .output-review-card span,
+ .output-review-card p,
+ .output-review-card dd,
+ .output-review-card li {
+ color: var(--muted);
+ font-size: 14px;
+ overflow-wrap: anywhere;
+ }
+ .output-review-card dl {
+ display: grid;
+ grid-template-columns: 86px minmax(0, 1fr);
+ gap: 6px 10px;
+ margin: 0;
+ }
+ .output-review-card dt { color: var(--ink); font-size: 14px; }
+ .output-review-card dd { margin: 0; min-width: 0; }
+ .output-review-steps {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 12px;
+ border-top: 1px solid var(--line);
+ padding-top: 12px;
+ }
+ .output-review-steps h4 {
+ margin: 0 0 6px;
+ color: var(--ink);
+ font-size: 14px;
+ font-weight: 500;
+ }
+ .output-review-steps ul {
+ margin: 0;
+ padding-left: 18px;
+ }
+ .output-review-commands,
+ .output-review-fields {
+ list-style: none;
+ padding: 0;
+ display: grid;
+ gap: 8px;
+ }
+ .output-review-commands li,
+ .output-review-fields li {
+ display: grid;
+ gap: 2px;
+ min-width: 0;
+ padding: 8px 0 0;
+ border-top: 1px solid var(--line);
+ }
+ .output-review-commands code {
+ overflow-wrap: anywhere;
+ white-space: normal;
+ display: block;
+ }
.world-intake-grid {
display: grid;
grid-template-columns: minmax(0, 1fr);
@@ -373,7 +444,7 @@ def review_studio_css() -> str:
font-size: 13px;
}
@media (max-width: 980px) {
- .metrics, .gates, .twocol, .actions-grid, .annotations-grid, .world-evidence-grid, .world-evidence-columns, .world-intake-grid, .world-intake-steps, .kv-grid { grid-template-columns: 1fr; }
+ .metrics, .gates, .twocol, .actions-grid, .annotations-grid, .output-review-grid, .output-review-steps, .world-evidence-grid, .world-evidence-columns, .world-intake-grid, .world-intake-steps, .kv-grid { grid-template-columns: 1fr; }
main { padding: 32px 18px 60px; }
nav { justify-content: flex-start; overflow-x: auto; flex-wrap: nowrap; }
nav a { flex: 0 0 auto; }
diff --git a/scripts/review_studio_output_review.py b/scripts/review_studio_output_review.py
new file mode 100644
index 00000000..1fe4478c
--- /dev/null
+++ b/scripts/review_studio_output_review.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+"""Output review HTML helpers for Review Studio."""
+
+import html
+from typing import Any
+
+
+SCRIPT_INTERFACE = "internal-module"
+SCRIPT_INTERFACE_REASON = "Imported by render_review_studio.py to render output review checklist cards."
+
+
+def render_required_fields(fields: dict[str, Any]) -> str:
+ if not fields:
+ return "暂无字段要求。
"
+ items = []
+ for key, value in fields.items():
+ items.append(f"{html.escape(str(key))}{html.escape(str(value))}")
+ return ""
+
+
+def render_command_list(commands: dict[str, Any]) -> str:
+ if not commands:
+ return "暂无命令。
"
+ items = []
+ for label, command in commands.items():
+ if not command:
+ continue
+ items.append(
+ ""
+ f"{html.escape(str(label))}"
+ f"{html.escape(str(command))}"
+ ""
+ )
+ return "" if items else "暂无命令。
"
+
+
+def render_contract(items: list[Any]) -> str:
+ if not items:
+ return "暂无边界。
"
+ return "" + "".join(f"- {html.escape(str(item))}
" for item in items) + "
"
+
+
+def render_output_review_checklist(adjudication: dict[str, Any]) -> str:
+ checklist = adjudication.get("reviewer_checklist", []) if isinstance(adjudication, dict) else []
+ if not checklist:
+ return "当前没有输出评审操作清单。
"
+ cards = []
+ for item in checklist:
+ readiness = str(item.get("readiness", "awaiting-decision"))
+ answer_key = "可见" if item.get("answer_key_visible") else "隐藏"
+ cards.append(
+ ""
+ f"{html.escape(readiness)} · 答案{html.escape(answer_key)}"
+ f"
{html.escape(str(item.get('case_id', 'case')))}
"
+ f"{html.escape(str(item.get('blocking_reason', '')))}
"
+ f"- 盲评包
{html.escape(str(item.get('blind_pack_path', '')))} "
+ f"- 决策表
{html.escape(str(item.get('decisions_path', '')))} "
+ f"- 提示词
- {html.escape(str(item.get('prompt', '')))}
"
+ ""
+ "
操作命令
"
+ + render_command_list(item.get("commands", {}) if isinstance(item.get("commands", {}), dict) else {})
+ + ""
+ "
字段要求
"
+ + render_required_fields(item.get("required_fields", {}) if isinstance(item.get("required_fields", {}), dict) else {})
+ + ""
+ "
隐私边界
"
+ + render_contract(item.get("privacy_contract", []) if isinstance(item.get("privacy_contract", []), list) else [])
+ + ""
+ "
"
+ ""
+ )
+ return "" + "".join(cards) + "
"
+
+
+def render_output_review_section(adjudication: dict[str, Any]) -> str:
+ return (
+ ""
+ "评审清单
"
+ "每张卡片对应一个 blind A/B case,说明当前是否待判、答案是否仍隐藏、应填写的决策文件、有效字段和复跑命令。
"
+ f"{render_output_review_checklist(adjudication)}"
+ ""
+ )
diff --git a/skill-ir/examples/yao-meta-skill.json b/skill-ir/examples/yao-meta-skill.json
index 9dff6e9f..bc4c541f 100644
--- a/skill-ir/examples/yao-meta-skill.json
+++ b/skill-ir/examples/yao-meta-skill.json
@@ -171,6 +171,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
@@ -186,8 +187,7 @@
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py",
"scripts/trigger_eval.py",
- "scripts/trust_check.py",
- "scripts/upgrade_check.py"
+ "scripts/trust_check.py"
],
"assets": [
"templates/basic_skill.md.j2",
diff --git a/skill_atlas/catalog.json b/skill_atlas/catalog.json
index d0f2529d..551eabf5 100644
--- a/skill_atlas/catalog.json
+++ b/skill_atlas/catalog.json
@@ -83,6 +83,7 @@
"scripts/review_studio_formatting.py",
"scripts/review_studio_gates.py",
"scripts/review_studio_layout.py",
+ "scripts/review_studio_output_review.py",
"scripts/review_studio_world_class.py",
"scripts/review_viewer_data.py",
"scripts/run_conformance_suite.py",
diff --git a/tests/verify_output_review_adjudication.py b/tests/verify_output_review_adjudication.py
index dcab76e2..a69d1478 100644
--- a/tests/verify_output_review_adjudication.py
+++ b/tests/verify_output_review_adjudication.py
@@ -77,11 +77,24 @@ def main() -> None:
assert pending_payload["summary"]["needs_review"], pending_payload
assert pending_payload["summary"]["answer_revealed_count"] == 0, pending_payload
assert pending_payload["summary"]["pending_answer_hidden_count"] == 5, pending_payload
+ assert pending_payload["summary"]["reviewer_checklist_count"] == 5, pending_payload
+ assert pending_payload["summary"]["reviewer_checklist_pending_count"] == 5, pending_payload
+ assert pending_payload["summary"]["reviewer_checklist_ready_count"] == 0, pending_payload
+ assert pending_payload["summary"]["reviewer_checklist_invalid_count"] == 0, pending_payload
assert all(not item["expected_winner_variant"] and not item["expected_revealed"] for item in pending_payload["pairs"]), pending_payload
+ checklist = {item["case_id"]: item for item in pending_payload["reviewer_checklist"]}
+ assert checklist["skill-package-contract"]["readiness"] == "awaiting-decision", checklist["skill-package-contract"]
+ assert checklist["skill-package-contract"]["answer_key_visible"] is False, checklist["skill-package-contract"]
+ assert checklist["skill-package-contract"]["decisions_path"].endswith("tests/tmp_output_review_adjudication/missing_decisions.json"), checklist["skill-package-contract"]
+ assert checklist["skill-package-contract"]["commands"]["write_template"] == "python3 scripts/adjudicate_output_review.py --write-template", checklist["skill-package-contract"]
+ assert checklist["skill-package-contract"]["required_fields"]["winner_variant"].startswith("A or B"), checklist["skill-package-contract"]
assert "No reviewer decisions recorded yet" in pending_md.read_text(encoding="utf-8"), pending_md
pending_text = pending_md.read_text(encoding="utf-8")
assert "| skill-package-contract | pending | hidden | pending |" in pending_text, pending_text
assert "| skill-package-contract | pending | A | pending |" not in pending_text, pending_text
+ assert "Reviewer Checklist" in pending_text, pending_text
+ assert "Reviewer checklist: `0` ready / `5` total" in pending_text, pending_text
+ assert "answer key visible: `false`" in pending_text, pending_text
template_path = tmp_root / "output_review_decisions.json"
template_proc = run(
@@ -147,8 +160,12 @@ def main() -> None:
assert filled_payload["summary"]["agreement_rate"] == 100.0, filled_payload
assert filled_payload["summary"]["answer_revealed_count"] == 5, filled_payload
assert filled_payload["summary"]["pending_answer_hidden_count"] == 0, filled_payload
+ assert filled_payload["summary"]["reviewer_checklist_ready_count"] == 5, filled_payload
+ assert filled_payload["summary"]["reviewer_checklist_pending_count"] == 0, filled_payload
assert all(item["status"] == "match" for item in filled_payload["pairs"]), filled_payload
assert all(item["expected_winner_variant"] in {"A", "B"} and item["expected_revealed"] for item in filled_payload["pairs"]), filled_payload
+ filled_checklist = {item["case_id"]: item for item in filled_payload["reviewer_checklist"]}
+ assert all(item["readiness"] == "adjudicated" and item["answer_key_visible"] for item in filled_checklist.values()), filled_checklist
invalid = {
"schema_version": "1.0",
@@ -186,8 +203,12 @@ def main() -> None:
assert not invalid_payload["ok"], invalid_payload
assert invalid_payload["summary"]["invalid_decision_count"] == 1, invalid_payload
assert invalid_payload["summary"]["answer_revealed_count"] == 0, invalid_payload
+ assert invalid_payload["summary"]["reviewer_checklist_invalid_count"] == 1, invalid_payload
assert invalid_payload["pairs"][0]["expected_winner_variant"] == "", invalid_payload
assert invalid_payload["pairs"][0]["expected_revealed"] is False, invalid_payload
+ invalid_checklist = {item["case_id"]: item for item in invalid_payload["reviewer_checklist"]}
+ assert invalid_checklist[answer_key["answers"][0]["case_id"]]["readiness"] == "fix-decision", invalid_checklist
+ assert invalid_checklist[answer_key["answers"][0]["case_id"]]["answer_key_visible"] is False, invalid_checklist
assert invalid_payload["failures"], invalid_payload
print(json.dumps({"ok": True}, ensure_ascii=False, indent=2))
diff --git a/tests/verify_review_studio.py b/tests/verify_review_studio.py
index 8935f494..1b5bf7cd 100644
--- a/tests/verify_review_studio.py
+++ b/tests/verify_review_studio.py
@@ -383,7 +383,14 @@ def main() -> None:
assert full_payload["data"]["output_review_adjudication"]["summary"]["pending_count"] == 5, full_payload["data"]["output_review_adjudication"]
assert full_payload["data"]["output_review_adjudication"]["summary"]["answer_revealed_count"] == 0, full_payload["data"]["output_review_adjudication"]
assert full_payload["data"]["output_review_adjudication"]["summary"]["pending_answer_hidden_count"] == 5, full_payload["data"]["output_review_adjudication"]
+ assert full_payload["data"]["output_review_adjudication"]["summary"]["reviewer_checklist_count"] == 5, full_payload["data"]["output_review_adjudication"]
+ assert full_payload["data"]["output_review_adjudication"]["summary"]["reviewer_checklist_pending_count"] == 5, full_payload["data"]["output_review_adjudication"]
+ assert full_payload["data"]["output_review_adjudication"]["summary"]["reviewer_checklist_ready_count"] == 0, full_payload["data"]["output_review_adjudication"]
assert all(not item["expected_revealed"] for item in full_payload["data"]["output_review_adjudication"]["pairs"]), full_payload["data"]["output_review_adjudication"]
+ output_review_checklist = full_payload["data"]["output_review_adjudication"]["reviewer_checklist"]
+ assert len(output_review_checklist) == 5, output_review_checklist
+ assert all(not item["answer_key_visible"] for item in output_review_checklist), output_review_checklist
+ assert output_review_checklist[0]["commands"]["adjudicate"] == "python3 scripts/yao.py output-review", output_review_checklist[0]
assert full_payload["data"]["review_annotations"]["summary"]["annotation_count"] == 0, full_payload["data"]["review_annotations"]
assert full_payload["data"]["compiled_targets"]["summary"]["target_count"] >= 4, full_payload["data"]["compiled_targets"]
assert full_payload["data"]["compiled_targets"]["summary"]["block_count"] == 0, full_payload["data"]["compiled_targets"]
@@ -515,6 +522,12 @@ def main() -> None:
assert "执行证据" in html, html
assert "盲评包" in html, html[:5000]
assert "审定报告" in html, html
+ assert "评审清单" in html, html
+ assert "output-review-grid" in html, html
+ assert "awaiting-decision" in html, html
+ assert "答案隐藏" in html, html
+ assert "winner_variant" in html, html
+ assert "python3 scripts/yao.py output-review" in html, html
assert "答案揭示" in html, html
assert "答案隐藏" in html, html
assert "注册审计" in html, html[:3000]
diff --git a/tests/verify_yao_cli.py b/tests/verify_yao_cli.py
index 4904de21..422be677 100644
--- a/tests/verify_yao_cli.py
+++ b/tests/verify_yao_cli.py
@@ -615,6 +615,9 @@ def main() -> None:
assert output_review_result["ok"], output_review_result
assert output_review_result["payload"]["summary"]["judgment_count"] == 0, output_review_result
assert output_review_result["payload"]["summary"]["pending_count"] == 5, output_review_result
+ assert output_review_result["payload"]["summary"]["reviewer_checklist_count"] == 5, output_review_result
+ assert output_review_result["payload"]["summary"]["reviewer_checklist_pending_count"] == 5, output_review_result
+ assert all(not item["answer_key_visible"] for item in output_review_result["payload"]["reviewer_checklist"]), output_review_result
assert (created / "reports" / "output_review_adjudication.md").exists(), output_review_result
conformance_result = run("conformance", str(created))