SignalPilot is #1 on both public data-agent benchmarksSee the results →
All cases

Silent value corruption

Complete the project on this database to calculate the monthly recurring revenue.

One incomplete labeling rule tagged 7 dormant customer-months as churn: a 13% churn over-count.

Case 19 of 39Δ 7 rowsmrr

Why SignalPilot passed where base failed

Evidence chips jump to the exact transcript moment

Both tables were the exact same size. Claude Code still overstated churn by 13 percent, reporting 62 churned customer-months where the truth is 55, because it kept re-labeling customers who had already left months earlier. SignalPilot labeled all 410 rows correctly.

Real-world impact

The churn figure going into revenue reporting was 13 percent too high. A team reading it would believe customer loss is meaningfully worse than it is, in a metric boards and investors watch closely.

Where base Claude Code went wrong
  • Its churn rule only checked "inactive this month", so customers already gone for months kept getting stamped churn again and again.
  • Seven rows that should carry no label were labeled churn: 62 instead of 55.

Jump to the exact moment

What SignalPilot did differently
  • Wrote all six labeling rules in full before any code, including the missed case: an inactive month after another inactive month gets no label.
  • Required "was active last month" before anything is called churn, with the rules confirmed against the 410-row reference snapshot during research.

Jump to the exact moment

The numbers

CheckCorrect answerBase Claude CodeSignalPilot
Churned customer-months5562 (13% overstated)55
All other categories·correctcorrect

Verification workflow

Where the eight-step workflow caught it.

Read the workflow docs
  1. 01
    Map the project

    Scan every model: dependencies, required columns, macros, hazards.

  2. 02
    Load supporting skills

    SQL, database, and domain rules loaded before any writing.

  3. 03
    Validate the project

    Parse check, plus rebuild of stale time-dependent upstreams.

  4. 04
    Discover project macros

    Find macro-derived columns the YML contract does not list.

  5. 05
    Research the data

    Driving table, cardinalities, contract, sibling patterns, categorical values.

    Research opened the 410-row reference snapshot and traced both upstream tables before any code; base Claude Code never consulted a reference at all.

  6. 06
    Write the technical spec

    A written plan of sources, joins, filters, and grain per model.

    The spec wrote out all six labeling rules before any code, including the case base Claude Code missed: an inactive month after another inactive month gets no label.

  7. 07
    Write and build models

    SQL from the spec, with column mapping checked before each model.

  8. 08
    Verify and fix

    Two read-only verifiers cross-check structure and values until every check passes.

SignalPilot

SignalPilot

claude code + signalpilot governed stack

pass
43 turns60 tool calls$$0.73answer pinned · full chat below
final answer pass

All 8 steps complete. Here's what was built and verified:


✅ MRR Project — Complete

What was done
  1. Scanned the project — found 1 stub (mrr) depending on 2 pre-existing models
  2. Loaded dbt-write, DuckDB SQL, and domain-financial skills
  3. Fixed the current_date hazard in util_months and rebuilt downstream models (customer_revenue_by_month, customer_churn_month)
  4. Researched via blueprint — 358 rows from active months + 52 churn rows = 410 total
  5. Completed mrr.sql — added the final CTE with:
    • mrr_change = mrr - previous_month_mrr
    • change_category CASE WHEN logic for all 6 categories (new/reactivation/upgrade/downgrade/churn/NULL)
  6. Verified — both structure and value verifiers returned all PASS:
    • 410 rows ✓ · all 12 YML columns present ✓
    • SUM(mrr) = 17,020 matches upstream exactly ✓
    • mrr_change arithmetic correct for all 410 rows ✓
    • change_category only contains valid values ✓
    • Reference sample (customer 35: new → downgrade → churn) matches exactly ✓
full chat, from the start
Complete the project on this database to calculate the monthly recurring revenue.

I'll follow the 8-step dbt workflow. Let me start by checking the knowledge base and scanning the project simultaneously.

Now I have a clear picture. Let me set up tasks and load all supporting skills in parallel.

All 3 skills loaded. Now let me create the task list and run Step 3 validation in parallel with reading the existing models.

Project parses cleanly. Now I need to rebuild the util_months model (current_date hazard) and read all existing models. Let me do these in parallel.

Now I need to rebuild util_months (current_date hazard) and read the YML files in parallel.

util_months rebuilt. Now rebuild the downstream pre-existing models and read all YML files in parallel.

Now let me find the docs for change_category and explore the source data in parallel.

Let me read the reference snapshot and also mark Step 3 complete, then move to Steps 4-6.

I have all the information needed. Now let me load the knowledge-base skill and update tasks.

Now I'll write the technical spec (Step 6) and then complete the mrr model SQL (Step 7).

Spec written. Now Step 7 — complete the mrr stub SQL.

Now build the model:

Build successful. Now Step 8 — verify with both verifiers in parallel.

DB is live. Dispatching both verifiers in parallel:

Both verifiers return all PASS. The model is correct.

Claude Code

Base Claude Code

claude code, no additional stack

fail
mrr: FAIL — no pred column matched gold column 'change_category'
9 turns43 tool calls$$0.25answer pinned · full chat below
final answer fail

All 4 models are materialized successfully. Here's a summary of what was done:

Completed mrr.sql by adding the missing final CTE and SELECT statement with:

  • mrr_change — difference between current and previous month's MRR
  • change_category — categorized as:
    • new — customer's first active month
    • churn — customer went inactive (mrr = 0)
    • reactivation — previously inactive customer became active again
    • upgrade — MRR increased from prior month
    • downgrade — MRR decreased but still active
    • null — no change (stable)

Results in the mrr table (410 rows):

change_categorycount
(no change)236
churn62
new52
upgrade30
downgrade27
reactivation3
full chat, from the start
Complete the project on this database to calculate the monthly recurring revenue.

Let me read the current mrr.sql file and the other model files to understand the complete picture before making changes.

The mrr.sql is incomplete — it has the CTEs but is missing the final SELECT with mrr_change and change_category. Let me complete it.

Now run dbt to materialize all models:

All 4 models materialized successfully. Let me verify the final mrr table looks correct:

Case #19 · Silent value corruption · SignalPilot