diff --git a/scripts/render_evidence_consistency.py b/scripts/render_evidence_consistency.py
index 42bd91ce..8abeafe6 100644
--- a/scripts/render_evidence_consistency.py
+++ b/scripts/render_evidence_consistency.py
@@ -565,10 +565,15 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]:
"html_report": "reports/world_class_evidence_preflight.html",
"html_exists": True,
"prepare_submission": f"python3 scripts/yao.py world-class-submission-kit . --output-dir {default_submissions_dir}",
+ "prepare_prefilled_submission": (
+ f"python3 scripts/yao.py world-class-submission-kit . --output-dir {default_submissions_dir} "
+ "--prefill-artifacts"
+ ),
"validate_intake": f"python3 scripts/yao.py world-class-intake . --submissions-dir {default_submissions_dir}",
"submission_review": f"python3 scripts/yao.py world-class-submission-review . --submissions-dir {default_submissions_dir}",
"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,
}
actual_preflight_handoff = {
"directory": preflight_submissions.get("directory"),
@@ -581,10 +586,14 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]:
else None,
"html_exists": (skill_dir / "reports" / "world_class_evidence_preflight.html").exists(),
"prepare_submission": preflight_commands.get("prepare_submission"),
+ "prepare_prefilled_submission": preflight_commands.get("prepare_prefilled_submission"),
"validate_intake": preflight_commands.get("validate_intake"),
"submission_review": preflight_commands.get("submission_review"),
"refresh_ledger": preflight_commands.get("refresh_ledger"),
"guard_claim": preflight_commands.get("guard_claim"),
+ "artifact_prefill_counts_as_evidence": preflight_submissions.get(
+ "artifact_prefill_counts_as_evidence"
+ ),
}
compare_values(
checks,
@@ -594,8 +603,8 @@ def build_report(skill_dir: Path, generated_at: str) -> dict[str, Any]:
actual=actual_preflight_handoff,
paths=[REQUIRED_REPORTS["world_class_preflight"], "reports/world_class_evidence_preflight.html"],
detail=(
- "Preflight must give operators the exact draft, intake, review, ledger, and claim-guard commands "
- "without letting drafts or submissions count as accepted evidence."
+ "Preflight must give operators the exact draft, SHA-prefill, intake, review, ledger, "
+ "and claim-guard commands without letting drafts, prefill, or submissions count as accepted evidence."
),
)
diff --git a/scripts/render_world_class_preflight.py b/scripts/render_world_class_preflight.py
index 1dfe9d87..50712501 100644
--- a/scripts/render_world_class_preflight.py
+++ b/scripts/render_world_class_preflight.py
@@ -148,8 +148,10 @@ def build_submission_commands(skill_dir: Path, submissions_dir: Path, evidence_k
prepare = f"python3 scripts/yao.py world-class-submission-kit . --output-dir {output_dir}"
if evidence_key:
prepare = f"python3 scripts/yao.py world-class-submission-kit . --evidence-key {evidence_key} --output-dir {output_dir}"
+ prefilled_prepare = f"{prepare} --prefill-artifacts"
return {
"prepare_submission": prepare,
+ "prepare_prefilled_submission": prefilled_prepare,
"validate_intake": f"python3 scripts/yao.py world-class-intake . --submissions-dir {output_dir}",
"submission_review": f"python3 scripts/yao.py world-class-submission-review . --submissions-dir {output_dir}",
"refresh_ledger": f"python3 scripts/yao.py world-class-ledger . --submissions-dir {output_dir}",
@@ -275,10 +277,12 @@ def build_preflight(skill_dir: Path, generated_at: str, submissions_dir: Path |
"commands": item_commands,
"submission_kit": {
"prepare_command": item_commands["prepare_submission"],
+ "prefill_command": item_commands["prepare_prefilled_submission"],
"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", ""),
"drafts_count_as_evidence": False,
+ "artifact_prefill_counts_as_evidence": False,
},
"runbook": entry.get("runbook", []),
}
@@ -325,8 +329,12 @@ def build_preflight(skill_dir: Path, generated_at: str, submissions_dir: Path |
"directory": rel_path(submissions_dir, skill_dir),
"commands": build_submission_commands(skill_dir, submissions_dir),
"submission_kit_command": build_submission_commands(skill_dir, submissions_dir)["prepare_submission"],
+ "submission_kit_prefill_command": build_submission_commands(skill_dir, submissions_dir)[
+ "prepare_prefilled_submission"
+ ],
"preflight_counts_submission_as_completion": False,
"drafts_count_as_evidence": False,
+ "artifact_prefill_counts_as_evidence": False,
},
"source_reports": {
"ledger": "reports/world_class_evidence_ledger.json",
@@ -365,13 +373,15 @@ def render_markdown(report: dict[str, Any]) -> str:
"",
f"- submissions directory: `{report['submissions']['directory']}`",
f"- prepare drafts: `{report['submissions']['commands']['prepare_submission']}`",
+ f"- prepare drafts with artifact SHA prefill: `{report['submissions']['commands']['prepare_prefilled_submission']}`",
f"- validate intake: `{report['submissions']['commands']['validate_intake']}`",
f"- review queue: `{report['submissions']['commands']['submission_review']}`",
f"- refresh ledger: `{report['submissions']['commands']['refresh_ledger']}`",
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()}`",
"",
- "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.",
+ "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.",
"",
"## Evidence Items",
"",
@@ -393,6 +403,7 @@ def render_markdown(report: dict[str, Any]) -> str:
f"- ledger: `{item['ledger_status']}`",
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']}`",
"",
"### Prechecks",
"",
@@ -519,6 +530,7 @@ def render_html_item(item: dict[str, Any]) -> str:
Next Action
{html_text(item.get('next_action', ''))}
{html_text(item.get('commands', {}).get('prepare_submission', ''))}
+ {html_text(item.get('commands', {}).get('prepare_prefilled_submission', ''))}
Prechecks
@@ -595,6 +607,7 @@ def render_html(report: dict[str, Any]) -> str:
code {{ font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size:13px; overflow-wrap:anywhere; }}
.next-action, .runbook {{ background:var(--soft); border-radius:8px; padding:14px; margin:14px 0; }}
.next-action p {{ margin-top:0; }}
+ .next-action code {{ display:block; margin-top:8px; }}
.check-grid {{ display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:12px; }}
.check-row {{ padding:14px; min-width:0; }}
.check-section {{ margin-top:16px; }}
@@ -615,10 +628,11 @@ def render_html(report: dict[str, Any]) -> str:
Submission Kit
- Generate drafts only after real provider, human-review, native-permission, or native-client work exists. Drafts remain non-evidence until valid aggregate artifact refs and SHA-256 digests are supplied.
+ Generate drafts only after real provider, human-review, native-permission, or native-client work exists. Drafts remain non-evidence until valid aggregate artifact refs and SHA-256 digests are supplied. Artifact prefill is convenience data only.
- submissions directory:
{html_text(report['submissions']['directory'])}
- drafts count as evidence:
{html_text(str(report['submissions']['drafts_count_as_evidence']).lower())}
+ - 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())}
diff --git a/tests/verify_world_class_preflight.py b/tests/verify_world_class_preflight.py
index db343c73..d757e596 100644
--- a/tests/verify_world_class_preflight.py
+++ b/tests/verify_world_class_preflight.py
@@ -85,12 +85,21 @@ def main() -> None:
"python3 scripts/yao.py world-class-submission-kit . "
"--output-dir evidence/world_class/submissions"
), payload["submissions"]
+ assert payload["submissions"]["submission_kit_prefill_command"] == (
+ "python3 scripts/yao.py world-class-submission-kit . "
+ "--output-dir evidence/world_class/submissions --prefill-artifacts"
+ ), payload["submissions"]
+ assert payload["submissions"]["artifact_prefill_counts_as_evidence"] is False, payload
assert payload["artifacts"]["html"] == "reports/world_class_evidence_preflight.html", payload["artifacts"]
submission_commands = payload["submissions"]["commands"]
assert submission_commands["prepare_submission"] == (
"python3 scripts/yao.py world-class-submission-kit . "
"--output-dir evidence/world_class/submissions"
), submission_commands
+ assert submission_commands["prepare_prefilled_submission"] == (
+ "python3 scripts/yao.py world-class-submission-kit . "
+ "--output-dir evidence/world_class/submissions --prefill-artifacts"
+ ), submission_commands
assert submission_commands["validate_intake"] == (
"python3 scripts/yao.py world-class-intake . --submissions-dir evidence/world_class/submissions"
), submission_commands
@@ -108,7 +117,13 @@ def main() -> None:
"python3 scripts/yao.py world-class-submission-kit . "
"--evidence-key provider-holdout --output-dir evidence/world_class/submissions"
), provider
+ assert provider["commands"]["prepare_prefilled_submission"] == (
+ "python3 scripts/yao.py world-class-submission-kit . "
+ "--evidence-key provider-holdout --output-dir evidence/world_class/submissions --prefill-artifacts"
+ ), provider
assert provider["submission_kit"]["drafts_count_as_evidence"] is False, provider
+ assert provider["submission_kit"]["artifact_prefill_counts_as_evidence"] is False, provider
+ 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_checks = {item["key"]: item for item in provider["prechecks"]}
@@ -137,8 +152,12 @@ def main() -> None:
assert "credential value exposed: `false`" in markdown, markdown
assert "Submission Kit Handoff" in markdown, markdown
assert "world-class-submission-kit . --output-dir evidence/world_class/submissions" in markdown, markdown
+ assert "world-class-submission-kit . --output-dir evidence/world_class/submissions --prefill-artifacts" in markdown, markdown
assert "world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions" in markdown, markdown
+ assert "world-class-submission-kit . --evidence-key provider-holdout --output-dir evidence/world_class/submissions --prefill-artifacts" in markdown, markdown
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 "values are never printed" in markdown, markdown
html = output_html.read_text(encoding="utf-8")
assert "World-Class Evidence Preflight" in html, html
@@ -146,7 +165,10 @@ def main() -> None:
assert "Evidence Queue" in html, html
assert "Submission Kit" in html, html
assert "world-class-submission-kit . --output-dir evidence/world_class/submissions" in html, html
+ assert "world-class-submission-kit . --output-dir evidence/world_class/submissions --prefill-artifacts" in html, html
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 "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
@@ -187,7 +209,9 @@ def main() -> None:
spaced_payload = json.loads(spaced_proc.stdout)
quoted_spaced = "'tests/tmp_world_class_preflight/submission kit spaced'"
assert quoted_spaced in spaced_payload["submissions"]["commands"]["prepare_submission"], spaced_payload["submissions"]
+ assert quoted_spaced in spaced_payload["submissions"]["commands"]["prepare_prefilled_submission"], spaced_payload["submissions"]
assert quoted_spaced in by_key(spaced_payload["items"], "provider-holdout")["commands"]["prepare_submission"], spaced_payload["items"]
+ assert quoted_spaced in by_key(spaced_payload["items"], "provider-holdout")["commands"]["prepare_prefilled_submission"], spaced_payload["items"]
cli_proc = run_cli(
"--output-json",