bidlint v0.7.0
bidlint v0.7.0
Released: 2026-08-20
v0.7.0 moves bidlint from single vendor-document comparison toward deterministic real-world bid intake. A supplier submission can now be treated as a multi-document evidence package while preserving the existing rule that uncertainty, source disagreement and hidden precedence must never become automatic technical decisions.
Highlights
Multi-document vendor packages
A vendor input may be a directory containing supported direct-child PDF, XLSX and explicitly scoped IFC evidence:
Supplier-A/
├── compliance-schedule.xlsx
├── pump-datasheet.pdf
├── technical-offer.pdf
└── model.ifc
The package enters the same VendorFact and deterministic compliance pipeline used by direct vendor files.
Equivalent facts across documents collapse deterministically, including compatible engineering-unit conversions. Conflicting evidence is preserved as an explicit provenance-rich REVIEW condition instead of choosing a source silently.
Explicit document classification
Every direct-child package file is assigned a visible document class:
specificationdatasheetcompliance-scheduletechnical-offerignored
Classification uses deterministic filename rules plus exact programmatic overrides. Copied employer specifications and ignored/commercial material do not become vendor technical evidence.
Unsupported file types remain visible as ignored package documents rather than being parsed or guessed.
Explicit evidence priority
Packages may opt into an ordered evidence-priority policy across technical document classes.
package = parse_vendor_package(
"Supplier-A",
evidence_priority=(
"compliance-schedule",
"technical-offer",
"datasheet",
),
)No priority exists by default. Without an explicit policy, conflicting facts continue to produce REVIEW.
Priority only narrows a parameter group to the highest available configured class. It never breaks a disagreement between two documents in the same highest-priority class; those conflicts still require review.
Project terminology aliases participate in consolidation
The existing project-specific alias mapping now applies before package duplicate/conflict consolidation as well as during requirement matching.
{
"supplier rated output": "motor power"
}This allows vendor-specific nomenclature in different package documents to resolve to the same canonical parameter before evidence consistency is evaluated.
Aliases do not introduce fuzzy grouping, hidden source precedence or additional confidence.
Mixed-package ranking selector scoping
rank can mix direct files and package directories while using IFC/XLSX selector options.
Selector validation looks inside package directories only at evidence-classified files. IFC selectors are applied only to direct IFC inputs and packages containing evidence IFC files; --xlsx-sheet is applied only to direct XLSX inputs and packages containing evidence XLSX files.
This prevents a global selector from invalidating unrelated PDF-only suppliers in the same ranking run.
Package-level evidence audit
VendorPackage.evidence_audit records how every parsed technical fact was treated during consolidation.
Each audit entry preserves:
- canonical parameter
- original
VendorFactand provenance - document class
- disposition:
selected,equivalent-duplicate,conflictorlower-priority - explicit priority rank when applicable
VendorPackage.to_audit_dict() exposes a JSON-ready package audit containing document classifications, ignored documents, priority policy, raw evidence dispositions, consolidated facts and conflict facts.
The evaluator contract remains unchanged; the audit surface adds traceability rather than a second decision engine.
Sanitized regression packages
The release includes generated multi-document regression fixtures for five engineering families:
- pump: alias-aware equivalent evidence across PDF/XLSX documents
- motor: explicit compliance-schedule priority over conflicting lower-priority evidence
- valve: unresolved disagreement inside the same highest-priority class
- HVAC: aliasing, engineering-unit conversion, copied-specification exclusion and ignored commercial material
- electrical: equivalent evidence alongside an unprioritized technical conflict
Fixtures are synthetic and vendor-neutral. Tests generate temporary PDF and formula-free XLSX files and run the normal parsers rather than replacing extraction with mocks.
Existing safety boundaries remain in force
v0.7.0 does not weaken earlier input constraints:
- XLSX formulas, VBA/macros, external relationships, hidden evidence worksheets, merged cells and ambiguous layouts remain rejected
- IFC evidence still requires explicit element scope through the existing IFC selection rules
- unsupported package files are not interpreted as technical evidence
- copied specification documents are not allowed to satisfy vendor requirements
- file type alone never establishes authority
- source disagreement never becomes an automatic PASS or DEVIATION
Validation
The v0.7 branch is covered by GitHub Actions on Python 3.11, 3.12 and 3.13 with Ruff and pytest, including regression coverage for:
- deterministic package discovery
- document classification and overrides
- unit-aware equivalent evidence consolidation
- conflict-to-
REVIEWbehavior - explicit evidence-priority policy and same-class tie handling
- project alias threading through CLI package intake
- mixed PDF/XLSX/IFC package selector scoping
- package-level evidence audit dispositions and provenance
- generated pump, motor, valve, HVAC and electrical multi-document packages
Deliberate limits
This release keeps package intake intentionally conservative:
- only direct-child package documents are considered
- document-class overrides are currently a programmatic surface rather than a package manifest or dedicated CLI policy file
- evidence priority is explicit and opt-in; no hidden default hierarchy is inferred
- package intake does not add commercial or price scoring
- the deterministic requirement matcher and compliance evaluator remain authoritative
v0.7.0 keeps the project rule unchanged: evidence before confidence.