# SPDX-License-Identifier: MIT """Fail-closed metadata preflight before offering a Clark transfer route.""" from __future__ import annotations import argparse from datetime import date from hashlib import sha256 import json from pathlib import Path FIELDS = [ "schema_version", "request_sha256", "task_slug", "subject", "role", "worksheet_sha256", "prior_exposure_declared", "attachment_count", "requested_transfer_route", "sender_address_redacted", "screened_on", ] REQUEST_SHA256 = "ab2a8887110cb058d496e0afe1563fe7e42ee260a63608efa2de03a62e58a534" TOKEN = "[KIWERB-CLARK-RETURN]" HASH = set("0123456789abcdef") ROLES = {"first_source_reader", "independent_reproducer"} def canonical(value): return json.dumps(value, ensure_ascii=False, separators=(",", ":"), sort_keys=True).encode() def validate(value): if list(value) != FIELDS: raise ValueError("preflight fields drift") if value["schema_version"] != "openlab-clark-return-preflight-v1": raise ValueError("preflight schema drift") if value["request_sha256"] != REQUEST_SHA256 or value["task_slug"] != "clark-table-i": raise ValueError("request binding drift") subject = value["subject"] if not isinstance(subject, str) or not subject.startswith(TOKEN) or subject.count(TOKEN) != 1 or len(subject) > 160: raise ValueError("exact leading subject token required") if value["role"] not in ROLES: raise ValueError("unknown review role") worksheet = value["worksheet_sha256"] if not isinstance(worksheet, str) or len(worksheet) != 64 or set(worksheet) - HASH: raise ValueError("worksheet sha256 invalid") if not isinstance(value["prior_exposure_declared"], bool): raise ValueError("prior exposure must be explicitly declared") if value["attachment_count"] != 0: raise ValueError("attachments must not be received before route review") if value["requested_transfer_route"] is not True: raise ValueError("reviewed transfer route must be requested") if value["sender_address_redacted"] is not True: raise ValueError("sender address must stay out of preflight evidence") try: screened = date.fromisoformat(value["screened_on"]) except (TypeError, ValueError) as error: raise ValueError("screened_on must be a real ISO date") from error if screened > date.today(): raise ValueError("future screening date refused") digest = sha256(canonical(value)).hexdigest() return { "schema_version": "openlab-clark-return-preflight-receipt-v1", "status": "eligible_for_manual_reply_route_review_not_submission", "request_sha256": REQUEST_SHA256, "task_slug": "clark-table-i", "role": value["role"], "worksheet_sha256": worksheet, "prior_exposure_declared": value["prior_exposure_declared"], "attachments_received": False, "sender_identity_verified": False, "independence_verified": False, "submission_created": False, "scientific_validation_claimed": False, "preflight_input_sha256": digest, } def main(): parser = argparse.ArgumentParser() parser.add_argument("input") parser.add_argument("--out", required=True) args = parser.parse_args() value = json.loads(Path(args.input).read_text(encoding="utf-8")) receipt = validate(value) Path(args.out).write_text(json.dumps(receipt, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") print(json.dumps(receipt, ensure_ascii=False)) if __name__ == "__main__": main()