CLAUDE LABJP
WORKFLOWS — Dynamic workflows are GA in Claude Code: Claude plans the work, runs hundreds of parallel subagents in one session, and verifies outputs before reporting backSCALE — Paired with Opus 4.8, Claude Code can carry codebase-scale migrations across hundreds of thousands of lines from kickoff to mergeULTRACODE — The ultracode setting, via the effort menu, sets effort to xhigh and lets Claude decide automatically when to use a workflowEFFORT — claude.ai adds an effort control beside the model selector; pick extra (xhigh in Code) or max for harder, long-running tasksWFSIZE — A Dynamic workflow size setting in /config controls how large Claude makes workflows (small, medium, or large agent counts)OPUS48 — Claude Opus 4.8 remains generally available, improving on 4.7 across coding, agentic skills, reasoning, and knowledge workWORKFLOWS — Dynamic workflows are GA in Claude Code: Claude plans the work, runs hundreds of parallel subagents in one session, and verifies outputs before reporting backSCALE — Paired with Opus 4.8, Claude Code can carry codebase-scale migrations across hundreds of thousands of lines from kickoff to mergeULTRACODE — The ultracode setting, via the effort menu, sets effort to xhigh and lets Claude decide automatically when to use a workflowEFFORT — claude.ai adds an effort control beside the model selector; pick extra (xhigh in Code) or max for harder, long-running tasksWFSIZE — A Dynamic workflow size setting in /config controls how large Claude makes workflows (small, medium, or large agent counts)OPUS48 — Claude Opus 4.8 remains generally available, improving on 4.7 across coding, agentic skills, reasoning, and knowledge work
Articles/Claude Code
Claude Code/2026-07-15Advanced

The Types Landed, but Nothing Got Safer — Where I Delegated a JS→TS Migration to Claude Code, and Where I Didn't

A green tsc run does not mean any is gone. Measuring a migration by type coverage, drawing a clear line between what Claude Code handles well and what a human must decide, and a CI ratchet that refuses regressions.

Claude Code188TypeScript24Type CoverageMigration2CI4Solo Development2

Premium Article

A week after tsc --noEmit went green, production threw Cannot read properties of undefined.

The migration itself had gone smoothly. I converted the utility layer that was still JavaScript, turned on strict: true, and watched CI pass. As far as I was concerned, it was finished.

Tracing the crash led to a function that receives an external API response. The type was there. It just wasn't a type I had written, or one Claude Code had inferred — it was as ApiResponse, a lie I had pushed in by hand.

Having types and being safe turned out to be different things. As an indie developer running four sites on my own, that one stung.

Four ways any leaks past a green tsc

Auditing the codebase afterward taught me that any doesn't disappear when you remove it. It changes shape. In my project the leaks fell into four paths.

Leak pathDoes tsc pass?What actually happened
as assertionsYesAn external response was forced into as ApiResponse; a missing field flowed downstream as undefined
Dependencies without type definitionsYes (even under noImplicitAny, imports slip through)A small library with no @types returned an effective any that propagated
Defaulted genericsYesOmitted type arguments on useState() and my own helpers let inference widen
Values in catch clausesYesBranches touched error.message without ever narrowing from unknown

All four share a trait: nothing errors, so nothing tells you. As long as you measure progress in converted files, these stay invisible until production finds them for you.

Swap the progress metric from file count to type coverage

So I changed the metric to the share of expressions that actually carry a type — type coverage. type-coverage reports it in one command.

npx type-coverage --detail --strict
# 12043 / 12876 94.53%
# src/lib/api-client.ts:42:15 - res
# src/lib/api-client.ts:58:9 - payload

With --detail, every expression still typed as any comes back with a line number. That list was the real state of my migration. File-wise I was at 100% converted. Expression-wise I was at 94.5% — roughly 830 spots spread across those four leak paths.

The number matters less than the breakdown. Group the leaks by file and the work order writes itself.

#!/usr/bin/env bash
# scripts/type-coverage-report.sh — aggregate remaining any by file
set -euo pipefail
 
npx type-coverage --detail --strict 2>/dev/null \
  | grep -E '^[^ ]+\.tsx?:[0-9]+:[0-9]+' \
  | cut -d: -f1 \
  | sort | uniq -c | sort -rn \
  | head -20

In my case the top five files held about 60% of the leaks. That single fact decided the plan: redesigning the boundaries in those five files would beat spreading thin fixes across the whole tree. The migration hadn't failed as a surface. It had failed at specific points.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A measurement script that tracks migration progress by type coverage instead of converted file count, and how to read its output
A concrete boundary table: work Claude Code finishes faster than you can, versus decisions that break quietly when delegated
A CI ratchet that rejects any-ratio regressions per PR, plus how to record deliberate exceptions
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Claude Code2026-06-24
Productionizing a Claude Design Prototype — Single Source, CI, and OGP Auto-Generation
Turn a Claude Design prototype into something that survives production with Claude Code. The call to keep the generated runtime as your foundation, separating logic with a mixin, a single-source data design around a ledger CSV, and CI auto-updates with real-browser OGP capture — implementation included.
Claude Code2026-05-20
Claude Code Says 'All Tests Pass' but CI Goes Red — Designing Around Exit Code Pitfalls
Locally, Claude Code reports 'all tests pass.' You push it, and GitHub Actions turns red within minutes. The root cause is usually not Claude Code itself but how the shell and the test runner interpret exit codes. Here is a practical, experience-backed walkthrough.
Claude Code2026-05-17
Six Months Until CocoaPods Shutdown — Migrating Beautiful HD Wallpapers to Firebase SPM with Claude Code
Firebase Apple SDK is dropping CocoaPods in October 2026. Here's how I migrated Beautiful HD Wallpapers — one of four iOS apps I run as an indie developer — to Swift Package Manager, and where Claude Code made the difference.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →