feat: add output review kit

This commit is contained in:
yaojingang
2026-06-14 06:56:44 +08:00
parent ecdb16dd90
commit 0cf7f32e32
53 changed files with 1787 additions and 352 deletions
+4 -1
View File
@@ -2,7 +2,7 @@ PYTHON ?= python3
LOCAL_SKILL_INSTALL_DIR ?= $(HOME)/.agents/skills.disabled/yao-meta-skill
ACTIVE_SKILL_INSTALL_DIR ?= $(HOME)/.agents/skills/yao-meta-skill
.PHONY: eval eval-suite route-scorecard route-confusion-check description-optimization judge-blind-eval description-optimization-check promotion-check python-compat-check architecture-maintainability-check yao-cli-check skill-overview-check skill-report-metrics-check skill-report-charts-check skill-ir-check compiler-check output-eval-check output-execution-check output-review-adjudication-check runtime-conformance-check runtime-permission-check trust-check skill-atlas-check registry-audit-check package-verify-check install-simulation-check upgrade-check review-viewer-check review-studio-check skill-os2-audit-check skill-os2-coverage-check world-class-evidence-check world-class-ledger-check world-class-intake-check world-class-submission-review-check world-class-claim-guard-check benchmark-reproducibility-check feedback-check adoption-drift-check telemetry-import-check telemetry-emit-check telemetry-hooks-check telemetry-native-host-check review-waivers-check review-annotations-check baseline-compare-check reference-scan-check github-benchmark-scan-check intent-confidence-check reference-synthesis-check output-risk-profile-check artifact-design-profile-check prompt-quality-profile-check system-model-check iteration-directions-check description-drift-history iteration-ledger results-panel regression-history context-reports portability-report portability-check failure-regression-check package-check package-failure-check security-boundary-check local-install-sync-check snapshot-check validate lint governance-check resource-boundary-check quality-check sync-local-install sync-active-install test ci-test clean
.PHONY: eval eval-suite route-scorecard route-confusion-check description-optimization judge-blind-eval description-optimization-check promotion-check python-compat-check architecture-maintainability-check yao-cli-check skill-overview-check skill-report-metrics-check skill-report-charts-check skill-ir-check compiler-check output-eval-check output-execution-check output-review-kit-check output-review-adjudication-check runtime-conformance-check runtime-permission-check trust-check skill-atlas-check registry-audit-check package-verify-check install-simulation-check upgrade-check review-viewer-check review-studio-check skill-os2-audit-check skill-os2-coverage-check world-class-evidence-check world-class-ledger-check world-class-intake-check world-class-submission-review-check world-class-claim-guard-check benchmark-reproducibility-check feedback-check adoption-drift-check telemetry-import-check telemetry-emit-check telemetry-hooks-check telemetry-native-host-check review-waivers-check review-annotations-check baseline-compare-check reference-scan-check github-benchmark-scan-check intent-confidence-check reference-synthesis-check output-risk-profile-check artifact-design-profile-check prompt-quality-profile-check system-model-check iteration-directions-check description-drift-history iteration-ledger results-panel regression-history context-reports portability-report portability-check failure-regression-check package-check package-failure-check security-boundary-check local-install-sync-check snapshot-check validate lint governance-check resource-boundary-check quality-check sync-local-install sync-active-install test ci-test clean
eval:
$(PYTHON) scripts/trigger_eval.py --description-file evals/improved_description.txt --cases evals/trigger_cases.json --baseline-description-file evals/baseline_description.txt
@@ -58,6 +58,9 @@ output-eval-check:
output-execution-check:
$(PYTHON) tests/verify_output_execution_runs.py
output-review-kit-check:
$(PYTHON) tests/verify_output_review_kit.py
output-review-adjudication-check:
$(PYTHON) tests/verify_output_review_adjudication.py
+1 -1
View File
@@ -16,7 +16,7 @@
"vscode"
],
"package_metadata": "registry/packages/yao-meta-skill.json",
"package_sha256": "68a0228b56de8c9e9e94d64d7c1e386bf3dff55c0f6228b65f91e75d02525926"
"package_sha256": "33ca97e8df3e3c75228595ab8bd06d65c697ef708723a0a53637bd8f22bbcfda"
}
]
}
+1 -1
View File
@@ -16,7 +16,7 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "68a0228b56de8c9e9e94d64d7c1e386bf3dff55c0f6228b65f91e75d02525926",
"package_sha256": "33ca97e8df3e3c75228595ab8bd06d65c697ef708723a0a53637bd8f22bbcfda",
"archive_sha256": "cb1ac8c62bc5dee942a88f18eb5d71c93ae58f854ac19f3d912f9c9c3a4ec24e"
},
"compatibility": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"ok": true,
"schema_version": "2.0",
"generated_at": "2026-06-13T22:37:14Z",
"generated_at": "2026-06-13T22:55:26Z",
"skill_dir": ".",
"privacy_contract": {
"storage": "local-first",
+15 -15
View File
@@ -4,12 +4,12 @@
"generated_at": "2026-06-13",
"skill_dir": ".",
"summary": {
"python_file_count": 149,
"script_file_count": 92,
"test_file_count": 57,
"python_file_count": 151,
"script_file_count": 93,
"test_file_count": 58,
"internal_module_count": 19,
"cli_script_count": 74,
"command_handler_count": 33,
"cli_script_count": 75,
"command_handler_count": 34,
"warn_line_threshold": 900,
"block_line_threshold": 1500,
"largest_file_lines": 898,
@@ -27,21 +27,21 @@
},
{
"path": "tests/verify_yao_cli.py",
"lines": 891,
"lines": 893,
"kind": "test",
"severity": "pass",
"recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands."
},
{
"path": "scripts/yao.py",
"lines": 841,
"lines": 862,
"kind": "cli-script",
"severity": "pass",
"recommendation": "Split command handlers by domain while keeping scripts/yao.py as the thin CLI orchestrator."
},
{
"path": "scripts/skill_report_model.py",
"lines": 782,
"lines": 792,
"kind": "internal-module",
"severity": "pass",
"recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates."
@@ -53,6 +53,13 @@
"severity": "pass",
"recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates."
},
{
"path": "scripts/yao_cli_parser.py",
"lines": 726,
"kind": "internal-module",
"severity": "pass",
"recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates."
},
{
"path": "scripts/optimize_description.py",
"lines": 723,
@@ -67,13 +74,6 @@
"severity": "pass",
"recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates."
},
{
"path": "scripts/yao_cli_parser.py",
"lines": 714,
"kind": "internal-module",
"severity": "pass",
"recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates."
},
{
"path": "scripts/render_review_viewer.py",
"lines": 685,
+9 -9
View File
@@ -5,12 +5,12 @@ Generated at: `2026-06-13`
## Summary
- decision: `pass`
- python files: `149`
- scripts: `92`
- tests: `57`
- python files: `151`
- scripts: `93`
- tests: `58`
- internal modules: `19`
- CLI scripts: `74`
- Yao CLI command handlers: `33`
- CLI scripts: `75`
- Yao CLI command handlers: `34`
- largest file lines: `898`
- hotspots: `0`
- blockers: `0`
@@ -26,13 +26,13 @@ No file-size hotspots found.
| File | Lines | Kind | Severity |
| --- | ---: | --- | --- |
| `scripts/render_review_studio.py` | `898` | `cli-script` | `pass` |
| `tests/verify_yao_cli.py` | `891` | `test` | `pass` |
| `scripts/yao.py` | `841` | `cli-script` | `pass` |
| `scripts/skill_report_model.py` | `782` | `internal-module` | `pass` |
| `tests/verify_yao_cli.py` | `893` | `test` | `pass` |
| `scripts/yao.py` | `862` | `cli-script` | `pass` |
| `scripts/skill_report_model.py` | `792` | `internal-module` | `pass` |
| `scripts/compile_skill.py` | `734` | `cli-script` | `pass` |
| `scripts/yao_cli_parser.py` | `726` | `internal-module` | `pass` |
| `scripts/optimize_description.py` | `723` | `cli-script` | `pass` |
| `scripts/trust_check.py` | `714` | `internal-module` | `pass` |
| `scripts/yao_cli_parser.py` | `714` | `internal-module` | `pass` |
| `scripts/render_review_viewer.py` | `685` | `cli-script` | `pass` |
| `scripts/build_skill_atlas.py` | `674` | `cli-script` | `pass` |
| `scripts/skill_report_layout.py` | `653` | `internal-module` | `pass` |
+25 -25
View File
@@ -3,16 +3,13 @@
"ok": true,
"generated_at": "2026-06-14",
"skill_dir": ".",
"commit": "30539bed7a29dd88c2f289dd0c115da9834dd5d9",
"commit": "ecdb16dd90025bcca3051be4c6a1b5b723c7ec75",
"git_status": {
"available": true,
"dirty": true,
"changed_file_count": 60,
"changed_file_count": 59,
"sample": [
" M AGENTS.md",
" M Makefile",
" M README.md",
" M evidence/world_class/README.md",
" M registry/index.json",
" M registry/packages/yao-meta-skill.json",
" M reports/adoption_drift_report.json",
@@ -20,7 +17,10 @@
" M reports/architecture_maintainability.json",
" M reports/architecture_maintainability.md",
" M reports/benchmark_reproducibility.json",
" M reports/benchmark_reproducibility.md"
" M reports/benchmark_reproducibility.md",
" M reports/compiled_targets.json",
" M reports/context_budget.json",
" M reports/install_simulation.json"
]
},
"summary": {
@@ -42,7 +42,7 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
"changed_file_count": 60
"changed_file_count": 59
},
"methodology": {
"path": "reports/benchmark_methodology.md",
@@ -116,7 +116,7 @@
"path": "reports/output_execution_runs.json",
"exists": true,
"bytes": 7967,
"sha256": "34fa0a084b7537cca412b4bbea4018639ceac9e98ddf83a6d25ee2dc7f7dbe4f"
"sha256": "b86a205e0eee68676a822c4f818b5ea0496c381c783043832be72050d5a1e716"
},
{
"label": "blind_review",
@@ -129,8 +129,8 @@
"label": "review_adjudication",
"path": "reports/output_review_adjudication.json",
"exists": true,
"bytes": 9125,
"sha256": "5765254c430947c7e2b05883831d7db0b886d607b59f9a8a2602dcfa925f400b"
"bytes": 9495,
"sha256": "240485a721af49d5c75fe8049e9ef74b50546f685aa6346ab9e20713fb1105f4"
},
{
"label": "trigger_scorecard",
@@ -150,22 +150,22 @@
"label": "trust_report",
"path": "reports/security_trust_report.json",
"exists": true,
"bytes": 94809,
"sha256": "1d256935f965a265ae5c60e8600a081db8aebe1fdeff7068c5d08fb521fe653b"
"bytes": 95873,
"sha256": "6205af0ad3c9980eab785d7644832b1ca804d898eebcf993cced83c23b256fa4"
},
{
"label": "python_compatibility",
"path": "reports/python_compatibility.json",
"exists": true,
"bytes": 19840,
"sha256": "9b8f5b17fe2711b17557366edda49a89bbf2e378576de52d7de798137dc8a421"
"bytes": 20093,
"sha256": "e5dd973d0b5c78c5e40d52727939134b8167d742cb90bea2141744c0f7d5fa33"
},
{
"label": "registry_audit",
"path": "reports/registry_audit.json",
"exists": true,
"bytes": 3183,
"sha256": "c3ae3224b9339aec1e01e695835aa14113bf23979100eda2099fa9609e841c17"
"sha256": "daedc9b8047e2926221f39209d0751dac67b160c2c68fded0fcca796d9727144"
},
{
"label": "package_verification",
@@ -179,42 +179,42 @@
"path": "reports/install_simulation.json",
"exists": true,
"bytes": 8758,
"sha256": "465f407ccc808169f5380550161f481ab8f0fbc20ef9ab170814fb703b05fe3b"
"sha256": "3c9306b5b1221f5951f69598c8e7104557ea17635f11c42b8b52a37cae6d22a2"
},
{
"label": "skill_os2_audit",
"path": "reports/skill_os2_audit.json",
"exists": true,
"bytes": 13946,
"sha256": "340c10df7350d74cbfe3fd77461ce2cbab201198fd93fd276e7273eb6f6222e7"
"sha256": "9c22f67024a63d8646c2306ef642e06848bb443adde690e2f97573024e3a636b"
},
{
"label": "world_class_evidence_plan",
"path": "reports/world_class_evidence_plan.json",
"exists": true,
"bytes": 9532,
"sha256": "ed1274b7c18cac9e683bb4a24a5ed8039d1eb582d676f0fc26cc3a33e5371a67"
"bytes": 9634,
"sha256": "7ff33ae06f00247f97fa85ca3268aaa61f672aebba75ac96fc3d932b4997daa2"
},
{
"label": "world_class_evidence_ledger",
"path": "reports/world_class_evidence_ledger.json",
"exists": true,
"bytes": 10750,
"sha256": "e6dfdb22dc9f54255c1d4b42d36c035ffafbca4fe1d1bc6569c5e8262443f257"
"bytes": 10790,
"sha256": "2e2dc29095a05d481353fec00f5b87c3381c81ba9661fb36b03496d5e5db325e"
},
{
"label": "world_class_evidence_intake",
"path": "reports/world_class_evidence_intake.json",
"exists": true,
"bytes": 12369,
"sha256": "465f8d915a869ad536c2d71ba26dc536b82ba64e6e98013e8dbd0efd1bb92883"
"bytes": 12411,
"sha256": "10ac53e66486505ff1646f5616ffa334c0e2a2ac99d9d54cf6222d2ee3868063"
},
{
"label": "world_class_claim_guard",
"path": "reports/world_class_claim_guard.json",
"exists": true,
"bytes": 8093,
"sha256": "24396b9ecb4351cb9e3dff3d69b83bb940bf1507387a086cb0a08ca8cfdfa618"
"bytes": 8179,
"sha256": "299a88eb7b47d16761d66980e01ccd8164609e344c3c98bb0b8a67b56cf68edd"
}
],
"missing_artifacts": [],
+13 -13
View File
@@ -1,7 +1,7 @@
# Benchmark Reproducibility
Generated at: `2026-06-14`
Commit: `30539bed7a29dd88c2f289dd0c115da9834dd5d9`
Commit: `ecdb16dd90025bcca3051be4c6a1b5b723c7ec75`
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: `60`
- changed files at generation: `59`
This report proves local benchmark reproducibility only. It keeps external provider and human-review gaps visible instead of counting them as complete.
@@ -40,21 +40,21 @@ 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 | `34fa0a084b75` |
| output_execution | `reports/output_execution_runs.json` | present | `b86a205e0eee` |
| blind_review | `reports/output_blind_review_pack.json` | present | `bbe2db8ec277` |
| review_adjudication | `reports/output_review_adjudication.json` | present | `5765254c4309` |
| review_adjudication | `reports/output_review_adjudication.json` | present | `240485a721af` |
| trigger_scorecard | `reports/route_scorecard.json` | present | `c164e83e36d0` |
| runtime_conformance | `reports/conformance_matrix.json` | present | `8251329e663d` |
| trust_report | `reports/security_trust_report.json` | present | `1d256935f965` |
| python_compatibility | `reports/python_compatibility.json` | present | `9b8f5b17fe27` |
| registry_audit | `reports/registry_audit.json` | present | `c3ae3224b933` |
| trust_report | `reports/security_trust_report.json` | present | `6205af0ad3c9` |
| python_compatibility | `reports/python_compatibility.json` | present | `e5dd973d0b5c` |
| registry_audit | `reports/registry_audit.json` | present | `daedc9b8047e` |
| package_verification | `reports/package_verification.json` | present | `89dbb682f4a4` |
| install_simulation | `reports/install_simulation.json` | present | `465f407ccc80` |
| skill_os2_audit | `reports/skill_os2_audit.json` | present | `340c10df7350` |
| world_class_evidence_plan | `reports/world_class_evidence_plan.json` | present | `ed1274b7c18c` |
| world_class_evidence_ledger | `reports/world_class_evidence_ledger.json` | present | `e6dfdb22dc9f` |
| world_class_evidence_intake | `reports/world_class_evidence_intake.json` | present | `465f8d915a86` |
| world_class_claim_guard | `reports/world_class_claim_guard.json` | present | `24396b9ecb43` |
| install_simulation | `reports/install_simulation.json` | present | `3c9306b5b122` |
| skill_os2_audit | `reports/skill_os2_audit.json` | present | `9c22f67024a6` |
| world_class_evidence_plan | `reports/world_class_evidence_plan.json` | present | `7ff33ae06f00` |
| world_class_evidence_ledger | `reports/world_class_evidence_ledger.json` | present | `2e2dc29095a0` |
| world_class_evidence_intake | `reports/world_class_evidence_intake.json` | present | `10ac53e66486` |
| world_class_claim_guard | `reports/world_class_claim_guard.json` | present | `299a88eb7b47` |
## Reproduction Commands
+60 -50
View File
@@ -166,6 +166,7 @@
"scripts/lint_skill.py",
"scripts/local_output_eval_runner.py",
"scripts/optimize_description.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -223,8 +224,7 @@
"scripts/skill_report_layout.py",
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py"
"scripts/sync_local_install.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -383,7 +383,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -399,6 +399,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -485,14 +486,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -514,7 +515,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -627,7 +628,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -643,6 +644,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -729,14 +731,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -756,7 +758,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -1011,6 +1013,7 @@
"scripts/lint_skill.py",
"scripts/local_output_eval_runner.py",
"scripts/optimize_description.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -1068,8 +1071,7 @@
"scripts/skill_report_layout.py",
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py"
"scripts/sync_local_install.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -1228,7 +1230,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -1244,6 +1246,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -1330,14 +1333,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -1359,7 +1362,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -1472,7 +1475,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -1488,6 +1491,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -1574,14 +1578,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -1601,7 +1605,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -1856,6 +1860,7 @@
"scripts/lint_skill.py",
"scripts/local_output_eval_runner.py",
"scripts/optimize_description.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -1913,8 +1918,7 @@
"scripts/skill_report_layout.py",
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py"
"scripts/sync_local_install.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -2073,7 +2077,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -2089,6 +2093,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -2175,14 +2180,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -2204,7 +2209,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -2310,7 +2315,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -2326,6 +2331,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -2412,14 +2418,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -2439,7 +2445,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -2685,6 +2691,7 @@
"scripts/lint_skill.py",
"scripts/local_output_eval_runner.py",
"scripts/optimize_description.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -2742,8 +2749,7 @@
"scripts/skill_report_layout.py",
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py"
"scripts/sync_local_install.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -2902,7 +2908,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -2918,6 +2924,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -3004,14 +3011,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -3033,7 +3040,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -3139,7 +3146,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -3155,6 +3162,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -3241,14 +3249,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -3268,7 +3276,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -3514,6 +3522,7 @@
"scripts/lint_skill.py",
"scripts/local_output_eval_runner.py",
"scripts/optimize_description.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -3571,8 +3580,7 @@
"scripts/skill_report_layout.py",
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py"
"scripts/sync_local_install.py"
],
"assets": [
"templates/basic_skill.md.j2",
@@ -3731,7 +3739,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -3747,6 +3755,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -3833,14 +3842,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -3862,7 +3871,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
@@ -3972,7 +3981,7 @@
},
"file_write": {
"required": true,
"script_count": 62,
"script_count": 63,
"scripts": [
"scripts/adjudicate_output_review.py",
"scripts/build_confusion_matrix.py",
@@ -3988,6 +3997,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -4074,14 +4084,14 @@
},
"help_smoke": {
"enabled": true,
"checked_count": 75,
"checked_count": 76,
"failed_count": 0,
"failed_scripts": []
},
"trust_summary": {
"secret_findings": 0,
"network_script_count": 3,
"file_write_script_count": 62,
"file_write_script_count": 63,
"subprocess_script_count": 9,
"interactive_script_count": 0,
"help_smoke_failed_count": 0
@@ -4101,7 +4111,7 @@
],
"capability_counts": {
"network": 3,
"file_write": 62,
"file_write": 63,
"subprocess": 9,
"interactive": 0
},
+3 -3
View File
@@ -6,10 +6,10 @@
"context_budget_tier": "production",
"context_budget_limit": 1000,
"skill_body_tokens": 751,
"other_text_tokens": 1129811,
"other_text_tokens": 1145183,
"estimated_initial_load_tokens": 944,
"estimated_total_text_tokens": 1130562,
"relevant_file_count": 484,
"estimated_total_text_tokens": 1145934,
"relevant_file_count": 490,
"unused_resource_dirs": [],
"quality_signal_points": 130,
"quality_density": 137.7
+1 -1
View File
@@ -8,7 +8,7 @@
"installed_skill_dir": "tests/tmp_review_studio/install-root/simulate-yao-meta-skill/yao-meta-skill",
"summary": {
"archive_present": true,
"archive_entry_count": 563,
"archive_entry_count": 567,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
+10 -10
View File
@@ -34,7 +34,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 27.77,
"duration_ms": 27.61,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -62,7 +62,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.86,
"duration_ms": 26.83,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -85,7 +85,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.67,
"duration_ms": 28.0,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -113,7 +113,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.37,
"duration_ms": 28.5,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -136,7 +136,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.7,
"duration_ms": 28.58,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -164,7 +164,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 27.96,
"duration_ms": 28.82,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -187,7 +187,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.07,
"duration_ms": 28.41,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -214,7 +214,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.42,
"duration_ms": 28.26,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -237,7 +237,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.64,
"duration_ms": 28.37,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
@@ -266,7 +266,7 @@
"execution_mode": "command",
"model_executed": false,
"command_executed": true,
"duration_ms": 28.43,
"duration_ms": 29.97,
"provider": "local-output-eval-runner",
"model": "",
"usage": {
+10 -10
View File
@@ -23,16 +23,16 @@ Command runner evidence is present. This proves the eval harness executed an ext
| Case | Variant | Mode | Model | Duration ms | Tokens | Score | Status |
| --- | --- | --- | --- | ---: | ---: | ---: | --- |
| skill-package-contract | baseline | command | local-output-eval-runner | 27.77 | 33 | 0.0 | pass |
| skill-package-contract | with_skill | command | local-output-eval-runner | 28.86 | 73 | 100.0 | pass |
| output-eval-expectation | baseline | command | local-output-eval-runner | 28.67 | 36 | 0.0 | pass |
| output-eval-expectation | with_skill | command | local-output-eval-runner | 28.37 | 80 | 100.0 | pass |
| ir-before-packaging | baseline | command | local-output-eval-runner | 28.7 | 33 | 0.0 | pass |
| ir-before-packaging | with_skill | command | local-output-eval-runner | 27.96 | 80 | 100.0 | pass |
| near-neighbor-boundary | baseline | command | local-output-eval-runner | 28.07 | 36 | 0.0 | pass |
| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 28.42 | 65 | 100.0 | pass |
| file-backed-governed-package | baseline | command | local-output-eval-runner | 28.64 | 37 | 0.0 | pass |
| file-backed-governed-package | with_skill | command | local-output-eval-runner | 28.43 | 98 | 100.0 | pass |
| skill-package-contract | baseline | command | local-output-eval-runner | 27.61 | 33 | 0.0 | pass |
| skill-package-contract | with_skill | command | local-output-eval-runner | 26.83 | 73 | 100.0 | pass |
| output-eval-expectation | baseline | command | local-output-eval-runner | 28.0 | 36 | 0.0 | pass |
| output-eval-expectation | with_skill | command | local-output-eval-runner | 28.5 | 80 | 100.0 | pass |
| ir-before-packaging | baseline | command | local-output-eval-runner | 28.58 | 33 | 0.0 | pass |
| ir-before-packaging | with_skill | command | local-output-eval-runner | 28.82 | 80 | 100.0 | pass |
| near-neighbor-boundary | baseline | command | local-output-eval-runner | 28.41 | 36 | 0.0 | pass |
| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 28.26 | 65 | 100.0 | pass |
| file-backed-governed-package | baseline | command | local-output-eval-runner | 28.37 | 37 | 0.0 | pass |
| file-backed-governed-package | with_skill | command | local-output-eval-runner | 29.97 | 98 | 100.0 | pass |
## Next Fixes
+5
View File
@@ -92,6 +92,7 @@
"blind_pack_path": "reports/output_blind_review_pack.json",
"decisions_path": "reports/output_review_decisions.json",
"commands": {
"prepare_review_kit": "python3 scripts/yao.py output-review-kit",
"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 ."
@@ -118,6 +119,7 @@
"blind_pack_path": "reports/output_blind_review_pack.json",
"decisions_path": "reports/output_review_decisions.json",
"commands": {
"prepare_review_kit": "python3 scripts/yao.py output-review-kit",
"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 ."
@@ -144,6 +146,7 @@
"blind_pack_path": "reports/output_blind_review_pack.json",
"decisions_path": "reports/output_review_decisions.json",
"commands": {
"prepare_review_kit": "python3 scripts/yao.py output-review-kit",
"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 ."
@@ -170,6 +173,7 @@
"blind_pack_path": "reports/output_blind_review_pack.json",
"decisions_path": "reports/output_review_decisions.json",
"commands": {
"prepare_review_kit": "python3 scripts/yao.py output-review-kit",
"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 ."
@@ -196,6 +200,7 @@
"blind_pack_path": "reports/output_blind_review_pack.json",
"decisions_path": "reports/output_review_decisions.json",
"commands": {
"prepare_review_kit": "python3 scripts/yao.py output-review-kit",
"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 ."
+5
View File
@@ -46,6 +46,7 @@ Expected winners stay hidden until a valid reviewer decision is recorded.
#### Commands
- prepare_review_kit: `python3 scripts/yao.py output-review-kit`
- 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 .`
@@ -72,6 +73,7 @@ Expected winners stay hidden until a valid reviewer decision is recorded.
#### Commands
- prepare_review_kit: `python3 scripts/yao.py output-review-kit`
- 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 .`
@@ -98,6 +100,7 @@ Expected winners stay hidden until a valid reviewer decision is recorded.
#### Commands
- prepare_review_kit: `python3 scripts/yao.py output-review-kit`
- 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 .`
@@ -124,6 +127,7 @@ Expected winners stay hidden until a valid reviewer decision is recorded.
#### Commands
- prepare_review_kit: `python3 scripts/yao.py output-review-kit`
- 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 .`
@@ -150,6 +154,7 @@ Expected winners stay hidden until a valid reviewer decision is recorded.
#### Commands
- prepare_review_kit: `python3 scripts/yao.py output-review-kit`
- 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 .`
+267
View File
@@ -0,0 +1,267 @@
{
"schema_version": "1.0",
"ok": true,
"summary": {
"case_count": 5,
"ready_for_adjudication_count": 0,
"pending_decision_count": 5,
"invalid_decision_count": 0,
"reviewer_metadata_present": false,
"answer_key_hidden": true,
"answer_key_path_exposed": false,
"ready_to_run_adjudication": false,
"failure_count": 0
},
"artifacts": {
"reviewer_kit_json": "reports/output_review_kit.json",
"reviewer_kit_markdown": "reports/output_review_kit.md",
"blind_pack_json": "reports/output_blind_review_pack.json",
"blind_pack_markdown": "reports/output_blind_review_pack.md",
"decisions": "reports/output_review_decisions.json",
"adjudication_json": "reports/output_review_adjudication.json",
"adjudication_markdown": "reports/output_review_adjudication.md"
},
"template_written": false,
"review_contract": {
"reviewer_steps": [
"Open reports/output_blind_review_pack.md or this kit and compare Variant A vs Variant B for each case.",
"Record choices in reports/output_review_decisions.json without opening the answer key.",
"Use winner_variant A or B, confidence from 0 to 1, and a short reason for every case.",
"Run python3 scripts/yao.py output-review after choices are recorded.",
"Refresh python3 scripts/yao.py review-studio . before asking for release approval."
],
"required_fields": {
"reviewer": "Human reviewer name or review group.",
"reviewed_at": "Review date or timestamp.",
"winner_variant": "A or B for every case.",
"confidence": "Optional numeric confidence from 0 to 1.",
"reason": "Short rationale based on the rubric, not on hidden labels."
},
"privacy_contract": [
"The answer key is intentionally withheld from this kit.",
"Do not inspect hidden labels or expected winners before decisions are recorded.",
"Do not paste private user data into decision reasons.",
"Pending decisions must stay pending instead of being counted as human agreement."
]
},
"cases": [
{
"case_id": "skill-package-contract",
"prompt": "Turn this repeated workflow into a reusable team skill package.",
"input_files": [],
"review_instruction": "Pick A or B based only on the rubric. Do not infer which output came from the skill.",
"rubric": [
{
"id": "has-entrypoint",
"description": "Output names the routeable Skill entrypoint.",
"weight": 1.0
},
{
"id": "has-interface",
"description": "Output includes neutral interface metadata.",
"weight": 1.0
},
{
"id": "has-report",
"description": "Output points reviewer to generated overview report.",
"weight": 1.0
},
{
"id": "has-resource-boundary",
"description": "Output preserves entrypoint/resource separation.",
"weight": 1.0
}
],
"variant_a": {
"blind_id": "skill-package-contract:A",
"output": "Create a routeable SKILL.md, agents/interface.yaml, reports/skill-overview.html, and a focused eval plan. Keep the root entrypoint lean, move durable guidance into references/, scripts into scripts/, and evidence into reports/."
},
"variant_b": {
"blind_id": "skill-package-contract:B",
"output": "I can write a prompt for that workflow and include a short checklist."
},
"decision_state": {
"status": "awaiting-decision",
"winner_variant_recorded": false,
"confidence_recorded": false,
"reason_recorded": false,
"blocking_reason": "Decision template exists but this row is still blank."
}
},
{
"case_id": "output-eval-expectation",
"prompt": "Upgrade this production skill so we know whether the generated output is better than baseline.",
"input_files": [],
"review_instruction": "Pick A or B based only on the rubric. Do not infer which output came from the skill.",
"rubric": [
{
"id": "has-baseline-comparison",
"description": "Output explicitly compares with-skill and baseline outputs.",
"weight": 1.0
},
{
"id": "has-assertion-grading",
"description": "Output includes objective assertion grading.",
"weight": 1.0
},
{
"id": "has-scorecard",
"description": "Output produces a scorecard report path.",
"weight": 1.0
},
{
"id": "has-failure-taxonomy",
"description": "Output records failure taxonomy.",
"weight": 1.0
}
],
"variant_a": {
"blind_id": "output-eval-expectation:A",
"output": "Add Output Eval Lab cases with baseline_output and with_skill_output, run assertion grading, report with-skill vs baseline pass-rate delta, and record failure taxonomy plus next fixes in reports/output_quality_scorecard.md."
},
"variant_b": {
"blind_id": "output-eval-expectation:B",
"output": "Add more examples and run the trigger eval again."
},
"decision_state": {
"status": "awaiting-decision",
"winner_variant_recorded": false,
"confidence_recorded": false,
"reason_recorded": false,
"blocking_reason": "Decision template exists but this row is still blank."
}
},
{
"case_id": "ir-before-packaging",
"prompt": "Package this skill for OpenAI, Claude, Agent Skills, and generic targets.",
"input_files": [],
"review_instruction": "Pick A or B based only on the rubric. Do not infer which output came from the skill.",
"rubric": [
{
"id": "has-ir-first",
"description": "Output requires Skill IR before packaging.",
"weight": 1.0
},
{
"id": "has-core-ir-fields",
"description": "Output lists core IR contract fields.",
"weight": 1.0
},
{
"id": "has-targets",
"description": "Output names requested runtime targets.",
"weight": 1.0
},
{
"id": "has-semantic-preservation",
"description": "Output says targets must preserve the capability contract.",
"weight": 1.0
}
],
"variant_a": {
"blind_id": "ir-before-packaging:A",
"output": "Export folders for each platform and adjust files as needed."
},
"variant_b": {
"blind_id": "ir-before-packaging:B",
"output": "Export Skill IR first with job_to_be_done, trigger_surface, workflow, resources, eval_plan, risk, and governance. Then compile or package targets from the IR so OpenAI, Claude, Agent Skills, and generic packages preserve the same capability contract."
},
"decision_state": {
"status": "awaiting-decision",
"winner_variant_recorded": false,
"confidence_recorded": false,
"reason_recorded": false,
"blocking_reason": "Decision template exists but this row is still blank."
}
},
{
"case_id": "near-neighbor-boundary",
"prompt": "I only need a one-off summary of these notes, not a reusable process.",
"input_files": [],
"review_instruction": "Pick A or B based only on the rubric. Do not infer which output came from the skill.",
"rubric": [
{
"id": "declines-skill",
"description": "Output refuses unnecessary skill creation for one-off work.",
"weight": 1.0
},
{
"id": "names-near-neighbor",
"description": "Output labels the request as near-neighbor instead of owned work.",
"weight": 1.0
},
{
"id": "requires-reuse-signal",
"description": "Output asks for repeat-use evidence before packaging.",
"weight": 1.0
}
],
"variant_a": {
"blind_id": "near-neighbor-boundary:A",
"output": "Create a SKILL.md and a reusable workflow anyway so future notes can use it."
},
"variant_b": {
"blind_id": "near-neighbor-boundary:B",
"output": "Do not create a skill for this one-off request. Treat it as a near-neighbor: answer the summary directly unless the user confirms repeated use, shared ownership, or a reusable output contract."
},
"decision_state": {
"status": "awaiting-decision",
"winner_variant_recorded": false,
"confidence_recorded": false,
"reason_recorded": false,
"blocking_reason": "Decision template exists but this row is still blank."
}
},
{
"case_id": "file-backed-governed-package",
"prompt": "Turn the attached release brief source into a governed skill package.",
"input_files": [
"fixtures/release-brief-source.md"
],
"review_instruction": "Pick A or B based only on the rubric. Do not infer which output came from the skill.",
"rubric": [
{
"id": "uses-file-backed-evidence",
"description": "Output names file-backed source evidence.",
"weight": 1.0
},
{
"id": "has-governance",
"description": "Output preserves governed ownership metadata.",
"weight": 1.0
},
{
"id": "has-output-contract",
"description": "Output preserves output and rollback boundaries.",
"weight": 1.0
},
{
"id": "has-trust-and-scorecard",
"description": "Output requires trust and output scorecard artifacts.",
"weight": 1.0
},
{
"id": "does-not-invent-evidence",
"description": "Output forbids invented launch evidence.",
"weight": 1.0
}
],
"variant_a": {
"blind_id": "file-backed-governed-package:A",
"output": "Draft a release announcement with the changelog, support notes, and owner name."
},
"variant_b": {
"blind_id": "file-backed-governed-package:B",
"output": "Use the file-backed fixture as source evidence, then create a governed skill package with SKILL.md, agents/interface.yaml, owner, review cadence, input_files, output contract, rollback boundary, trust report, and reports/output_quality_scorecard.md. Mark missing launch metrics as missing evidence instead of inventing them."
},
"decision_state": {
"status": "awaiting-decision",
"winner_variant_recorded": false,
"confidence_recorded": false,
"reason_recorded": false,
"blocking_reason": "Decision template exists but this row is still blank."
}
}
],
"failures": []
}
+138
View File
@@ -0,0 +1,138 @@
# Output Review Kit
This reviewer-facing packet contains the blind A/B cases, decision fields, and command flow. It intentionally does not expose the answer key.
## Summary
- cases: `5`
- ready for adjudication: `0`
- pending decisions: `5`
- invalid decisions: `0`
- reviewer metadata present: `false`
- answer key hidden: `true`
- answer key path exposed: `false`
## Review Flow
1. Open reports/output_blind_review_pack.md or this kit and compare Variant A vs Variant B for each case.
2. Record choices in reports/output_review_decisions.json without opening the answer key.
3. Use winner_variant A or B, confidence from 0 to 1, and a short reason for every case.
4. Run python3 scripts/yao.py output-review after choices are recorded.
5. Refresh python3 scripts/yao.py review-studio . before asking for release approval.
## Required Fields
- `reviewer`: Human reviewer name or review group.
- `reviewed_at`: Review date or timestamp.
- `winner_variant`: A or B for every case.
- `confidence`: Optional numeric confidence from 0 to 1.
- `reason`: Short rationale based on the rubric, not on hidden labels.
## Privacy Contract
- The answer key is intentionally withheld from this kit.
- Do not inspect hidden labels or expected winners before decisions are recorded.
- Do not paste private user data into decision reasons.
- Pending decisions must stay pending instead of being counted as human agreement.
## Decision States
| Case | State | Winner | Confidence | Reason | Blocking Reason |
| --- | --- | --- | --- | --- | --- |
| `skill-package-contract` | `awaiting-decision` | `false` | `false` | `false` | Decision template exists but this row is still blank. |
| `output-eval-expectation` | `awaiting-decision` | `false` | `false` | `false` | Decision template exists but this row is still blank. |
| `ir-before-packaging` | `awaiting-decision` | `false` | `false` | `false` | Decision template exists but this row is still blank. |
| `near-neighbor-boundary` | `awaiting-decision` | `false` | `false` | `false` | Decision template exists but this row is still blank. |
| `file-backed-governed-package` | `awaiting-decision` | `false` | `false` | `false` | Decision template exists but this row is still blank. |
## Blind Cases
### skill-package-contract
Prompt: Turn this repeated workflow into a reusable team skill package.
Rubric:
- `has-entrypoint` (1.0): Output names the routeable Skill entrypoint.
- `has-interface` (1.0): Output includes neutral interface metadata.
- `has-report` (1.0): Output points reviewer to generated overview report.
- `has-resource-boundary` (1.0): Output preserves entrypoint/resource separation.
#### Variant A
Create a routeable SKILL.md, agents/interface.yaml, reports/skill-overview.html, and a focused eval plan. Keep the root entrypoint lean, move durable guidance into references/, scripts into scripts/, and evidence into reports/.
#### Variant B
I can write a prompt for that workflow and include a short checklist.
### output-eval-expectation
Prompt: Upgrade this production skill so we know whether the generated output is better than baseline.
Rubric:
- `has-baseline-comparison` (1.0): Output explicitly compares with-skill and baseline outputs.
- `has-assertion-grading` (1.0): Output includes objective assertion grading.
- `has-scorecard` (1.0): Output produces a scorecard report path.
- `has-failure-taxonomy` (1.0): Output records failure taxonomy.
#### Variant A
Add Output Eval Lab cases with baseline_output and with_skill_output, run assertion grading, report with-skill vs baseline pass-rate delta, and record failure taxonomy plus next fixes in reports/output_quality_scorecard.md.
#### Variant B
Add more examples and run the trigger eval again.
### ir-before-packaging
Prompt: Package this skill for OpenAI, Claude, Agent Skills, and generic targets.
Rubric:
- `has-ir-first` (1.0): Output requires Skill IR before packaging.
- `has-core-ir-fields` (1.0): Output lists core IR contract fields.
- `has-targets` (1.0): Output names requested runtime targets.
- `has-semantic-preservation` (1.0): Output says targets must preserve the capability contract.
#### Variant A
Export folders for each platform and adjust files as needed.
#### Variant B
Export Skill IR first with job_to_be_done, trigger_surface, workflow, resources, eval_plan, risk, and governance. Then compile or package targets from the IR so OpenAI, Claude, Agent Skills, and generic packages preserve the same capability contract.
### near-neighbor-boundary
Prompt: I only need a one-off summary of these notes, not a reusable process.
Rubric:
- `declines-skill` (1.0): Output refuses unnecessary skill creation for one-off work.
- `names-near-neighbor` (1.0): Output labels the request as near-neighbor instead of owned work.
- `requires-reuse-signal` (1.0): Output asks for repeat-use evidence before packaging.
#### Variant A
Create a SKILL.md and a reusable workflow anyway so future notes can use it.
#### Variant B
Do not create a skill for this one-off request. Treat it as a near-neighbor: answer the summary directly unless the user confirms repeated use, shared ownership, or a reusable output contract.
### file-backed-governed-package
Prompt: Turn the attached release brief source into a governed skill package.
Rubric:
- `uses-file-backed-evidence` (1.0): Output names file-backed source evidence.
- `has-governance` (1.0): Output preserves governed ownership metadata.
- `has-output-contract` (1.0): Output preserves output and rollback boundaries.
- `has-trust-and-scorecard` (1.0): Output requires trust and output scorecard artifacts.
- `does-not-invent-evidence` (1.0): Output forbids invented launch evidence.
#### Variant A
Draft a release announcement with the changelog, support notes, and owner name.
#### Variant B
Use the file-backed fixture as source evidence, then create a governed skill package with SKILL.md, agents/interface.yaml, owner, review cadence, input_files, output contract, rollback boundary, trust report, and reports/output_quality_scorecard.md. Mark missing launch metrics as missing evidence instead of inventing them.
+13 -1
View File
@@ -5,7 +5,7 @@
"root": ".",
"summary": {
"target_python": "3.11",
"file_count": 152,
"file_count": 154,
"issue_count": 0,
"syntax_error_count": 0,
"fstring_311_violation_count": 0,
@@ -166,6 +166,12 @@
"issue_count": 0,
"issues": []
},
{
"path": "scripts/prepare_output_review_kit.py",
"ok": true,
"issue_count": 0,
"issues": []
},
{
"path": "scripts/prepare_world_class_submission_kit.py",
"ok": true,
@@ -706,6 +712,12 @@
"issue_count": 0,
"issues": []
},
{
"path": "tests/verify_output_review_kit.py",
"ok": true,
"issue_count": 0,
"issues": []
},
{
"path": "tests/verify_output_risk_profile.py",
"ok": true,
+1 -1
View File
@@ -6,7 +6,7 @@ Generated at: `2026-06-13`
- decision: `pass`
- target python: `3.11`
- files scanned: `152`
- files scanned: `154`
- issues: `0`
- syntax errors: `0`
- f-string 3.11 violations: `0`
+2 -2
View File
@@ -21,7 +21,7 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "68a0228b56de8c9e9e94d64d7c1e386bf3dff55c0f6228b65f91e75d02525926",
"package_sha256": "33ca97e8df3e3c75228595ab8bd06d65c697ef708723a0a53637bd8f22bbcfda",
"archive_sha256": "cb1ac8c62bc5dee942a88f18eb5d71c93ae58f854ac19f3d912f9c9c3a4ec24e"
},
"compatibility": {
@@ -78,7 +78,7 @@
"vscode"
],
"package_metadata": "registry/packages/yao-meta-skill.json",
"package_sha256": "68a0228b56de8c9e9e94d64d7c1e386bf3dff55c0f6228b65f91e75d02525926"
"package_sha256": "33ca97e8df3e3c75228595ab8bd06d65c697ef708723a0a53637bd8f22bbcfda"
}
]
},
+1 -1
View File
@@ -6,7 +6,7 @@
- Maturity: `governed`
- Owner: `Yao Team`
- License: `MIT`
- Package SHA256: `68a0228b56de8c9e9e94d64d7c1e386bf3dff55c0f6228b65f91e75d02525926`
- Package SHA256: `33ca97e8df3e3c75228595ab8bd06d65c697ef708723a0a53637bd8f22bbcfda`
- Archive SHA256: `cb1ac8c62bc5dee942a88f18eb5d71c93ae58f854ac19f3d912f9c9c3a4ec24e`
- Install simulated: `True`
File diff suppressed because one or more lines are too long
+495 -143
View File
File diff suppressed because it is too large Load Diff
+34 -9
View File
@@ -2,8 +2,8 @@
"ok": true,
"skill_dir": ".",
"summary": {
"scanned_files": 176,
"script_count": 92,
"scanned_files": 177,
"script_count": 93,
"internal_module_count": 17,
"secret_findings": 0,
"dependency_files": [
@@ -12,18 +12,18 @@
"network_script_count": 3,
"network_policy_covered_count": 3,
"network_policy_missing_count": 0,
"file_write_script_count": 62,
"file_write_script_count": 63,
"permission_required_count": 3,
"permission_approved_count": 3,
"permission_missing_count": 0,
"permission_invalid_count": 0,
"permission_expired_count": 0,
"help_smoke_checked_count": 75,
"help_smoke_checked_count": 76,
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 176,
"package_sha256": "68a0228b56de8c9e9e94d64d7c1e386bf3dff55c0f6228b65f91e75d02525926"
"package_hash_file_count": 177,
"package_sha256": "33ca97e8df3e3c75228595ab8bd06d65c697ef708723a0a53637bd8f22bbcfda"
},
"failures": [],
"warnings": [],
@@ -332,6 +332,20 @@
"network_urls": [],
"network_hosts": []
},
{
"path": "scripts/prepare_output_review_kit.py",
"interface": "cli",
"interface_declared": false,
"interface_reason": "Default CLI classification; add SCRIPT_INTERFACE for internal modules.",
"has_argparse": true,
"has_main_guard": true,
"uses_input": false,
"uses_network": false,
"uses_file_write": true,
"uses_subprocess": false,
"network_urls": [],
"network_hosts": []
},
{
"path": "scripts/prepare_world_class_submission_kit.py",
"interface": "cli",
@@ -1365,9 +1379,9 @@
"help_smoke": {
"enabled": true,
"timeout_seconds": 5.0,
"candidate_count": 75,
"checked_count": 75,
"passed_count": 75,
"candidate_count": 76,
"checked_count": 76,
"passed_count": 76,
"failed_count": 0,
"skipped_count": 17,
"failed_scripts": [],
@@ -1582,6 +1596,16 @@
"stdout_excerpt": "usage: optimize_description.py [-h] --description-file DESCRIPTION_FILE\n [--baseline-description-file BASELINE_DESCRIPTION_FILE]\n --dev-cases DEV_CASES\n ",
"stderr_excerpt": ""
},
{
"path": "scripts/prepare_output_review_kit.py",
"command": "python3 scripts/prepare_output_review_kit.py --help",
"returncode": 0,
"timed_out": false,
"passed": true,
"has_help_text": true,
"stdout_excerpt": "usage: prepare_output_review_kit.py [-h] [--blind-pack-json BLIND_PACK_JSON]\n [--blind-pack-md BLIND_PACK_MD]\n [--decisions DECISIONS]\n ",
"stderr_excerpt": ""
},
{
"path": "scripts/prepare_world_class_submission_kit.py",
"command": "python3 scripts/prepare_world_class_submission_kit.py --help",
@@ -2260,6 +2284,7 @@
"scripts/github_benchmark_scan.py",
"scripts/import_telemetry_events.py",
"scripts/init_skill.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
+9 -8
View File
@@ -1,22 +1,22 @@
# Security Trust Report
- OK: `True`
- Scanned files: `176`
- Scripts: `92`
- Scanned files: `177`
- Scripts: `93`
- Internal script modules: `17`
- Secret findings: `0`
- Network-capable scripts: `3`
- Network policy covered scripts: `3`
- Network policy missing scripts: `0`
- File-write scripts: `62`
- File-write scripts: `63`
- Permission approvals: `3 / 3`
- Permission approval gaps: `0`
- CLI help smoke checked: `75`
- CLI help smoke checked: `76`
- CLI help smoke failures: `0`
- Interactive scripts: `0`
- Package hash scope: `source-contract-without-generated-reports`
- Package hash files: `176`
- Package SHA256: `68a0228b56de8c9e9e94d64d7c1e386bf3dff55c0f6228b65f91e75d02525926`
- Package hash files: `177`
- Package SHA256: `33ca97e8df3e3c75228595ab8bd06d65c697ef708723a0a53637bd8f22bbcfda`
## Failures
@@ -54,8 +54,8 @@
- Enabled: `True`
- Timeout seconds: `5.0`
- Checked scripts: `75`
- Passed scripts: `75`
- Checked scripts: `76`
- Passed scripts: `76`
- Failed scripts: `none`
## Script Surface
@@ -83,6 +83,7 @@
| scripts/lint_skill.py | cli | False | True | True | False | False | False | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/local_output_eval_runner.py | cli | False | True | True | False | False | False | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/optimize_description.py | cli | False | True | True | False | False | False | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/prepare_output_review_kit.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/prepare_world_class_submission_kit.py | cli | True | True | True | False | False | True | False | Prepares editable world-class evidence intake packets without counting drafts as accepted evidence. |
| scripts/probe_runtime_permissions.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
| scripts/promotion_checker.py | cli | False | True | True | False | False | True | False | Default CLI classification; add SCRIPT_INTERFACE for internal modules. |
+2 -2
View File
@@ -621,7 +621,7 @@
<div class="two-col">
<article class="panel">
<h3><span data-lang="zh-CN">作用定位</span><span data-lang="en">Role</span></h3>
<ul class="list"><li><span data-lang="zh-CN">从工作流、提示词、对话记录、文档或笔记中创建、重构、评估和打包 agent skill;适用于新建 Skill、沉淀重复流程、改进现有 Skill、补充 eval 或团队复用打包。</span><span data-lang="en">Create, refactor, evaluate, and package agent skills from workflows, prompts, transcripts, docs, or notes. Use when asked to create a skill, turn a repeated process into a reusable skill, improve an existing skill, add evals, or package a skill for team reuse.</span></li><li><span data-lang="zh-CN">把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。</span><span data-lang="en">把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。</span></li><li><span data-lang="zh-CN">交付结果:SKILL.md, agents/interface.yaml, reports/skill-ir.json, reports/compiled_targets.md, reports/output_quality_scorecard.md, reports/output_execution_runs.md, reports/output_blind_review_pack.md, reports/output_blind_answer_key.json, reports/output_review_adjudication.md, reports/benchmark_reproducibility.md, reports/conformance_matrix.md, reports/security_trust_report.md, reports/runtime_permission_probes.md, reports/skill_atlas.html, reports/registry_audit.md, reports/package_verification.md, reports/install_simulation.md, reports/upgrade_check.md, reports/adoption_drift_report.md, reports/review_waivers.md, reports/world_class_evidence_plan.md, reports/world_class_evidence_ledger.md, reports/review_annotations.md, reports/review-studio.html, reports/skill-overview.html</span><span data-lang="en">交付结果:SKILL.md, agents/interface.yaml, reports/skill-ir.json, reports/compiled_targets.md, reports/output_quality_scorecard.md, reports/output_execution_runs.md, reports/output_blind_review_pack.md, reports/output_blind_answer_key.json, reports/output_review_adjudication.md, reports/benchmark_reproducibility.md, reports/conformance_matrix.md, reports/security_trust_report.md, reports/runtime_permission_probes.md, reports/skill_atlas.html, reports/registry_audit.md, reports/package_verification.md, reports/install_simulation.md, reports/upgrade_check.md, reports/adoption_drift_report.md, reports/review_waivers.md, reports/world_class_evidence_plan.md, reports/world_class_evidence_ledger.md, reports/review_annotations.md, reports/review-studio.html, reports/skill-overview.html</span></li></ul>
<ul class="list"><li><span data-lang="zh-CN">从工作流、提示词、对话记录、文档或笔记中创建、重构、评估和打包 agent skill;适用于新建 Skill、沉淀重复流程、改进现有 Skill、补充 eval 或团队复用打包。</span><span data-lang="en">Create, refactor, evaluate, and package agent skills from workflows, prompts, transcripts, docs, or notes. Use when asked to create a skill, turn a repeated process into a reusable skill, improve an existing skill, add evals, or package a skill for team reuse.</span></li><li><span data-lang="zh-CN">把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。</span><span data-lang="en">把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。</span></li><li><span data-lang="zh-CN">交付结果:SKILL.md, agents/interface.yaml, reports/skill-ir.json, reports/compiled_targets.md, reports/output_quality_scorecard.md, reports/output_execution_runs.md, reports/output_blind_review_pack.md, reports/output_review_kit.md, reports/output_review_adjudication.md, reports/benchmark_reproducibility.md, reports/output_blind_answer_key.json, reports/conformance_matrix.md, reports/security_trust_report.md, reports/runtime_permission_probes.md, reports/skill_atlas.html, reports/registry_audit.md, reports/package_verification.md, reports/install_simulation.md, reports/upgrade_check.md, reports/adoption_drift_report.md, reports/review_waivers.md, reports/world_class_evidence_plan.md, reports/world_class_evidence_ledger.md, reports/review_annotations.md, reports/review-studio.html, reports/skill-overview.html</span><span data-lang="en">交付结果:SKILL.md, agents/interface.yaml, reports/skill-ir.json, reports/compiled_targets.md, reports/output_quality_scorecard.md, reports/output_execution_runs.md, reports/output_blind_review_pack.md, reports/output_review_kit.md, reports/output_review_adjudication.md, reports/benchmark_reproducibility.md, reports/output_blind_answer_key.json, reports/conformance_matrix.md, reports/security_trust_report.md, reports/runtime_permission_probes.md, reports/skill_atlas.html, reports/registry_audit.md, reports/package_verification.md, reports/install_simulation.md, reports/upgrade_check.md, reports/adoption_drift_report.md, reports/review_waivers.md, reports/world_class_evidence_plan.md, reports/world_class_evidence_ledger.md, reports/review_annotations.md, reports/review-studio.html, reports/skill-overview.html</span></li></ul>
</article>
<figure class="chart-figure" data-chart="flow"><svg viewBox="0 0 620 170" role="img" aria-label="交付流程"><text x="20" y="28" class="chart-title">交付流程</text><path d="M188 93 H248 M398 93 H458" class="chart-line"/><g><rect x="38" y="56" width="150" height="74" rx="8" fill="#F6F8FB" stroke="#e8e6dc"/><text x="113" y="99" text-anchor="middle">输入材料</text></g><g><rect x="248" y="56" width="150" height="74" rx="8" fill="#F6F8FB" stroke="#e8e6dc"/><text x="323" y="99" text-anchor="middle">Skill 包体</text></g><g><rect x="458" y="56" width="150" height="74" rx="8" fill="#F6F8FB" stroke="#e8e6dc"/><text x="533" y="99" text-anchor="middle">可复用能力</text></g></svg><figcaption>交付流程把用户输入、生成的包体和可复用能力放在一条线上。</figcaption></figure>
</div>
@@ -771,7 +771,7 @@
<p><span data-lang="zh-CN">让 reviewer 快速确认关键文件、目录和资产分布。</span><span data-lang="en">Lets reviewers confirm key files, directories, and asset distribution quickly.</span></p>
</div>
<div class="two-col">
<figure class="chart-figure" data-chart="asset_donut"><svg viewBox="0 0 430 270" role="img" aria-label="资产分布"><text x="20" y="30" class="chart-title">资产分布</text><circle cx="130" cy="130" r="70" fill="none" stroke="#1B365D" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="0.0" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#2D5A8A" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-0.8" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#D0DCE9" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-1.6" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#E4ECF5" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-2.3" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#e8e6dc" stroke-width="24" stroke-dasharray="25.0 75.0" stroke-dashoffset="-3.1" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#504e49" stroke-width="24" stroke-dasharray="71.9 28.1" stroke-dashoffset="-28.1" pathLength="100" transform="rotate(-90 130 130)"/><text x="130" y="136" text-anchor="middle">353</text><text x="235" y="78">SKILL.md</text><text x="235" y="100">README.md</text><text x="235" y="122">agents/interface.yaml</text><text x="235" y="144">manifest.json</text><text x="235" y="166">references</text><text x="235" y="188">scripts</text></svg><figcaption>资产分布图展示当前包体的文件和目录重心。</figcaption></figure>
<figure class="chart-figure" data-chart="asset_donut"><svg viewBox="0 0 430 270" role="img" aria-label="资产分布"><text x="20" y="30" class="chart-title">资产分布</text><circle cx="130" cy="130" r="70" fill="none" stroke="#1B365D" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="0.0" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#2D5A8A" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-0.8" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#D0DCE9" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-1.6" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#E4ECF5" stroke-width="24" stroke-dasharray="0.8 99.2" stroke-dashoffset="-2.3" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#e8e6dc" stroke-width="24" stroke-dasharray="24.8 75.2" stroke-dashoffset="-3.1" pathLength="100" transform="rotate(-90 130 130)"/><circle cx="130" cy="130" r="70" fill="none" stroke="#504e49" stroke-width="24" stroke-dasharray="72.1 27.9" stroke-dashoffset="-27.9" pathLength="100" transform="rotate(-90 130 130)"/><text x="130" y="136" text-anchor="middle">356</text><text x="235" y="78">SKILL.md</text><text x="235" y="100">README.md</text><text x="235" y="122">agents/interface.yaml</text><text x="235" y="144">manifest.json</text><text x="235" y="166">references</text><text x="235" y="188">scripts</text></svg><figcaption>资产分布图展示当前包体的文件和目录重心。</figcaption></figure>
<table>
<thead><tr><th><span data-lang="zh-CN">路径</span><span data-lang="en">Path</span></th><th><span data-lang="zh-CN">作用</span><span data-lang="en">Role</span></th><th><span data-lang="zh-CN">类型</span><span data-lang="en">Type</span></th></tr></thead>
<tbody><tr><td>SKILL.md</td><td><span data-lang="zh-CN">Skill 入口文件</span><span data-lang="en">Skill entrypoint</span></td><td><span data-lang="zh-CN">文件</span><span data-lang="en">file</span></td></tr><tr><td>README.md</td><td><span data-lang="zh-CN">人类可读使用说明</span><span data-lang="en">Human-readable usage guide</span></td><td><span data-lang="zh-CN">文件</span><span data-lang="en">file</span></td></tr><tr><td>agents/interface.yaml</td><td><span data-lang="zh-CN">跨平台接口元数据</span><span data-lang="en">Neutral interface metadata</span></td><td><span data-lang="zh-CN">文件</span><span data-lang="en">file</span></td></tr><tr><td>manifest.json</td><td><span data-lang="zh-CN">生命周期与打包元数据</span><span data-lang="en">Lifecycle and portability metadata</span></td><td><span data-lang="zh-CN">文件</span><span data-lang="en">file</span></td></tr><tr><td>references</td><td><span data-lang="zh-CN">扩展指导与复用资料</span><span data-lang="en">Extended guidance and reusable notes</span></td><td><span data-lang="zh-CN">目录</span><span data-lang="en">folder</span></td></tr><tr><td>scripts</td><td><span data-lang="zh-CN">确定性脚本或本地工具</span><span data-lang="en">Deterministic helpers or local tooling</span></td><td><span data-lang="zh-CN">目录</span><span data-lang="en">folder</span></td></tr><tr><td>evals</td><td><span data-lang="zh-CN">触发与质量检查</span><span data-lang="en">Trigger and quality checks</span></td><td><span data-lang="zh-CN">目录</span><span data-lang="en">folder</span></td></tr><tr><td>reports</td><td><span data-lang="zh-CN">生成的证据与总结报告</span><span data-lang="en">Generated evidence and overview artifacts</span></td><td><span data-lang="zh-CN">目录</span><span data-lang="en">folder</span></td></tr></tbody>
+49 -21
View File
@@ -16,9 +16,10 @@
"reports/output_quality_scorecard.md",
"reports/output_execution_runs.md",
"reports/output_blind_review_pack.md",
"reports/output_blind_answer_key.json",
"reports/output_review_kit.md",
"reports/output_review_adjudication.md",
"reports/benchmark_reproducibility.md",
"reports/output_blind_answer_key.json",
"reports/conformance_matrix.md",
"reports/security_trust_report.md",
"reports/runtime_permission_probes.md",
@@ -436,7 +437,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 92
"file_count": 93
},
{
"path": "evals",
@@ -448,10 +449,10 @@
"path": "reports",
"label": "Generated evidence and overview artifacts",
"kind": "folder",
"file_count": 197
"file_count": 199
}
],
"file_count": 353,
"file_count": 356,
"folder_count": 4,
"distribution": [
{
@@ -476,7 +477,7 @@
},
{
"label": "scripts",
"value": 92
"value": 93
},
{
"label": "evals",
@@ -484,7 +485,7 @@
},
{
"label": "reports",
"value": 197
"value": 199
}
]
},
@@ -605,7 +606,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 92
"file_count": 93
},
{
"path": "evals",
@@ -617,7 +618,7 @@
"path": "reports",
"label": "Generated evidence and overview artifacts",
"kind": "folder",
"file_count": 197
"file_count": 199
}
],
"strengths": [
@@ -865,6 +866,30 @@
"pair_count": 5,
"answer_key_separate": true
},
"output_review_kit": {
"ok": true,
"summary": {
"case_count": 5,
"ready_for_adjudication_count": 0,
"pending_decision_count": 5,
"invalid_decision_count": 0,
"reviewer_metadata_present": false,
"answer_key_hidden": true,
"answer_key_path_exposed": false,
"ready_to_run_adjudication": false,
"failure_count": 0
},
"artifacts": {
"reviewer_kit_json": "reports/output_review_kit.json",
"reviewer_kit_markdown": "reports/output_review_kit.md",
"blind_pack_json": "reports/output_blind_review_pack.json",
"blind_pack_markdown": "reports/output_blind_review_pack.md",
"decisions": "reports/output_review_decisions.json",
"adjudication_json": "reports/output_review_adjudication.json",
"adjudication_markdown": "reports/output_review_adjudication.md"
},
"failures": []
},
"output_review_adjudication": {
"ok": true,
"summary": {
@@ -909,9 +934,9 @@
"world_class_task_count": 4,
"world_class_ledger_pending_count": 4,
"working_tree_dirty": true,
"changed_file_count": 56
"changed_file_count": 59
},
"commit": "30539bed7a29dd88c2f289dd0c115da9834dd5d9",
"commit": "ecdb16dd90025bcca3051be4c6a1b5b723c7ec75",
"missing_artifacts": [],
"limitations": [
"Local command-runner evidence is reproducible but does not replace provider-backed model holdout evidence.",
@@ -986,8 +1011,8 @@
"failures": []
},
"trust_security": {
"scanned_files": 176,
"script_count": 92,
"scanned_files": 177,
"script_count": 93,
"internal_module_count": 17,
"secret_findings": 0,
"dependency_files": [
@@ -996,18 +1021,18 @@
"network_script_count": 3,
"network_policy_covered_count": 3,
"network_policy_missing_count": 0,
"file_write_script_count": 62,
"file_write_script_count": 63,
"permission_required_count": 3,
"permission_approved_count": 3,
"permission_missing_count": 0,
"permission_invalid_count": 0,
"permission_expired_count": 0,
"help_smoke_checked_count": 75,
"help_smoke_checked_count": 76,
"help_smoke_failed_count": 0,
"interactive_script_count": 0,
"package_hash_scope": "source-contract-without-generated-reports",
"package_hash_file_count": 176,
"package_sha256": "6298aa08d70a1e36956df32bcbb7a0bc778e8125f5449630cebf966b1c06a5f7"
"package_hash_file_count": 177,
"package_sha256": "7645bfc56829c3d6888e792b170b2e734d041c930c31f7f285c0d59e49d7de1b"
},
"skill_atlas": {
"skill_count": 12,
@@ -1045,7 +1070,7 @@
"trust_level": "local",
"license": "MIT",
"checksums": {
"package_sha256": "6298aa08d70a1e36956df32bcbb7a0bc778e8125f5449630cebf966b1c06a5f7",
"package_sha256": "7645bfc56829c3d6888e792b170b2e734d041c930c31f7f285c0d59e49d7de1b",
"archive_sha256": "cb1ac8c62bc5dee942a88f18eb5d71c93ae58f854ac19f3d912f9c9c3a4ec24e"
},
"compatibility": {
@@ -1082,7 +1107,7 @@
"install_simulated": true,
"install_simulation": "reports/install_simulation.json"
},
"generated_at": "2026-06-14"
"generated_at": "2026-06-13"
},
"failures": [],
"warnings": []
@@ -1105,7 +1130,7 @@
"ok": true,
"summary": {
"archive_present": true,
"archive_entry_count": 563,
"archive_entry_count": 567,
"archive_extracted": true,
"entrypoint_loaded": true,
"manifest_loaded": true,
@@ -1177,7 +1202,7 @@
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "6298aa08d70a1e36956df32bcbb7a0bc778e8125f5449630cebf966b1c06a5f7"
"to": "7645bfc56829c3d6888e792b170b2e734d041c930c31f7f285c0d59e49d7de1b"
}
]
},
@@ -1349,8 +1374,9 @@
"current": "0/5 decisions; pending 5",
"objective": "Record real blind A/B reviewer decisions before claiming human output review completion.",
"runbook": [
"python3 scripts/yao.py output-review-kit --write-template",
"Open reports/output_review_kit.md and choose A or B for each pair without opening the answer key.",
"python3 scripts/adjudicate_output_review.py --write-template",
"Open reports/output_blind_review_pack.md and choose A or B for each pair without opening the answer key.",
"Edit reports/output_review_decisions.json with winner_variant values and reviewer metadata.",
"python3 scripts/yao.py output-review",
"python3 scripts/yao.py skill-os2-audit . --generated-at <YYYY-MM-DD>",
@@ -1365,6 +1391,7 @@
],
"evidence_artifacts": [
"reports/output_blind_review_pack.md",
"reports/output_review_kit.md",
"reports/output_review_decisions.json",
"reports/output_review_adjudication.json",
"reports/output_review_adjudication.md",
@@ -1556,6 +1583,7 @@
],
"evidence_artifacts": [
"reports/output_blind_review_pack.md",
"reports/output_review_kit.md",
"reports/output_review_decisions.json",
"reports/output_review_adjudication.json",
"reports/output_review_adjudication.md",
+1
View File
@@ -85,6 +85,7 @@
"scripts/lint_skill.py",
"scripts/local_output_eval_runner.py",
"scripts/optimize_description.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
+1 -1
View File
@@ -197,7 +197,7 @@
"key": "trust-security",
"label": "Trust Security",
"status": "pass",
"current": "secrets 0; scripts 92; help failures 0",
"current": "secrets 0; scripts 93; help failures 0",
"target": "Secrets, scripts, dependencies, permissions, and package hash are reviewable",
"evidence": [
{
+1 -1
View File
@@ -23,7 +23,7 @@ Generated at: `2026-06-13`
| 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 92; 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 93; 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. |
+1 -1
View File
@@ -122,7 +122,7 @@
"label": "Trust Security",
"status": "pass",
"objective": "Scripts, dependencies, permissions, secrets, and package hash are reviewable for team distribution.",
"current": "92 scripts; secrets 0; help failures 0",
"current": "93 scripts; secrets 0; help failures 0",
"command": "python3 scripts/yao.py trust .",
"test": "python3 tests/verify_trust_check.py",
"evidence": [
+1 -1
View File
@@ -21,7 +21,7 @@ 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` | 92 scripts; secrets 0; help failures 0 | `python3 scripts/yao.py trust .` | `python3 tests/verify_trust_check.py` |
| Trust Security | `pass` | 93 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 563; 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` |
+1 -1
View File
@@ -75,7 +75,7 @@
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "68a0228b56de8c9e9e94d64d7c1e386bf3dff55c0f6228b65f91e75d02525926"
"to": "33ca97e8df3e3c75228595ab8bd06d65c697ef708723a0a53637bd8f22bbcfda"
}
]
},
+5 -1
View File
@@ -6,7 +6,7 @@
"summary": {
"ledger_ready_to_claim_world_class": false,
"ledger_pending_count": 4,
"claim_surface_count": 69,
"claim_surface_count": 70,
"violation_count": 0,
"overclaim_guard_active": true,
"decision": "claim-guard-pass-evidence-pending"
@@ -195,6 +195,10 @@
"path": "reports/output_review_adjudication.md",
"violation_count": 0
},
{
"path": "reports/output_review_kit.md",
"violation_count": 0
},
{
"path": "reports/package_verification.md",
"violation_count": 0
+1 -1
View File
@@ -7,7 +7,7 @@ Generated at: `2026-06-13`
- decision: `claim-guard-pass-evidence-pending`
- ledger ready to claim world-class: `false`
- ledger pending evidence: `4`
- claim surfaces scanned: `69`
- claim surfaces scanned: `70`
- violations: `0`
- overclaim guard active: `true`
+1
View File
@@ -134,6 +134,7 @@
],
"evidence_artifacts": [
"reports/output_blind_review_pack.md",
"reports/output_review_kit.md",
"reports/output_review_decisions.json",
"reports/output_review_adjudication.json",
"reports/output_review_adjudication.md",
+1
View File
@@ -107,6 +107,7 @@ This report validates the intake contract for human and external evidence. A val
- reports/skill_os2_audit.json item human-adjudication status becomes pass
- evidence_artifacts:
- reports/output_blind_review_pack.md
- reports/output_review_kit.md
- reports/output_review_decisions.json
- reports/output_review_adjudication.json
- reports/output_review_adjudication.md
+1
View File
@@ -95,6 +95,7 @@
],
"evidence_artifacts": [
"reports/output_blind_review_pack.md",
"reports/output_review_kit.md",
"reports/output_review_decisions.json",
"reports/output_review_adjudication.json",
"reports/output_review_adjudication.md",
+3 -1
View File
@@ -58,8 +58,9 @@
"current": "0/5 decisions; pending 5",
"objective": "Record real blind A/B reviewer decisions before claiming human output review completion.",
"runbook": [
"python3 scripts/yao.py output-review-kit --write-template",
"Open reports/output_review_kit.md and choose A or B for each pair without opening the answer key.",
"python3 scripts/adjudicate_output_review.py --write-template",
"Open reports/output_blind_review_pack.md and choose A or B for each pair without opening the answer key.",
"Edit reports/output_review_decisions.json with winner_variant values and reviewer metadata.",
"python3 scripts/yao.py output-review",
"python3 scripts/yao.py skill-os2-audit . --generated-at <YYYY-MM-DD>",
@@ -74,6 +75,7 @@
],
"evidence_artifacts": [
"reports/output_blind_review_pack.md",
"reports/output_review_kit.md",
"reports/output_review_decisions.json",
"reports/output_review_adjudication.json",
"reports/output_review_adjudication.md",
+3 -1
View File
@@ -63,8 +63,9 @@ This report is an execution plan for the remaining world-class evidence gaps. It
### Runbook
- `python3 scripts/yao.py output-review-kit --write-template`
- Open reports/output_review_kit.md and choose A or B for each pair without opening the answer key.
- `python3 scripts/adjudicate_output_review.py --write-template`
- Open reports/output_blind_review_pack.md and choose A or B for each pair without opening the answer key.
- Edit reports/output_review_decisions.json with winner_variant values and reviewer metadata.
- `python3 scripts/yao.py output-review`
- `python3 scripts/yao.py skill-os2-audit . --generated-at <YYYY-MM-DD>`
@@ -81,6 +82,7 @@ This report is an execution plan for the remaining world-class evidence gaps. It
### Evidence Artifacts
- `reports/output_blind_review_pack.md`
- `reports/output_review_kit.md`
- `reports/output_review_decisions.json`
- `reports/output_review_adjudication.json`
- `reports/output_review_adjudication.md`
+1
View File
@@ -245,6 +245,7 @@ def build_reviewer_checklist(
"blind_pack_path": display_path(blind_pack_path),
"decisions_path": display_path(decisions_path),
"commands": {
"prepare_review_kit": "python3 scripts/yao.py output-review-kit",
"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 .",
+1
View File
@@ -40,6 +40,7 @@ DEFAULT_TARGETS = [
"compiler-check",
"output-eval-check",
"output-execution-check",
"output-review-kit-check",
"output-review-adjudication-check",
"runtime-conformance-check",
"runtime-permission-check",
+316
View File
@@ -0,0 +1,316 @@
#!/usr/bin/env python3
"""Prepare a reviewer-facing blind A/B output review kit."""
import argparse
import json
from pathlib import Path
from typing import Any
from adjudicate_output_review import (
build_decision_template,
confidence_value,
decision_index,
display_path,
load_json,
normalize_variant,
)
ROOT = Path(__file__).resolve().parent.parent
DEFAULT_BLIND_PACK_JSON = ROOT / "reports" / "output_blind_review_pack.json"
DEFAULT_BLIND_PACK_MD = ROOT / "reports" / "output_blind_review_pack.md"
DEFAULT_DECISIONS = ROOT / "reports" / "output_review_decisions.json"
DEFAULT_OUTPUT_JSON = ROOT / "reports" / "output_review_kit.json"
DEFAULT_OUTPUT_MD = ROOT / "reports" / "output_review_kit.md"
def load_optional_decisions(path: Path) -> tuple[dict[str, Any], list[str]]:
if not path.exists():
return {"schema_version": "1.0", "decisions": []}, []
return load_json(path)
def pairs_from_pack(blind_pack: dict[str, Any]) -> list[dict[str, Any]]:
pairs = blind_pack.get("pairs", [])
if not isinstance(pairs, list):
return []
return [item for item in pairs if isinstance(item, dict) and item.get("case_id")]
def decision_state(decision: dict[str, Any] | None) -> dict[str, Any]:
if not decision:
return {
"status": "awaiting-decision",
"winner_variant_recorded": False,
"confidence_recorded": False,
"reason_recorded": False,
"blocking_reason": "No reviewer choice has been recorded yet.",
}
winner = normalize_variant(decision.get("winner_variant", decision.get("reviewer_winner_variant", decision.get("winner", ""))))
confidence, confidence_failure = confidence_value(decision.get("confidence"))
reason = str(decision.get("reason", "")).strip()
if not winner and confidence is None and not reason:
return {
"status": "awaiting-decision",
"winner_variant_recorded": False,
"confidence_recorded": False,
"reason_recorded": False,
"blocking_reason": "Decision template exists but this row is still blank.",
}
failures = []
if winner not in {"A", "B"}:
failures.append("winner_variant must be A or B")
if confidence_failure:
failures.append(confidence_failure)
if not reason:
failures.append("reason should explain the reviewer rationale")
if failures:
return {
"status": "needs-fix",
"winner_variant_recorded": winner in {"A", "B"},
"confidence_recorded": confidence is not None,
"reason_recorded": bool(reason),
"blocking_reason": "; ".join(failures),
}
return {
"status": "ready-for-adjudication",
"winner_variant_recorded": True,
"confidence_recorded": confidence is not None,
"reason_recorded": True,
"blocking_reason": "Reviewer choice is complete enough for adjudication.",
}
def build_cases(blind_pack: dict[str, Any], decisions: dict[str, dict[str, Any]]) -> list[dict[str, Any]]:
cases = []
for pair in pairs_from_pack(blind_pack):
case_id = str(pair.get("case_id", ""))
rubric = []
for item in pair.get("rubric", []) if isinstance(pair.get("rubric", []), list) else []:
if isinstance(item, dict):
rubric.append(
{
"id": str(item.get("id", "")),
"description": str(item.get("description", "")),
"weight": float(item.get("weight", 1) or 0),
}
)
cases.append(
{
"case_id": case_id,
"prompt": str(pair.get("prompt", "")),
"input_files": pair.get("input_files", []) if isinstance(pair.get("input_files", []), list) else [],
"review_instruction": str(pair.get("review_instruction", "")),
"rubric": rubric,
"variant_a": {
"blind_id": str(pair.get("variant_a", {}).get("blind_id", "")) if isinstance(pair.get("variant_a"), dict) else "",
"output": str(pair.get("variant_a", {}).get("output", "")) if isinstance(pair.get("variant_a"), dict) else "",
},
"variant_b": {
"blind_id": str(pair.get("variant_b", {}).get("blind_id", "")) if isinstance(pair.get("variant_b"), dict) else "",
"output": str(pair.get("variant_b", {}).get("output", "")) if isinstance(pair.get("variant_b"), dict) else "",
},
"decision_state": decision_state(decisions.get(case_id)),
}
)
return cases
def build_summary(cases: list[dict[str, Any]], failures: list[str], reviewer: str, reviewed_at: str) -> dict[str, Any]:
status_counts: dict[str, int] = {}
for case in cases:
status = str(case.get("decision_state", {}).get("status", "awaiting-decision"))
status_counts[status] = status_counts.get(status, 0) + 1
ready_count = status_counts.get("ready-for-adjudication", 0)
pending_count = status_counts.get("awaiting-decision", 0)
invalid_count = status_counts.get("needs-fix", 0)
return {
"case_count": len(cases),
"ready_for_adjudication_count": ready_count,
"pending_decision_count": pending_count,
"invalid_decision_count": invalid_count,
"reviewer_metadata_present": bool(str(reviewer).strip() and str(reviewed_at).strip()),
"answer_key_hidden": True,
"answer_key_path_exposed": False,
"ready_to_run_adjudication": bool(cases) and ready_count == len(cases) and invalid_count == 0,
"failure_count": len(failures),
}
def build_contract(blind_pack_md: Path, decisions_path: Path) -> dict[str, Any]:
return {
"reviewer_steps": [
f"Open {display_path(blind_pack_md)} or this kit and compare Variant A vs Variant B for each case.",
f"Record choices in {display_path(decisions_path)} without opening the answer key.",
"Use winner_variant A or B, confidence from 0 to 1, and a short reason for every case.",
"Run python3 scripts/yao.py output-review after choices are recorded.",
"Refresh python3 scripts/yao.py review-studio . before asking for release approval.",
],
"required_fields": {
"reviewer": "Human reviewer name or review group.",
"reviewed_at": "Review date or timestamp.",
"winner_variant": "A or B for every case.",
"confidence": "Optional numeric confidence from 0 to 1.",
"reason": "Short rationale based on the rubric, not on hidden labels.",
},
"privacy_contract": [
"The answer key is intentionally withheld from this kit.",
"Do not inspect hidden labels or expected winners before decisions are recorded.",
"Do not paste private user data into decision reasons.",
"Pending decisions must stay pending instead of being counted as human agreement.",
],
}
def render_rubric(rubric: list[dict[str, Any]]) -> list[str]:
if not rubric:
return ["- No rubric items found."]
return [f"- `{item['id']}` ({item['weight']}): {item['description']}" for item in rubric]
def render_markdown(payload: dict[str, Any]) -> str:
summary = payload["summary"]
contract = payload["review_contract"]
lines = [
"# Output Review Kit",
"",
"This reviewer-facing packet contains the blind A/B cases, decision fields, and command flow. It intentionally does not expose the answer key.",
"",
"## Summary",
"",
f"- cases: `{summary['case_count']}`",
f"- ready for adjudication: `{summary['ready_for_adjudication_count']}`",
f"- pending decisions: `{summary['pending_decision_count']}`",
f"- invalid decisions: `{summary['invalid_decision_count']}`",
f"- reviewer metadata present: `{str(summary['reviewer_metadata_present']).lower()}`",
f"- answer key hidden: `{str(summary['answer_key_hidden']).lower()}`",
f"- answer key path exposed: `{str(summary['answer_key_path_exposed']).lower()}`",
"",
"## Review Flow",
"",
]
lines.extend(f"{index}. {step}" for index, step in enumerate(contract["reviewer_steps"], start=1))
lines.extend(["", "## Required Fields", ""])
lines.extend(f"- `{key}`: {value}" for key, value in contract["required_fields"].items())
lines.extend(["", "## Privacy Contract", ""])
lines.extend(f"- {item}" for item in contract["privacy_contract"])
lines.extend(
[
"",
"## Decision States",
"",
"| Case | State | Winner | Confidence | Reason | Blocking Reason |",
"| --- | --- | --- | --- | --- | --- |",
]
)
for case in payload["cases"]:
state = case["decision_state"]
lines.append(
f"| `{case['case_id']}` | `{state['status']}` | `{str(state['winner_variant_recorded']).lower()}` | "
f"`{str(state['confidence_recorded']).lower()}` | `{str(state['reason_recorded']).lower()}` | {state['blocking_reason']} |"
)
lines.extend(["", "## Blind Cases", ""])
for case in payload["cases"]:
lines.extend(
[
f"### {case['case_id']}",
"",
f"Prompt: {case['prompt']}",
"",
"Rubric:",
*render_rubric(case["rubric"]),
"",
"#### Variant A",
"",
case["variant_a"]["output"] or "_No output found._",
"",
"#### Variant B",
"",
case["variant_b"]["output"] or "_No output found._",
"",
]
)
if payload.get("failures"):
lines.extend(["## Failures", ""])
lines.extend(f"- {failure}" for failure in payload["failures"])
return "\n".join(lines).strip() + "\n"
def prepare_output_review_kit(
blind_pack_json: Path,
blind_pack_md: Path,
decisions_path: Path,
output_json: Path,
output_md: Path,
write_template: bool = False,
) -> dict[str, Any]:
blind_pack, failures = load_json(blind_pack_json)
decisions_payload, decision_failures = load_optional_decisions(decisions_path)
failures.extend(decision_failures)
template_written = False
if write_template and blind_pack and not decisions_path.exists():
decisions_path.parent.mkdir(parents=True, exist_ok=True)
decisions_path.write_text(
json.dumps(build_decision_template(blind_pack), ensure_ascii=False, indent=2) + "\n",
encoding="utf-8",
)
template_written = True
decisions_payload, decision_failures = load_optional_decisions(decisions_path)
failures.extend(decision_failures)
decisions, index_failures = decision_index(decisions_payload)
failures.extend(index_failures)
case_ids = {str(pair.get("case_id", "")) for pair in pairs_from_pack(blind_pack)}
for case_id in decisions:
if case_id not in case_ids:
failures.append(f"decision references unknown case_id: {case_id}")
cases = build_cases(blind_pack, decisions)
summary = build_summary(cases, failures, str(decisions_payload.get("reviewer", "")), str(decisions_payload.get("reviewed_at", "")))
payload = {
"schema_version": "1.0",
"ok": not failures,
"summary": summary,
"artifacts": {
"reviewer_kit_json": display_path(output_json),
"reviewer_kit_markdown": display_path(output_md),
"blind_pack_json": display_path(blind_pack_json),
"blind_pack_markdown": display_path(blind_pack_md),
"decisions": display_path(decisions_path),
"adjudication_json": "reports/output_review_adjudication.json",
"adjudication_markdown": "reports/output_review_adjudication.md",
},
"template_written": template_written,
"review_contract": build_contract(blind_pack_md, decisions_path),
"cases": cases,
"failures": failures,
}
output_json.parent.mkdir(parents=True, exist_ok=True)
output_md.parent.mkdir(parents=True, exist_ok=True)
output_json.write_text(json.dumps(payload, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
output_md.write_text(render_markdown(payload), encoding="utf-8")
return payload
def main() -> None:
parser = argparse.ArgumentParser(description="Prepare a reviewer-facing blind A/B output review kit.")
parser.add_argument("--blind-pack-json", default=str(DEFAULT_BLIND_PACK_JSON))
parser.add_argument("--blind-pack-md", default=str(DEFAULT_BLIND_PACK_MD))
parser.add_argument("--decisions", default=str(DEFAULT_DECISIONS))
parser.add_argument("--output-json", default=str(DEFAULT_OUTPUT_JSON))
parser.add_argument("--output-md", default=str(DEFAULT_OUTPUT_MD))
parser.add_argument("--write-template", action="store_true")
args = parser.parse_args()
payload = prepare_output_review_kit(
Path(args.blind_pack_json).resolve(),
Path(args.blind_pack_md).resolve(),
Path(args.decisions).resolve(),
Path(args.output_json).resolve(),
Path(args.output_md).resolve(),
write_template=args.write_template,
)
print(json.dumps(payload, ensure_ascii=False, indent=2))
raise SystemExit(0 if payload["ok"] else 2)
if __name__ == "__main__":
main()
+3 -1
View File
@@ -41,8 +41,9 @@ TASK_TEMPLATES: dict[str, dict[str, Any]] = {
"owner": "human reviewer",
"objective": "Record real blind A/B reviewer decisions before claiming human output review completion.",
"runbook": [
"python3 scripts/yao.py output-review-kit --write-template",
"Open reports/output_review_kit.md and choose A or B for each pair without opening the answer key.",
"python3 scripts/adjudicate_output_review.py --write-template",
"Open reports/output_blind_review_pack.md and choose A or B for each pair without opening the answer key.",
"Edit reports/output_review_decisions.json with winner_variant values and reviewer metadata.",
"python3 scripts/yao.py output-review",
"python3 scripts/yao.py skill-os2-audit . --generated-at <YYYY-MM-DD>",
@@ -55,6 +56,7 @@ TASK_TEMPLATES: dict[str, dict[str, Any]] = {
],
"evidence_artifacts": [
"reports/output_blind_review_pack.md",
"reports/output_review_kit.md",
"reports/output_review_decisions.json",
"reports/output_review_adjudication.json",
"reports/output_review_adjudication.md",
+8
View File
@@ -63,6 +63,7 @@ def evidence_paths(skill_dir: Path) -> dict[str, str]:
"output_eval": "reports/output_quality_scorecard.md",
"output_execution": "reports/output_execution_runs.md",
"output_blind_review": "reports/output_blind_review_pack.md",
"output_review_kit": "reports/output_review_kit.md",
"output_review_decisions": "reports/output_review_decisions.json",
"output_review_adjudication": "reports/output_review_adjudication.md",
"benchmark_reproducibility": "reports/benchmark_reproducibility.md",
@@ -103,6 +104,7 @@ def load_review_data(skill_dir: Path) -> dict[str, dict[str, Any]]:
"output_quality": load_json(reports / "output_quality_scorecard.json"),
"output_execution": load_json(reports / "output_execution_runs.json"),
"output_blind_review": load_json(reports / "output_blind_review_pack.json"),
"output_review_kit": load_json(reports / "output_review_kit.json"),
"output_review_adjudication": load_json(reports / "output_review_adjudication.json"),
"skill_os2_coverage": load_json(reports / "skill_os2_coverage.json"),
"compiled_targets": load_json(reports / "compiled_targets.json"),
@@ -136,6 +138,7 @@ def insight_cards(data: dict[str, dict[str, Any]]) -> list[dict[str, str]]:
output = data["output_quality"].get("summary", {})
output_execution = data["output_execution"].get("summary", {})
output_blind = data["output_blind_review"].get("summary", {})
output_review_kit = data["output_review_kit"].get("summary", {})
output_review = data["output_review_adjudication"].get("summary", {})
blueprint = data["skill_os2_coverage"].get("summary", {})
compiled = data["compiled_targets"].get("summary", {})
@@ -184,6 +187,11 @@ def insight_cards(data: dict[str, dict[str, Any]]) -> list[dict[str, str]]:
"value": str(output_blind.get("pair_count", 0)),
"detail": "review pairs hide baseline vs with-skill labels",
},
{
"label": "Review Kit",
"value": f"{output_review_kit.get('ready_for_adjudication_count', 0)}/{output_review_kit.get('case_count', 0)}",
"detail": f"pending {output_review_kit.get('pending_decision_count', 0)}; answer key hidden",
},
{
"label": "Review A/B",
"value": f"{output_review.get('judgment_count', 0)}/{output_review.get('pair_count', 0)}",
+1 -1
View File
@@ -78,7 +78,7 @@ def render_output_review_section(adjudication: dict[str, Any]) -> str:
return (
"<section>"
"<h2>评审清单</h2>"
"<p class='muted'>每张卡片对应一个 blind A/B case,说明当前是否待判、答案是否仍隐藏、应填写的决策文件、有效字段和复跑命令。</p>"
"<p class='muted'>先打开 reports/output_review_kit.md每张卡片对应一个 blind A/B case,说明当前是否待判、答案是否仍隐藏、应填写的决策文件、有效字段和复跑命令。</p>"
f"{render_output_review_checklist(adjudication)}"
"</section>"
)
+11 -1
View File
@@ -475,6 +475,7 @@ def build_report_model(skill_dir: Path) -> dict:
output_quality = load_json(skill_dir / "reports" / "output_quality_scorecard.json")
output_execution = load_json(skill_dir / "reports" / "output_execution_runs.json")
output_blind_review = load_json(skill_dir / "reports" / "output_blind_review_pack.json")
output_review_kit = load_json(skill_dir / "reports" / "output_review_kit.json")
output_review_adjudication = load_json(skill_dir / "reports" / "output_review_adjudication.json")
benchmark_reproducibility = load_json(skill_dir / "reports" / "benchmark_reproducibility.json")
conformance = load_json(skill_dir / "reports" / "conformance_matrix.json")
@@ -550,8 +551,11 @@ def build_report_model(skill_dir: Path) -> dict:
if (skill_dir / "reports" / "output_blind_answer_key.json").exists():
insert_after = deliverables.index("reports/output_blind_review_pack.md") + 1 if "reports/output_blind_review_pack.md" in deliverables else deliverables.index("reports/output_quality_scorecard.md") + 1
deliverables.insert(insert_after, "reports/output_blind_answer_key.json")
if (skill_dir / "reports" / "output_review_kit.md").exists():
insert_after = deliverables.index("reports/output_blind_review_pack.md") + 1 if "reports/output_blind_review_pack.md" in deliverables else deliverables.index("reports/output_quality_scorecard.md") + 1
deliverables.insert(insert_after, "reports/output_review_kit.md")
if (skill_dir / "reports" / "output_review_adjudication.md").exists():
insert_after = deliverables.index("reports/output_blind_answer_key.json") + 1 if "reports/output_blind_answer_key.json" in deliverables else deliverables.index("reports/output_quality_scorecard.md") + 1
insert_after = deliverables.index("reports/output_review_kit.md") + 1 if "reports/output_review_kit.md" in deliverables else deliverables.index("reports/output_quality_scorecard.md") + 1
deliverables.insert(insert_after, "reports/output_review_adjudication.md")
if (skill_dir / "reports" / "benchmark_reproducibility.md").exists():
insert_after = deliverables.index("reports/output_review_adjudication.md") + 1 if "reports/output_review_adjudication.md" in deliverables else deliverables.index("reports/output_quality_scorecard.md") + 1
@@ -680,6 +684,12 @@ def build_report_model(skill_dir: Path) -> dict:
"pair_count": output_blind_review.get("summary", {}).get("pair_count", 0),
"answer_key_separate": output_blind_review.get("summary", {}).get("answer_key_separate", False),
},
"output_review_kit": {
"ok": output_review_kit.get("ok", False),
"summary": output_review_kit.get("summary", {}),
"artifacts": output_review_kit.get("artifacts", {}),
"failures": output_review_kit.get("failures", []),
},
"output_review_adjudication": {
"ok": output_review_adjudication.get("ok", False),
"summary": output_review_adjudication.get("summary", {}),
+21
View File
@@ -167,6 +167,7 @@ def command_report(args: argparse.Namespace) -> int:
run_script("compile_skill.py", [str(ROOT)]),
run_script("run_output_eval.py", []),
run_script("run_output_execution.py", ["--runner-command", local_output_runner_command()]),
run_script("prepare_output_review_kit.py", []),
run_script("adjudicate_output_review.py", []),
run_script("render_adoption_drift_report.py", [str(ROOT)]),
run_script("render_telemetry_hook_recipes.py", [str(ROOT)]),
@@ -201,6 +202,7 @@ def command_report(args: argparse.Namespace) -> int:
"system_model": "reports/system-model.json",
"compiled_targets": "reports/compiled_targets.json",
"output_execution": "reports/output_execution_runs.json",
"output_review_kit": "reports/output_review_kit.json",
"output_review_adjudication": "reports/output_review_adjudication.json",
"adoption_drift": "reports/adoption_drift_report.json",
"telemetry_hooks": "reports/telemetry_hook_recipes.json",
@@ -501,6 +503,25 @@ def command_output_execution(args: argparse.Namespace) -> int:
return 0 if result["ok"] else 2
def command_output_review_kit(args: argparse.Namespace) -> int:
cmd = []
if args.blind_pack_json:
cmd.extend(["--blind-pack-json", args.blind_pack_json])
if args.blind_pack_md:
cmd.extend(["--blind-pack-md", args.blind_pack_md])
if args.decisions:
cmd.extend(["--decisions", args.decisions])
if args.output_json:
cmd.extend(["--output-json", args.output_json])
if args.output_md:
cmd.extend(["--output-md", args.output_md])
if args.write_template:
cmd.append("--write-template")
result = run_script("prepare_output_review_kit.py", cmd)
print(json.dumps(result["payload"] if result["payload"] is not None else result, ensure_ascii=False, indent=2))
return 0 if result["ok"] else 2
def command_output_review(args: argparse.Namespace) -> int:
cmd = []
if args.blind_pack:
+12
View File
@@ -587,6 +587,18 @@ def build_parser(command_handlers: dict[str, Callable[[argparse.Namespace], int]
output_eval_cmd.add_argument("--blind-answer-key-json")
output_eval_cmd.set_defaults(func=_handler(command_handlers, "command_output_eval"))
output_review_kit_cmd = subparsers.add_parser(
"output-review-kit",
help="Prepare a reviewer-facing blind A/B output review kit without exposing the answer key.",
)
output_review_kit_cmd.add_argument("--blind-pack-json")
output_review_kit_cmd.add_argument("--blind-pack-md")
output_review_kit_cmd.add_argument("--decisions")
output_review_kit_cmd.add_argument("--output-json")
output_review_kit_cmd.add_argument("--output-md")
output_review_kit_cmd.add_argument("--write-template", action="store_true")
output_review_kit_cmd.set_defaults(func=_handler(command_handlers, "command_output_review_kit"))
output_execution_cmd = subparsers.add_parser(
"output-exec",
help="Record output-eval execution evidence, timing, and token usage.",
+2 -2
View File
@@ -129,6 +129,7 @@
"scripts/lint_skill.py",
"scripts/local_output_eval_runner.py",
"scripts/optimize_description.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
@@ -186,8 +187,7 @@
"scripts/skill_report_layout.py",
"scripts/skill_report_metrics.py",
"scripts/skill_report_model.py",
"scripts/sync_local_install.py",
"scripts/telemetry_native_host.py"
"scripts/sync_local_install.py"
],
"assets": [
"templates/basic_skill.md.j2",
+1
View File
@@ -41,6 +41,7 @@
"scripts/lint_skill.py",
"scripts/local_output_eval_runner.py",
"scripts/optimize_description.py",
"scripts/prepare_output_review_kit.py",
"scripts/prepare_world_class_submission_kit.py",
"scripts/probe_runtime_permissions.py",
"scripts/promotion_checker.py",
+203
View File
@@ -0,0 +1,203 @@
#!/usr/bin/env python3
import json
import shutil
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
OUTPUT_EVAL = ROOT / "scripts" / "run_output_eval.py"
REVIEW_KIT = ROOT / "scripts" / "prepare_output_review_kit.py"
CLI = ROOT / "scripts" / "yao.py"
def run(args: list[str], check: bool = True) -> subprocess.CompletedProcess[str]:
return subprocess.run(
[sys.executable, *args],
cwd=ROOT,
capture_output=True,
text=True,
check=check,
)
def assert_no_answer_key_leak(text: str) -> None:
forbidden = [
"output_blind_answer_key",
"expected_winner",
"variant_a_role",
"variant_b_role",
"score_winner_role",
]
for needle in forbidden:
assert needle not in text, f"review kit leaked hidden field {needle!r}"
def main() -> None:
tmp_root = ROOT / "tests" / "tmp_output_review_kit"
if tmp_root.exists():
shutil.rmtree(tmp_root)
tmp_root.mkdir(parents=True, exist_ok=True)
scorecard_json = tmp_root / "output_quality_scorecard.json"
scorecard_md = tmp_root / "output_quality_scorecard.md"
blind_pack_json = tmp_root / "output_blind_review_pack.json"
blind_pack_md = tmp_root / "output_blind_review_pack.md"
answer_key_json = tmp_root / "output_blind_answer_key.json"
run(
[
str(OUTPUT_EVAL),
"--cases",
str(ROOT / "evals" / "output" / "cases.jsonl"),
"--output-json",
str(scorecard_json),
"--output-md",
str(scorecard_md),
"--blind-pack-json",
str(blind_pack_json),
"--blind-pack-md",
str(blind_pack_md),
"--blind-answer-key-json",
str(answer_key_json),
]
)
decisions_path = tmp_root / "output_review_decisions.json"
kit_json = tmp_root / "output_review_kit.json"
kit_md = tmp_root / "output_review_kit.md"
pending_proc = run(
[
str(REVIEW_KIT),
"--blind-pack-json",
str(blind_pack_json),
"--blind-pack-md",
str(blind_pack_md),
"--decisions",
str(decisions_path),
"--output-json",
str(kit_json),
"--output-md",
str(kit_md),
"--write-template",
]
)
pending_payload = json.loads(pending_proc.stdout)
assert pending_payload["ok"], pending_payload
assert pending_payload["template_written"], pending_payload
assert pending_payload["summary"]["case_count"] == 5, pending_payload
assert pending_payload["summary"]["pending_decision_count"] == 5, pending_payload
assert pending_payload["summary"]["ready_for_adjudication_count"] == 0, pending_payload
assert pending_payload["summary"]["answer_key_hidden"] is True, pending_payload
assert pending_payload["summary"]["answer_key_path_exposed"] is False, pending_payload
assert pending_payload["summary"]["ready_to_run_adjudication"] is False, pending_payload
assert "answer_key" not in pending_payload["artifacts"], pending_payload["artifacts"]
assert len(pending_payload["cases"]) == 5, pending_payload["cases"]
first_case = pending_payload["cases"][0]
assert first_case["variant_a"]["output"], first_case
assert first_case["variant_b"]["output"], first_case
assert first_case["decision_state"]["status"] == "awaiting-decision", first_case
assert decisions_path.exists(), decisions_path
kit_json_text = kit_json.read_text(encoding="utf-8")
kit_md_text = kit_md.read_text(encoding="utf-8")
assert "# Output Review Kit" in kit_md_text, kit_md_text
assert "answer key path exposed: `false`" in kit_md_text, kit_md_text
assert "Variant A" in kit_md_text and "Variant B" in kit_md_text, kit_md_text
assert "python3 scripts/yao.py output-review" in kit_md_text, kit_md_text
assert_no_answer_key_leak(kit_json_text)
assert_no_answer_key_leak(kit_md_text)
cli_proc = run(
[
str(CLI),
"output-review-kit",
"--blind-pack-json",
str(blind_pack_json),
"--blind-pack-md",
str(blind_pack_md),
"--decisions",
str(decisions_path),
"--output-json",
str(tmp_root / "cli_output_review_kit.json"),
"--output-md",
str(tmp_root / "cli_output_review_kit.md"),
]
)
cli_payload = json.loads(cli_proc.stdout)
assert cli_payload["ok"], cli_payload
assert cli_payload["summary"]["case_count"] == 5, cli_payload
assert cli_payload["summary"]["answer_key_hidden"] is True, cli_payload
assert "answer_key" not in cli_payload["artifacts"], cli_payload["artifacts"]
template = json.loads(decisions_path.read_text(encoding="utf-8"))
filled = {
"schema_version": "1.0",
"reviewer": "Yao QA",
"reviewed_at": "2026-06-14",
"decisions": [
{
"case_id": item["case_id"],
"winner_variant": "A",
"confidence": 0.8,
"reason": "Variant A is clearer against the visible rubric.",
}
for item in template["decisions"]
],
}
decisions_path.write_text(json.dumps(filled, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
ready_proc = run(
[
str(REVIEW_KIT),
"--blind-pack-json",
str(blind_pack_json),
"--blind-pack-md",
str(blind_pack_md),
"--decisions",
str(decisions_path),
"--output-json",
str(tmp_root / "ready_output_review_kit.json"),
"--output-md",
str(tmp_root / "ready_output_review_kit.md"),
]
)
ready_payload = json.loads(ready_proc.stdout)
assert ready_payload["ok"], ready_payload
assert ready_payload["summary"]["ready_for_adjudication_count"] == 5, ready_payload
assert ready_payload["summary"]["pending_decision_count"] == 0, ready_payload
assert ready_payload["summary"]["invalid_decision_count"] == 0, ready_payload
assert ready_payload["summary"]["reviewer_metadata_present"] is True, ready_payload
assert ready_payload["summary"]["ready_to_run_adjudication"] is True, ready_payload
assert all(case["decision_state"]["status"] == "ready-for-adjudication" for case in ready_payload["cases"]), ready_payload
invalid = dict(filled)
invalid["decisions"] = [dict(filled["decisions"][0], winner_variant="C", reason="")]
invalid_path = tmp_root / "invalid_output_review_decisions.json"
invalid_path.write_text(json.dumps(invalid, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
invalid_proc = run(
[
str(REVIEW_KIT),
"--blind-pack-json",
str(blind_pack_json),
"--blind-pack-md",
str(blind_pack_md),
"--decisions",
str(invalid_path),
"--output-json",
str(tmp_root / "invalid_output_review_kit.json"),
"--output-md",
str(tmp_root / "invalid_output_review_kit.md"),
]
)
invalid_payload = json.loads(invalid_proc.stdout)
assert invalid_payload["ok"], invalid_payload
assert invalid_payload["summary"]["invalid_decision_count"] == 1, invalid_payload
assert invalid_payload["summary"]["answer_key_hidden"] is True, invalid_payload
assert invalid_payload["cases"][0]["decision_state"]["status"] == "needs-fix", invalid_payload["cases"][0]
print(json.dumps({"ok": True}, ensure_ascii=False, indent=2))
if __name__ == "__main__":
main()
+2
View File
@@ -89,6 +89,7 @@ def main() -> None:
assert "world-class-submission-review" in parser_help, parser_help
assert "world-class-claim-guard" in parser_help, parser_help
assert "benchmark-reproducibility" in parser_help, parser_help
assert "output-review-kit" in parser_help, parser_help
assert "telemetry-import" in parser_help, parser_help
assert "telemetry-emit" in parser_help, parser_help
assert "telemetry-hooks" in parser_help, parser_help
@@ -757,6 +758,7 @@ def main() -> None:
assert "prompt_quality_profile" in report_result["payload"]["artifacts"], report_result
assert "compiled_targets" in report_result["payload"]["artifacts"], report_result
assert "output_execution" in report_result["payload"]["artifacts"], report_result
assert "output_review_kit" in report_result["payload"]["artifacts"], report_result
assert "output_review_adjudication" in report_result["payload"]["artifacts"], report_result
assert "adoption_drift" in report_result["payload"]["artifacts"], report_result
assert "review_annotations" in report_result["payload"]["artifacts"], report_result