Twinned from https://github.com/cfsh/ninefold/issues/924 by tools/beads/import_github.py's reconcile pass.
Implement T2 from design_docs/008-live-status-for-design-doc-tasks.md (§8). T1 (grant jcantsp-bot the project scope) is already satisfied — gh auth status confirms project is in the token scopes. This is the one real merge-order dependency almost everything else in #913 has (T3, T5, T6 each just need this merged).
Goal: a fakeable, zero-clone-dependency Python package wrapping every gh REST/GraphQL call this feature needs — reading task issues/Project status/a doc's task table, and writing (creating issues, Projects, items, setting Status, closing a Project) — plus the pure task-table parser shared by every consumer.
Context: tools/web_frontend/server.py's private Gh class is the existing "no clone dependency" precedent (subprocess-wraps gh, no nflib import, no cwd assumption), but for issues/PRs only, not Projects, and read-only. nflib.fakes.FakeGh is the existing fake-shape precedent for tests. gh project --help confirms every subcommand needed exists (§2 of the design doc). The write path (Project/item create, status edit, close) should be built and tested against a real Project now that T1 is satisfied, not only a fake.
Files: tools/github_live/__init__.py, tools/github_live/gh.py, tools/github_live/tasks.py, tools/github_live/parser.py, tools/github_live/tests/ (cross-linked into tools/tests/).
Expected behaviour: see design doc §6's function list. parse_task_table takes raw markdown and returns rows with an explicit "Issue column missing" error case, since operationalize_design.py --dry-run (T3) depends on that exact signal.
Test plan: unit tests against a fake gh subprocess (record/replay JSON fixtures, no live network) are the CI-safe suite; a live smoke test against a real Project (gated behind an env var, not run in default presubmit.py) runs routinely during development, since T1 has already landed.
PR shape: one PR, branching from main.
Done when: tools/tests/ passes with tools/github_live/ cross-linked; the package has zero imports from nflib or anything else in tools//shared//games/, verified the same way StandaloneTests verifies web_frontend.
Not perimeter-denied (not under tools/nflib/*, tools/reviewer/*, or tools/pr/merge_pr.py — checked against perimeter.py's GOVERNANCE tuple), so this merges on the normal Tier-0 bot review, not on @aedanpope's approval specifically.
None.
No comments.