- linkingrecord_header_check: accept "y"/"Y" for fullLoad (case-insensitive)
and add type-check before comparison to avoid misleading error on non-string values
- exterior_interior_pairing_check: introduce _get_active_prefixes() which computes
the intersection of shared prefixes that appear in BOTH exterior and interior records;
prefixes like bs-, dr-, en- that exist only in exterior features no longer poison
signatures and cause systematic false-positive failures on real packs;
when one side is entirely absent the fallback uses all shared prefixes so a
missing-interior-partner is still correctly detected
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Old check stripped paint/trim by prefix but used wrong tr- prefix
(transmission, not trim), causing false mismatches on known-good packs.
New approach uses an allowlist of shared WERS prefixes to build variant
signatures — paint, trim, and transmission codes fall out naturally.
Restricts comparison to angle-21 base records only per Ben's spec.
Updates ford_bnp.json profile config accordingly and adds 8 unit tests.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fixes two silent-pass bugs in check_series_permutations:
1. CV non-Ranger packs (ABM-only coding) were dead code — required both codes,
leaving source-of-truth empty and returning passed silently.
2. Orphan series carousel entries (series image with no backing exterior/interior
records) were noted but never failed the check.
Now auto-detects pack type from features (PV=VS/ACM pair, CV=ABM-only, Ranger=SE#/ABM
pair). Extends source-of-truth scan to include interior records. Validates
bidirectionally: missing series images AND orphan series entries both cause a failure.
Adds tests/test_check_series_permutations.py with 12 test cases covering all modes.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Extracts header validation into a standalone checks/linkingrecord_header_check.py
module and wires it into ford_bnp.json after unzip_and_verify_check.
Fixes confirmed bugs from the embedded validate_linkingrecord_header:
- fullLoad was read from header.fullLoad (always failed); now correctly read from top-level
- model had no length constraint; now enforces exactly 5 chars via ^[A-Z0-9]{5}$
Adds missing validations:
- header.specMarket: must be 5 uppercase alphabetic chars
- header.ptvl: must equal first 3 chars of model (cross-field check)
- market: checked against configurable whitelist in profile
All rules are configurable via profile config keys (market_whitelist, model_pattern,
year_pattern, spec_market_pattern, ptvl_match_model_prefix, numerical_mmy_pattern)
following the ranger_ptvl_pattern precedent. Default year_pattern is ^YYY$ (strict per spec).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Shows total linking records and unique asset count (overall + per section
grouped by viewtype+imagetype) in a card at the top of every report.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ford 3rd-party checker now requires image packs to end with _GPAS.zip
instead of the legacy _image.zip. Added new checks/zip_filename_check.py
as the first check in the QC profile to fail fast on incorrectly named files.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ranger_ptvl_pattern added to ford_bnp.json and check_series_permutations.py
so model year or generation changes require only a profile update, not code changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New check: exterior_interior_pairing_check — validates that every exterior base asset has a matching interior base asset (same feature set, excluding paint/trim codes), handles MEC 2d-background items separately
- check_series_permutations: added Ranger/CV model detection via header.ptvl (TR[AB]## pattern), uses SE#/ABM codes instead of VS/ACM for those packs
- unzip_and_verify_check: added fullLoad header validation (must be "Y")
- profiles/ford_bnp.json: added exterior_interior_pairing_check to production profile
- html_reporter.py: added friendly name mappings and HTML formatter for new pairing check
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Logs non-sensitive config details (enterpriseID, clientID, publicKeyID)
to help diagnose invalid_client errors during JWT authentication.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add utils/config.py module using python-dotenv for centralized config
- Externalize Box folder IDs, paths, and timeout settings to .env files
- Create .env.example template with all configuration variables
- Add separate systemd service files for prod and dev environments
- Update ford_qc_box_hotfolder_process.py to use config module
- Update qc_engine.py and path_resolver.py with optional config support
- Maintain backwards compatibility with hardcoded defaults
- Update documentation in CLAUDE.md
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>