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.

74sources tracked
54within SLA
20SLA breached
4never run
31failed last attempt

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.

JobTaskWhy parkedReview 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

595847 total speech rows
375028 attributed
220819 NULL contributor
62.9% resolved share
0 resolved last 24h

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 ↗