Home › Use Cases › Route each incoming RFI to its spec section and owner, and name the ones already asked
Use caseUC0464
🧪 Use-case kit · runnable

Route each incoming RFI to its spec section and owner, and name the ones already asked

A small, forkable project that does one job end to end. Run once for real, and every figure on these pages captured from that run.

The business caseThe problem this solves

An RFI arrives from a trade contractor and somebody has to settle three things before anyone answers it: has this project already answered this question, is one already open with a reviewer, and which section of the specification register governs it — because the register is what decides whose queue it belongs in. Today that is an intake clerk reading two RFI logs and a 14-section register per sheet, and the thing that makes it slow is not the register: it is that every subject appears in the logs several times at other locations, so the clerk has to read far enough to tell a genuine duplicate from a near miss. the intake clerk's read of two RFI logs and a 14-section register per sheet to settle whether a question is new and whose queue it belongs in — it does not answer the RFI, issue a direction, approve a substitution, change scope or name anybody.

Audience

A design manager or document controller deciding whether to put a model in front of the RFI intake queue. This report's answer is: the placement half is nearly free and you do not need a model for it; the already-asked half is what the call buys, and it buys a lot — and free code handed the corpus generator's own tables still beats the call outright, which is the honest upper bound on this corpus. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual RFI intake sheets

The corpus is 64 RFI intake sheets, 0.34 MB (json 3 · jsonl 1 · md 2 · txt 64). A real RFI log carries the project, the trade contractors, individual names and a specification register that is somebody's copyrighted document, so it cannot be shipped and a redacted one cannot be labelled. This one is BUILT as structures and the key is RFI-2026 applied to those same structures, which is the only way to have 64 labelled sheets whose answer is derivable rather than opinion. Two structural choices are what make it measure anything. Every sheet carries two near misses — the same subject at another location, and the same location on another subject — and the closed row's answer sentence names its own location, so an arm that matches a subject line is wrong almost every time: 133 near-miss entries across the two logs. And each topic has THREE subject lines, with a log row about the sheet's own topic never reusing the sheet's own line (log_rows_reusing_the_sheet_subject is 0). The first build had one subject line per topic and a typed code arm scored 64 of 64; that build was discarded.

The corpus

  • The 64 RFI intake sheetsgenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromwritten for this kit rather than collected — the corpus is generated in the kit's own repository, so there is no third-party data in it.

Swap this folder for your own material and the kit is pointed at your RFI intake sheets. That is the whole change — there is no database to migrate.

One RFI intake sheet, as the model receives itRFI-0601.txt · 1 of 64
RFI INTAKE SHEET   RFI-0601
==================================================================================================
PANEL 1 — RFI HEADER
  Project                Kestrel Wharf Phase 2 (synthetic project)
  RFI number             RFI-0601
  Received               2026-05-04
  From                   TC-01 (concrete frame trade contractor)
  Subject                Parapet flashing termination
  Location               the basement plant room
  Response required by   2026-06-01
  Priority               normal

PANEL 2 — THE QUESTION AS TYPED BY THE REQUESTER
  The membrane termination at the parapet the basement plant room has no detail where the parapet
  steps down.

PANEL 3 — REFERENCES ATTACHED BY THE REQUESTER
  Drawing sheets                 A-201
  Specification section cited    SP-03

PANEL 4 — PROJECT SPECIFICATION SECTION REGISTER
  Section   Title                                         Discipline        Reviewer queue
  SP-03     Cast concrete frame and slabs                 Structural        STRUCT-REVIEW
            scope: placement and pour sequence, reinforcement cover, construction joints, slab
                   levels and tolerances
  SP-04     Precast wall panels                           Structural        STRUCT-REVIEW
            scope: panel fabrication, connection hardware and brackets, panel joint width and
                   sealing
  SP-05     Structural steel and metal decking            Structural        STRUCT-REVIEW
            scope: beams and columns, base plates and anchor bolts, metal deck attachment and edge
                   trim
  SP-07     Roofing, waterproofing and insulation         Architectural     ARCH-REVIEW
            scope: membrane and upstands, parapet flashing and terminations, thermal layer

Abridged — the file continues.

The outcomeWhat a good result looks like

One routed row per intake sheet that a document controller could file as written: the disposition under RFI-2026's walk in the card's own order, the register section, the prior RFI number where the project has already answered it or already has one open, the discipline and the reviewer queue. The last two are pure-code lookups in the register the sheet itself prints and are never asked of the model.

And when it cannot

It holds the RFI. When no single register section governs the subject the card refuses to place it and returns UNPLACED with the reason — NOT-IN-REGISTER or TWO-SECTIONS-GOVERN — rather than routing it to a discipline on a guess. The key holds 11 of the 64 sheets; the paid call held 12, and got the reason right on 8 of the 11. Holding is a real answer here and is counted as one.

Where it fitsWhat did work

Every line below is a measured result from this kit's own runs, with the figure that supports it. The headline above is not softened by any of them.

  • your register prints its own scope words and your RFI log already flags duplicates — the free register-scope walk — evals/baseline.py, $0.00
    placement is 44 of 64 for nothing on this corpus and the call only takes it to 56. If the already-asked half is already done for you, the call has almost nothing left to buy.
  • every subject recurs at other locations and nothing flags duplicates for you — the paid call, read against a register-scope floor you have actually written
    already-asked goes 29 to 52 (+23, p < 0.0001) and the sheets whose answer is already in a log go 1 of 22 to 19 of 22. That is the whole case for a call here, and it is separable from all three free floors.
  • your register genuinely leaves subjects ambiguous — code for the hold, the call for everything else
    the call is 0 of 3 where two sections govern and every free arm except the constant is 3 of 3. Whether exactly one register section's scope words match is a set test, and a set test is the thing code is better at than a model.

At a glanceHow the whole thing runs

80%row all five pct
1,497 msp50, end to end
$0.86per 1,000 RFI intake sheets · the fast tier, inside the weekday peak window

Run once, for real, on 2026-09-13. Every figure on these pages was captured from that run — nothing is written from intent.

14 steps, grouped by the question that sends you to them rather than by build order. Each tile carries the one figure that step is about, and opens the page behind it.

Should you use this?What you bring, where it stops, and when not to use it

Before you commit an afternoon to this, these are the answers that decide it. Each one is rendered from the record it lives in — and links the page that holds it in full.

What do I have to bring?Replace data/policy.md with your own RFI procedure and data/policy.json's register — sections, scope words, discipline, reviewer queue — with yours. The measured result does not travel. Corpus lens →
When is this the wrong choice?Avoid: Paying per sheet to re-read a register the sheet already prints. That is the case against the best-fitting scenario (“your register prints its own scope words and your RFI log already flags duplicates”). 3 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?an RFI intake export whose panels are not the seven this reader expects. src/panels.py reads PANEL 4 for the register and PANELS 5 and 6 for the two logs; a project that prints its register elsewhere yields an empty section list, and the recheck then holds every RFI on every arm at once. 6 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?WHETHER THE CALL IS WORTH IT WHERE PLACEMENT IS ALL YOU NEED. On placement alone the floor of record takes 44 of 64 for $0.00 and the call 56; the margin is 12 sheets and p = 0.0118. 7 items this kit says it could not check. Eval lens →
Can I run this on a model I control?The shipped adapter is one OpenAI-compatible endpoint, reached over urllib in src/adapters/; the Prompt lens states what swapping it costs. The published figures come from 1 model on the fast tier, at the WEEKDAY PEAK tariff. Prompt lens →
And if it fits — what do I stand up?6 artifacts with a stated home and a stated egress, and 3 decisions each with what you provision past its ceiling — plus what was not measured. That is the next page, not this one. step 14 — Run it in your environment →

Not asked of this kit — 2 questions: clone (a fresh clone of this kit runs with nothing fetched); judge (nothing here is graded by a model).

Last verified 2026-09-13 — r001-rfi-routing. Every figure on these pages was captured from that run.

Run itHow this reaches your data

Every result on this page was produced by pure code over checked-in files, with no API key — which is why you can read the numbers before anyone spends anything.

Run this on your own data

  • The pipeline, its eval harness and the runs behind every numberdeployed inside your environment, on your own model endpoints, against your own documents.
  • The corpus above is the shape, not the limitit is a folder swap, and there is no database to migrate.

Talk to us →

Checked before this shipped — The kits repository is private, so this is a measurement of the kit rather than an offer: on a copy of this folder with no key configured, all three free floors, the generator-tuned ceiling arm, evals/check_labels.py, the committed paid run replayed with all twelve paired tests, and the board on port 9464 all reproduced at 0 calls and $0.00. requirements.txt names no package; the kit is standard library only. Re-running the paid arm needs a provider key.

A living map of modern AI — kept current every morning