AXe Skills HubSearch /

← All skills

imi-say-do-gap

AXe First-party 

Reference: full SKILL.md

Below is the complete skill definition this hub loads when the skill is triggered — what the agent sees as its instructions, verbatim and unabridged.

IMI Say/Do™ Gap Framework

This skill teaches the AI to diagnose and close the gap between what consumers SAY they

will do and what they ACTUALLY do — one of the most commercially valuable problems in

market research.

The Say/Do™ Problem

In every category, there is a gap between stated intention and actual behaviour:

"I intend to eat healthier"              → Still buys the same snacks
"I would definitely try that product"    → Never purchases it
"I prefer Brand A"                       → Buys Brand B on promotion
"I want to switch to sustainable options"→ Picks the cheaper conventional option
"I'll enter that competition"            → Never bothers

IMI's core insight: The Say/Do gap is not lying. Consumers genuinely intend to act.

The gap exists because of friction, habit, context, and cognitive biases that research

(asking in a survey) cannot observe but behaviour reveals.

The three types of Say/Do gap:

TypeDescriptionExample
Attitudinal gapThey believe it but don't feel it enough to act"I think sustainability is important" but don't pay more for it
Motivational gapThey want to but something blocks them"I want to switch" but switching cost is too high
Contextual gapThey would in theory but the situation prevents it"I'd buy that" but it's not available in their store

The Say/Do™ Diagnostic Framework

Step 1: Quantify the Gap

-- Compare stated intent with actual behaviour
WITH intent AS (
    SELECT
        respondent_id,
        CASE WHEN response_value IN (4, 5) THEN 1 ELSE 0 END AS stated_intent
    FROM survey_responses
    WHERE question_id = 'PURCHASE_INTENT'
        AND study_id = :study_id
),
behaviour AS (
    SELECT
        respondent_id,
        CASE WHEN purchased = TRUE THEN 1 ELSE 0 END AS actual_purchase
    FROM purchase_tracking
    WHERE category_id = :category_id
        AND purchase_date BETWEEN :start_date AND :end_date
)
SELECT
    COUNT(*) AS total_respondents,
    SUM(i.stated_intent) AS stated_intenders,
    SUM(b.actual_purchase) AS actual_purchasers,
    SUM(CASE WHEN i.stated_intent = 1 AND b.actual_purchase = 1 THEN 1 ELSE 0 END)
        AS said_and_did,
    SUM(CASE WHEN i.stated_intent = 1 AND b.actual_purchase = 0 THEN 1 ELSE 0 END)
        AS said_but_didnt,
    ROUND(100.0 *
        SUM(CASE WHEN i.stated_intent = 1 AND b.actual_purchase = 1 THEN 1 ELSE 0 END) /
        NULLIF(SUM(i.stated_intent), 0),
    1) AS conversion_rate,
    ROUND(100.0 *
        SUM(CASE WHEN i.stated_intent = 1 AND b.actual_purchase = 0 THEN 1 ELSE 0 END) /
        NULLIF(SUM(i.stated_intent), 0),
    1) AS gap_rate
FROM intent i
LEFT JOIN behaviour b ON i.respondent_id = b.respondent_id;

Interpreting the gap:

  • Gap rate 0-20% = Low gap (intentions are predictive — rare)
  • Gap rate 20-40% = Moderate gap (typical for established categories)
  • Gap rate 40-60% = High gap (significant friction or context barriers)
  • Gap rate 60%+ = Extreme gap (intentions are almost meaningless — deep structural barriers)

Step 2: Identify Friction Drivers

Friction is anything that adds effort, uncertainty, or cost between intention and action.

The IMI Friction Taxonomy:

COGNITIVE FRICTION
├── Information overload (too many options, too complex)
├── Uncertainty (don't know enough to decide)
├── Risk perception (fear of making wrong choice)
└── Decision fatigue (too many decisions in sequence)

PHYSICAL FRICTION
├── Availability (can't find it)
├── Accessibility (too far, inconvenient)
├── Process friction (too many steps to purchase)
└── Time cost (takes too long)

ECONOMIC FRICTION
├── Price barrier (too expensive)
├── Switching cost (loss of current benefits)
├── Sunk cost (already invested in alternative)
└── Price uncertainty (don't know if it's good value)

SOCIAL FRICTION
├── Social norms (nobody I know does this)
├── Identity conflict (this doesn't fit who I am)
├── Social risk (what will others think?)
└── Lack of social proof (no reviews/recommendations)

HABITUAL FRICTION
├── Existing habit (autopilot behaviour overrides intent)
├── Default bias (current choice is the path of least resistance)
├── Status quo preference (change feels risky even when objectively better)
└── Routine disruption (new behaviour doesn't fit existing routine)

Step 3: Profile the Gap Segments

import pandas as pd

def profile_say_do_segments(df, intent_col, behaviour_col, profile_cols):
    """
    Profile four Say/Do segments:
    - Said & Did (converted intenders)
    - Said but Didn't (gap — lost intenders)
    - Didn't Say but Did (unexpected buyers)
    - Didn't Say, Didn't Do (non-market)
    """
    df['say_do_segment'] = 'Non-Market'
    df.loc[(df[intent_col] == 1) & (df[behaviour_col] == 1), 'say_do_segment'] = 'Said & Did'
    df.loc[(df[intent_col] == 1) & (df[behaviour_col] == 0), 'say_do_segment'] = 'Said but Didnt'
    df.loc[(df[intent_col] == 0) & (df[behaviour_col] == 1), 'say_do_segment'] = 'Didnt Say but Did'

    profiles = df.groupby('say_do_segment')[profile_cols].mean()
    sizes = df['say_do_segment'].value_counts(normalize=True) * 100

    return profiles, sizes

The key comparison: What distinguishes "Said & Did" from "Said but Didn't"?

The difference reveals the friction drivers — what the converters had that the

non-converters lacked.

Step 4: Design Interventions

Each friction type requires a different intervention:

Friction TypeIntervention CategoryExample
CognitiveSimplificationReduce options, clearer messaging, comparison tools
PhysicalAccessibilityMore distribution, online ordering, delivery
EconomicValue reframingTrials, smaller pack sizes, bundling, financing
SocialSocial proofReviews, testimonials, influencer endorsement, community
HabitualDisruption + replacementTrigger-based reminders, subscription, commitment devices

Step 5: Measure Intervention Impact

Gap Closure Rate = (Gap Rate Before - Gap Rate After) / Gap Rate Before × 100

If gap rate was 55% and after intervention it's 40%:
  Gap Closure Rate = (55 - 40) / 55 × 100 = 27% gap closure

Promotion Mechanics: Closing the Gap Through Incentives

Promotions are a direct intervention on economic friction. IMI evaluates promotion

mechanics on their ability to close the Say/Do gap:

Promotion Effectiveness Scoring

FactorWeightWhat It Measures
Participation rate25%What % of the target audience engages with the promotion?
Conversion uplift30%Does the promotion drive incremental purchase (not just pull forward)?
Brand equity impact20%Does the promotion enhance or erode brand perception?
Cost efficiency25%Cost per incremental conversion

Promotion types ranked by Say/Do gap closure potential:

Promotion TypeGap Closure PotentialBrand Equity RiskNotes
Trial / samplingHIGHLOWRemoves uncertainty friction directly
Contest / prizeMEDIUMLOW-MEDIUMDepends on prize relevance to brand
Discount / BOGOHIGH short-termHIGHCloses economic friction but trains price sensitivity
Loyalty rewardMEDIUMLOWWorks on habitual friction — builds repeat
BundleMEDIUMLOWReduces per-unit price perception without discounting
Limited editionMEDIUMLOWCreates urgency — disrupts "I'll do it later"

Habit Formation Framework

When the goal is to convert a one-time behaviour into a sustained habit:

IMI's Habit Loop:

    CUE ──→ ROUTINE ──→ REWARD ──→ REPETITION ──→ HABIT

CUE: What triggers the behaviour? (time, place, emotional state, preceding action)
ROUTINE: What is the behaviour itself?
REWARD: What reinforcement does the consumer get? (functional, emotional, social)
REPETITION: How many times must the loop run before it becomes automatic?

IMI's rule of thumb: Most consumer habits require 15-25 repetitions to become automatic.

A marketing programme that drives trial but not repeat is wasting the trial investment.

def habit_formation_programme(target_repetitions=20, trial_conversion=0.15,
                               repeat_rate_per_cycle=0.60, cycles_per_month=4):
    """
    Model a habit formation programme.
    How many months of sustained engagement to reach habit threshold?
    """
    months = 0
    repetitions = 0
    active_users = 1.0  # normalised

    while repetitions < target_repetitions and months < 24:
        months += 1
        monthly_reps = active_users * cycles_per_month
        repetitions += monthly_reps
        active_users *= repeat_rate_per_cycle  # attrition each month

    return {
        'months_to_habit': months if repetitions >= target_repetitions else 'Not achieved in 24 months',
        'repetitions_achieved': round(repetitions, 1),
        'retention_at_habit': round(active_users * 100, 1)
    }

Output Templates

Template: Say/Do™ Gap Diagnostic

## Say/Do™ Gap Analysis: [Category/Brand]
**Study:** [name] | **Base:** n=[n] | **Gap measurement period:** [dates]

### The Gap
| Metric | Value |
|---|---|
| Stated intenders (T2B PI) | X% |
| Actual purchasers | X% |
| Conversion rate (said & did) | X% |
| Gap rate (said but didn't) | X% |
| Gap severity | [Low / Moderate / High / Extreme] |

### Gap Segments
| Segment | Size | Key Characteristics |
|---|---|---|
| Said & Did | X% | [profile] |
| Said but Didn't | X% | [profile] |
| Didn't Say but Did | X% | [profile] |

### Friction Diagnosis
| Friction Type | Evidence | Severity |
|---|---|---|
| [Cognitive/Physical/Economic/Social/Habitual] | [data point] | HIGH/MED/LOW |

### Recommended Interventions
| Friction | Intervention | Expected Gap Closure | Priority |
|---|---|---|---|
| [type] | [specific action] | [X%] | HIGH/MED/LOW |

### Essential Insight
[One sentence: the primary reason consumers say but don't do, and the minimum intervention to close the gap]

Common Pitfalls

  • Assuming the gap is irrational. The gap exists for real reasons — friction, context,

habit. Never dismiss it as "consumers lying."

  • Treating all gaps the same. An economic gap (too expensive) requires a different

intervention than a habitual gap (autopilot behaviour). Diagnose before intervening.

  • Using discounts to close every gap. Discounts close economic friction but create

new problems (price sensitivity, brand equity erosion). Match the intervention to the friction.

  • Ignoring the "Didn't Say but Did" segment. These unexpected buyers reveal unobserved

purchase triggers that surveys miss. They are often the key to understanding the category.

  • Measuring intent without measuring behaviour. A concept test that measures PI but

never validates against in-market behaviour is measuring the SAY, not the DO.

Cross-Skill References

  • For campaign evaluation that tests say/do conversion → imi-campaign-evaluation
  • For audience segmentation of gap segments → imi-segmentation-engine
  • For brand strategy when preference doesn't convert → imi-brand-strategy
  • For Pulse™ profiling of gap segments → imi-pulse-intelligence
  • For writing up Say/Do findings → imi-client-deliverable

*Built for IMI International's Local AI — grounded in IMI's Say/Do™ methodology,

bridging the gap between what consumers say and what they do.*

*Purpose: Insight. Method: Rigour. Outcome: Profit.*

AXE MCP Server Integration

Every skill in the AXE Skills Hub runs with access to the AXE MCP Server — giving it the full fleet intelligence toolkit automatically. No setup required; tools are available in any AXE-powered session.

Core Tools Available

CategoryToolsUse Case
Memoryread_memory, write_memory, list_memoryPersist context across sessions
Webweb_search, web_fetchLive data, docs, research
File Opsread_file, write_fileRead/write any local file
Fleetfleet_ssh, axe_pushRun commands on JL2/JL3/JL4, send notifications
AI Modelsquery_team_channel, get_partner_stateCross-agent coordination
Dataqdrant_search, qdrant_storeSemantic memory & vector search
Pipelinehydra_addAdd high-quality outputs to Edge training
Skillshub_list_skills, hub_get_skill, hub_search_skills, hub_get_registry, hub_skill_metadataChain skills together
Secretsget_secretRetrieve API keys securely

Quick Start

# In any AXE session, tools are pre-loaded. Example chaining:

# 1. Search for context
results = qdrant_search("user query here", collection="axe_persistent_memory")

# 2. Fetch live data if needed
content = web_fetch("https://docs.example.com/api")

# 3. Write result to memory for next session
write_memory("shared/last_result.md", output)

# 4. Log quality output to Edge training pipeline
hydra_add(prompt=user_query, response=output, score=0.9, source="skill-name")

Edge Training Integration

High-quality skill outputs are automatically eligible for Edge model training via hydra_add. When a response scores ≥0.85 in evals, pipe it to the Hydra pipeline to compound Edge's knowledge. This is how skills make Edge smarter over time.

# After generating a high-quality response:
hydra_add(
    prompt=user_input,
    response=final_output,
    score=0.9,          # eval score
    source="skill-name" # tracks provenance
)

Metadata

Category
Business Intelligence
Tier
community
Version
1.0.0
License
MIT
Path
skills/imi-say-do-gap/SKILL.md

Use with an agent

Fetch this skill’s definition over the open API — no key required.

curl -s /v1/skills/imi-say-do-gap

View source ↗