Skip to content

v3 Slice 2: Tracer bullet - one causal item end-to-end (generate, run, score, leaderboard) #15

Description

@mark-allwyn

Parent

#13

What to build

The thinnest complete path through the whole pipeline - one causal item flowing generate -> run -> score -> leaderboard - proving every layer integrates before any volume work.

  • A seeded, deterministic generator for one causal bundle (B01) producing conjunctive items: each item carries several machine-checkable parts (e.g. minimal sufficient adjustment set as a node set, adjusted effect estimate as a number with tolerance, identifiability as a verdict). Same seed -> identical items.
  • The dual-verification admission gate: the generator's graphical-solver answer is cross-checked against a seeded linear-Gaussian simulation + partial correlation; any disagreement rejects the item before it ships.
  • Refusal-neutral cover stories only.
  • The Anthropic provider (ported from legacy) returning a structured result: content, stop_reason, stop_details, input/output/thinking token counts, native config used. Claude 4.6+/Fable run with adaptive thinking, no temperature, max_tokens >= 16000.
  • A minimal runner: execute pending (model x item) jobs, save raw responses atomically (write tmp, validate, replace), preserving multi-run history per item.
  • An offline scorer: extract each tagged part, normalize per type, score each part, set item_correct = all parts correct (conjunctive); classify response status. Never re-calls the API.
  • A console leaderboard: accuracy = correct / attempted, with refusal/invalid shown as separate columns, computed via the shared accuracy helper.

Acceptance criteria

  • Mocked-provider test: a canned API response flows item -> raw -> scored -> leaderboard with correct conjunctive accuracy and status
  • Same seed produces byte-identical B01 items; the dual-verification gate rejects an injected miskeyed item
  • Live smoke: one real claude-fable-5 (or claude-haiku) call records stop_reason and thinking_tokens
  • A refusal stop_reason classifies as refusal, not invalid; an unparseable part scores that part wrong without voiding the item
  • Re-running score never re-calls the API; reruns append to per-item history
  • pytest green

Blocked by

Metadata

Metadata

Assignees

No one assigned

    Labels

    ready-for-agentReady for autonomous agent pickup

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions