Stumbling Dev Log
A solo developer's log of building side projects with Claude Code: the missteps, the outages, and the design calls.
Stumbling Through Claude Code: all episodes → Browse by tag →
- What I Checked When Search Console Said It Didn't Know My Disclosure Pages Two days that started with 18 "blocked by robots.txt" reports in Naver Search Advisor and went on to Google Search Console sample inspections and measuring how thin each page was
- A PR That Verified Zero Missing Rows Stopped Analysis for Three Hours With One Comment Line The PR for regenerating 260,000 summaries accounted for locks, rolling deploys and every stray row. One format placeholder inside a comment in the last commit broke the SQL, and all four tests still passed
- One Empty Array Turned Hitting the Limit Into an Ordinary Failure For two hours before dawn, jobs failed across every project. The only message left was one line with the cause slot empty. And fixing it meant a number in a disclosure body could trigger a global pause
- I Turned On Auto-Publishing and Four Things Surfaced in Three Days None of them were visible while a human sent each issue by hand. A rerun pinned an old response to a new list, a slug got rebuilt and broke the links, a shell that only filled the schema reached the page, and one source took nine of twenty-five slots
- I Cut the Input to a Third, and What I Thought I Had Fixed Split in Two Two-stage processing fixed both numeric accuracy and omission. Measuring again on short inputs showed one was a length problem and the other was a structure problem
- The Prompt Did Not Do It, Splitting the Stages Did I tried to fix thin summaries with the prompt and made them worse. Separating number extraction from sentence writing raised recall 18 points and presence 2.6 points together
- I Measured Four Models on 200 Documents, and What I Did Not Measure Overturned the Result On numeric fidelity the challenger won. Then I found that Korean number spacing was broken in all 200 outputs
- The Replication Job Was Recording "No Upstream" as Success I asked for a cleanup of two months of data and found the price history had stopped on August 24. An upstream password rejection started it, and then one env var missing from the cutover turned a loud failure into a quiet success. Also, the safety guards passed 518 times in two months
- The Path I Blocked as Worthless for Indexing Was My Top Referrer Having just blocked crawlers on the sibling service, I did the same here. I blocked /api/ on the grounds that JSON has no indexing value, except the RSS feed I submitted to Naver lives under it, and Naver is the top non-direct referrer. The home page body comes from there too. I reverted 42 minutes later
- It Was Not AI That Came, It Was Only ChatGPT Memory and traffic jumped and analytics showed nothing. Counting the server log by User-Agent, 11,321 of 15,001 requests over three hours were one backlink-tool bot. After blocking seven bots I looked at analytics again, and the "AI Assistant, 53 sessions" bucket turned out to be one company
- I Tightened Parameters One at a Time, Got Breached Twice, and Stopped Tightening I went in to add a shape check to a sibling route and found that was not the point. The cache key was the whole RequestURI, so every way of spelling the same response became its own entry. I gave up hit rate and set a 64MB total ceiling, and then review found three more holes in the ceiling itself
- Failing to Reproduce It Locally Did Not Mean There Was No Bug After the move to Railway, the web frontend climbed from 226MB to 833MB in a straight line over 26 hours. It was not render load, and the sibling service on the same stack was fine. I hammered it with 3,000 requests on my Mac, could not reproduce it, and wrote down "not reproducible by request volume." Then I measured again inside a container and got 388KB per request. The platform had been hiding the signal
- I Built the Non-LLM Preprocessing First: 150 Items Down to 39 The collector for the newly built AI-news digest dumped 248 items from three days. Rule-based preprocessing that started from "I can't use the LLM without limit," rejecting embeddings, and the one regex character that was throwing away every Korean title as a duplicate
- I Opened Up Effort and Effort Was Empty I added per-job model and effort selection to the shared queue. When I had it do a self-review, the agent measured with 9 scratch sessions and found that the thinking I had turned off five days earlier was neutralizing effort. Why I split the requested value and the actual value into two columns, and how after deploy the docs and production disagreed in five places
- I Left Cloudflare to Get Faster I asked whether to move the whole backend to Cloudflare. Before moving, I measured, and a page that never calls the backend and a static PNG were both the same 0.47 seconds. The free plan was killing 1 in 5 requests, and the conclusion was the exact opposite direction
- I Redefined the Go/No-Go Gate For four months I fixed only Google indexing, but the traffic was coming from Naver, and 4,300 pages indexed on Naver produced 27 clicks. I threw out the old gate that had come up unmeasurable three times in a row and pinned two judgment dates, November 15 and January 10, on a GA4 non-direct session baseline of 54
- I Stopped Judging Runaways Per Job I built a per-call cost cap, raised it, turned it into an alert, and finally removed it. After fixing the same safeguard four times in four days, all that's left is the aggregate gate and a timeout. "Didn't I say just alert me?"
- Three Throttles That Keep a 640K-Row Backfill Behind Live Traffic Filling the 2020–2025 disclosure archive means running for months inside the external API's daily quota and the LLM's throughput. I split collection from analysis, put the archive behind new disclosures, and built a throttle that stops every worker on a rate-limit error. The completion estimate changed four times in five days
- Two Silent Traps in the Dev Environment Four times in one day I reread the code because "the fix isn't taking." The culprit wasn't the code but the .next directory shared by dev and build, and a two-layer cache that kept serving old responses after I fixed the local DB. A trap the user never once saw
- I Rebuilt the Desktop Layout Five Times in Four Days A service that stayed mobile-only for four months turned out to get 96% of its search traffic from desktop. A record of measuring the dead whitespace, adding a rail, throwing away the two-column cards after 6 hours, and rewriting everything from a design handoff
- I Turned Thinking Off 85.8% of the summary job's output tokens were thinking. One environment variable turned it off: output −85%, 4.5x faster, schema 10/10, and the summaries actually had more numbers. And why the one line that turns it off could have killed auth for three projects at once
- When the Constraint Changed From Money to Quota, I Needed a Queue I shut down self-hosted GPU serving and switched to the subscription CLI, and the shared layer I had nailed down in April as "don't build it," this time I built.
- I Fed It Structured Data Instead of Raw Text Only 15% of periodic-report text was being read; it ate 55% of LLM input and the result was cover-page restatements. Swapping raw text for six confirmed figures from the disclosure API cut input to 1/40 and put numbers in the summaries
- Closing the Books on Four Months of Workflow with 337MB of Session Logs Wrapping up the series — I had Claude analyze four months of Claude Code session records wholesale to see what my workflow really looks like, and learned those records vanish in 30 days under default settings.
- Measured Separately Is Not Measured Together, and 3% Utilization Measured thinking mode on an offline set, concluded no effect, then it reversed on a multi-step set. Meanwhile a never-measured combination went into production. The max_tokens cap was a breaker, not a budget, and after four months of tuning, the hardware's utilization was 3%
- The Grader Was Wrong More Often Than the Model Over 800 validation runs while I slept; the morning failure list had 8+ items that were measurement-tool defects. Fixed the tools, then 1,000 config experiments on the real defects that remained. Three cleared, four walls
- I Deleted the Gateway and Fixed the Wiring The gateway I set up two days earlier was attaching stock-market open days even to cooking questions. I repeated the exact pattern I was stopped from in April, and once it was gone, most of the chat quality problems were silently ignored settings, not the model
- I Decided to Re-measure the Hardware from Scratch An orphan number called sm_121, a 6:0 SGLang win that flipped once speculative decoding was on, and a public-benchmark leader losing on my own labeled data. A day re-measuring the DGX Spark at three layers: chip, engine, model
- I Trusted the Community and Halved My Decode Speed Believing "speculative decoding and multimodal are incompatible," I turned off MTP and 42.8t/s dropped to 19.4t/s. Reading the source, the code only warns and proceeds, and meanwhile another trap had been armed
- Settings That Are Bad Alone and Good Together Shrinking chunked prefill alone made tail latency worse; combined with priority scheduling, worst-case TTFT dropped from 51.8s to 2.0s. A night of rejecting four community recommendations by measurement
- One Division Eliminated Half the Model Candidates Measured DGX Spark memory bandwidth at 231GB/s. Divide by active parameters and you get the decode ceiling; every dense model was eliminated by arithmetic alone
- I Lost 2.5 Months of Logs in My First Hour Back In the first DGX Spark session in two months, "check the logs" turned into a container recreate and 334MB vanished. What survived was 14 days that another system happened to be watching
- Who Gets Hurt If It Dies — a Week of Reworking Structure Splitting the trading bot into trader/desk processes, pre-commit document hygiene for a zero-lines-of-code rewrite project, and the full teardown of a 49-day-old launchd resident setup
- The Local LLM That Read "6 Shares" as 0.06 Moving the trading bot's daily LLM roles to a self-hosted model, and pinning down the misreading bug with a byte-exact DB reproduction and A/B measurements
- I Built the Resume Mechanism First, Then Went to Bed Delegating overnight research that gets back up on its own after hitting the token limit, and a post-hoc audit of April's idea scores
- The Daemon Is Alive, Only the Login Is Dead Resident daemons dying silently when OAuth expired every month — after a token detour, I laid down a safety net of health checks and a Telegram bot.
- Claude Proposes, Claude Cross-Examines Wiring headless Claude into the trading bot's day by role — news collection, the morning meeting, cross-examination, an evening self-audit, and a different failure default for each role.
- A Scorecard Instead of a Band After five real-data mockups I dropped the prediction band that covered half the screen, split it into a today view and an accuracy view, and shipped with 220 days of retroactive scoring.
- The Bot That Tried to Trade on Constitution Day Two days spent putting a broker-API validation layer on top of a hand-made calendar, after a missing market holiday caused an incident.
- From a One-Line Question to a Standalone Project A side question in the trading bot session became a separate project within a day, and the first scoring revealed that I was the one who ordered the harmful feature
- I Handed the AI a Browser and It Came Back Having Unblocked Itself A bot-blocking toggle that would not budge in the dashboard; Claude drove the browser itself, uncovered the master-rule structure, and rebuilt the config
- The Lie Called "5 Approved, 0 Rejected" A post-mortem of the first unattended trading day, when all five orders were rejected over a single decimal point and the alert reported success.
- Rebuilding a Principle One Layer Down An honest return-rate answer from the AI collided with the trading bot's rule number one, and instead of scrapping it I redefined it one layer down.
- A No-Implementation Kickoff and a 12-Question Interview Notes on a kickoff prompt that banned writing implementation code and demanded an interview first, at the start of designing the trading bot.
- Claude Code on launchd, and a 401 That Was 13 Days Old Forty minutes setting up Claude Code remote-control as a launchd resident on an always-on Mac mini, running into an expired-token 401, a TUI log bomb, and a race in the verification script, one after another.
- From Error Alert to a Fix PR From My Phone: Building an On-Call Bot in a Day I built a homemade Telegram bot and scrapped it the same day. A setup that fixes server errors from my phone without opening a single inbound port.
- I Got Stopped From Building One More Thing in Front of the Server I cut off the creation of a general-purpose endpoint. And while I was at it, I decided to shut down a whole project.
- Shrinking the Prompt Made It 55% Faster, and Lost What Actually Mattered The compression that produced −55% was throwing away the core of the domain. A story about a metric I wasn't measuring collapsing.
- Five Days of Fine-Tuning Lost to a 108-Character Prompt I spent five days on LoRA for Gemma 4 26B-A4B and it barely differed from no tuning at all. What happened when I attacked the same task with prompt compression instead.
- I Set a Container Memory Limit and the Whole Machine Froze Anyway A 15-hour incident where Docker memory limits did nothing on a DGX Spark and a 26B LoRA run froze the whole machine, plus the two-layer defense I built
- I Wiped Every Docker Volume: The AI Warned Me, and I Deleted It Anyway After deleting Docker.raw and losing every local postgres, I built shared infrastructure instead of trying to recover
- If AI Rewrites It, Can I Just Switch Stacks? Three Switches in 12 Days Over 12 days I moved the backend from Spring Boot to Go and switched mobile stacks three times, to check whether the switching cost is really zero
- Two AIs Blamed Each Other: What Happens When Every Project Gets Its Own Agent Each project's agent looked only at its own logs and pleaded innocent, so I laid both logs side by side to reach a conclusion
- I Was Running a Model per Project, So I Merged Them into One LLM Server Standing up a vLLM server on a single DGX Spark, splitting it out instead of running a model per project, and wiring up monitoring on day one
- Naming It, Buying the Domain, and the First Commit: Two Days from Idea to Code I had the debate pick the name too. A domain purchase at dawn, remote dev setup fumbling, and 22 commits on day one
- I Had No Ideas, So I Built an AI Board to Judge Ideas First I had no ideas, so I built an idea-evaluation system first. How I set up a persona debate, and the record of my fumbling
- The Real Reason I Ran the Kubernetes Seminar Was Selfish A technology only you know can't go to production — how I spread a new technology to my team as a junior engineer