Ascendy Engineering
Decisions, tradeoffs, and retrospectives from our backend, frontend, and infra pair-agents. Written with LMO in mind so both human readers and global AI agents (Perplexity, ChatGPT, ClaudeBot, Gemini, …) can pick it up.
Recent posts
- A component vanished quietly — the cost of half-following a convention An invite QR rendered as a blank white box. The culprit was the component auto-import naming rule — in a repo that mostly used explicit imports and had therefore never verified how it works.
- The count wouldn't go down — when one name carries two definitions The home card said 'N photos to clean up' and finishing the session didn't move it. The suspect was cache staleness, but the refetch already existed. Fixing that alone would have yielded a freshly fetched wrong number.
- CI was green and the screen was empty — three misdiagnoses a silent fallback produced A one-line bug report cost us days. Server 200, no errors, CI green. The culprit was a fallback quietly resolving to an empty array — an absent signal doesn't just hide a bug, it manufactures wrong answers.
- Retries, but no rule for giving up — the infinite loop four files made Monitoring flagged hundreds of processing failures. The culprits were four corrupted files. The hard timeout, the zombie reaper, and the requeue were each individually right — and nobody counted the attempts.
- The MERGED badge can lie — the PR that vanished by 16 seconds A reviewed PR that GitHub marked MERGED had none of its code in main. The badge means 'merged into its own base,' not 'in main' — and that base branch had left for main 16 seconds earlier, with nothing left to carry it.
- Making search honest revealed the real bug — it was probing 1% of the clusters An agent returned the wrong photos and said 'Found 30.' The first fix wasn't search quality but making search admit when it found nothing — and that honesty flag became a probe that exposed two deeper causes.
- Defense Against the Dark Arts for the AI age — study philosophy We delegate thinking to AI and accept it uncritically, making it easy to steer thought by baking in an ideology. Not hypothetical: some models already refuse topics. The defense: philosophy, and a 'devil's advocate.'
- Does AI's rise make humans obsolete? — from AlphaGo to Shin Jinseo I got into coding when AlphaGo beat Lee Sedol — it read as 'humans lost.' This week Shin Jinseo won a 2-stone handicap game against a stronger AI. Humans didn't catch up; through AI's lens, they evolved. Developers too.
- I thought it was a simple task — why it took 12 rounds of adversarial review It looked simple: replicate an existing pattern into another mode. But cross-provider review found subtler flaws over 12 rounds. Lesson: 'already in the default path' is a dangerous free pass; safety must be proven.
- The deployment succeeded and deployed nothing — a mutable tag swallowed the rollout The deploy said success, rollout said complete, the safety net went green — yet production didn't change. Mutable tag (latest): same name, new content, so Kubernetes saw 'no change,' and the safety net passed vacuously.