Design · QA regression plan

Jivika — QA Regression Test Plan

Status: living document

loading… · PASS 0 · FAIL 0 · BLOCKED 0 · N-A 0

Audience: a person running a manual regression before a release, or spot-checking a change. Status: living document — update it in the SAME PR that adds a feature, fixes a bug or changes a flow (§0.6). Covers the POC console after #59.3b (guided apply, end to end), #60 (the daily check-in), #132/#133 (deadline reminders, F8a + F8b), #61 (the fake-notice checker, F2), #62 (the cost meter, F14), #63 (three more debugger rules), #86 (the funnel lens, CRM slice 1), #13 (gating /ops with Google OAuth + a Supabase allowlist), #23 (conversations/messages/cost persisted to Supabase, session-isolated per anonymous visitor), #87 (the guide desk, CRM slice 2 — persisted tickets, claim/note/reply/resolve at /ops/guide), and #139 (a self-service profile correction between the profile card and the document pull). The admit card and the result stage are not built yet and are listed under Known gaps (§15).

This is the manual counterpart to the automated suite (Vitest: console, flow, copy, rules, schema, digilocker). Automated tests gate every PR; this plan is the human pass over what a machine cannot fully judge — tone, ordering, "does it feel right" — plus the reputation events (CLAUDE.md §10) where a wrong step is expensive. Where a case is also guarded by a test, the file is named in Auto so you know what is already covered.

Live at /qa (www.jivika.dev/qa). The page is generated from THIS file and adds a result button per test, a progress bar, and the expected conversation for tests that have one — that conversation is produced by running the real chat code at build time, so it cannot drift from the product. Recorded results stay in your browser (localStorage).


0 · How to use this plan

0.1 The harness — the console

Everything is driven through the console at /console (local: pnpm build && pnpm -F @jivika/console start, then http://localhost:3000/console; hosted: www.jivika.dev/console). Two equal columns:

  • Left — the phone. A number pulldown (top), then the chat window: message bubbles with your local time and timezone, a Type a message box with Send, and Reset (wipes just that number's conversation). Buttons and lists in bot messages are tappable; typing the button's title has the same effect as tapping it.
  • Right — the instruments. Guide queue (tickets a person must call about), Debugger (13+ rules watching every message; P0/P1/P2 counts; probes; jump-to-message; Copy report), Events (the event spine: one row per fact each turn, Export JSON).
  • Small mono dividers in the thread are the console talking, not the bot: ✦ ask dob → ask qualification (state change), ✦ captured: category (smart capture), ✦ profile: … (the answers that were confirmed), ✦ engine: … → eligible (draft v1) (the rules engine's verdict), ✦ guide ticket G-1 queued ….
  • Scripted access: window.__jivikaDebug in the browser console exposes findings, report(), events, active.

0.2 Environment

  • Synthetic data only. The site is public. Never type a real name, phone number, Aadhaar, or a real person's date of birth. Numbers cannot be typed — they are minted from the reserved block +9199999xxxxx.
  • No login, no accounts — but conversations now persist (#23). A reload keeps your conversation (§10.7); every anonymous visitor gets their own private copy of each persona, so two different browsers never collide (§10.8, a client-generated id in localStorage, not an account). Clearing storage or switching browsers starts fresh, the same way a different real aspirant would in production.
  • A DRAFT rule set is in force: eligibility uses the 2026 SSC GD notice as a template for 2027 (crucial date 01-01-2027, assumed). Every result must say so.

0.3 Personas and fixtures

PersonaNumberSeedUse for
Rohit+919999900001M · OBC-NCL · graduate · UPthe main happy path
Sunaina+919999900002F · SC · graduate · BRa second profile; shared-phone / leak checks
Arjun+919999900003M · UR · postgraduate · MPover-the-age-limit
(new)+9199999xxxxxnone+ New number — a blank slate

Rohit's path (used throughout): tap Haan, shuru karein → 14-03-2002 → Graduate (BA/BSc/BCom) → OBC (NCL) → UP → the card → Haan, sahi hai → the eligible list.

Age limits, from the rule set (crucial date 01-01-2027): UR 23, OBC 26, SC/ST 28, minimum 18. Boundary birthdays: UR 02-01-2004 eligible / 01-01-2004 over; OBC 02-01-2001 / 01-01-2001; SC 02-01-1999 / 01-01-1999; youngest 01-01-2009 eligible, 05-05-2010 → "turns 18 on 05-05-2028".

0.4 Conventions

  • Handle = the short label used when a message is about one form: SSC GD · draft (notice · deadline; "draft" until the 2027 notice is out).
  • The send lines are examples. Tests that name an exact string test a deterministic parser or verb; tests marked (natural) should be re-run with 2–3 phrasings.
  • Register: the bot writes Hinglish (romanised Hindi + English). It must never answer in Devanagari or formal Hindi unless you did.
  • "Debugger clean" = the Debugger panel shows P0 0 · P1 0 · P2 0 after the steps (the one accepted exception is P1 no-reply after a form is started — §15).

0.5 Recording a result

For each test record PASS / FAIL / BLOCKED / N-A (the /qa page has buttons and a Copy results report) with the build SHA and date. On FAIL capture: the number, the exact text you sent, the actual reply, the divider(s) under it, and Copy report from the Debugger. File a GitHub issue on the jivika board (label qa) and link it in the test's Ref. Severity:

  • S1 (blocker) — a reputation event (CLAUDE.md §10): a wrong or prefilled-wrong field; a fake notice marked Verified; a distress message with no human follow-up; another profile's data shown; any document leaving India; a message that tells someone to give up; eligibility shown that disagrees with the rules engine; identity (DigiLocker/Aadhaar) asked before the eligible list.
  • S2 (major): a flow dead-ends, an answer is dropped, a wrong form is acted on, a retry loop, a reply in the wrong register.
  • S3 (minor): copy/tone, a needless re-ask, cosmetic.

0.6 Maintaining this plan

  • New feature → add its tests to the right section (or a new one) in the SAME PR. Number continues the section's sequence; never renumber (IDs are referenced in tickets). Retire a test with ~~x.y~~ (removed — reason), don't delete the block.
  • Bug fix → add a regression test that reproduces the bug, with the issue in Ref.
  • Format matters: each test is ### N.M — Title followed by **Steps:**, **Success:**, **Failure:** and optional **Ref:**, **Auto:**, **Thread:** (a scenario id from /flow, whose real conversation is shown on the page). A test in lib/qa.test.ts fails if a block is malformed or a Thread id does not exist.

1 · Arrival & greeting

1.1

The first message

Steps
  1. Load /console. Select Rohit.
  2. Do not type anything yet — read the first bot message.
  3. Check the browser console (devtools) for errors.
Success

A greeting in Hinglish ("Namaste! Main Jivika hoon…") with three buttons: Haan, shuru karein, Ye kya hai?, Baad me. No question about age, documents or identity. Step 3: no console errors at all — in particular, no React hydration-mismatch error (minified error #418) from the Debugger panel's clock (#148, fixed 2026-10-06: the clock display now mounts client-only, same pattern DebugPanel's "first seen" timestamps already used).

Failure

No buttons (plain text only); Devanagari; formal Hindi; any DigiLocker/Aadhaar/name/phone request; any console error on load.

Auto: apps/console/lib/chat.test.ts

Expected · The first message
JivikaRohit (synthetic) · 00001
Namaste! Main Jivika hoon — sarkari naukri ke notifications aur form bharne me madad karti hoon. Shuru karein?
Haan, shuru karein
Ye kya hai?
Baad me
generated from the running code
1.2

"Ye kya hai?" explains, then offers the choice again

Steps
  1. Tap Ye kya hai?.
Success

A plain explanation (finds notifications you qualify for, helps fill forms) that says it never charges a fee, followed by the choice again — Haan, shuru karein and Baad me only (no "Ye kya hai?" a second time).

Failure

A sales pitch; the fee statement missing; the same three buttons again; the flow moves on to the questions by itself.

Expected · Tap “Ye kya hai?”
JivikaRohit (synthetic) · 00001
tapYe kya hai?
Main sarkari naukri ke notifications me se aapke layak wale dhoondhti hoon aur form bharne me madad karti hoon. Aapse koi fee nahi leti.
Haan, shuru karein
Baad me
✦ greet → explain
generated from the running code
1.3

"Baad me" closes softly; the door stays open

Steps
  1. Tap Baad me.
  2. Type hi.
Success

After step 1: a calm, guilt-free line ("koi jaldi nahi… 'hi' likh dena"). After step 2: the questions begin (the date of birth ask).

Failure

Any nagging or "are you sure"; a reminder promise; hi is ignored or re-greets instead of starting.

Expected · Tap “Baad me”, come back later
JivikaRohit (synthetic) · 00001
tapBaad me
Theek hai, koi jaldi nahi. Jab bhi mann ho, bas 'hi' likh dena — main yahin hoon.
✦ greet → later
hi
Pehle janm tithi batao (DD-MM-YYYY).
✦ later → ask dob
generated from the running code
1.4

Free text at the greeting just starts

Steps
  1. On a fresh number type ssc gd form kaise bharein.
Success

The bot starts the questions (asks the date of birth). Nothing is stored; no error.

Failure

"Samajh nahi aaya"; a stall; an answer to the question as if it were a form field.

1.5

Buttons and typing are the same

Steps
  1. Fresh number. Type Haan, shuru karein exactly instead of tapping.
  2. On another fresh number type haan.
Success

Both start the questions.

Failure

Either is treated as a wrong answer to a question.

Auto: apps/console/lib/router.test.ts

1.6

`hi` restarts from anywhere except mid-erase

Steps
  1. Rohit: get to the ask state question. Type hi.
Success

The greeting comes back (fresh), previous answers are not silently used as if confirmed.

Failure

hi is read as an answer to the current question; the chat crashes; a second greeting stacked on the first.

2 · The four questions

(Onboarding asks date of birth → education → category → state, one at a time. Each answer is read by a deterministic parser — never guessed.)

2.1

Date of birth, the accepted shapes

Steps
  1. At the date question send each of: 14-03-2002, 14/03/2002, 14.03.2002, 1-2-2000, meri dob 14 03 2002 hai.
Success

Each is accepted (the next question — education — appears). The card later shows 14-03-2002 / 01-02-2000 in DD-MM-YYYY.

Failure

Any of them re-asks; a date read as month/day swapped.

Auto: packages/flow/src/interpret.test.ts

2.2

Impossible or unusable dates are re-asked, never stored

Steps
  1. Try each: 31-02-2001, 29-02-2001, 14-13-2002, 14-03-02, 14-03-2030, kal.
Success

Each gets the re-ask "Ye tithi samajh nahi aayi. DD-MM-YYYY me likho, jaise 14-03-2002." Nothing advances; no answer is stored (mere form still says nothing has started).

Failure

A rollover (31-02 → 3 Mar) is accepted; a two-digit year is guessed; a future date is accepted.

Auto: packages/flow/src/interpret.test.ts

2.3

Education is a list; typing works too

Steps
  1. At the education question tap Chunein and read the rows.
  2. Choose Graduate (BA/BSc/BCom). On another number type 12th pass instead.
Success

A list (not free text) with the six levels (8th … Post-graduate); both routes advance to the category question.

Failure

A free-text question; a level missing; "graduate" ranked as "post-graduate" or the reverse.

Auto: apps/console/lib/chat.test.ts

2.4

"Still appearing" is not "passed"

Steps
  1. At education send 10th appearing, then final year BA.
Success

Neither is stored as a qualification; the list is offered again.

Failure

"10th appearing" saved as 10th passed.

Auto: packages/flow/src/interpret.test.ts

2.5

Category is a list; an ambiguous answer is asked again

Steps
  1. At category send sc st, then general obc. Then tap OBC (NCL).
Success

The first two are re-asked (never resolved to one of them); the tap works.

Failure

"sc st" silently saved as SC.

Auto: packages/flow/src/interpret.test.ts

2.6

State: names, codes, spellings

Steps
  1. At state send in turn (fresh each time): UP, Uttar Pradesh, bihar ka, Gujrat, Orissa.
Success

Each resolves (UP, UP, Bihar, Gujarat, Odisha) and the card shows the full state name.

Failure

bihar ka read as Karnataka ("ka"); any of them re-asked.

Auto: packages/flow/src/interpret.test.ts

2.7

An ambiguous or unknown state is asked again

Steps
  1. At state send up bihar, then mars.
Success

"Ye rajya nahi mila. Rajya ka naam ya code likho, jaise UP ya Bihar." for both; state not stored.

Failure

One of the two states picked; "mars" accepted.

2.8

Devanagari input is understood

Steps
  1. At state send उत्तर प्रदेश; at education स्नातक; at category ओबीसी.
Success

Each is read correctly; the bot still replies in Hinglish (romanised), not Devanagari.

Failure

Not understood; the bot answers in Devanagari without being asked (known limitation: the reverse — a Devanagari user — is flagged by the Debugger as P2 register-mismatch, §15).

2.9

No identity before value

Steps
  1. Walk Rohit's path to the card. Read every bot message so far.
Success

Not one message mentions DigiLocker, Aadhaar, documents, OTP, or asks for a name or phone.

Failure

Any of those words before the eligible list — S1 (CLAUDE.md §3.1).

Auto: apps/console/lib/debug/rules.test.ts

2.10

The answer is stored only when understood

Steps
  1. At the date question send kal. Type mere form.
Success

"Abhi koi form shuru nahi hua. 'hi' likh kar shuru karein." — nothing was stored.

Failure

A partial profile exists; mere form errors.

3 · Smart capture — one message, several answers

3.1

A whole sentence in one message

Steps
  1. Fresh number. Send meri dob 14-03-2002 hai, graduate hu, OBC, UP.
Success

The bot goes straight to one profile card (§4) showing all four values — date 14-03-2002, Graduate (BA/BSc/BCom), OBC (NCL), Uttar Pradesh. Under the reply: ✦ captured: dob, qualification, category, state. No question was re-asked.

Failure

Any field asked again; a value differs from what you wrote; a result shown before the card.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · one message → one card
JivikaRohit (synthetic) · 00001
meri dob 14-03-2002 hai, graduate hu, OBC, UP
Maine ye samjha: Janm tithi: 14-03-2002 Padhai: Graduate (BA/BSc/BCom) Category: OBC (NCL) State: Uttar Pradesh Sab sahi hai? Kuch badalna ho to seedha likho, jaise 'category SC'.
Haan, sahi hai
Badlo
✦ captured: dob, qualification, category, state
✦ greet → confirm profile
tapHaan, sahi hai
✦ confirm profile → show eligible
✦ profile: 2002-03-14 · graduate · OBC-NCL · UP
Aap 1 me se 1 ke liye eligible lag rahe ho: SSC GD Constable 2027. Ye abhi DRAFT hai — official notice aana baaki hai, aane par pakka bataayenge.
☰ Chunein
SSC GD Constable 2027Draft — official notice aana baaki
📄 notice_01122025.pdfSSC ka 2026 wala official notice — 2027 ke draft rules isi par based hain.
✦ engine: SSC GD Constable 2027 → eligible (draft v1)
Tip: 'mere form' likh kar kabhi bhi status dekho, ya 'madad' likh kar insaan se baat karo.
generated from the running code
3.2

Partial capture asks only what is missing

Steps
  1. Fresh number: tap Haan, shuru karein, then send graduate, OBC.
  2. Send 14-03-2002.
Success

After 1: "Samajh gayi — padhai, category note kar liya." then the date question. After 2: skips education and category and asks state only.

Failure

Education or category asked again; the date question skipped.

3.3

A date's digits are never a qualification

Steps
  1. At the date question send 12-03-2002 graduate.
Success

Date 12-03-2002 and Graduate are both captured — not "12th pass".

Failure

Qualification shows 12th.

Auto: packages/flow/src/interpret.test.ts

3.4

"B.Sc" is not category SC

Steps
  1. Send BSc OBC UP at any question.
Success

Graduate + OBC (NCL) + Uttar Pradesh. Category is not SC.

Failure

SC anywhere.

3.5

What is ambiguous is left out and asked

Steps
  1. Fresh number, tap start. Send general obc, Bihar.
Success

Only the state (Bihar) is captured; the bot then asks the date, and category is asked later (never guessed from "general obc").

Failure

Category filled with UR or OBC.

3.6

State codes need capitals inside a sentence

Steps
  1. Send graduate hu, up me rehta hu (lowercase) then on another number graduate UP.
Success

The first captures education only (the lowercase "up" is not taken as a state); the second captures education and state UP.

Failure

"up" captured from ordinary words; "UP" ignored.

3.7

Distress inside a long sentence still goes to a person

Steps
  1. Send graduate hu OBC UP lekin mujhe jeene ka mann nahi karta.
Success

The distress path (§8) — acknowledgement with Tele-MANAS 14416, ticket queued — and nothing captured (no card).

Failure

The answers are captured and a card shown; no ticket.

Auto: apps/console/lib/chat.test.ts

3.8

Free text that answers nothing is not an error

Steps
  1. At the state question send mujhe pata nahi (or any chatter).
Success

The re-ask (state), not "captured" and not a crash; after three such failures a help ticket opens (§9).

Failure

A field captured from chatter; silence.

4 · The profile card and corrections

4.1

The card shows what was understood — in your words

Steps
  1. Walk Rohit's path to the card.
Success

One message: "Maine ye samjha:" then Janm tithi 14-03-2002 · Padhai Graduate (BA/BSc/BCom) · Category OBC (NCL) · State Uttar Pradesh, "Sab sahi hai?…", with two buttons Haan, sahi hai and Badlo. "OBC (NCL)" is visible (our reading of "OBC").

Failure

Codes instead of words ("OBC-NCL", "UP"); a blank field; more than two buttons; a verdict already shown.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · a correction on the card
JivikaRohit (synthetic) · 00001
UP
Maine ye samjha: Janm tithi: 14-03-2002 Padhai: Graduate (BA/BSc/BCom) Category: OBC (NCL) State: Uttar Pradesh Sab sahi hai? Kuch badalna ho to seedha likho, jaise 'category SC'.
Haan, sahi hai
Badlo
✦ captured: state
✦ ask state → confirm profile
category SC hai
Maine ye samjha: Janm tithi: 14-03-2002 Padhai: Graduate (BA/BSc/BCom) Category: SC State: Uttar Pradesh Sab sahi hai? Kuch badalna ho to seedha likho, jaise 'category SC'.
Haan, sahi hai
Badlo
✦ captured: category
tapHaan, sahi hai
✦ confirm profile → show eligible
✦ profile: 2002-03-14 · graduate · SC · UP
Aap 1 me se 1 ke liye eligible lag rahe ho: SSC GD Constable 2027. Ye abhi DRAFT hai — official notice aana baaki hai, aane par pakka bataayenge.
☰ Chunein
SSC GD Constable 2027Draft — official notice aana baaki
📄 notice_01122025.pdfSSC ka 2026 wala official notice — 2027 ke draft rules isi par based hain.
✦ engine: SSC GD Constable 2027 → eligible (draft v1)
Tip: 'mere form' likh kar kabhi bhi status dekho, ya 'madad' likh kar insaan se baat karo.
generated from the running code
4.2

No eligibility verdict before you confirm

Steps
  1. Stop at the card. Look at the thread and at the Debugger/dividers.
Success

No ✦ engine: divider and no eligible list yet.

Failure

A verdict appears before "Haan, sahi hai".

4.3

Confirming shows the result

Steps
  1. Tap Haan, sahi hai (or type sahi hai).
Success

✦ profile: 2002-03-14 · graduate · OBC-NCL · UP, the eligible list (§5), its source PDF, ✦ engine: …, then the one-time tip.

Failure

Confirm ignored; the tip missing or repeated.

4.4

A typed correction changes only what it names

Steps
  1. At the card type category SC hai.
Success

The card is shown again with Category: SC and every other value unchanged.

Failure

Other fields cleared or re-asked; category unchanged; a new question instead of the card.

Expected · Rohit · a correction on the card
JivikaRohit (synthetic) · 00001
UP
Maine ye samjha: Janm tithi: 14-03-2002 Padhai: Graduate (BA/BSc/BCom) Category: OBC (NCL) State: Uttar Pradesh Sab sahi hai? Kuch badalna ho to seedha likho, jaise 'category SC'.
Haan, sahi hai
Badlo
✦ captured: state
✦ ask state → confirm profile
category SC hai
Maine ye samjha: Janm tithi: 14-03-2002 Padhai: Graduate (BA/BSc/BCom) Category: SC State: Uttar Pradesh Sab sahi hai? Kuch badalna ho to seedha likho, jaise 'category SC'.
Haan, sahi hai
Badlo
✦ captured: category
tapHaan, sahi hai
✦ confirm profile → show eligible
✦ profile: 2002-03-14 · graduate · SC · UP
Aap 1 me se 1 ke liye eligible lag rahe ho: SSC GD Constable 2027. Ye abhi DRAFT hai — official notice aana baaki hai, aane par pakka bataayenge.
☰ Chunein
SSC GD Constable 2027Draft — official notice aana baaki
📄 notice_01122025.pdfSSC ka 2026 wala official notice — 2027 ke draft rules isi par based hain.
✦ engine: SSC GD Constable 2027 → eligible (draft v1)
Tip: 'mere form' likh kar kabhi bhi status dekho, ya 'madad' likh kar insaan se baat karo.
generated from the running code
4.5

Several corrections at once

Steps
  1. At the card type state Bihar, 15-03-2002.
Success

State → Bihar and date → 15-03-2002 in the new card; category unchanged.

Failure

Only one applied.

4.6

"Badlo" offers the four fields; picking one asks only that

Steps
  1. At the card tap Badlo. 2. Choose category from the list. 3. Tap SC.
Success

A list of four fields (janm tithi, padhai, category, state) → the category question → back on the card with SC (dob, education, state untouched, not re-asked).

Failure

All four questions re-asked; the card not shown after.

4.7

"nahi" at the card means Badlo

Steps
  1. At the card type nahi.
Success

The same four-field list as Badlo.

Failure

Treated as an unreadable answer.

4.8

Text it cannot read says how to correct

Steps
  1. At the card type pata nahi kya likhu.
Success

One line: "Ye samajh nahi aaya. Seedha likho, jaise 'category SC' ya 'state Bihar' — ya 'Badlo' dabao." and the card again. Nothing stored.

Failure

Silence; an answer guessed.

4.9

A new profile gets a new verdict

Steps
  1. Reach the result as Rohit (born 2002). Then hi, repeat with date 05-05-2010, confirm.
Success

The second result is the too young message (§5), not Rohit's old eligible list.

Failure

A stale verdict.

4.10

A correction still works AFTER the card, right up to the document pull (#139)

Steps
  1. Reach show_eligible as Rohit, say "Badlo". 2. Reach show_eligible, say "meri dob galat hai, 12-03-2000" (a typed sentence, not the button). 3. Repeat step 1 after tapping a notice (choose_notice), after "Baad me" (notice_saved), and after starting a form but before agreeing to the consent notice (consent). 4. Confirm the corrected card and continue. 5. Agree to the consent notice (reach identity_card), then say "Badlo" there too.
Success

Steps 1–3 all land back on the profile card (§4.1) with the current values — never "no handler for this input" — and step 2's sentence actually changes the date shown on the card. Step 4's "Haan, sahi hai" returns to show_eligible with eligibility recomputed from the corrected value, and any notice already picked before the correction is still there, re-selectable, not duplicated. Step 5 is UNCHANGED and still guide-only: "Badlo" at identity_card goes to a person (§6.18's "Kuch galat hai" case), never back to the profile card — identity fields are never self-service once documents are pulled.

Failure

"No handler for this input" anywhere in steps 1–3; a correction at identity_card or later bypasses the guide; a notice picked before the correction silently disappears or gets duplicated after it.

Auto: apps/console/lib/chat.test.ts, describe block #139: a profile correction between confirm_profile and the document pull is self-service (7 tests, including an explicit check that genuinely unreadable free text at these same states is still "no handler" — nothing is silently swallowed).

5 · Eligibility — decided by the rules engine, labelled DRAFT

5.1

Rohit is eligible, and it says DRAFT

Steps
  1. Rohit's path through the card confirm.
Success

"Aap 1 me se 1 ke liye eligible lag rahe ho: SSC GD Constable 2027. Ye abhi DRAFT hai — official notice aana baaki hai…" A list row SSC GD Constable 2027 — Draft — official notice aana baaki; a document notice_01122025.pdf captioned as SSC's 2026 notice; ✦ engine: SSC GD Constable 2027 → eligible (draft v1).

Failure

"Eligible" without DRAFT; no source document; a made-up date or vacancy count.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · the last answer, the card, the result
JivikaRohit (synthetic) · 00001
UP
Maine ye samjha: Janm tithi: 14-03-2002 Padhai: Graduate (BA/BSc/BCom) Category: OBC (NCL) State: Uttar Pradesh Sab sahi hai? Kuch badalna ho to seedha likho, jaise 'category SC'.
Haan, sahi hai
Badlo
✦ captured: state
✦ ask state → confirm profile
tapHaan, sahi hai
✦ confirm profile → show eligible
✦ profile: 2002-03-14 · graduate · OBC-NCL · UP
Aap 1 me se 1 ke liye eligible lag rahe ho: SSC GD Constable 2027. Ye abhi DRAFT hai — official notice aana baaki hai, aane par pakka bataayenge.
☰ Chunein
SSC GD Constable 2027Draft — official notice aana baaki
📄 notice_01122025.pdfSSC ka 2026 wala official notice — 2027 ke draft rules isi par based hain.
✦ engine: SSC GD Constable 2027 → eligible (draft v1)
Tip: 'mere form' likh kar kabhi bhi status dekho, ya 'madad' likh kar insaan se baat karo.
generated from the running code
5.2

The source document is real

Steps
  1. Read the document bubble's file name and (in the Debugger Copy report or by inspecting the link) its URL.
Success

notice_01122025.pdf on ssc.gov.in — SSC's own 2026 notice.

Failure

A third-party or placeholder link.

5.3

Over the age limit: the rule is named, the door stays open

Steps
  1. Arjun: start → 01-01-1990 → Post-graduate → General (UR) → MP → confirm.
Success

"…umar 23 saal se kam honi chahiye (01-01-2027 tak), isliye abhi eligible nahi. Aur bhi notices aayenge — hum dekhte rehte hain." No blame, no "give up". ✦ engine: … → not eligible (clause 5…).

Failure

A blaming/discouraging line; the limit wrong; no next step.

Expected · Arjun · born 1990, General
JivikaArjun (synthetic) · 00003
MP
Maine ye samjha: Janm tithi: 01-01-1990 Padhai: Post-graduate Category: General (UR) State: Madhya Pradesh Sab sahi hai? Kuch badalna ho to seedha likho, jaise 'category SC'.
Haan, sahi hai
Badlo
✦ captured: state
✦ ask state → confirm profile
tapHaan, sahi hai
✦ confirm profile → show eligible
✦ profile: 1990-01-01 · postgraduate · UR · MP
SSC GD Constable 2027 ke draft rules me umar 23 saal se kam honi chahiye (01-01-2027 tak), isliye abhi eligible nahi. Aur bhi notices aayenge — hum dekhte rehte hain.
📄 notice_01122025.pdfSSC ka 2026 wala official notice — 2027 ke draft rules isi par based hain.
✦ engine: SSC GD Constable 2027 → not eligible (clause 5, draft v1)
Tip: 'mere form' likh kar kabhi bhi status dekho, ya 'madad' likh kar insaan se baat karo.
generated from the running code
5.4

Too young: it says exactly when

Steps
  1. Fresh number: date 05-05-2010, 10th pass, General (UR), UP, confirm.
Success

"…18 saal ki umar chahiye… Aap 05-05-2028 ko 18 ke ho jaoge…"

Failure

No date; the wrong date.

Expected · Someone born 05-05-2010
JivikaRohit (synthetic) · 00001
UP
Maine ye samjha: Janm tithi: 05-05-2010 Padhai: 10th pass Category: General (UR) State: Uttar Pradesh Sab sahi hai? Kuch badalna ho to seedha likho, jaise 'category SC'.
Haan, sahi hai
Badlo
✦ captured: state
✦ ask state → confirm profile
tapHaan, sahi hai
✦ confirm profile → show eligible
✦ profile: 2010-05-05 · 10th · UR · UP
SSC GD Constable 2027 ke liye 18 saal ki umar chahiye (draft rules). Aap 05-05-2028 ko 18 ke ho jaoge — tab tak naye notices dekhte rehte hain.
📄 notice_01122025.pdfSSC ka 2026 wala official notice — 2027 ke draft rules isi par based hain.
✦ engine: SSC GD Constable 2027 → not eligible (clause 5, draft v1)
Tip: 'mere form' likh kar kabhi bhi status dekho, ya 'madad' likh kar insaan se baat karo.
generated from the running code
5.5

Below 10th

Steps
  1. Date 14-03-2004, 8th pass, General (UR), UP, confirm.
Success

"…kam se kam 10th pass chahiye. Padhai ke baad phir dekhte hain…"

Failure

Eligible; a level other than 10th named.

5.6

Boundary birthdays (UR)

Steps
  1. Two fresh numbers, General (UR), graduate, UP: dates 02-01-2004 and 01-01-2004.
Success

02-01-2004 eligible; 01-01-2004 over the limit.

Failure

Either reversed.

Auto: apps/console/lib/chat.test.ts

5.7

The limit follows the category

Steps
  1. Graduate, UP. OBC (NCL) with 02-01-2001 and 01-01-2001; SC with 02-01-1999 and 01-01-1999.
Success

OBC: first eligible, second over (26). SC: first eligible, second over (28). The over-limit message quotes 26 / 28.

Failure

A 23-year limit applied to OBC/SC.

5.8

Sunaina (SC, born 2003)

Steps
  1. Sunaina: date 02-08-2003, Graduate, SC, Bihar, confirm.
Success

Eligible (DRAFT). "mere form" later shows the handle SSC GD · draft.

Failure

Rejected on age.

5.9

Nothing is asserted that the rules engine did not decide

Steps
  1. For each result you have seen compare the message with the ✦ engine: divider.
Success

The message and the verdict divider agree every time (eligible ⇔ a list; not eligible ⇔ a reason).

Failure

A list under a "not eligible" verdict, or the reverse — S1 (the Debugger raises eligibility-mismatch P0).

Auto: apps/console/lib/debug/rules.test.ts

5.10

The tip is taught once

Steps
  1. Get a result. Then hi, run the path again to a second result.
Success

The tip ("'mere form' likh kar… 'madad' likh kar…") appears after the first result only.

Failure

Repeated on the second result; missing on the first.

6 · Choose a form

6.1

Tapping the row opens that form's card

Steps
  1. As Rohit at the result, tap Chunein, then SSC GD Constable 2027.
Success

A card: "SSC GD Constable 2027 — abhi DRAFT hai, official notice aana baaki. Shuru karein?" with Haan, shuru karein and Baad me. Divider show eligible → choose notice.

Failure

No card; a different form; the DRAFT label missing.

Expected · Rohit · the row, the card, the start
JivikaRohit (synthetic) · 00001
SSC GD Constable 2027
SSC GD Constable 2027 — abhi DRAFT hai, official notice aana baaki. Shuru karein?
Haan, shuru karein
Baad me
✦ show eligible → choose notice
tapHaan, shuru karein
✦ application SSC GD · draft: eligible → started
Is form ke liye DigiLocker se hum sirf aapki 10th ki marksheet aur ID lenge — naam, janm tithi aur roll number bharne ke liye, sirf isi form me use honge, aur 'delete' likhkar aap kabhi bhi hata sakte ho. Theek hai?
Haan, theek hai
Abhi nahi
✦ choose notice → consent
tapHaan, theek hai
✦ documents pulled (synthetic): marksheet 10, id
✦ application SSC GD · draft: started → docs pulled
DigiLocker se 10th ki marksheet aur ID mil gaye ✓.
SSC ke form me ye dikhna chahiye: Naam: ROHIT KUMAR Pita: SURESH KUMAR Mata: SUNITA DEVI Janm tithi: 14-03-2002 Gender: Male Category: OBC (NCL) 10th: CBSE, roll 7000037, 2018, 61.4% Padhai: Graduate (BA/BSc/BCom) Aapke SSC registration me bhi bilkul yahi hona chahiye — wo badla nahi ja sakta. Sahi hai?
Haan, sahi hai
Kuch galat hai
✦ consent → identity card
generated from the running code
6.2

Typing does the same

Steps
  1. On separate results type apply, apply karna hai, form bharo, ssc gd, SSC GD · draft.
Success

Each opens the same card.

Failure

Any of them "no handler"; shuru karo is not one of them (it restarts — §7.6).

Auto: apps/console/lib/applications.test.ts

6.3

Starting moves the application to "started" and asks for consent

Steps
  1. At the card tap Haan, shuru karein.
Success

Divider application SSC GD · draft: eligible → started, then the consent notice (§6.10) with two buttons. mere form now shows Shuru kiya — draft. Nothing has been pulled yet.

Failure

Documents pulled without asking; the divider missing; the application starting twice; a DigiLocker/Aadhaar request before this tap.

Expected · Rohit · the row, the card, the start
JivikaRohit (synthetic) · 00001
SSC GD Constable 2027
SSC GD Constable 2027 — abhi DRAFT hai, official notice aana baaki. Shuru karein?
Haan, shuru karein
Baad me
✦ show eligible → choose notice
tapHaan, shuru karein
✦ application SSC GD · draft: eligible → started
Is form ke liye DigiLocker se hum sirf aapki 10th ki marksheet aur ID lenge — naam, janm tithi aur roll number bharne ke liye, sirf isi form me use honge, aur 'delete' likhkar aap kabhi bhi hata sakte ho. Theek hai?
Haan, theek hai
Abhi nahi
✦ choose notice → consent
tapHaan, theek hai
✦ documents pulled (synthetic): marksheet 10, id
✦ application SSC GD · draft: started → docs pulled
DigiLocker se 10th ki marksheet aur ID mil gaye ✓.
SSC ke form me ye dikhna chahiye: Naam: ROHIT KUMAR Pita: SURESH KUMAR Mata: SUNITA DEVI Janm tithi: 14-03-2002 Gender: Male Category: OBC (NCL) 10th: CBSE, roll 7000037, 2018, 61.4% Padhai: Graduate (BA/BSc/BCom) Aapke SSC registration me bhi bilkul yahi hona chahiye — wo badla nahi ja sakta. Sahi hai?
Haan, sahi hai
Kuch galat hai
✦ consent → identity card
generated from the running code
6.4

"Baad me" saves it without nagging

Steps
  1. At the card tap Baad me. 2. Later tap the row again (or apply).
Success

"Theek hai, SSC GD · draft save hai — koi jaldi nahi…" then the same card again; still one application (no duplicate); Haan, shuru karein then works.

Failure

A reminder promise; guilt; a second application record.

6.5

"mere form" shows what you did with it

Steps
  1. After the result type mere form. Repeat after Baad me, and after Haan, shuru karein.
Success

A list row for SSC GD · draft whose description reads Draft — official notice aana baaki → Save kiya — draft → Shuru kiya — draft respectively.

Failure

The description never changes.

Expected · Rohit · after the result
JivikaRohit (synthetic) · 00001
mere form
Aapke liye 1 form mila hai. Neeche se dekho.
☰ Chunein
SSC GD · draftDraft — official notice aana baaki
✦ status: 1 form: SSC GD · draft
generated from the running code
6.6

Not eligible, asking to apply

Steps
  1. On a "too young" result type apply.
Success

"Draft rules ke hisaab se abhi koi form aapke liye nahi mila…" — no card, no application created.

Failure

A card for a form you are not eligible for.

6.7

Only forms the list offered are choices

Steps
  1. At the result type RRB Group D CEN 09/2025.
Success

Not treated as a choice (a "no handler" note; no card).

Failure

A card for a form that was never offered.

6.8

With two eligible forms the bot asks, never guesses

Steps
  1. (Not reachable in the console until a second notice has rules — only SSC GD is checked today.) Covered by applications.test.ts; re-run this test manually when RRB Group D is added.
Success

A bare apply answers "Kaun sa form? Neeche se chuno." with a list of the eligible forms.

Failure

One picked silently.

Auto: apps/console/lib/applications.test.ts

6.9

Erasing forgets the application

Steps
  1. Start a form, then delete → Haan, hata do. Then mere form.
Success

"Abhi koi form shuru nahi hua…" — the application is gone with the answers.

Failure

The form is still listed.

6.10

The consent notice is plain, specific, and asked once

Steps
  1. After 6.3 read the consent message.
Success

One message in plain Hinglish: what is taken (only your 10th marksheet and ID from DigiLocker), why (to fill in name, date of birth, roll number), only for this form, and how to withdraw ('delete'). Two buttons: Haan, theek hai / Abhi nahi. No retention period is stated (legal has not fixed one). It is two sentences at most.

Failure

Vague ("we take your documents"); more documents than the form needs (photo, signature, address); no withdrawal route; pre-ticked or auto-agreed; asked before the person chose to start a form.

Expected · Rohit · the row, the card, the start
JivikaRohit (synthetic) · 00001
SSC GD Constable 2027
SSC GD Constable 2027 — abhi DRAFT hai, official notice aana baaki. Shuru karein?
Haan, shuru karein
Baad me
✦ show eligible → choose notice
tapHaan, shuru karein
✦ application SSC GD · draft: eligible → started
Is form ke liye DigiLocker se hum sirf aapki 10th ki marksheet aur ID lenge — naam, janm tithi aur roll number bharne ke liye, sirf isi form me use honge, aur 'delete' likhkar aap kabhi bhi hata sakte ho. Theek hai?
Haan, theek hai
Abhi nahi
✦ choose notice → consent
tapHaan, theek hai
✦ documents pulled (synthetic): marksheet 10, id
✦ application SSC GD · draft: started → docs pulled
DigiLocker se 10th ki marksheet aur ID mil gaye ✓.
SSC ke form me ye dikhna chahiye: Naam: ROHIT KUMAR Pita: SURESH KUMAR Mata: SUNITA DEVI Janm tithi: 14-03-2002 Gender: Male Category: OBC (NCL) 10th: CBSE, roll 7000037, 2018, 61.4% Padhai: Graduate (BA/BSc/BCom) Aapke SSC registration me bhi bilkul yahi hona chahiye — wo badla nahi ja sakta. Sahi hai?
Haan, sahi hai
Kuch galat hai
✦ consent → identity card
generated from the running code
6.11

Agreeing pulls the two documents — and shows none of their contents

Steps
  1. Tap Haan, theek hai.
Success

Divider documents pulled (synthetic): marksheet 10, id and application SSC GD · draft: started → docs pulled; the one-line message "DigiLocker se 10th ki marksheet aur ID mil gaye ✓." — no values in it — followed by the identity card (§6.16). The ID (Aadhaar-shaped) number appears nowhere: not in any bubble, not in any event.

Failure

The ID number shown or logged; more than two documents; nothing recorded.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · the row, the card, the start
JivikaRohit (synthetic) · 00001
SSC GD Constable 2027
SSC GD Constable 2027 — abhi DRAFT hai, official notice aana baaki. Shuru karein?
Haan, shuru karein
Baad me
✦ show eligible → choose notice
tapHaan, shuru karein
✦ application SSC GD · draft: eligible → started
Is form ke liye DigiLocker se hum sirf aapki 10th ki marksheet aur ID lenge — naam, janm tithi aur roll number bharne ke liye, sirf isi form me use honge, aur 'delete' likhkar aap kabhi bhi hata sakte ho. Theek hai?
Haan, theek hai
Abhi nahi
✦ choose notice → consent
tapHaan, theek hai
✦ documents pulled (synthetic): marksheet 10, id
✦ application SSC GD · draft: started → docs pulled
DigiLocker se 10th ki marksheet aur ID mil gaye ✓.
SSC ke form me ye dikhna chahiye: Naam: ROHIT KUMAR Pita: SURESH KUMAR Mata: SUNITA DEVI Janm tithi: 14-03-2002 Gender: Male Category: OBC (NCL) 10th: CBSE, roll 7000037, 2018, 61.4% Padhai: Graduate (BA/BSc/BCom) Aapke SSC registration me bhi bilkul yahi hona chahiye — wo badla nahi ja sakta. Sahi hai?
Haan, sahi hai
Kuch galat hai
✦ consent → identity card
generated from the running code
6.12

Declining takes nothing and points to a person

Steps
  1. At consent tap Abhi nahi (or type nahi).
Success

"Theek hai, koi baat nahi — kuch nahi liya gaya. Bina DigiLocker ke documents haath se dene honge; chaho to 'madad' likho, guide saath me bharwa denge." Nothing pulled; typing madad opens a help ticket. No pressure, no second ask.

Failure

A second "are you sure"; guilt; a retry loop; documents pulled anyway.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · consent, declined
JivikaRohit (synthetic) · 00001
tapHaan, shuru karein
✦ application SSC GD · draft: eligible → started
Is form ke liye DigiLocker se hum sirf aapki 10th ki marksheet aur ID lenge — naam, janm tithi aur roll number bharne ke liye, sirf isi form me use honge, aur 'delete' likhkar aap kabhi bhi hata sakte ho. Theek hai?
Haan, theek hai
Abhi nahi
✦ choose notice → consent
tapAbhi nahi
Theek hai, koi baat nahi — kuch nahi liya gaya. Bina DigiLocker ke documents haath se dene honge; chaho to 'madad' likho, guide saath me bharwa denge.
✦ consent → docs declined
generated from the running code
6.13

Typed answers work at consent

Steps
  1. On separate runs type haan and nahi at the consent message.
Success

haan agrees (documents pulled); nahi declines.

Failure

Either read as unreadable text.

6.14

Every document read is audited — consent first

Steps
  1. After agreeing open the Events panel (or Export JSON).
Success

In order: consent_granted purpose=guided_apply version=v0-draft, then document_pulled type=marksheet_10 why=guided_apply, then document_pulled type=id why=guided_apply, application_status status=docs_pulled, form_card_shown card=identity_education — each with the time (when), the number (who) and the purpose (why). A decline produces only consent_declined. No document value appears in any event.

Failure

A document_pulled with no earlier consent_granted; missing events; document contents inside props — S1.

Auto: apps/console/lib/chat.test.ts

6.15

Documents belong to one person and go with an erase

Steps
  1. On Rohit agree to consent. Switch to Sunaina and mere form / walk her far enough to see any document mention. Switch back and delete → Haan, hata do.
Success

Sunaina never sees or holds Rohit's documents. After the erase Rohit has no documents (a fresh consent is needed to pull them again) and the earlier events are attributed to "erased".

Failure

Another profile's document data appears anywhere — S1; documents survive the erase.

Auto: apps/console/lib/chat.test.ts

6.16

The identity card shows exactly what SSC's form will hold

Steps
  1. After agreeing to consent read the card (Rohit).
Success

"SSC ke form me ye dikhna chahiye:" then Naam ROHIT KUMAR · Pita SURESH KUMAR · Mata SUNITA DEVI · Janm tithi 14-03-2002 · Gender Male · Category OBC (NCL) · 10th: CBSE, roll <digits>, 2018, <percentage>% · Padhai Graduate (BA/BSc/BCom), then "Aapke SSC registration me bhi bilkul yahi hona chahiye — wo badla nahi ja sakta. Sahi hai?" with Haan, sahi hai / Kuch galat hai. No ID number.

Failure

A field missing or blank; codes ("OBC-NCL"); the ID number; more than two buttons.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · documents in, the card, confirmed
JivikaRohit (synthetic) · 00001
tapHaan, theek hai
✦ documents pulled (synthetic): marksheet 10, id
✦ application SSC GD · draft: started → docs pulled
DigiLocker se 10th ki marksheet aur ID mil gaye ✓.
SSC ke form me ye dikhna chahiye: Naam: ROHIT KUMAR Pita: SURESH KUMAR Mata: SUNITA DEVI Janm tithi: 14-03-2002 Gender: Male Category: OBC (NCL) 10th: CBSE, roll 7000037, 2018, 61.4% Padhai: Graduate (BA/BSc/BCom) Aapke SSC registration me bhi bilkul yahi hona chahiye — wo badla nahi ja sakta. Sahi hai?
Haan, sahi hai
Kuch galat hai
✦ consent → identity card
tapHaan, sahi hai
Ye confirm ho gaya ✓.
✦ application SSC GD · draft: docs pulled → prefilled
Kya inme se kuch aap par lagu hota hai? Neeche se chuno.
☰ Chunein
Kuch nahi — aage chalo
Age me chhootOBC: 3 saal ki chhoot (code 2)
NCC certificate
ESM, khel, doosra rajyaYe guide ke saath bharenge
✦ identity card → claims menu
generated from the running code
6.17

Confirming the card moves straight to the claims card

Steps
  1. Tap Haan, sahi hai.
Success

"Ye confirm ho gaya ✓." then the claims list (§6.21). Event form_card_confirmed card=identity_education and form_card_shown card=claims.

Failure

A silent stall; the next card missing.

Expected · Rohit · documents in, the card, confirmed
JivikaRohit (synthetic) · 00001
tapHaan, theek hai
✦ documents pulled (synthetic): marksheet 10, id
✦ application SSC GD · draft: started → docs pulled
DigiLocker se 10th ki marksheet aur ID mil gaye ✓.
SSC ke form me ye dikhna chahiye: Naam: ROHIT KUMAR Pita: SURESH KUMAR Mata: SUNITA DEVI Janm tithi: 14-03-2002 Gender: Male Category: OBC (NCL) 10th: CBSE, roll 7000037, 2018, 61.4% Padhai: Graduate (BA/BSc/BCom) Aapke SSC registration me bhi bilkul yahi hona chahiye — wo badla nahi ja sakta. Sahi hai?
Haan, sahi hai
Kuch galat hai
✦ consent → identity card
tapHaan, sahi hai
Ye confirm ho gaya ✓.
✦ application SSC GD · draft: docs pulled → prefilled
Kya inme se kuch aap par lagu hota hai? Neeche se chuno.
☰ Chunein
Kuch nahi — aage chalo
Age me chhootOBC: 3 saal ki chhoot (code 2)
NCC certificate
ESM, khel, doosra rajyaYe guide ke saath bharenge
✦ identity card → claims menu
generated from the running code
6.18

"Kuch galat hai" goes to a person; nothing is typed-corrected

Steps
  1. On the card tap Kuch galat hai (or type nahi). 2. Type koi hai?, then kab tak call aayega.
Success

One help ticket in the Guide queue ("identity card: the candidate says a value is wrong"); "…hamari team se koi aapko 2 ghante ke andar call karega aur saath me check karega." Later messages get a varied "noted" line, never the same words twice, and never a second ticket. Typing a new name is not accepted as a correction.

Failure

A typed name accepted; a second ticket; the same reply repeated.

Auto: apps/console/lib/chat.test.ts

6.19

Documents that disagree with what you told us: no card at all — **S1 if a card is shown**

Steps
  1. (Needs a tampered document — covered by the automated test, which injects a marksheet with a different date of birth; in the console use the unit test or a debugger build.) Expected behaviour to confirm from the test output:
Success

State identity_wrong; no "Sahi hai?" card, no document values in any bubble; ✦ identity card held back — documents disagree with the answers (dob_differs_from_marksheet); a help ticket whose text holds rule ids only; form_card_held card=identity_education n=1.

Failure

A card shown while the documents disagree — a wrong prefill, S1; values in the ticket or the event.

Auto: apps/console/lib/chat.test.ts

6.20

A held or wrong card leaves the documents audited, and erase still removes everything

Steps
  1. After 6.18, delete → Haan, hata do. Export the Events JSON.
Success

The documents, answers and applications are gone; the reads that happened stay in the spine but attributed to "erased".

Failure

Documents survive the erase.

6.21

The claims card is a list: none first, only rows this build can record

Steps
  1. After confirming the identity card read the list (Rohit, OBC).
Success

"Kya inme se kuch aap par lagu hota hai? Neeche se chuno." Rows: Kuch nahi — aage chalo, Age me chhoot (description "OBC: 3 saal ki chhoot (code 2)"), NCC certificate, ESM, khel, doosra rajya ("Ye guide ke saath bharenge"). For a General (UR) or EWS candidate there is no age row (the category earns no code by itself). Every title fits 24 characters.

Failure

A row that leads nowhere; the age row for UR/EWS; "yes" defaulted for any claim.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · the identity card confirmed, then claims
JivikaRohit (synthetic) · 00001
tapHaan, sahi hai
Ye confirm ho gaya ✓.
✦ application SSC GD · draft: docs pulled → prefilled
Kya inme se kuch aap par lagu hota hai? Neeche se chuno.
☰ Chunein
Kuch nahi — aage chalo
✓ Age me chhootOBC: 3 saal ki chhoot (code 2)
NCC certificate
ESM, khel, doosra rajyaYe guide ke saath bharenge
✦ identity card → claims menu
tapAge me chhoot
Age me chhoot laga di (OBC: 3 saal ki chhoot (code 2)).
Aur kuch lagu hota hai? Neeche se chuno.
☰ Chunein
✓ Kuch nahi — aage chalo
NCC certificate
ESM, khel, doosra rajyaYe guide ke saath bharenge
tapKuch nahi — aage chalo
Note ho gaya ✓ — age chhoot (code 2).
Aapka domicile certificate Uttar Pradesh ka hai? Haan to zile ka naam likho (jaise Lucknow), warna 'doosra rajya' likho.
✦ claims menu → domicile ask
generated from the running code
6.22

"Kuch nahi" finishes with every claim an explicit no

Steps
  1. Tap Kuch nahi — aage chalo (or type nahi).
Success

"Note ho gaya ✓ — koi claim nahi." followed by the domicile question (§6.27). Events form_card_confirmed card=claims then form_card_shown card=domicile. No ticket.

Failure

A claim left blank rather than an explicit no; a ticket opened.

Auto: apps/console/lib/chat.test.ts

6.23

Age relaxation uses the category's own code, with no extra question

Steps
  1. Rohit (OBC): tap Age me chhoot. Repeat as Sunaina (SC).
Success

"Age me chhoot laga di (OBC: 3 saal ki chhoot (code 2))." — for SC "(SC/ST: 5 saal ki chhoot (code 1))". The menu comes back without the age row and with a fresh header ("Aur kuch lagu hota hai?"). Event claim_selected claim=age.

Failure

A code that does not match the category; a second question; the age row still offered.

Auto: apps/console/lib/chat.test.ts

6.24

NCC: pick the type, come back to the menu

Steps
  1. Tap NCC certificate, then NCC 'B' certificate, then Age me chhoot, then Kuch nahi — aage chalo.
Success

A three-row list (A, B, C) → "NCC 'B' certificate note kar liya." → the menu (no NCC row) → … → "Note ho gaya ✓ — age chhoot (code 2), NCC B."

Failure

The type lost; NCC offered twice; the summary missing a claim.

Auto: apps/console/lib/chat.test.ts

6.25

ESM, sports, another state → a person, never a silent "no" — **S1 if defaulted**

Steps
  1. Tap ESM, khel, doosra rajya. 2. Type koi hai?.
Success

One help ticket ("claims: the candidate says ESM, sports, another state or a 1984-riot dependant applies"); "Ye claim abhi guide ke saath bharenge — hamari team se koi aapko 2 ghante ke andar call karega…". Later messages get a varied line and no second ticket. The application is not advanced with these claims left as "no".

Failure

The claim recorded as "no"; the flow carrying on to the next card; a second ticket.

Auto: apps/console/lib/chat.test.ts

6.26

The card is validated before it is confirmed

Steps
  1. (Automated test: a form whose age code does not fit the category — e.g. code 1 for an OBC candidate — is finished.)
Success

The card is held (form_card_held card=claims n=1), a ticket carries the rule id (age_relaxation_code_mismatch), no confirmation event.

Failure

A mismatched code confirmed — a wrong form value, S1.

Auto: apps/console/lib/chat.test.ts

6.27

Domicile: the certificate's state, named, and the district typed

Steps
  1. After the claims card read the message (Rohit told us Uttar Pradesh).
Success

"Aapka domicile certificate Uttar Pradesh ka hai? Haan to zile ka naam likho (jaise Lucknow), warna 'doosra rajya' likho." It asks about the certificate, not where the person lives.

Failure

"Where do you live?" wording (domicile ≠ residence — a mismatch cancels the candidature); the state not named; a state guessed silently.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · domicile, then three centres
JivikaRohit (synthetic) · 00001
tapKuch nahi — aage chalo
Note ho gaya ✓ — koi claim nahi.
Aapka domicile certificate Uttar Pradesh ka hai? Haan to zile ka naam likho (jaise Lucknow), warna 'doosra rajya' likho.
✦ claims menu → domicile ask
Lucknow
Exam ke liye 3 shehar chuno, pasand ke order me — jaise Lucknow, Kanpur, Varanasi. Baad me badla nahi ja sakta.
✦ domicile ask → centres ask
Lucknow, Kanpur, Varanasi
Note kiya: LUCKNOW, KANPUR, VARANASI.
Exam kis bhasha me dena hai? Neeche se chuno.
☰ Chunein
English
Hindi
Koi aur bhashaTamil, Marathi, Bengali… (13 me se)
✦ centres ask → medium ask
generated from the running code
6.28

A district is stored; the profile is never overwritten

Steps
  1. Type Lucknow. Then (fresh run) type doosra rajya, then Bihar, then Patna.
Success

First run: the exam-centres question appears; events answer_captured field=district via=asked, form_card_confirmed card=domicile, form_card_shown card=centres. Second run: "Kis rajya ka domicile certificate hai?…" → the district question now names Bihar → Patna accepted. mere form and the eligibility answers still say Uttar Pradesh — a guided answer never rewrites the profile.

Failure

The profile state changed; the district question still names the old state after "doosra rajya".

Auto: apps/console/lib/chat.test.ts

6.29

An unreadable district is re-asked, then a person

Steps
  1. At the district question type haan, then ??, then 12345.
Success

"Zile ka naam English letters me likho, jaise Lucknow." → a different "Bas zile ka naam, jaise Kanpur. Dikkat ho to 'madad' likho." → a help ticket on the third failure. haan is not stored as a district.

Failure

"HAAN" saved as a district; the same words twice; no ticket.

Auto: apps/console/lib/chat.test.ts

6.30

A sentence at a guided question is not profile capture

Steps
  1. At the district question type meri dob 15-03-2002 hai, graduate hu, SC, Bihar.
Success

The profile answers are unchanged (date 14-03-2002, OBC (NCL), UP); the district question is asked again.

Failure

Any profile field changed by a guided-card answer.

Auto: apps/console/lib/chat.test.ts

6.31

Exam language: tap two, type the rest

Steps
  1. On separate runs: tap English; tap Hindi; tap Koi aur bhasha then type marathi; then french.
Success

English/Hindi go straight to the force-preference question (§6.35); the other opens "Bhasha ka naam likho, jaise Tamil ya Marathi." and marathi is stored as Marathi; french → "Ye bhasha exam me nahi mili…". The list has three rows.

Failure

A language outside the notice's 15 accepted.

Auto: packages/flow/src/interpret.test.ts

6.32

The job-info consent is a real consent

Steps
  1. Read the question. Answer Haan, de sakte ho on one run and nahi on another.
Success

"Ek sawaal: kya sarkar ko aapki jaankari (naam, category, padhai) doosre sarkari naukri ke mauke ke liye dene ki ijazat hai? Ye aapki marzi hai — 'nahi' bhi theek hai." with two buttons. Nothing is recorded until you answer; yes and no both proceed (to the signature card, §6.38); both are stored as an explicit true/false.

Failure

Pre-answered "yes"; pressure toward yes; "no" blocks progress — S1 (a consent must be free).

Auto: apps/console/lib/chat.test.ts

6.33

Every collected value passes the field map's own validators

Steps
  1. (Automated: a full path is collected, then each card is validated.)
Success

Domicile, medium and consent_jobs cards validate with no errors; a nonexistent state code is caught (not_an_option).

Failure

A value the form's rules reject sitting in the collected form.

Auto: apps/console/lib/chat.test.ts

6.34

Exam centres: exactly three different cities, in order

Steps
  1. After the district, read the question. Type Lucknow, Kanpur, Varanasi. Then on separate runs try: Lucknow, Kanpur · Lucknow, Kanpur, Varanasi, Agra · Lucknow, lucknow, Kanpur · Lucknow, 12, Kanpur.
Success

"Exam ke liye 3 shehar chuno, pasand ke order me — jaise Lucknow, Kanpur, Varanasi. Baad me badla nahi ja sakta." The good answer is noted back in one line ("Note kiya: LUCKNOW, KANPUR, VARANASI.") and the language list follows. The bad ones are re-asked ("Teen alag shehar likho…" / "Ek hi shehar do baar aa gaya…") and nothing is stored.

Failure

Two or four cities accepted; a repeat accepted; a number taken as a city.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · domicile, then three centres
JivikaRohit (synthetic) · 00001
tapKuch nahi — aage chalo
Note ho gaya ✓ — koi claim nahi.
Aapka domicile certificate Uttar Pradesh ka hai? Haan to zile ka naam likho (jaise Lucknow), warna 'doosra rajya' likho.
✦ claims menu → domicile ask
Lucknow
Exam ke liye 3 shehar chuno, pasand ke order me — jaise Lucknow, Kanpur, Varanasi. Baad me badla nahi ja sakta.
✦ domicile ask → centres ask
Lucknow, Kanpur, Varanasi
Note kiya: LUCKNOW, KANPUR, VARANASI.
Exam kis bhasha me dena hai? Neeche se chuno.
☰ Chunein
English
Hindi
Koi aur bhashaTamil, Marathi, Bengali… (13 me se)
✦ centres ask → medium ask
generated from the running code
6.35

Force preferences: all seven, ranked by number

Steps
  1. After the language read the numbered list (1 BSF · 2 CISF · 3 CRPF · 4 SSB · 5 ITBP · 6 Assam Rifles · 7 SSF — the notice's own order). Type 3 1 2 5 4 7 6. On other runs: 3125476, 3 1 2, 1 1 2 3 4 5 6, crpf bsf cisf.
Success

"Note kiya: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles." then the job-info consent. 3125476 works too. Fewer than seven, a repeat, an out-of-range number or names instead of numbers are re-asked with a different wording the second time, and a help ticket opens on the third failure. Nothing stored until valid.

Failure

Six forces accepted; a force listed twice; the order stored reversed.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · language, force order, the consent
JivikaRohit (synthetic) · 00001
Lucknow, Kanpur, Varanasi
Note kiya: LUCKNOW, KANPUR, VARANASI.
Exam kis bhasha me dena hai? Neeche se chuno.
☰ Chunein
English
✓ Hindi
Koi aur bhashaTamil, Marathi, Bengali… (13 me se)
✦ centres ask → medium ask
tapHindi
Force ki pasand batao, sabhi 7, order me: 1 BSF 2 CISF 3 CRPF 4 SSB 5 ITBP 6 Assam Rifles 7 SSF Apna order numbers me likho, jaise 3 1 2 5 4 7 6. Baad me badla nahi ja sakta.
✦ medium ask → forces ask
3 1 2 5 4 7 6
Note kiya: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles.
Ek sawaal: kya sarkar ko aapki jaankari (naam, category, padhai) doosre sarkari naukri ke mauke ke liye dene ki ijazat hai? Ye aapki marzi hai — 'nahi' bhi theek hai.
Haan, de sakte ho
Nahi
✦ forces ask → jobs consent
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
generated from the running code
6.36

Ordered picks say plainly that they can't be changed later

Steps
  1. Read the centres and forces questions.
Success

Both end with "Baad me badla nahi ja sakta." (the form allows no change after submission — Notice ¶11.2, ¶14.12). Changes are possible only at the review card (built next).

Failure

The warning missing; the picks presented as casual.

6.37

The events for ordered picks hold no city or force names

Steps
  1. Export the Events JSON after 6.34–6.35.
Success

answer_captured field=centres via=asked and field=forces via=asked, form_card_confirmed card=centres|forces — no city names or force codes anywhere in props.

Failure

A city or force named inside an event — S1.

Auto: apps/console/lib/chat.test.ts

6.38

The signature card states the whole spec, and the console says how to "upload"

Steps
  1. After the job-info consent read the message and the divider under it.
Success

"Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua…". A console divider says no file upload here — type the file's details, e.g. jpg 15 KB 709x236 (the console's voice, not the bot's).

Failure

The spec incomplete; the "type the details" hint spoken by the bot as if a real user would do it.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · a file that's too big, then a good one
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 25 KB 709x236
File bahut badi hai — 19 KB ya usse chhoti chahiye. Quality thodi kam karke save karo.
✦ couldn't read that in “signature ask” — asking again
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
generated from the running code
6.39

A file that meets the spec is accepted; the photo is coached, never requested

Steps
  1. Type jpg 15 KB 709x236. Also try JPEG 12.5kb 700 x 240, jpeg 15000 bytes 6.0 x 2.0 cm, jpg 19 KB 770x255.
Success

"Signature theek hai ✓ (jpg, 15 KB, 709×236 px)." then, in the same turn, "Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi." then the next-step line (the review card is being built). Events answer_captured field=signature, form_card_confirmed card=signature.

Failure

The bot asks for a photo file; a spec-meeting file rejected.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · a file that's too big, then a good one
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 25 KB 709x236
File bahut badi hai — 19 KB ya usse chhoti chahiye. Quality thodi kam karke save karo.
✦ couldn't read that in “signature ask” — asking again
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
generated from the running code
6.40

Every way of missing the spec gets its own plain coaching

Steps
  1. Try, one per run: png 15 KB 709x236 · jpg 8 KB 709x236 · jpg 25 KB 709x236 · jpg 20 KB 709x236 · jpg 15 KB 300x100 · jpg 15 KB 236x709 · mera signature hai.
Success

PNG → "JPEG (jpg) me honi chahiye"; 8 KB → "10 KB se badi chahiye"; 25 KB and 20 KB → "19 KB ya usse chhoti" (20 KB is over — the strict end of "10 to 20 KB", flagged in the field map); a tiny or vertical image → "lagbhag 6×2 cm (709×236 px)… chaudai zyada, oonchai kam"; unreadable → "File ki details samajh nahi aayi. Aise likho: jpg 15 KB 709x236." Nothing is stored.

Failure

A bad file accepted; one message for every failure; a vertical image accepted.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · a file that's too big, then a good one
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 25 KB 709x236
File bahut badi hai — 19 KB ya usse chhoti chahiye. Quality thodi kam karke save karo.
✦ couldn't read that in “signature ask” — asking again
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
generated from the running code
6.41

Bad files repeat: different words, then a person

Steps
  1. Send jpg 8 KB 709x236, jpg 9 KB 709x236, png 15 KB 709x236.
Success

The second reply is a different message ("Signature ek saaf, seedhe box me…"); the third failure opens a help ticket.

Failure

The same words twice; no ticket.

Auto: apps/console/lib/chat.test.ts

6.42

The file's details are not in the events

Steps
  1. After 6.39 export the Events JSON and search for 709, 236, 15360, jpeg.
Success

Not found: only field=signature and card=signature.

Failure

File attributes inside an event.

Auto: apps/console/lib/chat.test.ts

6.43

The review card shows everything collected, in one place

Steps
  1. After the signature is accepted, read the card.
Success

"Sab kuch ek nazar me:" then Naam ROHIT KUMAR (14-03-2002) · Category OBC (NCL) · Padhai Graduate (BA/BSc/BCom) · Claims koi claim nahi · Domicile Uttar Pradesh, LUCKNOW · Exam centres LUCKNOW → KANPUR → VARANASI · Exam bhasha Hindi · Force order 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles · Job-info sharing Haan · Signature jpg, 15 KB, 709×236 px, then "Sab sahi hai?…" with Haan, sahi hai / Badlo. No ID number anywhere. Events form_card_confirmed card=signature then form_card_shown card=review.

Failure

A field missing or blank; a code instead of a name; the ID number shown.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · change the domicile, then confirm
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
tapBadlo
Kya badalna hai? Neeche se chuno.
☰ Chunein
✓ Domicile
Exam centres
Exam bhasha
Force order
Job-info sharing
✦ review card → review change
tapDomicile
Aapka domicile certificate Uttar Pradesh ka hai? Haan to zile ka naam likho (jaise Lucknow), warna 'doosra rajya' likho.
✦ review change → review domicile
Kanpur
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, KANPUR Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ review domicile → review card
tapHaan, sahi hai
✦ application SSC GD · draft: prefilled → reviewed
✦ application SSC GD · draft: reviewed → packet ready
Form taiyaar hai: Fee: ₹100 Link: https://ssc.gov.in Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo.
✦ review card → packet shown
generated from the running code
6.44

Confirming moves straight to the packet

Steps
  1. Tap Haan, sahi hai.
Success

State packet_shown; the packet message (§6.52) appears in the same turn. Events, in order: application_status status=reviewed, application_status status=packet_ready, form_card_confirmed card=review, form_card_shown card=packet.

Failure

A placeholder ("still being built"); an event out of order.

Expected · Rohit · change the domicile, then confirm
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
tapBadlo
Kya badalna hai? Neeche se chuno.
☰ Chunein
✓ Domicile
Exam centres
Exam bhasha
Force order
Job-info sharing
✦ review card → review change
tapDomicile
Aapka domicile certificate Uttar Pradesh ka hai? Haan to zile ka naam likho (jaise Lucknow), warna 'doosra rajya' likho.
✦ review change → review domicile
Kanpur
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, KANPUR Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ review domicile → review card
tapHaan, sahi hai
✦ application SSC GD · draft: prefilled → reviewed
✦ application SSC GD · draft: reviewed → packet ready
Form taiyaar hai: Fee: ₹100 Link: https://ssc.gov.in Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo.
✦ review card → packet shown
generated from the running code
6.45

"Badlo" (or "nahi") offers only what this build can still change

Steps
  1. Tap Badlo (or type nahi).
Success

"Kya badalna hai? Neeche se chuno." with exactly five rows: Domicile · Exam centres · Exam bhasha · Force order · Job-info sharing. No row for name, category, education or claims.

Failure

Identity or claims offered here (they must still go through a guide — §6.18, §6.25); a row missing.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · change the domicile, then confirm
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
tapBadlo
Kya badalna hai? Neeche se chuno.
☰ Chunein
✓ Domicile
Exam centres
Exam bhasha
Force order
Job-info sharing
✦ review card → review change
tapDomicile
Aapka domicile certificate Uttar Pradesh ka hai? Haan to zile ka naam likho (jaise Lucknow), warna 'doosra rajya' likho.
✦ review change → review domicile
Kanpur
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, KANPUR Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ review domicile → review card
tapHaan, sahi hai
✦ application SSC GD · draft: prefilled → reviewed
✦ application SSC GD · draft: reviewed → packet ready
Form taiyaar hai: Fee: ₹100 Link: https://ssc.gov.in Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo.
✦ review card → packet shown
generated from the running code
6.46

Changing the domicile district; nothing else moves

Steps
  1. Badlo → Domicile → type Kanpur.
Success

Straight back to the card with Uttar Pradesh, KANPUR — the centres, language, forces, consent and signature lines unchanged.

Failure

Any other line changed; re-asked from the top.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · change the domicile, then confirm
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
tapBadlo
Kya badalna hai? Neeche se chuno.
☰ Chunein
✓ Domicile
Exam centres
Exam bhasha
Force order
Job-info sharing
✦ review card → review change
tapDomicile
Aapka domicile certificate Uttar Pradesh ka hai? Haan to zile ka naam likho (jaise Lucknow), warna 'doosra rajya' likho.
✦ review change → review domicile
Kanpur
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, KANPUR Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ review domicile → review card
tapHaan, sahi hai
✦ application SSC GD · draft: prefilled → reviewed
✦ application SSC GD · draft: reviewed → packet ready
Form taiyaar hai: Fee: ₹100 Link: https://ssc.gov.in Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo.
✦ review card → packet shown
generated from the running code
6.47

Changing exam centres or force order re-runs the same validators

Steps
  1. Badlo → Exam centres → type Lucknow, Lucknow, Kanpur (repeat), then Agra, Gwalior, Bhopal. 2. Badlo → Force order → 7 6 5 4 3 2 1.
Success

The repeat is re-asked exactly as at 6.34; the good answer updates the card ("AGRA → GWALIOR → BHOPAL"); the reversed force order updates the card with the new names in order.

Failure

A bad centre list accepted from the review path but not from the first-time path (or vice versa) — the same rule must apply both times.

Auto: apps/console/lib/chat.test.ts

6.48

Changing the exam language or the job-info consent

Steps
  1. Badlo → Exam bhasha → English (tap). 2. Badlo → Exam bhasha → Koi aur bhasha → type tamil. 3. Badlo → Job-info sharing → Nahi.
Success

Each returns straight to the card with the new value; the consent change is stored as an explicit false, not blank.

Failure

A stale value shown after a change.

Auto: apps/console/lib/chat.test.ts

6.49

A wrong name still needs a guide — never a typed fix at the review card

Steps
  1. At the review card type naam Rohit Sharma hai.
Success

The card is unaffected (not read as a correction); the name is unchanged. To fix a wrong name, the candidate must have used "Kuch galat hai" back at the identity card (§6.18) — the review card cannot do this.

Failure

The name silently changes from typed text — S1 (identity must match the certificate; a typed "fix" here is unverified).

Auto: apps/console/lib/chat.test.ts

6.50

Unreadable text at the card or the change menu never repeats itself

Steps
  1. At the review card type pata nahi kya likhu. 2. At the change menu (Badlo) type kuch bhi.
Success

"Ye samajh nahi aaya. 'Haan, sahi hai' dabao, ya 'Badlo'." then the card again; "Ye samajh nahi aaya. Neeche list se ek chuno." then the menu again. The Debugger's repeat-verbatim rule stays quiet no matter how many times you retry.

Failure

The exact same bubble twice in a row.

Auto: apps/console/lib/chat.test.ts

6.51

Distress and delete still work from inside the review flow

Steps
  1. At the review card send mujhe jeena nahi hai. 2. On a fresh run, delete → Nahi, rehne do. 3. Change the domicile, then delete → Haan, hata do.
Success

Distress routes as always (§8). Declining a delete returns to the review card with every value intact. Confirming a delete clears the form and the documents together.

Failure

Any of the review's values surviving an erase; distress not routed.

Auto: apps/console/lib/chat.test.ts

6.52

The packet: fee, the official link, and a plain ask — Jivika never submits

Steps
  1. After the review card confirms, read the message.
Success

"Form taiyaar hai:" then Fee: ₹100 (Rohit, OBC, male) and Link: https://ssc.gov.in, then "Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo." Plain text, no buttons. No ID number.

Failure

A "submit for you" claim; the ID number shown; a missing fee or link.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · confirmed, application number in hand
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
tapHaan, sahi hai
✦ application SSC GD · draft: prefilled → reviewed
✦ application SSC GD · draft: reviewed → packet ready
Form taiyaar hai: Fee: ₹100 Link: https://ssc.gov.in Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo.
✦ review card → packet shown
1234
Ye number samajh nahi aaya. Sirf letters/numbers likho, jaise 12345678.
✦ couldn't read that in “packet shown” — asking again
SSCGD12345
✦ application SSC GD · draft: packet ready → submitted by candidate
✦ application SSC GD · draft: submitted by candidate → confirmed
Mil gaya ✓ — SSCGD12345 note kar liya. Badhai ho, aapka SSC GD application yahin complete hota hai!
✦ packet shown → packet confirmed
mere form
Aapke liye 1 form mila hai. Neeche se dekho.
☰ Chunein
SSC GD · draftSubmit ho gaya ✓ — draft
✦ status: 1 form: SSC GD · draft
generated from the running code
6.53

A woman, SC or ST is exempt — ₹0

Steps
  1. Walk the path as Sunaina (F, SC) to the packet.
Success

"Fee: ₹0 (exempt)" — feeFor on the field map, per Notice ¶9.2.

Failure

₹100 charged to an exempt category.

Auto: apps/console/lib/chat.test.ts

6.54

A valid confirmation number finishes the application

Steps
  1. Type SSCGD12345.
Success

"Mil gaya ✓ — SSCGD12345 note kar liya. Badhai ho, aapka SSC GD application yahin complete hota hai!" State packet_confirmed. The application walks packet_ready → submitted_by_candidate → confirmed (events application_status twice, then form_card_confirmed card=packet) and the number is stored on the record — never generated or guessed by Jivika.

Failure

A number invented; the application not advanced; the number missing from the record.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · confirmed, application number in hand
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
tapHaan, sahi hai
✦ application SSC GD · draft: prefilled → reviewed
✦ application SSC GD · draft: reviewed → packet ready
Form taiyaar hai: Fee: ₹100 Link: https://ssc.gov.in Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo.
✦ review card → packet shown
1234
Ye number samajh nahi aaya. Sirf letters/numbers likho, jaise 12345678.
✦ couldn't read that in “packet shown” — asking again
SSCGD12345
✦ application SSC GD · draft: packet ready → submitted by candidate
✦ application SSC GD · draft: submitted by candidate → confirmed
Mil gaya ✓ — SSCGD12345 note kar liya. Badhai ho, aapka SSC GD application yahin complete hota hai!
✦ packet shown → packet confirmed
mere form
Aapke liye 1 form mila hai. Neeche se dekho.
☰ Chunein
SSC GD · draftSubmit ho gaya ✓ — draft
✦ status: 1 form: SSC GD · draft
generated from the running code
6.55

The number is normalised, not corrected

Steps
  1. Type abc123xy. On a fresh run, type 12345678 .
Success

Stored as ABC123XY (uppercased) and 12345678 (trimmed) respectively.

Failure

Case or whitespace kept verbatim in a way that would make two people's numbers look different when they're the same.

Auto: apps/console/lib/chat.test.ts

6.56

An unreadable number is re-asked, then a person — same machinery as every other question

Steps
  1. Send 1234 (too short). 2. Send submit ho gaya (a sentence). 3. Send 1234 5678 (a space inside).
Success

"Ye number samajh nahi aaya. Sirf letters/numbers likho, jaise 12345678." → a different "Bas application ya registration number, jaise 12345678. Dikkat ho to 'madad' likho." → a help ticket on the third failure. Nothing stored.

Failure

A malformed number accepted; the same wording twice; no ticket on the third failure.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · confirmed, application number in hand
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
tapHaan, sahi hai
✦ application SSC GD · draft: prefilled → reviewed
✦ application SSC GD · draft: reviewed → packet ready
Form taiyaar hai: Fee: ₹100 Link: https://ssc.gov.in Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo.
✦ review card → packet shown
1234
Ye number samajh nahi aaya. Sirf letters/numbers likho, jaise 12345678.
✦ couldn't read that in “packet shown” — asking again
SSCGD12345
✦ application SSC GD · draft: packet ready → submitted by candidate
✦ application SSC GD · draft: submitted by candidate → confirmed
Mil gaya ✓ — SSCGD12345 note kar liya. Badhai ho, aapka SSC GD application yahin complete hota hai!
✦ packet shown → packet confirmed
mere form
Aapke liye 1 form mila hai. Neeche se dekho.
☰ Chunein
SSC GD · draftSubmit ho gaya ✓ — draft
✦ status: 1 form: SSC GD · draft
generated from the running code
6.57

"mere form" shows the submitted status

Steps
  1. After 6.54, type mere form and expand the list (☰ Chunein).
Success

The row for SSC GD reads Submit ho gaya ✓ — draft.

Failure

Still "Shuru kiya" after a number was captured.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · confirmed, application number in hand
JivikaRohit (synthetic) · 00001
tapHaan, de sakte ho
Ab signature ki file: JPEG, 10 se 19 KB, lagbhag 6×2 cm (709×236 px), seedhi (horizontal), aur box ka kam se kam 80% bhara hua. Kaali ya neeli pen se saaf sign karke scan karo.
✦ console: no file upload here — type the file's details, e.g. jpg 15 KB 709x236
✦ jobs consent → signature ask
jpg 15 KB 709x236
Signature theek hai ✓ (jpg, 15 KB, 709×236 px).
Photo SSC ki site/app par live khichti hai, file bhejni nahi hai. Plain background aur achhi roshni rakho; cap, mask, chashma nahi, aur kisi photo ki photo kabhi nahi.
Sab kuch ek nazar me: Naam: ROHIT KUMAR (14-03-2002) Category: OBC (NCL) · Padhai: Graduate (BA/BSc/BCom) Claims: koi claim nahi Domicile: Uttar Pradesh, LUCKNOW Exam centres: LUCKNOW → KANPUR → VARANASI Exam bhasha: Hindi Force order: 1 CRPF, 2 BSF, 3 CISF, 4 ITBP, 5 SSB, 6 SSF, 7 Assam Rifles Job-info sharing: Haan Signature: jpg, 15 KB, 709×236 px Sab sahi hai? Naam, DOB, category, padhai aur claims 'Kuch galat hai'/guide se hi badalte hain — baaki 'Badlo' se badal sakte ho.
Haan, sahi hai
Badlo
✦ signature ask → review card
tapHaan, sahi hai
✦ application SSC GD · draft: prefilled → reviewed
✦ application SSC GD · draft: reviewed → packet ready
Form taiyaar hai: Fee: ₹100 Link: https://ssc.gov.in Is link par khud submit karo — Jivika submit nahi karta. Ho jaye to yahan application ya registration number bhejo.
✦ review card → packet shown
1234
Ye number samajh nahi aaya. Sirf letters/numbers likho, jaise 12345678.
✦ couldn't read that in “packet shown” — asking again
SSCGD12345
✦ application SSC GD · draft: packet ready → submitted by candidate
✦ application SSC GD · draft: submitted by candidate → confirmed
Mil gaya ✓ — SSCGD12345 note kar liya. Badhai ho, aapka SSC GD application yahin complete hota hai!
✦ packet shown → packet confirmed
mere form
Aapke liye 1 form mila hai. Neeche se dekho.
☰ Chunein
SSC GD · draftSubmit ho gaya ✓ — draft
✦ status: 1 form: SSC GD · draft
generated from the running code
6.58

Distress, delete and the debugger, one more time, at the packet

Steps
  1. At the packet send mujhe jeena nahi hai. 2. On a fresh run, confirm with a number, then delete → Haan, hata do.
Success

Distress routes as always. The delete clears the application, the form and the documents — confirmation number included. The whole path (review → packet → confirmed) leaves the Debugger silent.

Failure

Any leftover value after the erase; a finding anywhere on the happy path.

Auto: apps/console/lib/chat.test.ts

7 · Commands and verbs (typed any time)

7.1

`madad` opens a guide ticket with a concrete promise

Steps
  1. Mid-form (any question) type madad.
Success

"Theek hai — hamari team se koi aapko 2 ghante ke andar call karega…". Divider guide ticket G-n queued. The Guide queue shows one open help ticket. The form carries on (the same question is still pending).

Failure

No ticket; the form is paused or reset; a vague promise.

Auto: apps/console/lib/chat.test.ts

Expected · Mid-form, ask for help
JivikaRohit (synthetic) · 00001
madad
Theek hai — hamari team se koi aapko 2 ghante ke andar call karega. Tab tak aap yahin poochh sakte ho.
✦ help → guide ticket requested
✦ guide ticket G-1 queued — a person is due to call within 2 hours
generated from the running code
7.2

`madad` twice does not open a second ticket

Steps
  1. Type madad again.
Success

"Aapki request mil chuki hai…" (and a different wording a third time). Still one open help ticket.

Failure

A second ticket; the same words verbatim.

7.3

`band karo` saves the preference and says honestly that no reminder is running

Steps
  1. Type band karo. Then band karo again.
Success

"Theek hai, ab koi reminder nahi bhejungi…"; the second time "Reminders pehle se band hain…". (Reminders are not built — it must not pretend to cancel something.)

Failure

The same words twice; a claim that scheduled reminders were cancelled.

Expected · Twice in a row
JivikaRohit (synthetic) · 00001
band karo
Theek hai, ab koi reminder nahi bhejungi. Jab chaho 'mere form' likh kar status dekh lena.
✦ stop → reminders off (preference saved)
band karo
Reminders pehle se band hain. Koi reminder nahi jayega.
✦ stop → reminders off (preference saved)
generated from the running code
7.4

`mere form` before any form

Steps
  1. Fresh number: mere form.
Success

"Abhi koi form shuru nahi hua. 'hi' likh kar shuru karein." A second time: "Kuch badla nahi — abhi koi form shuru nahi hua."

Failure

An error; the same words twice.

7.5

`delete` asks first, and says what is erased

Steps
  1. Rohit at the result: type delete.
Success

"Aapki di hui jaankari (janm tithi, padhai, category, rajya) hata dun? Ye wapas nahi aayegi." with Haan, hata do / Nahi, rehne do. Nothing erased yet.

Failure

Erased without asking.

Expected · Ask, confirm, start over
JivikaRohit (synthetic) · 00001
delete
Aapki di hui jaankari (janm tithi, padhai, category, rajya) hata dun? Ye wapas nahi aayegi.
Haan, hata do
Nahi, rehne do
✦ ask qualification → confirm delete
tapHaan, hata do
Ho gaya — aapki jaankari hata di gayi. Jab bhi 'hi' likhoge, main phir se shuru kar dungi.
✦ confirm delete → erased
✦ erased: dob
hi
Pehle janm tithi batao (DD-MM-YYYY).
✦ erased → ask dob
generated from the running code
7.6

Declining a delete puts you back exactly where you were

Steps
  1. Mid-form (say at ask category) type delete, then Nahi, rehne do.
Success

"Theek hai, kuch nahi hataya." and the category question again; answers intact.

Failure

Sent back to the start; answers lost.

7.7

Confirming erases end to end

Steps
  1. delete → Haan, hata do. Then mere form. Then type hi.
Success

"Ho gaya — aapki jaankari hata di gayi…". ✦ erased: dob, qualification, category, state (lists what went). mere form says nothing started. The Events panel shows erasure_requested and erasure_completed, and all earlier events for that number are now attributed to "erased" (Export JSON: no phone number). hi starts fresh; the tip can be taught again.

Failure

Anything of the old profile survives; the phone number remains on old events.

Auto: apps/console/lib/events.test.ts

7.8

`hi` / `namaste` restarts

Steps
  1. At the result type namaste.
Success

The greeting again; a fresh start.

Failure

Read as an answer.

7.9

Commands only match short messages

Steps
  1. At the date question send mujhe madad chahiye kyunki main bahut confused hoon aur yeh form samajh nahi aa raha.
Success

A re-ask/normal handling (long text is not swallowed by the keyword madad), no ticket.

Failure

A ticket opened from a long sentence that merely contains "madad".

7.10

Yes / no / change verbs, typed

Steps
  1. At the card type ok, then (fresh) theek hai, bilkul. At a card type galat.
Success

ok/theek hai/bilkul confirm; galat opens the four-field list.

Failure

Any read as unreadable text.

Auto: packages/flow/src/verbs.test.ts

7.11

Typed words work only where the bot offered the choice

Steps
  1. At the date question type haan.
Success

Not accepted as a date (re-ask); does not skip ahead.

Failure

"haan" advances the flow.

7.12

Unhandled input after the last built step is honest

Steps
  1. After a confirmation number is captured (§6.54) type kal mausam kaisa rahega.
Success

No fake reply; a divider no handler for this input in "packet confirmed" yet; the Debugger raises P1 no-reply (accepted, §15).

Failure

A confident wrong reply; a crash.

7.13

The daily check-in (F9, #60): a synthetic stub, reachable from anywhere

Steps
  1. On a fresh number type aaj ka kaam (before answering anything else). Also try check-in, daily task, आज का काम.
Success

"Aaj ka kaam: 3 sawaal, 2 minute se kam." then a buttons question (3 options, no free text). This is a synthetic stub — not real exam content — standing in for a licensed/affiliate question bank (CLAUDE.md §2).

Failure

More than 3 buttons; a free-text question; a real-looking exam question.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · mid-form, a quick task, then back
JivikaRohit (synthetic) · 00001
haan
Pehle janm tithi batao (DD-MM-YYYY).
✦ greet → ask dob
aaj ka kaam
Aaj ka kaam: 3 sawaal, 2 minute se kam.
2, 4, 6, 8, __ — agla number kya hai?
9
10
12
✦ ask dob → checkin task
tap10
20 - 8 kitna hota hai?
10
12
14
tap12
Kaunsa mahina 30 din ka hai?
January
April
March
tapApril
3/3 sab sahi ✓! Streak: 1 din — kal phir milte hain.
✦ checkin → 3/3, streak 1
generated from the running code
7.14

Mid-question, it still works — and hands you right back

Steps
  1. Mid-onboarding (say at the date question) type aaj ka kaam. Answer all 3 questions correctly.
Success

The 3 questions in turn, then "3/3 sab sahi ✓! Streak: 1 din — kal phir milte hain." and the conversation is back at the exact question that was interrupted (the date question again) — nothing lost, nothing skipped.

Failure

The interrupted question forgotten; landing somewhere else; the answers given before the check-in lost.

Auto: apps/console/lib/chat.test.ts

Expected · Rohit · mid-form, a quick task, then back
JivikaRohit (synthetic) · 00001
haan
Pehle janm tithi batao (DD-MM-YYYY).
✦ greet → ask dob
aaj ka kaam
Aaj ka kaam: 3 sawaal, 2 minute se kam.
2, 4, 6, 8, __ — agla number kya hai?
9
10
12
✦ ask dob → checkin task
tap10
20 - 8 kitna hota hai?
10
12
14
tap12
Kaunsa mahina 30 din ka hai?
January
April
March
tapApril
3/3 sab sahi ✓! Streak: 1 din — kal phir milte hain.
✦ checkin → 3/3, streak 1
generated from the running code
7.15

A wrong answer still finishes; the streak counts completion, not a perfect score

Steps
  1. Answer the first question wrong, the rest correctly.
Success

"2/3 sahi ho gaye. Streak: 1 din — kal phir milte hain." The streak still went to 1.

Failure

The task blocked or restarted on a wrong answer; the streak not incremented.

Auto: apps/console/lib/chat.test.ts

7.16

The next day: a fresh task; a missed day: a lighter one, never a guilt message

Steps
  1. Complete a task, click the Debugger's +1 day, start again. 2. Complete a task, click +7 days, start again.
Success

After +1 day: the same 3-question task, streak continues. After +7 days: "Aaj ek chhota sa kaam — bas 1 sawaal." — one question, the streak carries over unchanged, and nothing says a day was missed.

Failure

Any wording like "you missed" or "you didn't do it yesterday" — S1 (CLAUDE.md §3.5, never guilt); the streak reset to 0 for a miss.

Auto: apps/console/lib/chat.test.ts (passes a later now directly); live in the console via §7.21's clock control.

7.17

Already done today: no new task, never re-scored

Steps
  1. Complete a task, then type aaj ka kaam again the same session.
Success

"Aaj ka kaam ho chuka ✓ — streak {n} din. Kal phir milte hain." No new questions; the streak unchanged.

Failure

A second task offered the same day; the streak counted twice.

Auto: apps/console/lib/chat.test.ts

7.18

Unreadable input mid-task: a nudge, the same question again — never a repeat

Steps
  1. Mid-task type something that isn't one of the three options, three times in a row.
Success

"Neeche diye options me se ek dabao." then the same question again, every time. The Debugger's repeat-verbatim rule stays quiet no matter how many times you retry.

Failure

The same exact bubble twice in a row; an answer guessed from free text.

Auto: apps/console/lib/chat.test.ts

7.19

Events, "mere form" during figuring, distress, and erase

Steps
  1. Complete a task and check the Events panel. 2. Send a distress phrase mid-task. 3. delete → Haan, hata do after a completed check-in.
Success

Events command_used command=checkin, checkin_started lighter=false, checkin_answered correct=… ×3, checkin_completed score=… total=3 streak=… — no question or option text in any event. Distress still routes to a person from mid-task. Erasing drops the streak with everything else.

Failure

Question/answer text inside an event — S1; distress not routed; the streak surviving an erase.

Auto: apps/console/lib/chat.test.ts

7.20

"Baad me" at the eligible list — finally a real message, and a door into the check-in

Steps
  1. At the eligible list type baad me (declining to apply for now).
Success

"Theek hai — jab man kare, 'aaj ka kaam' likh kar ek chhota kaam try karo, roz ka streak banao." (This state, first_task, said nothing at all before #60 — a real gap, fixed here.)

Failure

Silence; a P1 no-reply finding.

Auto: apps/console/lib/chat.test.ts

7.21

The Debugger's clock control (#133, F8a): the only way to move time in the console

Steps
  1. Note the Debugger's Clock row (real time, no +Nd suffix). 2. Click +1 day, then +7 days — the label updates each time ((+8d)). 3. Send a message; check its timestamp reflects the advanced clock. 4. Click Reset.
Success

The clock label always shows the simulated time, with an offset suffix once advanced; every message sent after advancing is timestamped at the simulated time, not real time; Reset returns to real time and the button disappears at offset 0. No other flow is affected by an unadvanced clock (offset 0 behaves identically to before this ticket).

Failure

A sent message timestamped at real time despite an advanced clock; the offset failing to reset.

Auto: packages/flow/src/reminders.test.ts (the pure engine); no console-level automated test yet (it's a debug affordance, not a user flow) — this row is manual-only.

7.22

Deadline reminders (F8b, #132): opt-in, a labelled test deadline, `band karo` stops it

Steps
  1. Type reminder chahiye. 2. Type it again. 3. Use the Debugger's clock to jump to the T-7 day (or +7/+14 days from opt-in), send any message. 4. Jump to T-3, then T-1, sending a message each time. 5. Type band karo, jump forward again. 6. Type reminder chahiye again.
Success

(1) "Theek hai — jab deadline paas aayegi, main yaad dila dungi..." (2) "Reminders pehle se on hain." (3)–(4) one "Test reminder: SSC GD (DRAFT)..." message per crossed window, each exactly once, clearly saying "test" — never presented as a real official date; the turn's own reply still follows right after. (5) reminders stop; the opt-in itself is remembered. (6) reminders resume from wherever they left off — the deadline anchor never resets.

Failure

A reminder claiming to be the notice's real deadline (a reputation-event shape, CLAUDE.md §10); a reminder firing twice; band karo wiping the opt-in instead of just pausing it; a reminder mixed into the same turn that first triggers distress.

Auto: apps/console/lib/chat.test.ts ("deadline reminders (F8b, #132)").

7.23

The fake-notice checker (F2, #61): Tracked / Old / Not found, deterministic, from any state

Steps
  1. Type ssc gd 2027 sahi hai kya. 2. Type RRB ALP 2024 bharti nikli hai, sahi hai kya. 3. Type something unrecognisable, e.g. kisi ne mujhe ek naukri ka notice bheja hai, sahi hai kya. 4. Mid-onboarding (after "haan", before answering DOB), type an old-notice check, then answer the DOB question normally. 5. Type ssc gd form kaise bharein (no year, no "sahi hai kya", no notice word).
Success

(1) SSC GD 2027 is named as tracked but not published — never "Verified" — plus its 2026 source PDF as a document card. (2) "Ye purana notice hai: RRB ALP (2024). Abhi koi naya RRB ALP notification nahi hai." (3) "Ye notice mujhe pehchaan nahi aaya — ise unverified maano..." — never guessed either way. (4) the notice reply lands, then the DOB question is answered exactly as if nothing interrupted it — the check is a pure self-loop, never a committing step. (5) ordinary onboarding capture — no notice reply at all; this is a genuine "how do I apply" question, not a forward.

Failure

Any notice ever called "Verified" (nothing in this POC's data is actually published yet — CLAUDE.md §10, a fake notice marked Verified is a P0-class reputation event, and so is the inverse); a real notice-choice tap or an "apply" intent swallowed by the checker instead; the verdict changing the conversation's state; the checked text appearing in an event's props.

Auto: packages/flow/src/notice-check.test.ts (the pure matcher), apps/console/lib/chat.test.ts ("the fake-notice checker (F2, #61)").

7.24

The Cost panel (F14, #62): a live, honest per-conversation number, never inflated

Steps
  1. Note the Cost panel right after the greeting (one message, 0 turns). 2. Walk through onboarding to the eligible list (step by step, no smart capture). 3. Check the breakdown rows. 4. Opt into reminders and let one fire (§7.22), then re-check the breakdown.
Success

(1) 0 turns ⇒ no ₹/10-turns figure shown (nothing to project from yet). (2) the panel updates live every turn; the ₹/10-turns badge turns amber once it crosses ₹2.50 — expect it to, since the step-by-step path is a known, already-quantified gap (§7 turn/cost budget). (3) every line is "Service (replies)" plus a final "LLM / voice (not called yet) — ₹0.00" line, always present, never silently omitted. (4) after a reminder fires, a new "Utility (reminders)" line appears, separate from "Service" — a reminder is never folded into the free-flowing service-conversation cost, because in production it would be a genuine WhatsApp utility template send.

Failure

A ₹/10-turns figure shown at 0 turns; the LLM/voice line disappearing instead of reading ₹0; a reminder counted as "service"; the badge never turning amber even on a conversation that's visibly gone over ₹2.50/10 turns.

Auto: packages/whatsapp/src/cost.test.ts (the pure rate math), apps/console/lib/cost.test.ts (per-conversation derivation).

7.25

A closer after a resolved turn is acknowledged, not ignored (#63, L2/L6)

Steps
  1. Reach the eligible list, then type thanks. 2. Repeat with ok, theek hai, dhanyavad. 3. At the very start, type ok in answer to the greeting's "Haan, shuru karein?".
Success

(1)–(2) a brief, warm reply ("Koi baat nahi!...") — never the old "no handler for this input... (DigiLocker steps not built)" console note, and the state doesn't move (a self-loop). (3) "ok" still works exactly as a real "yes" to the pending question — moves straight to asking DOB, never swallowed as a bare closer.

Failure

Silence or the stale "no handler" note for a plain "thanks"/"ok"; a genuine "yes" answer at a pending question mistaken for a closer and not advancing.

Auto: apps/console/lib/chat.test.ts ("a closer after a resolved turn is acknowledged"), packages/flow/src/verbs.test.ts (isCloser).

7.26

Three new debugger rules (#63): quiet by default, real when something's actually wrong

Steps
  1. Note the Debugger's rule count (19). 2. Drive any scripted scenario to completion and confirm 0 findings. 3. (Developer-only) feed the debugger a bot message containing "just", "quick", "As an AI", or "Oops" and confirm filler-voice fires. 4. (Developer-only) a conversation at ≥10 turns whose cost projects over ₹2.50 should trip cost-over-budget; the same shape at <10 turns should not.
Success

Every existing scenario stays debugger-clean — these are additive checks, not stricter ones. filler-voice and cost-over-budget only fire on genuinely bad content/cost, never on real product copy or any scenario measured today.

Failure

A new rule firing on existing, correct copy or an existing scenario (a false positive); cost-over-budget judging a short conversation (the volatility the ≥10-turn gate exists to avoid).

Auto: apps/console/lib/debug/rules.test.ts ("filler-voice", "closer-not-acknowledged", "cost-over-budget").

7.27

The last two debugger rules from #63: `no-next-step` (L8) and `unconfirmed-commit` (L4/L5)

Steps
  1. Note the Debugger's rule count (21). 2. Drive any scripted scenario that reaches distress, guide_hold or identity_wrong (the Distress probe; "kuch galat hai" at the identity card; an unrecordable claim) and confirm the hand-off message says a person is coming (a timeframe, or Tele-MANAS 14416) and that 0 findings fire. 3. Drive the delete command to confirm_delete and confirm the ask is the real yes/no card, 0 findings. 4. Reach packet_confirmed (the completed application) and confirm it is not flagged by no-next-step even though it names no further command. 5. (Developer-only, console-internal) feed the debugger a hand-off to identity_wrong/guide_hold/distress whose message never says a person is coming, and a confirm_delete/consent ask that is bare text instead of a card — both should fire.
Success

Every existing scenario stays debugger-clean (additive checks, not stricter ones) — no-next-step and unconfirmed-commit both start at zero live findings, same as every debugger rule shipped in #63 before them. no-next-step only applies to the 3 kind: "human" states (a genuine dead end), never the 2 kind: "terminal" ones (a graceful, successful close is a status update, not a roadblock — L8's own wording). unconfirmed-commit only applies to the 2 yes/no gates before a consequential, hard-to-reverse action (confirm_delete, consent) — packet_shown's typed confirmation number is deliberately out of scope, since it is a value entry, not a yes/no gate, and is separately guarded by construction (GUIDED_TYPED keeps it out of the general smart-capture sweep, so it can never be inferred from unrelated free text).

Failure

Either rule firing on existing, correct copy or an existing scenario (a false positive); a future hand-off or consequential-action copy change silently removing the next-step line or the yes/no card without the debugger catching it.

Auto: apps/console/lib/debug/rules.test.ts ("no-next-step", "unconfirmed-commit") — each with a hand-built positive case, a hand-built negative case, and a real end-to-end scenario check (distress, the identity-card "kuch galat hai" path, and the real delete flow).

8 · Distress and the guide desk

(P0 area — a distress message with no human follow-up is a reputation event.)

8.1

A distress phrase routes to a person at once

Steps
  1. Any state, type mujhe jeena nahi hai (or use the Distress probe).
Success

"Main sun rahi hoon. Hamari team se koi aapko thodi der me call karega. Abhi baat karni ho to Tele-MANAS 14416 par call karein — 24x7, free." Divider: ticket queued, due within an hour. The Guide queue shows a distress ticket (red).

Failure

No ticket; no 14416; a cheer-up, emoji or motivation; the form question repeated.

Auto: apps/console/lib/chat.test.ts

Expected · From any state
JivikaRohit (synthetic) · 00001
mujhe jeena nahi hai
Main sun rahi hoon. Hamari team se koi aapko thodi der me call karega. Abhi baat karni ho to Tele-MANAS 14416 par call karein — 24x7, free.
✦ ask dob → distress
✦ guide ticket G-1 queued — a person is due to call within an hour
koi hai?
Hamari team aapko jaldi call karegi. Tele-MANAS 14416 par kabhi bhi baat kar sakte ho.
✦ guide ticket G-1 updated — message added for the guide
generated from the running code
8.2

Nothing else is asked while a person owns it

Steps
  1. Right after 8.1 type koi hai?, then 14-03-2002.
Success

Only the informational line "Hamari team aapko jaldi call karegi. Tele-MANAS 14416 par kabhi bhi baat kar sakte ho." — no question, no parsing of the date, no reassurance.

Failure

The date is accepted; a new question; "everything will be fine".

8.3

Follow-up messages are added to the ticket for the guide

Steps
  1. After 8.1, send another message.
Success

Divider guide ticket G-n updated — message added for the guide. The ticket in the queue shows the note.

Failure

The message is lost.

8.4

Resolving hands the form back where they were

Steps
  1. In the Guide queue click Resolve on the distress ticket.
Success

Divider guide ticket … resolved … conversation resumes at "<state>"; the ticket turns resolved; the next message continues the form from that exact state.

Failure

Restart from the beginning; the conversation stays locked.

8.5

Distress works from every stage

Steps
  1. Trigger mujhe jeena nahi hai at: the greeting, a question, the card, the result, and after a form is started.
Success

The same handling every time.

Failure

Any stage where it is read as an answer or ignored.

8.6

Distress in other phrasings *(natural)*

Steps
  1. Try main sab khatam kar dunga, jeene ka mann nahi karta, I want to end my life.
Success

Each goes to the distress path.

Failure

Any is treated as chatter — S1.

8.7

Ordinary frustration is not distress

Steps
  1. At a question send I give up on this form, and ye form bahut mushkil hai.
Success

Normal handling (re-ask / help), no distress ticket. And the bot never says "give up" itself.

Failure

A distress ticket for frustration; the bot telling the user to give up.

8.8

The guide queue clock

Steps
  1. Open a distress ticket and a help ticket.
Success

Distress "call by" ≈ 60 minutes out; help ≈ 2 hours; times in your local timezone; counters show "n open".

Failure

Both the same SLA; times in another timezone.

8.9

Reset closes that number's tickets

Steps
  1. With an open ticket for Rohit click Reset.
Success

The conversation restarts and that ticket is closed.

Failure

An orphan ticket for a conversation that no longer exists.

Auto: apps/console/lib/workspace.test.ts

9 · Repair — re-asks and escalation

9.1

A re-ask never repeats the question word for word

Steps
  1. At the date question send kal, then phir kuch.
Success

First: "Ye tithi samajh nahi aayi…" (a note, not the question). Second: a different message with an example and "Dikkat ho to 'madad' likho."

Failure

The original question repeated verbatim.

Expected · Someone who can’t get the date right
JivikaRohit (synthetic) · 00001
kal
Ye tithi samajh nahi aayi. DD-MM-YYYY me likho, jaise 14-03-2002.
✦ couldn't read that in “ask dob” — asking again
aaj
Koi baat nahi — tithi aise likhte hain: 14-03-2002. Dikkat ho to 'madad' likho.
✦ couldn't read that in “ask dob” — asking again
parso
Ye thoda atak raha hai — maine hamari team ko bata diya hai. Koi aapko 2 ghante ke andar call karega, tab tak chaho to phir try kar sakte ho.
✦ couldn't read that in “ask dob” — asking again
✦ 3 failures at this question → help ticket requested (F10)
✦ guide ticket G-1 queued — a person is due to call within 2 hours
generated from the running code
9.2

The third failure opens a person

Steps
  1. Fail the same question three times.
Success

"Ye thoda atak raha hai — maine hamari team ko bata diya hai. Koi aapko 2 ghante ke andar call karega…" and a help ticket in the queue whose text names the field and the attempts. Divider "3 failures at this question → help ticket requested".

Failure

A fourth identical re-ask; no ticket; the attempts lost.

9.3

The ticket is not opened twice

Steps
  1. Keep failing after 9.2.
Success

Later replies vary; no second help ticket while one is open.

Failure

A ticket per failure.

9.4

A list question's re-ask points at the list

Steps
  1. At education type xyz, then abc.
Success

"Ye list me nahi mila. Neeche 'Chunein' dabao aur ek chuno." then a second, different wording.

Failure

The question text repeated.

9.5

A correct answer resets the count

Steps
  1. Fail the date twice, answer it correctly, then fail the state question once.
Success

The state failure is counted as 1 (plain re-ask), not 3.

Failure

Escalates immediately.

9.6

Gibberish probe

Steps
  1. Use the Gibberish probe 3 times.
Success

As 9.1–9.2; the Debugger shows retry-loop if a 4th identical reply happened (it must not).

Failure

A loop without a ticket.

10 · Numbers and shared phones

10.1

Each number has its own conversation

Steps
  1. Walk Rohit to the card. Switch (pulldown) to Sunaina. Switch back.
Success

Sunaina is at the greeting; Rohit is exactly where he was.

Failure

Any state or answer carried across numbers.

10.2

Another number never sees your answers — **S1**

Steps
  1. Give Rohit his profile. On Sunaina type mere form and hi.
Success

Nothing from Rohit (date, category, form) appears in Sunaina's thread, buttons or Events tagged to her.

Failure

Another profile's data shown — a reputation event.

Auto: apps/console/lib/debug/rules.test.ts

10.3

Events belong to the right number

Steps
  1. Events panel: this number vs all numbers while switching.
Success

The counts and rows follow the number; all numbers shows the last 5 digits per row.

Failure

Events of one number listed under another.

10.4

+ New number mints a synthetic number

Steps
  1. Open the pulldown → + New number.
Success

A new persona in the +9199999xxxxx block, greeting shown, becomes active. There is no way to type a number.

Failure

Any way to enter a real phone number; a number outside the block.

Auto: apps/console/lib/personas.test.ts

10.5

The pulldown shows tickets and findings per number

Steps
  1. Give Rohit a help ticket and a Debugger finding (e.g. Devanagari probe).
Success

The pulldown shows an open-ticket badge and the finding count against Rohit only.

Failure

Badges on the wrong number.

10.6

Reset only affects the active number

Steps
  1. Progress two numbers. Reset one.
Success

Only that thread restarts; the other stays.

Failure

Both reset.

10.7

A reload keeps your conversation (#23)

Steps
  1. Give Rohit a few turns (past the profile card). Reload the page (same browser tab or a new tab in the same browser).
Success

Within a few seconds, the full transcript and current state reappear exactly as left — including the very first greeting message. A second browser tab on the same conversation picks up a reply sent from the first within ~4 seconds (polling), without reloading.

Failure

The conversation resets to the greeting; the greeting message itself is missing from the restored transcript even though later messages are present (a narrower, easy-to-miss variant of the same failure — check the very first bubble specifically); a stale copy that never updates from the other tab.

Auto: apps/console/lib/db/threads.test.ts (the persistence/reconstruction logic — no live Supabase needed to run it).

10.8

A different visitor never sees or shares your conversation (#23)

Steps
  1. Progress Rohit in one browser (or clear localStorage → reload → note you're now a "different visitor"). Open the same URL in a second, unrelated browser (or an incognito window) and also pick Rohit.
Success

The second visitor's "Rohit" starts at the greeting, completely independent of the first's progress — each anonymous visitor gets their own private copy of every persona, not a shared one.

Failure

Two unrelated visitors both picking "Rohit" see or edit the same live conversation.

11 · The Debugger and the event spine

11.1

A clean run is clean

Steps
  1. Walk Rohit's full path to a started form. Watch the panel.
Success

P0 0 · P1 0 · P2 0 (until you type something unhandled after the start).

Failure

Any finding on a happy path — file it, it is either a product bug or a bad rule.

11.2

Probes trip their rules

Steps
  1. Click Distress, Devanagari, Gibberish (×3).
Success

Distress → no finding when routed correctly; Devanagari → a P2 register-mismatch; Gibberish×3 → the escalation (§9.2) and no P0.

Failure

A P0 on a correct path.

11.3

Findings can be jumped to

Steps
  1. Trigger a finding. Click jump →.
Success

The thread scrolls to the offending message and highlights it.

Failure

Nothing happens.

11.4

Filters

Steps
  1. Filter P0/P1/P2/all; toggle all numbers / this number.
Success

The list follows the filter and the counts.

Failure

A stale list.

11.5

Copy report

Steps
  1. Click Copy report and paste it somewhere.
Success

A plain-text report: counts, each finding with its source, the transcripts involved, your timezone.

Failure

An empty report; the button says "Copied ✓" but nothing was copied.

11.6

Every turn emits events; the Events panel follows

Steps
  1. Rohit: one-sentence capture (§3.1), then Haan, sahi hai.
Success

Rows in order, e.g. conversation_started source=console · answer_captured field=dob via=asked … profile_card_shown · profile_confirmed · eligible_list_shown n=1 k=1. Times in your timezone.

Failure

Missing steps; out of order; wrong via (asked / sentence / correction).

Auto: apps/console/lib/events.test.ts

11.7

Events hold ids and codes only — **S1 if not**

Steps
  1. Send messages that look like personal data: Mera naam Rohit Kumar hai, phone 9876543210, aadhaar 1234 5678 9012, rohit.kumar@example.com.
  2. Export JSON from the Events panel and search it.
Success

None of that text — no name, number, date of birth or email — appears in any props. Only codes (field=dob, n=1 k=1, from=ask_state).

Failure

Anything a user typed inside an event — S1 (props are ids and codes only).

Auto: apps/console/lib/events.test.ts

11.8

Export JSON

Steps
  1. Click Export JSON.
Success

A file jivika-events-…json downloads; it parses; rows are numbered from 1 with seq, at, phone, name, props.

Failure

No download; invalid JSON.

11.9

Scripted access

Steps
  1. In the browser console run window.__jivikaDebug.events.length and window.__jivikaDebug.findings.
Success

A number and an array.

Failure

undefined.

12 · The design pages

12.1

`/flow` renders every conversation

Steps
  1. Open /flow. Scroll the field guide.
Success

15+ phone-style threads, each a heading, a sentence and a conversation; four diagrams render (no raw Mermaid text, no "Syntax error"); a contents list works.

Failure

A thread blank; a diagram shown as code.

Auto: apps/console/lib/flowdoc.test.ts

12.2

The flow page tells the truth

Steps
  1. Pick three threads (e.g. the eligible result, "mere form", the card correction) and replay them in the console.
Success

The console produces the same messages (the page is generated from the same code).

Failure

A difference.

12.3

`/scope` renders

Steps
  1. Open /scope.
Success

Sections, three diagrams, the "Built (slice 0)" note under the event spine.

Failure

A build/render error.

12.4

Internal pages stay out of search

Steps
  1. View source of /flow, /scope, /qa.
Success

<meta name="robots" content="noindex, nofollow"> on each.

Failure

Indexable.

12.5

Navigation

Steps
  1. Use the top nav: Simulator, Gallery, Flow, Scope, QA, Ops.
Success

Each goes where it says; the active item is highlighted; works on a phone-width window. Since #13: "Ops" is still a public nav link on every page (the label itself isn't a secret — it's documented in this file and in HANDOFF.md), but clicking it when signed out now 404s rather than showing the shell — that's the intended gate, not a dead link.

Failure

A dead link for a signed-in ops user; /ops rendering real content for a signed-out visitor.

12.6

Dark theme everywhere

Steps
  1. Visit /, /console, /flow, /scope, /qa.
Success

A consistent dark theme; readable text; diagrams legible.

Failure

A white flash or unreadable section.

12.7

`/ops/funnel`: the leak map (#86, CRM slice 1)

Steps
  1. Sign in at /ops/login with an allowlisted account (§12.8). 2. Open /ops — note the "Funnel lens" card (not a "not built yet" placeholder like the other three). 3. Click through to /ops/funnel. 4. Read the stage bars top to bottom. 5. Read the five stalls.
Success

A non-empty, non-increasing funnel (registered ≥ profiled ≥ … ≥ retained); "profiled" and "saw value" show the same count every time (they fire in the same turn); all five stalls render, including "profiled, never saw a list" at 0 with its own one-line explanation (never hidden); a footnote explicitly labels "Retained" as a streak-≥2 proxy and says Credentialed/Advocate aren't built.

Failure

An empty or all-zero funnel; a stall silently omitted instead of explained; "Retained" presented as if it were real D30 activity; any count that isn't traceable to a real, re-runnable synthetic lead.

Auto: apps/console/lib/funnel/cohort.test.ts (each lead stops where it claims), apps/console/lib/funnel/stages.test.ts (the pure derivation/stall logic).

12.8

`/ops` sign-in: Google OAuth + the Supabase allowlist (#13)

Steps
  1. Signed out, visit /ops and /ops/funnel directly. 2. Visit /ops/login and click "Continue with Google." 3. Sign in with a Google account that is not on the allowlist. 4. Sign in again with an allowlisted account (the founder's own, already seeded). 5. With the session from step 4, revisit /ops and /ops/funnel.
Success

Step 1 → a plain 404 for both, not a redirect and not the shell (the surface isn't advertised). Step 3 → bounced back to /ops/login?denied=1 naming the rejected account, app still otherwise fully usable (nothing crashes). Step 4 → lands on /ops. Step 5 → both pages render real content.

Failure

/ops renders anything for a signed-out visitor; a non-allowlisted Google account reaches /ops; the denied banner doesn't name which account was rejected; a crash instead of a clean bounce.

Auto: apps/console/lib/auth/ops.test.ts (the allowlist hash/fail-closed logic, pure). There is no automated test for the live OAuth round trip or the DB-side grant_ops/RLS behavior — no live-Supabase-integration-test harness exists anywhere in this repo yet (consistent with the rest of the codebase, not a gap unique to this ticket); that side was checked once, manually, via mcp__supabase__execute_sql when #13 shipped. **Note:** all five steps are fully verified live (2026-10-04) — the founder signed in with their allowlisted Google account and landed on /ops; confirmed in the DB (ops_users.is_ops = true).

12.9

`/ops/guide`: the guide desk (#87, CRM slice 2)

Steps
  1. In /console, on a synthetic number, say a distress phrase ("mujhe jeena nahi hai"). 2. Send a second message while still in distress. 3. Sign in at /ops, open the "Guide desk" card. 4. Claim the distress ticket. 5. Add an internal note. 6. Reply into the thread. 7. Go back to /console on that same number and wait ~4 s (the existing poll). 8. Return to /ops/guide and resolve the ticket. 9. Check the /console thread again.
Success

Step 1 → a guide_tickets row appears (priority P0, due in 60 min, excerpt = the distress line). Step 2 → the SAME row's "while waiting" notes grow by one — no duplicate ticket. Step 3 → the card reads "live", not "not built yet". Step 4 → status flips to claimed. Step 6 → the reply shows up in the candidate's /console thread as a normal assistant bubble, signed "— Jivika guide se" — the candidate never sees the internal note from step 5. Step 8 → the ticket leaves the open queue. Step 9 → the conversation has resumed exactly where distress interrupted it (the next assistant message answers whatever question was pending, not a repeat of the distress-hold line) — never left stuck.

Failure

A second distress message creates a second ticket instead of appending a note; an internal note leaks into the candidate's thread; a reply never reaches /console even after a hard reload; resolving a distress ticket leaves the candidate's conversation still parked in the distress state; /api/ops/tickets or /ops/guide return anything but a 404 when signed out.

Auto: apps/console/lib/db/tickets.test.ts — kind/priority/SLA mapping for all 7 §4.4 kinds, loadOpenTickets reconstruction, and a closeTicket test that asserts the real resolveTicket() actually ran (the resulting state is no longer the distress state), not a mock standing in for it. **Known gaps, not bugs (see §15):** only distress and help→form_error are ever actually created today; the other 5 §4.4 kinds render in the inbox but nothing opens one yet. /console's own local "Mark called" button and /ops/guide's server-side resolve are two independent paths that don't sync with each other.

13 · Voice, register and copy

13.1

Register matching

Steps
  1. Read the whole thread of a full run.
Success

Romanised Hinglish throughout, in the voice of a helpful senior — short sentences. Never formal Hindi, never Devanagari, no emoji storms.

Failure

Devanagari or stiff Hindi ("kripya…"); English-only lecture.

13.2

Never guilt, never "give up"

Steps
  1. After Baad me, band karo, a "not eligible" result and an over-limit result, read the reply.
Success

Calm and forward-looking ("koi jaldi nahi", "hum dekhte rehte hain").

Failure

Any sentence that blames, shames, pressures or tells the person to give up — S1.

13.3

No automated cheer-up on the hard day

Steps
  1. After a distress message read every bot line.
Success

Acknowledgement, a person is coming, Tele-MANAS 14416 — nothing else.

Failure

"Sab theek ho jayega", motivation, emoji.

13.4

Buttons before prose

Steps
  1. Note every structured decision (greeting, education, category, card, form card, delete).
Success

Each is buttons or a list; free text is used only for the date, state and corrections.

Failure

A yes/no or a pick that requires typing.

13.5

Short messages

Steps
  1. Read each bot message.
Success

Two sentences or fewer (the card and consent-style notices excepted), no stacked bubbles saying the same thing.

Failure

A wall of text; the same content sent twice in a row.

13.6

Timestamps carry your timezone

Steps
  1. Look at message times and the Guide queue.
Success

e.g. 10:33 AM PDT — your local timezone next to the time.

Failure

No zone; the server's zone.

13.7

Placeholders never leak

Steps
  1. Read every bot message across a full run.
Success

No {n}, {first}, {date} or undefined in any text.

Failure

A raw placeholder — the Debugger shows unfilled-placeholder.

14 · Cross-cutting invariants (spot-check every release)

14.1

Synthetic data only

Steps
  1. Search the page, the report and the events export for anything that looks like a real number/name.
Success

Only +9199999xxxxx, "(synthetic)" names.

Failure

Real personal data anywhere — S1.

14.2

Value before identity

Steps
  1. Any run: find the first mention of DigiLocker/Aadhaar/documents.
Success

After the eligible list, and only after the person chose to start a form.

Failure

Earlier — S1.

14.3

The bot never automates a portal or takes money

Steps
  1. Read every message about forms.
Success

No fee, payment, "I submitted for you" or a link that submits. (Fee guidance and links arrive with guided apply.)

Failure

Any charge, convenience fee, paid tier or claim of submitting — S1.

14.4

Government jobs only

Steps
  1. Look for any employer-facing wording or private-job pathway.
Success

None.

Failure

Any — out of Phase I scope.

14.5

The eligibility engine, not the chat, decides

Steps
  1. Repeat 5.3, 5.6 and 5.7 and check the message against the ✦ engine: divider.
Success

Always consistent, limits come from the rules (23/26/28).

Failure

A mismatch — S1.

14.6

Every eligibility claim is labelled

Steps
  1. Read each result and each form row.
Success

"DRAFT" / "Draft — official notice aana baaki" everywhere until a real notice exists, and the source document is the official 2026 PDF.

Failure

An unlabelled claim — a fake-notice-marked-Verified class of bug, S1.

14.7

Shared-phone safety

Steps
  1. Repeat 10.2 with the same number after Reset and after delete.
Success

No trace of the previous profile.

Failure

Leftover answers or documents — S1.

14.8

Erasure is end to end

Steps
  1. Repeat 7.7 and inspect thread, mere form, Events (Export JSON) and window.__jivikaDebug.
Success

Nothing attributable to the number remains.

Failure

Any leftover.

14.9

The Debugger is quiet after the whole suite

Steps
  1. After a full run of this plan check the panel across all numbers.
Success

Only the findings you intentionally provoked (Devanagari P2, unhandled-after-start P1).

Failure

An unexplained P0.

14.10

Production parity

Steps
  1. Repeat 5.1, 4.4 and 6.3 on www.jivika.dev/console after a deploy.
Success

Identical to local. (Check the deployed content, not just the deploy status — the domain lags ~20 s.)

Failure

A difference.

15 · Known gaps — these are not bugs

GapWhereTracked
After a confirmation number is captured, nothing more is built; further input → P1 no-reply. No admit-card or result stage, no screenshot OCR for the confirmation number (typed only). Identity and claims cannot be changed at the review card — only through a guide (by design, §6.49). ESM / sports / another-state / 1984-dependant claims still go to a person (not yet recorded by the bot)§6.49, §6.57, §7.12#59.2b-2
Deadline reminders (F8, #132) are opt-in-only, not proactively offered. remind/stop work, but nothing in the live conversation ever tells an aspirant the command exists — unlike mere form/madad, which are taught once at the eligible list. The reminder itself also targets one fixed notice (SSC GD 2027) against a labelled test deadline, since the real 2027 notice still has none — not the general "any eligible or applied-for notice" F8 describes§7.22a future ticket: teach the trigger, and generalise past one hard-coded notice once a real deadline exists
The fake-notice checker (F2, #61) can never say "Verified." Every notice this repo tracks is still DRAFT or awaiting publication — there is no genuinely published, ingested notice in this POC's data to demonstrate that outcome against. Same root cause as the reminders gap above: a data-readiness gap, not a code gap. The checker also only recognises a small, hand-picked registry of real historical exam names (RRB ALP 2024, SSC CHSL 2019, Railway Group D 2019) and the two notices this repo already tracks — a real ingestion pipeline is out of POC scope (CLAUDE.md §5A)§7.23demonstrable once a real notice is actually ingested (production, not POC)
The console has no real file upload: the signature's format/size/dimensions are typed (jpg 15 KB 709x236). The same field-map validator will judge a real file; whether the strokes fill 80% of the box cannot be checked from those three facts§6.38real WhatsApp media (post-POC)
District names are free text (the portal's district lists are not in the notice), so a typo in a real district is not caught by the bot§6.29field-map needsReview
DigiLocker is a mock: the documents are synthetic and deterministic per number§6.11#59 → real requester later
Persistence (#23) covers conversations/messages/cost; the event spine (ws.events) still resets on reload. Guide tickets are now persisted (#87) — only the in-memory event spine remains a per-tab/per-reload thing§10.8a future ticket, lower priority than tickets were
/api/health is publicly reachable—By design — uptime checks need it reachable without auth
Replies are always romanised Hinglish; a Devanagari-typing user gets a P2 register-mismatch§2.8—
No reminders exist; band karo only saves the preference§7.3#60
Only distress and help→form_error tickets are ever actually opened (#87). The other 5 §4.4 kinds (stuck_application, fake_notice_review, data_request, payment_guidance, abuse) render correctly in the guide desk's schema/UI but nothing in the app detects them yet — each is its own future ticket. The three 24h SLA numbers for those kinds are a POC placeholder, not researched compliance figures (data_request especially — the spec calls it "mandated"). /console's own local "Mark called" (client-only resolve) and /ops/guide's server-side resolve are two independent, unsynced paths; there's no realtOS-style ack/assignee split — claim does both§12.9#87 (follow-ups)
One shared phone has one profile (F11 multi-profile per number not built; schema has a UNIQUE on the number)§10#24
Only SSC GD is checked; "Kaun sa form?" is unit-tested only§6.8RRB rules
Copy distress.holding is not yet reviewed by the guide desk§8.2#45
Rules are a DRAFT (2026 notice as a template; crucial date assumed)§0.2re-verify ~Dec 2026
Hindi/English registers exist in copy but the console always uses Hinglish§13.1—
The Cost panel's LLM and STT lines always read ₹0 and the per10Turns figure is a linear projection, not a benchmark run. Neither an LLM nor STT is called anywhere in this console yet, so real per-conversation cost is understated (WhatsApp-send cost only). The projection is also volatile for a short, front-loaded conversation — see §7.24§7.24LLM/STT lines land whenever an LLM or STT step is actually wired in
no-next-step only covers the 3 kind: "human" hand-off states (guide_hold, identity_wrong, distress) — it does not audit every bot text message in the app for a "next step," which would risk false-positiving ordinary mid-flow utility lines (e.g. "Centres noted: ..."). L3 ("never ask a question you can't field") remains a candidate, untouched by this ticket§6 L3, L8a future ticket, if the narrower scope proves insufficient
unconfirmed-commit only covers 2 of the 3 consequential actions (confirm_delete, consent) — packet_shown's typed confirmation number is deliberately excluded (a value entry, not a yes/no gate; separately guarded by construction, not by this rule)§6 L4/L5—
The funnel lens (/ops/funnel, #86) is still a synthetic, build-time snapshot, not a live view. The 9-lead cohort is hardcoded and regenerated only on rebuild. #23 (persistence) is done, but the funnel lens itself was never rewired to read real /console sessions from it — that's separate follow-up work, not an automatic side effect of #23 shipping. Retained is a proxy (check-in streak ≥ 2; there is no real wall-clock D30 in a one-shot conversation). Credentialed and Advocate (from the scope doc's §5.2 stage table) are not shown at all — neither has a built feature to derive them from (no admit-card/result flow, no credential card). "Profiled, never saw a list" is structurally always zero — profile_confirmed and eligible_list_shown fire in the same reply() turn — and the lens explains this rather than hiding the row§12.7a future ticket to point the funnel lens at real persisted sessions; Credentialed/Advocate need the admit-card/result/credential features

16 · Changelog

  • 2026-10-06 · v1.23 — #63 (closed out): the last two debugger rules, no-next-step (L8) and unconfirmed-commit (L4/L5). no-next-step checks every kind: "human" hand-off state (guide_hold, identity_wrong, distress) says what happens next (a person is coming, a timeframe, Tele-MANAS 14416) — the 2 kind: "terminal" states (packet_confirmed, first_task) are deliberately exempt, since a graceful, successful close is a status update, not a roadblock (L8's own wording). unconfirmed-commit checks the 2 yes/no gates before a consequential, hard-to-reverse action (confirm_delete erasing everything; consent pulling real DigiLocker documents) are a structured buttons/list card, never bare text — packet_shown's typed confirmation number is deliberately out of scope, since it's a value entry guarded separately by construction (§7.27 added; the Known Gaps row narrowed to the two rules' now-precise scope rather than "not built"). Both rules start at zero live findings — measured against every existing scripted scenario (including the real delete flow and every kind: "human" state) before shipping, same discipline as cost-over-budget/closer-not-acknowledged. 21 debugger rules total; 402 console tests.
  • 2026-10-06 · v1.22 — #148: fixed the React hydration-mismatch console error (minified #418) that fired on every single /console load, filed during #23's testing but accidentally auto-closed by GitHub on merge without ever actually being fixed (a PR body saying "not fixed: #148" still tripped the closing-keyword matcher — reopened, then fixed for real). apps/console/app/components/DebugPanel.tsx's clock display now mounts client-only (useState(null) + useEffect), the same pattern the panel's own "first seen" finding timestamps already used — no render-time new Date() is ever baked into the statically-prerendered server HTML anymore. /console stays statically prerendered (unchanged build output); the debug clock's behavior changes only in that it now updates on mount and on a clock-offset change, not on every incidental re-render — a Date for a debug-only display, never functionally load-bearing. (§1.1 updated with a console-error check.)
  • 2026-10-05 · v1.21 — #139: a profile-field correction now works self-service anywhere between the profile card and the document pull (show_eligible, choose_notice, notice_saved, pre-agree consent) — both "Badlo"/"galat hai" and a typed correction sentence ("meri dob galat hai, 12-03-2000") land back on the profile card instead of "no handler for this input" (§4.10 added; the Known Gaps row from v1.13 removed). identity_card onward is unaffected — its own pre-existing "change" → identity_wrong edge already sent corrections to a guide, by design (§6.49), and this fix reuses that same state-machine on-map mechanism rather than touching it. Flow bumped to v15 (3 new edges, no new states).
  • 2026-10-05 · v1.20 — #87 (CRM slice 2): the guide desk — guide_tickets/guide_ticket_notes now persisted (realtOS's "Option B": the ticket is the incident, signals attach to it), a real /ops/guide (claim, internal note, reply-into-thread which shows up in the candidate's own /console thread via #23's existing poll, resolve/dismiss — resolving a held distress ticket actually resumes the conversation, reusing the existing resolveTicket() rather than reimplementing it) (§12.9 added; Known Gaps rows updated — the event-spine-only persistence gap narrowed now that tickets persist, and a new row for the 5 still-undetected §4.4 kinds). Two real bugs caught before shipping, not after: the in-memory ticket id ("G-1"-style) was never written to the DB's uuid column (new tickets insert without specifying id, letting the DB mint its own); the distress-resume reconstruction initially used an empty entries: [], which would have made the persistence layer's diff re-insert a held conversation's entire history on every resolve — fixed by reconstructing real entries from messages, the same way existing code already does elsewhere.
  • 2026-10-04 · v1.19 — #23: console threads (conversations, messages, cost) now persist to Supabase and survive a reload; every anonymous /console visitor gets their own private copy of each persona via a client-generated localStorage id, so two unrelated visitors never collide (§0.2 corrected, §10.7/§10.8 added). Guide tickets and the event spine deliberately still reset on reload — that's #87's job, not retrofitted here (Known Gaps row updated). Found and fixed live, the hard way, during this ticket's own verification (not left as silent gaps): Entry.at is a display string, not a timestamp, and broke a raw DB write; a message-insert failure could desync a conversation's snapshot from its actual messages; the opening greeting was dropped from persistence on a fresh conversation AND again after a reset; an un-percent-encoded + in a synthetic phone silently became a space in every query string. Also filed (not fixed, pre-existing, unrelated to #23): #148, a React hydration-mismatch console error on every /console load, traced to the Debugger panel's clock reading the real clock during a statically-prerendered render.
  • 2026-10-04 · v1.18 — #13 fully closed out: the founder completed all three manual setup steps and a real Google sign-in, confirmed live end to end — /ops 404s signed out and works signed in as an allowlisted account, ops_users.is_ops = true confirmed in the DB. The Known Gaps row from v1.17 is removed (no longer a gap); §12.8's note updated to reflect the completed verification.
  • 2026-10-02 · v1.17 — #13: gate /ops with Google OAuth + a Supabase-held email allowlist (ported from the sibling realtOS repo's own ops_allowlist/is_ops pattern) — /ops and /ops/funnel 404 for a signed-out request; RLS turned on (no policies yet) for the 12 pre-existing tables as a zero-risk bundled fix (§12.5/12.7/12.8 updated or added; the Known Gaps row for the old "publicly reachable" state replaced with one for the three manual founder-only setup steps still pending — a Google Cloud OAuth client, the Supabase Auth provider toggle, and SUPABASE_SERVICE_ROLE_KEY in Vercel).
  • 2026-10-01 · v1.16 — #86 (CRM slice 1): the funnel lens at /ops/funnel — 8-stage conversion (registered → … → retained) and "the five stalls" (leak map), derived purely from the domain event spine (#85) of a synthetic, deterministic 9-lead cohort driven through the real reply() engine (§12.7 added; a Known Gaps row for the three honest departures — the build-time/non-live snapshot, the Retained proxy, and the omitted Credentialed/Advocate stages).
  • 2026-09-30 · v1.15 — #63: three more debugger rules — filler-voice (P2), closer-not-acknowledged (P2, which came with an actual fix: a closer now gets a warm reply instead of the stale "no handler" note), and cost-over-budget (P2, gated at ≥10 turns to avoid judging a naturally volatile short conversation) (§7.25–7.26 added; a Known Gaps row for the two rules still not built — no-next-step, unconfirmed-commit — both need more design thought to avoid false-positiving good copy).
  • 2026-09-30 · v1.14 — #62 (F14): a live per-conversation Cost panel — total ₹, a service/utility breakdown, a ₹/10-turns projection (§7.24 added; a Known Gaps row replaces the stale "not built" one — LLM/STT always read ₹0 since neither is wired in yet). Measured a real, already-flagged gap: the step-by-step arrive→eligible-list path projects to ₹2.71/10 turns, over the ≤₹2.5 target.
  • 2026-09-29 · v1.13 — new Known Gaps row: a profile-field correction (DOB etc.) is unhandled between the profile card and the identity card — found by inspection, reproduced, filed as #139, not fixed yet.
  • 2026-09-29 · v1.12 — #61 (F2): the fake-notice checker — Tracked-unpublished / Old / Not found, deterministic, from any state (§7.23 added; a new Known Gaps row — no "Verified" outcome is demonstrable yet, same root cause as F8's missing real deadline).
  • 2026-09-29 · v1.11 — #132 (F8b): remind/stop opt-in, a labelled test deadline for SSC GD 2027, T-7/T-3/T-1 delivery (§7.22 added; gaps row narrowed — reminders now wired, just not proactively taught).
  • 2026-09-28 · v1.10 — #133 (F8a): the due-reminder engine + the Debugger's clock control (§7.21 added; §7.16 now testable live; gaps updated).
  • 2026-09-28 · v1.9 — #60: the daily check-in (§7.13–7.20 added, gaps updated; deadline reminders F8 scoped out as a separate ticket).
  • 2026-09-28 · v1.8 — 59.3b: the packet — #59 guided apply done end to end (§6.44 rewritten, §6.52–6.58 added, §7.12/gaps updated).
  • 2026-09-27 · v1.7 — 59.3a: the review card (§6.35 note, §6.43–6.51 added, §7.12/gaps updated).
  • 2026-09-26 · v1.6 — 59.2d: the signature card + photo coaching (§6.32 note, §6.38–6.42 added, gaps updated).
  • 2026-09-25 · v1.5 — 59.2c-2: exam centres and force preferences (§6.27/6.28/6.31 updated, §6.34–6.37 added).
  • 2026-09-25 · v1.4 — 59.2c-1: domicile, exam language, job-info consent (§6.22 updated, §6.27–6.33 added, §7.12 updated).
  • 2026-09-25 · v1.3 — 59.2b: the claims card (§6.17 rewritten, §6.21–6.26 added, §7.12 updated).
  • 2026-09-25 · v1.2 — 59.2a: the identity card (§6.11 updated, §6.16–6.20 added, §7.12 updated).
  • 2026-09-25 · v1.1 — 59.1: consent notice + mock DigiLocker (§6.3 rewritten, §6.10–6.15 added, §7.12 updated).
  • 2026-09-25 · v1 — first plan: sections 1–14 for the console as of #57 (arrival, the four questions, smart capture, the profile card, eligibility, choose a form, commands, distress, repair, numbers, debugger and events, design pages, voice, invariants).