import importlib.util import json from pathlib import Path SCRIPT_PATH = Path(__file__).resolve().parents[1] / "scripts" / "devpost_submission_checklist.py" SPEC = importlib.util.spec_from_file_location("devpost_submission_checklist", SCRIPT_PATH) devpost_submission_checklist = importlib.util.module_from_spec(SPEC) assert SPEC.loader is not None SPEC.loader.exec_module(devpost_submission_checklist) def write_json(root: Path, relative_path: str, payload: dict) -> None: path = root / relative_path path.parent.mkdir(parents=True, exist_ok=True) path.write_text(json.dumps(payload), encoding="utf-8") def form_fields(*, final: bool = False) -> list[dict]: values = { "project_name": "ProofFrame", "tagline": "B2-ready provenance desk for GenAI media.", "one_liner": "ProofFrame turns generated media into approved evidence packets.", "short_description": "A review desk for generated media evidence packets.", "repository_url": "https://github.com/adjcjh777/backblaze-proofframe", "demo_url": "https://adjcjh-backblaze-proofframe.hf.space/?judge=1", "video_url": "https://youtu.be/proofframe-demo" if final else "TBD after final proof.", "built_with": "Python, FastAPI, Backblaze B2, Genblaze", "tags": "AI, Generative media, Backblaze B2", "inspiration": "Generated media needs operational provenance.", "what_it_does": "- Create a campaign.\n- Review assets.\n- Export evidence.", "how_we_built_it": "FastAPI plus B2 and Genblaze adapters.", "backblaze_b2_usage": "B2 stores generated media and manifests.", "genblaze_usage": "Genblaze generates media and records model metadata.", "challenges": "Avoiding shallow sponsor integration.", "accomplishments": "- Working product.\n- Public demo.\n- Fail-closed gates.", "what_we_learned": "The useful unit is an evidence packet.", "whats_next": "- More providers.\n- Team workflows.", "judging_note": "Current packet mode: post_live_verified.", } return [ { "id": field_id, "label": field_id.replace("_", " ").title(), "source": f"packet.{field_id}", "value": value, "chars": len(value), "max_chars": 2500, "ok_for_mock": True, "ok_for_final": final or field_id != "video_url", } for field_id, value in values.items() ] def write_fixtures(root: Path, *, final: bool = False) -> None: statuses = { "T020": "done" if final else "doing", "T021": "done" if final else "doing", "T040": "done", "T041": "todo", "T041A": "done" if final else "todo", "T042": "todo", } write_json( root, "tasks.json", {"tasks": [{"id": task_id, "status": status} for task_id, status in statuses.items()]}, ) write_json( root, "docs/assets/devpost-form-kit.json", { "schema": "proofframe.devpost_form_kit.v1", "mode": "final_form_ready" if final else "pre_live_form_ready", "final_form_ready": final, "fields": form_fields(final=final), }, ) write_json( root, "docs/assets/devpost-submission-packet.json", { "schema": "proofframe.devpost_packet.v1", "mode": "post_live_verified" if final else "pre_live_safe", "video_url": "https://youtu.be/proofframe-demo" if final else "TBD after final proof.", }, ) write_json( root, "docs/assets/final-submission-control.json", { "schema": "proofframe.final_submission_control.v1", "mode": "ready_to_submit" if final else "pre_live_control", "safe_to_submit": final, }, ) write_json( root, "docs/assets/submission-audit-report.json", { "schema": "proofframe.submission_audit.v1", "mode": "pre_submit_audit_ready" if final else "pre_submit_audit_blocked", "ok": final, }, ) write_json( root, "docs/assets/devpost-submission-receipt.json", { "schema": "proofframe.devpost_submission_receipt.v1", "mode": "pending_submission", "ok": False, }, ) def test_devpost_submission_checklist_blocks_pre_live_submit(tmp_path): write_fixtures(tmp_path) checklist = devpost_submission_checklist.build_checklist(tmp_path) assert checklist["mode"] == "pre_submit_blocked" assert checklist["ok"] is False assert checklist["safe_to_submit"] is False assert "video_url" in checklist["field_gate"]["final_pending_fields"] blocked = {item["id"] for item in checklist["preflight"] if not item["ok"]} assert "packet_post_live_verified" in blocked assert "prerequisite_tasks_done" in blocked assert "submission_audit_report_present" not in blocked assert "final_control_report_present" not in blocked def test_devpost_submission_checklist_ready_after_final_gates(tmp_path): write_fixtures(tmp_path, final=True) checklist = devpost_submission_checklist.build_checklist(tmp_path) assert checklist["mode"] == "ready_to_submit_devpost" assert checklist["ok"] is True assert checklist["safe_to_submit"] is True assert checklist["field_gate"]["final_pending_fields"] == [] assert [field["id"] for field in checklist["fields"][:3]] == [ "project_name", "tagline", "one_liner", ] def test_devpost_submission_checklist_writes_outputs(tmp_path): write_fixtures(tmp_path) checklist = devpost_submission_checklist.build_checklist(tmp_path) json_path = tmp_path / "out" / "checklist.json" markdown_path = tmp_path / "out" / "checklist.md" devpost_submission_checklist.write_outputs(checklist, json_path, markdown_path) saved = json.loads(json_path.read_text(encoding="utf-8")) markdown = markdown_path.read_text(encoding="utf-8") assert saved["schema"] == "proofframe.devpost_submission_checklist.v1" assert "# ProofFrame Devpost Submission Checklist" in markdown assert "This checklist contains Devpost copy only" in markdown