How I shipped production code in a language I don't know
I shipped a production application in TypeScript — a language I've barely used — with a Node/Fastify backend, a React frontend, Firestore for data, and Terraform-managed infrastructure on GCP. I worked mostly from a terminal rather than a full IDE, and the frontend was something I'd essentially never done. On paper that should have produced confident nonsense. It didn't, and the reason wasn't talent or luck. It was the workflow.
For a few weeks I worked strictly spec-first, and the loop had a fixed shape:
Plan → Propose → Codex review → Apply → Review → Archive
I planned and discussed the change; OpenSpec turned that into the artifacts (proposal, design, spec, task list), so my real work was the thinking and the option-weighing, not the boilerplate; an adversarial reviewer (Codex) tore into the proposal; I implemented it behind failing tests; the implementation got reviewed again; and finally the change was archived and its spec folded into the living docs. A lot of the code itself was written by an AI agent, which makes the guardrails the whole story.
Because the app was greenfield, the big-picture plan — the milestones — was drawn up front, before any change. I worked through them in order; then, as the system took shape and the real decisions started surfacing, I spun up OpenSpec changes on the fly, one per decision. So planning was two-layered: a stable milestone map set at the start, and a stream of small specs filling it in as I learned what the thing actually needed.
Here's the honest version — what genuinely helped, and what was ceremony I had to decide was worth it.
