import type { Narrative } from '@/lib/demo-kit';

/**
 * What this environment argues, tab by tab, addressed to the BSA officer.
 *
 * Every claim below is one a reader can check against the surface under it.
 * The two that matter most are the reward claim — which says what the
 * recorded seeds show AND what the full ladder shows, because on eight seeds
 * they disagree — and the limits, which say where this is easier than the
 * job it stands in for.
 *
 * The numbers quoted in `claims.reward` were measured on 2026-08-28 from
 * `uv run python envs/probe.py --taskset alert-triage` (894 main-slice seeds)
 * and from the 24 fixtures in `public/traces/alert-triage/`. Re-measure
 * before re-quoting them after any change to the reward or the traces.
 */
export const narrative: Narrative = {
  thesis:
    'Almost every alert an analyst reads is a false positive, and the operating budget is built on how ' +
    'fast the team clears them. The few that are not are the whole conversation with the regulator. ' +
    'This environment puts both numbers in one reward: it pays, in analyst-hours against a reference, for ' +
    'clearing an alert with the facts that decide it, and it takes more away for a missed escalation than ' +
    'every hour a policy could save. Every alert is synthetic and every one has a planted answer, so the ' +
    'grader computes rather than opines — and a policy that never opens the file cannot collect all of ' +
    'the counterweight, because the cases built to pass the screen only give themselves away in a lookup.',
  anxiety:
    'Almost every alert my team reads is a false positive. The handful that are not is the entire conversation with my regulator.',
  claims: {
    play:
      'Work one alert yourself: read the free screen, pay hours for the lookups you think you need, ' +
      'and close or escalate it citing the facts. Only then does the board show what the generator ' +
      'planted — and what your call cost against the reference.',
    watch:
      'A recorded run of one of three scripted reference analysts — not a language model; none has been ' +
      'run against this environment yet — replayed one reply at a time: every lookup it paid for, every ' +
      'reply the engine refused, and the disposition it reached. The note it wrote is shown beside the ' +
      'call and never scored.',
    reward:
      'Three scripted analysts, re-scored under your weights. On the eight recorded seeds the one who ' +
      'reads the screen edges the one who checks the hidden tells at the shipped weights, 0.871 to 0.866; ' +
      'over the 894-seed probe ladder the order is the other way, 0.894 to 0.846, because eight seeds ' +
      'hold one hidden case. Drag the hours weight down one notch and the ranking on these seeds flips ' +
      'too. The asymmetry a policy memo can only assert is sitting in a slider here.',
    evidence:
      'The grader is a short Python function, printed with the hour constants it assumes, the digests ' +
      'that prove your browser plays the same alert the environment did, and a plain list of the ways ' +
      'this is easier than the real job.',
  },
  limits: [
    {
      text:
        'Every alert here has a knowable answer, because the generator planted it. A real SAR decision is a ' +
        'human judgement, and a filed report is not a proven crime. Where a rationale the grader refuses is ' +
        'one an officer would accept, the fix is another alternate in the template — never a judge.',
      answeredBy: 'playbook-redline',
    },
    {
      text:
        'The label mix is 55 percent benign by design, far from the real false-positive rate, so a small ' +
        'seed set meets both labels. "Hours per thousand alerts" is a ratio inside this environment, not ' +
        'a production number, and the hour constants are the generator’s config — nobody timed an analyst.',
    },
    {
      text:
        'The lookups are idealised. Each returns the decisive fact in one call — a counterparty’s count of ' +
        'other alerted accounts, a prior alert’s closing analyst, the party a document names. In production ' +
        'those signals sit across systems and are often absent. This tests whether the agent asks, not ' +
        'whether the answer exists.',
    },
    {
      text:
        'The adversary designed the data to pass the screen and moved the reporting threshold once, on the ' +
        'held-out seeds. Nothing responds to the agent while it trains. That is a moved adversary, not an ' +
        'adapting one.',
    },
    {
      text:
        'Nine scenario templates and three hidden overlays stand in for a typology space in the hundreds, ' +
        'and no institution, real case or real jurisdiction is behind any of them.',
    },
    {
      text:
        'There is no rule the agent could break while it optimises: no privacy boundary, no tipping-off ' +
        'offence, no policy it must satisfy on the way to the score.',
      answeredBy: 'denial-appeal',
    },
  ],
};
