{ case study 06 }

Bid Intelligence

BidOS takes an RFP in and returns a decision-ready proposal. Requirements are anchored to the span they came from, drafts are built only from approved evidence, and the export stays locked until QA passes.

Hosted on Render's free tier, so the first visit wakes the server. Give it up to a minute.

role
design · build · deploy
type
bid & proposal OS
runtime
one Go binary, on Render
status
● live, synthetic demo
walkthrough 13 evidence traps and 1 injection, all refused

{ the build }

Honest
by construction.

01

Problem

Proposal teams lose weeks re-finding things they already know. Requirements get missed in a 90-page PDF, answers are copied out of decks that went stale two quarters ago, and reviewers have no way to tell which sentences were verified and which were someone's best recollection.

The stakes make the usual AI answer unusable. A drafting assistant that invents a certification, a compliance figure or an uptime number does not save a week. It puts a false claim into a contract document, under your company's name, signed.

02

Approach

Make the honesty structural rather than instructed. Every factual sentence must cite approved evidence; where nothing supports a claim the system writes "needs evidence", generates the question for the right expert and routes it. It is not able to invent the certification, because the path that would produce one does not exist.

Two mechanisms carry that. The evidence gate decides whether an answer may be attempted at all: a chunk qualifies only if it covers the requirement's salient terms and mentions its hard terms, the numbers, acronyms and proper nouns, and the union of qualified chunks must cover every hard term or the answer stops at insufficient evidence. Then the claim verifier checks the draft that came back, sentence by sentence, against the chunk each one cites.


{ how it runs }

One pipeline,
four human gates.

People confirm the matrix, the bid call, the answers and the export. The machine does the finding.

01

Parse & extract

PDF, DOCX, XLSX, CSV and Markdown come in with cell-accurate locators, and requirements are extracted anchored to the exact span they came from. Buyer documents are treated as untrusted data: instruction lines are filtered at extraction rather than obeyed, and the synthetic RFP carries a hidden injection line to prove it.

5 formats Span anchors Injection filtered

02

Qualify

Before anyone writes a word, the opportunity is scored into a radar scorecard that exists to be evidence for the bid or no-bid call. Humans confirm the requirement matrix at gate one and make the bid decision at gate two, so the expensive work only starts on bids somebody chose.

Radar scorecard Bid / no-bid Gates 1 and 2

03

Draft & verify

Hybrid retrieval over the evidence library, then the evidence gate, then a grounded draft, then a sentence-level verifier: every factual sentence needs a citation marker, every number and hard term must appear in the chunk it cites, and lexical overlap has to clear a threshold. Gaps become routed SME tasks, and the answers that come back re-draft automatically.

BM25 + embeddings + RRF Claim verifier SME loop

04

QA, then export

Nothing leaves the building because somebody clicked export. More than sixteen deterministic checks look for missing mandatory answers, weak evidence, absent citations, placeholders, stale sources, contradictions, unsupported sentences and unresolved SME tasks. Each finding deep-links to the thing that caused it and blocks the export until it is resolved or dismissed with a reason.

16+ checks DOCX · PDF · MD · JSON · CSV Questionnaire round-trip


{ what it produces }

Built to fail
loudly.

The synthetic RFP is rigged against the system on purpose: thirteen requirements have no supporting evidence anywhere in the library, and one page carries a hidden instruction aimed at the extractor.

83 requirements in the demo RFP
13 traps with no evidence behind them
4 human gates in the pipeline
16+ checks standing between draft and export

One Go binary with SQLite and a local file store. Provider keys stay in the environment, never the browser, and the demo runs with no keys at all on a deterministic floor.


{ more work }