Data health
Every fact on Mzalendo is drillable to its source. This page shows when we last fetched each one, whether it is within its freshness target, and how to verify it yourself.
Parked scheduled jobs (5)
These jobs are defined in the beat schedule but the production task-policy partition withholds them from unattended execution — they do not run automatically. Listed here so the withholding is visible, not silent. Each is reviewed by its date below.
| Job | Task | Why parked | Review by |
|---|---|---|---|
| daily-parlgoke-roster-snapshot | parliament.parlgoke_roster_snapshot |
Captures editorial snapshots directly; needs raw-observation conversion. Same shape as the accuracy check above; convert together. Measured consequence (dev, 2026-08-29): with both parked and `propose_member_profile_evidence` on no schedule at all, member evidence is refreshed only by hand. Its TTL is snapshot retrieval + 30 days, so ~30 days after any manual load every current member's MemberPublicationVerdict expires — 418 of 418 stale, 401 of 418 evidence-expired, 397 of 417 members disagreeing with a fresh derive. `daily-rebuild-member-publication` still runs nightly and cannot fix it: it recomputes the expiry from the same lapsed evidence. Readers keep seeing every member (the trust check is a fast path, never a gate) but pay the per-member derive the warehouse exists to avoid. CORRECTION, same day (MZ-1203): un-parking these two is NOT the remedy, and this note said it was. `daily-certified-member-source-observation` (00:05) ALREADY retains the day's roster bytes, so no new fetching was needed — what was missing was a renewal step over the bytes we hold, now `politicians.renew_member_fact_evidence` at 02:30, plus the loader-side predicate that let an expired claim be replaced at all. These two stay parked on their own merits. `daily-member-publication-verdict-audit` (04:25) reports the chain. | 2026-09-15 |
| daily-roster-accuracy-check | parliament.roster_accuracy_check |
Writes RosterVerificationRun outside the crawler API; needs raw-observation conversion. Consequence while parked: the public 'last verified' badge only moves on a manual run — AND, corrected 2026-08-29 (MZ-20260829-V), the whole member-evidence chain has no automated refresh. See the note on the pair below. | 2026-09-15 |
| daily-search-health-check | search.health_check_deployment |
Creates/repairs pgai vectorizer database objects — schema repair, not a data refresh; needs an operational role designed for unattended DDL. Consequence while parked is now SMALL: it never reindexed anyway (the deployment mode explicitly skips backfill and reindex), and the index refresh it was wrongly relied on for runs at 02:20 as `daily-search-content-reindex`, watched at 05:52 by `daily-search-section-coverage-audit`. | 2026-10-01 |
| daily-sync-policytopic-counts | topics.sync_policytopic_counts |
BLOCKED ON AN UNDIAGNOSED MOVEMENT, not on MZ-469 (reason corrected 2026-08-20, MZ-1181). The MZ-469 citation this entry inherited is discharged — see the note above. What blocks it now is its own dry run, measured on prod 2026-08-20: it would move 27 of 64 topics, and six of those movements are far too large to be nightly drift — statements 1,170 -> 530, questions-answers 1,025 -> 481, legislation-bills 45 -> 0, parliamentary-procedures 59 -> 7, motions 57 -> 7, cost-of-living 72 -> 23 — while others rise. Diagnose which population definition moved before automating it; a task that halves a citizen-visible topic count unattended must be understood first. RE-MEASURED ON DEV 2026-09-05 (Workstream A parked-job review): the same dry run now reports 'Would update 0 of 64 topics; 61 have in-scope contributions'. That is NOT grounds to un-park. The blocking measurement was taken on PROD, dev and prod are known to diverge on exactly this kind of derived population, and a clean dev run cannot tell a fixed definition from a different corpus. THE UN-PARK CONDITION IS NOW EXACT: run `manage.py sync_policytopic_counts --dry-run` on production; un-park if it reports 0 movements, and if it still moves topics, record the new numbers here instead. | 2026-09-15 |
| weekly-search-maintenance | search.health_check_maintenance |
Same pgai schema repair as above, plus a 30-60 minute vectorizer backfill on a 2-vCPU box. Its reindex leg is superseded by `daily-search-content-reindex`; what remains parked is the trigger repair and the queue backfill, neither of which has ever been measured on prod. Un-parking needs that measurement first — and note the task SWALLOWS its own exceptions and returns success=False without raising, so scheduling it as-is would buy a job that can fail silently on a schedule. | 2026-10-01 |
Roster drift
How the parliament.go.ke MP & Senator directories compare to our local roster. Green = within 2 rows, amber = 3-10, red = >10.
National Assembly 0 on parliament.go.ke · 0 local (0 row delta) 0 missing-local · 0 missing-remote 3 Aug 11:14
Missing locally (on parliament.go.ke, not in our roster)
None.
Missing remotely (in our roster, not on parliament.go.ke)
None.
Senate 67 on parliament.go.ke · 67 local (0 row delta) 0 missing-local · 0 missing-remote 13 Jul 02:47
Missing locally (on parliament.go.ke, not in our roster)
None.
Missing remotely (in our roster, not on parliament.go.ke)
None.
Extractor queue
Per-extractor delta vs the previous run + currently-pending Celery tasks. Use this when a downstream count looks stale.
| Extractor | Last run | Rows last run | Δ vs previous | Queue depth | Last success |
|---|---|---|---|---|---|
Bill stages
bill_stage_extractor
|
Success — wrote rows
1 Jul 10:15 |
0 | 0 | 0 | 1 Jul 10:15 |
Gazette notices
kenyalaw_gazette_extract
|
Success — wrote rows
1 Jul 10:23 |
0 | -6 | 0 | 1 Jul 10:23 |
Motions
hansard_motions_extract
|
Success — wrote rows
13 Jul 03:10 |
1 | +1 | 0 | 13 Jul 03:10 |
Petitions
hansard_petitions_extract
|
Success — wrote rows
13 Jul 03:20 |
0 | 0 | 0 | 13 Jul 03:20 |
Questions
hansard_questions_extract
|
Success — wrote rows
13 Jul 03:30 |
0 | 0 | 0 | 13 Jul 03:30 |
Statements
hansard_statements_extract
|
Success — wrote rows
13 Jul 03:40 |
0 | 0 | 0 | 13 Jul 03:40 |
Papers laid
hansard_papers_laid_extract
|
Success — wrote rows
13 Jul 03:50 |
0 | 0 | 0 | 13 Jul 03:50 |
Votes
hansard_votes_extract
|
Success — wrote rows
13 Jul 03:55 |
9 | 0 | 0 | 13 Jul 03:55 |
Speaker-attribution drain
AI search coverage
847290 of 847290 Hansard chunks are embedded (100%). This is what the chat assistant searches over.
Hansard
| Source | Last run | Status | Rows | Freshness SLA | Authority |
|---|---|---|---|---|---|
Hansard — National Assembly
tazabu_hansard_na · http
|
never | No_run | 0 | 129600 s · breached | Verify on source ↗ |
Hansard — Senate
tazabu_hansard_senate · http
|
never | No_run | 0 | 129600 s · breached | Verify on source ↗ |
Hansards — immutable official PDF evidence
parlgoke_hansard_document_sources · authority_snapshot
|
20 Sep 2026, 00:51
0d ago |
Success | 958 | 129600 s | Verify on source ↗ |
Hansards — retained-PDF text extraction candidates
parlgoke_hansard_document_extraction · docling
|
20 Sep 2026, 00:51
0d ago |
Success | 10 | 129600 s | Verify on source ↗ |
Official two-House Hansard index — raw observation
hansard_source_observations · http
|
20 Sep 2026, 00:50
0d ago |
Success | 42 | 129600 s | Verify on source ↗ |
Guard: Hansard two-store reconciliation (daily)
guard_reconcile_hansard_stores · api
|
31 Aug 2026, 06:53
0d ago |
Failed | 3071 | 194400 s | Verify on source ↗ |
Guard: contributions carrying no words (daily)
guard_audit_wordless_contributions · api
|
20 Sep 2026, 07:26
0d ago |
Success | 95092 | 194400 s | Verify on source ↗ |
Guard: chat embedding coverage + orphan vectors (daily)
guard_audit_embedding_coverage · api
|
20 Sep 2026, 07:40
0d ago |
Success | 889461 | 194400 s | Verify on source ↗ |
Guard: chat vector stores still have an ANN index (daily)
guard_audit_vector_index_health · api
|
20 Sep 2026, 07:56
0d ago |
Success | 1671288 | 194400 s | Verify on source ↗ |
Guard: no chat retrieval lane has gone silent (daily)
guard_audit_retrieval_lane_silence · api
|
20 Sep 2026, 08:11
0d ago |
Success | 32 | 194400 s | Verify on source ↗ |
Guard: published sittings still serve a transcript (daily)
guard_audit_hansard_render_integrity · api
|
20 Sep 2026, 07:56
0d ago |
Success | 941 | 194400 s | Verify on source ↗ |
Guard: tracker/Hansard reconciliation (weekly)
guard_audit_tracker_hansard_reconciliation · api
|
never | Failed | 0 | 1036800 s · breached | Verify on source ↗ |
Guard: Hansard ranking readiness (daily)
guard_audit_hansard_ranking_readiness · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Guard: attributed Hansard speech that no public count covers (daily)
guard_audit_stranded_attribution · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Guard: every Hansard byline still reaches the member it names (daily)
guard_audit_hansard_byline_resolution · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Guard: the Senate's record and the published contributions agree (daily)
guard_audit_senate_contribution_reconciliation · api
|
20 Sep 2026, 05:42
0d ago |
Success | 71 | 194400 s | Verify on source ↗ |
Guard: Hansard speaker labels carry only a label (daily)
guard_audit_hansard_label_integrity · api
|
12 Aug 2026, 05:35
0d ago |
Failed | 236028 | 194400 s | Verify on source ↗ |
Guard: duplicate sittings flagged, and flagging hides no member (daily)
guard_audit_duplicate_sitting_integrity · api
|
20 Sep 2026, 05:45
0d ago |
Success | 931 | 194400 s | Verify on source ↗ |
Guard: stored Hansard text vs its source PDF, newest first (daily batch)
guard_audit_hansard_source_coverage · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Legislation
| Source | Last run | Status | Rows | Freshness SLA | Authority |
|---|---|---|---|---|---|
Bills — Parliament of Kenya
parlgoke_bills · http
|
never | No_run | 0 | 691200 s · breached | Verify on source ↗ |
Bills — retained atomic two-House crawl
parlgoke_bills_atomic · http
|
20 Sep 2026, 01:08
0d ago |
Success | 535 | 691200 s | Verify on source ↗ |
Bills — immutable official PDF attribution evidence
parlgoke_bill_attribution_sources · authority_snapshot
|
20 Sep 2026, 01:08
0d ago |
Success | 539 | 129600 s | Verify on source ↗ |
Bills — OCR attribution candidate extraction
parlgoke_bill_attribution_extraction · docling
|
20 Sep 2026, 01:30
0d ago |
Success | 5 | 129600 s | Verify on source ↗ |
Acts — Kenya Law
kenyalaw_acts · http
|
21 Jun 2026, 21:56
90d ago |
Failed | 2966 | 691200 s · breached | Verify on source ↗ |
Acts — long-title + commencement enrichment (Kenya Law)
kenyalaw_acts_enrich · http
|
23 Jun 2026, 02:20
89d ago |
Empty | 6 | 129600 s · breached | Verify on source ↗ |
Motions tracker — National Assembly
parliament_motions_tracker_na · http
|
13 Jul 2026, 06:00
69d ago |
Success | 153 | 691200 s · breached | Verify on source ↗ |
Motions tracker — Senate
parliament_motions_tracker_senate · http
|
2 Jul 2026, 12:53
80d ago |
Empty | 56 | 691200 s · breached | Verify on source ↗ |
Questions tracker — National Assembly
parliament_question_tracker_na · http
|
13 Jul 2026, 06:30
69d ago |
Success | 24 | 691200 s · breached | Verify on source ↗ |
Petitions tracker — National Assembly
parliament_petitions_tracker_na · http
|
13 Jul 2026, 06:20
69d ago |
Success | 19 | 691200 s · breached | Verify on source ↗ |
Petitions tracker — Senate
parliament_petitions_tracker_senate · http
|
13 Jul 2026, 06:20
69d ago |
Success | 1 | 691200 s · breached | Verify on source ↗ |
Statements tracker — National Assembly
parliament_statements_tracker_national_assembly · http
|
13 Jul 2026, 06:40
69d ago |
Success | 373 | 691200 s · breached | Verify on source ↗ |
Statements tracker — Senate
parliament_statements_tracker_senate · http
|
13 Jul 2026, 06:42
69d ago |
Success | 515 | 691200 s · breached | Verify on source ↗ |
Order Papers — National Assembly
parlgoke_order_papers_na · browser
|
13 Jul 2026, 03:03
69d ago |
Success | 50 | 129600 s · breached | Verify on source ↗ |
Order Papers — Senate
parlgoke_order_papers_senate · browser
|
13 Jul 2026, 03:02
69d ago |
Success | 50 | 129600 s · breached | Verify on source ↗ |
Guard: civic-alert queue and provider-receipt integrity (daily)
guard_audit_alert_delivery · api
|
20 Sep 2026, 04:10
0d ago |
Success | 0 | 194400 s | Verify on source ↗ |
Guard: cross-store vote-duplicate (daily)
guard_audit_votes_cross_store · api
|
20 Sep 2026, 04:59
0d ago |
Success | 30 | 194400 s | Verify on source ↗ |
Guard: the configured beat schedule is the running one (daily)
guard_audit_beat_schedule_installed · api
|
20 Sep 2026, 03:10
0d ago |
Success | 100 | 194400 s | Verify on source ↗ |
Guard: vital-stats ribbon reconciliation (daily)
guard_audit_vital_stats · api
|
5 Sep 2026, 05:25
0d ago |
Failed | 10 | 194400 s | Verify on source ↗ |
Guard: policy-topic count parity (daily)
guard_audit_policytopic_counts · api
|
20 Sep 2026, 05:41
0d ago |
Success | 64 | 194400 s | Verify on source ↗ |
Guard: homepage snapshot reconciliation (daily)
guard_audit_home_snapshot · api
|
20 Sep 2026, 05:45
0d ago |
Success | 1618 | 194400 s | Verify on source ↗ |
Guard: the ribbon reconciles to the official trackers (daily)
guard_reconcile_vital_metrics · api
|
5 Sep 2026, 05:45
0d ago |
Failed | 7 | 194400 s | Verify on source ↗ |
Guard: sealed tracker evidence present, fresh and verifying (daily)
guard_audit_tracker_evidence · api
|
1 Sep 2026, 05:45
0d ago |
Failed | 7 | 194400 s | Verify on source ↗ |
Guard: no division advertises more votes than its roll holds (daily)
guard_audit_division_roll_balance · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Guard: House-business tracker -> member metric coverage (weekly)
guard_audit_tracker_member_coverage · api
|
never | Failed | 0 | 1036800 s | Verify on source ↗ |
Guard: Bill inventory and sponsor reconciliation (daily)
guard_audit_bill_sponsor_coverage · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Guard: literal Bills Tracker sponsor projection (daily)
guard_audit_bill_tracker_interim · api
|
10 Sep 2026, 08:47
0d ago |
Failed | 502 | 194400 s | Verify on source ↗ |
Guard: published Bills vs the Houses' own Bills Trackers (daily)
guard_audit_bills_against_tracker · api
|
never | Failed | 0 | 194400 s · breached | Verify on source ↗ |
Guard: published Bill sponsor counts vs a fresh derivation (daily)
guard_rebuild_bill_sponsor_facts · api
|
10 Sep 2026, 06:33
0d ago |
Failed | 245 | 194400 s | Verify on source ↗ |
Gazette
| Source | Last run | Status | Rows | Freshness SLA | Authority |
|---|---|---|---|---|---|
Kenya Gazette — Kenya Law
kenyalaw_gazette · http
|
5 Jul 2026, 06:40
77d ago |
Success | 102 | 691200 s · breached | Verify on source ↗ |
Members
| Source | Last run | Status | Rows | Freshness SLA | Authority |
|---|---|---|---|---|---|
MPs — National Assembly directory
parlgoke_members_na · http
|
13 Jul 2026, 02:45
69d ago |
Failed | 341 | 129600 s · breached | Verify on source ↗ |
Senators — Senate directory
parlgoke_members_senate · http
|
13 Jul 2026, 02:47
69d ago |
Success | 67 | 129600 s · breached | Verify on source ↗ |
Certified member sources — raw Parliament observation
certified_member_sources · http
|
20 Sep 2026, 00:05
0d ago |
Success | 525 | 129600 s | Verify on source ↗ |
Official committee directories and pages — raw observation
committee_source_observations · http
|
20 Sep 2026, 00:45
0d ago |
Success | 69 | 129600 s | Verify on source ↗ |
Top Performers — committee ranking readiness guard
guard_audit_committee_ranking_readiness · api
|
never | Failed | 0 | 129600 s | Verify on source ↗ |
Official county and constituency stable-ID inventory
official_boundary_inventory · http
|
never | No_run | 0 | 691200 s · breached | Verify on source ↗ |
Guard: staff discovery probes for unseen source documents (weekly)
guard_run_direction_probes · api
|
never | Failed | 0 | 1036800 s | Verify on source ↗ |
Guard: 13th-Parliament reconciliation (daily)
guard_audit_13th_reconciliation · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Guard: non-official source traces (daily)
guard_audit_unofficial_sources · api
|
20 Sep 2026, 04:35
0d ago |
Success | 13424 | 194400 s | Verify on source ↗ |
Guard: biographies corroborate their own subject (daily)
guard_audit_bio_identity · api
|
20 Sep 2026, 06:35
0d ago |
Success | 89 | 194400 s | Verify on source ↗ |
Guard: topic-coverage (daily)
guard_audit_topic_coverage · api
|
27 Jul 2026, 04:50
0d ago |
Failed | 416 | 194400 s | Verify on source ↗ |
Guard: the countercheck runs on the intended model (daily)
guard_check_countercheck_providers · api
|
20 Sep 2026, 06:04
0d ago |
Success | 324 | 194400 s | Verify on source ↗ |
Guard: member-totals parity (daily)
guard_audit_member_totals · api
|
20 Sep 2026, 05:06
0d ago |
Success | 367 | 194400 s | Verify on source ↗ |
Guard: membership fact evidence staleness + lead time (daily)
guard_audit_membership_fact_evidence · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Guard: every sitting member is findable in member search (daily)
guard_audit_member_search_coverage · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Guard: verified identity bindings re-derive (daily)
guard_audit_identity_bindings · api
|
20 Sep 2026, 04:45
0d ago |
Success | 0 | 194400 s | Verify on source ↗ |
Guard: member publication verdicts current and intact (daily)
guard_audit_member_publication_verdicts · api
|
2 Sep 2026, 05:42
0d ago |
Failed | 417 | 194400 s | Verify on source ↗ |
Guard: scorecard house-stats reconciliation (daily)
guard_audit_scorecard_house_stats · api
|
5 Sep 2026, 05:55
0d ago |
Failed | 415 | 194400 s | Verify on source ↗ |
Guard: roster seat columns still match the canonical roster (daily)
guard_audit_roster_seat_integrity · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Media
| Source | Last run | Status | Rows | Freshness SLA | Authority |
|---|---|---|---|---|---|
Guard: every offered search section can return rows (daily)
guard_audit_search_section_coverage · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |
Publicfinance
| Source | Last run | Status | Rows | Freshness SLA | Authority |
|---|---|---|---|---|---|
Guard: NG-CDF published sum vs the printed Annex total (weekly)
guard_audit_ngcdf_printed_total · api
|
never | Failed | 0 | 691200 s | Verify on source ↗ |
Guard: NG-CDF project replay from retained bytes (weekly)
guard_audit_ngcdf_project_replay · api
|
never | Failed | 0 | 691200 s | Verify on source ↗ |
Elections
| Source | Last run | Status | Rows | Freshness SLA | Authority |
|---|---|---|---|---|---|
Guard: repeated gazetted ward codes, exactly the known two (weekly)
guard_audit_ward_code_collisions · api
|
20 Sep 2026, 04:26
0d ago |
Success | 1450 | 691200 s | Verify on source ↗ |
Bills
| Source | Last run | Status | Rows | Freshness SLA | Authority |
|---|---|---|---|---|---|
Guard: merged Bill table vs the two legacy tables (daily)
guard_sync_merged_bill_table · api
|
20 Sep 2026, 05:25
0d ago |
Success | 720 | 194400 s | Verify on source ↗ |
Guard: a Bill's shown stage rests on dated official evidence (daily)
guard_audit_bill_stage_provenance · api
|
never | Failed | 0 | 194400 s | Verify on source ↗ |