Under Canada's Contract A framework, one missed mandatory clause voids an otherwise winning construction bid. Estimators read 30–90+ page tender packages under deadline pressure, and the disqualifying clause is often buried — page 75 of a 93-page RFT. Compliance tools exist, but AI extraction tools have a fatal flaw for this domain: a hallucinated requirement is worse than a missed one.

TenderSentry ingests Canadian public tenders (CanadaBuys + municipal PDFs), extracts every mandatory requirement, classifies bid-phase vs. contract conditions, and qualifies a specific firm against them — producing a bid board where every "Don't bid" verdict shows the disqualifying clause, verbatim, with its page number.

The core invariant: every displayed requirement carries a verbatim quote and true page number, verified by exact-substring match against the source PDF. If a quote can't be found on its cited page it is repaired or dropped — never shown. Across the demo set, 11 fabricated or unverifiable requirements were caught and silently dropped by this guard.

Page-tagged provenance store (pdfplumber) → map-reduce extraction over chunks (GPT-4o, temperature 0, JSON mode) → hallucination guard (exact-substring verification with cross-page repair) → phase classifier → hybrid qualification engine (deterministic profile checks + batched fuzzy LLM judge with judgment provenance) → Streamlit bid board where red is reserved exclusively for bid-voiding blockers.

Real tender PDFs fight you: bilingual headers, image-only drawing sheets, quotes that span page boundaries (solved with cross-page repair), and an issuer's own documents containing wrong contract numbers — which is exactly why displayed requirements must be provably grounded in the source.

Verification-first design changes what you can ship: because unverified content never reaches the UI, the demo runs on real tenders, not cherry-picked samples.

Machine-checking instrument-type clauses (e.g. bid security form), deadline-date logic, and a full sampled precision/recall audit.

Built With

Share this project:

Updates