Expose preflight artifact role contract

This commit is contained in:
yaojingang
2026-06-16 07:28:39 +08:00
parent 220f68a066
commit b26eda78c1
27 changed files with 519 additions and 85 deletions
+1 -1
View File
@@ -16,7 +16,7 @@
"vscode"
],
"package_metadata": "registry/packages/yao-meta-skill.json",
"package_sha256": "892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c"
"package_sha256": "4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322"
}
]
}
+3 -3
View File
@@ -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"
+29 -22
View File
@@ -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,
+5 -4
View File
@@ -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
+6 -6
View File
@@ -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."
}
+1 -1
View File
@@ -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 |
+4 -4
View File
@@ -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."
}
+10 -10
View File
@@ -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": {
+10 -10
View File
@@ -23,16 +23,16 @@ Command runner evidence is present. This proves the eval harness executed an ext
| Case | Variant | Mode | Model | Duration ms | Tokens | Score | Status |
| --- | --- | --- | --- | ---: | ---: | ---: | --- |
| skill-package-contract | baseline | command | local-output-eval-runner | 27.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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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`
+4 -4
View File
@@ -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"
}
]
},
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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": [],
+1 -1
View File
@@ -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
+3 -3
View File
@@ -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": [
+1 -1
View File
@@ -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.
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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`
+2 -2
View File
@@ -70,12 +70,12 @@
{
"field": "archive_sha256",
"from": "",
"to": "38e8e607c1ed5bd016ea242f8fac3e8dfdfe16b165876bc4e19f587481e7c5ca"
"to": "8b255266b2499cfa87728094ca04744b2711f79ad80bd4137311e1087f8798c6"
},
{
"field": "package_sha256",
"from": "0000000000000000000000000000000000000000000000000000000000000000",
"to": "892708619b13ff1af2f189a9a4526123c509bb8b3899dc721af6e66a80ba492c"
"to": "4ee62717cf47c3cb8d92bde382eb227efe8fb3421e7b1271984217c4213bb322"
}
]
},
+105 -1
View File
@@ -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; } }
</style>
</head>
<body>
@@ -71,6 +77,24 @@
<li>artifact prefill counts as evidence: <code>false</code></li>
<li>preflight accepts evidence: <code>false</code></li>
</ul>
<div class="role-grid">
<article class="role-card">
<span>Submission refs</span>
<h3>submission-ref</h3>
<strong>7/7 ready</strong>
<p>Rows marked submission-ref are the aggregate paths expected in artifact_refs.</p>
<small>copy to artifact_refs: <code>true</code></small>
</article>
<article class="role-card">
<span>Supporting evidence</span>
<h3>supporting-evidence</h3>
<strong>31/31 ready</strong>
<p>Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.</p>
<small>copy to artifact_refs: <code>false</code></small>
</article>
</div>
<p class="muted"><code>submission-ref</code> rows are the paths expected in <code>artifact_refs</code>; <code>supporting-evidence</code> rows stay available for audit context.</p>
</article>
<aside class="panel"><h2>Commands</h2><ul class="commands"><li><span>prepare submission</span><code>python3 scripts/yao.py world-class-submission-kit . --output-dir evidence/world_class/submissions</code></li><li><span>prepare prefilled submission</span><code>python3 scripts/yao.py world-class-submission-kit . --output-dir evidence/world_class/submissions --prefill-artifacts</code></li><li><span>validate intake</span><code>python3 scripts/yao.py world-class-intake . --submissions-dir evidence/world_class/submissions</code></li><li><span>submission review</span><code>python3 scripts/yao.py world-class-submission-review . --submissions-dir evidence/world_class/submissions</code></li><li><span>refresh ledger</span><code>python3 scripts/yao.py world-class-ledger . --submissions-dir evidence/world_class/submissions</code></li><li><span>guard claim</span><code>python3 scripts/yao.py world-class-claim-guard .</code></li></ul></aside>
</section>
@@ -93,6 +117,26 @@
<code>python3 scripts/yao.py world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions</code>
<code>python3 scripts/yao.py world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions --prefill-artifacts</code>
</section>
<section class="check-section">
<h4>Artifact Roles</h4>
<div class="role-grid compact">
<article class="role-card">
<span>Submission refs</span>
<h3>submission-ref</h3>
<strong>1/1 ready</strong>
<p>Rows marked submission-ref are the aggregate paths expected in artifact_refs.</p>
<small>copy to artifact_refs: <code>true</code></small>
</article>
<article class="role-card">
<span>Supporting evidence</span>
<h3>supporting-evidence</h3>
<strong>6/6 ready</strong>
<p>Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.</p>
<small>copy to artifact_refs: <code>false</code></small>
</article>
</div>
</section>
<section class="check-section">
<h4>Prechecks</h4>
<div class="check-grid">
@@ -212,6 +256,26 @@
<code>python3 scripts/yao.py world-class-submission-kit . --evidence-key human-adjudication --output-dir evidence/world_class/submissions</code>
<code>python3 scripts/yao.py world-class-submission-kit . --evidence-key human-adjudication --output-dir evidence/world_class/submissions --prefill-artifacts</code>
</section>
<section class="check-section">
<h4>Artifact Roles</h4>
<div class="role-grid compact">
<article class="role-card">
<span>Submission refs</span>
<h3>submission-ref</h3>
<strong>2/2 ready</strong>
<p>Rows marked submission-ref are the aggregate paths expected in artifact_refs.</p>
<small>copy to artifact_refs: <code>true</code></small>
</article>
<article class="role-card">
<span>Supporting evidence</span>
<h3>supporting-evidence</h3>
<strong>8/8 ready</strong>
<p>Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.</p>
<small>copy to artifact_refs: <code>false</code></small>
</article>
</div>
</section>
<section class="check-section">
<h4>Prechecks</h4>
<div class="check-grid">
@@ -344,6 +408,26 @@
<code>python3 scripts/yao.py world-class-submission-kit . --evidence-key native-permission-enforcement --output-dir evidence/world_class/submissions</code>
<code>python3 scripts/yao.py world-class-submission-kit . --evidence-key native-permission-enforcement --output-dir evidence/world_class/submissions --prefill-artifacts</code>
</section>
<section class="check-section">
<h4>Artifact Roles</h4>
<div class="role-grid compact">
<article class="role-card">
<span>Submission refs</span>
<h3>submission-ref</h3>
<strong>2/2 ready</strong>
<p>Rows marked submission-ref are the aggregate paths expected in artifact_refs.</p>
<small>copy to artifact_refs: <code>true</code></small>
</article>
<article class="role-card">
<span>Supporting evidence</span>
<h3>supporting-evidence</h3>
<strong>11/11 ready</strong>
<p>Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.</p>
<small>copy to artifact_refs: <code>false</code></small>
</article>
</div>
</section>
<section class="check-section">
<h4>Prechecks</h4>
<div class="check-grid">
@@ -451,6 +535,26 @@
<code>python3 scripts/yao.py world-class-submission-kit . --evidence-key native-client-telemetry --output-dir evidence/world_class/submissions</code>
<code>python3 scripts/yao.py world-class-submission-kit . --evidence-key native-client-telemetry --output-dir evidence/world_class/submissions --prefill-artifacts</code>
</section>
<section class="check-section">
<h4>Artifact Roles</h4>
<div class="role-grid compact">
<article class="role-card">
<span>Submission refs</span>
<h3>submission-ref</h3>
<strong>2/2 ready</strong>
<p>Rows marked submission-ref are the aggregate paths expected in artifact_refs.</p>
<small>copy to artifact_refs: <code>true</code></small>
</article>
<article class="role-card">
<span>Supporting evidence</span>
<h3>supporting-evidence</h3>
<strong>6/6 ready</strong>
<p>Supporting-evidence rows help reviewers audit the packet but do not all need to be copied into artifact_refs.</p>
<small>copy to artifact_refs: <code>false</code></small>
</article>
</div>
</section>
<section class="check-section">
<h4>Prechecks</h4>
<div class="check-grid">
+121 -1
View File
@@ -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",
+17
View File
@@ -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
+37
View File
@@ -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,
+123 -2
View File
@@ -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(
"""
<article class="role-card">
<span>{label}</span>
<h3>{role}</h3>
<strong>{ready}</strong>
<p>{description}</p>
<small>copy to artifact_refs: <code>{copy}</code></small>
</article>
""".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"""
<article class="evidence-card {html_text(item.get('status', ''))}">
<header>
@@ -540,6 +648,10 @@ def render_html_item(item: dict[str, Any]) -> str:
<code>{html_text(item.get('commands', {}).get('prepare_submission', ''))}</code>
<code>{html_text(item.get('commands', {}).get('prepare_prefilled_submission', ''))}</code>
</section>
<section class="check-section">
<h4>Artifact Roles</h4>
<div class="role-grid compact">{render_html_artifact_roles(role_contract)}</div>
</section>
<section class="check-section">
<h4>Prechecks</h4>
<div class="check-grid">{render_html_prechecks(item.get('prechecks', []))}</div>
@@ -569,6 +681,7 @@ def render_html(report: dict[str, Any]) -> str:
f"<article><span>{html_text(label)}</span><strong>{html_text(value)}</strong></article>"
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"""<!doctype html>
<html lang="en">
@@ -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; }} }}
</style>
</head>
<body>
@@ -643,6 +762,8 @@ def render_html(report: dict[str, Any]) -> str:
<li>artifact prefill counts as evidence: <code>{html_text(str(report['submissions']['artifact_prefill_counts_as_evidence']).lower())}</code></li>
<li>preflight accepts evidence: <code>{html_text(str(report['summary']['preflight_counts_as_evidence']).lower())}</code></li>
</ul>
<div class="role-grid">{render_html_artifact_roles(role_contract)}</div>
<p class="muted"><code>submission-ref</code> rows are the paths expected in <code>artifact_refs</code>; <code>supporting-evidence</code> rows stay available for audit context.</p>
</article>
<aside class="panel"><h2>Commands</h2><ul class="commands">{render_html_commands(report['submissions']['commands'])}</ul></aside>
</section>
+7
View File
@@ -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"
+20
View File
@@ -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 "<title>World-Class Evidence Preflight</title>" 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: <code>true</code>" 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