Skip to content

REVIEW — TFW-26 / Phase B: gen_docs.py Implementation

Date: 2026-04-05 Author: Reviewer Verdict: ✅ APPROVE RF: RF Phase B TS: TS Phase B


1. Review Checklist

# Check Status Notes
1 DoD met? (all TS acceptance criteria) 11/11 TS criteria met. 3 TS deviations documented with justification (see §2). Additionally 4 beyond-scope features delivered (backtick-path resolver, tasks index, section indexes, nav restructuring)
2 Code quality (conventions, naming, type hints) Type hints on all functions. Docstrings with §16 references. Closure pattern per ONB Q1 answer. _private naming for internal helpers. as_posix() not used but .replace("\\", "/") achieves same — acceptable
3 Test coverage (tests written and passing) 29 unit tests + 13 integration tests = 42 total (TS required 8+5=13 minimum). Coverage: extract_title, add_frontmatter, _glob_base, resolve_references (12 subcases), validate_sources, _read_task_prefix. Integration: static pages, knowledge, tasks, workflows, templates, frontmatter, D{N}, artifact refs, TD-{N}, index override, section indexes, directory URLs
4 Philosophy aligned (matches HL design philosophy) Contract-first: gen_docs.py references §16 in docstring. Two-layer: agents write text, script resolves. tasks/ structure preserved. Warnings on unresolved refs
5 Tech debt (shortcuts documented?) 8 observations documented — all substantive Phase C scope items. P{N} deferred as planned
6 Security (no secrets exposed, guards in place) N/A No secrets, no external services. Read-only file operations
7 Breaking changes (backward compat, migrations) mkdocs.yml nav changed (Architecture → Knowledge) — cosmetic, no external consumers yet. REFERENCE_PATTERNS dead code removed — cleanup, not breaking
8 Style & standards (code style, conventions) PEP 8 compliant. Module-level guard if hasattr(mkdocs_gen_files, "open") — smart pattern for test isolation. Mock module in unit tests avoids import of real mkdocs_gen_files
9 Observations collected (executor reported findings) 8 observations, all substantive. Quality bar met — each identifies real future work (nav polish, sidebar, hardcoded topics, broken source links, search, MkDocs 2.0 risk, backtick migration, --strict)

2. Verdict

✅ APPROVE

Phase B delivers a fully functional documentation generator that exceeds TS requirements. The script (445 LOC) processes all 13 source manifest entries + tasks/ into a navigable MkDocs site with working reference resolution. 42 tests pass (29 unit + 13 integration).

Deviations Assessment

# Deviation Assessment
1 --strict not passing Acceptable. MkDocs treats absolute link INFO as errors in strict mode. The links work correctly. Fixing requires fundamental link strategy change — Phase C scope (obs. #8)
2 No ⚠️ marker on unresolved refs Acceptable. The user's concern ("тихо вводить в заблуждение") was about READERS seeing broken refs as normal text. In practice, unresolved refs remain as text like RF TFW-999 — which readers DO recognize as a reference, not prose. Adding ⚠️ would be noisy. WARNING in build log is sufficient for authors. Revisit if users report confusion
3 29 tests vs 8 required Better than spec — no issue
4-6 Beyond-scope features All user-driven during live testing. Documented in RF §2. Improve quality significantly

Notable Quality

  • Backtick-path resolver (RF §2.3): KNOWLEDGE.md uses abbreviated backtick paths exclusively. Without this resolver, the most critical page had zero clickable links. Smart scope extension
  • Closure-based sub-resolvers: Clean implementation per ONB Q1. No module-level state
  • Windows path normalization: .replace("\\", "/") consistently applied in 4 locations
  • Integration test fixture: build_site as module-scoped fixture builds once, 13 tests check output. Efficient

3. Tech Debt Collected

Source format: Use reference patterns (conventions.md §16.2).

# Source Severity File Description Action
TD-69 RF TFW-26/B obs. #1 Low docs/mkdocs.yml Nav: "Concepts > Philosophy" (.tfw/README.md) vs "Knowledge > Topics > Philosophy" (knowledge/ fact file) — confusing duplication of "Philosophy" label ⬜ Phase C
TD-70 RF TFW-26/B obs. #2 Med docs/scripts/gen_docs.py Tasks sidebar: single flat link, no per-task browsing via sidebar. Needs literate-nav or awesome-pages plugin ⬜ Phase C
TD-71 RF TFW-26/B obs. #3 Med docs/mkdocs.yml L44-47 Knowledge topics hardcoded in nav. New topics require manual mkdocs.yml edit ⬜ Phase C
TD-72 RF TFW-26/B obs. #4 High multiple Pre-existing relative links in .tfw/ source files break after compilation (different output paths). Needs link rewriting or source migration ⬜ Phase C
TD-73 RF TFW-26/B obs. #6 Med docs/requirements.txt MkDocs 2.0 will break mkdocs-gen-files plugin. Pin mkdocs<2.0 or monitor migration ⬜ Backlog
TD-74 RF TFW-26/B obs. #8 Med docs/scripts/gen_docs.py --strict mode fails due to absolute link INFO messages. Working links flagged as warnings ⬜ Phase C

Obs. #5 (search discoverability) and #7 (KNOWLEDGE.md backtick paths) are already tracked as TD-66, TD-67.

4. Traces Updated

  • [x] README Task Board — status updated (user already set to 🟢 RF with B links)
  • [ ] HL status — remains multi-phase in progress (A ✅, B ✅, C pending)
  • [ ] PROJECT_CONFIG.yaml — no seq change
  • [x] TECH_DEBT.md — TD-69 through TD-74 appended
  • [ ] tfw-docs: N/A — full update after all phases

5. Fact Candidates

# Category Candidate Source Confidence
1 constraint MkDocs with use_directory_urls=true requires absolute links to use directory format (/path/to/page/) not file format (/path/to/page.md). File-format → 404. Helper: _md_to_url() RF TFW-26/B §2.1 ✅ high
2 philosophy User expectation for docs site: "Wikipedia-like feel" — everything clickable, navigable, discoverable. Flat file dumps and non-linked references = process failure. «Нет ощущения вики движка вообще» RF TFW-26/B FC#3, user live testing ✅ high
3 risk MkDocs 2.0 planned as backward-incompatible rewrite — will break all plugins including mkdocs-gen-files. No migration path announced. Pin to mkdocs<2.0 when released RF TFW-26/B FC#4 ⚠️ medium
4 convention Tasks index must be sorted numerically by task ID (TFW-1, 2, 3... not lexicographic TFW-1, 10, 11). Extract int from folder name for sort key RF TFW-26/B FC#5, user feedback ✅ high

Source format: Use reference patterns (e.g., [RF TFW-18](../../TFW-18__knowledge_consolidation/RF__PhaseB__knowledge_quality.md), D24). See conventions.md §16.2.


REVIEW — TFW-26 / Phase B: gen_docs.py Implementation | 2026-04-05