Field Notes
Field notes from building and running Magrathea's products: practical guides, engineering lessons, and dispatches from every world in orbit.
Anonymous guests can ask our fantasy AI anything, so the free endpoint needed defending. Why we rejected the obvious LLM-classifier pre-check on latency grounds, and the three layers we shipped instead: a Bedrock Guardrail scoped to the question bytes only, a scope clause a guardrail can't express, and server-assembled prompts.
Read →A decade-old booster club platform moved from RDS to DynamoDB with no maintenance window, because the migration was idempotent, incremental, and scoped: a command we ran dozens of times before it meant anything. Plus the three things that bit us, and two gaps still open.
Read →For weeks a nightly batch of coding agents worked our GitHub issue queue while we slept. The real logs: an eight-issue night with dependency-aware scheduling, empty-queue nights, a subagent that went off-script, and an issue that fixed itself in production. The harness, not the model, turned out to be the product.
Read →Our value model ranked elite quarterbacks and tight ends earlier than real drafters take them. Instead of assuming the market was wrong, we gave the model perfect hindsight across six seasons. It proved the market right, and showed where value-over-replacement quietly lies.
Read →Value-over-replacement priced the top kicker at pick 28 in our draft model. It was honest math and a terrible strategy, because the "free" baseline it assumed doesn't match the waiver wire. The trap, and the one-line fix.
Read →Cognito user pools can't export password hashes. One product got stuck mid-migration because of it, so RotoAlpha moved to custom HS256 JWT auth before launch to avoid the same trap. The mechanics, the replacement stack, and the honest costs.
Read →Developer field notes: the @forge/events consumer payload gotcha, idempotent queue chaining for long runs, rate-limit rescheduling, and the JQL editor autocomplete key remap.
Read →Three worked examples (a label cleanup, a mass reassignment, and closing stale issues), each previewed before a single issue changes.
Read →Why the 1,000-issue limit exists, every workaround that actually works in 2026 (JQL slicing, CSV re-import, REST API scripts), and the trade-offs of each.
Read →