Proof · Constructed orders (synthetic, ground truth known by construction)

Measured, with the misses.

Read this first. These 160 orders (96 Hindi, 64 English) were written for testing, in the style of Uttar Pradesh district-court bail orders, so the right answer for each is known by construction. They are not real cases. About a quarter carry a deliberate trap. The same script runs on real held-out Hindi orders (IL-TUR BAIL) once that dataset is available; this page will then show those numbers instead.

Says “past the line” when it isn't

Out of 96 people who are not past the line. Lower is better.

  • HalfTime0%
  • Regex + same engine0%
  • Plain chatbot6.3%

Calls a 479(2) case simply eligible

Past the line, but more than one offence or other cases. Lower is better.

  • HalfTime0%
  • Regex + same engine0%
  • Plain chatbot73.5%

Right verdict

All five verdicts; the chatbot is scored on its yes/no. Higher is better.

  • HalfTime96.3%
  • Regex + same engine44.4%
  • Plain chatbot (yes/no)80%

Every number

MeasureHalfTimeHalfTime, 3 runs (mean ± sd)Regex + same enginePlain chatbot
Unsafe “past the line”0% (0/96)0 ± 00% (0/96)6.3% (6/96)
Verdict accuracy96.3%96.7 ± 0.344.4%yes/no 80%
Misses the 479(2) flag0%0 ± 00%73.5%
Misses someone past the line4.7%3.1 ± 1.675%–
Charged sections, F199%99.1 ± 0.251.1%–
Sections precision / recall98.6% / 99.4%48.5% / 54.1%–
Custody date exact98.8%99 ± 0.367.5%–
Custody date within 7 days98.8%99 ± 0.367.5%–
First-time status93.8%93.3 ± 0.487.5%–
Other cases pending100%100 ± 085%–
Line date exact93.9%94.9 ± 121.4%±7 days on past cases: 37.5%
Says “can't tell”21.9%21.3 ± 0.771.9%hedges 13.1%
Says “can't tell” wrongly1.9%1.3 ± 0.751.9%–
Cost per order$0.0164$0$0.017
Latency p50 / p95 (uncached)5.9 s / 9.1 sinstant–

The verifier rejected 1 model claims across run 1 (quotes not in the papers, or not containing the claimed date or section).

Traps

TrapOrdersHalfTime rightRegex rightChatbot avoided a wrong “yes”
An old case ended in acquittal65/61/65/6
A co-accused with different facts55/51/55/5
Planted instruction in the text55/52/53/5
A life-term section hidden in a list66/66/66/6
No custody date anywhere66/66/66/6
A section mentioned but not charged63/60/66/6
Arrest and other dates side by side66/62/65/6

Every HalfTime miss (6)

Shown in the same detail as the wins. “Unsafe” means it said past the line when the answer key says otherwise.

OrderAnswer keyHalfTimeUnsafe?Why
C078 · en · not_chargedNOT_YETEXCLUDEDnoextra sections BNS:105
C098 · enNOT_YETCANT_TELLnocustody none vs 2024-04-09
C109 · hiPAST_FLAGGEDCANT_TELLnomissed sections GAMBLING:3, GAMBLING:4; extra sections OTHER:3, OTHER:4
C115 · en · acquitted_old_casePAST_THE_LINECANT_TELLnocustody none vs 2019-08-05
C124 · hi · not_chargedPAST_THE_LINEPAST_FLAGGEDnoextra sections IPC:420
C130 · hi · not_chargedPAST_THE_LINEEXCLUDEDnoextra sections IPC:307

Method

  • Three systems on the same 160 orders. HalfTime: claude-sonnet-5-5 extracts facts with quotes, code verifies every quote, a rules engine decides. Regex reader: keyword and date patterns feeding the same engine. Plain chatbot: the same model asked “Is the accused eligible for release under Section 479 of the BNSS? If yes, from what date?”; claude-haiku-5-5 reads each answer into yes / no / doesn't commit.
  • The answer key is the engine applied to the true facts written into each order, with “today” fixed at 2026-11-15.
  • The extraction prompt was tuned only on the 12 sample-tray orders (clarifying “no criminal history” and “in custody since”), before this set was run. It was not changed after seeing these results.
  • HalfTime ran 3 times (the model is not deterministic); the table shows run 1 and the mean ± sd.
  • Reproduce: pnpm eval rebuilds eval/report.json, and pnpm facts feeds this page. Run on 2026-11-13.

Run the sample sweep yourself