Practices, guardrails and habits for shipping faster without lowering the bar.

Four short sessions. Each one ends with something you can use the same day.
Guardrails and mindset
Everyone, 45 min
What never goes into a prompt, and who owns the output.
The Claude Code workflow
Engineers and QA, 60 min, hands-on
Plan, build, test and review with Claude on a real repo.
Beyond code
Everyone, 45 min
Deciding what to build, plus chat and Cowork for specs, docs and analysis.
Multiply what works
Everyone, 30 min, then every two weeks
Share, turn mistakes into rules, and measure progress.
Everyone, 45 minutes

My team's Claude usage in one month.
We use Claude a lot. The gap is turning sessions into reviewed, shipped changes, and using it beyond code.
It doesn't know our tenants, clients or history unless you tell it.
Especially about methods and APIs that look plausible but don't exist.
"Claude wrote it" never explains a bug in your PR.
Here's last week's sales export for the client. Why is sell-through wrong? [pastes 2,000 rows]
Here's the schema of the sales table (column names and types) and 5 synthetic rows. Sell-through comes out above 100% for some styles. Write a query to find the rows that cause it and explain likely causes.
def get_stock(tenant_id: str, style_id: str): if not tenant_id: raise TenantContextMissing( "tenant_id is required" ) return stock_repo.find( tenant_id=tenant_id, style_id=style_id, )
Ask Claude: "List every data path this change touches and show where each one is scoped to a tenant."
Merging is accountability, not automation.
Never merge code you can't explain to a reviewer.
As speed goes up, review depth tends to go down. Don't let it.
Every merge and every deploy is a human decision.
Engineers and QA, 60 minutes, hands-on

Claude writes code quickly, but it can't fix a bad design. Spend the time you save on the plan and the review.
Illustrative split. Your numbers will vary; the direction won't.
AI doesn't reduce iterations. It makes each one cheaper, so do more of them. The first output is a draft, never the deliverable.
Read src/allocation/ and its tests. Do not write or edit any code yet. Propose a plan to add a minimum display quantity check to allocation: - files you will change, and why - functions you will call (open each file and confirm it exists) - tests you will add - open questions and assumptions Wait for my approval before implementing.
I want to add [feature]. Before writing anything, interview me. Ask one question at a time about: users, edge cases, failure modes, tenant boundaries and what's out of scope. When you have enough, write a spec with: goal, non-goals, API shape, data changes, tests, and open questions. Then split it into small slices, each one shippable and testable on its own.
# CLAUDE.md ## Commands Tests: pytest -q UI: pnpm test ## Non-negotiable - Every query is tenant-scoped. No cross-tenant paths. - Read a file before referencing anything in it. - Smallest change that solves the task. Don't touch unrelated code. Flag it instead. - Tests in the same change. Never edit a test to pass. - Ask before adding a dependency. - No magic numbers. Named constants or config. - Never swallow exceptions. Fail loudly and early. - Safe to run twice. Log state changes and calls. ## Definition of done - Tests run locally. Paste the output. - Docs updated if behaviour changed. - List every file changed and why.
reserved = inventory_service.get_reserved_qty(
tenant_id, style_id
)
# get_reserved_qty() was never defined.
# The name was a plausible guess.
Invented methods, fields, config keys and CLI flags read fine in review and fail at runtime.
Before you use any function, class, field or config key: 1. Open the file where it is defined. 2. Quote its signature in your reply. 3. If it doesn't exist, stop and tell me. Don't create it silently.
In review, search the codebase for every new symbol in the diff.
Task: fix rounding in allocate_units() allocation/core.py +4 -2 the fix allocation/core.py +38 -41 renamed variables utils/dates.py +12 -3 unrelated cleanup pyproject.toml +1 -1 bumped a dependency
One line of value, three sources of risk, and a diff nobody can review properly.
Change only what's needed to fix this. If you notice other problems, list them under "Flagged, not fixed" at the end. Don't reformat, rename or upgrade anything else.
Flagged issues become their own tickets. Public interface changes need explicit approval.
def test_reorder_qty_is_never_negative(): assert reorder_qty(on_hand=50, target=30) == 0 def test_on_hand_is_tenant_scoped(repo): repo.seed(tenant_id="t1", style_id="S1", on_hand=5) repo.seed(tenant_id="t2", style_id="S1", on_hand=500) assert get_on_hand( repo, tenant_id="t1", style_id="S1" ) == 5
try: plan = load_plan(tenant_id, plan_id) except Exception: plan = {} # carry on with empty plan
AI often adds broad try/except blocks to look robust. The result is wrong output and no error.
plan = load_plan(tenant_id, plan_id) if plan is None: raise PlanNotFound( f"plan {plan_id} not found " f"for tenant {tenant_id}" )
Catch only what you can handle. Never return a default just to keep going.
# Pure: no I/O, no hidden state def compute_replenishment(stock, policy) -> int: target = policy.target_cover_days * stock.daily_rate return max(target - stock.on_hand, 0) # Edge: reads, logs, writes def run_replenishment(tenant_id, style_id) -> None: stock = stock_repo.get(tenant_id, style_id) policy = policy_repo.get(tenant_id) qty = compute_replenishment(stock, policy) logger.info("replenishment computed", extra={ "tenant_id": tenant_id, "qty": qty, }) order_repo.upsert(tenant_id, style_id, qty)
The session that wrote the code is the worst one to review it. Review in a fresh context, one lens at a time.
Plans and implements one slice. Runs the tests.
Reads the diff cold and reports issues with severity and location.
Review this diff as a senior engineer on this team. Check, in order: correctness, tenant isolation, security, performance, simplicity. For each issue give severity, file and line, and a suggested fix.
Everyone, 45 minutes

What's the simplest thing we could ship?
Ship that. Optimise after it's delivered and used, not before.
Proven over shiny
Claude makes adding a new library easy. That doesn't make it a good idea.
A PoC now takes hours
Use one to test feasibility before you promise a date or a design.
Every decision is a trade-off. Bring the business the pros and cons in their language, not a flat yes or no.
Same data rules apply: redact first, and treat every output as a draft.
"Turn these notes into an ADR: context, options, decision, consequences. List what's missing."
"Find gaps, edge cases and conflicting requirements. Ask me questions instead of assuming."
"Split this spec into tickets with acceptance criteria, boundaries and test cases."
"From these redacted logs, build a timeline and the most likely causes, ranked."
"From this spec, write a test plan: happy path, boundaries, failures, tenant isolation."
"From this diff, write a PR description: why, how it was tested, risks, revert plan."
From this spec, write test cases for allocation caps: - happy path - boundaries: 0, max, max + 1 - invalid and missing input - one test proving tenant A cannot read or change tenant B's data Use only synthetic data from tests/factories.py. Run the suite and show me the output.
Everyone, 30 minutes, then every two weeks

Your best workflow is worth more shared than kept. That goes for prompts, CLAUDE.md lines and review habits.
Don't wait for someone to assign it. Start sharing useful things and let it compound.
Team AI channel
Post one prompt, skill or workflow that saved you time this week.
Show-and-tell
15 minutes. One person, one real workflow, one lesson.
Shared library
Reusable prompts, review workflows and CLAUDE.md snippets in one repo.
Don't just flag a problem. Bring the data, the cost, and an offer to help fix it.
Each metric gets thresholds we agree as a team. Every month we review the trend and start with whatever is red.
| Metric | What it tells us | Thresholds |
|---|---|---|
| Sessions that end in a merged PR | Are we shipping, or just exploring? | |
| People using more than one surface | Is Claude helping beyond code? | |
| Regression tests per bug fix | Are we learning from mistakes? | |
| Review comments on AI-introduced issues | Is our process catching problems early? | |
| Rules added to CLAUDE.md | Are lessons being encoded? |
Add CLAUDE.md
To every repo you own, starting from the template in Part 2.
Plan first
Use the plan-first prompt on your next task, then review in a fresh session.
Share one thing
Post one prompt or workflow that worked in the team channel.
Credit to the Engineering Leadership newsletter, whose writing on AI-assisted engineering, pragmatic engineering and multiplier leadership informed much of this series.