Tinker AI
Read reviews

Outcome

Team-wide consistency took 8 weeks of deliberate convergence; productivity gain became measurable only after consistency emerged

7 min read

I led the AI tool adoption for a 5-engineer React Native team last quarter. The project was a customer-facing mobile app, two months into development when we adopted Cursor. The initial roll-out was bumpy in instructive ways. By the end, the team’s productivity gain was real and measurable; the path to get there required more deliberate work than I expected.

The starting point

Before adoption:

  • 5 engineers, mix of senior and mid-level
  • React Native 0.74, TypeScript, Tamagui, TanStack Query
  • Existing codebase: ~25k lines, conventional structure
  • Engineers were using GitHub Copilot individually with mixed enthusiasm

We decided to switch to Cursor for the team. The hypothesis: Cursor’s deeper integration would produce more consistent results across engineers.

Week 1-2: free-for-all

We installed Cursor and let everyone use it. The result was about what you’d expect:

  • Two engineers loved it and used it heavily
  • Two engineers used it like a Tab autocomplete and ignored the chat
  • One engineer used it sporadically and complained about specific failure modes

The code coming through PRs varied accordingly:

  • Heavy users produced verbose PRs with lots of generated code
  • Light users produced PRs similar to before adoption
  • The styles were noticeably different across engineers

This wasn’t a productivity gain; it was just adding a tool that some engineers used and others didn’t.

Week 3-4: figuring out where Cursor was helpful

I asked the team to track, informally, where Cursor was actually saving them time. After two weeks, the patterns were clear:

Helpful:

  • Generating new screens that follow existing patterns
  • Writing tests for existing logic
  • Refactoring within a file
  • Generating boilerplate (config, type definitions, etc.)

Mixed:

  • Modifying existing screens (sometimes broke patterns)
  • Cross-file refactoring (worked when scoped, struggled at large scope)
  • Debugging (sometimes great, sometimes wrong-direction)

Counterproductive:

  • Original UI design (output was generic)
  • Animation work (output was clunky)
  • Native module integration (output was outdated)

The pattern matched my own experience. The interesting finding was that the team’s experience was reasonably consistent — Cursor’s strengths and weaknesses showed up similarly across different engineers.

Week 5-6: codifying patterns

Based on the observations, we wrote a team .cursorrules:

# Project rules

This is a React Native project with:
- React Native 0.74, new architecture (Fabric + TurboModules)
- TypeScript strict mode
- Tamagui for UI, NOT styled-components or NativeWind
- TanStack Query for data fetching, NOT SWR or Apollo
- Riverpod ... wait, that's wrong, this is React Native, not Flutter
- Reanimated 3 for animations
- React Hook Form for forms

Conventions:

UI components:
- Function components with explicit Props interface
- Tamagui's `styled()` for component variants
- No inline styles unless dynamic
- Colors and spacing from theme tokens; never hex codes

Data fetching:
- All queries via TanStack Query with proper queryKey arrays
- Mutations via useMutation with onSuccess/onError handlers
- Optimistic updates for fast operations
- Error boundaries at screen level

State management:
- React state for local component state
- Zustand for global UI state (modal visibility, theme, etc.)
- TanStack Query for server state
- Never useReducer; use Zustand if state is complex

Navigation:
- React Navigation 7
- Type-safe navigation via the TypedNavigation utility (see src/lib/navigation.ts)
- Pass params explicitly; do not use route.params globally

Forms:
- React Hook Form with Zod resolvers
- Server-side errors mapped to form errors via setError
- Submit buttons disable during submission

Avoid:
- Style-components (we deleted it from the codebase)
- Class components (function only)
- Direct fetch() calls (always use TanStack Query)
- Any. We use unknown when uncertain.

When in doubt about a pattern, look at src/screens/ProfileScreen.tsx and
src/screens/HomeScreen.tsx — these are the canonical examples.

This was about 200 lines once we filled in all the categories. Took two engineering days to write and review across the team.

Week 7-8: the convergence

After the .cursorrules went in, the team’s output got noticeably more consistent. PRs from the heavy Cursor users started looking more like PRs from the light Cursor users (because the rules were forcing consistency in style).

More importantly, the heavy Cursor users started producing higher-quality code because Cursor’s defaults were now aligned with the project’s actual conventions. Pattern-matching against ProfileScreen.tsx (the canonical example we pinned) produced code that fit.

The light Cursor users started using it more because the suggestions were now more reliable. The previous “oh, that’s not quite our style” reaction was replaced with “yes, that fits.”

Productivity numbers

After three months:

  • PR cycle time: down 18% from pre-Cursor baseline
  • PR size: roughly flat (we kept the cap on PR size to prevent AI-generated bloat)
  • Bugs reported in production: roughly flat
  • Engineer-reported satisfaction with workflow: up

The 18% cycle time improvement is meaningful. It’s not the 50%+ that the marketing promises, but it’s real.

What we did right

A few things in retrospect that worked:

Patience with the convergence. The first 4 weeks were not productive — they were investment in figuring out what worked. If we’d judged AI tooling by week 2 results, we’d have abandoned it.

Codifying patterns. The .cursorrules file was the unlock. Without it, the convergence wouldn’t have happened.

Pinning canonical examples. Identifying ProfileScreen.tsx and HomeScreen.tsx as “this is what good code looks like” gave Cursor a target to match.

Frequent retrospectives. Weekly check-ins on “where is Cursor helping, where is it not?” surfaced patterns. Without these, we’d have kept doing what wasn’t working.

Allowing personal customization. Each engineer kept their own keybindings and personal preferences. The team-shared part was the rules, not the entire setup.

What we did wrong

A few things I’d change next time:

Started without rules. The first 2 weeks were free-for-all. Should have written initial rules from day 1. Even imperfect rules would have produced more consistency than no rules.

Didn’t track productivity from the start. I didn’t have a baseline of pre-Cursor PR cycle time. We had to estimate retroactively. Tracking from day 1 would have given cleaner data.

Underestimated the resistance. Some engineers were skeptical of AI tools. I assumed they’d come around with exposure; some didn’t. Should have addressed the skepticism more directly.

Over-engineered initially. My first pass at .cursorrules was 400 lines. The team rebelled (rightly) — too much to digest. We trimmed to 200 and that worked. Lesson: less is more on rules.

What I’d recommend for similar teams

For 3-10 engineer teams adopting AI tools:

Plan for an 8-week convergence period. Don’t expect immediate productivity gains. The investment phase is real and necessary.

Write rules from day 1. Even imperfect rules. Refine over the convergence period.

Identify canonical examples. Code that demonstrates your best patterns. Pin these in AI tools’ contexts.

Track productivity metrics. Not for proving anything to executives, but for understanding what’s working. PR cycle time, bug rate, engineer satisfaction.

Allow personal variation in setup. Mandate consistency in output (via rules) but let engineers customize their personal experience.

Have weekly retros for the first 2 months. Catch friction before it becomes resentment.

Don’t expect uniform enthusiasm. Some engineers will love AI tools; others will tolerate them. Both are fine. Don’t push.

The honest assessment

After three months, the team is using Cursor productively. The 18% cycle time improvement is real. The team’s satisfaction is up. The code quality is consistent.

Was it worth the 8 weeks of convergence work? Yes — because the productivity gain is now ongoing. The investment was finite; the benefit compounds.

Would I do it again on a different team? Yes, with the lessons above to accelerate the convergence.

Would I recommend AI tool adoption for every team? It depends. For teams where:

  • The work fits AI tooling (greenfield, mainstream stack, well-defined conventions)
  • The team is willing to invest in the convergence
  • The productivity ceiling matters (you’re capacity-limited)

…adoption pays off. For teams where these don’t apply (legacy code, niche stack, capacity not the bottleneck), the math is less favorable.

The honest summary: AI tool adoption for teams is a real intervention with real cost and real benefit. The hype overstates the benefit; the skepticism understates it. The reality is in between, and the path to capture the reality is more deliberate than the marketing suggests.