sp.

field note · 19 sep 2026

posthog tells me what happened. jev helps me decide what to do next.

i used one week of dupebrew product evidence to test jev as a decision layer. not a chatbot. not a session summariser. a small model that turns messy signals into choices, scores, and probabilities.

7 min readdupebrew × jev

one tool describes. one tool decides.

product analytics is good at telling me what happened. it can show the funnel, failure events, bounce, and which screens people reached.

but a list of signals is not a priority. someone still has to decide what to fix first, how urgent it is, and whether the evidence is strong enough to trust.

posthog

what happened?

pull the last 7 days into one structured state: funnel steps, failures, bounce, and feature usage.

jev

what should we do?

ask typed questions about priority, severity, the biggest drop, and evidence strength.

that split is the whole idea. jev never “reads sessions.” it receives a small state object and makes bounded decisions on top of it.

i started with the smallest useful state.

the dupebrew snapshot showed a familiar early-product problem: people reached the paywall, far fewer selected a plan, and the sample was still small.

14reached onboarding / paywall
5selected a plan
2started a trial or purchased
7 daysevidence window
largest visible cliffpaywall view → plan selection

there were also entitlement-sync and anonymous-user creation failures. those mattered, but the raw events needed interpretation before they became a product plan.

i asked questions the team could act on.

questionjev typewhy this shape
what should we prioritise first?choiceone ranked focus, not another list
how urgent are the failures?scorea bounded low → critical scale
where is the biggest drop?choicecompare known funnel steps
is this sample strong enough?scorekeep confidence attached to the recommendation

the important part is the boundary. jev chooses from options i define. it does not invent a roadmap in prose and make me reverse-engineer the answer.

what jev chose

first priority94%

paywall entitlement reliability

fix the path where a purchase or restore finishes but premium access does not appear correctly.

largest cliff78%

paywall view → plan selection

make the plan choice and primary action easier to understand.

evidence strength0.23

directional, not gospel

use the ranking for triage. keep collecting evidence before calling it a universal result.

jev returns confidence. the product decides when to act automatically and when a low-confidence result goes to review.

what this changed
signalproduct action
entitlement reliability ranked firstmake purchase / restore state sync the first fix
plan selection is the largest cliffsimplify pricing, default choice, and cta hierarchy
anonymous creation can failretry with backoff and avoid duplicate error noise
evidence is weaktreat the list as triage, then re-run it as the sample grows

the call is intentionally boring.

structured evidence in. typed questions out.

typescript
const result = await evaluate({
  model: 'typesafe-ai/jev',
  state: { /* PostHog funnel + error summary */ },
  questions: {
    primary_focus: {
      type: 'choice',
      instructions: 'What should we prioritize first?',
      criteria: {
        paywall_reliability: '…',
        paywall_conversion: '…',
        web_bounce: '…',
      },
    },
    severity: {
      type: 'score',
      instructions: 'How urgent are purchase / entitlement failures?',
      criteria: ['low', 'medium', 'high', 'critical'],
    },
  },
});

the state contains aggregate product evidence, not raw session recordings.

the interesting product is between evidence and action.

jev is cheap and fast, but that is not the most interesting part to me. the useful part is that the output already looks like something a product process can use.

posthog says what happened. jev helps decide what to do next under uncertainty. that is a much better job for it than pretending it is another chat model.

read next