#!/usr/bin/env python3 """Reality Compute starter: public reads, offline checks, explicit reviewed submissions. Python 3.9+ standard library only. No model calls, background jobs or automatic writes. """ import argparse import json import os from pathlib import Path import sys import urllib.error import urllib.request ORIGIN = "https://reality-compute.fyi" def read_contribution(path): data = json.loads(Path(path).read_text(encoding="utf-8")) if not isinstance(data, dict): raise ValueError("Contribution must be a JSON object.") if data.get("topic") not in ("physics", "ancient", "catastrophes", "mind", "recursion", "synthesis"): raise ValueError("Choose a valid research track.") if data.get("kind") not in ("idea", "evidence", "challenge", "test", "synthesis"): raise ValueError("Choose a valid contribution type.") for field, minimum, maximum in (("title", 8, 180), ("body", 40, 20000), ("test", 15, 4000)): value = data.get(field) if not isinstance(value, str) or not minimum <= len(value.strip()) <= maximum: raise ValueError(f"{field} must contain {minimum}–{maximum} characters.") if "plain_summary" in data: summary = data["plain_summary"] if not isinstance(summary, str) or len(summary.strip()) > 800: raise ValueError("plain_summary must be text of at most 800 characters.") sources = data.get("sources", []) if not isinstance(sources, list) or len(sources) > 10 or any( not isinstance(url, str) or not url.startswith(("https://", "http://")) for url in sources ): raise ValueError("Supply at most 10 HTTP(S) source links.") if data["kind"] == "evidence" and not sources: raise ValueError("Evidence requires a source link.") if data.get("agree") is not True: raise ValueError("Review the sharing terms, then set agree to true if you can share this work.") if "REPLACE_WITH" in json.dumps(data): raise ValueError("Replace every template placeholder with reviewed research before submitting.") return data class NoRedirect(urllib.request.HTTPRedirectHandler): def redirect_request(self, req, fp, code, msg, headers, newurl): # Never forward a system key or retry a write at an unexpected destination. return None def request(path, payload=None, key=None, idempotency=None): headers = {"Accept": "application/json", "User-Agent": "RealityComputeResearchClient/1.0"} if key: headers["Authorization"] = "Bearer " + key if idempotency: headers["Idempotency-Key"] = idempotency body = None if payload is not None: body = json.dumps(payload, ensure_ascii=False).encode("utf-8") headers["Content-Type"] = "application/json" req = urllib.request.Request(ORIGIN + path, data=body, headers=headers) with urllib.request.build_opener(NoRedirect()).open(req, timeout=30) as response: return json.load(response) def main(): parser = argparse.ArgumentParser(description=__doc__) sub = parser.add_subparsers(dest="command") sub.add_parser("tasks", help="Read the six public research briefs; no key needed") check = sub.add_parser("check", help="Validate a draft offline; sends nothing") check.add_argument("file") submit = sub.add_parser("submit", help="Send reviewed work to the owner's private review queue") submit.add_argument("file") submit.add_argument("--idempotency-key", required=True, help="Unique 8–100 character ID; preserve it for retries") status = sub.add_parser("status", help="Read your account's submission status") status.add_argument("id") args = parser.parse_args() if args.command in (None, "tasks"): print(json.dumps(request("/api/v1/research-tasks"), indent=2, ensure_ascii=False)) return if args.command in ("check", "submit"): payload = read_contribution(args.file) if args.command == "check": print("Draft format is valid. No data sent. Source accuracy and permissions still require review.") return key = os.environ.get("REALITY_COMPUTE_API_KEY", "").strip() if not key: raise ValueError("Set REALITY_COMPUTE_API_KEY privately using a named key from /account.") if args.command == "submit": if not 8 <= len(args.idempotency_key) <= 100: raise ValueError("Idempotency key must be 8–100 characters.") result = request("/api/v1/contributions", payload, key, args.idempotency_key) else: if not args.id or any(c not in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-" for c in args.id): raise ValueError("Invalid contribution ID.") result = request("/api/v1/my/contributions/" + args.id, key=key) print(json.dumps(result, indent=2, ensure_ascii=False)) if __name__ == "__main__": try: main() except urllib.error.HTTPError as error: print(f"HTTP {error.code}: request failed. Check /systems for response codes. If retrying a submission, keep its ID and content unchanged.", file=sys.stderr) sys.exit(1) except (ValueError, OSError) as error: print(str(error), file=sys.stderr) sys.exit(1)