Problem
Configuration from two build-system migrations ago is still on disk, and it is wrong where it isn't ignored:
MANIFEST.in — flit (our build backend) never reads it, and it references LICENSE.txt where the actual file is LICENSE.
[tool.flit.sdist] excludes list Makefile and readthedocs.yml, neither of which exists (the real file .readthedocs.yaml is already covered by the .* pattern).
.coveragerc still omits */site-packages/nose/* and ordereddict.py; .gitignore still lists *.noseids — nose was retired years ago.
Zero runtime impact; nonzero cost to every contributor reverse-engineering how the package actually builds.
Proposed change
Delete MANIFEST.in; prune the two phantom flit excludes; drop nose-era lines from .coveragerc and .gitignore. Then verify packaging is unchanged: build sdist+wheel before and after, diff the file lists (tar tzf / unzip -l).
Acceptance criteria
From the July 2026 technical-debt audit (AI-assisted; claims verified against 28d4b3b on 2026-07-25).
Problem
Configuration from two build-system migrations ago is still on disk, and it is wrong where it isn't ignored:
MANIFEST.in— flit (our build backend) never reads it, and it referencesLICENSE.txtwhere the actual file isLICENSE.[tool.flit.sdist]excludes listMakefileandreadthedocs.yml, neither of which exists (the real file.readthedocs.yamlis already covered by the.*pattern)..coveragercstill omits*/site-packages/nose/*andordereddict.py;.gitignorestill lists*.noseids— nose was retired years ago.Zero runtime impact; nonzero cost to every contributor reverse-engineering how the package actually builds.
Proposed change
Delete
MANIFEST.in; prune the two phantom flit excludes; drop nose-era lines from.coveragercand.gitignore. Then verify packaging is unchanged: build sdist+wheel before and after, diff the file lists (tar tzf/unzip -l).Acceptance criteria
grep -ri nose .coveragerc .gitignoreempty; noMANIFEST.inFrom the July 2026 technical-debt audit (AI-assisted; claims verified against
28d4b3bon 2026-07-25).