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",