wiki_sync.py fetched and parsed external wikitext with no eval reaching
its parser or SECTION_MAP; a drift there would silently emit wrong
diffs/prompts. Add a thin --from-file seam to check/diff/prompt that
reads wikitext from disk, skips the network fetch, and skips the sync
state write, then add an invented offline fixture and WIKI-01..03 rows
exercising the mapped-section and unmapped-section paths through it.
The fixture pins the parser, not the world; live-page drift detection
remains cmd_check. Never copy real wikitext into fixtures.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6CYksdLbXbTAxcAQjvHz5
Insert `from __future__ import annotations` in the 17 files that use
PEP 604/585 annotations in module-level positions evaluated at import
time, so scripts/banned_phrase_scan.py and friends no longer raise
TypeError on Python 3.8/3.9. Add a 3.8 leg to the CI matrix so the
floor claim in README.md is actually gated, and correct the two
imprecise "439 deterministic cases" references to "440 deterministic
script cases (439 pass, 1 documented xfail)".
New scripts must carry the future-import until the floor is raised;
if the maintainer later chooses 3.10+, delete the CI 3.8 leg and
README claim together.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6CYksdLbXbTAxcAQjvHz5