diff --git a/registry/index.json b/registry/index.json index 12fbe8c..294cd57 100644 --- a/registry/index.json +++ b/registry/index.json @@ -16,7 +16,7 @@ "vscode" ], "package_metadata": "registry/packages/yao-meta-skill.json", - "package_sha256": "892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c" + "package_sha256": "4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322" } ] } diff --git a/registry/packages/yao-meta-skill.json b/registry/packages/yao-meta-skill.json index 631175e..2c7a592 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": "892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c", - "archive_sha256": "38e8e607c1ed5bd016ea242f8fac3e8dfdfe16b165876bc4e19f587481e7c5ca" + "package_sha256": "4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322", + "archive_sha256": "8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6" }, "compatibility": { "openai": "pass", @@ -48,7 +48,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "38e8e607c1ed5bd016ea242f8fac3e8dfdfe16b165876bc4e19f587481e7c5ca", + "archive_sha256": "8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6", "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 6bc524e..a9d62dc 100644 --- a/reports/architecture_maintainability.json +++ b/reports/architecture_maintainability.json @@ -16,7 +16,7 @@ "watch_line_threshold": 720, "block_line_threshold": 1500, "largest_file_lines": 899, - "watchlist_count": 9, + "watchlist_count": 10, "hotspot_count": 0, "blocker_count": 0, "decision": "pass" @@ -29,6 +29,13 @@ "severity": "pass", "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, + { + "path": "scripts/render_evidence_consistency.py", + "lines": 896, + "kind": "cli-script", + "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": 870, @@ -43,13 +50,6 @@ "severity": "pass", "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, - { - "path": "scripts/render_evidence_consistency.py", - "lines": 859, - "kind": "cli-script", - "severity": "pass", - "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." - }, { "path": "tests/verify_review_studio.py", "lines": 816, @@ -57,6 +57,13 @@ "severity": "pass", "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, + { + "path": "scripts/render_world_class_preflight.py", + "lines": 814, + "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": 800, @@ -98,13 +105,6 @@ "kind": "cli-script", "severity": "pass", "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." - }, - { - "path": "scripts/render_world_class_preflight.py", - "lines": 693, - "kind": "cli-script", - "severity": "pass", - "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." } ], "watchlist": [ @@ -115,6 +115,13 @@ "severity": "pass", "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, + { + "path": "scripts/render_evidence_consistency.py", + "lines": 896, + "kind": "cli-script", + "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": 870, @@ -129,13 +136,6 @@ "severity": "pass", "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, - { - "path": "scripts/render_evidence_consistency.py", - "lines": 859, - "kind": "cli-script", - "severity": "pass", - "recommendation": "Watch this file before adding new responsibilities; extract a helper module when one concern dominates." - }, { "path": "tests/verify_review_studio.py", "lines": 816, @@ -143,6 +143,13 @@ "severity": "pass", "recommendation": "Break broad integration assertions into focused verifier helpers when the next behavior change lands." }, + { + "path": "scripts/render_world_class_preflight.py", + "lines": 814, + "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": 800, diff --git a/reports/architecture_maintainability.md b/reports/architecture_maintainability.md index 6be14d8..ab0e042 100644 --- a/reports/architecture_maintainability.md +++ b/reports/architecture_maintainability.md @@ -15,7 +15,7 @@ Generated at: `2026-06-16` - command modules: `6` - largest file lines: `899` - watch threshold lines: `720` -- watchlist: `9` +- watchlist: `10` - hotspots: `0` - blockers: `0` @@ -30,10 +30,11 @@ 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/render_evidence_consistency.py` | `896` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/yao_cli_parser.py` | `870` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `tests/verify_world_class_evidence_intake.py` | `867` | `test` | Break broad integration assertions into focused verifier helpers when the next behavior change lands. | -| `scripts/render_evidence_consistency.py` | `859` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `tests/verify_review_studio.py` | `816` | `test` | Break broad integration assertions into focused verifier helpers when the next behavior change lands. | +| `scripts/render_world_class_preflight.py` | `814` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/skill_report_model.py` | `800` | `internal-module` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/build_skill_atlas.py` | `730` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | | `scripts/compile_skill.py` | `723` | `cli-script` | Watch this file before adding new responsibilities; extract a helper module when one concern dominates. | @@ -44,17 +45,17 @@ No file-size hotspots found. | File | Lines | Kind | Severity | | --- | ---: | --- | --- | | `tests/verify_yao_cli.py` | `899` | `test` | `pass` | +| `scripts/render_evidence_consistency.py` | `896` | `cli-script` | `pass` | | `scripts/yao_cli_parser.py` | `870` | `internal-module` | `pass` | | `tests/verify_world_class_evidence_intake.py` | `867` | `test` | `pass` | -| `scripts/render_evidence_consistency.py` | `859` | `cli-script` | `pass` | | `tests/verify_review_studio.py` | `816` | `test` | `pass` | +| `scripts/render_world_class_preflight.py` | `814` | `cli-script` | `pass` | | `scripts/skill_report_model.py` | `800` | `internal-module` | `pass` | | `scripts/build_skill_atlas.py` | `730` | `cli-script` | `pass` | | `scripts/compile_skill.py` | `723` | `cli-script` | `pass` | | `scripts/optimize_description.py` | `723` | `cli-script` | `pass` | | `scripts/trust_check.py` | `714` | `internal-module` | `pass` | | `scripts/apply_adaptation.py` | `706` | `cli-script` | `pass` | -| `scripts/render_world_class_preflight.py` | `693` | `cli-script` | `pass` | ## Release Rule diff --git a/reports/context_budget.json b/reports/context_budget.json index da4f7dc..b8883db 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": 797, - "other_text_tokens": 1039014, + "other_text_tokens": 1041817, "estimated_initial_load_tokens": 990, - "estimated_total_text_tokens": 1039811, - "deferred_resource_tokens": 480160, + "estimated_total_text_tokens": 1042614, + "deferred_resource_tokens": 482305, "deferred_resource_warn_threshold": 120000, "deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 420349, + "estimated_tokens": 422494, "file_count": 121 }, { @@ -36,7 +36,7 @@ "large_deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 420349, + "estimated_tokens": 422494, "file_count": 121 } ], @@ -59,7 +59,7 @@ ], "missing": [], "path": "scripts", - "estimated_tokens": 420349, + "estimated_tokens": 422494, "file_count": 121, "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 e845cc3..413256f 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 | 990 | 797 | 480160 | `governed` | scripts:420349 | 131.3 | - | ok | +| root | `.` | `production` | 1000 | 990 | 797 | 482305 | `governed` | scripts:422494 | 131.3 | - | 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 0fbbe5f..6d6d267 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": 990, "skill_body_tokens": 797, - "deferred_resource_tokens": 480160, + "deferred_resource_tokens": 482305, "large_deferred_resource_dirs": [ { "path": "scripts", - "estimated_tokens": 420349, + "estimated_tokens": 422494, "file_count": 121 } ], @@ -35,7 +35,7 @@ ], "missing": [], "path": "scripts", - "estimated_tokens": 420349, + "estimated_tokens": 422494, "file_count": 121, "rationale": "Script resources are deterministic deferred tools, not initial-load prompt context." } diff --git a/reports/output_execution_runs.json b/reports/output_execution_runs.json index a9d95da..469a5f6 100644 --- a/reports/output_execution_runs.json +++ b/reports/output_execution_runs.json @@ -34,7 +34,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 27.55, + "duration_ms": 31.14, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -62,7 +62,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.21, + "duration_ms": 33.01, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -85,7 +85,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.18, + "duration_ms": 32.62, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -113,7 +113,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.22, + "duration_ms": 32.94, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -136,7 +136,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 29.62, + "duration_ms": 35.52, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -164,7 +164,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 28.61, + "duration_ms": 31.91, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -187,7 +187,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 27.07, + "duration_ms": 30.82, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -214,7 +214,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 26.04, + "duration_ms": 30.45, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -237,7 +237,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 26.26, + "duration_ms": 29.74, "provider": "local-output-eval-runner", "model": "", "usage": { @@ -266,7 +266,7 @@ "execution_mode": "command", "model_executed": false, "command_executed": true, - "duration_ms": 26.28, + "duration_ms": 30.03, "provider": "local-output-eval-runner", "model": "", "usage": { diff --git a/reports/output_execution_runs.md b/reports/output_execution_runs.md index 599a978..2abcf83 100644 --- a/reports/output_execution_runs.md +++ b/reports/output_execution_runs.md @@ -23,16 +23,16 @@ Command runner evidence is present. This proves the eval harness executed an ext | Case | Variant | Mode | Model | Duration ms | Tokens | Score | Status | | --- | --- | --- | --- | ---: | ---: | ---: | --- | -| skill-package-contract | baseline | command | local-output-eval-runner | 27.55 | 33 | 0.0 | pass | -| skill-package-contract | with_skill | command | local-output-eval-runner | 28.21 | 73 | 100.0 | pass | -| output-eval-expectation | baseline | command | local-output-eval-runner | 28.18 | 36 | 0.0 | pass | -| output-eval-expectation | with_skill | command | local-output-eval-runner | 29.22 | 80 | 100.0 | pass | -| ir-before-packaging | baseline | command | local-output-eval-runner | 29.62 | 33 | 0.0 | pass | -| ir-before-packaging | with_skill | command | local-output-eval-runner | 28.61 | 80 | 100.0 | pass | -| near-neighbor-boundary | baseline | command | local-output-eval-runner | 27.07 | 36 | 0.0 | pass | -| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 26.04 | 65 | 100.0 | pass | -| file-backed-governed-package | baseline | command | local-output-eval-runner | 26.26 | 37 | 0.0 | pass | -| file-backed-governed-package | with_skill | command | local-output-eval-runner | 26.28 | 98 | 100.0 | pass | +| skill-package-contract | baseline | command | local-output-eval-runner | 31.14 | 33 | 0.0 | pass | +| skill-package-contract | with_skill | command | local-output-eval-runner | 33.01 | 73 | 100.0 | pass | +| output-eval-expectation | baseline | command | local-output-eval-runner | 32.62 | 36 | 0.0 | pass | +| output-eval-expectation | with_skill | command | local-output-eval-runner | 32.94 | 80 | 100.0 | pass | +| ir-before-packaging | baseline | command | local-output-eval-runner | 35.52 | 33 | 0.0 | pass | +| ir-before-packaging | with_skill | command | local-output-eval-runner | 31.91 | 80 | 100.0 | pass | +| near-neighbor-boundary | baseline | command | local-output-eval-runner | 30.82 | 36 | 0.0 | pass | +| near-neighbor-boundary | with_skill | command | local-output-eval-runner | 30.45 | 65 | 100.0 | pass | +| file-backed-governed-package | baseline | command | local-output-eval-runner | 29.74 | 37 | 0.0 | pass | +| file-backed-governed-package | with_skill | command | local-output-eval-runner | 30.03 | 98 | 100.0 | pass | ## Next Fixes diff --git a/reports/package_verification.json b/reports/package_verification.json index e7efcc8..0c59b76 100644 --- a/reports/package_verification.json +++ b/reports/package_verification.json @@ -8,7 +8,7 @@ "target_count": 4, "adapter_count": 4, "archive_present": true, - "archive_sha256": "b90b116cb657d9fa1ba2f3f0620a05965890b996917626dcdc7f974a05aaeb0d", + "archive_sha256": "8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6", "archive_entry_count": 646, "failure_count": 0, "warning_count": 0 diff --git a/reports/package_verification.md b/reports/package_verification.md index 7c6578a..8f215fb 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: `b90b116cb657d9fa1ba2f3f0620a05965890b996917626dcdc7f974a05aaeb0d` +- Archive SHA256: `8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6` - Failures: `0` - Warnings: `0` diff --git a/reports/registry_audit.json b/reports/registry_audit.json index 940071e..f2ab195 100644 --- a/reports/registry_audit.json +++ b/reports/registry_audit.json @@ -21,8 +21,8 @@ "trust_level": "local", "license": "MIT", "checksums": { - "package_sha256": "892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c", - "archive_sha256": "38e8e607c1ed5bd016ea242f8fac3e8dfdfe16b165876bc4e19f587481e7c5ca" + "package_sha256": "4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322", + "archive_sha256": "8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6" }, "compatibility": { "openai": "pass", @@ -53,7 +53,7 @@ }, "distribution": { "archive_verified": true, - "archive_sha256": "38e8e607c1ed5bd016ea242f8fac3e8dfdfe16b165876bc4e19f587481e7c5ca", + "archive_sha256": "8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6", "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": "892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c" + "package_sha256": "4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322" } ] }, diff --git a/reports/registry_audit.md b/reports/registry_audit.md index f649311..66cb7d8 100644 --- a/reports/registry_audit.md +++ b/reports/registry_audit.md @@ -6,8 +6,8 @@ - Maturity: `governed` - Owner: `Yao Team` - License: `MIT` -- Package SHA256: `892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c` -- Archive SHA256: `38e8e607c1ed5bd016ea242f8fac3e8dfdfe16b165876bc4e19f587481e7c5ca` +- Package SHA256: `4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322` +- Archive SHA256: `8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6` - Install simulated: `True` ## Compatibility diff --git a/reports/security_trust_report.json b/reports/security_trust_report.json index 72a5703..368345d 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": 212, - "package_sha256": "892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c" + "package_sha256": "4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322" }, "failures": [], "warnings": [], diff --git a/reports/security_trust_report.md b/reports/security_trust_report.md index 5071f89..503fa84 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: `212` -- Package SHA256: `892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c` +- Package SHA256: `4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322` ## Failures diff --git a/reports/skillops/daily/2026-06-16.json b/reports/skillops/daily/2026-06-16.json index a35cbc8..386b061 100644 --- a/reports/skillops/daily/2026-06-16.json +++ b/reports/skillops/daily/2026-06-16.json @@ -14,7 +14,7 @@ "local_blueprint_ready": true, "public_world_class_ready": false, "world_class_pending_count": 4, - "release_lock_ready": true, + "release_lock_ready": false, "evidence_consistency_ok": true, "writes_source_files": false, "auto_patch_enabled": false, @@ -31,7 +31,7 @@ "local_blueprint_ready": true, "public_world_class_ready": false, "world_class_pending_count": 4, - "release_lock_ready": true, + "release_lock_ready": false, "evidence_consistency_ok": true, "writes_source_files": false, "auto_patch_enabled": false, @@ -480,7 +480,7 @@ "local_blueprint_ready": true, "public_world_class_ready": false, "world_class_pending_count": 4, - "release_lock_ready": true, + "release_lock_ready": false, "evidence_consistency_ok": true }, "actions": [ diff --git a/reports/skillops/daily/2026-06-16.md b/reports/skillops/daily/2026-06-16.md index 105c41c..d0fbea0 100644 --- a/reports/skillops/daily/2026-06-16.md +++ b/reports/skillops/daily/2026-06-16.md @@ -14,7 +14,7 @@ Generated at: `2026-06-16` - local blueprint ready: `true` - public world-class ready: `false` - world-class pending: `4` -- release lock ready: `true` +- release lock ready: `false` - evidence consistency ok: `true` This report is an operations cockpit for explicit-source SkillOps. It does not scan private logs, write source files, apply patches, or count as world-class external or human evidence. diff --git a/reports/skillops/weekly/2026-W25.json b/reports/skillops/weekly/2026-W25.json index 998d23e..65c79eb 100644 --- a/reports/skillops/weekly/2026-W25.json +++ b/reports/skillops/weekly/2026-W25.json @@ -15,7 +15,7 @@ "top_score": 88, "skill_count": 12, "actionable_portfolio_issue_count": 0, - "release_lock_ready": true, + "release_lock_ready": false, "evidence_consistency_ok": true, "public_world_class_ready": false, "world_class_pending_count": 4, @@ -35,7 +35,7 @@ "top_score": 88, "skill_count": 12, "actionable_portfolio_issue_count": 0, - "release_lock_ready": true, + "release_lock_ready": false, "evidence_consistency_ok": true, "public_world_class_ready": false, "world_class_pending_count": 4, @@ -287,7 +287,7 @@ "no_route_opportunity_count": 0 }, "release_state": { - "release_lock_ready": true, + "release_lock_ready": false, "evidence_consistency_ok": true, "public_world_class_ready": false, "world_class_pending_count": 4 diff --git a/reports/skillops/weekly/2026-W25.md b/reports/skillops/weekly/2026-W25.md index 4d75fc3..1fd6a71 100644 --- a/reports/skillops/weekly/2026-W25.md +++ b/reports/skillops/weekly/2026-W25.md @@ -13,7 +13,7 @@ Week: `2026-W25` - top_score: `88` - skill_count: `12` - actionable_portfolio_issue_count: `0` -- release_lock_ready: `True` +- release_lock_ready: `False` - evidence_consistency_ok: `True` - public_world_class_ready: `False` - world_class_pending_count: `4` diff --git a/reports/upgrade_check.json b/reports/upgrade_check.json index 9c0d7a8..07863e0 100644 --- a/reports/upgrade_check.json +++ b/reports/upgrade_check.json @@ -70,12 +70,12 @@ { "field": "archive_sha256", "from": "", - "to": "38e8e607c1ed5bd016ea242f8fac3e8dfdfe16b165876bc4e19f587481e7c5ca" + "to": "8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6" }, { "field": "package_sha256", "from": "0000000000000000000000000000000000000000000000000000000000000000", - "to": "892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c" + "to": "4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322" } ] }, diff --git a/reports/world_class_evidence_preflight.html b/reports/world_class_evidence_preflight.html index 086037e..f40d59e 100644 --- a/reports/world_class_evidence_preflight.html +++ b/reports/world_class_evidence_preflight.html @@ -32,6 +32,12 @@ .commands { list-style:none; padding:0; margin:0; display:grid; gap:10px; } .commands li { padding:12px; background:var(--soft); border-radius:8px; } .commands span { display:block; color:var(--ink); font-weight:700; margin-bottom:4px; } + .role-grid { display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:12px; margin-top:16px; } + .role-grid.compact { margin-top:0; } + .role-card { border:1px solid var(--line); border-radius:8px; padding:14px; background:#fff; min-width:0; } + .role-card span, .role-card small { color:var(--muted); } + .role-card strong { display:block; color:var(--ink); font-size:22px; margin:4px 0 6px; overflow-wrap:anywhere; } + .role-card p { margin:0 0 8px; } .evidence-grid { display:grid; gap:18px; } .evidence-card { padding:20px; min-width:0; } .evidence-card.blocked { border-left:4px solid var(--block); } @@ -49,7 +55,7 @@ .check-section { margin-top:16px; } .notice { background:var(--soft); border-left:4px solid var(--ink); padding:16px; border-radius:8px; } li { overflow-wrap:anywhere; } - @media (max-width:820px) { .stats, .two-col, .check-grid { grid-template-columns:1fr; } h1 { font-size:38px; } .topbar-inner { align-items:flex-start; flex-direction:column; } } + @media (max-width:820px) { .stats, .two-col, .check-grid, .role-grid { grid-template-columns:1fr; } h1 { font-size:38px; } .topbar-inner { align-items:flex-start; flex-direction:column; } } @@ -71,6 +77,24 @@
  • artifact prefill counts as evidence: false
  • preflight accepts evidence: false
  • +
    +
    + Submission refs +

    submission-ref

    + 7/7 ready +

    Rows marked submission-ref are the aggregate paths expected in artifact_refs.

    + copy to artifact_refs: true +
    + +
    + Supporting evidence +

    supporting-evidence

    + 31/31 ready +

    Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.

    + copy to artifact_refs: false +
    +
    +

    submission-ref rows are the paths expected in artifact_refs; supporting-evidence rows stay available for audit context.

    @@ -93,6 +117,26 @@ python3 scripts/yao.py world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions python3 scripts/yao.py world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions --prefill-artifacts +
    +

    Artifact Roles

    +
    +
    + Submission refs +

    submission-ref

    + 1/1 ready +

    Rows marked submission-ref are the aggregate paths expected in artifact_refs.

    + copy to artifact_refs: true +
    + +
    + Supporting evidence +

    supporting-evidence

    + 6/6 ready +

    Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.

    + copy to artifact_refs: false +
    +
    +

    Prechecks

    @@ -212,6 +256,26 @@ python3 scripts/yao.py world-class-submission-kit . --evidence-key human-adjudication --output-dir evidence/world_class/submissions python3 scripts/yao.py world-class-submission-kit . --evidence-key human-adjudication --output-dir evidence/world_class/submissions --prefill-artifacts
    +
    +

    Artifact Roles

    +
    +
    + Submission refs +

    submission-ref

    + 2/2 ready +

    Rows marked submission-ref are the aggregate paths expected in artifact_refs.

    + copy to artifact_refs: true +
    + +
    + Supporting evidence +

    supporting-evidence

    + 8/8 ready +

    Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.

    + copy to artifact_refs: false +
    +
    +

    Prechecks

    @@ -344,6 +408,26 @@ python3 scripts/yao.py world-class-submission-kit . --evidence-key native-permission-enforcement --output-dir evidence/world_class/submissions python3 scripts/yao.py world-class-submission-kit . --evidence-key native-permission-enforcement --output-dir evidence/world_class/submissions --prefill-artifacts
    +
    +

    Artifact Roles

    +
    +
    + Submission refs +

    submission-ref

    + 2/2 ready +

    Rows marked submission-ref are the aggregate paths expected in artifact_refs.

    + copy to artifact_refs: true +
    + +
    + Supporting evidence +

    supporting-evidence

    + 11/11 ready +

    Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.

    + copy to artifact_refs: false +
    +
    +

    Prechecks

    @@ -451,6 +535,26 @@ python3 scripts/yao.py world-class-submission-kit . --evidence-key native-client-telemetry --output-dir evidence/world_class/submissions python3 scripts/yao.py world-class-submission-kit . --evidence-key native-client-telemetry --output-dir evidence/world_class/submissions --prefill-artifacts
    +
    +

    Artifact Roles

    +
    +
    + Submission refs +

    submission-ref

    + 2/2 ready +

    Rows marked submission-ref are the aggregate paths expected in artifact_refs.

    + copy to artifact_refs: true +
    + +
    + Supporting evidence +

    supporting-evidence

    + 6/6 ready +

    Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.

    + copy to artifact_refs: false +
    +
    +

    Prechecks

    diff --git a/reports/world_class_evidence_preflight.json b/reports/world_class_evidence_preflight.json index c957acb..ecdf483 100644 --- a/reports/world_class_evidence_preflight.json +++ b/reports/world_class_evidence_preflight.json @@ -145,6 +145,30 @@ "output_dir": "evidence/world_class/submissions", "draft_path": "evidence/world_class/submissions/provider-holdout.json", "template_path": "evidence/world_class/templates/provider-holdout.intake.json", + "artifact_role_contract": { + "schema_version": "1.0", + "role_source": "world-class-submission-kit", + "counts_as_evidence": false, + "artifact_prefill_counts_as_evidence": false, + "submission_ref_total_count": 1, + "submission_ref_ready_count": 1, + "supporting_evidence_total_count": 6, + "supporting_evidence_ready_count": 6, + "roles": [ + { + "role": "submission-ref", + "label": "Submission refs", + "copy_to_artifact_refs": true, + "description": "Rows marked submission-ref are the aggregate paths expected in artifact_refs." + }, + { + "role": "supporting-evidence", + "label": "Supporting evidence", + "copy_to_artifact_refs": false, + "description": "Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs." + } + ] + }, "drafts_count_as_evidence": false, "artifact_prefill_counts_as_evidence": false }, @@ -273,6 +297,30 @@ "output_dir": "evidence/world_class/submissions", "draft_path": "evidence/world_class/submissions/human-adjudication.json", "template_path": "evidence/world_class/templates/human-adjudication.intake.json", + "artifact_role_contract": { + "schema_version": "1.0", + "role_source": "world-class-submission-kit", + "counts_as_evidence": false, + "artifact_prefill_counts_as_evidence": false, + "submission_ref_total_count": 2, + "submission_ref_ready_count": 2, + "supporting_evidence_total_count": 8, + "supporting_evidence_ready_count": 8, + "roles": [ + { + "role": "submission-ref", + "label": "Submission refs", + "copy_to_artifact_refs": true, + "description": "Rows marked submission-ref are the aggregate paths expected in artifact_refs." + }, + { + "role": "supporting-evidence", + "label": "Supporting evidence", + "copy_to_artifact_refs": false, + "description": "Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs." + } + ] + }, "drafts_count_as_evidence": false, "artifact_prefill_counts_as_evidence": false }, @@ -384,6 +432,30 @@ "output_dir": "evidence/world_class/submissions", "draft_path": "evidence/world_class/submissions/native-permission-enforcement.json", "template_path": "evidence/world_class/templates/native-permission-enforcement.intake.json", + "artifact_role_contract": { + "schema_version": "1.0", + "role_source": "world-class-submission-kit", + "counts_as_evidence": false, + "artifact_prefill_counts_as_evidence": false, + "submission_ref_total_count": 2, + "submission_ref_ready_count": 2, + "supporting_evidence_total_count": 11, + "supporting_evidence_ready_count": 11, + "roles": [ + { + "role": "submission-ref", + "label": "Submission refs", + "copy_to_artifact_refs": true, + "description": "Rows marked submission-ref are the aggregate paths expected in artifact_refs." + }, + { + "role": "supporting-evidence", + "label": "Supporting evidence", + "copy_to_artifact_refs": false, + "description": "Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs." + } + ] + }, "drafts_count_as_evidence": false, "artifact_prefill_counts_as_evidence": false }, @@ -494,6 +566,30 @@ "output_dir": "evidence/world_class/submissions", "draft_path": "evidence/world_class/submissions/native-client-telemetry.json", "template_path": "evidence/world_class/templates/native-client-telemetry.intake.json", + "artifact_role_contract": { + "schema_version": "1.0", + "role_source": "world-class-submission-kit", + "counts_as_evidence": false, + "artifact_prefill_counts_as_evidence": false, + "submission_ref_total_count": 2, + "submission_ref_ready_count": 2, + "supporting_evidence_total_count": 6, + "supporting_evidence_ready_count": 6, + "roles": [ + { + "role": "submission-ref", + "label": "Submission refs", + "copy_to_artifact_refs": true, + "description": "Rows marked submission-ref are the aggregate paths expected in artifact_refs." + }, + { + "role": "supporting-evidence", + "label": "Supporting evidence", + "copy_to_artifact_refs": false, + "description": "Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs." + } + ] + }, "drafts_count_as_evidence": false, "artifact_prefill_counts_as_evidence": false }, @@ -823,7 +919,31 @@ "submission_kit_prefill_command": "python3 scripts/yao.py world-class-submission-kit . --output-dir evidence/world_class/submissions --prefill-artifacts", "preflight_counts_submission_as_completion": false, "drafts_count_as_evidence": false, - "artifact_prefill_counts_as_evidence": false + "artifact_prefill_counts_as_evidence": false, + "artifact_role_contract": { + "schema_version": "1.0", + "role_source": "world-class-submission-kit", + "counts_as_evidence": false, + "artifact_prefill_counts_as_evidence": false, + "submission_ref_total_count": 7, + "submission_ref_ready_count": 7, + "supporting_evidence_total_count": 31, + "supporting_evidence_ready_count": 31, + "roles": [ + { + "role": "submission-ref", + "label": "Submission refs", + "copy_to_artifact_refs": true, + "description": "Rows marked submission-ref are the aggregate paths expected in artifact_refs." + }, + { + "role": "supporting-evidence", + "label": "Supporting evidence", + "copy_to_artifact_refs": false, + "description": "Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs." + } + ] + } }, "source_reports": { "ledger": "reports/world_class_evidence_ledger.json", diff --git a/reports/world_class_evidence_preflight.md b/reports/world_class_evidence_preflight.md index d14e896..696f261 100644 --- a/reports/world_class_evidence_preflight.md +++ b/reports/world_class_evidence_preflight.md @@ -25,9 +25,18 @@ This preflight report checks whether an operator can start collecting the remain - guard claims: `python3 scripts/yao.py world-class-claim-guard .` - drafts count as evidence: `false` - artifact prefill counts as evidence: `false` +- submission refs ready: `7` / `7` +- supporting evidence ready: `31` / `31` Generate the submission kit after the real provider, human, native-permission, or native-client work exists. The generated JSON drafts remain `template_only: true` until an operator edits them with real aggregate artifact references and matching SHA-256 digests. The prefill command only inserts local artifact SHA-256 digests; it does not make a draft count as evidence. +| Role | Copy to artifact_refs | Ready | Meaning | +| --- | --- | --- | --- | +| `submission-ref` | `true` | `7 / 7` | Rows marked submission-ref are the aggregate paths expected in artifact_refs. | +| `supporting-evidence` | `false` | `31 / 31` | Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs. | + +`submission-ref` rows are the only checklist rows expected in `artifact_refs`; `supporting-evidence` rows stay available for audit context and reviewer traceability. + ## Evidence Items | Evidence | Status | Intake | Review | Next action | @@ -44,6 +53,8 @@ Generate the submission kit after the real provider, human, native-permission, o - submission: `evidence/world_class/submissions/provider-holdout.json` - prepare draft: `python3 scripts/yao.py world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions` - prepare draft with artifact SHA prefill: `python3 scripts/yao.py world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions --prefill-artifacts` +- submission refs ready: `1` / `1` +- supporting evidence ready: `6` / `6` ### Prechecks @@ -69,6 +80,8 @@ Generate the submission kit after the real provider, human, native-permission, o - submission: `evidence/world_class/submissions/human-adjudication.json` - prepare draft: `python3 scripts/yao.py world-class-submission-kit . --evidence-key human-adjudication --output-dir evidence/world_class/submissions` - prepare draft with artifact SHA prefill: `python3 scripts/yao.py world-class-submission-kit . --evidence-key human-adjudication --output-dir evidence/world_class/submissions --prefill-artifacts` +- submission refs ready: `2` / `2` +- supporting evidence ready: `8` / `8` ### Prechecks @@ -95,6 +108,8 @@ Generate the submission kit after the real provider, human, native-permission, o - submission: `evidence/world_class/submissions/native-permission-enforcement.json` - prepare draft: `python3 scripts/yao.py world-class-submission-kit . --evidence-key native-permission-enforcement --output-dir evidence/world_class/submissions` - prepare draft with artifact SHA prefill: `python3 scripts/yao.py world-class-submission-kit . --evidence-key native-permission-enforcement --output-dir evidence/world_class/submissions --prefill-artifacts` +- submission refs ready: `2` / `2` +- supporting evidence ready: `11` / `11` ### Prechecks @@ -119,6 +134,8 @@ Generate the submission kit after the real provider, human, native-permission, o - submission: `evidence/world_class/submissions/native-client-telemetry.json` - prepare draft: `python3 scripts/yao.py world-class-submission-kit . --evidence-key native-client-telemetry --output-dir evidence/world_class/submissions` - prepare draft with artifact SHA prefill: `python3 scripts/yao.py world-class-submission-kit . --evidence-key native-client-telemetry --output-dir evidence/world_class/submissions --prefill-artifacts` +- submission refs ready: `2` / `2` +- supporting evidence ready: `6` / `6` ### Prechecks diff --git a/scripts/render_evidence_consistency.py b/scripts/render_evidence_consistency.py index 8abeafe..5ef4f34 100644 --- a/scripts/render_evidence_consistency.py +++ b/scripts/render_evidence_consistency.py @@ -557,6 +557,16 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]: if isinstance(preflight_submissions.get("commands", {}), dict) else {} ) + preflight_role_contract = ( + preflight_submissions.get("artifact_role_contract", {}) + if isinstance(preflight_submissions.get("artifact_role_contract", {}), dict) + else {} + ) + preflight_roles = { + str(item.get("role", "")): item + for item in preflight_role_contract.get("roles", []) + if isinstance(item, dict) + } default_submissions_dir = "evidence/world_class/submissions" expected_preflight_handoff = { "directory": default_submissions_dir, @@ -574,6 +584,15 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]: "refresh_ledger": f"python3 scripts/yao.py world-class-ledger . --submissions-dir {default_submissions_dir}", "guard_claim": "python3 scripts/yao.py world-class-claim-guard .", "artifact_prefill_counts_as_evidence": False, + "artifact_role_source": "world-class-submission-kit", + "artifact_role_counts_as_evidence": False, + "artifact_role_prefill_counts_as_evidence": False, + "submission_ref_role_present": True, + "supporting_evidence_role_present": True, + "submission_ref_copy_to_artifact_refs": True, + "supporting_evidence_copy_to_artifact_refs": False, + "submission_ref_total_present": True, + "supporting_evidence_total_present": True, } actual_preflight_handoff = { "directory": preflight_submissions.get("directory"), @@ -594,6 +613,24 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]: "artifact_prefill_counts_as_evidence": preflight_submissions.get( "artifact_prefill_counts_as_evidence" ), + "artifact_role_source": preflight_role_contract.get("role_source"), + "artifact_role_counts_as_evidence": preflight_role_contract.get("counts_as_evidence"), + "artifact_role_prefill_counts_as_evidence": preflight_role_contract.get( + "artifact_prefill_counts_as_evidence" + ), + "submission_ref_role_present": "submission-ref" in preflight_roles, + "supporting_evidence_role_present": "supporting-evidence" in preflight_roles, + "submission_ref_copy_to_artifact_refs": preflight_roles.get("submission-ref", {}).get( + "copy_to_artifact_refs" + ), + "supporting_evidence_copy_to_artifact_refs": preflight_roles.get("supporting-evidence", {}).get( + "copy_to_artifact_refs" + ), + "submission_ref_total_present": int(preflight_role_contract.get("submission_ref_total_count", 0)) > 0, + "supporting_evidence_total_present": int( + preflight_role_contract.get("supporting_evidence_total_count", 0) + ) + > 0, } compare_values( checks, diff --git a/scripts/render_world_class_preflight.py b/scripts/render_world_class_preflight.py index a3c3eaf..860016f 100644 --- a/scripts/render_world_class_preflight.py +++ b/scripts/render_world_class_preflight.py @@ -8,6 +8,7 @@ from pathlib import Path from typing import Any from html_rendering import html_text +from prepare_world_class_submission_kit import build_artifact_checklist 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 @@ -167,6 +168,45 @@ def build_submission_commands(skill_dir: Path, submissions_dir: Path, evidence_k } +def build_artifact_role_contract(rows: list[dict[str, Any]]) -> dict[str, Any]: + submission_ref_rows = [row for row in rows if row.get("submission_ref_required") is True] + supporting_rows = [row for row in rows if row.get("submission_ref_required") is not True] + return { + "schema_version": "1.0", + "role_source": "world-class-submission-kit", + "counts_as_evidence": False, + "artifact_prefill_counts_as_evidence": False, + "submission_ref_total_count": len(submission_ref_rows), + "submission_ref_ready_count": sum(1 for row in submission_ref_rows if row.get("artifact_ref_ready")), + "supporting_evidence_total_count": len(supporting_rows), + "supporting_evidence_ready_count": sum(1 for row in supporting_rows if row.get("artifact_ref_ready")), + "roles": [ + { + "role": "submission-ref", + "label": "Submission refs", + "copy_to_artifact_refs": True, + "description": "Rows marked submission-ref are the aggregate paths expected in artifact_refs.", + }, + { + "role": "supporting-evidence", + "label": "Supporting evidence", + "copy_to_artifact_refs": False, + "description": "Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.", + }, + ], + } + + +def artifact_role_contract_for_key(contract: dict[str, Any], rows: list[dict[str, Any]], evidence_key: str) -> dict[str, Any]: + item_rows = [row for row in rows if row.get("evidence_key") == evidence_key] + role_contract = build_artifact_role_contract(item_rows) + return { + **role_contract, + "schema_version": contract.get("schema_version", "1.0"), + "role_source": contract.get("role_source", "world-class-submission-kit"), + } + + def build_precheck(skill_dir: Path, evidence_key: str, spec: dict[str, Any]) -> dict[str, Any]: kind = str(spec.get("kind", "")) required = spec.get("required") is True @@ -256,6 +296,10 @@ def build_preflight(skill_dir: Path, generated_at: str, submissions_dir: Path | review = build_submission_review(skill_dir, generated_at, submissions_dir=submissions_dir) review_by_key = {str(item.get("evidence_key", "")): item for item in review.get("items", [])} intake_by_key = {str(item.get("evidence_key", "")): item for item in intake.get("operator_checklist", [])} + operator_items = intake.get("operator_checklist", []) + operator_items = operator_items if isinstance(operator_items, list) else [] + artifact_checklist = build_artifact_checklist(skill_dir, operator_items) + artifact_role_contract = build_artifact_role_contract(artifact_checklist) items: list[dict[str, Any]] = [] precheck_rows: list[dict[str, Any]] = [] source_rows: list[dict[str, Any]] = [] @@ -289,6 +333,11 @@ def build_preflight(skill_dir: Path, generated_at: str, submissions_dir: Path | "output_dir": rel_path(submissions_dir, skill_dir), "draft_path": intake_by_key.get(key, {}).get("submission_path", ""), "template_path": intake_by_key.get(key, {}).get("template_path", ""), + "artifact_role_contract": artifact_role_contract_for_key( + artifact_role_contract, + artifact_checklist, + key, + ), "drafts_count_as_evidence": False, "artifact_prefill_counts_as_evidence": False, }, @@ -343,6 +392,7 @@ def build_preflight(skill_dir: Path, generated_at: str, submissions_dir: Path | "preflight_counts_submission_as_completion": False, "drafts_count_as_evidence": False, "artifact_prefill_counts_as_evidence": False, + "artifact_role_contract": artifact_role_contract, }, "source_reports": { "ledger": "reports/world_class_evidence_ledger.json", @@ -360,6 +410,7 @@ def build_preflight(skill_dir: Path, generated_at: str, submissions_dir: Path | def render_markdown(report: dict[str, Any]) -> str: summary = report["summary"] + role_contract = report["submissions"]["artifact_role_contract"] lines = [ "# World-Class Evidence Preflight", "", @@ -388,14 +439,37 @@ def render_markdown(report: dict[str, Any]) -> str: f"- guard claims: `{report['submissions']['commands']['guard_claim']}`", f"- drafts count as evidence: `{str(report['submissions']['drafts_count_as_evidence']).lower()}`", f"- artifact prefill counts as evidence: `{str(report['submissions']['artifact_prefill_counts_as_evidence']).lower()}`", + f"- submission refs ready: `{role_contract['submission_ref_ready_count']}` / `{role_contract['submission_ref_total_count']}`", + f"- supporting evidence ready: `{role_contract['supporting_evidence_ready_count']}` / `{role_contract['supporting_evidence_total_count']}`", "", "Generate the submission kit after the real provider, human, native-permission, or native-client work exists. The generated JSON drafts remain `template_only: true` until an operator edits them with real aggregate artifact references and matching SHA-256 digests. The prefill command only inserts local artifact SHA-256 digests; it does not make a draft count as evidence.", "", + "| Role | Copy to artifact_refs | Ready | Meaning |", + "| --- | --- | --- | --- |", + ] + for role in role_contract.get("roles", []): + if role.get("role") == "submission-ref": + ready = f"{role_contract['submission_ref_ready_count']} / {role_contract['submission_ref_total_count']}" + else: + ready = ( + f"{role_contract['supporting_evidence_ready_count']} / " + f"{role_contract['supporting_evidence_total_count']}" + ) + lines.append( + f"| `{role['role']}` | `{str(role['copy_to_artifact_refs']).lower()}` | `{ready}` | " + f"{md_cell(role['description'])} |" + ) + lines.extend( + [ + "", + "`submission-ref` rows are the only checklist rows expected in `artifact_refs`; `supporting-evidence` rows stay available for audit context and reviewer traceability.", + "", "## Evidence Items", "", "| Evidence | Status | Intake | Review | Next action |", "| --- | --- | --- | --- | --- |", - ] + ] + ) for item in report["items"]: next_action = str(item.get("next_action", "")).replace("|", "\\|") lines.append( @@ -412,6 +486,8 @@ def render_markdown(report: dict[str, Any]) -> str: f"- submission: `{item.get('submission_path') or 'missing'}`", f"- prepare draft: `{item['commands']['prepare_submission']}`", f"- prepare draft with artifact SHA prefill: `{item['commands']['prepare_prefilled_submission']}`", + f"- submission refs ready: `{item['submission_kit']['artifact_role_contract']['submission_ref_ready_count']}` / `{item['submission_kit']['artifact_role_contract']['submission_ref_total_count']}`", + f"- supporting evidence ready: `{item['submission_kit']['artifact_role_contract']['supporting_evidence_ready_count']}` / `{item['submission_kit']['artifact_role_contract']['supporting_evidence_total_count']}`", "", "### Prechecks", "", @@ -520,7 +596,39 @@ def render_html_source_checks(rows: list[dict[str, Any]]) -> str: ) +def render_html_artifact_roles(contract: dict[str, Any]) -> str: + cards = [] + for role in contract.get("roles", []): + role_name = str(role.get("role", "")) + if role_name == "submission-ref": + ready = f"{contract.get('submission_ref_ready_count', 0)}/{contract.get('submission_ref_total_count', 0)} ready" + else: + ready = ( + f"{contract.get('supporting_evidence_ready_count', 0)}/" + f"{contract.get('supporting_evidence_total_count', 0)} ready" + ) + cards.append( + """ +
    + {label} +

    {role}

    + {ready} +

    {description}

    + copy to artifact_refs: {copy} +
    + """.format( + label=html_text(role.get("label", "")), + role=html_text(role_name), + ready=html_text(ready), + description=html_text(role.get("description", "")), + copy=html_text(str(role.get("copy_to_artifact_refs") is True).lower()), + ) + ) + return "".join(cards) + + def render_html_item(item: dict[str, Any]) -> str: + role_contract = item.get("submission_kit", {}).get("artifact_role_contract", {}) return f"""
    @@ -540,6 +648,10 @@ def render_html_item(item: dict[str, Any]) -> str: {html_text(item.get('commands', {}).get('prepare_submission', ''))} {html_text(item.get('commands', {}).get('prepare_prefilled_submission', ''))}
    +
    +

    Artifact Roles

    +
    {render_html_artifact_roles(role_contract)}
    +

    Prechecks

    {render_html_prechecks(item.get('prechecks', []))}
    @@ -569,6 +681,7 @@ def render_html(report: dict[str, Any]) -> str: f"
    {html_text(label)}{html_text(value)}
    " for label, value in stats ) + role_contract = report["submissions"]["artifact_role_contract"] item_cards = "".join(render_html_item(item) for item in report.get("items", [])) html = f""" @@ -604,6 +717,12 @@ def render_html(report: dict[str, Any]) -> str: .commands {{ list-style:none; padding:0; margin:0; display:grid; gap:10px; }} .commands li {{ padding:12px; background:var(--soft); border-radius:8px; }} .commands span {{ display:block; color:var(--ink); font-weight:700; margin-bottom:4px; }} + .role-grid {{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:12px; margin-top:16px; }} + .role-grid.compact {{ margin-top:0; }} + .role-card {{ border:1px solid var(--line); border-radius:8px; padding:14px; background:#fff; min-width:0; }} + .role-card span, .role-card small {{ color:var(--muted); }} + .role-card strong {{ display:block; color:var(--ink); font-size:22px; margin:4px 0 6px; overflow-wrap:anywhere; }} + .role-card p {{ margin:0 0 8px; }} .evidence-grid {{ display:grid; gap:18px; }} .evidence-card {{ padding:20px; min-width:0; }} .evidence-card.blocked {{ border-left:4px solid var(--block); }} @@ -621,7 +740,7 @@ def render_html(report: dict[str, Any]) -> str: .check-section {{ margin-top:16px; }} .notice {{ background:var(--soft); border-left:4px solid var(--ink); padding:16px; border-radius:8px; }} li {{ overflow-wrap:anywhere; }} - @media (max-width:820px) {{ .stats, .two-col, .check-grid {{ grid-template-columns:1fr; }} h1 {{ font-size:38px; }} .topbar-inner {{ align-items:flex-start; flex-direction:column; }} }} + @media (max-width:820px) {{ .stats, .two-col, .check-grid, .role-grid {{ grid-template-columns:1fr; }} h1 {{ font-size:38px; }} .topbar-inner {{ align-items:flex-start; flex-direction:column; }} }} @@ -643,6 +762,8 @@ def render_html(report: dict[str, Any]) -> str:
  • artifact prefill counts as evidence: {html_text(str(report['submissions']['artifact_prefill_counts_as_evidence']).lower())}
  • preflight accepts evidence: {html_text(str(report['summary']['preflight_counts_as_evidence']).lower())}
  • +
    {render_html_artifact_roles(role_contract)}
    +

    submission-ref rows are the paths expected in artifact_refs; supporting-evidence rows stay available for audit context.

    diff --git a/tests/verify_evidence_consistency.py b/tests/verify_evidence_consistency.py index af38af3..46ca2a4 100644 --- a/tests/verify_evidence_consistency.py +++ b/tests/verify_evidence_consistency.py @@ -172,6 +172,13 @@ def main() -> None: assert checks["preflight-submission-kit-handoff"]["status"] == "pass", checks[ "preflight-submission-kit-handoff" ] + preflight_handoff = checks["preflight-submission-kit-handoff"]["actual"] + assert preflight_handoff["artifact_role_source"] == "world-class-submission-kit", preflight_handoff + assert preflight_handoff["artifact_role_counts_as_evidence"] is False, preflight_handoff + assert preflight_handoff["submission_ref_role_present"] is True, preflight_handoff + assert preflight_handoff["supporting_evidence_role_present"] is True, preflight_handoff + assert preflight_handoff["submission_ref_copy_to_artifact_refs"] is True, preflight_handoff + assert preflight_handoff["supporting_evidence_copy_to_artifact_refs"] is False, preflight_handoff assert checks["review-studio-no-overclaim"]["status"] == "pass", checks["review-studio-no-overclaim"] assert checks["claim-guard-package-runtime-surface"]["status"] == "pass", checks[ "claim-guard-package-runtime-surface" diff --git a/tests/verify_world_class_preflight.py b/tests/verify_world_class_preflight.py index d757e59..8e02119 100644 --- a/tests/verify_world_class_preflight.py +++ b/tests/verify_world_class_preflight.py @@ -90,6 +90,16 @@ def main() -> None: "--output-dir evidence/world_class/submissions --prefill-artifacts" ), payload["submissions"] assert payload["submissions"]["artifact_prefill_counts_as_evidence"] is False, payload + role_contract = payload["submissions"]["artifact_role_contract"] + assert role_contract["role_source"] == "world-class-submission-kit", role_contract + assert role_contract["counts_as_evidence"] is False, role_contract + assert role_contract["artifact_prefill_counts_as_evidence"] is False, role_contract + assert role_contract["submission_ref_total_count"] >= 4, role_contract + assert role_contract["submission_ref_ready_count"] <= role_contract["submission_ref_total_count"], role_contract + assert role_contract["supporting_evidence_total_count"] >= 4, role_contract + roles = {item["role"]: item for item in role_contract["roles"]} + assert roles["submission-ref"]["copy_to_artifact_refs"] is True, roles + assert roles["supporting-evidence"]["copy_to_artifact_refs"] is False, roles assert payload["artifacts"]["html"] == "reports/world_class_evidence_preflight.html", payload["artifacts"] submission_commands = payload["submissions"]["commands"] assert submission_commands["prepare_submission"] == ( @@ -126,6 +136,10 @@ def main() -> None: assert provider["submission_kit"]["prefill_command"] == provider["commands"]["prepare_prefilled_submission"], provider assert provider["submission_kit"]["output_dir"] == "evidence/world_class/submissions", provider assert provider["submission_kit"]["draft_path"] == "evidence/world_class/submissions/provider-holdout.json", provider + provider_roles = provider["submission_kit"]["artifact_role_contract"] + assert provider_roles["submission_ref_total_count"] == 1, provider_roles + assert provider_roles["submission_ref_ready_count"] == 1, provider_roles + assert provider_roles["supporting_evidence_total_count"] >= 1, provider_roles provider_checks = {item["key"]: item for item in provider["prechecks"]} assert provider_checks["openai-api-key"]["status"] == "missing", provider_checks assert provider_checks["openai-api-key"]["actual"] == "not-set", provider_checks @@ -158,6 +172,9 @@ def main() -> None: assert "drafts count as evidence: `false`" in markdown, markdown assert "artifact prefill counts as evidence: `false`" in markdown, markdown assert "does not make a draft count as evidence" in markdown, markdown + assert "submission refs ready:" in markdown, markdown + assert "`submission-ref` rows are the only checklist rows expected in `artifact_refs`" in markdown, markdown + assert "| `supporting-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 @@ -169,6 +186,9 @@ def main() -> None: assert "provider-holdout" in html, html assert "Artifact prefill is convenience data only." in html, html assert "artifact prefill counts as evidence" in html, html + assert "Artifact Roles" in html, html + assert "copy to artifact_refs: true" in html, html + assert "supporting-evidence" 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