The dev cycle that closed #22-#28 (and #24) landed the correctness fixes and the highest-value, lowest-risk server fixes, but deferred the larger MCP/skill refactor because it is a big change to two untested 1000+ line files and is a maintainability improvement rather than a correctness bug. Tracking the remainder here.
From #30 (MCP/skill drift) — NOT yet done
The full shared-core extraction (pull ~450 lines of duplicated pure logic into skill/survey_query.py, imported by the server and vendored two-file by the skill) is outstanding. One of the seven divergences was fixed in the cycle: the ASCII-only tokenizer is now Unicode/accent-insensitive in BOTH copies. The remaining six behavioral divergences still stand:
- survey-filter case sensitivity (MCP insensitive, skill sensitive)
- form-name fallback (skill falls back to questions.json; MCP
lookup_var/get_gate_chain don't)
- data-detected sentinels printed by MCP, not by the skill
- opposite choices-source preference
- gate resolution ("always asked" wrong on MCP for group-gated vars)
- nested-repeat count-var resolution differs
From #29 (server robustness) — partially done
Done this cycle: config-entry startup crash guard (#29.2), keep-old-data-on-failed-reload (#29.3), Unicode tokenizer (#29.4).
Still outstanding:
From #31 (public-flip) — partially done
Done: mcp/ -> mcp_server/ rename, doc contradictions, requirements bounds, CI, .mcp.json.example. Still outstanding: pyproject.toml + package restructure (removes the sys.path hacks), and the git-history codename-squash decision before flipping public.
Recommend tackling the #30 extraction as its own focused pass (with the dual-surface parity test from the original plan), since it touches the two files with zero existing coverage.
The dev cycle that closed #22-#28 (and #24) landed the correctness fixes and the highest-value, lowest-risk server fixes, but deferred the larger MCP/skill refactor because it is a big change to two untested 1000+ line files and is a maintainability improvement rather than a correctness bug. Tracking the remainder here.
From #30 (MCP/skill drift) — NOT yet done
The full shared-core extraction (pull ~450 lines of duplicated pure logic into
skill/survey_query.py, imported by the server and vendored two-file by the skill) is outstanding. One of the seven divergences was fixed in the cycle: the ASCII-only tokenizer is now Unicode/accent-insensitive in BOTH copies. The remaining six behavioral divergences still stand:lookup_var/get_gate_chaindon't)From #29 (server robustness) — partially done
Done this cycle: config-entry startup crash guard (#29.2), keep-old-data-on-failed-reload (#29.3), Unicode tokenizer (#29.4).
Still outstanding:
_check_reloadmutates_vardicts/_tfidfwith no lock; needs swap-on-build (build a complete new per-survey snapshot, publish by single assignment).lookup_variablessilently stops at first matching survey; no form-name fallback; uncapped choice dumps; unmarked[:80]truncation; loose substring survey filter.From #31 (public-flip) — partially done
Done:
mcp/->mcp_server/rename, doc contradictions, requirements bounds, CI,.mcp.json.example. Still outstanding:pyproject.toml+ package restructure (removes the sys.path hacks), and the git-history codename-squash decision before flipping public.Recommend tackling the #30 extraction as its own focused pass (with the dual-surface parity test from the original plan), since it touches the two files with zero existing coverage.