---
name: solicitation-requirements-extract
description: >-
  Reads an RFP, RFQ, IFB, ITB, request for proposals or solicitation package with its amendments,
  attachments and questions-and-answers, extracting every requirement, instruction to offerors,
  evaluation factor, deadline, page limit and deliverable into a compliance matrix carrying the
  source document and a verbatim quote per row. Handles Sections A through M of the uniform contract
  format, statement of work, scope of work, Section L, Section M, Section J attachments, shall
  statements and contractor responsibilities. Proposal teams call this a shred or requirements
  traceability matrix. Reports which pages produced nothing rather than treating a row count as
  coverage.
---

# Solicitation requirements extract

## The one thing to understand before you start

**This job fails by omission, silently, while looking complete and correct.** Pointed at a long
dense document and asked for structured rows, a model returns rows that are mostly right and too
few. On a published benchmark of 225 documents averaging 358 pages, precision clustered high across
every system while recall ran from 49% to 99.6%, and one frontier model returned rows 95.8% correct
covering 52.7% of what existed. Nothing in the output says which half is missing. **So the value
here is the accounting for what was and was not covered, rather than the extraction**, and a matrix
with 412 rows and no coverage statement is not evidence of anything.

## What is in scope, and the three documents that get no matrix at all

This reads a solicitation open for bids and reports what it requires of a bidder. It does not judge
whether the solicitation complies with any regulation, and it does not write proposal content.

**If the document is any of these, write one sentence naming what it is and produce nothing else:**

1. **A contract or award already executed**, rather than a solicitation open for bids.
2. **A grant notice of funding opportunity**, which is assistance rather than acquisition.
3. **An internal policy, directive or procedure** the organization wrote for itself.

**"Produce nothing else" is literal: no matrix, no rows, no package inventory, no coverage section,
no Not-checked paragraph, no list of obligations.** One sentence, then stop.

**Do not re-aim the matrix at a different reader, which is how this rule gets broken.** An executed
contract does contain obligations and a grant notice does contain applicant requirements, so a
nearby audience is always available. Doing it for them is the failure this rule exists to prevent
rather than partial compliance with it, and **naming the document type correctly and then shredding
it anyway is worse than not noticing**, because the disclaimer makes the output look considered. If
somebody wants one analyzed, that is a different job to ask for directly.

**Say once, and do not repeat it,** that checking a federal solicitation against the Federal
Acquisition Regulation is a separate job.

## Step 1. Inventory the package before reading any of it

**A requirement binds whichever document it arrives in, and the one that decides an award is
routinely not the base solicitation.** In the single fiscal-year-2025 case where a federal agency
refused the Comptroller General's remedy, the disputed requirement existed only in the
question-and-answer record: a bidder asked whether equipment had to be certified at proposal
submission, the agency answered "Yes", and that bound the procurement.

List every document given, by name, with its page count, classified as base solicitation,
amendment, attachment, exhibit, pricing template or question-and-answer record. **Then say what you
believe is missing.** A solicitation referencing Attachment J-3 while no J-3 was supplied is the
most important sentence in your output and belongs at the top. Amendments supersede, later ones
superseding earlier, and where an amendment and the base conflict both rows stay with the conflict
named.

## Step 1b. Find the funding source, because it decides which rules attach

**A requirement attaches because of whose money is paying, not what kind of body is buying.** A city
buying with its own revenue and the same city buying with a federal grant are under different rules
on the same afternoon, and the solicitation is often the only place that says which. Record as its
own finding any named funding source, grant program, grant or project number, and any clause
flowing a federal award's conditions down to this purchase. Federal grant money brings a different
rulebook carrying domestic-preference, wage and disadvantaged-business obligations the buyer's own
code does not, so requirements looking out of place against the rest of the document are not.
**Where no funding source is named, say so**, because a category of obligation could not be checked
rather than being absent. **Do not decide which regime governs.** A shred reports; it does not rule.

## Step 2. Find, in two independent sweeps, and take the union

Do not ask for the finished matrix in one pass. Schema breadth, rather than document length, is the
dominant measured predictor of extraction failure, and a wide schema in a single call can return
nothing usable.

**Sweep A, mechanical.** Pull every sentence containing shall, must, will, shall not, may not, is
required to, is responsible for, at a minimum, no later than, not to exceed. It is dull and it does
not miss the marked cases.

**Sweep B, read for obligations the words do not mark.** Requirements hide as plain description with
no modal verb, as questions ("Will your solution provide...?"), inside tables that text extraction
frequently drops entirely, inside images and scanned pages, and in attachments, data item
descriptions and security exhibits rather than in the instructions.

**Keep the lists separate and take their union, never their intersection**, then compare them.
**Where the two sweeps disagree is where your remaining misses are**, and a small overlap between
two honest passes means you are still missing a lot. **One row per obligation, never one per
paragraph**, since shredding by paragraph produces a tidy matrix of the wrong thing.

## Step 3. Locate each requirement and verify the quote mechanically

Capture the exact words, then **check the quoted text actually occurs in the source**, comparing
after lower-casing and stripping punctuation so whitespace and scanning noise raise no false alarms
while invented text still fails. **A row whose quote cannot be found is not a row**, so drop it and
record that you dropped it.

## Step 4. Only now, produce the matrix

One row per obligation, carrying at least these fields:

| Field | Why it is there |
| --- | --- |
| ID | Built from the document's own section numbering, never a random identifier |
| Document | Which file this came from: base, which amendment, which attachment, or the Q&A |
| Location | Section and paragraph, then page |
| Quote | The requirement in the solicitation's own words, verbatim |
| Requirement | The obligation in plain words, stated with an active verb |
| Term | shall, must, will, should, may, or none, because these carry different force |
| Response location | Where the proposal answers it, left blank at shred time |
| Compliance | Complies, partially complies, does not comply |
| Status | Workflow state, which is not the same as compliance |
| Notes | Conflicts, ambiguities, questions to ask the buyer |

**Carry the quote and the plain version as separate fields, never letting the plain version be the
only record**, because the quote makes the row checkable while the plain version makes it usable.
**The Document field is a deliberate departure**, since the published professional templates carry a
Page column and no Document column, which was unambiguous when a solicitation was one file.

## Step 5. Report coverage, which is what makes this trustworthy

Before the matrix, state every document processed with its page count; **which pages or sections
produced no rows**, because an empty section is either genuinely empty or your failure and only
naming it lets a reader tell; anything unreadable, being an image-only page, an unextracted table, a
locked file, or a referenced attachment never supplied; and how the two sweeps compared. End with a
paragraph headed **Not checked**, naming in plain sentences what this pass did not cover and why.

## What never to do

- **Never present a row count as evidence of completeness.** It cannot distinguish a thorough pass
  from a truncated one.
- **Never invent a requirement to fill a gap.** Unclear is written as unclear, absent as absent.
- **Never resolve a conflict between the instructions and evaluation sections silently.** Five
  past-performance examples asked for and three scored is a question for the buyer, recorded as one.
- **Never treat a buyer-supplied compliance matrix as authoritative** without reconciling it against
  the buyer's own solicitation.
- **Never drop a requirement for seeming minor.** Page limits, fonts, file naming, delivery method
  and amendment acknowledgment have each disqualified real bids.
- **Never let the matrix stand after an amendment arrives.** Re-run it and show what changed.

## Order of work, and what the output is

Build the matrix before any writing starts. Work the instructions section first so it drives the
outline, then the evaluation section so the outline earns points, then the statement of work, then
everything else. Re-run against the near-final draft, and again after every amendment.

The result is a draft for a human to approve and should say so in the artifact rather than in a
caveat at the end. An unverified extract that misses a requirement is worse than no matrix at all,
because a matrix creates an impression of thoroughness that an empty page does not.
