GCP Cloud SQL Disaster Recovery: A Practical Guide for Developers

When a production database goes down – whether from a bad migration, an accidental DROP TABLE, or a rogue script – the clock starts ticking. Every minute of downtime is lost revenue, broken trust, and a very stressful Slack channel.

This post walks through how Google Cloud SQL’s backup and recovery features work, common disaster scenarios, and the recovery playbook a developer should follow for each. The examples use a typical SaaS application backed by PostgreSQL on Cloud SQL, but the principles apply broadly.

Cloud SQL Backup Fundamentals

Before anything goes wrong, you need to understand what Cloud SQL gives you out of the box and what you need to configure yourself.

Automated Backups

Cloud SQL can take daily automated backups of your instance. These are full snapshots of the entire database and are retained for a configurable window (default 7 days, max 365).

# gcloud: verify automated backups are enabled
gcloud sql instances describe my-instance \
  --format="value(settings.backupConfiguration)"

Key settings to configure:

SettingRecommendationWhy
backupConfiguration.enabledtrueNon-negotiable for production
backupConfiguration.startTimeOff-peak hours (e.g. 04:00 UTC)Minimizes performance impact
backupConfiguration.backupRetentionSettings.retainedBackups14-30Gives you a wider recovery window
backupConfiguration.pointInTimeRecoveryEnabledtrueEnables PITR (see below)
backupConfiguration.transactionLogRetentionDays7How far back PITR can reach

Point-in-Time Recovery (PITR)

Automated backups give you daily snapshots. PITR fills the gaps by continuously archiving write-ahead logs (WAL for PostgreSQL, binary logs for MySQL). This lets you restore to any second within the retention window — not just to the time of the last backup.

# Enable PITR on an existing instance
gcloud sql instances patch my-instance \
  --enable-point-in-time-recovery \
  --retained-transaction-log-days=7

PITR is the single most important setting for disaster recovery. Without it, you lose every write between your last automated backup and the incident.

On-Demand Backups

You can trigger a backup manually before risky operations:

gcloud sql backups create --instance=my-instance \
  --description="pre-migration-backup-2026-04-08"

Rule of thumb: always take an on-demand backup before running migrations, bulk data operations, or any ad-hoc SQL against production.


Disaster Scenarios and Recovery Playbooks

Scenario 1: Accidental Table Drop or Data Deletion

What happened: A developer ran a DROP TABLE or DELETE FROM without a WHERE clause against production. Maybe it was a script meant for staging. Maybe an AI-generated SQL statement was executed without review.

Impact: One or more tables are gone or empty. The application is throwing 500s.

Recovery options:

Option A: PITR (best if available)

Restore to the moment just before the destructive command. You’ll need the approximate timestamp.

# Restore to a clone instance first — never restore directly over production
gcloud sql instances clone my-instance my-instance-recovery \
  --point-in-time="2026-04-08T10:59:00Z"

This creates a new instance with the database state at that exact second. You can then:

  1. Verify the data on the clone
  2. Export the affected tables from the clone
  3. Import them back into the production instance
# Export a specific table from the recovery clone
gcloud sql export sql my-instance-recovery gs://my-bucket/recovery/users-table.sql \
  --database=myapp_production \
  --table=users

# Import into production
gcloud sql import sql my-instance gs://my-bucket/recovery/users-table.sql \
  --database=myapp_production

Option B: Restore from automated backup

If PITR is not enabled, restore the most recent automated backup that predates the incident.

# List available backups
gcloud sql backups list --instance=my-instance

# Restore a specific backup (this overwrites the instance)
gcloud sql backups restore BACKUP_ID --restore-instance=my-instance

Warning: Restoring a backup directly onto your production instance overwrites everything. All writes since that backup are lost. Prefer cloning to a recovery instance first.

The data gap problem:

When you restore from a backup taken at, say, 4:00 AM, but the incident happened at 11:00 AM, you lose 7 hours of data. This is the gap you’ll need to address manually. Common strategies:

  • Application-level event logs: If your app publishes events to a message queue (Kafka, Pub/Sub), you can replay them.
  • Analytics replicas: If you replicate data to BigQuery, Snowflake, or another analytics store, you can query the missing records from there and re-import them.
  • Audit tables: If your application logs changes to an audit table in a separate database, those records survive.
-- Example: querying BigQuery for records created during the gap window
SELECT *
FROM `project.dataset.user_actions`
WHERE created_at BETWEEN TIMESTAMP('2026-04-08 04:00:00', 'America/Vancouver')
  AND TIMESTAMP('2026-04-08 11:00:00', 'America/Vancouver')
  AND action_type = 'account_status_change'

You then re-ingest these records into production, typically via a script run in your application’s console or through a migration task.


Scenario 2: Interrupted Background Job

What happened: A critical scheduled job — say, one that generates weekly records for all active users — was running when the incident occurred. The database was restored from backup, but the job was killed mid-execution. Some users got their records; others didn’t.

Impact: No application errors (the data that exists is valid), but there’s a silent gap. Some users are missing records they should have.

Recovery playbook:

Step 1 — Quantify the gap

Before doing anything, measure what’s missing:

# Find users who should have a record but don't
target_date = Date.parse('2026-05-30')
users_missing = User.where(status: ['active', 'subscribed'])
  .where.not(id: WeeklyRecord.where(week_date: target_date).select(:user_id))
users_missing.count

Record the count. You’ll need it for verification later.

Step 2 – Understand the generation logic

Before re-running anything, understand what the job does:

  • Does it check for existing records before creating? (idempotent?)
  • Does it behave differently based on user status? (e.g., suspended users get a different treatment)
  • Does it trigger side effects? (emails, webhooks, billing)

If the job is idempotent — meaning running it twice for the same user produces the same result without duplicates — you can safely re-run it for all users, not just the ones missing records. This is simpler and safer than trying to target only the gap.

Step 3 – Re-run with guardrails

Write a targeted script rather than re-triggering the entire job:

target_date = Date.parse('2026-05-30')
# Pre-check
baseline_count = WeeklyRecord.where(week_date: target_date).count
puts "Records before: #{baseline_count}"
# Find and process missing users
users_missing = User.where(status: ['active', 'subscribed'])
.where.not(id: WeeklyRecord.where(week_date: target_date).select(:user_id))
puts "Users missing records: #{users_missing.count}"
users_missing.find_each do |user|
WeeklyRecordGenerator.new(user).generate(target_date)
rescue => e
puts "Failed for User ##{user.id}: #{e.message}"
end
# Post-check
new_count = WeeklyRecord.where(week_date: target_date).count
puts "Records after: #{new_count}"
puts "Delta: #{new_count - baseline_count}"

Step 4 – Verify

Check that:

  • The record count increased by the expected amount
  • No duplicates were created
  • No users are still missing records
  • Any status-dependent logic was applied correctly (e.g., suspended users got the right treatment)

Scenario 3: Corrupted Data from a Bad Migration

What happened: A migration altered a column type, dropped a constraint, or backfilled data incorrectly. The application is running but producing wrong results.

Impact: Data is present but incorrect. This is often harder to detect than missing data.

Recovery playbook:

  1. Don’t panic-restore. If the app is functional (just producing wrong data), you have time to assess.
  2. Clone to a recovery instance from a backup predating the migration: gcloud sql instances clone my-instance pre-migration-clone \ --point-in-time="2026-04-07T23:00:00Z"
  3. Diff the data between production and the clone to understand exactly what changed: -- Compare row counts SELECT 'production' as source, count(*) FROM production.orders UNION ALL SELECT 'backup' as source, count(*) FROM backup_clone.orders; -- Find rows that differ SELECT p.id, p.amount as prod_amount, b.amount as backup_amount FROM production.orders p JOIN backup_clone.orders b ON p.id = b.id WHERE p.amount != b.amount;
  4. Write a targeted fix rather than a full restore (which would lose post-migration legitimate writes).
  5. Write a rollback migration if the schema change itself was the problem.

Scenario 4: Full Instance Failure

What happened: The Cloud SQL instance is unreachable – maybe a zone outage, maybe accidental instance deletion.

Recovery options:

If the instance still exists (zone outage):

Cloud SQL instances configured for high availability will automatically failover to a standby in another zone. If you don’t have HA enabled:

# Enable HA (requires instance restart)
gcloud sql instances patch my-instance --availability-type=REGIONAL

If the instance was deleted:

Deleted instances can be recovered within a limited window if deletion protection wasn’t bypassed:

# Enable deletion protection
gcloud sql instances patch my-instance --deletion-protection

If truly gone, restore from the most recent backup to a new instance:

gcloud sql instances create my-instance-restored \
--source-backup=BACKUP_ID \
--tier=db-custom-4-16384 \
--region=us-west1

Then update your application’s database connection string to point to the new instance.


Prevention Checklist

The best disaster recovery is the one you never need. Here’s what to set up before things go wrong:

Cloud SQL Configuration

# The production-ready configuration checklist
gcloud sql instances patch my-instance \
--backup-start-time=04:00 \
--enable-point-in-time-recovery \
--retained-transaction-log-days=7 \
--retained-backups-count=30 \
--deletion-protection \
--availability-type=REGIONAL

Operational Practices

1. Never run ad-hoc SQL directly against production

Use a read replica for investigative queries. If you must write, use a transaction with a manual ROLLBACK checkpoint:

BEGIN;

-- Your change here
UPDATE users SET status = 'inactive' WHERE last_login < '2025-01-01';

-- Verify before committing
SELECT count(*) FROM users WHERE status = 'inactive';

-- Only if the count looks right:
COMMIT;
-- Otherwise:
ROLLBACK;

2. Take on-demand backups before risky operations

gcloud sql backups create --instance=my-instance \
--description="pre-bulk-update-$(date +%Y%m%d-%H%M%S)"

3. Review AI-generated SQL before executing

AI tools are excellent at generating SQL, but they don’t understand your data invariants. A syntactically correct DROP TABLE or DELETE without a WHERE clause is still catastrophic. Always:

  • Read the generated SQL line by line
  • Run it on staging first
  • Wrap destructive operations in a transaction
  • Have a second pair of eyes for DDL changes

4. Maintain an analytics replica

Replicate critical tables to BigQuery or another analytics store. This serves as both an analytics platform and a recovery source. If your primary database loses data, you can query the replica for the gap window and re-ingest.

# Set up a BigQuery data transfer from Cloud SQL
bq mk --transfer_config \
--target_dataset=sql_replica \
--display_name="Production SQL Replica" \
--data_source=scheduled_query \
--schedule="every 1 hours"

5. Use IAM to restrict destructive operations

Not every developer needs cloudsql.instances.delete or direct SQL access to production:

# Create a read-only role for most developers
gcloud projects add-iam-policy-binding my-project \
--member="group:developers@company.com" \
--role="roles/cloudsql.viewer"
# Grant write access only to the ops team
gcloud projects add-iam-policy-binding my-project \
--member="group:database-ops@company.com" \
--role="roles/cloudsql.admin"

The Recovery Timeline: What Happens in Practice

Here’s what a real recovery typically looks like, end to end:

T+0min Incident detected (alerts fire, app errors spike)
T+5min Confirm the issue — is it a code bug or data loss?
T+10min Identify the last good backup / PITR target
T+15min Clone instance from backup (takes 5-30 min depending on size)
T+45min Verify restored data on the clone
T+60min Restore production from clone or selectively import tables
T+90min Identify the data gap (writes between backup and incident)
T+120min Query analytics replica / event logs for gap data
T+150min Re-ingest gap data, verify counts
T+180min Re-run interrupted jobs with verification
T+210min Final validation — all counts match, no duplicates, app healthy
T+240min Post-incident review

The total time depends on database size, gap complexity, and whether you had PITR enabled. With PITR, the gap is seconds. Without it, you could be looking at hours of manual data reconciliation.


Key Takeaways

  1. Enable PITR. It’s the difference between losing seconds of data and losing hours.
  2. Always clone to a recovery instance first. Never restore directly over production unless you have no other option.
  3. Maintain an analytics replica. It’s your insurance policy for the data gap.
  4. Quantify before you fix. Record counts before and after every recovery step. You can’t verify what you didn’t measure.
  5. Understand your jobs’ idempotency. If a background job was interrupted, knowing whether it’s safe to re-run is the difference between a smooth recovery and creating a bigger mess.
  6. Take on-demand backups before risky operations. The 30 seconds it takes could save you 4 hours of recovery.
  7. Review all SQL before execution. Especially AI-generated SQL. Trust, but verify.

Production incidents are stressful, but with the right configuration and a clear playbook, they don’t have to be catastrophic. Set up your backups today — future you will be grateful.

Happy fixing!


Engineer’s Guide to Cursor AI: Mastering the AI-First IDE in 2026

A comprehensive technical deep-dive into Cursor’s architecture, capabilities, and how to wield it effectively.

1. How Cursor Started: From MIT Dorm to $10B Valuation

Cursor didn’t emerge from a traditional enterprise software company. It was born in 2022 when four MIT students—Michael Truell, Sualeh Asif, Arvid Lunnemark, and Aman Sanger—founded Anysphere with a contrarian thesis: instead of bolting AI onto existing editors (like GitHub Copilot’s extension approach), they would build an AI-first code editor from the ground up.

The key architectural bet was simple but profound: fork VS Code and embed AI into the core runtime rather than as an extension. This meant AI could access the full editor context—open files, project structure, terminal output, and git state—without the latency and permission boundaries that plague extension-based assistants.

By September 2023, Cursor had raised $8M from OpenAI (with $11M total), with the founders publicly stating their ambition: “a code editor that makes it nearly impossible to write bugs” and enables developers to “create thousands of lines of code with minimal input.”

They entered a market dominated by Copilot (launched 2021) and newcomers like Codeium and Tabnine. Their differentiator wasn’t just better models—it was multi-file editing. Early AI models were too slow for this; by the time GPT-4 and Claude arrived, Cursor’s architecture was ready to exploit them.


2. The AI Era of Coding

We’re past the “AI-assisted coding” phase. We’re in the AI-augmented development era, where the question isn’t whether to use AI, but how to integrate it into your workflow without sacrificing quality, security, or control.

The shift has three dimensions:

  1. From autocomplete to agents: Tab completion (Copilot-style) is table stakes. The frontier is autonomous agents that plan, execute, and verify multi-step tasks across your codebase.
  2. From single-file to codebase-aware: Context windows have exploded (100K+ tokens). AI can now reason over entire repos, not just the file you’re editing.
  3. From chat to tool use: AI assistants now call APIs, run terminals, query databases, and control browsers via protocols like MCP (Model Context Protocol).

Developers who treat AI as “fancy autocomplete” are leaving 3–5x productivity gains on the table. Those who learn to orchestrate agents, rules, and context effectively are redefining what “senior engineer” means.


3. Cursor in 2024 / 2025: The Acceleration

2024: Composer, Agents, and Context

  • Composer with Agent (Nov–Dec 2024): Sidebar UI with inline diffs; agents that pick their own context and use the terminal.
  • Yolo Mode: Agents auto-run terminal commands with exit code visibility.
  • @Context References: @docs, @git, @web, @folder, @Lint Errors for flexible context selection.
  • Commit message generation: Automatic git commit messages from diffs.

2025: Agent as Default, Rules, and Model Explosion

  • Agent as Default (v0.46, Feb 2025): Chat, Composer, and Agent unified into one interface. Agent is now the primary mode.
  • .cursor/rules & Project Rules: Repository-level rules in .cursor/rules that agents automatically apply. Visual indicators show when rules are active.
  • Web Search Integration: Agents automatically search the web for current information without explicit commands.
  • Deepseek Support: Deepseek R1 and v3 models, self-hosted in the US.
  • Fusion Tab Model: Cursor-trained model for code jumps and long context—~100ms faster completions, 30% reduced time-to-first-token.
  • Credit-based billing (June 2025): Shift from request-based to credit-based pricing.

4. How Cursor Works and the Models It Provides

Architecture Overview

Cursor is a fork of VS Code with AI baked into the runtime. Key components:

  • Tab (inline completions): Real-time suggestions as you type. Uses Cursor’s proprietary Fusion model and third-party models.
  • Agent / Composer: Multi-turn, multi-file editing. Can read files, run commands, apply edits, and iterate.
  • Chat: Conversational interface for questions, explanations, and quick edits.
  • Rules & Skills: Declarative rules (.cursor/rules, RULE.md) and procedural skills (SKILL.md) that shape agent behavior.

Model Lineup (2025–2026)

ModelUse CaseNotes
GPT-4oGeneral coding, fast completionsOpenAI’s flagship
Claude Sonnet 3.5 / OpusComplex reasoning, long contextAnthropic
Gemini ProAlternative for completionsGoogle
Deepseek R1 / v3Cost-effective, strong reasoningSelf-hosted in US
Cursor ComposerMulti-file edits, agent tasksProprietary, fine-tuned
Cursor Fusion TabInline completionsProprietary, low latency
Codebase UnderstandingSemantic search, contextProprietary

Pricing Tiers (2026)

  • Hobby (Free): 2,000 completions, 50 slow premium requests/month.
  • Pro ($20/mo): 500 fast premium requests, unlimited slow, $20 API agent usage.
  • Pro Plus ($60/mo): 1,500 fast agent requests, extended context.
  • Ultra ($200/mo): 5,000 fast requests, unlimited Max Mode, experimental models.
  • Business ($40/user/mo): Privacy mode, SSO, admin dashboard.
  • Enterprise: Custom pricing, audit logs, dedicated support.

5. Using Cursor Efficiently: MCP, Agents, Code Reviews, and More

MCP (Model Context Protocol)

MCP is an open standard (Anthropic, late 2024) that acts as a “USB-C port for AI”—letting Cursor connect to external tools and data sources. Instead of pasting API docs or database schemas into chat, you configure MCP servers that the agent can query directly.

Components:

  • Server: Bridge to tools (databases, APIs, browsers).
  • Client: Cursor’s engine deciding when to call tools.
  • Host: Cursor’s UI.

Transports: Stdio (local, low latency) and SSE (remote, team sharing).

High-leverage integrations:

  • Browser control: Navigate, click, fill forms for E2E testing.
  • Databases: Postgres, Supabase—query and reason over schema.
  • Linear, GitHub, Jira: Create tickets, PRs, link context.
  • Figma: Pull design context, screenshots for implementation.

Best practices:

  • Use .cursorrules to govern when agents use tools.
  • Never hardcode API keys; use env vars.
  • Avoid connecting too many tools—performance degrades.
  • MCP can reduce token consumption by 18–37% by fetching only what’s needed.

Agents and Subagents

Agents are the primary interface in Cursor. They:

  • Plan multi-step tasks.
  • Read files, run terminal commands, apply edits.
  • Use subagents for parallel work (research, terminal, specialized tasks).

Subagents (v2.4, Jan 2026): Independent agents for discrete subtasks. Run in parallel, use their own context. Can spawn their own subagents (tree structure). Enables larger refactors and multi-file features.

Skills (SKILL.md): Procedural “how-to” instructions. Better for dynamic context than always-on rules. Invoke via slash commands when relevant.

Rules and Project Context

  • .cursor/rules: Directory of rule files. Agents automatically apply these. Use for conventions, architecture decisions, testing requirements.
  • RULE.md: File-specific or project-level rules.
  • CLAUDE.md: Documentation for AI (common in open source). Cursor respects these.

Example rule:

Always use .to_cents for legacy decimal money values.
Never add noLayout meta to admin pages.
Create specs for all new classes.

Code Reviews

  • Inline diffs: Agent shows changes in sidebar before applying.
  • Cursor Blame (Enterprise): AI attribution—see what’s AI-generated vs human-written, with links to the conversation that produced each line.
  • Plan mode: Agent generates a plan; you approve before execution. Use /plan to revisit.

Practical Workflow Tips

  1. Start with rules: Add .cursor/rules before heavy agent use. Saves iterations.
  2. Use @-mentions: @file, @folder, @docs, @web to scope context.
  3. Agent for refactors, Tab for flow: Use agents for multi-file work; Tab for fast inline completion during focused coding.
  4. Lock browser before interactions: If using browser MCP—navigate first, then lock, then interact, then unlock.
  5. Skills for domain logic: Create SKILL.md for project-specific workflows (e.g., “How we deploy,” “How we run migrations”).

6. Major Competitors

ToolPositioningStrengthsWeaknesses
GitHub CopilotExtension, ecosystem20M+ users, tight GitHub integration, multi-turn chat, agent modeLess codebase-aware than Cursor; extension limits
Windsurf (ex-Codeium)Budget-friendlyGenerous free tier, Cascade agent mode ($15/mo)Smaller ecosystem, less mature
Claude CodeTerminal + IDE integrationBest-in-class reasoning, SWE-bench 72–79%, flexible architecturePay-per-use can spike; terminal-first
Amazon Q DeveloperAWS-centricFree tier, AWS integrationNarrow for non-AWS work
TabninePrivacy-focusedSelf-hosting, on-premLess capable agents
Sourcegraph CodyEnterprise codebaseOptimized for large reposSmaller feature set

Cursor’s niche: Full IDE with deepest codebase integration, multi-model support, and agent-first design. Best for teams that want one tool for daily coding and complex refactors.


7. Advantages Over Claude Code (Claude Co-Work)

DimensionCursorClaude Code
InterfaceFull IDE (VS Code fork)Terminal + IDE extension
SetupInstall and goAPI keys, extension setup
Cost predictabilityFlat $20/mo ProPay-per-use (~$3/M input tokens); can hit $300+ in hours
OfflineTab completions work offlineRequires API
ContextNative codebase indexingRelies on IDE extension context
WorkflowSingle environment for edit, run, reviewSplit between terminal and editor
MCPBuilt-in, rich ecosystemVia extension

Choose Cursor when: You want an all-in-one IDE, predictable costs, and minimal setup. Ideal for daily coding flow.


8. Drawbacks vs. Claude Code

DimensionCursorClaude Code
Reasoning qualityStrong, but Claude Code leads on complex tasksBest-in-class; SWE-bench 72–79% vs Cursor ~62%
Refactoring scaleExcellentSlightly better for large-scale, multi-repo refactors
Editor choiceLocked to Cursor (VS Code fork)Use any editor; terminal-first
Model flexibilityCursor’s model selectionDirect Anthropic API; latest Claude first
Autonomous operationAgent + sandboxCheckpoints, background tasks, subagents—more mature
Cost at scale$20–200/mo fixedCan be cheaper for light use; expensive for heavy

Choose Claude Code when: You need maximum reasoning quality, want to keep your current editor, or have variable usage (pay only when you use it).

Many senior engineers use both: Cursor for daily flow; Claude Code for major refactors and complex debugging.


9. Alternatives to Consider in 2026

  • GitHub Copilot Pro+ ($39/mo): If you’re deep in GitHub/GitHub Actions. Access to Claude Opus 4, GPT-5. Best ecosystem fit.
  • Windsurf (free / $15 Cascade): If budget is primary. Solid free tier, capable agent mode.
  • Claude Code + VS Code extension: If you prioritize reasoning and editor flexibility. Pay-per-use.
  • Amazon Q Developer: If you’re AWS-native. Free tier, good for AWS-specific tasks.
  • Tabnine: If you need self-hosting or strict data residency.
  • Continue.dev: Open-source, self-hostable. For teams that want full control.

Stack strategy: Cursor for primary IDE + Claude Code for hard problems + Copilot for GitHub-centric workflows is a common “power user” setup.


10. The Future of Cursor and How Developers Will Use It

Where Cursor Is Heading (2026+)

  • Cloud agents with computer use (Feb 2026): Agents run in isolated VMs, produce merge-ready PRs with videos/screenshots. Available on web, desktop, mobile, Slack, GitHub.
  • Long-running agents: Plan-first execution for larger tasks. Fewer follow-ups, more complete PRs.
  • Marketplace plugins: Pre-built integrations (Amplitude, AWS, Figma, Linear, Stripe) installable via /add-plugin.
  • Self-driving codebases: Multi-agent research harness in preview.
  • Composer 1.5: 20x scaling of reinforcement learning for reasoning.
  • Agent sandboxing: Granular network and filesystem controls for security.

How Developers Will Use It

  1. Orchestration over authorship: Senior engineers will spend more time defining rules, skills, and MCP integrations than writing boilerplate. The agent writes; the human directs.
  2. Review as primary skill: With Cursor Blame and inline diffs, code review becomes the highest-leverage activity. Understanding why AI made a change matters more than writing the change.
  3. Domain-specific skills: Teams will maintain SKILL.md libraries for their stack (e.g., “How we do auth,” “How we deploy to Fly.io”).
  4. Hybrid local + cloud: Local agent for fast iteration; cloud agent for CI-like verification and demos.
  5. Cursor as platform: Plugins and MCP will turn Cursor into a hub for design, analytics, deployment—not just coding.

The Bottom Line

Cursor has reached $500M ARR and a $10B valuation by 2025. Enterprise adoption (Stripe, Box, NVIDIA) reports 30–50% roadmap throughput gains. The question for 2026 isn’t whether to use AI—it’s whether you’re using it as a junior engineer (tab completion only) or as a senior engineer (agents, rules, MCP, and strategic tool choice).

Master Cursor’s rules, MCP, and agent workflows. Pair it with Claude Code for hard problems. Keep your skills sharp on review and architecture. The developers who do this will define the next decade of software engineering.


Written from the perspective of a senior software engineer who has shipped production systems with Cursor, Claude Code, and Copilot.