A FAR and DFARS clause graph where every link carries its receipt
How Bids2Bank stores the full FAR and DFARS text, reads the links between clauses out of the regulation itself, and what the graph does and does not do yet.
A rule reference in a proposal is only as good as the regulation behind it. This post describes the FAR and DFARS library inside Bids2Bank, the graph of links we build from it, and the parts that are still switched off or waiting for a person to review them.
The library: the regulation's own text
Bids2Bank keeps the full text of every FAR part (1 to 53) and every DFARS part (201 to 253), read from the eCFR's public versioner API. The first full load, against the eCFR as of 18 September 2026, stored 5,328 sections in 99 parts, 205 of them marked reserved. Other agencies' supplements, which also live in Title 48, are not loaded.
Each section keeps its clause date, its "As prescribed in" reference, whether it is reserved, and a link to that section in the eCFR on the date it was read. A weekly job refreshes the library. It skips the work when Title 48's amendment date has not changed, and when a section's text has changed it adds a new version to an append-only history rather than overwriting the old one.
Links read from the text, not guessed
From that text, Bids2Bank extracts four kinds of link between sections:
- Prescribed in: a clause points to the paragraph that tells contracting officers when to use it.
- Cites: a section points to every FAR or DFARS section or subpart its text names.
- Alternate of: an Alternate points to its base clause.
- Supplements: a DFARS part, subpart or section points to the FAR one with the parallel number, for example DFARS 215.3 to FAR 15.3.
Every link stores its receipt: the exact paragraph that states it (for a "supplements" link, the two headings), the position of that paragraph, a SHA-256 fingerprint of the source text, the eCFR date it was read on and a dated eCFR link. Here is one. FAR 52.212-4 begins: "As prescribed in 12.301(b)(3), insert the following clause:" (eCFR, 48 CFR 52.212-4, as of 18 September 2026). That sentence is the evidence for the link from FAR 52.212-4 to FAR 12.301(b)(3).
No model is involved. The extractor recognises a fixed set of phrasings, and a relationship it does not recognise produces no link at all. Links are never edited in place: when a section's text changes, its new links are written first and the old ones are marked superseded. On 1 October 2026 the link table held 10,488 links, counted by row count that day.
The graph lives in Postgres, in the same database as the rest of a workspace's data, so a lookup is an ordinary query rather than a call to another system.
Asking it questions
A lookup can follow links up to four hops away, returns at most 500 links, and stops cleanly on cycles (A cites B, B cites A). Every target is labelled: present in the library, reserved, missing from the library, or not a section at all (a part or subpart). A clause page in the app shows a section's text and date, the paragraph that prescribes it, its direct links in both directions, its flow-down status and its version history.
Flow-downs, with the conditions left in
Which clauses go into subcontracts is a question the regulation answers in specific places, and Bids2Bank reads those places at the time you ask. Two are flow-down lists: FAR 52.212-5(e)(1) and FAR 52.244-6(c)(1). The others are paragraphs in which a clause says to include itself in subcontracts. DFARS 252.204-7012(m)(1), for instance, tells the contractor to "Include this clause, including this paragraph (m), in subcontracts, or similar contractual instruments, for operationally critical support, or for which subcontract performance will involve covered defense information" (eCFR, 48 CFR 252.204-7012, as of 18 September 2026).
Conditions like that one stay in the quote. Bids2Bank does not decide whether they are met in your subcontract; that is a judgment for your team. A clause that no source names is reported as "no flow-down text found", never as "does not flow down". The choice of which list paragraphs to read is curated by hand and is marked in the code as not yet reviewed by a second person.
When a clause changes
After each weekly refresh, a changed section (new text, newly reserved or withdrawn) is checked against active pursuits. A pursuit is affected when its solicitation text or one of its rule references names that section, or names a section linked to it by a current link. Each affected workspace is told once, with a notification and a far.clause.changed webhook, and every indirect match carries the link and receipt that make it. Won, lost and no-bid pursuits are not scanned, and one run checks at most 1,000 pursuits and says so when it hits that cap.
In the compliance matrix: shadow mode first
The compliance matrix can add a section listing the clauses that the graph says are prescribed for a solicitation. That section is controlled by a setting with three positions: off, shadow and on. The default is shadow: the graph section is computed and compared with the existing results and the differences are logged, but the matrix keeps showing its older keyword matches, labelled "keyword match" so nobody mistakes them for a regulatory link. We plan to switch it on after two shadow-mode refreshes and a review by hand.
What it does not do
- No link is not the same as no relationship. The extractor only knows the phrasings it was written for.
- It does not decide applicability. Thresholds, dates and conditions in the text are quoted, not evaluated.
- The flow-down list selection has not had its second review. It is labelled that way until it does.
- The graph section is not yet shown in the compliance matrix by default.
- It is not legal advice. The solicitation and your contracting officer govern which clauses apply.