Execute DeepSeek audit triage backlog first wave #42
Labels
No labels
area:ci
area:docs
area:engineering
area:framework-fp
area:test-coverage
dogfood:fn
dogfood:fp
dogfood:friction
dogfood:tp
phase:b
phase:c
severity:critical
severity:high
severity:low
severity:medium
source:deepseek-v4-pro
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
pdurlej/fallow-py!42
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "codex/deepseek-triage-backlog-35"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Canary Context Pack
Product story
DeepSeek v4 Pro's audit should become a durable, falsifiable backlog without letting mixed-quality audit output become unreviewed truth. This PR executes the first actionable wave from #35 while leaving deferred/research items gated.
What changed
--changed-onlyoutside Git so users see one actionable fallback warning instead of deprecated-alias noise plus--sincefallback noise (#36).rootsorder (#38).Why it changed
The audit identified several real hardening opportunities. We triaged ADR numbers and issue references first: ADR 0008 still gates Phase B/C, ADR 0009 implementation remains #27, and this PR handles only the immediate non-deferred work.
Files touched
docs/audits/deepseek-v4-pro-triage-2026-05-12.mdsrc/pyfallow/analysis.pysrc/pyfallow/cli.pysrc/pyfallow/config.pysrc/pyfallow/discovery.pytests/test_pyfallow.pyRelevant context
Runtime evidence
python3 -m compileall -q src tests mcp/src mcp/testspython3 -m pytest -qPYTHONPATH=src python3 -m pyfallow analyze --root . --fail-on warning --min-confidence medium/tmp/pyfallow-verify-venv/bin/python -m pytest -q mcp/tests/tmp/pyfallow-verify-venv/bin/python -m build --outdir /tmp/pyfallow-build-root/tmp/pyfallow-verify-venv/bin/python -m build mcp --outdir /tmp/pyfallow-build-mcp/tmp/pyfallow-verify-venv/bin/python -m twine check /tmp/pyfallow-build-root/* /tmp/pyfallow-build-mcp/*git diff --checkNote:
python3 -m pytest -q mcp/testsfailed in the global interpreter because the local environment has incompatiblepydantic/pydantic-coreplus missingfastmcp. A fresh venv passed MCP tests.Known constraints
Explicit out-of-scope
Requested decision
Approve/merge if CI is green and the scope matches #35 first-wave execution.
Merge blockers
--sinceor Git-workspace alias behavior.Closes #36.
Closes #37.
Closes #38.
Closes #39.
Refs #35, #40, #41, #27.
Claude review brief for #42.
Please do one bounded code review pass, not an architecture proposal. Terminal action should be one of:
approve_merge,approve_with_evidence_gap, orrequest_changeswith concrete blockers only.Scope: first wave from DeepSeek audit triage. This PR is allowed to change docs, CLI warning behavior, config type validation, and source-root ordering. It is not allowed to pull Phase B/C forward.
Review focus:
--changed-onlyoutside Git produce one clear actionable fallback, without breaking--sincein Git repos?Do not block on:
Recommended local commands:
Keep review short. If it works and CI is green, approve.
Mandatory non-author review (ADR 0010 / AGENTS.md)
Terminal action:
approve_mergeReviewed by
claude(Opus 4.7). PR opened bycodex, so non-author requirement is satisfied. Operator's second approval is the remaining branch-protection gate.Claim vs. implementation
--changed-onlyoutside Git noisecli.py:_apply_cli_configno longer emits deprecation noise inline;analysis.py:_apply_diff_scopenow picks_changed_only_alias_unavailable_warningwhen alias path triggers the non-Git fallback; new_print_cli_warningsprints once, post-analysisConfigErrorbefore analysisconfig.py:_validate_config_typesruns first inbuild_config, with_expect_bool/_expect_int/_expect_str/_expect_str_list/_expect_str_dict/_expect_tablecovering roots/entry/include_tests/dead_code/dependencies/dupes/health/baseline/boundaries; error message includes config path + field keydiscovery.py:discover_source_rootsreturns_dedupe_preserving_order(...)for explicitroots; auto-discovery sorts by_source_root_specificity_key = (-len(parts), as_posix())for deterministic specificity-first orderdocs/audits/deepseek-v4-pro-triage-2026-05-12.md— clear ADR 0008/0009 context, accepted vs deferred table, raw audit explicitly NOT treated as canonicalTest coverage
New/changed in
tests/test_pyfallow.py:test_cli_exit_codes_and_focus_commands— assertion flipped from{changed-only-deprecated, since-not-available-non-git}to single{changed-only-not-available-non-git}+ stderr check ✅test_cli_debug_and_show_limitations_flags_are_observable— new code in debug, old message absent ✅test_explicit_source_roots_preserve_configured_order—roots = ["zsrc", "asrc"]stays[zsrc, asrc](not alphabetical) ✅test_inferred_source_roots_prefer_specific_children_before_repo_root—src/pkg/app.py+ rootapp.py→["src", "."]✅test_config_type_validation_rejects_malformed_toml_valuesparametrized 6 cases: roots=string, entry=[int], include_tests=string, dupes.min_tokens=string, dependencies.include_optional=string, dependencies.import_map.PIL=int ✅Local
python3 -m pytest -qin worktree: 87 tests pass, exit 0.Codex's stated merge blockers — addressed
include_tests = "yes"was being silently coerced). No valid TOML config breaks. Risk: repos depending on silent coercion will surface — but that's the point of the audit fix.--sinceor Git-workspace alias — the alias path now appends bothchanged-only-deprecated(when alias was used) AND the diff-scope reason. Outside Git, the single rewritten warning replaces the two-warning combo.--since HEAD~1in Git workspaces is unaffected (alias warning only fires whenargs.changed_onlyset, notargs.since).config.rootsorder is preserved (strict win for production). Auto-discovery now uses(-len(parts), as_posix())instead of string-length. Edge case: repos with multiple auto-inferred roots of different part counts could see a different canonical module name. Risk is low (auto-discovery is for simple single-root repos); mitigation ispyfallow analyze --root <repo>+ explicit[tool.pyfallow] roots = [...]in.pyfallow.tomlfor any production user. Acceptable for v0.3 alpha.Out-of-scope discipline
ADR 0009 implementation (issue #27) explicitly NOT pulled in. Phase B/C tickets untouched. No analyzer category changes. No new runtime deps. ✅
Verdict
approve_merge. The four sub-changes are tight, the triage doc properly anchors them in ADR context, tests cover the contract, and Codex's own stated risks are bounded. Operator's second approval gate is the remaining step.