diff --git a/registry/index.json b/registry/index.json index 88ea06cd..70023570 100644 --- a/registry/index.json +++ b/registry/index.json @@ -16,7 +16,7 @@ "vscode" ], "package_metadata": "registry/packages/yao-meta-skill.json", - "package_sha256": "b2ab2a00182b60cc9e702de55d8cad1dfc9e49a50b7f8a01ac896ffdf0ee030d" + "package_sha256": "c0c5e61a719efa6217dedd4e04de0b4a175ab73194a4b4ee2cbd18394240ce98" } ] } diff --git a/registry/packages/yao-meta-skill.json b/registry/packages/yao-meta-skill.json index 7bfd809b..a1fc07d1 100644 --- a/registry/packages/yao-meta-skill.json +++ b/registry/packages/yao-meta-skill.json @@ -16,8 +16,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "b2ab2a00182b60cc9e702de55d8cad1dfc9e49a50b7f8a01ac896ffdf0ee030d", - "archive_sha256": "c4ab5ba9c345474701486a405d0fc43bf9317ecfc577fe5e67cbbbd63f54fa26" + "package_sha256": "c0c5e61a719efa6217dedd4e04de0b4a175ab73194a4b4ee2cbd18394240ce98", + "archive_sha256": "889886dd1eaeed6a4996a739f9312f47d67ec04ba3a1396bae7dc351b9b40dcf" }, "compatibility": { "openai": "pass", @@ -48,7 +48,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "c4ab5ba9c345474701486a405d0fc43bf9317ecfc577fe5e67cbbbd63f54fa26", + "archive_sha256": "889886dd1eaeed6a4996a739f9312f47d67ec04ba3a1396bae7dc351b9b40dcf", "package_verification": "reports/package_verification.json", "install_simulated": true, "install_simulation": "reports/install_simulation.json" diff --git a/reports/architecture_maintainability.json b/reports/architecture_maintainability.json index f792e823..17feee51 100644 --- a/reports/architecture_maintainability.json +++ b/reports/architecture_maintainability.json @@ -31,11 +31,18 @@ }, { "path": "scripts/yao_cli_parser.py", - "lines": 821, + "lines": 822, "kind": "internal-module", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, + { + "path": "scripts/render_evidence_consistency.py", + "lines": 810, + "kind": "cli-script", + "severity": "pass", + "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." + }, { "path": "scripts/skill_report_layout.py", "lines": 808, @@ -43,13 +50,6 @@ "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, - { - "path": "scripts/render_evidence_consistency.py", - "lines": 804, - "kind": "cli-script", - "severity": "pass", - "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." - }, { "path": "scripts/skill_report_model.py", "lines": 801, @@ -117,11 +117,18 @@ }, { "path": "scripts/yao_cli_parser.py", - "lines": 821, + "lines": 822, "kind": "internal-module", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, + { + "path": "scripts/render_evidence_consistency.py", + "lines": 810, + "kind": "cli-script", + "severity": "pass", + "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." + }, { "path": "scripts/skill_report_layout.py", "lines": 808, @@ -129,13 +136,6 @@ "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." }, - { - "path": "scripts/render_evidence_consistency.py", - "lines": 804, - "kind": "cli-script", - "severity": "pass", - "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." - }, { "path": "scripts/skill_report_model.py", "lines": 801, diff --git a/reports/architecture_maintainability.md b/reports/architecture_maintainability.md index 01a2705b..1eb80c43 100644 --- a/reports/architecture_maintainability.md +++ b/reports/architecture_maintainability.md @@ -30,9 +30,9 @@ No file-size hotspots found. | File | Lines | Kind | Recommended next split | | --- | ---: | --- | --- | | `tests/verify_yao_cli.py` | `899` | `test` | Break broad integration assertions into focused verifier helpers when the next behavior change lands. | -| `scripts/yao_cli_parser.py` | `821` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | +| `scripts/yao_cli_parser.py` | `822` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | +| `scripts/render_evidence_consistency.py` | `810` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/skill_report_layout.py` | `808` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | -| `scripts/render_evidence_consistency.py` | `804` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/skill_report_model.py` | `801` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `tests/verify_review_studio.py` | `763` | `test` | Break broad integration assertions into focused verifier helpers when the next behavior change lands. | | `scripts/compile_skill.py` | `734` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | @@ -44,9 +44,9 @@ No file-size hotspots found. | File | Lines | Kind | Severity | | --- | ---: | --- | --- | | `tests/verify_yao_cli.py` | `899` | `test` | `pass` | -| `scripts/yao_cli_parser.py` | `821` | `internal-module` | `pass` | +| `scripts/yao_cli_parser.py` | `822` | `internal-module` | `pass` | +| `scripts/render_evidence_consistency.py` | `810` | `cli-script` | `pass` | | `scripts/skill_report_layout.py` | `808` | `internal-module` | `pass` | -| `scripts/render_evidence_consistency.py` | `804` | `cli-script` | `pass` | | `scripts/skill_report_model.py` | `801` | `internal-module` | `pass` | | `tests/verify_review_studio.py` | `763` | `test` | `pass` | | `scripts/compile_skill.py` | `734` | `cli-script` | `pass` | diff --git a/reports/context_budget.json b/reports/context_budget.json index 3623c3d5..9e814834 100644 --- a/reports/context_budget.json +++ b/reports/context_budget.json @@ -6,15 +6,15 @@ "context_budget_tier": "production", "context_budget_limit": 1000, "skill_body_tokens": 767, - "other_text_tokens": 969817, + "other_text_tokens": 973078, "estimated_initial_load_tokens": 960, - "estimated_total_text_tokens": 970584, - "deferred_resource_tokens": 446157, + "estimated_total_text_tokens": 973845, + "deferred_resource_tokens": 449071, "deferred_resource_warn_threshold": 120000, "deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 396946, + "estimated_tokens": 399860, "file_count": 113 }, { @@ -31,7 +31,7 @@ "large_deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 396946, + "estimated_tokens": 399860, "file_count": 113 } ], @@ -54,7 +54,7 @@ ], "missing": [], "path": "scripts", - "estimated_tokens": 396946, + "estimated_tokens": 399860, "file_count": 113, "rationale": "Script resources are deterministic deferred tools, not initial-load prompt context." } diff --git a/reports/context_budget.md b/reports/context_budget.md index 202156fa..53f06ffc 100644 --- a/reports/context_budget.md +++ b/reports/context_budget.md @@ -2,7 +2,7 @@ | Target | Path | Tier | Limit | Initial | SKILL | Deferred | Resource Governance | Large Deferred Dirs | Quality Density | Unused Dirs | Status | | --- | --- | --- | ---: | ---: | ---: | ---: | --- | --- | ---: | --- | --- | -| root | `.` | `production` | 1000 | 960 | 767 | 446157 | `governed` | scripts:396946 | 135.4 | - | ok | +| root | `.` | `production` | 1000 | 960 | 767 | 449071 | `governed` | scripts:399860 | 135.4 | - | ok | | complex-release-orchestrator | `examples/complex-release-orchestrator/generated-skill` | `production` | 1000 | 790 | 718 | 1657 | `not-required` | - | 164.6 | - | ok | | governed-incident-command | `examples/governed-incident-command/generated-skill` | `production` | 1000 | 760 | 658 | 1030 | `not-required` | - | 171.1 | - | ok | diff --git a/reports/context_budget_summary.json b/reports/context_budget_summary.json index 84cf62f9..d7217489 100644 --- a/reports/context_budget_summary.json +++ b/reports/context_budget_summary.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-06-16", + "generated_at": "2026-03-31", "targets": [ { "label": "root", @@ -8,11 +8,11 @@ "budget_limit": 1000, "initial_tokens": 960, "skill_body_tokens": 767, - "deferred_resource_tokens": 446157, + "deferred_resource_tokens": 449071, "large_deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 396946, + "estimated_tokens": 399860, "file_count": 113 } ], @@ -35,7 +35,7 @@ ], "missing": [], "path": "scripts", - "estimated_tokens": 396946, + "estimated_tokens": 399860, "file_count": 113, "rationale": "Script resources are deterministic deferred tools, not initial-load prompt context." } diff --git a/reports/install_simulation.json b/reports/install_simulation.json index e35aeac5..47384453 100644 --- a/reports/install_simulation.json +++ b/reports/install_simulation.json @@ -8,7 +8,7 @@ "installed_skill_dir": "dist/install-simulation/simulate-yao-meta-skill/yao-meta-skill", "summary": { "archive_present": true, - "archive_entry_count": 623, + "archive_entry_count": 624, "archive_extracted": true, "entrypoint_loaded": true, "manifest_loaded": true, diff --git a/reports/output_execution_runs.json b/reports/output_execution_runs.json index 721cc52d..298bb98a 100644 --- a/reports/output_execution_runs.json +++ b/reports/output_execution_runs.json @@ -34,7 +34,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 26.29, + "duration_ms": 26.62, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -62,7 +62,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 36.18, + "duration_ms": 26.35, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -85,7 +85,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.9, + "duration_ms": 27.54, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -113,7 +113,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 30.7, + "duration_ms": 29.8, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -136,7 +136,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 30.23, + "duration_ms": 30.04, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -164,7 +164,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 26.0, + "duration_ms": 26.25, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -187,7 +187,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 25.99, + "duration_ms": 25.68, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -214,7 +214,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 25.82, + "duration_ms": 25.66, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -237,7 +237,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 25.84, + "duration_ms": 26.49, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -266,7 +266,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 25.92, + "duration_ms": 26.28, "provider": "local-output-eval-runner", "model": "", "usage": { diff --git a/reports/output_execution_runs.md b/reports/output_execution_runs.md index 3a24699e..93d41e4e 100644 --- a/reports/output_execution_runs.md +++ b/reports/output_execution_runs.md @@ -23,16 +23,16 @@ Command runner evidence is present. This proves the eval harness executed an ext | Case | Variant | Mode | Model | Duration ms | Tokens | Score | Status | | --- | --- | --- | --- | ---: | ---: | ---: | --- | -| skill-package-contract | baseline | command | local-output-eval-runner | 26.29 | 33 | 0.0 | pass | -| skill-package-contract | with_skill | command | local-output-eval-runner | 36.18 | 73 | 100.0 | pass | -| output-eval-expectation | baseline | command | local-output-eval-runner | 29.9 | 36 | 0.0 | pass | -| output-eval-expectation | with_skill | command | local-output-eval-runner | 30.7 | 80 | 100.0 | pass | -| ir-before-packaging | baseline | command | local-output-eval-runner | 30.23 | 33 | 0.0 | pass | -| ir-before-packaging | with_skill | command | local-output-eval-runner | 26.0 | 80 | 100.0 | pass | -| near-neighbor-boundary | baseline | command | local-output-eval-runner | 25.99 | 36 | 0.0 | pass | -| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 25.82 | 65 | 100.0 | pass | -| file-backed-governed-package | baseline | command | local-output-eval-runner | 25.84 | 37 | 0.0 | pass | -| file-backed-governed-package | with_skill | command | local-output-eval-runner | 25.92 | 98 | 100.0 | pass | +| skill-package-contract | baseline | command | local-output-eval-runner | 26.62 | 33 | 0.0 | pass | +| skill-package-contract | with_skill | command | local-output-eval-runner | 26.35 | 73 | 100.0 | pass | +| output-eval-expectation | baseline | command | local-output-eval-runner | 27.54 | 36 | 0.0 | pass | +| output-eval-expectation | with_skill | command | local-output-eval-runner | 29.8 | 80 | 100.0 | pass | +| ir-before-packaging | baseline | command | local-output-eval-runner | 30.04 | 33 | 0.0 | pass | +| ir-before-packaging | with_skill | command | local-output-eval-runner | 26.25 | 80 | 100.0 | pass | +| near-neighbor-boundary | baseline | command | local-output-eval-runner | 25.68 | 36 | 0.0 | pass | +| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 25.66 | 65 | 100.0 | pass | +| file-backed-governed-package | baseline | command | local-output-eval-runner | 26.49 | 37 | 0.0 | pass | +| file-backed-governed-package | with_skill | command | local-output-eval-runner | 26.28 | 98 | 100.0 | pass | ## Next Fixes diff --git a/reports/package_verification.json b/reports/package_verification.json index 5a8ca99a..4a1398bb 100644 --- a/reports/package_verification.json +++ b/reports/package_verification.json @@ -8,8 +8,8 @@ "target_count": 4, "adapter_count": 4, "archive_present": true, - "archive_sha256": "c4ab5ba9c345474701486a405d0fc43bf9317ecfc577fe5e67cbbbd63f54fa26", - "archive_entry_count": 623, + "archive_sha256": "889886dd1eaeed6a4996a739f9312f47d67ec04ba3a1396bae7dc351b9b40dcf", + "archive_entry_count": 624, "failure_count": 0, "warning_count": 0 }, diff --git a/reports/package_verification.md b/reports/package_verification.md index 1b9705d5..f3ad6d67 100644 --- a/reports/package_verification.md +++ b/reports/package_verification.md @@ -4,7 +4,7 @@ - Package directory: `dist` - Targets: `4 / 4` adapters present - Archive present: `True` -- Archive SHA256: `c4ab5ba9c345474701486a405d0fc43bf9317ecfc577fe5e67cbbbd63f54fa26` +- Archive SHA256: `889886dd1eaeed6a4996a739f9312f47d67ec04ba3a1396bae7dc351b9b40dcf` - Failures: `0` - Warnings: `0` diff --git a/reports/registry_audit.json b/reports/registry_audit.json index 83918dcc..a31e1e09 100644 --- a/reports/registry_audit.json +++ b/reports/registry_audit.json @@ -21,8 +21,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "b2ab2a00182b60cc9e702de55d8cad1dfc9e49a50b7f8a01ac896ffdf0ee030d", - "archive_sha256": "c4ab5ba9c345474701486a405d0fc43bf9317ecfc577fe5e67cbbbd63f54fa26" + "package_sha256": "c0c5e61a719efa6217dedd4e04de0b4a175ab73194a4b4ee2cbd18394240ce98", + "archive_sha256": "889886dd1eaeed6a4996a739f9312f47d67ec04ba3a1396bae7dc351b9b40dcf" }, "compatibility": { "openai": "pass", @@ -53,7 +53,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "c4ab5ba9c345474701486a405d0fc43bf9317ecfc577fe5e67cbbbd63f54fa26", + "archive_sha256": "889886dd1eaeed6a4996a739f9312f47d67ec04ba3a1396bae7dc351b9b40dcf", "package_verification": "reports/package_verification.json", "install_simulated": true, "install_simulation": "reports/install_simulation.json" @@ -78,7 +78,7 @@ "vscode" ], "package_metadata": "registry/packages/yao-meta-skill.json", - "package_sha256": "b2ab2a00182b60cc9e702de55d8cad1dfc9e49a50b7f8a01ac896ffdf0ee030d" + "package_sha256": "c0c5e61a719efa6217dedd4e04de0b4a175ab73194a4b4ee2cbd18394240ce98" } ] }, diff --git a/reports/registry_audit.md b/reports/registry_audit.md index 2b2f395c..0b4e9470 100644 --- a/reports/registry_audit.md +++ b/reports/registry_audit.md @@ -6,8 +6,8 @@ - Maturity: `governed` - Owner: `Yao Team` - License: `MIT` -- Package SHA256: `b2ab2a00182b60cc9e702de55d8cad1dfc9e49a50b7f8a01ac896ffdf0ee030d` -- Archive SHA256: `c4ab5ba9c345474701486a405d0fc43bf9317ecfc577fe5e67cbbbd63f54fa26` +- Package SHA256: `c0c5e61a719efa6217dedd4e04de0b4a175ab73194a4b4ee2cbd18394240ce98` +- Archive SHA256: `889886dd1eaeed6a4996a739f9312f47d67ec04ba3a1396bae7dc351b9b40dcf` - Install simulated: `True` ## Compatibility diff --git a/reports/security_trust_report.json b/reports/security_trust_report.json index 719797ab..6da19529 100644 --- a/reports/security_trust_report.json +++ b/reports/security_trust_report.json @@ -23,7 +23,7 @@ "interactive_script_count": 0, "package_hash_scope": "source-contract-without-generated-reports", "package_hash_file_count": 200, - "package_sha256": "b2ab2a00182b60cc9e702de55d8cad1dfc9e49a50b7f8a01ac896ffdf0ee030d" + "package_sha256": "c0c5e61a719efa6217dedd4e04de0b4a175ab73194a4b4ee2cbd18394240ce98" }, "failures": [], "warnings": [], diff --git a/reports/security_trust_report.md b/reports/security_trust_report.md index d0a15d90..935ae918 100644 --- a/reports/security_trust_report.md +++ b/reports/security_trust_report.md @@ -16,7 +16,7 @@ - Interactive scripts: `0` - Package hash scope: `source-contract-without-generated-reports` - Package hash files: `200` -- Package SHA256: `b2ab2a00182b60cc9e702de55d8cad1dfc9e49a50b7f8a01ac896ffdf0ee030d` +- Package SHA256: `c0c5e61a719efa6217dedd4e04de0b4a175ab73194a4b4ee2cbd18394240ce98` ## Failures diff --git a/reports/skill-os-2-review.md b/reports/skill-os-2-review.md index 66e233ca..31487260 100644 --- a/reports/skill-os-2-review.md +++ b/reports/skill-os-2-review.md @@ -119,14 +119,14 @@ Next move: add real client or installer permission enforcement integration. | Runtime Permission Probes | `4 / 4` target adapters probed, `0` native-enforcement adapters, `4` explicit metadata fallbacks, `4` residual risks retained for reviewer visibility | | Skill Atlas | `12` scanned skills, `1` actionable root skill, `1` telemetry report, `0` actionable route collisions, `0` actionable owner gaps, `0` actionable stale skills, `0` actionable drift signals, `24` scoped non-actionable issue signals retained for visibility | | Registry Audit | package metadata generated with version, owner, license, source checksum, archive checksum, Skill IR provenance, and compatibility matrix | -| Package Verification | `4 / 4` target adapters present, archive verified, `623` zip entries, `0` failures, `0` warnings | -| Install Simulation | archive with `623` entries extracted into a local verification root, entrypoint/manifest/interface loaded, reports present, `4` adapters readable, `12` installer permission checks enforced, `0` permission failures, `0` failures, `0` warnings | +| Package Verification | `4 / 4` target adapters present, archive verified, `624` zip entries, `0` failures, `0` warnings | +| Install Simulation | archive with `624` entries extracted into a local verification root, entrypoint/manifest/interface loaded, reports present, `4` adapters readable, `12` installer permission checks enforced, `0` permission failures, `0` failures, `0` warnings | | Local Install Sync Preflight | `make sync-local-install` and `make sync-active-install` rebuild the package first, then sync only after install simulation passes with `12` enforced installer permission checks and `0` permission failures | | Upgrade Check | current package declares `minor` over the 1.0.0 baseline, recommended bump is `minor`, and release notes include added targets plus checksum changes | | Adoption Drift | `1` metadata-only review event, `0` adoption samples, adoption `0`, risk band `low`; optional `yao.py` CLI capture, external client `telemetry-emit`, `5` `telemetry-hooks` recipes, Browser/Chrome native messaging host, and validated external JSONL import are available but off by default for reproducible release evidence; raw `reports/telemetry_events.jsonl` is gitignored and blocked from zip packages | | Review Waivers | ledger generated; current release has `1` warning gate that still needs reviewer decision or a time-bounded waiver; blockers remain non-waivable in v0, and world-class evidence gaps must be closed with accepted evidence rather than waived as completed | | Review Annotations | ledger generated; current release has `0` reviewer annotations and `0` open annotation blockers | -| Review Studio | decision `review`, world-class score `89`, `16` gates, `0` blockers, `4` warnings, `3` review actions, `0` open annotation blockers | +| Review Studio | decision `review`, world-class score `91`, `16` gates, `0` blockers, `3` warnings, `3` review actions, `0` open annotation blockers | | Skill OS 2.0 Audit | `15` audited areas, with local foundation evidence separated from human-required and external-required gaps | | World-Class Evidence Plan | `4` remaining evidence tasks: `1` human-required and `3` external-required, all with runbooks, success checks, and privacy contracts | | World-Class Evidence Ledger | `4` evidence entries remain pending: `1` human-required and `3` external-required; anti-overclaim guards block planned work, metadata fallbacks, pending review, and local command runners from counting as completion | diff --git a/reports/skill_os2_audit.json b/reports/skill_os2_audit.json index 0316789a..36953dd1 100644 --- a/reports/skill_os2_audit.json +++ b/reports/skill_os2_audit.json @@ -285,7 +285,7 @@ "key": "registry-distribution", "label": "Registry Distribution", "status": "pass", - "current": "zip entries 623; install failures 0; permission failures 0", + "current": "zip entries 624; install failures 0; permission failures 0", "target": "Package metadata, archive checksum, package verification, and install simulation pass", "evidence": [ { diff --git a/reports/skill_os2_audit.md b/reports/skill_os2_audit.md index 9023414d..08cd0b73 100644 --- a/reports/skill_os2_audit.md +++ b/reports/skill_os2_audit.md @@ -27,7 +27,7 @@ Generated at: `2026-06-16` | Permission Metadata | pass | 4/4 target probes pass; metadata fallback 4; installer enforcement 4 | Packaged adapters expose explicit permission metadata, residual risks, and installer enforcement evidence when available | Preserve residual-risk notes until real native enforcement exists. | | Native Permission Enforcement | external-required | native-enforced targets 0; installer-enforced targets 4 | At least one target/client enforces approved permissions at runtime | Integrate a real target-client or external installer runtime guard before claiming native permission enforcement. | | Skill Atlas | pass | 12 skills; actionable collisions 0 | Workspace catalog, route overlap, stale/owner gaps, drift, and no-route opportunities | Feed real drift data into Atlas once client telemetry is installed. | -| Registry Distribution | pass | zip entries 623; install failures 0; permission failures 0 | Package metadata, archive checksum, package verification, and install simulation pass | Regenerate registry after package verification so checksums stay aligned. | +| Registry Distribution | pass | zip entries 624; install failures 0; permission failures 0 | Package metadata, archive checksum, package verification, and install simulation pass | Regenerate registry after package verification so checksums stay aligned. | | Review Studio | pass | decision review; warnings 3; score 91 | One page shows gates, evidence paths, blockers, warnings, actions, waivers, and annotations | Resolve human/external warning gates before claiming full release readiness. | | Telemetry Drift | pass | events 1; risk low; recipes 5 | Local-first metadata-only event contract, aggregate drift report, hook recipes, and import path | Keep raw JSONL out of distributed packages and use aggregate reports for Atlas. | | Native Client Telemetry | external-required | external source events 0; adoption samples 0 | A real Browser/Chrome/provider client sends production metadata events | Install a real client against the native host and import production metadata-only events. | diff --git a/reports/skill_os2_coverage.json b/reports/skill_os2_coverage.json index 84c7d43e..6f771630 100644 --- a/reports/skill_os2_coverage.json +++ b/reports/skill_os2_coverage.json @@ -204,7 +204,7 @@ "label": "Registry Distribution", "status": "pass", "objective": "Skill packages are installable, versioned, checksumed, and upgrade-reviewable.", - "current": "archive entries 623; install failures 0", + "current": "archive entries 624; install failures 0", "command": "python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .", "test": "python3 tests/verify_registry_audit.py", "evidence": [ diff --git a/reports/skill_os2_coverage.md b/reports/skill_os2_coverage.md index 1576220d..deeaf98d 100644 --- a/reports/skill_os2_coverage.md +++ b/reports/skill_os2_coverage.md @@ -28,7 +28,7 @@ This report maps the Skill OS 2.0 upgrade blueprint to concrete local artifacts, | Runtime Conformance | `pass` | 5/5 targets pass | `python3 scripts/yao.py conformance .` | `python3 tests/verify_conformance_suite.py` | | Trust Security | `pass` | 113 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 623; install failures 0 | `python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .` | `python3 tests/verify_registry_audit.py` | +| Registry Distribution | `pass` | archive entries 624; install failures 0 | `python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip && python3 scripts/yao.py registry-audit .` | `python3 tests/verify_registry_audit.py` | | Review Studio | `pass` | 16 gates; decision review; warnings 3 | `python3 scripts/yao.py review-studio .` | `python3 tests/verify_review_studio.py` | | Telemetry Drift | `pass` | events 1; recipes 5; risk low | `python3 scripts/yao.py telemetry-hooks . && python3 scripts/yao.py adoption-drift .` | `python3 tests/verify_telemetry_hooks.py` | diff --git a/reports/upgrade_check.json b/reports/upgrade_check.json index d05d29a1..9592e582 100644 --- a/reports/upgrade_check.json +++ b/reports/upgrade_check.json @@ -70,12 +70,12 @@ { "field": "archive_sha256", "from": "", - "to": "c4ab5ba9c345474701486a405d0fc43bf9317ecfc577fe5e67cbbbd63f54fa26" + "to": "889886dd1eaeed6a4996a739f9312f47d67ec04ba3a1396bae7dc351b9b40dcf" }, { "field": "package_sha256", "from": "0000000000000000000000000000000000000000000000000000000000000000", - "to": "b2ab2a00182b60cc9e702de55d8cad1dfc9e49a50b7f8a01ac896ffdf0ee030d" + "to": "c0c5e61a719efa6217dedd4e04de0b4a175ab73194a4b4ee2cbd18394240ce98" } ] }, diff --git a/reports/world_class_claim_guard.json b/reports/world_class_claim_guard.json index 1d74c9be..91fcc32f 100644 --- a/reports/world_class_claim_guard.json +++ b/reports/world_class_claim_guard.json @@ -6,7 +6,7 @@ "summary": { "ledger_ready_to_claim_world_class": false, "ledger_pending_count": 4, - "claim_surface_count": 175, + "claim_surface_count": 176, "json_claim_surface_count": 86, "metadata_claim_surface_count": 87, "package_claim_surface_count": 17, @@ -670,6 +670,10 @@ "path": "reports/world_class_evidence_plan.md", "violation_count": 0 }, + { + "path": "reports/world_class_evidence_preflight.html", + "violation_count": 0 + }, { "path": "reports/world_class_evidence_preflight.json", "violation_count": 0 diff --git a/reports/world_class_claim_guard.md b/reports/world_class_claim_guard.md index 4fbacd98..e1467637 100644 --- a/reports/world_class_claim_guard.md +++ b/reports/world_class_claim_guard.md @@ -7,7 +7,7 @@ Generated at: `2026-06-16` - decision: `claim-guard-pass-evidence-pending` - ledger ready to claim world-class: `false` - ledger pending evidence: `4` -- claim surfaces scanned: `175` +- claim surfaces scanned: `176` - JSON claim surfaces scanned: `86` - metadata claim surfaces scanned: `87` - package/runtime claim surfaces scanned: `17` diff --git a/reports/world_class_evidence_preflight.html b/reports/world_class_evidence_preflight.html new file mode 100644 index 00000000..e6a9799d --- /dev/null +++ b/reports/world_class_evidence_preflight.html @@ -0,0 +1,531 @@ + + + + + + World-Class Evidence Preflight + + + + +
+
+ Evidence Collection +

World-Class Evidence Preflight

+

This operator view shows which external and human evidence is still blocked, which commands prepare editable submission drafts, and why preflight never counts as accepted evidence.

+
Decisioncollection-preflight-blocked
Pending4
Ready1
Blocked3
Source6/13
+
+
+
+

Submission Kit

+

Generate drafts only after real provider, human-review, native-permission, or native-client work exists. Drafts remain non-evidence until valid aggregate artifact refs and SHA-256 digests are supplied.

+
    +
  • submissions directory: evidence/world_class/submissions
  • +
  • drafts count as evidence: false
  • +
  • preflight accepts evidence: false
  • +
+
+ +
+

Evidence Queue

+
+
+ external · blocked +

Provider Holdout

+
+
+
Evidence
provider-holdout
+
Ledger
pending
+
Intake
awaiting-submission
+
Review
awaiting-submission
+
Draft
evidence/world_class/submissions/provider-holdout.json
+
+
+

Next Action

+

Set OPENAI_API_KEY in the operator shell; never commit or print the value.

+ python3 scripts/yao.py world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions +
+
+

Prechecks

+
+
+
+ file + Output eval cases +
+
+
Current
present
+
Status
pass
+
Action
Keep output holdout cases available before provider execution.
+
+
+ +
+
+ file + Provider runner +
+
+
Current
present
+
Status
pass
+
Action
Use the provider runner instead of the local command runner for model-backed evidence.
+
+
+ +
+
+ env + Provider credential +
+
+
Current
not-set
+
Status
missing
+
Action
Set OPENAI_API_KEY in the operator shell; never commit or print the value.
+
+
+ +
+
+ env + Provider model +
+
+
Current
not-set
+
Status
optional
+
Action
Optionally set YAO_OUTPUT_EVAL_MODEL; the runbook defaults to gpt-4.1-mini.
+
+
+
+
+
+

Source Checks

+
+
+
+ model_executed_count + Provider model run +
+
+
Current
0
+
Expected
>0
+
Status
blocked
+
Action
Run provider-backed output-exec with real credentials.
+
+
+ +
+
+ timing_observed_count + Timing observed +
+
+
Current
10
+
Expected
>0
+
Status
pass
+
Action
Provider execution should record timing metadata.
+
+
+ +
+
+ token_observed_count + Token usage observed +
+
+
Current
0
+
Expected
>0
+
Status
blocked
+
Action
Provider execution should return non-estimated token usage.
+
+
+
+
+
+

Runbook

+
  • YAO_OUTPUT_EVAL_MODEL=gpt-4.1-mini OPENAI_API_KEY=<redacted> python3 scripts/yao.py output-exec --provider-runner openai --timeout-seconds 60
  • python3 scripts/yao.py skill-os2-audit . --generated-at <YYYY-MM-DD>
  • Copy evidence/world_class/templates/provider-holdout.intake.json to evidence/world_class/submissions/provider-holdout.json and fill only real evidence fields.
  • python3 scripts/yao.py world-class-intake . --submissions-dir evidence/world_class/submissions
+
+
+ +
+
+ human · ready-for-human-review +

Human Adjudication

+
+
+
Evidence
human-adjudication
+
Ledger
pending
+
Intake
awaiting-submission
+
Review
awaiting-submission
+
Draft
evidence/world_class/submissions/human-adjudication.json
+
+
+

Next Action

+

Assign a real reviewer identity before claiming human adjudication.

+ python3 scripts/yao.py world-class-submission-kit . --evidence-key human-adjudication --output-dir evidence/world_class/submissions +
+
+

Prechecks

+
+
+
+ file + Blind review kit +
+
+
Current
present
+
Status
pass
+
Action
Open the blind review kit and record real reviewer choices.
+
+
+ +
+
+ file + Decision template +
+
+
Current
present
+
Status
pass
+
Action
Fill winner_variant values with real A/B decisions.
+
+
+ +
+
+ human + Human reviewer +
+
+
Current
external-human-action
+
Status
human-required
+
Action
Assign a real reviewer identity before claiming human adjudication.
+
+
+
+
+
+

Source Checks

+
+
+
+ pair_count + Review pairs exist +
+
+
Current
5
+
Expected
>0
+
Status
pass
+
Action
Generate the blind A/B review pack.
+
+
+ +
+
+ pending_count + No pending decisions +
+
+
Current
5
+
Expected
==0
+
Status
blocked
+
Action
Record a reviewer choice for every pair.
+
+
+ +
+
+ judgment_count + Judgments complete +
+
+
Current
0
+
Expected
==pair_count
+
Status
blocked
+
Action
Every pair needs one valid human judgment.
+
+
+ +
+
+ invalid_decision_count + No invalid decisions +
+
+
Current
0
+
Expected
==0
+
Status
pass
+
Action
Fix malformed winner/confidence entries.
+
+
+
+
+
+

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
  • 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>
  • Copy evidence/world_class/templates/human-adjudication.intake.json to evidence/world_class/submissions/human-adjudication.json and fill only real evidence fields.
  • python3 scripts/yao.py world-class-intake . --submissions-dir evidence/world_class/submissions
+
+
+ +
+
+ external · blocked +

Native Permission Enforcement

+
+
+
Evidence
native-permission-enforcement
+
Ledger
pending
+
Intake
awaiting-submission
+
Review
awaiting-submission
+
Draft
evidence/world_class/submissions/native-permission-enforcement.json
+
+
+

Next Action

+

Attach a real target-client or external installer runtime guard; metadata fallback is not enough.

+ python3 scripts/yao.py world-class-submission-kit . --evidence-key native-permission-enforcement --output-dir evidence/world_class/submissions +
+
+

Prechecks

+
+
+
+ file + Permission policy +
+
+
Current
present
+
Status
pass
+
Action
Keep approved high-permission capabilities explicit.
+
+
+ +
+
+ file + Runtime probes +
+
+
Current
present
+
Status
pass
+
Action
Refresh runtime permission probes after packaging changes.
+
+
+ +
+
+ external + Native guard +
+
+
Current
external-integration-required
+
Status
external-required
+
Action
Attach a real target-client or external installer runtime guard; metadata fallback is not enough.
+
+
+
+
+
+

Source Checks

+
+
+
+ native_enforcement_count + Native enforcement +
+
+
Current
0
+
Expected
>0
+
Status
blocked
+
Action
Collect real target-client or external runtime guard proof.
+
+
+ +
+
+ failure_count + Probe failures +
+
+
Current
0
+
Expected
==0
+
Status
pass
+
Action
Runtime permission probes must stay clean.
+
+
+ +
+
+ installer_enforcement_ready + Installer support +
+
+
Current
True
+
Expected
true
+
Status
pass
+
Action
Installer enforcement is supporting evidence, not native proof.
+
+
+
+
+
+

Runbook

+
  • Implement or connect a real target client or external installer runtime guard that blocks undeclared network, file_write, or subprocess capabilities.
  • Update the generated target adapter only when the guard is actually enforced by that target.
  • python3 scripts/yao.py package . --platform openai --platform claude --platform generic --platform vscode --output-dir dist --zip
  • python3 scripts/yao.py install-simulate . --package-dir dist --install-root dist/install-simulation
  • python3 scripts/yao.py runtime-permissions . --package-dir dist
  • python3 scripts/yao.py skill-os2-audit . --generated-at <YYYY-MM-DD>
  • Copy evidence/world_class/templates/native-permission-enforcement.intake.json to evidence/world_class/submissions/native-permission-enforcement.json and fill only real evidence fields.
  • python3 scripts/yao.py world-class-intake . --submissions-dir evidence/world_class/submissions
+
+
+ +
+
+ external · blocked +

Native Client Telemetry

+
+
+
Evidence
native-client-telemetry
+
Ledger
pending
+
Intake
awaiting-submission
+
Review
awaiting-submission
+
Draft
evidence/world_class/submissions/native-client-telemetry.json
+
+
+

Next Action

+

Install a real Browser, Chrome, IDE, or provider client that emits metadata-only events.

+ python3 scripts/yao.py world-class-submission-kit . --evidence-key native-client-telemetry --output-dir evidence/world_class/submissions +
+
+

Prechecks

+
+
+
+ file + Native telemetry host +
+
+
Current
present
+
Status
pass
+
Action
Use the native host to receive metadata-only client events.
+
+
+ +
+
+ file + Hook recipes +
+
+
Current
present
+
Status
pass
+
Action
Refresh telemetry hook recipes before external client installation.
+
+
+ +
+
+ external + External client +
+
+
Current
external-integration-required
+
Status
external-required
+
Action
Install a real Browser, Chrome, IDE, or provider client that emits metadata-only events.
+
+
+
+
+
+

Source Checks

+
+
+
+ external_source_events + External events +
+
+
Current
0
+
Expected
>0
+
Status
blocked
+
Action
Import at least one metadata-only event from a real client.
+
+
+ +
+
+ adoption_sample_count + Adoption sample +
+
+
Current
0
+
Expected
>0
+
Status
blocked
+
Action
Telemetry must include adoption outcome evidence.
+
+
+ +
+
+ raw_content_allowed + Raw content blocked +
+
+
Current
False
+
Expected
false
+
Status
pass
+
Action
Telemetry must stay metadata-only.
+
+
+
+
+
+

Runbook

+
  • python3 scripts/telemetry_native_host.py . --write-launcher /tmp/yao-telemetry-host.sh --write-manifest /tmp/yao-telemetry-host.json --allowed-origin chrome-extension://<extension-id>/
  • Install the generated native messaging manifest for the real client and send at least one accepted skill_activation or skill_output event.
  • python3 scripts/yao.py telemetry-import . --input-jsonl .yao/telemetry_spool/external_events.jsonl
  • python3 scripts/yao.py skill-atlas --workspace-root .
  • python3 scripts/yao.py skill-os2-audit . --generated-at <YYYY-MM-DD>
  • Copy evidence/world_class/templates/native-client-telemetry.intake.json to evidence/world_class/submissions/native-client-telemetry.json and fill only real evidence fields.
  • python3 scripts/yao.py world-class-intake . --submissions-dir evidence/world_class/submissions
+
+
+
+
+

Safety Boundary

+
  • Environment variables are displayed only as set or not-set; secret values are never printed.
  • Human-required and external-required states are operator work, not accepted evidence.
  • The world-class ledger remains the only source of truth for ready_to_claim_world_class.
+
+
+ + diff --git a/reports/world_class_evidence_preflight.json b/reports/world_class_evidence_preflight.json index c033fdba..d46e2263 100644 --- a/reports/world_class_evidence_preflight.json +++ b/reports/world_class_evidence_preflight.json @@ -793,6 +793,7 @@ }, "artifacts": { "json": "reports/world_class_evidence_preflight.json", - "markdown": "reports/world_class_evidence_preflight.md" + "markdown": "reports/world_class_evidence_preflight.md", + "html": "reports/world_class_evidence_preflight.html" } } diff --git a/scripts/context_sizer.py b/scripts/context_sizer.py index a1fb5910..129e2af9 100644 --- a/scripts/context_sizer.py +++ b/scripts/context_sizer.py @@ -43,6 +43,7 @@ IGNORED_FILE_PATTERNS = { "reports/skill-overview*.json", "reports/world_class_evidence_preflight*.json", "reports/world_class_evidence_preflight*.md", + "reports/world_class_evidence_preflight*.html", "reports/*pattern-analysis*.md", "reports/*research-plan*.md", } diff --git a/scripts/render_evidence_consistency.py b/scripts/render_evidence_consistency.py index 19c98ffa..3fa0a67a 100644 --- a/scripts/render_evidence_consistency.py +++ b/scripts/render_evidence_consistency.py @@ -522,6 +522,8 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]: "directory": default_submissions_dir, "drafts_count_as_evidence": False, "preflight_counts_submission_as_completion": False, + "html_report": "reports/world_class_evidence_preflight.html", + "html_exists": True, "prepare_submission": f"python3 scripts/yao.py world-class-submission-kit . --output-dir {default_submissions_dir}", "validate_intake": f"python3 scripts/yao.py world-class-intake . --submissions-dir {default_submissions_dir}", "submission_review": f"python3 scripts/yao.py world-class-submission-review . --submissions-dir {default_submissions_dir}", @@ -534,6 +536,10 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]: "preflight_counts_submission_as_completion": preflight_submissions.get( "preflight_counts_submission_as_completion" ), + "html_report": world_class_preflight.get("artifacts", {}).get("html") + if isinstance(world_class_preflight.get("artifacts", {}), dict) + else None, + "html_exists": (skill_dir / "reports" / "world_class_evidence_preflight.html").exists(), "prepare_submission": preflight_commands.get("prepare_submission"), "validate_intake": preflight_commands.get("validate_intake"), "submission_review": preflight_commands.get("submission_review"), @@ -546,7 +552,7 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]: label="Preflight exposes a safe submission-kit handoff", expected=expected_preflight_handoff, actual=actual_preflight_handoff, - paths=[REQUIRED_REPORTS["world_class_preflight"]], + paths=[REQUIRED_REPORTS["world_class_preflight"], "reports/world_class_evidence_preflight.html"], detail=( "Preflight must give operators the exact draft, intake, review, ledger, and claim-guard commands " "without letting drafts or submissions count as accepted evidence." diff --git a/scripts/render_world_class_preflight.py b/scripts/render_world_class_preflight.py index ea7f3758..1dfe9d87 100644 --- a/scripts/render_world_class_preflight.py +++ b/scripts/render_world_class_preflight.py @@ -7,6 +7,7 @@ from datetime import date from pathlib import Path from typing import Any +from html_rendering import html_text from render_world_class_evidence_intake import build_intake from render_world_class_evidence_ledger import build_ledger from render_world_class_submission_review import build_submission_review @@ -336,6 +337,7 @@ def build_preflight(skill_dir: Path, generated_at: str, submissions_dir: Path | "artifacts": { "json": "reports/world_class_evidence_preflight.json", "markdown": "reports/world_class_evidence_preflight.md", + "html": "reports/world_class_evidence_preflight.html", }, } @@ -430,12 +432,216 @@ def render_markdown(report: dict[str, Any]) -> str: return "\n".join(lines).rstrip() + "\n" +def html_list(values: list[Any], empty: str) -> str: + if not values: + return f"
  • {html_text(empty)}
  • " + return "".join(f"
  • {html_text(value)}
  • " for value in values) + + +def render_html_commands(commands: dict[str, str]) -> str: + return "".join( + f"
  • {html_text(label.replace('_', ' '))}{html_text(command)}
  • " + for label, command in commands.items() + ) + + +def render_html_prechecks(rows: list[dict[str, Any]]) -> str: + if not rows: + return "

    No prechecks listed.

    " + return "".join( + """ +
    +
    + {kind} + {label} +
    +
    +
    Current
    {actual}
    +
    Status
    {status}
    +
    Action
    {action}
    +
    +
    + """.format( + status=html_text(row.get("status", "")), + kind=html_text(row.get("kind", "")), + label=html_text(row.get("label", "")), + actual=html_text(row.get("actual", "")), + action=html_text(row.get("next_action", "")), + ) + for row in rows + ) + + +def render_html_source_checks(rows: list[dict[str, Any]]) -> str: + if not rows: + return "

    No source checks listed.

    " + return "".join( + """ +
    +
    + {field} + {label} +
    +
    +
    Current
    {actual}
    +
    Expected
    {expected}
    +
    Status
    {status}
    +
    Action
    {action}
    +
    +
    + """.format( + status=html_text(row.get("status", "")), + field=html_text(row.get("field", "")), + label=html_text(row.get("label", "")), + actual=html_text(row.get("actual", "")), + expected=html_text(row.get("expected", "")), + action=html_text(row.get("next_action", "")), + ) + for row in rows + ) + + +def render_html_item(item: dict[str, Any]) -> str: + return f""" +
    +
    + {html_text(item.get('category', ''))} · {html_text(item.get('status', ''))} +

    {html_text(item.get('label', item.get('evidence_key', '')))}

    +
    +
    +
    Evidence
    {html_text(item.get('evidence_key', ''))}
    +
    Ledger
    {html_text(item.get('ledger_status', ''))}
    +
    Intake
    {html_text(item.get('intake_readiness', ''))}
    +
    Review
    {html_text(item.get('review_state', ''))}
    +
    Draft
    {html_text(item.get('submission_path', ''))}
    +
    +
    +

    Next Action

    +

    {html_text(item.get('next_action', ''))}

    + {html_text(item.get('commands', {}).get('prepare_submission', ''))} +
    +
    +

    Prechecks

    +
    {render_html_prechecks(item.get('prechecks', []))}
    +
    +
    +

    Source Checks

    +
    {render_html_source_checks(item.get('source_checklist', []))}
    +
    +
    +

    Runbook

    + +
    +
    + """ + + +def render_html(report: dict[str, Any]) -> str: + summary = report["summary"] + stats = [ + ("Decision", summary["decision"]), + ("Pending", summary["pending_count"]), + ("Ready", summary["collection_ready_count"]), + ("Blocked", summary["collection_blocked_count"]), + ("Source", f"{summary['source_pass_count']}/{summary['source_check_count']}"), + ] + stat_html = "".join( + f"
    {html_text(label)}{html_text(value)}
    " + for label, value in stats + ) + item_cards = "".join(render_html_item(item) for item in report.get("items", [])) + return f""" + + + + + World-Class Evidence Preflight + + + + +
    +
    + Evidence Collection +

    World-Class Evidence Preflight

    +

    This operator view shows which external and human evidence is still blocked, which commands prepare editable submission drafts, and why preflight never counts as accepted evidence.

    +
    {stat_html}
    +
    +
    +
    +

    Submission Kit

    +

    Generate drafts only after real provider, human-review, native-permission, or native-client work exists. Drafts remain non-evidence until valid aggregate artifact refs and SHA-256 digests are supplied.

    +
      +
    • submissions directory: {html_text(report['submissions']['directory'])}
    • +
    • drafts count as evidence: {html_text(str(report['submissions']['drafts_count_as_evidence']).lower())}
    • +
    • preflight accepts evidence: {html_text(str(report['summary']['preflight_counts_as_evidence']).lower())}
    • +
    +
    + +
    +

    Evidence Queue

    {item_cards}
    +
    +

    Safety Boundary

    +
    • Environment variables are displayed only as set or not-set; secret values are never printed.
    • Human-required and external-required states are operator work, not accepted evidence.
    • The world-class ledger remains the only source of truth for ready_to_claim_world_class.
    +
    +
    + + +""" + + def main() -> None: parser = argparse.ArgumentParser(description="Render collection preflight checks for pending world-class evidence.") parser.add_argument("skill_dir", nargs="?", default=".") parser.add_argument("--submissions-dir") parser.add_argument("--output-json", default="reports/world_class_evidence_preflight.json") parser.add_argument("--output-md", default="reports/world_class_evidence_preflight.md") + parser.add_argument("--output-html", default="reports/world_class_evidence_preflight.html") parser.add_argument("--generated-at", default=date.today().isoformat()) args = parser.parse_args() @@ -444,14 +650,19 @@ def main() -> None: report = build_preflight(skill_dir, args.generated_at, submissions_dir=submissions_dir) output_json = Path(args.output_json) output_md = Path(args.output_md) + output_html = Path(args.output_html) if not output_json.is_absolute(): output_json = skill_dir / output_json if not output_md.is_absolute(): output_md = skill_dir / output_md + if not output_html.is_absolute(): + output_html = skill_dir / output_html output_json.parent.mkdir(parents=True, exist_ok=True) output_md.parent.mkdir(parents=True, exist_ok=True) + output_html.parent.mkdir(parents=True, exist_ok=True) output_json.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") output_md.write_text(render_markdown(report), encoding="utf-8") + output_html.write_text(render_html(report), encoding="utf-8") print(json.dumps(report, ensure_ascii=False, indent=2)) diff --git a/scripts/resource_boundary_check.py b/scripts/resource_boundary_check.py index 7996f9dc..fe7ea65a 100644 --- a/scripts/resource_boundary_check.py +++ b/scripts/resource_boundary_check.py @@ -31,6 +31,7 @@ IGNORED_FILE_PATTERNS = { "reports/skill-overview*.json", "reports/world_class_evidence_preflight*.json", "reports/world_class_evidence_preflight*.md", + "reports/world_class_evidence_preflight*.html", "reports/*pattern-analysis*.md", "reports/*research-plan*.md", } diff --git a/scripts/yao_cli_parser.py b/scripts/yao_cli_parser.py index 8bd6b3be..70c1ff76 100644 --- a/scripts/yao_cli_parser.py +++ b/scripts/yao_cli_parser.py @@ -225,6 +225,7 @@ def build_parser(command_handlers: dict[str, Callable[[argparse.Namespace], int] world_class_preflight_cmd.add_argument("--submissions-dir") world_class_preflight_cmd.add_argument("--output-json") world_class_preflight_cmd.add_argument("--output-md") + world_class_preflight_cmd.add_argument("--output-html") world_class_preflight_cmd.add_argument("--generated-at") world_class_preflight_cmd.set_defaults(func=_handler(command_handlers, "command_world_class_preflight")) diff --git a/tests/verify_evidence_consistency.py b/tests/verify_evidence_consistency.py index 6b6735d1..d5e339bb 100644 --- a/tests/verify_evidence_consistency.py +++ b/tests/verify_evidence_consistency.py @@ -24,6 +24,7 @@ REPORT_FILES = [ "reports/world_class_evidence_plan.json", "reports/world_class_evidence_intake.json", "reports/world_class_evidence_preflight.json", + "reports/world_class_evidence_preflight.html", "reports/world_class_submission_review.json", "reports/world_class_operator_runbook.json", "reports/skill_os2_coverage.json", diff --git a/tests/verify_quality_checks.py b/tests/verify_quality_checks.py index 06e53065..e9c1cca8 100644 --- a/tests/verify_quality_checks.py +++ b/tests/verify_quality_checks.py @@ -159,6 +159,7 @@ def verify_volatile_report_outputs_ignored() -> dict: "skill-overview.json", "world_class_evidence_preflight.json", "world_class_evidence_preflight.md", + "world_class_evidence_preflight.html", ] for report_name in volatile_reports: report_path = skill_dir / "reports" / report_name diff --git a/tests/verify_world_class_preflight.py b/tests/verify_world_class_preflight.py index 1d53af84..db343c73 100644 --- a/tests/verify_world_class_preflight.py +++ b/tests/verify_world_class_preflight.py @@ -60,7 +60,8 @@ def main() -> None: output_json = TMP / "world_class_evidence_preflight.json" output_md = TMP / "world_class_evidence_preflight.md" - proc = run_preflight(None, "--output-json", str(output_json), "--output-md", str(output_md)) + output_html = TMP / "world_class_evidence_preflight.html" + proc = run_preflight(None, "--output-json", str(output_json), "--output-md", str(output_md), "--output-html", str(output_html)) payload = json.loads(proc.stdout) assert payload["schema_version"] == "1.0", payload assert payload["ok"] is True, payload @@ -84,6 +85,7 @@ def main() -> None: "python3 scripts/yao.py world-class-submission-kit . " "--output-dir evidence/world_class/submissions" ), payload["submissions"] + assert payload["artifacts"]["html"] == "reports/world_class_evidence_preflight.html", payload["artifacts"] submission_commands = payload["submissions"]["commands"] assert submission_commands["prepare_submission"] == ( "python3 scripts/yao.py world-class-submission-kit . " @@ -138,6 +140,16 @@ def main() -> None: assert "world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions" in markdown, markdown assert "drafts count as evidence: `false`" in markdown, markdown assert "values are never printed" in markdown, markdown + html = output_html.read_text(encoding="utf-8") + assert "World-Class Evidence Preflight" in html, html + assert "World-Class Evidence Preflight" in html, html + assert "Evidence Queue" in html, html + assert "Submission Kit" in html, html + assert "world-class-submission-kit . --output-dir evidence/world_class/submissions" in html, html + assert "provider-holdout" in html, html + assert "Source Checks" in html, html + assert "ready_to_claim_world_class" in html, html + assert "Environment variables are displayed only as set or not-set" in html, html env_json = TMP / "preflight_with_env.json" env_proc = run_preflight( @@ -146,6 +158,8 @@ def main() -> None: str(env_json), "--output-md", str(TMP / "preflight_with_env.md"), + "--output-html", + str(TMP / "preflight_with_env.html"), ) env_payload = json.loads(env_proc.stdout) env_provider = by_key(env_payload["items"], "provider-holdout") @@ -154,6 +168,7 @@ def main() -> None: assert env_provider_checks["openai-api-key"]["actual"] == "set", env_provider_checks assert env_provider_checks["provider-model"]["status"] == "pass", env_provider_checks assert "sk-test-secret" not in env_proc.stdout, env_proc.stdout + assert "sk-test-secret" not in (TMP / "preflight_with_env.html").read_text(encoding="utf-8"), env_payload assert env_payload["summary"]["credential_value_exposed"] is False, env_payload assert env_payload["summary"]["ready_to_claim_world_class"] is False, env_payload @@ -166,6 +181,8 @@ def main() -> None: str(TMP / "preflight_spaced.json"), "--output-md", str(TMP / "preflight_spaced.md"), + "--output-html", + str(TMP / "preflight_spaced.html"), ) spaced_payload = json.loads(spaced_proc.stdout) quoted_spaced = "'tests/tmp_world_class_preflight/submission kit spaced'" @@ -177,6 +194,8 @@ def main() -> None: str(TMP / "cli_preflight.json"), "--output-md", str(TMP / "cli_preflight.md"), + "--output-html", + str(TMP / "cli_preflight.html"), "--generated-at", "2026-06-16", ) @@ -184,6 +203,7 @@ def main() -> None: assert cli_payload["summary"]["decision"] == "collection-preflight-blocked", cli_payload assert cli_payload["summary"]["preflight_counts_as_evidence"] is False, cli_payload assert (TMP / "cli_preflight.md").exists(), cli_payload + assert (TMP / "cli_preflight.html").exists(), cli_payload print(json.dumps({"ok": True}, ensure_ascii=False, indent=2))