Bring in two narrow additions previously sitting on a feature branch:
- api/diagnostics.py: \_IGNORED_FILENAMES skip-list for /api/conflicts.
PZ engine-concatenated and framework-hook files (sandbox-options.txt
etc.) ship with intentionally distinct sha1s across mods; they are
not real conflicts. Live cache had 33 providers of sandbox-options.txt
with 31 distinct hashes generating false-positive conflict rows.
- worker/build_manifest_and_types: extend the path-based Vehicles signal
to include models_x/vehicles/ and models/vehicles/, catching mods that
ship 3D vehicle assets without scripts. Existing mods need their
manifest rebuilt before mod_types reflects the new signal.
mod.info files saved by Windows notepad start with a U+FEFF BOM, which
made the first line's `name=` regex miss; affected mods displayed with
empty name (sort still worked because `id=` on subsequent lines parsed
fine, but MOD_DB display name fell back to mod_id). Both copies of
mlos_sort.py updated; existing 23 BOM-affected rows already cleaned in
place from raw_mod_info.
Drops missing-dep warnings whose source mod's mod.info `require=` is
out of sync with its Steam Workshop Required Items sidebar. Author
edits to mod.info often lag build ports; trusting the sidebar means
B42 sorts no longer raise warnings on B41-only deps the author has
already retired (e.g. tikitown's Diederiks Tile Palooza, EN_Newburbs).
Filter is conservative: only drops a dep when (a) we have a cached
wsid for it, (b) that wsid is wrong-build for the user's pz_build,
and (c) the source mod's required_wsids list (with required_scraped_at
populated as the "we have evidence" gate, since the column itself
defaults to '{}') excludes that wsid.
Also swaps worker.fetch_required_wsids from public-page HTML scrape
to authenticated IPublishedFileService/GetDetails. Same `children`
data, no 429 cooldowns. Removes the now-unused throttle/cooldown
infrastructure (SORTOF_STEAM_MIN_INTERVAL / SORTOF_STEAM_COOLDOWN
env vars are no longer read).
See docs/specs/2026-05-06-stale-requires-filter.md.
Two narrow additions adopted from a review of HellDrinx Mod Manager
(/tmp/helldrinx-modmanager-PZ-main.zip), per
docs/plans/ (planning conversation, no spec checked in).
A. _IGNORED_FILENAMES in api/diagnostics.py — skip filenames that are
intended merge points (PZ engine-concatenated or framework hooks)
from /api/conflicts output. Multiple distinct sha1s for these files
is by-design, not a conflict. Live cache had 33 providers shipping
sandbox-options.txt with 31 distinct hashes — those would have been
31 false-positive conflict rows on any sort spanning them.
B. Path-based Vehicles signal in worker.build_manifest_and_types —
extended the existing scripts/vehicles[/] check with
models_x/vehicles/ and models/vehicles/. Catches vehicle mods that
ship 3D assets without scripts (rare but real); still requires the
user-build's manifest to be rebuilt before mod_types reflects it.
- data/modpack_rules/helldrinx.txt: bundled rules for HellDrinx FULL/LITE
- app.py auto-injects modpack rules when a trigger wsid is in input;
user-supplied rules are appended after and override on conflict
- MANUAL_BUILD_PAIRS: betterLockpicking (B41) ↔ NFsBetterLockpicking (B42)
- mlos_sort.py: minor adjustments (kept in lockstep across api/worker)
- mod_files manifest table populated at parse time
- POST /api/conflicts endpoint
- mod_types fingerprinting feeds derive_category
- DD filelist regex broadened to cover conflict-eligible exts
- media/maps/<*>/* excluded from manifest (per-mod namespaced,
no conflict value, can be tens of MB per mod)
Plan: docs/plans/2026-05-04-pzmm-conflict-and-typing.md