What went
wrong.
What I learned.
Four pitfalls from twelve weeks at November Five. Not excuses — observations. The gap between what I assumed and what production taught me.
Pitfalls
Local works ≠ production works.
The SSO flow ran clean locally. In production it broke — different env variables, different network config. Then again with Next.js prefetching: disabled in dev by default, silently enabled in prod. The workspace selector served the wrong data to every real user until I found it.
Two production incidents. Both invisible until real users hit them. One required a same-day hotfix the day before the demo.
Mock data outlived its usefulness.
I was still building the payment UI against mocks while Lazlo had already wired the real API endpoints. I didn't know because I didn't ask. The assumption was that someone would tell me when real data was ready.
A full day of refactoring that shouldn't have happened. The assumption was wrong.
Loading states without a system first.
I implemented loading states ticket by ticket, screen by screen. Halfway through, the implementations had diverged — different component names, different skeleton shapes, different timing. I reset the branch and started over from a unified pattern.
One full branch reset. The restart was right. It shouldn't have been necessary.
Skipped the preconditions. Once.
A Windows ticket came back from Ivica because I hadn't read the preconditions before testing and submitting for review. Small mistake in isolation. In a team flow, it creates an extra loop between Ready for Test and Ongoing — friction that compounds.
Unnecessary review cycle. Tester's time wasted. My credibility slightly dented.
Lessons learned
Test against production conditions from day one.
Not at livegang. A staging environment with real env variables, real Next.js prefetching behaviour, real network constraints would have caught both critical bugs weeks earlier. The gap between local and prod is not a surprise — it's a known risk. Build a process around it before you need to.
Give the agent more context than feels necessary.
A Figma frame and a Jira ticket are a start, not a brief. The agent's best outputs came when I also handed it the relevant part of the codebase, the existing component structure, and the constraints I cared about. A PRD or architectural note is not overhead — it's the prompt. Context is the most leveraged thing you write.
Define recurring patterns before touching the first screen.
Loading states, empty states, error states. They appear on every screen. If you don't define the pattern upfront — what the component looks like, how it's named, where it lives — you implement it fifteen different ways and spend a sprint aligning them later. I did. I cleaned it up later. Don't.
Make API changes a team event, not a personal discovery.
Backend changes. Frontend breaks. Expected. What's not acceptable is finding out two days late because nobody mentioned it and I didn't ask. A quick daily check — 'anything changed on the endpoints I'm touching?' — costs thirty seconds. It saves hours. Communication is not a soft skill. It's part of the implementation.
The flow worked.
The mistakes were real.
Both are part of it.
Twelve weeks. Two projects. Shipping code in a professional team for the first time. The pitfalls above are not failures — they are the specific places where reality corrected my assumptions. That's the job. Learn faster next time.