Separate claims from sources. Every data point on this site is traceable to a named primary source — ECI affidavit, court order, government gazette, or official press release. This page documents the source and update rules for each data file.
Data files: sources and update rules
All data lives in /data as static JSON committed to the repository. Changes are reviewable via git history.
- Primary source: ECI Form 26 affidavits submitted by candidates for the 2021 West Bengal Legislative Assembly election, scraped from myneta.info and cross-referenced with eci.gov.in candidate portals.
- Criminal case data: IPC section numbers, case counts, and "serious" flags (IPC 302, 307, 376, 420, 120B) are extracted directly from affidavit tables. No inference is made about guilt.
- CBI / ED overlay: Agency press releases are scraped hourly. An MLA is flagged as having an active CBI/ED case only when the agency names them in a press release.
- Update frequency: Affidavit data is static (2021 election). CBI/ED flags update with each hourly pipeline run.
- What we do not do: We do not infer guilt, do not include FIR allegations without charge-sheet, and do not use police sources alone.
- Primary source: ECI Form 26 affidavits for 2021 and (where available) 2016. Self-declared movable and immovable assets, liabilities, and income.
- Parsing: Asset totals are extracted in ₹ crore (rounded to 2 decimal places). Growth % is computed only where both years have an affidavit with non-zero declared assets.
- Limitation: Self-declared figures are not independently audited. Growth calculations treat declared values at face value.
- Update frequency: Static until the 2026 nomination affidavits are filed. Will be updated post-election.
- Primary source: ECI results portal (results.eci.gov.in, state code S25) for West Bengal. The scraper reads the winner row, normalises party labels, and computes winning margin from votes cast.
- Verification states: Each entry carries a verified boolean. Set to true only after ECI officially declares the result — never on exit-poll data or projections.
- Turnout: Derived from total votes polled ÷ total electors on roll (from ECI voter roll data).
- Update frequency: Live on election day (scraper runs every 30 minutes during counting); static otherwise.
- Primary source: ED press releases (enforcement.gov.in), CBI press releases (cbi.gov.in), and court order summaries from Bar and Bench, LiveLaw, and Indian Kanoon.
- Update rule: A timeline entry is added only when (a) an official agency press release names the subject and a case number, or (b) 2+ independent news sources within 24 hours report the same specific action (arrest, charge-sheet, bail, conviction).
- What is excluded: Social media claims, anonymous tips, single-source reports without agency confirmation.
- Update frequency: Pipeline runs hourly; new entries are appended, existing entries are not overwritten.
- Source: Google News RSS, queried per-case using the subject name + case keywords. Top 3 recent articles per case are stored.
- Deduplication: Article titles are normalised and deduplicated across runs. A title seen within the last 72 hours is not re-added.
- No editorial judgment on news: Headlines are reproduced verbatim. Headlines link to the original source; the site does not validate article content.
- Update frequency: Refreshed completely on each hourly pipeline run.
- Source: Party manifestos (BJP, TMC, Congress, Left Front) for the 2026 election. Each pledge is manually coded with category, deadline, and verbatim manifesto text.
- Status logic: Status is one of pending / fulfilled / partial / broken / delayed. Set manually on official announcements, gazette notifications, or government press releases. Pipeline auto-marks delayed when a deadline passes and status is still pending.
- Update frequency: Manual entries on official announcements; delayed auto-flag on each hourly run.
- Source: 2026 election manifestos, publicly available policy statements, and official party websites. Data collected before the election.
- Coverage: BJP, TMC, Congress, CPI(M), CPI. Positions on 8 themes: jobs, industry, agriculture, women, minorities, infrastructure, health, governance.
- Update frequency: Static (pre-election manifesto snapshot).
- Written on every pipeline run. Contains lastUpdated (ISO timestamp) and autoChecked (human-readable IST).
- Used by the live-polling script to detect when new data has landed and show the "data updated" toast.
Automated pipeline (hourly)
A GitHub Actions workflow (weekly-update.yml) runs on a 0 * * * * cron schedule — once per hour. The pipeline runs scripts/update.mjs, a Node.js ESM script with no npm runtime dependencies.
- Fetch ED press releases → filter for Bengal keywords → append new entries to cases.json
- Fetch CBI press releases → same filter + append logic
- For each of 8 case subjects: query Google News RSS → deduplicate → write to news.json
- For each of 24 tracked pledges: query Google News RSS for latest headline → store in pledges.json; auto-set delayed if deadline passed
- Write meta.json with current timestamp
- Commit and push if any file changed
The ED/CBI fetches and all Google News fetches run in parallel (concurrency pool of 3) to complete the full run in under 60 seconds. Commits are only made when at least one data file changes.
What "verified" means
The word "verified" is used narrowly — it means attributable to a named primary source, not "true beyond doubt." Page-level definitions:
- MLA criminal records — verified = sourced from the candidate's own ECI affidavit (self-declared).
- Constituency results — verified = ECI has officially declared the result for that seat, not exit-poll or projection.
- Corruption timelines — verified = agency press release or court document cites the subject and case reference.
- Pledge statuses — verified = government gazette, official order, or minister's stated announcement on the record.
Editorial independence
This is a civic education and transparency project with no party affiliation, no advertising, and no government funding. Where a page applies a judgment (e.g. calling an IPC charge "serious"), the criterion is documented and applied uniformly across all parties.
All source code and data are public. Changes to data files are reviewable via git history. If you believe a data change was made in error, open a GitHub issue.
Corrections policy
Corrections are accepted only when supported by a primary source: ECI affidavit, court order, government gazette, or official press release. Screenshots and social media posts are not accepted as sole evidence.
To submit a correction: open a GitHub issue citing (1) the exact incorrect claim and its page, (2) the correct fact, and (3) a stable URL to the primary source. All accepted corrections are logged at /corrections.
This site is a static build. Pages are plain HTML; pipeline scripts are plain Node.js. All data files are version-controlled so every change is datable and attributable. There is no server, no database, and no private data store.