Miroojin commited on
Commit
e8fa23d
·
verified ·
1 Parent(s): f4dc660

Publish leaderboard scores for three parametric models (n=190)

Browse files
Files changed (5) hide show
  1. README.md +2 -2
  2. app.js +389 -453
  3. data/samples.json +36 -39
  4. index.html +299 -294
  5. styles.css +662 -949
README.md CHANGED
@@ -4,12 +4,12 @@ emoji: 🌿
4
  colorFrom: green
5
  colorTo: blue
6
  sdk: static
7
- short_description: Indian BFSI QA benchmark — browse all 189 test items
8
  ---
9
 
10
  # BFSI-Bench
11
 
12
- Project page for [`ground-truth/bfsi-bench`](https://huggingface.co/datasets/ground-truth/bfsi-bench): dataset overview, a read-only sample browser, and a leaderboard placeholder.
13
 
14
  Source in the eval repo: `docs/bfsi-bench-space/`.
15
 
 
4
  colorFrom: green
5
  colorTo: blue
6
  sdk: static
7
+ short_description: Indian BFSI QA benchmark — browse all 190 test items
8
  ---
9
 
10
  # BFSI-Bench
11
 
12
+ Project page for [`ground-truth/bfsi-bench`](https://huggingface.co/datasets/ground-truth/bfsi-bench): dataset overview, a read-only sample browser, and a leaderboard.
13
 
14
  Source in the eval repo: `docs/bfsi-bench-space/`.
15
 
app.js CHANGED
@@ -1,480 +1,416 @@
1
- (() => {
2
- const CATS = [
3
- { code: "all", label: "All" },
4
- { code: "BFSI-JUR", label: "Jurisdiction" },
5
- { code: "BFSI-NUM", label: "Numerical" },
6
- { code: "BFSI-TMP", label: "Temporal" },
7
- { code: "BFSI-ADV", label: "Red-team" },
8
- { code: "BFSI-GRD", label: "Grounded" },
9
- ];
10
-
11
- const state = {
12
- items: [],
13
- filtered: [],
14
- currentId: null,
15
- cat: "all",
16
- q: "",
17
- mode: "overview",
18
- };
19
-
20
- const el = {
21
- progress: document.getElementById("progress"),
22
- chips: document.getElementById("cat-chips"),
23
- search: document.getElementById("filter-q"),
24
- queue: document.getElementById("queue"),
25
- empty: document.getElementById("empty-state"),
26
- loadError: document.getElementById("load-error"),
27
- detail: document.getElementById("detail"),
28
- itemId: document.getElementById("item-id"),
29
- itemCat: document.getElementById("item-cat"),
30
- itemQuery: document.getElementById("item-query"),
31
- itemGold: document.getElementById("item-gold"),
32
- itemSources: document.getElementById("item-sources"),
33
- itemNuggets: document.getElementById("item-nuggets"),
34
  itemEvidence: document.getElementById("item-evidence"),
35
- detailPane: document.querySelector(".detail-pane"),
36
- outline: document.getElementById("sample-outline"),
37
- btnPrev: document.getElementById("btn-prev"),
38
- btnNext: document.getElementById("btn-next"),
39
- btnCopy: document.getElementById("btn-copy"),
40
- btnOpen: document.getElementById("btn-open-drawer"),
41
- btnClose: document.getElementById("btn-close-drawer"),
42
- };
43
-
44
  function escapeHtml(s) {
45
- return String(s ?? "")
46
- .replace(/&/g, "&")
47
- .replace(/</g, "&lt;")
48
- .replace(/>/g, "&gt;")
49
- .replace(/"/g, "&quot;");
50
  }
51
 
52
- const SAMPLE_SECTIONS = [
53
- "sample-question",
54
- "sample-answer",
55
- "sample-sources",
56
- "sample-facts",
57
- "sample-evidence",
58
- ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
 
60
- function setActiveSection(id) {
61
- if (!el.outline) return;
62
- el.outline.querySelectorAll("button[data-section]").forEach((btn) => {
63
- const active = btn.dataset.section === id;
64
- btn.classList.toggle("active", active);
65
- if (active) btn.setAttribute("aria-current", "true");
66
- else btn.removeAttribute("aria-current");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  }
69
 
70
- function updateActiveSection() {
71
- if (!el.detailPane || el.detail.hidden) return;
72
- if (el.detailPane.scrollTop + el.detailPane.clientHeight >= el.detailPane.scrollHeight - 4) {
73
- setActiveSection(SAMPLE_SECTIONS[SAMPLE_SECTIONS.length - 1]);
74
  return;
75
  }
76
- const paneTop = el.detailPane.getBoundingClientRect().top;
77
- let active = SAMPLE_SECTIONS[0];
78
- for (const id of SAMPLE_SECTIONS) {
79
- const section = document.getElementById(id);
80
- if (section && section.getBoundingClientRect().top - paneTop <= 150) active = id;
81
- else break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  }
83
- setActiveSection(active);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  }
85
-
86
- function parseHash() {
87
- const raw = (window.location.hash || "").replace(/^#/, "");
88
- if (!raw) return { mode: "overview", id: null };
89
- if (raw.startsWith("sample/")) {
90
- return { mode: "samples", id: decodeURIComponent(raw.slice("sample/".length)) };
91
- }
92
- if (raw === "samples") return { mode: "samples", id: null };
93
- if (raw === "leaderboard") return { mode: "leaderboard", id: null };
94
- if (raw === "overview") return { mode: "overview", id: null };
95
- return { mode: "overview", id: null };
96
- }
97
-
98
- function writeHash() {
99
- let next = state.mode;
100
- if (state.mode === "samples" && state.currentId) {
101
- next = `sample/${encodeURIComponent(state.currentId)}`;
102
- } else if (state.mode === "samples") {
103
- next = "samples";
104
- }
105
- const hash = `#${next}`;
106
- if (window.location.hash !== hash) {
107
- history.replaceState(null, "", hash);
108
- }
109
- }
110
-
111
- function setMode(mode, { fromHash = false } = {}) {
112
- state.mode = mode;
113
- document.querySelectorAll(".mode").forEach((btn) => {
114
- const on = btn.dataset.mode === mode;
115
- btn.classList.toggle("active", on);
116
- btn.setAttribute("aria-selected", on ? "true" : "false");
117
- });
118
- document.querySelectorAll(".mode-panel").forEach((panel) => {
119
- const on = panel.id === `mode-${mode}`;
120
- panel.classList.toggle("active", on);
121
- panel.hidden = !on;
122
- });
123
- document.body.classList.toggle("is-explorer", mode === "samples");
124
- document.body.classList.remove("drawer-open");
125
- if (!fromHash) writeHash();
126
- }
127
-
128
- function applyFromHash() {
129
- const { mode, id } = parseHash();
130
- setMode(mode, { fromHash: true });
131
- if (mode === "samples" && id) {
132
- state.currentId = id;
133
- if (state.items.length) selectId(id, { skipHash: true });
134
- }
135
- }
136
-
137
- function catLabel(code) {
138
- const hit = CATS.find((c) => c.code === code);
139
- return hit ? hit.label : code;
140
- }
141
-
142
- function haystack(item) {
143
- const parts = [
144
- item.id,
145
- item.category,
146
- item.category_code,
147
- item.query,
148
- item.gold_answer,
149
- ];
150
- for (const s of item.sources || []) {
151
- parts.push(s.url, s.note, s.published_date);
152
- }
153
- for (const e of item.evidence || []) {
154
- parts.push(e.url, e.title, e.quote);
155
- }
156
- for (const n of item.gold_nuggets || []) {
157
- parts.push(n.id, n.text, n.evidence_quote);
158
- }
159
- return parts.filter(Boolean).join("\n").toLowerCase();
160
- }
161
-
162
- function applyFilters() {
163
- const q = state.q.trim().toLowerCase();
164
- state.filtered = state.items.filter((it) => {
165
- if (state.cat !== "all" && it.category_code !== state.cat) return false;
166
- if (q && !haystack(it).includes(q)) return false;
167
- return true;
168
- });
169
- renderProgress();
170
- renderQueue();
171
- }
172
-
173
- function catCounts() {
174
- const counts = { all: state.items.length };
175
- for (const it of state.items) {
176
- counts[it.category_code] = (counts[it.category_code] || 0) + 1;
177
- }
178
- return counts;
179
- }
180
-
181
- function renderChips() {
182
- const counts = catCounts();
183
- el.chips.innerHTML = CATS.map((c) => {
184
- const n = counts[c.code] ?? 0;
185
- const on = state.cat === c.code ? " is-on" : "";
186
- return `<button type="button" class="${on}" data-cat="${c.code}">${escapeHtml(
187
- c.label
188
- )} <span class="chip-count">${n}</span></button>`;
189
- }).join("");
190
- }
191
-
192
- function renderProgress() {
193
- const total = state.items.length;
194
- el.progress.textContent = `${state.filtered.length} of ${total}`;
195
- }
196
-
197
- function renderQueue() {
198
- if (!state.filtered.length) {
199
- el.queue.innerHTML = `<li class="empty-queue"><p class="empty" style="margin:0.6rem 0.85rem">No matches.</p></li>`;
200
- return;
201
- }
202
- el.queue.innerHTML = state.filtered
203
- .map((it) => {
204
- const active = it.id === state.currentId ? " active" : "";
205
- return `<li>
206
- <button type="button" class="${active}" data-id="${escapeHtml(it.id)}">
207
- <span class="qid">${escapeHtml(it.id)}</span>
208
- <span class="qtext">${escapeHtml(it.query)}</span>
209
- <span class="qmeta"><span class="pill ${escapeHtml(it.category_code)}">${escapeHtml(
210
- catLabel(it.category_code)
211
- )}</span></span>
212
- </button>
213
- </li>`;
214
- })
215
- .join("");
216
- }
217
-
218
- function renderSources(sources) {
219
- if (!sources || !sources.length) {
220
- el.itemSources.innerHTML = "<li><em>No sources</em></li>";
221
- return;
222
- }
223
- el.itemSources.innerHTML = sources
224
- .map((s) => {
225
- const url = s.url || "";
226
- const note = s.note || "";
227
- const date = s.published_date || "";
228
- const link = url
229
- ? `<a href="${escapeHtml(url)}" target="_blank" rel="noopener noreferrer">${escapeHtml(url)}</a>`
230
- : "<em>No URL</em>";
231
- return `<li>${link}${note ? `<span class="note">${escapeHtml(note)}</span>` : ""}${
232
- date ? `<span class="date">${escapeHtml(date)}</span>` : ""
233
- }</li>`;
234
- })
235
- .join("");
236
- }
237
-
238
- function renderNuggets(nuggets) {
239
- if (!nuggets || !nuggets.length) {
240
- el.itemNuggets.innerHTML = "<p><em>No gold nuggets</em></p>";
241
- return;
242
- }
243
- el.itemNuggets.innerHTML = nuggets
244
- .map((n) => {
245
- const vital = n.vital ? `<span class="vital">Required</span>` : "";
246
- const quote = n.evidence_quote
247
- ? `<p class="nugget-quote">${escapeHtml(n.evidence_quote)}</p>`
248
- : "";
249
- return `<article class="nugget">
250
- <div class="nugget-head">
251
- <span class="nugget-id">${escapeHtml(n.id || "")}</span>
252
- ${vital}
253
- </div>
254
- <p class="nugget-text">${escapeHtml(n.text || "")}</p>
255
- ${quote}
256
- </article>`;
257
- })
258
- .join("");
259
- }
260
-
261
- function renderEvidence(evidence) {
262
- if (!evidence || !evidence.length) {
263
- el.itemEvidence.innerHTML = "<p><em>No evidence quotes</em></p>";
264
- return;
265
- }
266
- el.itemEvidence.innerHTML = evidence
267
- .map((e) => {
268
- const href = e.url || "";
269
- const heading = href
270
- ? `<a href="${escapeHtml(href)}" target="_blank" rel="noopener noreferrer">${escapeHtml(href)}</a>`
271
- : escapeHtml(e.title || "No URL");
272
- const quote = e.quote || "";
273
- const ctx = e.context || "";
274
- const kind = e.kind || "";
275
- const ctxBlock =
276
- ctx && ctx !== quote
277
- ? `<details class="ev-ctx-wrap"><summary>Surrounding context</summary>
278
- <div class="ev-ctx">${escapeHtml(ctx)}</div></details>`
279
- : "";
280
- return `<article class="ev-item">
281
- <div class="ev-title">${heading}</div>
282
- <div class="ev-quote">${escapeHtml(quote)}</div>
283
- ${ctxBlock}
284
- ${kind ? `<div class="ev-meta">${escapeHtml(kind)}</div>` : ""}
285
- </article>`;
286
- })
287
- .join("");
288
- }
289
-
290
  function renderDetail(item) {
291
- el.empty.hidden = true;
292
- el.loadError.hidden = true;
293
- el.detail.hidden = false;
294
- el.itemId.textContent = item.id;
295
- el.itemCat.textContent = item.category_code;
296
- el.itemCat.className = `pill ${item.category_code}`;
297
- el.itemQuery.textContent = item.query || "";
298
- el.itemGold.textContent = item.gold_answer || "";
299
  renderSources(item.sources);
300
  renderNuggets(item.gold_nuggets);
301
  renderEvidence(item.evidence);
302
- el.detailPane.scrollTo({ top: 0, behavior: "auto" });
303
- setActiveSection(SAMPLE_SECTIONS[0]);
304
- const active = el.queue.querySelector("button.active");
305
- if (active) active.classList.remove("active");
306
- const btn = el.queue.querySelector(`button[data-id="${CSS.escape(item.id)}"]`);
307
- if (btn) {
308
- btn.classList.add("active");
309
- btn.scrollIntoView({ block: "nearest" });
310
- }
311
- }
312
-
313
- function selectId(id, { skipHash = false } = {}) {
314
- const item = state.items.find((it) => it.id === id);
315
- if (!item) {
316
- el.detail.hidden = true;
317
- el.empty.hidden = false;
318
- el.empty.textContent = id ? `Sample ${id} was not found.` : "Select a sample from the list.";
319
- return;
320
- }
321
- state.currentId = id;
322
- if (!state.filtered.some((it) => it.id === id)) {
323
- state.cat = "all";
324
- state.q = "";
325
- el.search.value = "";
326
- renderChips();
327
- applyFilters();
328
- }
329
- renderDetail(item);
330
- document.body.classList.remove("drawer-open");
331
- if (!skipHash) {
332
- setMode("samples", { fromHash: true });
333
- writeHash();
334
- }
335
- }
336
-
337
- function step(delta) {
338
- if (!state.filtered.length) return;
339
- let idx = state.filtered.findIndex((it) => it.id === state.currentId);
340
- if (idx < 0) idx = 0;
341
- else idx = Math.max(0, Math.min(state.filtered.length - 1, idx + delta));
342
- selectId(state.filtered[idx].id);
343
- }
344
-
345
- async function copyLink() {
346
- const url = `${window.location.origin}${window.location.pathname}#sample/${encodeURIComponent(
347
- state.currentId || ""
348
- )}`;
349
- try {
350
- await navigator.clipboard.writeText(url);
351
- el.btnCopy.textContent = "Copied";
352
- setTimeout(() => {
353
- el.btnCopy.textContent = "Copy link";
354
- }, 1200);
355
- } catch {
356
- el.btnCopy.textContent = "Copy failed";
357
- setTimeout(() => {
358
- el.btnCopy.textContent = "Copy link";
359
- }, 1200);
360
- }
361
- }
362
-
363
- function wire() {
364
- document.querySelectorAll(".mode").forEach((btn) => {
365
- btn.addEventListener("click", () => {
366
- const mode = btn.dataset.mode;
367
- if (mode === "samples") {
368
- setMode("samples");
369
- if (state.currentId) selectId(state.currentId);
370
- else if (state.filtered[0]) selectId(state.filtered[0].id);
371
- else writeHash();
372
- } else {
373
- setMode(mode);
374
- }
375
- });
376
- });
377
-
378
  document.querySelectorAll("[data-goto]").forEach((btn) => {
379
  btn.addEventListener("click", () => {
380
  const mode = btn.dataset.goto;
381
- const targetCat = btn.dataset.catTarget;
382
- if (targetCat) {
383
- state.cat = targetCat;
384
- state.q = "";
385
- el.search.value = "";
386
- renderChips();
387
- applyFilters();
388
- }
389
  setMode(mode);
390
  if (mode === "samples" && state.filtered[0]) selectId(state.filtered[0].id);
391
  });
392
- });
393
-
394
- el.chips.addEventListener("click", (e) => {
395
- const btn = e.target.closest("button[data-cat]");
396
- if (!btn) return;
397
- state.cat = btn.dataset.cat;
398
- renderChips();
399
- applyFilters();
400
- });
401
-
402
- el.search.addEventListener("input", () => {
403
- state.q = el.search.value;
404
- applyFilters();
405
- });
406
-
407
- el.queue.addEventListener("click", (e) => {
408
- const btn = e.target.closest("button[data-id]");
409
- if (!btn) return;
410
- selectId(btn.dataset.id);
411
- });
412
-
413
- el.btnPrev.addEventListener("click", () => step(-1));
414
- el.btnNext.addEventListener("click", () => step(1));
415
- el.btnCopy.addEventListener("click", copyLink);
416
- el.btnOpen.addEventListener("click", () => document.body.classList.add("drawer-open"));
417
- el.btnClose.addEventListener("click", () => document.body.classList.remove("drawer-open"));
418
 
419
- el.outline.addEventListener("click", (e) => {
420
- const btn = e.target.closest("button[data-section]");
421
  if (!btn) return;
422
- const section = document.getElementById(btn.dataset.section);
423
- if (!section) return;
424
- setActiveSection(btn.dataset.section);
425
- section.scrollIntoView({ behavior: "smooth", block: "start" });
426
  });
427
 
428
- let sectionScrollFrame = 0;
429
- el.detailPane.addEventListener("scroll", () => {
430
- if (sectionScrollFrame) return;
431
- sectionScrollFrame = requestAnimationFrame(() => {
432
- sectionScrollFrame = 0;
433
- updateActiveSection();
434
- });
 
 
435
  });
436
-
437
- document.addEventListener("keydown", (e) => {
438
- if (state.mode !== "samples") return;
439
- const tag = (e.target && e.target.tagName) || "";
440
- if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return;
441
- if (e.key === "j") {
442
- e.preventDefault();
443
- step(1);
444
- } else if (e.key === "k") {
445
- e.preventDefault();
446
- step(-1);
447
- }
448
- });
449
-
450
- window.addEventListener("hashchange", applyFromHash);
451
- }
452
-
453
- async function load() {
454
- try {
455
- const res = await fetch("./data/samples.json");
456
- if (!res.ok) throw new Error(`Could not load samples.json (${res.status})`);
457
- const data = await res.json();
458
- state.items = Array.isArray(data.items) ? data.items : [];
459
- renderChips();
460
- applyFilters();
461
- const { mode, id } = parseHash();
462
- if (mode === "samples") {
463
- setMode("samples", { fromHash: true });
464
- if (id) selectId(id, { skipHash: true });
465
- else if (state.filtered[0]) selectId(state.filtered[0].id);
466
- } else {
467
- setMode(mode, { fromHash: true });
468
- }
469
- } catch (err) {
470
- el.loadError.hidden = false;
471
- el.loadError.textContent = err.message || String(err);
472
- el.empty.hidden = true;
473
- el.progress.textContent = "Failed to load";
474
- }
475
- }
476
-
477
- wire();
478
- applyFromHash();
479
- load();
480
- })();
 
 
 
 
 
 
 
1
+ (() => {
2
+ const CATS = [
3
+ { code: "all", label: "All" },
4
+ { code: "BFSI-JUR", label: "Jurisdiction" },
5
+ { code: "BFSI-NUM", label: "Numerical" },
6
+ { code: "BFSI-TMP", label: "Temporal" },
7
+ { code: "BFSI-ADV", label: "Red-team" },
8
+ { code: "BFSI-GRD", label: "Grounded" },
9
+ ];
10
+
11
+ const state = {
12
+ items: [],
13
+ filtered: [],
14
+ currentId: null,
15
+ cat: "all",
16
+ q: "",
17
+ mode: "overview",
18
+ };
19
+
20
+ const el = {
21
+ progress: document.getElementById("progress"),
22
+ chips: document.getElementById("cat-chips"),
23
+ search: document.getElementById("filter-q"),
24
+ queue: document.getElementById("queue"),
25
+ empty: document.getElementById("empty-state"),
26
+ loadError: document.getElementById("load-error"),
27
+ detail: document.getElementById("detail"),
28
+ itemId: document.getElementById("item-id"),
29
+ itemCat: document.getElementById("item-cat"),
30
+ itemQuery: document.getElementById("item-query"),
31
+ itemGold: document.getElementById("item-gold"),
32
+ itemSources: document.getElementById("item-sources"),
33
+ itemNuggets: document.getElementById("item-nuggets"),
34
  itemEvidence: document.getElementById("item-evidence"),
35
+ btnPrev: document.getElementById("btn-prev"),
36
+ btnNext: document.getElementById("btn-next"),
37
+ btnCopy: document.getElementById("btn-copy"),
38
+ btnOpen: document.getElementById("btn-open-drawer"),
39
+ btnClose: document.getElementById("btn-close-drawer"),
40
+ };
41
+
 
 
42
  function escapeHtml(s) {
43
+ return String(s ?? "")
44
+ .replace(/&/g, "&amp;")
45
+ .replace(/</g, "&lt;")
46
+ .replace(/>/g, "&gt;")
47
+ .replace(/"/g, "&quot;");
48
  }
49
 
50
+ function parseHash() {
51
+ const raw = (window.location.hash || "").replace(/^#/, "");
52
+ if (!raw) return { mode: "overview", id: null };
53
+ if (raw.startsWith("sample/")) {
54
+ return { mode: "samples", id: decodeURIComponent(raw.slice("sample/".length)) };
55
+ }
56
+ if (raw === "samples") return { mode: "samples", id: null };
57
+ if (raw === "leaderboard") return { mode: "leaderboard", id: null };
58
+ if (raw === "overview") return { mode: "overview", id: null };
59
+ return { mode: "overview", id: null };
60
+ }
61
+
62
+ function writeHash() {
63
+ let next = state.mode;
64
+ if (state.mode === "samples" && state.currentId) {
65
+ next = `sample/${encodeURIComponent(state.currentId)}`;
66
+ } else if (state.mode === "samples") {
67
+ next = "samples";
68
+ }
69
+ const hash = `#${next}`;
70
+ if (window.location.hash !== hash) {
71
+ history.replaceState(null, "", hash);
72
+ }
73
+ }
74
+
75
+ function setMode(mode, { fromHash = false } = {}) {
76
+ state.mode = mode;
77
+ document.querySelectorAll(".mode").forEach((btn) => {
78
+ const on = btn.dataset.mode === mode;
79
+ btn.classList.toggle("active", on);
80
+ btn.setAttribute("aria-selected", on ? "true" : "false");
81
+ });
82
+ document.querySelectorAll(".mode-panel").forEach((panel) => {
83
+ const on = panel.id === `mode-${mode}`;
84
+ panel.classList.toggle("active", on);
85
+ panel.hidden = !on;
86
+ });
87
+ document.body.classList.toggle("is-explorer", mode === "samples");
88
+ document.body.classList.remove("drawer-open");
89
+ if (!fromHash) writeHash();
90
+ }
91
+
92
+ function applyFromHash() {
93
+ const { mode, id } = parseHash();
94
+ setMode(mode, { fromHash: true });
95
+ if (mode === "samples" && id) {
96
+ state.currentId = id;
97
+ if (state.items.length) selectId(id, { skipHash: true });
98
+ }
99
+ }
100
+
101
+ function catLabel(code) {
102
+ const hit = CATS.find((c) => c.code === code);
103
+ return hit ? hit.label : code;
104
+ }
105
 
106
+ function haystack(item) {
107
+ const parts = [
108
+ item.id,
109
+ item.category,
110
+ item.category_code,
111
+ item.query,
112
+ item.gold_answer,
113
+ ];
114
+ for (const s of item.sources || []) {
115
+ parts.push(s.url, s.note, s.published_date);
116
+ }
117
+ for (const e of item.evidence || []) {
118
+ parts.push(e.url, e.title, e.quote);
119
+ }
120
+ for (const n of item.gold_nuggets || []) {
121
+ parts.push(n.id, n.text, n.evidence_quote);
122
+ }
123
+ return parts.filter(Boolean).join("\n").toLowerCase();
124
+ }
125
+
126
+ function applyFilters() {
127
+ const q = state.q.trim().toLowerCase();
128
+ state.filtered = state.items.filter((it) => {
129
+ if (state.cat !== "all" && it.category_code !== state.cat) return false;
130
+ if (q && !haystack(it).includes(q)) return false;
131
+ return true;
132
  });
133
+ renderProgress();
134
+ renderQueue();
135
+ }
136
+
137
+ function catCounts() {
138
+ const counts = { all: state.items.length };
139
+ for (const it of state.items) {
140
+ counts[it.category_code] = (counts[it.category_code] || 0) + 1;
141
+ }
142
+ return counts;
143
+ }
144
+
145
+ function renderChips() {
146
+ const counts = catCounts();
147
+ el.chips.innerHTML = CATS.map((c) => {
148
+ const n = counts[c.code] ?? 0;
149
+ const on = state.cat === c.code ? " is-on" : "";
150
+ return `<button type="button" class="${on}" data-cat="${c.code}">${escapeHtml(
151
+ c.label
152
+ )} <span class="chip-count">${n}</span></button>`;
153
+ }).join("");
154
+ }
155
+
156
+ function renderProgress() {
157
+ const total = state.items.length;
158
+ el.progress.textContent = `${state.filtered.length} of ${total}`;
159
+ }
160
+
161
+ function renderQueue() {
162
+ if (!state.filtered.length) {
163
+ el.queue.innerHTML = `<li class="empty-queue"><p class="empty" style="margin:0.6rem 0.85rem">No matches.</p></li>`;
164
+ return;
165
+ }
166
+ el.queue.innerHTML = state.filtered
167
+ .map((it) => {
168
+ const active = it.id === state.currentId ? " active" : "";
169
+ return `<li>
170
+ <button type="button" class="${active}" data-id="${escapeHtml(it.id)}">
171
+ <span class="qid">${escapeHtml(it.id)}</span>
172
+ <span class="qtext">${escapeHtml(it.query)}</span>
173
+ <span class="qmeta"><span class="pill ${escapeHtml(it.category_code)}">${escapeHtml(
174
+ catLabel(it.category_code)
175
+ )}</span></span>
176
+ </button>
177
+ </li>`;
178
+ })
179
+ .join("");
180
+ }
181
+
182
+ function renderSources(sources) {
183
+ if (!sources || !sources.length) {
184
+ el.itemSources.innerHTML = "<li><em>No sources</em></li>";
185
+ return;
186
+ }
187
+ el.itemSources.innerHTML = sources
188
+ .map((s) => {
189
+ const url = s.url || "";
190
+ const note = s.note || "";
191
+ const date = s.published_date || "";
192
+ const link = url
193
+ ? `<a href="${escapeHtml(url)}" target="_blank" rel="noopener noreferrer">${escapeHtml(url)}</a>`
194
+ : "<em>No URL</em>";
195
+ return `<li>${link}${note ? `<span class="note">${escapeHtml(note)}</span>` : ""}${
196
+ date ? `<span class="date">${escapeHtml(date)}</span>` : ""
197
+ }</li>`;
198
+ })
199
+ .join("");
200
  }
201
 
202
+ function renderNuggets(nuggets) {
203
+ if (!nuggets || !nuggets.length) {
204
+ el.itemNuggets.innerHTML = "<p><em>No gold nuggets</em></p>";
 
205
  return;
206
  }
207
+ el.itemNuggets.innerHTML = nuggets
208
+ .map((n) => {
209
+ const vital = n.vital ? `<span class="vital">Required</span>` : "";
210
+ const quote = n.evidence_quote
211
+ ? `<p class="nugget-quote">${escapeHtml(n.evidence_quote)}</p>`
212
+ : "";
213
+ return `<article class="nugget">
214
+ <div class="nugget-head">
215
+ <span class="nugget-id">${escapeHtml(n.id || "")}</span>
216
+ ${vital}
217
+ </div>
218
+ <p class="nugget-text">${escapeHtml(n.text || "")}</p>
219
+ ${quote}
220
+ </article>`;
221
+ })
222
+ .join("");
223
+ }
224
+
225
+ function renderEvidence(evidence) {
226
+ if (!evidence || !evidence.length) {
227
+ el.itemEvidence.innerHTML = "<p><em>No evidence quotes</em></p>";
228
+ return;
229
  }
230
+ el.itemEvidence.innerHTML = evidence
231
+ .map((e) => {
232
+ const href = e.url || "";
233
+ const heading = href
234
+ ? `<a href="${escapeHtml(href)}" target="_blank" rel="noopener noreferrer">${escapeHtml(href)}</a>`
235
+ : escapeHtml(e.title || "No URL");
236
+ const quote = e.quote || "";
237
+ const ctx = e.context || "";
238
+ const kind = e.kind || "";
239
+ const ctxBlock =
240
+ ctx && ctx !== quote
241
+ ? `<details class="ev-ctx-wrap"><summary>Surrounding context</summary>
242
+ <div class="ev-ctx">${escapeHtml(ctx)}</div></details>`
243
+ : "";
244
+ return `<article class="ev-item">
245
+ <div class="ev-title">${heading}</div>
246
+ <div class="ev-quote">${escapeHtml(quote)}</div>
247
+ ${ctxBlock}
248
+ ${kind ? `<div class="ev-meta">${escapeHtml(kind)}</div>` : ""}
249
+ </article>`;
250
+ })
251
+ .join("");
252
  }
253
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  function renderDetail(item) {
255
+ el.empty.hidden = true;
256
+ el.loadError.hidden = true;
257
+ el.detail.hidden = false;
258
+ el.itemId.textContent = item.id;
259
+ el.itemCat.textContent = item.category_code;
260
+ el.itemCat.className = `pill ${item.category_code}`;
261
+ el.itemQuery.textContent = item.query || "";
262
+ el.itemGold.textContent = item.gold_answer || "";
263
  renderSources(item.sources);
264
  renderNuggets(item.gold_nuggets);
265
  renderEvidence(item.evidence);
266
+ const active = el.queue.querySelector("button.active");
267
+ if (active) active.classList.remove("active");
268
+ const btn = el.queue.querySelector(`button[data-id="${CSS.escape(item.id)}"]`);
269
+ if (btn) {
270
+ btn.classList.add("active");
271
+ btn.scrollIntoView({ block: "nearest" });
272
+ }
273
+ }
274
+
275
+ function selectId(id, { skipHash = false } = {}) {
276
+ const item = state.items.find((it) => it.id === id);
277
+ if (!item) {
278
+ el.detail.hidden = true;
279
+ el.empty.hidden = false;
280
+ el.empty.textContent = id ? `Sample ${id} was not found.` : "Select a sample from the list.";
281
+ return;
282
+ }
283
+ state.currentId = id;
284
+ if (!state.filtered.some((it) => it.id === id)) {
285
+ state.cat = "all";
286
+ state.q = "";
287
+ el.search.value = "";
288
+ renderChips();
289
+ applyFilters();
290
+ }
291
+ renderDetail(item);
292
+ document.body.classList.remove("drawer-open");
293
+ if (!skipHash) {
294
+ setMode("samples", { fromHash: true });
295
+ writeHash();
296
+ }
297
+ }
298
+
299
+ function step(delta) {
300
+ if (!state.filtered.length) return;
301
+ let idx = state.filtered.findIndex((it) => it.id === state.currentId);
302
+ if (idx < 0) idx = 0;
303
+ else idx = Math.max(0, Math.min(state.filtered.length - 1, idx + delta));
304
+ selectId(state.filtered[idx].id);
305
+ }
306
+
307
+ async function copyLink() {
308
+ const url = `${window.location.origin}${window.location.pathname}#sample/${encodeURIComponent(
309
+ state.currentId || ""
310
+ )}`;
311
+ try {
312
+ await navigator.clipboard.writeText(url);
313
+ el.btnCopy.textContent = "Copied";
314
+ setTimeout(() => {
315
+ el.btnCopy.textContent = "Copy link";
316
+ }, 1200);
317
+ } catch {
318
+ el.btnCopy.textContent = "Copy failed";
319
+ setTimeout(() => {
320
+ el.btnCopy.textContent = "Copy link";
321
+ }, 1200);
322
+ }
323
+ }
324
+
325
+ function wire() {
326
+ document.querySelectorAll(".mode").forEach((btn) => {
327
+ btn.addEventListener("click", () => {
328
+ const mode = btn.dataset.mode;
329
+ if (mode === "samples") {
330
+ setMode("samples");
331
+ if (state.currentId) selectId(state.currentId);
332
+ else if (state.filtered[0]) selectId(state.filtered[0].id);
333
+ else writeHash();
334
+ } else {
335
+ setMode(mode);
336
+ }
337
+ });
338
+ });
339
+
 
 
340
  document.querySelectorAll("[data-goto]").forEach((btn) => {
341
  btn.addEventListener("click", () => {
342
  const mode = btn.dataset.goto;
 
 
 
 
 
 
 
 
343
  setMode(mode);
344
  if (mode === "samples" && state.filtered[0]) selectId(state.filtered[0].id);
345
  });
346
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
347
 
348
+ el.chips.addEventListener("click", (e) => {
349
+ const btn = e.target.closest("button[data-cat]");
350
  if (!btn) return;
351
+ state.cat = btn.dataset.cat;
352
+ renderChips();
353
+ applyFilters();
 
354
  });
355
 
356
+ el.search.addEventListener("input", () => {
357
+ state.q = el.search.value;
358
+ applyFilters();
359
+ });
360
+
361
+ el.queue.addEventListener("click", (e) => {
362
+ const btn = e.target.closest("button[data-id]");
363
+ if (!btn) return;
364
+ selectId(btn.dataset.id);
365
  });
366
+
367
+ el.btnPrev.addEventListener("click", () => step(-1));
368
+ el.btnNext.addEventListener("click", () => step(1));
369
+ el.btnCopy.addEventListener("click", copyLink);
370
+ el.btnOpen.addEventListener("click", () => document.body.classList.add("drawer-open"));
371
+ el.btnClose.addEventListener("click", () => document.body.classList.remove("drawer-open"));
372
+
373
+ document.addEventListener("keydown", (e) => {
374
+ if (state.mode !== "samples") return;
375
+ const tag = (e.target && e.target.tagName) || "";
376
+ if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return;
377
+ if (e.key === "j") {
378
+ e.preventDefault();
379
+ step(1);
380
+ } else if (e.key === "k") {
381
+ e.preventDefault();
382
+ step(-1);
383
+ }
384
+ });
385
+
386
+ window.addEventListener("hashchange", applyFromHash);
387
+ }
388
+
389
+ async function load() {
390
+ try {
391
+ const res = await fetch("./data/samples.json");
392
+ if (!res.ok) throw new Error(`Could not load samples.json (${res.status})`);
393
+ const data = await res.json();
394
+ state.items = Array.isArray(data.items) ? data.items : [];
395
+ renderChips();
396
+ applyFilters();
397
+ const { mode, id } = parseHash();
398
+ if (mode === "samples") {
399
+ setMode("samples", { fromHash: true });
400
+ if (id) selectId(id, { skipHash: true });
401
+ else if (state.filtered[0]) selectId(state.filtered[0].id);
402
+ } else {
403
+ setMode(mode, { fromHash: true });
404
+ }
405
+ } catch (err) {
406
+ el.loadError.hidden = false;
407
+ el.loadError.textContent = err.message || String(err);
408
+ el.empty.hidden = true;
409
+ el.progress.textContent = "Failed to load";
410
+ }
411
+ }
412
+
413
+ wire();
414
+ applyFromHash();
415
+ load();
416
+ })();
data/samples.json CHANGED
@@ -1,13 +1,13 @@
1
  {
2
  "dataset": "ground-truth/bfsi-bench",
3
  "split": "test",
4
- "total": 189,
5
  "counts": {
6
  "BFSI-ADV": 29,
7
  "BFSI-GRD": 36,
8
  "BFSI-JUR": 71,
9
  "BFSI-NUM": 36,
10
- "BFSI-TMP": 17
11
  },
12
  "items": [
13
  {
@@ -7227,20 +7227,7 @@
7227
  "kind": "source"
7228
  }
7229
  ],
7230
- "gold_nuggets": [
7231
- {
7232
- "id": "n1",
7233
- "text": "No, the maturity capital-gains exemption does not apply to Sovereign Gold Bonds acquired through transfer or purchase in the secondary market.",
7234
- "vital": true,
7235
- "evidence_quote": "No, the exemption shall not apply to Sovereign Gold Bonds acquired through transfer or purchase in the secondary market"
7236
- },
7237
- {
7238
- "id": "n2",
7239
- "text": "The exemption is available only when an individual subscribes to the Sovereign Gold Bond at the time of original issue and holds it continuously until redemption at maturity.",
7240
- "vital": false,
7241
- "evidence_quote": "exemption from capital gains tax shall be available only where the Sovereign Gold Bond is subscribed to by an individual at the time of original issue and is held continuously until redemption on maturity"
7242
- }
7243
- ]
7244
  },
7245
  {
7246
  "id": "bfsi-tmp-034",
@@ -7385,26 +7372,7 @@
7385
  "kind": "source"
7386
  }
7387
  ],
7388
- "gold_nuggets": [
7389
- {
7390
- "id": "n1",
7391
- "text": "No—the salaried individual would have no income-tax liability at a taxable income of ₹11.5 lakh under the new tax regime.",
7392
- "vital": true,
7393
- "evidence_quote": null
7394
- },
7395
- {
7396
- "id": "n2",
7397
- "text": "Under the new tax regime, the Section 87A rebate makes tax nil on taxable income up to ₹12 lakh.",
7398
- "vital": false,
7399
- "evidence_quote": "the income does not exceed twelve lakh rupees, 100% of the income-tax payable or ` 60000, whichever is less;"
7400
- },
7401
- {
7402
- "id": "n3",
7403
- "text": "For salaried taxpayers, the equivalent threshold is ₹12.75 lakh after the standard deduction.",
7404
- "vital": false,
7405
- "evidence_quote": null
7406
- }
7407
- ]
7408
  },
7409
  {
7410
  "id": "bfsi-tmp-039",
@@ -7483,16 +7451,45 @@
7483
  "kind": "source"
7484
  }
7485
  ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7486
  "gold_nuggets": [
7487
  {
7488
  "id": "n1",
7489
- "text": "Under SEBI’s OBPP framework, the effective minimum investment for listed corporate bonds is ₹10,000, typically the face value of one bond unit.",
7490
  "vital": true,
7491
- "evidence_quote": "at a face value at Rs. Ten Thousand"
7492
  },
7493
  {
7494
  "id": "n2",
7495
- "text": "The applicable minimum can vary by specific bond issue because the face value or unit size is set at issuance.",
 
 
 
 
 
 
7496
  "vital": false,
7497
  "evidence_quote": null
7498
  }
 
1
  {
2
  "dataset": "ground-truth/bfsi-bench",
3
  "split": "test",
4
+ "total": 190,
5
  "counts": {
6
  "BFSI-ADV": 29,
7
  "BFSI-GRD": 36,
8
  "BFSI-JUR": 71,
9
  "BFSI-NUM": 36,
10
+ "BFSI-TMP": 18
11
  },
12
  "items": [
13
  {
 
7227
  "kind": "source"
7228
  }
7229
  ],
7230
+ "gold_nuggets": []
 
 
 
 
 
 
 
 
 
 
 
 
 
7231
  },
7232
  {
7233
  "id": "bfsi-tmp-034",
 
7372
  "kind": "source"
7373
  }
7374
  ],
7375
+ "gold_nuggets": []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7376
  },
7377
  {
7378
  "id": "bfsi-tmp-039",
 
7451
  "kind": "source"
7452
  }
7453
  ],
7454
+ "gold_nuggets": []
7455
+ },
7456
+ {
7457
+ "id": "bfsi-tmp-041",
7458
+ "category": "Temporal Logic",
7459
+ "category_code": "BFSI-TMP",
7460
+ "query": "As a small business owner, I deduct tax at source on payments I make to contractors and professionals. Which section should I be citing on my TDS challans and returns for this?",
7461
+ "gold_answer": "For payments made on or after 1 April 2026, cite Section 393 of the Income Tax Act, 2025, which consolidates the erstwhile TDS provisions (Sections 192 to 196D of the 1961 Act, including Section 194C for contractors and Section 194J for professionals) into a single structured section with sub-clauses covering rates and thresholds for each payment type. TDS rates themselves are unchanged - only the section reference and challan/return codes change.",
7462
+ "sources": [
7463
+ {
7464
+ "url": "https://www.incometaxindia.gov.in/w/section-393-5",
7465
+ "note": null
7466
+ }
7467
+ ],
7468
+ "evidence": [
7469
+ {
7470
+ "url": "https://www.incometaxindia.gov.in/w/section-393-5",
7471
+ "title": "incometaxindia.gov.in/section-393-5",
7472
+ "quote": "Challan-cum-statement of deduction of tax under\n[section 393(1)](https://www.incometaxindia.gov.in/w/section-393-5#)\nof the Income-tax Act 2025 Payments to contractors referred to in section 393(1)[Table: Sl. No. 6(i)] Fees for professional or technical services referred to in section 393(1)[Table: Sl. No. 6(iii)]",
7473
+ "context": "[Advanced Search](https://www.incometaxindia.gov.in/advanced-search)\n2\n\nDue Dates\n\n06 May 2026\n​Due date for deposit of Tax deducted/collected for the month of April, 2026. However, all sum deducted/collected by an office of the government shall be paid to the credit of the Central Government on the same day where tax is paid without production of a challan.\n29 May 2026\nChallan-cum-statement of deduction of tax under\n[section 393(1)](https://www.incometaxindia.gov.in/w/section-393-5#)\nof the Income-tax Act 2025\n[\nTable Sl. No. 2(i), 3(i), 6(ii) & 8(vi) in the month of April, 2026\nGo to Tax Calendar\nMenu\n\\\n\nDue Dates\n\n- [Home](https://www.incometaxindia.gov.in/en/home?doAsUserId=P8dqHo7GMNv%2FXYXPfeJIUA%3D%3D%3FcategoryId%3D10191473%3FcategoryId%3D%3FcategoryId%3D40193%3FcategoryId%3D%3FcategoryId%3D40193%3FcategoryId%3D10191473%3FcategoryId%3D40193%3FcategoryId%3D%3FcategoryId%3D39787%3FcategoryId%3D%3FcategoryId%3D39787%3FcategoryId%3D40193%3FcategoryId%3D39787%3FcategoryId%3D40193%3FcategoryId%3D%3FcategoryId%3D39787%3FcategoryId%3D39787%3FcategoryId%3D%3FcategoryId%3D10191473%3FcategoryId%3D39787%3FcategoryId%3D40193%3FcategoryId%3D%3FcategoryId%3D%3FcategoryId%3D%3FcategoryId%3D39787) \\\n- About Us \\\n- Tax Laws & Rules \\\n\nDue Dates\n\n- [Take Online Oath](https://www.incometaxindia.gov.in/en/take-online-oath?doAsUserId=P8dqHo7GMNv%2FXYXPfeJIUA%3D%3D%3FcategoryId%3D10191473%3FcategoryId%3D%3FcategoryId%3D40193%3FcategoryId%3D%3FcategoryId%3D40193%3FcategoryId%3D10191473%3FcategoryId%3D40193%3FcategoryId%3D%3FcategoryId%3D39787%3FcategoryId%3D%3FcategoryId%3D39787%3FcategoryId%3D40193%3FcategoryId%3D39787%3FcategoryId%3D40193%3FcategoryId%3D%3FcategoryId%3D39787%3FcategoryId%3D39787%3FcategoryId%3D%3FcategoryId%3D10191473%3FcategoryId%3D39787%3FcategoryId%3D40193%3FcategoryId%3D%3FcategoryId%3D%3FcategoryId%3D%3FcategoryId%3D39787) 2 \\\n\nDue Dates\\\n\n06 May 2026\n​Due date for deposit of Tax deducted/collected for the month of April, 2026. However, all sum deducted/collected by an office of the government shall be paid to the credit of the Central Government on the same day where tax is paid without production of a challan.\n29 May 2026\nChallan-cum-statement of deduction of tax under\n[section 393(1)](https://www.incometaxindia.gov.in/w/section-393-5#)\nof the Income-tax Act 2025\n[\nTable Sl. No. 2(i), 3(i), 6(ii) & 8(vi) in the month of April, 2026\nGo to Tax Calendar\nClose\n[Advanced Search](https://www.incometaxindia.gov.in/advanced-search)",
7474
+ "kind": "source"
7475
+ }
7476
+ ],
7477
  "gold_nuggets": [
7478
  {
7479
  "id": "n1",
7480
+ "text": "For payments made on or after 1 April 2026, cite Section 393 of the Income Tax Act, 2025 on TDS challans and returns.",
7481
  "vital": true,
7482
+ "evidence_quote": "Challan-cum-statement of deduction of tax under [section 393(1)] of the Income-tax Act 2025"
7483
  },
7484
  {
7485
  "id": "n2",
7486
+ "text": "Section 393 covers both payments to contractors and fees for professional or technical services.",
7487
+ "vital": true,
7488
+ "evidence_quote": "Payments to contractors referred to in section 393(1)[Table: Sl. No. 6(i)]. Fees for professional or technical services referred to in section 393(1)[Table: Sl. No. 6(iii)]."
7489
+ },
7490
+ {
7491
+ "id": "n3",
7492
+ "text": "The TDS rates remain unchanged; only the section reference and challan/return codes change.",
7493
  "vital": false,
7494
  "evidence_quote": null
7495
  }
index.html CHANGED
@@ -1,270 +1,268 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>BFSI-Bench — GroundTruth</title>
7
- <meta
8
- name="description"
9
- content="BFSI-Bench tests how well language models answer questions about India’s banking, financial services, and insurance rules."
10
- />
11
- <link rel="icon" href="./assets/gt-favicon-color.svg" type="image/svg+xml" />
12
- <link rel="stylesheet" href="./styles.css" />
13
- </head>
14
- <body>
15
- <div class="app" id="app">
16
- <header class="top">
17
- <a class="brand-lockup" href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">
18
- <img class="brand-logo" src="./assets/gt-logo.png" width="178" height="42" alt="GroundTruth" />
19
- <span class="brand-product">BFSI-Bench</span>
20
- </a>
21
- <nav class="mode-nav" role="tablist" aria-label="Site sections">
22
- <button class="mode active" type="button" role="tab" aria-selected="true" data-mode="overview">
23
- Overview
24
- </button>
25
- <button class="mode" type="button" role="tab" aria-selected="false" data-mode="samples">
26
- Samples
27
- </button>
28
- <button class="mode" type="button" role="tab" aria-selected="false" data-mode="leaderboard">
29
- Leaderboard
30
- </button>
31
- </nav>
32
- <div class="top-links">
33
- <a href="https://huggingface.co/datasets/ground-truth/bfsi-bench" target="_blank" rel="noopener noreferrer"
34
- >Dataset</a
35
- >
36
- <a href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">ground-truth.in</a>
37
- </div>
38
- </header>
39
-
40
- <section class="mode-panel active" id="mode-overview" role="tabpanel">
41
- <article class="overview">
 
 
 
 
 
 
 
 
 
42
  <header class="hero">
43
- <div class="hero-copy">
44
- <p class="kicker">189 English questions · CC BY 4.0</p>
45
- <h1>BFSI-Bench</h1>
46
- <p class="deck">
47
- BFSI-Bench tests how well language models answer questions about India’s banking,
48
- financial services, and insurance (BFSI) rules.
49
- </p>
50
- <p class="deck">
51
- The right answer often depends on circulars and regulations that change. Official
52
- sources — sites like RBI, SEBI, and IRDAI — can be hard to find and keep current.
53
- </p>
54
- <p class="hero-actions">
55
- <button type="button" class="btn-primary" data-goto="samples">Browse samples</button>
56
- <a
57
- class="btn-ghost"
58
- href="https://ground-truth.in/blog/introducing-bfsi-bench"
59
- target="_blank"
60
- rel="noopener noreferrer"
61
- >Read the blog</a>
62
- <a
63
- class="btn-ghost"
64
- href="https://huggingface.co/datasets/ground-truth/bfsi-bench"
65
- target="_blank"
66
- rel="noopener noreferrer"
67
- >Open the Hugging Face dataset</a>
68
- </p>
69
- </div>
70
- <div class="overview-note-art" aria-hidden="true"></div>
71
  </header>
72
 
73
- <div class="trust-strip" aria-label="Benchmark principles">
74
- <span>Primary-source grounded</span>
75
- <span>Fact-level scoring</span>
76
- <span>India-specific by design</span>
77
- </div>
78
-
79
- <section class="prose">
80
  <h2>What’s in the set</h2>
81
  <p>
82
- There are 189 questions in English. Domain experts wrote the questions and the
83
  answers, then checked them against official Indian sources. You can open every
84
  sample on this page.
85
  </p>
86
- <p>
87
- The download does not include full source documents. Each sample has source links,
88
- short quotes, and a list of facts used when we score a model.
89
- </p>
90
- </section>
91
-
92
- <section>
93
  <h2>The five question types</h2>
94
- <p class="section-lead">
95
- Every question has one label. The number is how many items sit in that group.
96
- </p>
97
- <div class="cat-grid">
98
- <button type="button" class="cat-card cat-jur" data-goto="samples" data-cat-target="BFSI-JUR">
99
- <span class="cat-code">Jurisdiction · 71 questions</span>
100
- <span class="cat-title">Jurisdiction-Aware Compliance</span>
101
- <span class="cat-desc">
102
  Use Indian rules, or ask which country the user means, instead of defaulting to
103
  U.S. or EU law.
104
- </span>
105
- <span class="cat-arrow" aria-hidden="true">↗</span>
106
- </button>
107
- <button type="button" class="cat-card cat-num" data-goto="samples" data-cat-target="BFSI-NUM">
108
- <span class="cat-code">Numerical · 36 questions</span>
109
- <span class="cat-title">Numerical Reasoning</span>
110
- <span class="cat-desc">Get the finance math right, including EMI, interest, and TDS.</span>
111
- <span class="cat-arrow" aria-hidden="true">↗</span>
112
- </button>
113
- <button type="button" class="cat-card cat-tmp" data-goto="samples" data-cat-target="BFSI-TMP">
114
- <span class="cat-code">Temporal · 17 questions</span>
115
- <span class="cat-title">Temporal Logic</span>
116
- <span class="cat-desc">Prefer the rule that applies now when the question does not name a year.</span>
117
- <span class="cat-arrow" aria-hidden="true">↗</span>
118
- </button>
119
- <button type="button" class="cat-card cat-adv" data-goto="samples" data-cat-target="BFSI-ADV">
120
- <span class="cat-code">Red-team · 29 questions</span>
121
- <span class="cat-title">Red-Team Evasion</span>
122
- <span class="cat-desc">
123
  Refuse illegal financial workarounds and point people to legitimate channels.
124
- </span>
125
- <span class="cat-arrow" aria-hidden="true">↗</span>
126
- </button>
127
- <button type="button" class="cat-card cat-grd" data-goto="samples" data-cat-target="BFSI-GRD">
128
- <span class="cat-code">Groundedness · 36 questions</span>
129
- <span class="cat-title">Groundedness</span>
130
- <span class="cat-desc">Stick to the circular, scheme, or policy named in the question.</span>
131
- <span class="cat-arrow" aria-hidden="true">↗</span>
132
- </button>
133
- </div>
134
- </section>
135
-
136
- <section>
137
  <h2>Fields in a sample</h2>
138
  <p class="section-lead">
139
  On Hugging Face these are column names. Here is what they mean.
140
- </p>
141
- <div class="table-wrap">
142
- <table class="data-table">
143
- <thead>
144
- <tr>
145
- <th>You see</th>
146
- <th>What it is</th>
147
- </tr>
148
- </thead>
149
- <tbody>
150
- <tr>
151
- <td>Id</td>
152
- <td>A stable name for the item, such as <code>bfsi-jur-001</code></td>
153
- </tr>
154
- <tr>
155
- <td>Question</td>
156
- <td>The prompt we send the model</td>
157
- </tr>
158
- <tr>
159
- <td>Expert answer</td>
160
- <td>The reference answer written by a domain expert</td>
161
- </tr>
162
- <tr>
163
- <td>Facts</td>
164
- <td>Short claims we check in a model’s reply. Some are marked required.</td>
165
- </tr>
166
- <tr>
167
- <td>Sources</td>
168
- <td>Official page links, a short note, and a publication date when we have one</td>
169
- </tr>
170
- <tr>
171
- <td>Evidence</td>
172
- <td>Quoted spans from those pages, plus a bit of surrounding text</td>
173
- </tr>
174
- </tbody>
175
- </table>
176
- </div>
177
- </section>
178
-
179
- <section class="prose">
180
  <h2>Citation</h2>
181
- <pre><code>@dataset{groundtruth2026bfsibench,
182
- title={BFSI-Bench: Fact-Seeking Eval for Indian BFSI},
183
- author={GroundTruth},
184
- year={2026},
185
- url={https://huggingface.co/datasets/ground-truth/bfsi-bench},
186
- license={CC-BY-4.0}
187
- }</code></pre>
188
- <p>
189
- Questions about this work:
190
- <a href="mailto:miroojin@ground-truth.in">miroojin@ground-truth.in</a>
191
- </p>
192
- </section>
193
- </article>
194
-
195
- <footer class="foot">
196
- <a class="foot-brand" href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">
197
- <img src="./assets/gt-logo.png" width="128" height="30" alt="GroundTruth" />
198
- </a>
199
- <p>
200
- <a href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">ground-truth.in</a>
201
- ·
202
- <a href="https://huggingface.co/datasets/ground-truth/bfsi-bench" target="_blank" rel="noopener noreferrer"
203
- >Hugging Face dataset</a
204
- >
205
- </p>
206
- </footer>
207
- </section>
208
-
209
- <section class="mode-panel explorer-panel" id="mode-samples" role="tabpanel" hidden>
210
- <div class="explorer" id="explorer">
211
- <aside class="sidebar">
212
- <header class="sidebar-head">
213
- <h2>Samples</h2>
214
- <p class="progress" id="progress">Loading…</p>
215
- <button type="button" class="drawer-close" id="btn-close-drawer" hidden>Close list</button>
216
- </header>
217
- <div class="filters">
218
- <label>
219
- Search
220
- <input type="search" id="filter-q" placeholder="Question, answer, or id…" autocomplete="off" />
221
- </label>
222
- <div class="filter-group">
223
- <span class="filter-group-label">Question type</span>
224
- <div class="filter-chips" id="cat-chips" role="group" aria-label="Question type"></div>
225
- </div>
226
- </div>
227
- <ul class="queue" id="queue" aria-label="Sample list"></ul>
228
- </aside>
229
-
230
- <main class="detail-pane" id="main">
231
- <p class="empty" id="empty-state">Pick a question from the list.</p>
232
- <p class="empty error" id="load-error" hidden></p>
233
-
234
- <section class="detail" id="detail" hidden>
235
- <header class="detail-head">
236
- <div class="meta">
237
- <button type="button" class="drawer-open" id="btn-open-drawer">List</button>
238
- <span class="id" id="item-id"></span>
239
- <span class="pill" id="item-cat"></span>
240
- </div>
241
- <div class="nav-btns">
242
- <button type="button" id="btn-prev" title="Previous (k)">← Prev</button>
243
- <button type="button" id="btn-next" title="Next (j)">Next →</button>
244
- <button type="button" id="btn-copy" title="Copy link">Copy link</button>
245
- </div>
246
- </header>
247
-
248
- <div class="sample-document">
249
- <section class="sample-section sample-question" id="sample-question">
 
250
  <h2>Question</h2>
251
  <p class="body" id="item-query"></p>
252
  </section>
253
- <section class="sample-section sample-answer" id="sample-answer">
254
  <h2>Expert answer</h2>
255
  <p class="body gold" id="item-gold"></p>
256
  </section>
257
- <section class="sample-section sample-sources" id="sample-sources">
258
  <h2>Sources</h2>
259
  <p class="card-hint">Official pages this answer is based on.</p>
260
  <ul class="sources" id="item-sources"></ul>
261
  </section>
262
- <section class="sample-section sample-facts" id="sample-facts">
263
  <h2>Facts we score</h2>
264
  <p class="card-hint">Required facts must be in a correct answer.</p>
265
  <div class="nuggets" id="item-nuggets"></div>
266
  </section>
267
- <section class="sample-section sample-evidence" id="sample-evidence">
268
  <h2>Evidence</h2>
269
  <p class="card-hint">Quotes pulled from the source pages.</p>
270
  <div class="evidence" id="item-evidence"></div>
@@ -272,38 +270,18 @@
272
  </div>
273
  </section>
274
  </main>
275
-
276
- <aside class="sample-outline" aria-label="Sample sections">
277
- <p class="outline-label">On this sample</p>
278
- <nav class="outline-nav" id="sample-outline">
279
- <button type="button" class="active" data-section="sample-question" aria-current="true">Question</button>
280
- <button type="button" data-section="sample-answer">Expert answer</button>
281
- <button type="button" data-section="sample-sources">Sources</button>
282
- <button type="button" data-section="sample-facts">Facts we score</button>
283
- <button type="button" data-section="sample-evidence">Evidence</button>
284
- </nav>
285
- </aside>
286
  </div>
287
  </section>
288
-
289
- <section class="mode-panel" id="mode-leaderboard" role="tabpanel" hidden>
290
- <article class="overview">
291
- <header class="hero hero-plain leaderboard-hero">
292
- <div class="hero-copy">
293
- <p class="kicker">Model scores</p>
294
- <h1>Leaderboard</h1>
295
- <p class="deck">
296
- This table will show how widely used models do on BFSI-Bench. The cells are empty
297
- for now.
298
- </p>
299
- </div>
300
- <div class="leaderboard-artwork">
301
- <div class="status-note" aria-label="Leaderboard status">
302
- <span class="status-dot" aria-hidden="true"></span>
303
- <strong>Evaluation in progress</strong>
304
- <small>Results publishing shortly</small>
305
- </div>
306
- </div>
307
  </header>
308
  <section class="prose">
309
  <h2>How we score</h2>
@@ -315,7 +293,9 @@
315
  </section>
316
  <div class="table-wrap">
317
  <table class="data-table">
318
- <caption>No scores published yet</caption>
 
 
319
  <thead>
320
  <tr>
321
  <th>Model</th>
@@ -330,48 +310,73 @@
330
  <tbody>
331
  <tr>
332
  <td><code>openai/gpt-5.6-sol</code></td>
333
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
334
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
 
 
 
 
335
  </tr>
336
  <tr>
337
  <td><code>meta/muse-spark-1.2</code></td>
338
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
339
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
 
 
 
 
340
  </tr>
341
  <tr>
342
  <td><code>openai/gpt-5</code></td>
343
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
344
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
 
 
 
 
345
  </tr>
346
  <tr>
347
  <td><code>google/gemini-3.7-flash</code></td>
348
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
349
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
 
 
 
 
350
  </tr>
351
  <tr>
352
  <td><code>meta/muse-glimmer-30b</code></td>
353
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
354
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
 
 
 
 
355
  </tr>
356
  <tr>
357
  <td><code>google/gemma-4-31b-it</code></td>
358
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
359
- <td class="num">—</td><td class="num">—</td><td class="num">—</td>
 
 
 
 
360
  </tr>
361
  </tbody>
362
  </table>
363
  </div>
364
- </article>
365
- <footer class="foot">
366
- <a class="foot-brand" href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">
367
- <img src="./assets/gt-logo.png" width="128" height="30" alt="GroundTruth" />
368
- </a>
369
- <p>
370
- <a href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">ground-truth.in</a>
371
- </p>
372
- </footer>
373
- </section>
374
- </div>
375
- <script src="./app.js"></script>
376
- </body>
377
- </html>
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>BFSI-Bench — GroundTruth</title>
7
+ <meta
8
+ name="description"
9
+ content="BFSI-Bench tests how well language models answer questions about India’s banking, financial services, and insurance rules."
10
+ />
11
+ <link rel="icon" href="./assets/gt-mark.svg" type="image/svg+xml" />
12
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
13
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
14
+ <link
15
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Poppins:wght@500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap"
16
+ rel="stylesheet"
17
+ />
18
+ <link rel="stylesheet" href="./styles.css" />
19
+ </head>
20
+ <body>
21
+ <div class="app" id="app">
22
+ <header class="top">
23
+ <a class="brand-lockup" href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">
24
+ <img class="brand-mark" src="./assets/gt-mark.svg" width="40" height="40" alt="GroundTruth" />
25
+ <span class="brand-text">
26
+ <span class="brand-name">GroundTruth</span>
27
+ <span class="brand-product">BFSI-Bench</span>
28
+ </span>
29
+ </a>
30
+ <nav class="mode-nav" role="tablist" aria-label="Site sections">
31
+ <button class="mode active" type="button" role="tab" aria-selected="true" data-mode="overview">
32
+ Overview
33
+ </button>
34
+ <button class="mode" type="button" role="tab" aria-selected="false" data-mode="samples">
35
+ Samples
36
+ </button>
37
+ <button class="mode" type="button" role="tab" aria-selected="false" data-mode="leaderboard">
38
+ Leaderboard
39
+ </button>
40
+ </nav>
41
+ <div class="top-links">
42
+ <a href="https://huggingface.co/datasets/ground-truth/bfsi-bench" target="_blank" rel="noopener noreferrer"
43
+ >Dataset</a
44
+ >
45
+ <a href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">ground-truth.in</a>
46
+ </div>
47
+ </header>
48
+
49
+ <section class="mode-panel active" id="mode-overview" role="tabpanel">
50
+ <article class="overview">
51
  <header class="hero">
52
+ <p class="kicker">190 English questions · CC BY 4.0</p>
53
+ <h1>BFSI-Bench</h1>
54
+ <p class="deck">
55
+ BFSI-Bench tests how well language models answer questions about India’s banking,
56
+ financial services, and insurance (BFSI) rules.
57
+ </p>
58
+ <p class="deck">
59
+ The right answer often depends on circulars and regulations that change. Official
60
+ sources — sites like RBI, SEBI, and IRDAI — can be hard to find and keep current.
61
+ </p>
62
+ <p class="hero-actions">
63
+ <button type="button" class="btn-primary" data-goto="samples">Browse samples</button>
64
+ <a
65
+ class="btn-ghost"
66
+ href="https://ground-truth.in/blog/introducing-bfsi-bench"
67
+ target="_blank"
68
+ rel="noopener noreferrer"
69
+ >Read the blog</a
70
+ >
71
+ <a
72
+ class="btn-ghost"
73
+ href="https://huggingface.co/datasets/ground-truth/bfsi-bench"
74
+ target="_blank"
75
+ rel="noopener noreferrer"
76
+ >Open the Hugging Face dataset</a
77
+ >
78
+ </p>
 
79
  </header>
80
 
81
+ <section class="prose">
 
 
 
 
 
 
82
  <h2>What’s in the set</h2>
83
  <p>
84
+ There are 190 questions in English. Domain experts wrote the questions and the
85
  answers, then checked them against official Indian sources. You can open every
86
  sample on this page.
87
  </p>
88
+ <p>
89
+ The download does not include full source documents. Each sample has source links,
90
+ short quotes, and a list of facts used when we score a model.
91
+ </p>
92
+ </section>
93
+
94
+ <section>
95
  <h2>The five question types</h2>
96
+ <p class="section-lead">
97
+ Every question has one label. The number is how many items sit in that group.
98
+ </p>
99
+ <div class="cat-grid">
100
+ <article class="cat-card cat-jur">
101
+ <p class="cat-code">Jurisdiction · 71 questions</p>
102
+ <h3>Jurisdiction-Aware Compliance</h3>
103
+ <p>
104
  Use Indian rules, or ask which country the user means, instead of defaulting to
105
  U.S. or EU law.
106
+ </p>
107
+ </article>
108
+ <article class="cat-card cat-num">
109
+ <p class="cat-code">Numerical · 36 questions</p>
110
+ <h3>Numerical Reasoning</h3>
111
+ <p>Get the finance math right, including EMI, interest, and TDS.</p>
112
+ </article>
113
+ <article class="cat-card cat-tmp">
114
+ <p class="cat-code">Temporal · 17 questions</p>
115
+ <h3>Temporal Logic</h3>
116
+ <p>Prefer the rule that applies now when the question does not name a year.</p>
117
+ </article>
118
+ <article class="cat-card cat-adv">
119
+ <p class="cat-code">Red-team · 29 questions</p>
120
+ <h3>Red-Team Evasion</h3>
121
+ <p>
 
 
 
122
  Refuse illegal financial workarounds and point people to legitimate channels.
123
+ </p>
124
+ </article>
125
+ <article class="cat-card cat-grd">
126
+ <p class="cat-code">Groundedness · 36 questions</p>
127
+ <h3>Groundedness</h3>
128
+ <p>Stick to the circular, scheme, or policy named in the question.</p>
129
+ </article>
130
+ </div>
131
+ </section>
132
+
133
+ <section>
 
 
134
  <h2>Fields in a sample</h2>
135
  <p class="section-lead">
136
  On Hugging Face these are column names. Here is what they mean.
137
+ </p>
138
+ <div class="table-wrap">
139
+ <table class="data-table">
140
+ <thead>
141
+ <tr>
142
+ <th>You see</th>
143
+ <th>What it is</th>
144
+ </tr>
145
+ </thead>
146
+ <tbody>
147
+ <tr>
148
+ <td>Id</td>
149
+ <td>A stable name for the item, such as <code>bfsi-jur-001</code></td>
150
+ </tr>
151
+ <tr>
152
+ <td>Question</td>
153
+ <td>The prompt we send the model</td>
154
+ </tr>
155
+ <tr>
156
+ <td>Expert answer</td>
157
+ <td>The reference answer written by a domain expert</td>
158
+ </tr>
159
+ <tr>
160
+ <td>Facts</td>
161
+ <td>Short claims we check in a model’s reply. Some are marked required.</td>
162
+ </tr>
163
+ <tr>
164
+ <td>Sources</td>
165
+ <td>Official page links, a short note, and a publication date when we have one</td>
166
+ </tr>
167
+ <tr>
168
+ <td>Evidence</td>
169
+ <td>Quoted spans from those pages, plus a bit of surrounding text</td>
170
+ </tr>
171
+ </tbody>
172
+ </table>
173
+ </div>
174
+ </section>
175
+
176
+ <section class="prose">
177
  <h2>Citation</h2>
178
+ <pre><code>@dataset{groundtruth2026bfsibench,
179
+ title={BFSI-Bench: Fact-Seeking Eval for Indian BFSI},
180
+ author={GroundTruth},
181
+ year={2026},
182
+ url={https://huggingface.co/datasets/ground-truth/bfsi-bench},
183
+ license={CC-BY-4.0}
184
+ }</code></pre>
185
+ <p>
186
+ Questions about this work:
187
+ <a href="mailto:miroojin@ground-truth.in">miroojin@ground-truth.in</a>
188
+ </p>
189
+ </section>
190
+ </article>
191
+
192
+ <footer class="foot">
193
+ <a class="foot-brand" href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">
194
+ <img src="./assets/gt-mark.svg" width="28" height="28" alt="" />
195
+ <span>GroundTruth</span>
196
+ </a>
197
+ <p>
198
+ <a href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">ground-truth.in</a>
199
+ ·
200
+ <a href="https://huggingface.co/datasets/ground-truth/bfsi-bench" target="_blank" rel="noopener noreferrer"
201
+ >Hugging Face dataset</a
202
+ >
203
+ </p>
204
+ </footer>
205
+ </section>
206
+
207
+ <section class="mode-panel explorer-panel" id="mode-samples" role="tabpanel" hidden>
208
+ <div class="explorer" id="explorer">
209
+ <aside class="sidebar">
210
+ <header class="sidebar-head">
211
+ <h2>Samples</h2>
212
+ <p class="progress" id="progress">Loading…</p>
213
+ <button type="button" class="drawer-close" id="btn-close-drawer" hidden>Close list</button>
214
+ </header>
215
+ <div class="filters">
216
+ <label>
217
+ Search
218
+ <input type="search" id="filter-q" placeholder="Question, answer, or id…" autocomplete="off" />
219
+ </label>
220
+ <div class="filter-group">
221
+ <span class="filter-group-label">Question type</span>
222
+ <div class="filter-chips" id="cat-chips" role="group" aria-label="Question type"></div>
223
+ </div>
224
+ </div>
225
+ <ul class="queue" id="queue" aria-label="Sample list"></ul>
226
+ </aside>
227
+
228
+ <main class="detail-pane" id="main">
229
+ <p class="empty" id="empty-state">Pick a question from the list.</p>
230
+ <p class="empty error" id="load-error" hidden></p>
231
+
232
+ <section class="detail" id="detail" hidden>
233
+ <header class="detail-head">
234
+ <div class="meta">
235
+ <button type="button" class="drawer-open" id="btn-open-drawer">List</button>
236
+ <span class="id" id="item-id"></span>
237
+ <span class="pill" id="item-cat"></span>
238
+ </div>
239
+ <div class="nav-btns">
240
+ <button type="button" id="btn-prev" title="Previous (k)">← Prev</button>
241
+ <button type="button" id="btn-next" title="Next (j)">Next →</button>
242
+ <button type="button" id="btn-copy" title="Copy link">Copy link</button>
243
+ </div>
244
+ </header>
245
+
246
+ <div class="grid">
247
+ <section class="card span-2">
248
  <h2>Question</h2>
249
  <p class="body" id="item-query"></p>
250
  </section>
251
+ <section class="card span-2">
252
  <h2>Expert answer</h2>
253
  <p class="body gold" id="item-gold"></p>
254
  </section>
255
+ <section class="card">
256
  <h2>Sources</h2>
257
  <p class="card-hint">Official pages this answer is based on.</p>
258
  <ul class="sources" id="item-sources"></ul>
259
  </section>
260
+ <section class="card">
261
  <h2>Facts we score</h2>
262
  <p class="card-hint">Required facts must be in a correct answer.</p>
263
  <div class="nuggets" id="item-nuggets"></div>
264
  </section>
265
+ <section class="card span-2">
266
  <h2>Evidence</h2>
267
  <p class="card-hint">Quotes pulled from the source pages.</p>
268
  <div class="evidence" id="item-evidence"></div>
 
270
  </div>
271
  </section>
272
  </main>
 
 
 
 
 
 
 
 
 
 
 
273
  </div>
274
  </section>
275
+
276
+ <section class="mode-panel" id="mode-leaderboard" role="tabpanel" hidden>
277
+ <article class="overview">
278
+ <header class="hero hero-plain">
279
+ <p class="kicker">Model scores</p>
280
+ <h1>Leaderboard</h1>
281
+ <p class="deck">
282
+ Parametric scores (no tools, no India system prompt) graded against gold nuggets
283
+ on the 190-item test split. Empty cells are not published yet.
284
+ </p>
 
 
 
 
 
 
 
 
 
285
  </header>
286
  <section class="prose">
287
  <h2>How we score</h2>
 
293
  </section>
294
  <div class="table-wrap">
295
  <table class="data-table">
296
+ <caption>
297
+ Accuracy (%) · nugget grader · n=190
298
+ </caption>
299
  <thead>
300
  <tr>
301
  <th>Model</th>
 
310
  <tbody>
311
  <tr>
312
  <td><code>openai/gpt-5.6-sol</code></td>
313
+ <td class="num">86.32</td>
314
+ <td class="num">77.46</td>
315
+ <td class="num">100.0</td>
316
+ <td class="num">66.67</td>
317
+ <td class="num">93.1</td>
318
+ <td class="num">94.44</td>
319
  </tr>
320
  <tr>
321
  <td><code>meta/muse-spark-1.2</code></td>
322
+ <td class="num">77.37</td>
323
+ <td class="num">56.34</td>
324
+ <td class="num">94.44</td>
325
+ <td class="num">61.11</td>
326
+ <td class="num">93.1</td>
327
+ <td class="num">97.22</td>
328
  </tr>
329
  <tr>
330
  <td><code>openai/gpt-5</code></td>
331
+ <td class="num">—</td>
332
+ <td class="num">—</td>
333
+ <td class="num">—</td>
334
+ <td class="num">—</td>
335
+ <td class="num">—</td>
336
+ <td class="num">—</td>
337
  </tr>
338
  <tr>
339
  <td><code>google/gemini-3.7-flash</code></td>
340
+ <td class="num">66.32</td>
341
+ <td class="num">43.66</td>
342
+ <td class="num">86.11</td>
343
+ <td class="num">50.0</td>
344
+ <td class="num">72.41</td>
345
+ <td class="num">94.44</td>
346
  </tr>
347
  <tr>
348
  <td><code>meta/muse-glimmer-30b</code></td>
349
+ <td class="num">—</td>
350
+ <td class="num">—</td>
351
+ <td class="num">—</td>
352
+ <td class="num">—</td>
353
+ <td class="num">—</td>
354
+ <td class="num">—</td>
355
  </tr>
356
  <tr>
357
  <td><code>google/gemma-4-31b-it</code></td>
358
+ <td class="num">—</td>
359
+ <td class="num">—</td>
360
+ <td class="num">—</td>
361
+ <td class="num">—</td>
362
+ <td class="num">—</td>
363
+ <td class="num">—</td>
364
  </tr>
365
  </tbody>
366
  </table>
367
  </div>
368
+ </article>
369
+ <footer class="foot">
370
+ <a class="foot-brand" href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">
371
+ <img src="./assets/gt-mark.svg" width="28" height="28" alt="" />
372
+ <span>GroundTruth</span>
373
+ </a>
374
+ <p>
375
+ <a href="https://ground-truth.in/" target="_blank" rel="noopener noreferrer">ground-truth.in</a>
376
+ </p>
377
+ </footer>
378
+ </section>
379
+ </div>
380
+ <script src="./app.js"></script>
381
+ </body>
382
+ </html>
styles.css CHANGED
@@ -1,584 +1,443 @@
1
  :root {
2
- --bg: #f9f9f9;
3
- --bg-band: #f3f3f3;
4
- --ink: #1a1c1c;
5
- --muted: #464651;
6
- --line: rgba(198, 197, 211, 0.38);
7
- --line-dark: #767682;
8
  --paper: #ffffff;
9
  --accent: #48a47c;
10
- --accent-deep: #363f8c;
11
- --artwork-green: #143b29;
12
  --accent-blue: #363f8c;
13
- --accent-mid: #4e57a6;
14
- --accent-soft: rgba(150, 242, 197, 0.22);
15
- --jur: #193625;
16
- --num: #3b5b88;
17
- --tmp: #a85613;
18
- --adv: #8a3d2a;
19
- --grd: #363f8c;
20
- --display: "Google Sans", "Manrope", Arial, sans-serif;
21
- --sans: "Google Sans", "Manrope", Arial, sans-serif;
22
- --mono: "Google Sans", ui-monospace, monospace;
23
- }
24
-
25
- @font-face {
26
- font-family: "Google Sans";
27
- src: url("./assets/GoogleSans-Subset.ttf") format("truetype");
28
- font-style: normal;
29
- font-weight: 100 900;
30
- font-display: swap;
31
- }
32
-
33
- *,
34
- *::before,
35
- *::after {
36
- box-sizing: border-box;
37
- }
38
-
39
- html,
40
  body {
41
- margin: 0;
42
- height: 100%;
43
- }
44
-
45
- body {
46
- color: var(--ink);
47
- background: var(--bg);
48
- font-family: var(--sans);
49
- font-size: 1rem;
50
  line-height: 1.6;
51
- font-weight: 300;
52
- }
53
-
54
- .app {
55
- min-height: 100%;
56
- display: flex;
57
- flex-direction: column;
58
- }
59
-
60
- body.is-explorer {
61
- overflow: hidden;
62
- }
63
-
64
- body.is-explorer .app {
65
- height: 100%;
66
- }
67
-
68
- .top {
69
- display: flex;
70
- flex-wrap: wrap;
71
- align-items: center;
72
- justify-content: space-between;
73
- gap: 0.75rem 1.25rem;
74
- padding: 0.7rem clamp(1rem, 3vw, 2.5rem);
75
- border-bottom: 1px solid var(--line);
76
- background: var(--paper);
77
- flex-shrink: 0;
78
  z-index: 20;
79
- min-height: 68px;
80
- }
81
-
82
  .brand-lockup {
83
  display: inline-flex;
84
  align-items: center;
85
- gap: 0.8rem;
86
  text-decoration: none;
87
  color: inherit;
88
  }
89
-
90
- .brand-logo {
91
  display: block;
92
- width: clamp(128px, 13vw, 158px);
93
- height: auto;
 
94
  flex-shrink: 0;
95
  }
96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  .brand-product {
98
- border-left: 1px solid var(--line-dark);
99
- padding-left: 0.8rem;
100
- font-size: 0.78rem;
101
- font-weight: 300;
102
  color: var(--muted);
103
  }
104
-
105
- .mode-nav {
106
- display: inline-flex;
107
- gap: 0.15rem;
108
- padding: 0.2rem;
109
- background: transparent;
110
- border-radius: 0;
111
- }
112
-
113
  .mode {
114
- border: 0;
115
- background: transparent;
116
- color: var(--muted);
117
- font: inherit;
118
- font-weight: 400;
119
- font-size: 0.9rem;
120
- padding: 0.45rem 0.9rem;
121
- border-radius: 0;
122
- border-bottom: 2px solid transparent;
123
- cursor: pointer;
124
- }
125
-
126
- .mode.active {
127
  background: transparent;
 
 
 
 
 
 
 
 
 
 
 
128
  color: var(--accent-deep);
129
- border-bottom-color: var(--accent);
130
- }
131
-
132
- .mode:focus-visible,
133
- .nav-btns button:focus-visible,
134
- .filter-chips button:focus-visible,
135
- .btn-primary:focus-visible,
136
- .btn-ghost:focus-visible {
137
- outline: 2px solid var(--accent);
138
- outline-offset: 2px;
139
- }
140
-
141
- .top-links {
142
- display: flex;
143
- gap: 1rem;
144
- font-size: 0.88rem;
145
- }
146
-
147
  .top-links a {
148
- color: var(--accent-mid);
149
- text-decoration: none;
150
- font-weight: 400;
151
- }
152
-
153
- .top-links a:hover {
154
- color: var(--accent-deep);
155
- text-decoration: underline;
156
- }
157
-
158
- .mode-panel[hidden] {
159
- display: none !important;
160
- }
161
-
162
- .mode-panel:not(.explorer-panel) {
163
- flex: 1;
164
- }
165
-
166
- #mode-overview,
167
- #mode-leaderboard {
168
- max-width: 1160px;
169
- width: 100%;
170
- margin: 0 auto;
171
- padding: clamp(1.25rem, 3vw, 2.5rem) clamp(1rem, 3vw, 2rem) 3rem;
172
- }
173
-
174
- .hero {
175
- display: grid;
176
- grid-template-columns: 62% 38%;
177
- gap: 0;
178
- padding: 0;
179
- min-height: 620px;
180
- align-items: center;
181
- border-radius: 0;
182
- background: var(--artwork-green);
183
- color: #f3f6f5;
184
- margin-bottom: 0;
185
- position: relative;
186
- overflow: hidden;
187
  }
188
 
189
- .hero-copy,
190
- .hero-artwork,
191
- .overview-note-art,
192
- .leaderboard-artwork,
193
- .status-note {
194
- position: relative;
195
- z-index: 1;
 
 
 
 
 
 
 
 
 
 
 
 
196
  }
197
 
198
- .hero-copy { padding: clamp(3.5rem, 5vw, 4.5rem); }
 
 
 
 
 
 
 
199
 
200
- .overview-note-art {
201
- align-self: stretch;
202
- min-height: 620px;
203
- background: var(--artwork-green) url("assets/bfsi-note-collage-v1.webp") center center / cover no-repeat;
204
- border-left: 1px solid rgba(255, 255, 255, 0.12);
205
  }
206
 
207
- .hero-artwork { min-height: 280px; }
208
- .hero-artwork::before,
209
- .hero-artwork::after { content: ""; position: absolute; border: 1px solid rgba(255, 255, 255, 0.32); border-radius: 32px; }
210
- .hero-artwork::before { width: 72%; aspect-ratio: 1; right: 2%; top: 2%; }
211
- .hero-artwork::after { width: 48%; aspect-ratio: 1; right: 34%; top: 30%; border-radius: 50%; background: rgba(150, 242, 197, 0.1); }
212
-
213
  .kicker {
214
- margin: 0 0 0.45rem;
215
- font-size: 0.78rem;
216
- letter-spacing: 0.06em;
217
- text-transform: uppercase;
218
- font-weight: 300;
219
  opacity: 0.82;
220
- font-family: var(--mono);
221
  }
222
 
223
- .kicker span { color: #93d7b8; margin-right: 0.65rem; }
224
-
225
  .hero h1 {
226
- margin: 0;
227
- font-family: var(--display);
228
- max-width: 780px;
229
- font-size: clamp(2.6rem, 5vw, 3.5rem);
230
- font-weight: 300;
231
- letter-spacing: -0.035em;
232
- line-height: 1.04;
233
- }
234
-
235
- .hero .deck {
236
- max-width: none;
237
- font-size: clamp(0.95rem, 1.25vw, 1.05rem);
238
- line-height: 1.55;
239
- margin: 2rem 0 0;
240
- color: #e7eee9;
241
- }
242
-
243
- .hero-note {
244
- max-width: 620px;
245
- margin: 1rem 0 0;
246
- color: #afbeb5;
247
- font-size: 0.9rem;
248
- line-height: 1.5;
249
  }
250
 
251
- .trust-strip { display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--line); border-top: 0; margin-bottom: 4rem; background: var(--paper); }
252
- .trust-strip span { padding: 1rem; text-align: center; color: var(--muted); font-family: var(--sans); font-size: .72rem; font-weight: 300; text-transform: uppercase; letter-spacing: .08em; border-right: 1px solid var(--line); }
253
- .trust-strip span:last-child { border-right: 0; }
254
-
255
  .hero .deck + .deck {
256
- margin-top: 0.8rem;
257
- }
258
-
259
- .hero-actions {
260
- display: flex;
261
- flex-wrap: wrap;
262
- gap: 0.6rem;
263
- margin: 1.6rem 0 0;
264
- }
265
-
266
  .btn-primary,
267
  .btn-ghost {
268
- display: inline-flex;
269
- align-items: center;
270
- font: inherit;
271
- font-weight: 400;
272
- font-size: 0.92rem;
273
- padding: 0.45rem 0.95rem;
274
- border-radius: 9999px;
275
- text-decoration: none;
276
- cursor: pointer;
277
- }
278
-
279
- .btn-primary {
280
- border: 1px solid var(--accent);
281
  background: var(--accent);
282
  color: #fff;
283
- box-shadow: 0 8px 15px rgba(72, 164, 124, 0.3);
284
- }
285
-
286
- .btn-primary:hover { background: #3c8d69; border-color: #3c8d69; }
287
-
288
- .btn-ghost {
289
- border: 1px solid rgba(243, 246, 245, 0.35);
290
- background: transparent;
291
- color: #f3f6f5;
292
- }
293
-
294
- .btn-ghost:hover {
295
- background: rgba(255, 255, 255, 0.08);
296
- }
297
-
298
  .overview h2 {
299
  font-family: var(--display);
300
- font-size: clamp(1.65rem, 3vw, 2.35rem);
301
- font-weight: 300;
302
- color: var(--accent-deep);
303
- line-height: 1.08;
304
- letter-spacing: -0.025em;
305
  margin: 0 0 0.75rem;
306
  }
307
 
308
- .overview > section,
309
- .overview > .prose { margin: 0 auto 4rem; max-width: 940px; }
310
-
311
- .section-index { margin: 0 0 .6rem !important; font-family: var(--mono); font-size: .7rem; letter-spacing: .08em; color: var(--accent) !important; }
312
-
313
- .section-lead {
314
- margin: -0.25rem 0 0.9rem;
315
- color: var(--muted);
316
- font-size: 0.95rem;
317
- }
318
-
319
- .card-hint {
320
- margin: 0 0 0.55rem;
321
- font-size: 0.8rem;
322
- color: var(--muted);
323
- line-height: 1.4;
324
- }
325
-
326
- .prose p,
327
- .prose ol {
328
- margin: 0 0 0.9rem;
329
- color: var(--ink);
330
- }
331
-
332
- .prose blockquote {
333
- margin: 0 0 1rem;
334
- padding: 0.7rem 1rem;
335
- border-left: 3px solid var(--accent);
336
- background: var(--paper);
337
- color: var(--muted);
338
- font-style: italic;
339
- }
340
-
341
  .prose pre,
342
  .overview pre {
343
- background: #f1f2f1;
344
- color: var(--ink);
345
  padding: 1rem 1.1rem;
346
- border: 1px solid var(--line);
347
- border-radius: 0;
348
  overflow: auto;
349
- font-family: var(--mono);
350
- font-size: 0.78rem;
351
- line-height: 1.5;
352
- }
353
-
354
- .prose code,
355
- .data-table code {
356
- font-family: var(--mono);
357
- font-size: 0.84em;
358
- }
359
-
360
- .cat-grid {
361
- display: grid;
362
- grid-template-columns: repeat(6, minmax(0, 1fr));
363
- gap: 0;
364
- margin-bottom: 2rem;
365
- border-top: 1px solid var(--line);
366
- border-left: 1px solid var(--line);
367
- counter-reset: category;
368
  }
369
 
370
- .cat-card {
371
- appearance: none;
372
- position: relative;
373
- grid-column: span 2;
374
- display: flex;
375
- flex-direction: column;
376
- align-items: stretch;
377
- min-height: 280px;
378
- text-align: left;
379
- color: var(--ink);
380
- font: inherit;
381
- background: transparent;
382
- border: 0;
383
- border-bottom: 1px solid var(--line);
384
- border-right: 1px solid var(--line);
385
- border-radius: 0;
386
- padding: clamp(1.5rem, 2.5vw, 2rem);
387
- cursor: pointer;
388
  }
389
 
390
- .cat-card:nth-child(n + 4) { grid-column: span 3; }
391
-
392
- .cat-card::before {
393
- counter-increment: category;
394
- content: "0" counter(category);
395
- color: var(--cat-color, var(--accent-deep));
396
- font-size: 0.75rem;
397
- font-variant-numeric: tabular-nums;
398
- letter-spacing: 0.08em;
399
  }
400
 
401
- .cat-card:hover { background: rgba(255, 255, 255, 0.72); }
402
- .cat-arrow {
403
- position: absolute;
404
- right: clamp(1.5rem, 2.5vw, 2rem);
405
- bottom: clamp(1.5rem, 2.5vw, 2rem);
406
- display: grid;
407
- place-items: center;
408
- width: 2rem;
409
- height: 2rem;
410
- background: var(--bg-band);
411
- color: var(--muted);
412
- transition: transform .15s ease, background .15s ease;
413
  }
414
- .cat-card:hover .cat-arrow { color: var(--accent); transform: translate(2px,-2px); }
415
- .cat-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
416
 
417
  .cat-card.cat-jur {
418
- --cat-color: var(--jur);
419
  }
420
  .cat-card.cat-num {
421
- --cat-color: var(--num);
422
  }
423
  .cat-card.cat-tmp {
424
- --cat-color: var(--tmp);
425
  }
426
  .cat-card.cat-adv {
427
- --cat-color: var(--adv);
428
  }
429
  .cat-card.cat-grd {
430
- --cat-color: var(--grd);
431
  }
432
-
433
  .cat-code {
434
- display: block;
435
- order: 4;
436
- margin: auto 3rem 0 0;
437
- padding-top: 2rem;
438
  font-family: var(--mono);
439
  font-size: 0.72rem;
440
  letter-spacing: 0.04em;
441
  color: var(--muted);
442
  }
443
 
444
- .cat-title {
445
- display: block;
446
- order: 2;
447
- margin: 2.25rem 0 0;
448
- font-family: var(--display);
449
- font-size: clamp(1.35rem, 2vw, 1.7rem);
450
- font-weight: 300;
451
- line-height: 1.15;
452
- color: var(--accent-deep);
453
  }
454
 
455
- .cat-desc {
456
- display: block;
457
- order: 3;
458
- margin-top: 0.9rem;
459
  font-size: 0.92rem;
460
- line-height: 1.5;
461
  color: var(--muted);
462
  }
463
-
464
  .table-wrap {
465
- overflow: auto;
466
- margin-bottom: 1.75rem;
467
- border: 1px solid var(--line);
468
- border-radius: 0;
469
- background: var(--paper);
470
- }
471
-
472
- .data-table {
473
- width: 100%;
474
- border-collapse: collapse;
475
- font-size: 0.9rem;
476
- }
477
-
478
- .data-table caption {
479
- caption-side: bottom;
480
- text-align: left;
481
- padding: 0.55rem 0.9rem;
482
- color: var(--muted);
483
- font-size: 0.8rem;
484
- }
485
-
486
- .data-table th,
487
- .data-table td {
488
- text-align: left;
489
- padding: 0.55rem 0.9rem;
490
- border-bottom: 1px solid var(--line);
491
- vertical-align: top;
492
- }
493
-
494
- .data-table th {
495
- font-size: 0.75rem;
496
- text-transform: uppercase;
497
- letter-spacing: 0.04em;
498
- color: var(--muted);
499
- background: var(--bg);
500
- }
501
-
502
- .data-table tr:last-child td {
503
- border-bottom: 0;
504
- }
505
-
506
- .data-table .num {
507
- text-align: right;
508
- font-variant-numeric: tabular-nums;
509
- }
510
-
511
- .foot {
512
- display: flex;
513
- flex-wrap: wrap;
514
- align-items: center;
515
- justify-content: space-between;
516
- gap: 0.75rem;
517
- margin-top: 2rem;
518
- padding-top: 1rem;
519
- border-top: 1px solid var(--line);
520
- color: var(--muted);
521
- font-size: 0.88rem;
522
- }
523
-
524
  .foot-brand {
525
- display: inline-flex;
526
- align-items: center;
527
- gap: 0.5rem;
528
- text-decoration: none;
529
- color: inherit;
530
- font-weight: 400;
531
- }
532
-
533
  .foot a {
534
  color: var(--accent-mid);
535
  }
536
 
537
- .foot-brand img { display: block; width: 128px; height: auto; }
538
-
539
- .leaderboard-hero { align-items: center; min-height: 420px; margin-bottom: 4rem; }
540
- .leaderboard-hero h1 { font-size: clamp(3rem, 7vw, 5rem); }
541
- .leaderboard-artwork { position: relative; align-self: stretch; min-height: 420px; display: flex; align-items: center; border-left: 1px solid rgba(255,255,255,.12); }
542
- .leaderboard-artwork::before { content: ""; position: absolute; inset: 0; opacity: .1; background-image: linear-gradient(90deg, transparent 49%, #fff 50%), linear-gradient(#fff 49%, transparent 50%); background-size: 28px 28px; pointer-events: none; }
543
- .status-note { align-self: center; display: grid; grid-template-columns: auto 1fr; column-gap: .75rem; align-items: center; width: auto; margin: 0 clamp(2rem, 4vw, 4rem); padding: 1.25rem 0; border-top: 1px solid rgba(255,255,255,.3); border-bottom: 1px solid rgba(255,255,255,.3); }
544
- .status-dot { width: .65rem; height: .65rem; border-radius: 50%; background: #86d0ae; grid-row: 1 / 3; }
545
- .status-note strong { font-size: .95rem; font-weight: 400; }
546
- .status-note small { color: rgba(255,255,255,.7); font-size: .85rem; }
547
- .protocol-grid { list-style: none; padding: 0; margin: 2rem auto 3rem; max-width: 940px; display: grid; grid-template-columns: repeat(3,1fr); border-top: 1px solid var(--line); }
548
- .protocol-grid li { padding: 1.25rem; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); }
549
- .protocol-grid li:last-child { border-right: 0; }
550
- .protocol-grid span { font-family: var(--mono); font-size: .7rem; color: var(--accent); }
551
- .protocol-grid strong { display: block; margin-top: 1.5rem; font-family: var(--display); font-size: 1.25rem; }
552
- .protocol-grid p { margin: .4rem 0 0; color: var(--muted); font-size: .9rem; line-height: 1.45; }
553
- .pending-table { max-width: 940px; margin: 0 auto 4rem; border: 1px solid var(--line); background: var(--paper); }
554
- .pending-table > div { display: grid; grid-template-columns: 1.5fr .7fr 1fr; padding: .7rem 1rem; border-bottom: 1px solid var(--line); color: var(--muted); font-family: var(--mono); font-size: .7rem; }
555
- .pending-table p { margin: 0; padding: 3rem 1rem .35rem; font-family: var(--display); font-size: 1.6rem; }
556
- .pending-table > a { display: inline-block; margin: 0 1rem 2.5rem; color: var(--accent-mid); font-size: .88rem; }
557
-
558
- .explorer-panel {
559
- flex: 1;
560
- min-height: 0;
561
- display: flex;
562
- }
563
-
564
- .explorer-panel.active {
565
- display: flex;
566
- flex: 1;
567
- min-height: 0;
568
- }
569
-
570
  .explorer {
571
  display: grid;
572
- grid-template-columns: minmax(260px, 300px) minmax(0, 1fr) minmax(180px, 220px);
573
  width: 100%;
574
  min-height: 0;
575
  flex: 1;
576
  height: 100%;
577
- background: var(--paper);
578
  }
579
 
580
  .sidebar {
581
- background: #f7f8f7;
582
  border-right: 1px solid var(--line);
583
  display: flex;
584
  flex-direction: column;
@@ -586,562 +445,416 @@ body.is-explorer .app {
586
  }
587
 
588
  .sidebar-head {
589
- padding: 1.15rem 1rem 0.85rem;
 
590
  }
591
-
592
  .sidebar-head h2 {
593
- margin: 0;
594
  font-family: var(--display);
595
- font-size: 1.45rem;
596
- color: var(--accent-deep);
597
- font-weight: 400;
598
  }
599
-
600
- .progress {
601
- margin: 0.15rem 0 0;
602
  color: var(--muted);
603
- font-size: 0.72rem;
604
- letter-spacing: .02em;
605
  }
606
 
607
  .filters {
608
- padding: 0.35rem 1rem 1rem;
609
  display: grid;
610
- gap: 0.8rem;
611
  border-bottom: 1px solid var(--line);
612
  }
613
-
614
- .filters label,
615
- .filter-group-label {
616
- display: grid;
617
- gap: 0.3rem;
618
- font-size: 0.64rem;
619
- color: var(--muted);
620
- text-transform: uppercase;
621
- letter-spacing: 0.04em;
622
- }
623
-
624
  .filters input {
625
- font: inherit;
626
- color: var(--ink);
627
- border: 1px solid var(--line);
628
- border-radius: 0;
629
- padding: 0.55rem 0.65rem;
630
  background: #fff;
631
- min-height: 38px;
632
  }
633
-
634
- .filter-chips {
635
- display: flex;
636
- flex-wrap: wrap;
637
- gap: 0.3rem;
638
  }
639
-
640
  .filter-chips button {
641
- font: inherit;
642
- font-size: 0.68rem;
643
- color: var(--ink);
644
- background: #fff;
645
- border: 1px solid var(--line);
646
- border-radius: 0;
647
- padding: 0.22rem 0.46rem;
648
- cursor: pointer;
649
- }
650
-
651
  .filter-chips button.is-on {
652
- background: var(--artwork-green);
653
- border-color: var(--artwork-green);
654
- color: #fff;
 
 
 
 
 
655
  font-weight: 400;
656
  }
657
 
658
- .filter-chips button.is-on .chip-count { color: rgba(255,255,255,.68); }
659
-
660
- .filter-chips .chip-count {
661
- color: var(--muted);
662
- font-weight: 400;
663
- }
664
-
665
  .queue {
666
- list-style: none;
667
- margin: 0;
668
- padding: 0;
669
- overflow: auto;
670
- flex: 1;
671
- }
672
-
673
  .queue li button {
674
- width: 100%;
675
- text-align: left;
676
- border: 0;
677
- background: transparent;
678
- padding: 0.78rem 1rem;
679
- cursor: pointer;
680
  border-left: 3px solid transparent;
681
- border-bottom: 1px solid var(--line);
682
- font: inherit;
683
- color: inherit;
684
- }
685
-
686
  .queue li button:hover {
687
- background: #fff;
688
  }
689
 
690
  .queue li button.active {
691
- background: #fff;
692
- border-left-color: var(--accent-deep);
693
  }
694
-
695
- .queue .qid {
696
- display: block;
697
- font-family: var(--mono);
698
- font-size: 0.66rem;
699
- color: var(--accent-deep);
700
- letter-spacing: .02em;
701
- }
702
-
703
- .queue .qtext {
704
- display: -webkit-box;
705
- -webkit-line-clamp: 2;
706
- -webkit-box-orient: vertical;
707
- overflow: hidden;
708
- font-size: 0.78rem;
709
- margin-top: 0.16rem;
710
- line-height: 1.4;
711
- }
712
-
713
- .queue .qmeta {
714
- margin-top: 0.18rem;
715
- }
716
-
717
  .pill {
718
- display: inline-block;
719
- font-size: 0.64rem;
720
- padding: 0.08rem 0.36rem;
721
- border-radius: 0;
722
- background: #e8eee9;
723
- color: var(--muted);
724
- text-transform: uppercase;
725
- letter-spacing: 0.03em;
726
- }
727
-
728
- .pill.BFSI-JUR {
729
- background: #dce8e1;
730
- color: var(--jur);
731
- }
732
- .pill.BFSI-NUM {
733
- background: #e2e6f2;
734
- color: var(--num);
735
- }
736
- .pill.BFSI-TMP {
737
- background: #f6e6d4;
738
- color: var(--tmp);
739
- }
740
- .pill.BFSI-ADV {
741
- background: #f3ddd6;
742
- color: var(--adv);
743
- }
744
- .pill.BFSI-GRD {
745
- background: #e4e6f4;
746
- color: var(--grd);
747
- }
748
-
749
  .detail-pane {
750
  overflow: auto;
751
- padding: 0 clamp(1.25rem, 4vw, 4.5rem) 4rem;
752
  min-width: 0;
753
- scroll-behavior: smooth;
754
- scrollbar-gutter: stable;
755
- }
756
-
757
- .empty {
758
- color: var(--muted);
759
- margin-top: 2rem;
760
- }
761
-
762
- .empty.error {
763
- color: var(--adv);
764
- }
765
-
766
  .detail-head {
767
- display: flex;
768
- flex-wrap: wrap;
769
- align-items: center;
770
- justify-content: space-between;
771
- gap: 0.5rem;
772
- max-width: 820px;
773
- margin: 0 auto;
774
- padding: 1rem 0 .85rem;
775
- position: sticky;
776
- top: 0;
777
- z-index: 5;
778
- background: rgba(255,255,255,.96);
779
- border-bottom: 1px solid var(--line);
780
- backdrop-filter: blur(8px);
781
- }
782
-
783
- .detail-head .meta {
784
- display: flex;
785
- flex-wrap: wrap;
786
- gap: 0.35rem;
787
- align-items: center;
788
- }
789
-
790
  .detail-head .id {
791
- font-family: var(--mono);
792
- font-weight: 400;
793
- }
794
-
795
- .nav-btns {
796
- display: flex;
797
- gap: 0.4rem;
798
- flex-wrap: wrap;
799
- }
800
-
801
  .nav-btns button,
802
  .drawer-open,
803
  .drawer-close {
804
- font: inherit;
805
- border: 1px solid var(--line);
806
- background: #fff;
807
- border-radius: 0;
808
- padding: 0.32rem 0.58rem;
809
  cursor: pointer;
810
- color: var(--muted);
811
- font-size: .75rem;
812
- }
813
-
814
- .nav-btns button:hover {
815
- border-color: var(--accent);
816
- }
817
-
818
- .sample-document {
819
- max-width: 820px;
820
- margin: 0 auto;
821
  }
822
 
823
- .sample-section {
824
- padding: clamp(2rem, 5vh, 3.5rem) 0;
825
- border-bottom: 1px solid var(--line);
826
- scroll-margin-top: 66px;
827
  }
828
 
829
- .sample-section:last-child { border-bottom: 0; }
 
 
 
 
 
830
 
831
- .sample-section h2 {
832
- margin: 0 0 .85rem;
833
- font-family: var(--display);
834
- font-size: clamp(1.45rem, 2vw, 1.85rem);
835
- line-height: 1.15;
836
- font-weight: 400;
837
- color: var(--accent-deep);
838
  }
839
 
840
- .sample-section h2::before {
841
- display: block;
842
- margin-bottom: .5rem;
843
- font-family: var(--mono);
844
- font-size: .62rem;
845
- letter-spacing: .08em;
 
846
  text-transform: uppercase;
 
847
  color: var(--muted);
848
  }
849
 
850
- .sample-question h2::before { content: "01"; }
851
- .sample-answer h2::before { content: "02"; }
852
- .sample-sources h2::before { content: "03"; }
853
- .sample-facts h2::before { content: "04"; }
854
- .sample-evidence h2::before { content: "05"; }
855
-
856
- .sample-section .body {
857
  margin: 0;
858
  white-space: pre-wrap;
859
- line-height: 1.62;
860
- font-size: 1rem;
861
- max-width: 74ch;
862
- }
863
-
864
- .sample-question .body {
865
- font-family: var(--display);
866
- font-size: clamp(1.3rem, 2.2vw, 1.75rem);
867
- line-height: 1.4;
868
- color: var(--artwork-green);
869
- }
870
-
871
- .sample-answer .body {
872
- padding: 1.25rem 1.4rem;
873
- background: rgba(54,63,140,.055);
874
- border-left: 3px solid var(--accent-deep);
875
  }
876
 
877
- .card-hint {
878
- margin: -.35rem 0 1.2rem;
879
- color: var(--muted);
880
- font-size: .82rem;
881
- }
882
-
883
- .sources,
884
- .nuggets,
885
- .evidence {
886
- list-style: none;
887
- margin: 0;
888
- padding: 0;
889
- display: grid;
890
- gap: 0;
891
  }
892
 
893
  .sources li,
894
  .nugget,
895
  .ev-item {
896
- padding: 1rem 0;
897
- background: transparent;
898
- border-radius: 0;
899
- border: 0;
900
- border-bottom: 1px solid var(--line);
901
  }
902
 
903
- .sources li:last-child,
904
- .nugget:last-child,
905
- .ev-item:last-child { border-bottom: 0; }
906
-
907
  .sources a,
908
  .ev-meta a {
909
  color: var(--accent-mid);
910
- word-break: break-word;
 
 
 
 
 
 
911
  font-size: 0.88rem;
912
- text-underline-offset: 3px;
913
- }
914
-
915
- .sources a::before { content: "↗"; display: inline-block; margin-right: .55rem; color: var(--accent); text-decoration: none; }
916
-
917
- .sources .note {
918
- display: block;
919
- margin: .32rem 0 0 1.35rem;
920
- font-size: 0.86rem;
921
- }
922
-
923
- .sources .date {
924
- display: block;
925
- margin: .28rem 0 0 1.35rem;
926
- font-family: var(--mono);
927
- font-size: 0.72rem;
928
- color: var(--muted);
929
- }
930
-
931
  .nugget-head {
932
- display: flex;
933
- flex-wrap: wrap;
934
- gap: 0.3rem;
935
- align-items: center;
936
- margin-bottom: 0.45rem;
937
- }
938
-
939
- .nugget-id {
940
- font-family: var(--mono);
941
- font-size: 0.75rem;
942
- color: var(--muted);
943
- }
944
-
945
  .vital {
946
- font-size: 0.64rem;
947
- font-weight: 400;
948
- letter-spacing: 0.04em;
949
- text-transform: uppercase;
950
- background: var(--accent-soft);
951
- color: var(--accent-deep);
952
- padding: 0.05rem 0.35rem;
953
- border-radius: 0;
954
- }
955
-
956
  .nugget-text {
957
- margin: 0;
958
- font-size: 0.94rem;
959
- line-height: 1.52;
960
- }
961
-
962
- .nugget-quote {
963
- margin: .8rem 0 0;
964
- font-size: 0.82rem;
965
- color: var(--muted);
966
- border-left: 2px solid var(--accent);
967
- padding-left: .85rem;
968
- white-space: pre-wrap;
969
- }
970
-
971
- .ev-title {
972
- font-size: 0.82rem;
973
- font-weight: 400;
974
- margin-bottom: 0.3rem;
975
- word-break: break-word;
976
- font-family: var(--mono);
977
- }
978
-
979
- .ev-title a {
980
- color: var(--accent-mid);
981
- }
982
-
983
- .ev-quote {
984
- margin: .8rem 0 .2rem;
985
- font-family: var(--display);
986
- font-size: 1rem;
987
- line-height: 1.58;
988
- color: var(--artwork-green);
989
- border-left: 2px solid var(--accent);
990
- padding-left: 1rem;
991
  white-space: pre-wrap;
992
  }
993
-
994
- .ev-ctx-wrap {
995
- margin-top: 0.4rem;
996
- font-size: 0.82rem;
997
- color: var(--muted);
998
- }
999
-
1000
- .ev-ctx-wrap summary {
1001
- cursor: pointer;
1002
- font-weight: 400;
1003
- }
1004
-
1005
- .ev-ctx {
1006
- margin-top: 0.3rem;
1007
- white-space: pre-wrap;
1008
- }
1009
-
1010
- .ev-meta {
1011
- margin-top: 0.35rem;
1012
- font-size: 0.75rem;
1013
- color: var(--muted);
1014
  }
1015
 
1016
- .sample-outline {
1017
- padding: 2.35rem 1.35rem;
1018
- border-left: 1px solid var(--line);
1019
- background: #fcfcfc;
1020
- min-width: 0;
1021
  }
1022
 
1023
- .outline-label {
1024
- margin: 0 0 .85rem;
1025
- color: var(--muted);
1026
- font-size: .64rem;
1027
- letter-spacing: .08em;
1028
- text-transform: uppercase;
1029
  }
1030
 
1031
- .outline-nav {
1032
- position: relative;
1033
- display: grid;
1034
- border-left: 1px solid var(--line);
1035
  }
1036
 
1037
- .outline-nav button {
1038
- width: 100%;
1039
- border: 0;
1040
- border-left: 3px solid transparent;
1041
- margin-left: -2px;
1042
- padding: .5rem 0 .5rem .85rem;
1043
- text-align: left;
1044
- background: transparent;
1045
- color: #8a8a91;
1046
- font: inherit;
1047
- font-size: .78rem;
1048
- line-height: 1.35;
1049
  cursor: pointer;
 
1050
  }
1051
 
1052
- .outline-nav button:hover { color: var(--accent-deep); }
1053
- .outline-nav button:focus { outline: none; }
1054
- .outline-nav button:focus-visible { outline: 1px solid var(--accent-deep); outline-offset: 2px; }
 
1055
 
1056
- .outline-nav button.active {
1057
- border-left-color: var(--artwork-green);
1058
- color: var(--artwork-green);
1059
- font-weight: 400;
1060
  }
1061
-
1062
  .drawer-open,
1063
  .drawer-close {
1064
  display: none;
1065
  }
1066
 
1067
- @media (max-width: 1120px) {
1068
- .explorer { grid-template-columns: minmax(260px, 300px) minmax(0, 1fr); }
1069
- .sample-outline { display: none; }
1070
- }
1071
-
1072
  @media (max-width: 900px) {
1073
- .hero { grid-template-columns: 1fr; min-height: auto; }
1074
- .overview-note-art { min-height: 520px; background-position: center 42%; border-left: 0; border-top: 1px solid rgba(255, 255, 255, 0.12); }
1075
- .leaderboard-artwork { min-height: 320px; border-left: 0; border-top: 1px solid rgba(255, 255, 255, 0.12); }
1076
-
1077
- .cat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1078
- .cat-card,
1079
- .cat-card:nth-child(n + 4) { grid-column: span 1; }
1080
- .cat-card:last-child { grid-column: 1 / -1; }
1081
-
1082
- .card.span-2 {
1083
- grid-column: 1;
1084
- }
1085
-
1086
  .explorer {
1087
  grid-template-columns: 1fr;
1088
  }
1089
 
1090
- .detail-pane { padding-inline: clamp(1rem, 5vw, 2rem); }
1091
-
1092
- .sidebar {
1093
- position: fixed;
1094
- inset: 0 auto 0 0;
1095
- width: min(88vw, 320px);
1096
- z-index: 30;
1097
- transform: translateX(-105%);
1098
- transition: transform 0.2s ease;
1099
- box-shadow: 8px 0 24px rgba(19, 38, 27, 0.12);
1100
- }
1101
-
1102
- body.drawer-open .sidebar {
1103
- transform: none;
1104
- }
1105
-
1106
- .drawer-open,
1107
- .drawer-close {
1108
- display: inline-flex;
1109
- }
1110
-
1111
- .drawer-close {
1112
- margin-top: 0.45rem;
1113
- }
1114
- }
1115
-
1116
- @media (max-width: 640px) {
1117
- .top { justify-content: center; padding-bottom: .45rem; }
1118
- .brand-lockup { margin-right: auto; }
1119
- .mode-nav { order: 3; width: 100%; justify-content: center; border-top: 1px solid var(--line); padding-top: .4rem; }
1120
- .hero { padding: 0; }
1121
- .hero-copy { padding: 2rem 1.25rem; }
1122
- .hero h1 { font-size: clamp(2.55rem, 13vw, 3.5rem); }
1123
- .hero-artwork { display: none; }
1124
- .overview-note-art { display: block; min-height: 420px; }
1125
- .leaderboard-artwork { min-height: 280px; }
1126
- .cat-grid { grid-template-columns: 1fr; }
1127
- .cat-card,
1128
- .cat-card:nth-child(n + 4),
1129
- .cat-card:last-child { grid-column: span 1; min-height: 240px; }
1130
- .trust-strip { grid-template-columns: 1fr; margin-bottom: 3rem; }
1131
- .trust-strip span { border-right: 0; border-bottom: 1px solid var(--line); }
1132
- .trust-strip span:last-child { border-bottom: 0; }
1133
- .status-note { margin: 0 1.25rem; }
1134
- .detail-pane { padding: 0 1rem 3rem; }
1135
- .detail-head { padding-block: .7rem; }
1136
- .detail-head .meta { width: 100%; }
1137
- .nav-btns { width: 100%; gap: .3rem; }
1138
- .nav-btns button { flex: 1; justify-content: center; }
1139
- .sample-section { padding: 2.2rem 0; scroll-margin-top: 104px; }
1140
- .sample-answer .body { padding: 1rem 1.05rem; }
1141
- .protocol-grid { grid-template-columns: 1fr; }
1142
- .protocol-grid li { border-right: 0; }
1143
 
 
1144
  .top-links {
1145
- display: none;
1146
- }
1147
- }
 
1
  :root {
2
+ --bg: #f3f6f5;
3
+ --bg-band: #e4ebe7;
4
+ --ink: #13261b;
5
+ --muted: #5e6b64;
6
+ --line: #cfd8d2;
 
7
  --paper: #ffffff;
8
  --accent: #48a47c;
9
+ --accent-deep: #193625;
 
10
  --accent-blue: #363f8c;
11
+ --accent-mid: #3b5b88;
12
+ --accent-soft: #e6f3ec;
13
+ --jur: #193625;
14
+ --num: #3b5b88;
15
+ --tmp: #a85613;
16
+ --adv: #8a3d2a;
17
+ --grd: #363f8c;
18
+ --display: "Poppins", "Inter", system-ui, sans-serif;
19
+ --sans: "Inter", system-ui, sans-serif;
20
+ --mono: "IBM Plex Mono", ui-monospace, monospace;
21
+ }
22
+
23
+ *,
24
+ *::before,
25
+ *::after {
26
+ box-sizing: border-box;
27
+ }
28
+
29
+ html,
 
 
 
 
 
 
 
 
30
  body {
31
+ margin: 0;
32
+ height: 100%;
33
+ }
34
+
35
+ body {
36
+ color: var(--ink);
37
+ background: var(--bg);
38
+ font-family: var(--sans);
39
+ font-size: 1.02rem;
40
  line-height: 1.6;
41
+ }
42
+
43
+ .app {
44
+ min-height: 100%;
45
+ display: flex;
46
+ flex-direction: column;
47
+ }
48
+
49
+ body.is-explorer {
50
+ overflow: hidden;
51
+ }
52
+
53
+ body.is-explorer .app {
54
+ height: 100%;
55
+ }
56
+
57
+ .top {
58
+ display: flex;
59
+ flex-wrap: wrap;
60
+ align-items: center;
61
+ justify-content: space-between;
62
+ gap: 0.75rem 1.25rem;
63
+ padding: 0.85rem 1.25rem;
64
+ border-bottom: 1px solid var(--line);
65
+ background: var(--paper);
66
+ flex-shrink: 0;
 
67
  z-index: 20;
68
+ }
69
+
 
70
  .brand-lockup {
71
  display: inline-flex;
72
  align-items: center;
73
+ gap: 0.7rem;
74
  text-decoration: none;
75
  color: inherit;
76
  }
77
+
78
+ .brand-mark {
79
  display: block;
80
+ width: 40px;
81
+ height: 40px;
82
+ border-radius: 8px;
83
  flex-shrink: 0;
84
  }
85
 
86
+ .brand-text {
87
+ display: flex;
88
+ flex-direction: column;
89
+ line-height: 1.15;
90
+ }
91
+
92
+ .brand-name {
93
+ font-family: var(--display);
94
+ font-size: 1.05rem;
95
+ font-weight: 700;
96
+ letter-spacing: -0.02em;
97
+ color: var(--accent-deep);
98
+ }
99
+
100
  .brand-product {
101
+ font-size: 0.82rem;
102
+ font-weight: 500;
 
 
103
  color: var(--muted);
104
  }
105
+
106
+ .mode-nav {
107
+ display: inline-flex;
108
+ gap: 0.15rem;
109
+ padding: 0.2rem;
110
+ background: var(--bg-band);
111
+ border-radius: 8px;
112
+ }
113
+
114
  .mode {
115
+ border: 0;
 
 
 
 
 
 
 
 
 
 
 
 
116
  background: transparent;
117
+ color: var(--muted);
118
+ font: inherit;
119
+ font-weight: 600;
120
+ font-size: 0.9rem;
121
+ padding: 0.45rem 0.95rem;
122
+ border-radius: 6px;
123
+ cursor: pointer;
124
+ }
125
+
126
+ .mode.active {
127
+ background: var(--paper);
128
  color: var(--accent-deep);
129
+ }
130
+
131
+ .mode:focus-visible,
132
+ .nav-btns button:focus-visible,
133
+ .filter-chips button:focus-visible,
134
+ .btn-primary:focus-visible,
135
+ .btn-ghost:focus-visible {
136
+ outline: 2px solid var(--accent);
137
+ outline-offset: 2px;
138
+ }
139
+
140
+ .top-links {
141
+ display: flex;
142
+ gap: 1rem;
143
+ font-size: 0.88rem;
144
+ }
145
+
 
146
  .top-links a {
147
+ color: var(--accent-mid);
148
+ text-decoration: none;
149
+ font-weight: 600;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  }
151
 
152
+ .top-links a:hover {
153
+ color: var(--accent-deep);
154
+ text-decoration: underline;
155
+ }
156
+
157
+ .mode-panel[hidden] {
158
+ display: none !important;
159
+ }
160
+
161
+ .mode-panel:not(.explorer-panel) {
162
+ flex: 1;
163
+ }
164
+
165
+ #mode-overview,
166
+ #mode-leaderboard {
167
+ max-width: 960px;
168
+ width: 100%;
169
+ margin: 0 auto;
170
+ padding: 1.5rem 1.25rem 3rem;
171
  }
172
 
173
+ .hero {
174
+ padding: 1.75rem 1.6rem 1.5rem;
175
+ border-radius: 12px;
176
+ background:
177
+ linear-gradient(115deg, rgba(19, 38, 27, 0.96) 0%, rgba(25, 54, 37, 0.88) 48%, rgba(54, 63, 140, 0.78) 100%);
178
+ color: #f3f6f5;
179
+ margin-bottom: 1.5rem;
180
+ }
181
 
182
+ .hero-plain {
183
+ background: var(--accent-deep);
 
 
 
184
  }
185
 
 
 
 
 
 
 
186
  .kicker {
187
+ margin: 0 0 0.45rem;
188
+ font-size: 0.78rem;
189
+ letter-spacing: 0.06em;
190
+ text-transform: uppercase;
191
+ font-weight: 600;
192
  opacity: 0.82;
 
193
  }
194
 
 
 
195
  .hero h1 {
196
+ margin: 0 0 0.6rem;
197
+ font-family: var(--display);
198
+ font-size: clamp(1.7rem, 4vw, 2.35rem);
199
+ letter-spacing: -0.03em;
200
+ line-height: 1.15;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  }
202
 
 
 
 
 
203
  .hero .deck + .deck {
204
+ margin-top: 0.7rem;
205
+ }
206
+
207
+ .hero-actions {
208
+ display: flex;
209
+ flex-wrap: wrap;
210
+ gap: 0.6rem;
211
+ margin: 1.15rem 0 0;
212
+ }
213
+
214
  .btn-primary,
215
  .btn-ghost {
216
+ display: inline-flex;
217
+ align-items: center;
218
+ font: inherit;
219
+ font-weight: 600;
220
+ font-size: 0.92rem;
221
+ padding: 0.45rem 0.95rem;
222
+ border-radius: 8px;
223
+ text-decoration: none;
224
+ cursor: pointer;
225
+ }
226
+
227
+ .btn-primary {
228
+ border: 0;
229
  background: var(--accent);
230
  color: #fff;
231
+ }
232
+
233
+ .btn-ghost {
234
+ border: 1px solid rgba(243, 246, 245, 0.35);
235
+ background: transparent;
236
+ color: #f3f6f5;
237
+ }
238
+
239
+ .btn-ghost:hover {
240
+ background: rgba(255, 255, 255, 0.08);
241
+ }
242
+
 
 
 
243
  .overview h2 {
244
  font-family: var(--display);
245
+ font-size: 1.2rem;
 
 
 
 
246
  margin: 0 0 0.75rem;
247
  }
248
 
249
+ .section-lead {
250
+ margin: -0.25rem 0 0.9rem;
251
+ color: var(--muted);
252
+ font-size: 0.95rem;
253
+ }
254
+
255
+ .card-hint {
256
+ margin: 0 0 0.55rem;
257
+ font-size: 0.8rem;
258
+ color: var(--muted);
259
+ line-height: 1.4;
260
+ }
261
+
262
+ .prose p,
263
+ .prose ol {
264
+ margin: 0 0 0.9rem;
265
+ color: var(--ink);
266
+ }
267
+
268
+ .prose blockquote {
269
+ margin: 0 0 1rem;
270
+ padding: 0.7rem 1rem;
271
+ border-left: 3px solid var(--accent);
272
+ background: var(--paper);
273
+ color: var(--muted);
274
+ font-style: italic;
275
+ }
276
+
 
 
 
 
 
277
  .prose pre,
278
  .overview pre {
279
+ background: var(--accent-deep);
280
+ color: #e8f0eb;
281
  padding: 1rem 1.1rem;
282
+ border-radius: 8px;
 
283
  overflow: auto;
284
+ font-family: var(--mono);
285
+ font-size: 0.78rem;
286
+ line-height: 1.5;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
287
  }
288
 
289
+ .prose code,
290
+ .data-table code {
291
+ font-family: var(--mono);
292
+ font-size: 0.84em;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  }
294
 
295
+ .cat-grid {
296
+ display: grid;
297
+ grid-template-columns: 1fr 1fr;
298
+ gap: 0.75rem;
299
+ margin-bottom: 2rem;
 
 
 
 
300
  }
301
 
302
+ .cat-card {
303
+ background: var(--paper);
304
+ border: 1px solid var(--line);
305
+ border-radius: 10px;
306
+ padding: 1rem 1.05rem 1.05rem;
307
+ border-left: 4px solid var(--accent);
 
 
 
 
 
 
308
  }
 
 
309
 
310
  .cat-card.cat-jur {
311
+ border-left-color: var(--jur);
312
  }
313
  .cat-card.cat-num {
314
+ border-left-color: var(--num);
315
  }
316
  .cat-card.cat-tmp {
317
+ border-left-color: var(--tmp);
318
  }
319
  .cat-card.cat-adv {
320
+ border-left-color: var(--adv);
321
  }
322
  .cat-card.cat-grd {
323
+ border-left-color: var(--grd);
324
  }
325
+
326
  .cat-code {
327
+ margin: 0 0 0.3rem;
 
 
 
328
  font-family: var(--mono);
329
  font-size: 0.72rem;
330
  letter-spacing: 0.04em;
331
  color: var(--muted);
332
  }
333
 
334
+ .cat-card h3 {
335
+ margin: 0 0 0.35rem;
336
+ font-size: 1rem;
 
 
 
 
 
 
337
  }
338
 
339
+ .cat-card p {
340
+ margin: 0;
 
 
341
  font-size: 0.92rem;
 
342
  color: var(--muted);
343
  }
344
+
345
  .table-wrap {
346
+ overflow: auto;
347
+ margin-bottom: 1.75rem;
348
+ border: 1px solid var(--line);
349
+ border-radius: 10px;
350
+ background: var(--paper);
351
+ }
352
+
353
+ .data-table {
354
+ width: 100%;
355
+ border-collapse: collapse;
356
+ font-size: 0.9rem;
357
+ }
358
+
359
+ .data-table caption {
360
+ caption-side: bottom;
361
+ text-align: left;
362
+ padding: 0.55rem 0.9rem;
363
+ color: var(--muted);
364
+ font-size: 0.8rem;
365
+ }
366
+
367
+ .data-table th,
368
+ .data-table td {
369
+ text-align: left;
370
+ padding: 0.55rem 0.9rem;
371
+ border-bottom: 1px solid var(--line);
372
+ vertical-align: top;
373
+ }
374
+
375
+ .data-table th {
376
+ font-size: 0.75rem;
377
+ text-transform: uppercase;
378
+ letter-spacing: 0.04em;
379
+ color: var(--muted);
380
+ background: var(--bg);
381
+ }
382
+
383
+ .data-table tr:last-child td {
384
+ border-bottom: 0;
385
+ }
386
+
387
+ .data-table .num {
388
+ text-align: right;
389
+ font-variant-numeric: tabular-nums;
390
+ }
391
+
392
+ .foot {
393
+ display: flex;
394
+ flex-wrap: wrap;
395
+ align-items: center;
396
+ justify-content: space-between;
397
+ gap: 0.75rem;
398
+ margin-top: 2rem;
399
+ padding-top: 1rem;
400
+ border-top: 1px solid var(--line);
401
+ color: var(--muted);
402
+ font-size: 0.88rem;
403
+ }
404
+
405
  .foot-brand {
406
+ display: inline-flex;
407
+ align-items: center;
408
+ gap: 0.5rem;
409
+ text-decoration: none;
410
+ color: inherit;
411
+ font-weight: 600;
412
+ }
413
+
414
  .foot a {
415
  color: var(--accent-mid);
416
  }
417
 
418
+ .explorer-panel {
419
+ flex: 1;
420
+ min-height: 0;
421
+ display: flex;
422
+ }
423
+
424
+ .explorer-panel.active {
425
+ display: flex;
426
+ flex: 1;
427
+ min-height: 0;
428
+ }
429
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
430
  .explorer {
431
  display: grid;
432
+ grid-template-columns: minmax(240px, 300px) 1fr;
433
  width: 100%;
434
  min-height: 0;
435
  flex: 1;
436
  height: 100%;
 
437
  }
438
 
439
  .sidebar {
440
+ background: var(--paper);
441
  border-right: 1px solid var(--line);
442
  display: flex;
443
  flex-direction: column;
 
445
  }
446
 
447
  .sidebar-head {
448
+ padding: 0.7rem 0.85rem 0.5rem;
449
+ border-bottom: 1px solid var(--line);
450
  }
451
+
452
  .sidebar-head h2 {
453
+ margin: 0;
454
  font-family: var(--display);
455
+ font-size: 1rem;
 
 
456
  }
457
+
458
+ .progress {
459
+ margin: 0.2rem 0 0;
460
  color: var(--muted);
461
+ font-size: 0.75rem;
 
462
  }
463
 
464
  .filters {
465
+ padding: 0.55rem 0.85rem;
466
  display: grid;
467
+ gap: 0.45rem;
468
  border-bottom: 1px solid var(--line);
469
  }
470
+
471
+ .filters label,
472
+ .filter-group-label {
473
+ display: grid;
474
+ gap: 0.15rem;
475
+ font-size: 0.68rem;
476
+ color: var(--muted);
477
+ text-transform: uppercase;
478
+ letter-spacing: 0.04em;
479
+ }
480
+
481
  .filters input {
482
+ font: inherit;
483
+ color: var(--ink);
484
+ border: 1px solid var(--line);
485
+ border-radius: 6px;
486
+ padding: 0.35rem 0.45rem;
487
  background: #fff;
 
488
  }
489
+
490
+ .filter-chips {
491
+ display: flex;
492
+ flex-wrap: wrap;
493
+ gap: 0.22rem;
494
  }
495
+
496
  .filter-chips button {
497
+ font: inherit;
498
+ font-size: 0.7rem;
499
+ color: var(--ink);
500
+ background: #fff;
501
+ border: 1px solid var(--line);
502
+ border-radius: 999px;
503
+ padding: 0.15rem 0.42rem;
504
+ cursor: pointer;
505
+ }
506
+
507
  .filter-chips button.is-on {
508
+ background: var(--accent-soft);
509
+ border-color: var(--accent);
510
+ color: var(--accent-deep);
511
+ font-weight: 600;
512
+ }
513
+
514
+ .filter-chips .chip-count {
515
+ color: var(--muted);
516
  font-weight: 400;
517
  }
518
 
 
 
 
 
 
 
 
519
  .queue {
520
+ list-style: none;
521
+ margin: 0;
522
+ padding: 0.2rem 0;
523
+ overflow: auto;
524
+ flex: 1;
525
+ }
526
+
527
  .queue li button {
528
+ width: 100%;
529
+ text-align: left;
530
+ border: 0;
531
+ background: transparent;
532
+ padding: 0.42rem 0.85rem;
533
+ cursor: pointer;
534
  border-left: 3px solid transparent;
535
+ font: inherit;
536
+ color: inherit;
537
+ }
538
+
 
539
  .queue li button:hover {
540
+ background: var(--bg);
541
  }
542
 
543
  .queue li button.active {
544
+ background: var(--accent-soft);
545
+ border-left-color: var(--accent);
546
  }
547
+
548
+ .queue .qid {
549
+ display: block;
550
+ font-family: var(--mono);
551
+ font-size: 0.7rem;
552
+ color: var(--muted);
553
+ }
554
+
555
+ .queue .qtext {
556
+ display: -webkit-box;
557
+ -webkit-line-clamp: 2;
558
+ -webkit-box-orient: vertical;
559
+ overflow: hidden;
560
+ font-size: 0.8rem;
561
+ margin-top: 0.08rem;
562
+ line-height: 1.3;
563
+ }
564
+
565
+ .queue .qmeta {
566
+ margin-top: 0.18rem;
567
+ }
568
+
 
569
  .pill {
570
+ display: inline-block;
571
+ font-size: 0.64rem;
572
+ padding: 0.08rem 0.36rem;
573
+ border-radius: 999px;
574
+ background: #e8eee9;
575
+ color: var(--muted);
576
+ text-transform: uppercase;
577
+ letter-spacing: 0.03em;
578
+ }
579
+
580
+ .pill.BFSI-JUR {
581
+ background: #dce8e1;
582
+ color: var(--jur);
583
+ }
584
+ .pill.BFSI-NUM {
585
+ background: #e2e6f2;
586
+ color: var(--num);
587
+ }
588
+ .pill.BFSI-TMP {
589
+ background: #f6e6d4;
590
+ color: var(--tmp);
591
+ }
592
+ .pill.BFSI-ADV {
593
+ background: #f3ddd6;
594
+ color: var(--adv);
595
+ }
596
+ .pill.BFSI-GRD {
597
+ background: #e4e6f4;
598
+ color: var(--grd);
599
+ }
600
+
601
  .detail-pane {
602
  overflow: auto;
603
+ padding: 0.75rem 1rem 1.4rem;
604
  min-width: 0;
605
+ }
606
+
607
+ .empty {
608
+ color: var(--muted);
609
+ margin-top: 2rem;
610
+ }
611
+
612
+ .empty.error {
613
+ color: var(--adv);
614
+ }
615
+
 
 
616
  .detail-head {
617
+ display: flex;
618
+ flex-wrap: wrap;
619
+ align-items: center;
620
+ justify-content: space-between;
621
+ gap: 0.5rem;
622
+ margin-bottom: 0.65rem;
623
+ }
624
+
625
+ .detail-head .meta {
626
+ display: flex;
627
+ flex-wrap: wrap;
628
+ gap: 0.35rem;
629
+ align-items: center;
630
+ }
631
+
 
 
 
 
 
 
 
 
632
  .detail-head .id {
633
+ font-family: var(--mono);
634
+ font-weight: 600;
635
+ }
636
+
637
+ .nav-btns {
638
+ display: flex;
639
+ gap: 0.4rem;
640
+ flex-wrap: wrap;
641
+ }
642
+
643
  .nav-btns button,
644
  .drawer-open,
645
  .drawer-close {
646
+ font: inherit;
647
+ border: 1px solid var(--line);
648
+ background: #fff;
649
+ border-radius: 6px;
650
+ padding: 0.25rem 0.55rem;
651
  cursor: pointer;
 
 
 
 
 
 
 
 
 
 
 
652
  }
653
 
654
+ .nav-btns button:hover {
655
+ border-color: var(--accent);
 
 
656
  }
657
 
658
+ .grid {
659
+ display: grid;
660
+ grid-template-columns: 1fr 1fr;
661
+ gap: 0.65rem;
662
+ max-width: 56rem;
663
+ }
664
 
665
+ .card {
666
+ background: var(--paper);
667
+ border: 1px solid var(--line);
668
+ border-radius: 10px;
669
+ padding: 0.75rem 0.9rem;
 
 
670
  }
671
 
672
+ .card.span-2 {
673
+ grid-column: 1 / -1;
674
+ }
675
+
676
+ .card h2 {
677
+ margin: 0 0 0.4rem;
678
+ font-size: 0.7rem;
679
  text-transform: uppercase;
680
+ letter-spacing: 0.05em;
681
  color: var(--muted);
682
  }
683
 
684
+ .card .body {
 
 
 
 
 
 
685
  margin: 0;
686
  white-space: pre-wrap;
687
+ line-height: 1.5;
688
+ font-size: 0.95rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
689
  }
690
 
691
+ .sources,
692
+ .nuggets,
693
+ .evidence {
694
+ list-style: none;
695
+ margin: 0;
696
+ padding: 0;
697
+ display: grid;
698
+ gap: 0.5rem;
 
 
 
 
 
 
699
  }
700
 
701
  .sources li,
702
  .nugget,
703
  .ev-item {
704
+ padding: 0.55rem 0.65rem;
705
+ background: var(--bg);
706
+ border-radius: 8px;
707
+ border: 1px solid var(--line);
 
708
  }
709
 
 
 
 
 
710
  .sources a,
711
  .ev-meta a {
712
  color: var(--accent-mid);
713
+ word-break: break-all;
714
+ font-size: 0.85rem;
715
+ }
716
+
717
+ .sources .note {
718
+ display: block;
719
+ margin-top: 0.15rem;
720
  font-size: 0.88rem;
721
+ }
722
+
723
+ .sources .date {
724
+ display: block;
725
+ margin-top: 0.2rem;
726
+ font-family: var(--mono);
727
+ font-size: 0.72rem;
728
+ color: var(--muted);
729
+ }
730
+
 
 
 
 
 
 
 
 
 
731
  .nugget-head {
732
+ display: flex;
733
+ flex-wrap: wrap;
734
+ gap: 0.3rem;
735
+ align-items: center;
736
+ margin-bottom: 0.3rem;
737
+ }
738
+
739
+ .nugget-id {
740
+ font-family: var(--mono);
741
+ font-size: 0.75rem;
742
+ color: var(--muted);
743
+ }
744
+
745
  .vital {
746
+ font-size: 0.64rem;
747
+ font-weight: 700;
748
+ letter-spacing: 0.04em;
749
+ text-transform: uppercase;
750
+ background: var(--accent-soft);
751
+ color: var(--accent-deep);
752
+ padding: 0.05rem 0.35rem;
753
+ border-radius: 999px;
754
+ }
755
+
756
  .nugget-text {
757
+ margin: 0;
758
+ font-size: 0.9rem;
759
+ line-height: 1.45;
760
+ }
761
+
762
+ .nugget-quote {
763
+ margin: 0.4rem 0 0;
764
+ font-size: 0.82rem;
765
+ color: var(--muted);
766
+ border-left: 3px solid var(--accent);
767
+ padding-left: 0.5rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
768
  white-space: pre-wrap;
769
  }
770
+
771
+ .ev-title {
772
+ font-size: 0.82rem;
773
+ font-weight: 600;
774
+ margin-bottom: 0.3rem;
775
+ word-break: break-all;
776
+ font-family: var(--mono);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
777
  }
778
 
779
+ .ev-title a {
780
+ color: var(--accent-mid);
 
 
 
781
  }
782
 
783
+ .ev-quote {
784
+ font-size: 0.9rem;
785
+ line-height: 1.45;
786
+ border-left: 3px solid var(--accent);
787
+ padding-left: 0.55rem;
788
+ white-space: pre-wrap;
789
  }
790
 
791
+ .ev-ctx-wrap {
792
+ margin-top: 0.4rem;
793
+ font-size: 0.82rem;
794
+ color: var(--muted);
795
  }
796
 
797
+ .ev-ctx-wrap summary {
 
 
 
 
 
 
 
 
 
 
 
798
  cursor: pointer;
799
+ font-weight: 600;
800
  }
801
 
802
+ .ev-ctx {
803
+ margin-top: 0.3rem;
804
+ white-space: pre-wrap;
805
+ }
806
 
807
+ .ev-meta {
808
+ margin-top: 0.35rem;
809
+ font-size: 0.75rem;
810
+ color: var(--muted);
811
  }
812
+
813
  .drawer-open,
814
  .drawer-close {
815
  display: none;
816
  }
817
 
 
 
 
 
 
818
  @media (max-width: 900px) {
819
+ .cat-grid,
820
+ .grid {
821
+ grid-template-columns: 1fr;
822
+ }
823
+
824
+ .card.span-2 {
825
+ grid-column: 1;
826
+ }
827
+
 
 
 
 
828
  .explorer {
829
  grid-template-columns: 1fr;
830
  }
831
 
832
+ .sidebar {
833
+ position: fixed;
834
+ inset: 0 auto 0 0;
835
+ width: min(88vw, 320px);
836
+ z-index: 30;
837
+ transform: translateX(-105%);
838
+ transition: transform 0.2s ease;
839
+ box-shadow: 8px 0 24px rgba(19, 38, 27, 0.12);
840
+ }
841
+
842
+ body.drawer-open .sidebar {
843
+ transform: none;
844
+ }
845
+
846
+ .drawer-open,
847
+ .drawer-close {
848
+ display: inline-flex;
849
+ }
850
+
851
+ .drawer-close {
852
+ margin-top: 0.45rem;
853
+ }
854
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
855
 
856
+ @media (max-width: 640px) {
857
  .top-links {
858
+ display: none;
859
+ }
860
+ }