This is the reproducibility appendix for [How Much Does It Cost to Build a Web Portal With Codex?](https://news.maestromojo.com/news/how-much-does-it-cost-to-build-a-web-portal-with-codex/) It is supporting material. It is not a second leaderboard. ## Download the frozen materials - [Exact portal specification](https://news.maestromojo.com/benchmarks/codex-web-portal-2026-08-10/specification.md) - [Exact agent instructions](https://news.maestromojo.com/benchmarks/codex-web-portal-2026-08-10/agent-instructions.md) - [Frozen 23-test acceptance suite](https://news.maestromojo.com/benchmarks/codex-web-portal-2026-08-10/acceptance-tests.py) - [Machine-readable run receipts](https://news.maestromojo.com/benchmarks/codex-web-portal-2026-08-10/results.json) The files contain benchmark credentials used only inside disposable local databases. They contain no production credentials or private user data. ## Exact environment - Codex CLI: `0.147.0-alpha.6.5` - Models: `gpt-5.6-sol`, `gpt-5.6-terra`, and `gpt-5.6-luna` - Reasoning: provider default; no medium, high, or extra-high setting was forced - Primary runtime: Python 3.12 with Django 5.2.12 preloaded offline - Harness: the same Codex CLI workflow for every model - Repository: a new clean Git repository for every run - Network: isolated; agents could not fetch packages - Browser check: one scored output per model opened at a real 390 × 844 CSS-pixel viewport The assignment requested Django 5.2.5. The isolated runner already had Django 5.2.12. We used that same compatible Django 5.2 runtime for every scored run rather than letting dependency discovery decide the result. ## What the agents saw Each agent received the same `SPEC.md` and short instruction file. The job was a server-rendered customer-request portal. It required login, ownership boundaries, staff controls, search, filters, pagination, activity history, 100 idempotent seed records, at least 25 agent-authored tests, documentation, and a layout usable at 390 pixels. The agents did not receive the acceptance suite. ## What the frozen suite checked The 23 checks covered: - model defaults, required fields, choices, and timestamps; - login, logout, and anonymous redirects; - owner-only visibility and editing; - staff-only assignment and status changes; - rejection of privileged form fields from normal users; - activity logs for creation, edits, assignment, and status changes; - validation errors; - search, status filtering, sorting, and 20-item pagination; - preserved query parameters; - a useful empty state; - visibility-aware dashboard counts; - idempotent seed data across users, statuses, and priorities; - pinned requirements, Gunicorn Procfile, migrations, documentation, and at least 25 authored tests; - no unfinished TODO placeholder in required source. The suite did not perform penetration testing, dependency auditing, load testing, accessibility certification, or a complete production-readiness review. ## Scored run receipts Prices use the official OpenAI API rate card visible at 11:00 a.m. PDT on August 10, 2026. “Observed-cache estimate” applies the reported mix of fresh input, cached input, and output tokens. “Fresh-input counterfactual” prices every input token at the fresh-input rate. It is a comparison, not an invoice or an upper bound. | Model and run | Total input | Cached input | Fresh input | Output | Elapsed | Acceptance | Observed-cache API-equivalent estimate | Fresh-input counterfactual | |---|---:|---:|---:|---:|---:|---:|---:|---:| | Sol 1 | 361,247 | 330,496 | 30,751 | 11,355 | 244s | 23/23 | $0.659653 | $2.146885 | | Sol 2 | 250,815 | 229,376 | 21,439 | 10,993 | 288s | 23/23 | $0.551673 | $1.583865 | | Terra 1 | 211,144 | 189,696 | 21,448 | 10,246 | 222s | 23/23 | $0.203787 | $0.545240 | | Terra 2 | 452,430 | 403,712 | 48,718 | 12,589 | 298s | 23/23 | $0.329246 | $1.055928 | | Luna 1 | 672,202 | 621,312 | 50,890 | 14,852 | 331s | 23/23 | $0.040427 | $0.152263 | | Luna 2 | 893,963 | 816,384 | 77,579 | 19,713 | 395s | 22/23 | $0.055499 | $0.202448 | These were subscription-backed Codex runs. The incremental cash charge for the six scored runs was $0. The API-equivalent figures are estimates of the observed tokens, not charges from a receipt. ## Calculation For every run: `(fresh input × fresh-input rate) + (cached input × cached-input rate) + (output × output rate)` Then divide by one million. The CLI reported reasoning output within its output-usage accounting. We did not add it a second time. Rates used per one million fresh input / cached input / output tokens: - Sol: $5 / $0.50 / $30 - Terra: $2 / $0.20 / $12 - Luna: $0.20 / $0.02 / $1.20 ## Cleanup and review observations All three produced usable responsive prototypes with the tested server-side ownership controls and CSRF-protected forms. Sol and Terra passed all 23 acceptance checks twice. Luna passed all 23 once. In the other run, its seed data did not distribute requests across all three fixed users. That run also left a debug user and request in the database. None was production-ready. - Sol was closest on deployment configuration. It still had development defaults and needed HTTPS, secure-cookie, HSTS, database, credential, and operational work. - Terra used development-only settings, left a known-password superuser in the seeded artifact, and did not preserve activity history if a user was deleted. - Luna had similar deployment and audit-history limitations, plus the seed and debug-data cleanup problems above. Passing these checks is not a security audit. ## Pilot and correction log We ran one earlier pilot per model. That pilot did not preload Django. One model located an offline runtime. Two did not. We excluded all three pilot runs from every average and chart because the pilot measured environment discovery as much as portal construction. The pilot also exposed a case-sensitive assertion that rejected the correct visible labels “Open” and “High.” Before the scored runs, we changed only that assertion to compare lowercase page text. The change was model-neutral. We then froze the acceptance suite. ## Limits This was two scored runs per model on one Django task. It does not establish a general model ranking. It does not measure legacy-code work, difficult migrations, large frontends, production operations, or deep security work. The price card can change. The model behavior can change. The Codex harness can change. That is why the article's conclusion is narrow: on this portal, Terra matched Sol's accepted result for less estimated API-equivalent cost. Luna cost less but took longer and had one incomplete result.