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-11-01 |
| 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-11-01 |
| 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-11-17 |
| daily-sync-policytopic-counts | topics.sync_policytopic_counts |
Recomputes denormalized PolicyTopic counts; un-park needs INDEPENDENT evidence (an audit guard, or a dry run taken BEFORE any manual apply) — not a post-apply dry run, which reports 0 movements regardless of whether the sync logic is correct. The 2026-08-20 parking note's flagged residual (legislation-bills count 45 -> 0) was never diagnosed and still has not been. | 2026-11-01 |
| 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-11-17 |
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 347 on parliament.go.ke · 348 local (1 row delta) 3 missing-local · 0 missing-remote 4 Aug 17:47
Missing locally (on parliament.go.ke, not in our roster)
- HON. KAMAU DOUGLAS, SAMMY, MP — OL KALOU · DCP
- Hon. Raso, Dido Ali — Saku
- RT. HON. (DR.) MOSES F.M. WETANG'ULA, EGH
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 10 Jul 02:48
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
10 Jul 03:23 |
0 | 0 | 0 | 10 Jul 03:23 |
Petitions
hansard_petitions_extract
|
Success — wrote rows
10 Jul 03:27 |
0 | 0 | 0 | 10 Jul 03:27 |
Questions
hansard_questions_extract
|
Success — wrote rows
10 Jul 03:34 |
0 | -1 | 0 | 10 Jul 03:34 |
Statements
hansard_statements_extract
|
Success — wrote rows
10 Jul 03:47 |
0 | 0 | 0 | 10 Jul 03:47 |
Papers laid
hansard_papers_laid_extract
|
Success — wrote rows
10 Jul 03:51 |
0 | 0 | 0 | 10 Jul 03:51 |
Votes
hansard_votes_extract
|
Success — wrote rows
10 Jul 03:56 |
15 | -3 | 0 | 10 Jul 03:56 |
Speaker-attribution drain
AI search coverage
593066 of 866121 Hansard chunks are embedded (68%). This is what the chat assistant searches over.
Hansard
| Source | Last run | Status | Rows | Freshness SLA | Drift alert | 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
|
30 Oct 2026, 03:04
0d ago |
Success | 987 | 129600 s | — | Verify on source ↗ |
Hansards — retained-PDF text extraction candidates
parlgoke_hansard_document_extraction · docling
|
30 Oct 2026, 01:37
0d ago |
Success | 10 | 129600 s | — | Verify on source ↗ |
Official two-House Hansard index — raw observation
hansard_source_observations · http
|
30 Oct 2026, 03:03
0d ago |
Success | 43 | 129600 s |
Delivery failed
configured source-drift alert delivery failed: TransportUnavailable: EMAIL_BACKEND django.core.mail.backends.console.EmailBackend cannot deliver mail |
Verify on source ↗ |
Guard: Hansard two-store reconciliation (daily)
guard_reconcile_hansard_stores · api
|
never | Failed | 0 | 194400 s | — | Verify on source ↗ |
Guard: the published latest sitting keeps up with Parliament's listing (daily)
guard_audit_hansard_ingest_lag · api
|
30 Oct 2026, 01:36
0d ago |
Success | 987 | 194400 s | — | Verify on source ↗ |
Guard: each lane is as current as its source, and is reloaded when it is not (daily)
guard_reconcile_lane_freshness · api
|
30 Oct 2026, 03:03
0d ago |
Failed | 10 | 194400 s | — | Verify on source ↗ |
Guard: contributions carrying no words (daily)
guard_audit_wordless_contributions · api
|
30 Oct 2026, 08:48
0d ago |
Success | 94816 | 194400 s | — | Verify on source ↗ |
Guard: chat embedding coverage + orphan vectors (daily)
guard_audit_embedding_coverage · api
|
30 Oct 2026, 08:48
0d ago |
Success | 928253 | 194400 s | — | Verify on source ↗ |
Guard: chat vector stores still have an ANN index (daily)
guard_audit_vector_index_health · api
|
30 Oct 2026, 08:48
0d ago |
Success | 991910 | 194400 s | — | Verify on source ↗ |
Guard: Hansard store is in the chat's embedding space (daily)
guard_audit_hansard_embed_space · api
|
never | Failed | 0 | 194400 s | — | Verify on source ↗ |
Guard: no chat retrieval lane has gone silent (daily)
guard_audit_retrieval_lane_silence · api
|
30 Oct 2026, 08:53
0d ago |
Success | 32 | 194400 s | — | Verify on source ↗ |
Guard: golden questions still retrieve the right documents (daily)
guard_audit_rag_retrieval_eval · api
|
never | Failed | 0 | 194400 s | — | Verify on source ↗ |
Guard: published sittings still serve a transcript (daily)
guard_audit_hansard_render_integrity · api
|
30 Oct 2026, 08:48
0d ago |
Success | 980 | 194400 s | — | Verify on source ↗ |
Guard: tracker/Hansard reconciliation (weekly)
guard_audit_tracker_hansard_reconciliation · api
|
26 Oct 2026, 06:40
4d ago |
Success | 0 | 1036800 s | — | 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
|
never | Failed | 0 | 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
|
30 Oct 2026, 06:56
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
|
30 Oct 2026, 07:09
0d ago |
Success | 25 | 194400 s | — | Verify on source ↗ |
Legislation
| Source | Last run | Status | Rows | Freshness SLA | Drift alert | 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
|
30 Oct 2026, 01:36
0d ago |
Success | 546 | 691200 s | — | Verify on source ↗ |
Bills — immutable official PDF attribution evidence
parlgoke_bill_attribution_sources · authority_snapshot
|
21 Oct 2026, 01:00
9d ago |
Success | 550 | 129600 s · breached | — | Verify on source ↗ |
Bills — OCR attribution candidate extraction
parlgoke_bill_attribution_extraction · docling
|
30 Oct 2026, 01:36
0d ago |
Success | 0 | 129600 s | — | Verify on source ↗ |
Acts — Kenya Law
kenyalaw_acts · http
|
21 Jun 2026, 21:56
130d ago |
Success | 2966 | 691200 s · breached | — | Verify on source ↗ |
Acts — long-title + commencement enrichment (Kenya Law)
kenyalaw_acts_enrich · http
|
23 Jun 2026, 02:20
129d ago |
Empty | 6 | 129600 s · breached | — | Verify on source ↗ |
Motions tracker — National Assembly
parliament_motions_tracker_na · http
|
3 Sep 2026, 14:50
57d ago |
Success | 174 | 691200 s · breached | — | Verify on source ↗ |
Motions tracker — Senate
parliament_motions_tracker_senate · http
|
3 Sep 2026, 14:51
57d ago |
Success | 67 | 691200 s · breached | — | Verify on source ↗ |
Questions tracker — National Assembly
parliament_question_tracker_na · http
|
3 Sep 2026, 15:01
57d ago |
Success | 683 | 691200 s · breached | — | Verify on source ↗ |
Petitions tracker — National Assembly
parliament_petitions_tracker_na · http
|
3 Sep 2026, 15:07
57d ago |
Success | 119 | 691200 s · breached | — | Verify on source ↗ |
Petitions tracker — Senate
parliament_petitions_tracker_senate · http
|
3 Sep 2026, 15:07
57d ago |
Success | 87 | 691200 s · breached | — | Verify on source ↗ |
Statements tracker — National Assembly
parliament_statements_tracker_national_assembly · http
|
17 Oct 2026, 10:24
13d ago |
Success | 1118 | 691200 s · breached | — | Verify on source ↗ |
Statements tracker — Senate
parliament_statements_tracker_senate · http
|
17 Oct 2026, 10:29
13d ago |
Success | 2406 | 691200 s · breached | — | Verify on source ↗ |
Order Papers — National Assembly
parlgoke_order_papers_na · browser
|
15 Aug 2026, 22:29
75d ago |
Success | 687 | 129600 s · breached | — | Verify on source ↗ |
Order Papers — Senate
parlgoke_order_papers_senate · browser
|
15 Aug 2026, 22:43
75d ago |
Success | 601 | 129600 s · breached | — | Verify on source ↗ |
Guard: civic-alert queue and provider-receipt integrity (daily)
guard_audit_alert_delivery · api
|
30 Oct 2026, 04:10
0d ago |
Success | 0 | 194400 s | — | Verify on source ↗ |
Guard: cross-store vote-duplicate (daily)
guard_audit_votes_cross_store · api
|
30 Oct 2026, 06:43
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
|
30 Oct 2026, 03:10
0d ago |
Success | 115 | 194400 s | — | Verify on source ↗ |
Guard: a failing guard can actually reach a human (daily)
guard_audit_guard_alerting · api
|
never | Failed | 0 | 194400 s | — | Verify on source ↗ |
Guard: published Bills vs the nightly listing inventory (daily)
guard_audit_bill_inventory_coverage · api
|
30 Oct 2026, 07:07
0d ago |
Success | 546 | 194400 s | — | Verify on source ↗ |
Guard: vital-stats ribbon reconciliation (daily)
guard_audit_vital_stats · api
|
30 Oct 2026, 06:46
0d ago |
Success | 10 | 194400 s | — | Verify on source ↗ |
Guard: policy-topic count parity (daily)
guard_audit_policytopic_counts · api
|
30 Oct 2026, 06:48
0d ago |
Success | 64 | 194400 s | — | Verify on source ↗ |
Guard: homepage snapshot reconciliation (daily)
guard_audit_home_snapshot · api
|
13 Oct 2026, 05:48
17d ago |
Success | 2486 | 194400 s · breached | — | Verify on source ↗ |
Guard: the ribbon reconciles to the official trackers (daily)
guard_reconcile_vital_metrics · api
|
30 Aug 2026, 05:46
0d ago |
Failed | 7 | 194400 s | — | Verify on source ↗ |
Guard: sealed tracker evidence present, fresh and verifying (daily)
guard_audit_tracker_evidence · api
|
30 Oct 2026, 07:06
0d ago |
Success | 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
|
28 Oct 2026, 07:15
0d ago |
Failed | 518 | 194400 s | — | Verify on source ↗ |
Guard: published Bills vs the Houses' own Bills Trackers (daily)
guard_audit_bills_against_tracker · api
|
20 Oct 2026, 07:23
0d ago |
Failed | 542 | 194400 s | — | Verify on source ↗ |
Guard: published Bill sponsor counts vs a fresh derivation (daily)
guard_rebuild_bill_sponsor_facts · api
|
28 Oct 2026, 07:33
0d ago |
Failed | 251 | 194400 s | — | Verify on source ↗ |
Gazette
| Source | Last run | Status | Rows | Freshness SLA | Drift alert | Authority |
|---|---|---|---|---|---|---|
Kenya Gazette — Kenya Law
kenyalaw_gazette · http
|
5 Jul 2026, 06:40
117d ago |
Success | 102 | 691200 s · breached | — | Verify on source ↗ |
Members
| Source | Last run | Status | Rows | Freshness SLA | Drift alert | Authority |
|---|---|---|---|---|---|---|
MPs — National Assembly directory
parlgoke_members_na · http
|
4 Aug 2026, 17:47
86d ago |
Success | 347 | 129600 s · breached | — | Verify on source ↗ |
Senators — Senate directory
parlgoke_members_senate · http
|
10 Jul 2026, 02:48
112d ago |
Success | 67 | 129600 s · breached | — | Verify on source ↗ |
Certified member sources — raw Parliament observation
certified_member_sources · http
|
30 Oct 2026, 00:05
0d ago |
Success | 570 | 129600 s |
Delivery failed
configured source-drift alert delivery failed: TransportUnavailable: EMAIL_BACKEND django.core.mail.backends.console.EmailBackend cannot deliver mail |
Verify on source ↗ |
Official committee directories and pages — raw observation
committee_source_observations · http
|
30 Oct 2026, 01:36
0d ago |
Success | 69 | 129600 s | Nothing to send | 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
|
30 Oct 2026, 06:40
0d ago |
Success | 13424 | 194400 s | — | Verify on source ↗ |
Guard: biographies corroborate their own subject (daily)
guard_audit_bio_identity · api
|
30 Oct 2026, 07:07
0d ago |
Success | 89 | 194400 s | — | Verify on source ↗ |
Guard: topic-coverage (daily)
guard_audit_topic_coverage · api
|
never | Failed | 0 | 194400 s | — | Verify on source ↗ |
Guard: the countercheck runs on the intended model (daily)
guard_check_countercheck_providers · api
|
30 Oct 2026, 06:57
0d ago |
Success | 237 | 194400 s | — | Verify on source ↗ |
Guard: member-totals parity (daily)
guard_audit_member_totals · api
|
30 Oct 2026, 06:45
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 · breached | — | Verify on source ↗ |
Guard: every sitting member is findable in member search (daily)
guard_audit_member_search_coverage · api
|
30 Oct 2026, 06:41
0d ago |
Success | 417 | 194400 s | — | Verify on source ↗ |
Guard: verified identity bindings re-derive (daily)
guard_audit_identity_bindings · api
|
30 Oct 2026, 06:41
0d ago |
Success | 0 | 194400 s | — | Verify on source ↗ |
Guard: member publication verdicts current and intact (daily)
guard_audit_member_publication_verdicts · api
|
never | Failed | 0 | 194400 s | — | Verify on source ↗ |
Guard: scorecard house-stats reconciliation (daily)
guard_audit_scorecard_house_stats · api
|
30 Oct 2026, 06:57
0d ago |
Success | 415 | 194400 s | — | Verify on source ↗ |
Guard: roster seat columns still match the canonical roster (daily)
guard_audit_roster_seat_integrity · api
|
30 Oct 2026, 06:45
0d ago |
Success | 428 | 194400 s | — | Verify on source ↗ |
Media
| Source | Last run | Status | Rows | Freshness SLA | Drift alert | Authority |
|---|---|---|---|---|---|---|
Guard: every offered search section can return rows (daily)
guard_audit_search_section_coverage · api
|
30 Oct 2026, 06:57
0d ago |
Success | 7 | 194400 s | — | Verify on source ↗ |
Publicfinance
| Source | Last run | Status | Rows | Freshness SLA | Drift alert | Authority |
|---|---|---|---|---|---|---|
Guard: NG-CDF published sum vs the printed Annex total (weekly)
guard_audit_ngcdf_printed_total · api
|
25 Oct 2026, 04:02
5d ago |
Success | 290 | 691200 s | — | Verify on source ↗ |
Guard: NG-CDF project replay from retained bytes (weekly)
guard_audit_ngcdf_project_replay · api
|
25 Oct 2026, 03:40
5d ago |
Success | 0 | 691200 s | — | Verify on source ↗ |
Elections
| Source | Last run | Status | Rows | Freshness SLA | Drift alert | Authority |
|---|---|---|---|---|---|---|
Guard: repeated gazetted ward codes, exactly the known two (weekly)
guard_audit_ward_code_collisions · api
|
25 Oct 2026, 06:34
5d ago |
Success | 1450 | 691200 s | — | Verify on source ↗ |
Bills
| Source | Last run | Status | Rows | Freshness SLA | Drift alert | Authority |
|---|---|---|---|---|---|---|
Guard: merged Bill table vs the two legacy tables (daily)
guard_sync_merged_bill_table · api
|
30 Oct 2026, 06:45
0d ago |
Success | 788 | 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 ↗ |