The pipeline, drawn end to end, with the built parts marked.
This page is a concept demo. It walks the intended production workflow in five stages and states, at every stage, whether that stage runs today or is a depiction of a system that does not exist yet. Two of the five run. Three do not.
The findings carried through the walkthrough are real. The interfaces drawn around them are not. That split is the first thing on the page and it is not a footnote.
Real output with nothing depicted around it: the sample risk register
What on this page is real, and what is a depiction.
Every row below is one element of this page. The middle column is the only thing you need to read before you read anything else. Nothing here can be dismissed, collapsed or scrolled past, because the rest of the page is only defensible with it attached.
| Element | Real or concept | Where it comes from, or what is missing |
|---|---|---|
| The five findings SB-020 to SB-024 | Real | A published fixture run in the repository, tests/golden/division_seam/, config_hash 27793629219d1c37, reproducible byte for byte. |
| Every evidence quote, section number and page number | Real | The run's own evidence citations against doc-manual, sections 08 71 00 and 28 13 00. Reproduced unedited. |
| Rule ids, flag codes, severities, priorities and conflict group | Real | packs/division_seam.json, pack_version 0.1.0, jurisdiction CA-DSA. |
| Recommended pre-bid actions | Real | Emitted by the run, quoted rather than rewritten. |
| Opening marks D101 to D104 and their frame materials | Real | tests/golden/division_seam/spatial_model.json, the hand-authored input to the same run. |
| Stage 3, deterministic rule evaluation | Real | Runs today on a real package. No model is reachable from it. |
| Stage 1, the intake interface | Concept | There is no upload feature and no hosted application. There is no file input element anywhere on this page. |
| Stage 2, the two-vendor extraction log | Concept | The comparator is written and unit tested. No command reaches it. The vendor confidences and the pairing of vendor to reading are drawn, not recorded. |
| Stage 5, the plan placement | Concept | Plan extraction is not built and no module exists. The fixture spatial model carries no coordinates, so every position in that drawing was placed by hand. |
| Stage 5, the phase view | Concept | A way of reading one real finding over time. The register has no phase field and the engine emits nothing of this shape. |
Concept does not mean planned-and-nearly-done. It means this page drew it. Where a stage has code behind it, the stage says which code and what state that code is in.
Five stages, left to right.
A bid package goes in on the left. A ranked register with citations comes out on the right. Select a stage to open it. Every stage carries a build state and none of them is allowed to borrow credibility from the stage next to it.
Stage 1. Intake.
Depiction onlyFour document classes go in. Only one of them is read today, and the other three are specified rather than built. The panel below is a drawing of an interface.
Specifications and project manual
CSI sections segmented by number. Requirements, scope statements and responsibility assignments extracted with page and span provenance. This is where the Division 08 to Division 28 seam is read.
Pilot
Drawings
Sheets, scale provenance, controlled openings, room boundaries and equipment symbols. Rasterization, tiling and geometric deduplication are specified in the contract and no module exists.
Planned
Bill of materials
A bidder take-off read as an input, never as a contract document and never joined against as though it were one. Quantity and device identity only. There is no cost field on the model that would hold it.
Planned
Addenda
Each addendum diffed against the base documents for quantity changes, product substitutions, added or deleted scope. Rule ids DC-020 to DC-029 are reserved for it and no rule is written.
Planned
There is no file input element on this page. Not a hidden one, not a disabled one. There is no upload endpoint, no hosted application to upload to, and no account to hold a package. The four panels above are drawn boxes.
What actually happens today: a package is prepared by hand into two JSON models, a SpatialModel and a DocumentModel, and the command line reads those. The run on the sample register page shows the exact command, the three input files and their hashes.
Stage 2. Two independent readings of the same page.
In DevelopmentThe comparator is written and unit tested. It is reached by no command today. What follows is the rule the code implements, and a log drawn to show that rule working.
Two vendors, named
Models from Anthropic and from OpenAI read the same content independently. Both vendors are named in the codebase rather than described as "our models". Neither is preferred. Neither is asked whether the other is right.
Agreement emits the minimum
Where every field agrees, one row is emitted and its confidence is the minimum of the two vendor confidences. Agreement withholds the disagreement flag. It never lifts a number, because a lifted number is one this repository invented.
Disagreement emits nothing
Where any field diverges, no entity record is emitted at all. A disagreement record is written in its place carrying every vendor's raw reading, the span and review_required true. A value that does not exist cannot be consumed by a rule that forgot to check a flag.
No arbitration of any kind
No vote, no average, no tiebreak, no higher-confidence-wins, no sort by confidence, no alphabetical order, no preferred vendor. Each of those was considered, rejected, and has a test asserting the code does not do it.
| Row | Anthropic reads | OpenAI reads | Emitted |
|---|---|---|---|
| 08 71 00 p4 D101 locking device |
"Provide an electric strike, fail secure, at Door D101." 0.94 | "Provide an electric strike, fail secure, at Door D101." 0.91 | agree emitted at 0.91, the minimum |
| 28 13 00 p8 D101 locking device |
"Provide an electrified mortise lockset at Door D101." 0.92 | "Provide an electrified mortise lockset at Door D101." 0.95 | agree emitted at 0.92, the minimum |
| 08 71 00 p5 D103 rough-in |
"Conduit at Door D103 is work of Division 28." 0.90 | "Conduit at Door D103 is work of Division 28." 0.93 | agree emitted at 0.90, the minimum |
| 28 13 00 p9 D103 rough-in |
"Conduit at Door D103 is furnished under Division 08." 0.89 | "Conduit at Door D103 is furnished under Division 08." 0.94 | agree emitted at 0.89, the minimum |
| schedule row 12 reader quantity |
"14" 0.88 | "l4" 0.86 | disagree nothing emitted. EX-001 raised, both readings kept, review_required true, routed to a human |
What is real in that log and what is not. The four quoted sentences are real fixture text and their sections and page numbers are the run's own citations. The vendor names are real. The confidence values, the pairing of a vendor to a reading, and the schedule row are drawn. No command reaches the comparator, so no log of this kind exists to publish.
The fixture document set contains no equipment schedule, which is why the disagreement row is a drawn row rather than a fixture row. The reading it shows is the case the comparator's tests pin by name: a lowercase L read for a one, which is what character recognition does to a schedule quantity.
A model never verifies a finding by consulting the open web. There is no search step, no browsing step and no second opinion fetched from the internet. The only outside source is a second model reading the same page, and the only power that model has is to withhold agreement. Two independent readers disagreeing about a construction document is evidence about the document, not about the models.
A model never decides anything. Extraction produces structured facts and stops. Every decision and every number after that point is code, and an import-graph test fails the build if a model client becomes reachable from the rule evaluator, the validators, the scoring code or the risk register.
Normalization before comparison is four rules and nothing else: canonical Unicode composition, whitespace runs collapsed to one space, case folded, and a trailing zero dropped after a decimal point. It does not fold a letter into a digit, it does not drop a leading zero, and it does not fuzzy match. CR-1 is not CR-11.
Stage 3. The rules fire, in code.
AvailableThis stage runs today. No model is involved in it, no model is reachable from it, and nothing in it reads a clock or the network. Same inputs plus the same config hash produce the same register on any machine.
- target
- seam:op-d103:rough_in, opening D103, rough-in at the Division 08 / Division 28 seam
- rule
- SB-022, "Each division assigns the work to the other"
- pack
- division_seam 0.1.0, jurisdiction CA-DSA
- seam_determinable eq true
- each_division_assigns_to_the_other eq true
- effect raise_flag SEAM_CIRCULAR_ASSIGNMENT, severity HIGH, category SCOPE_GAP
- priority 10, conflict_group opening_division_seam
- won the conflict group on this target over SB-021, "Both divisions carry the work"
The two sentences the conditions read
Conduit at Door D103 is work of Division 28. doc-manual · section 08 71 00 · page 5
Conduit at Door D103 is furnished under Division 08. doc-manual · section 28 13 00 · page 9
Why SB-022 displaces SB-021
Counting assignments alone makes a circular hand-off look like two parties carrying one item, which is the opposite of what has happened. Reporting it as a duplicate buy would send an estimator to delete a line they never had. The suppression is recorded in the run output rather than hidden by it.
Why it is worth an RFI and not a phone call
After award the two sentences are still there. The answer has to change a document, which is why the recommended action is a pre-bid RFI quoting both sentences side by side rather than a conversation nobody can cite.
The boundary is enforced, not promised. tests/unit/test_architecture.py walks the import graph and fails if a model client is reachable from engine, validators, scoring or risk. It is never skipped and never weakened to accommodate a vendor.
Stage 4. The register.
AvailableFive items from one run, ranked by severity then by rule id. This is the compact view. The full register, with every evidence citation, rationale, authority and rule trace, is on the sample register page.
| # | Risk | Target | Rule | Source | Exposure | Conf. |
|---|---|---|---|---|---|---|
| 1 | High | D101 locking deviceBoth divisions specify it and they specify different devices. RFI to delete one of the two requirements. | SB-020 | 08 71 00 p4 28 13 00 p8 |
Commercial exposure: calibration pending | 0.93 |
| 2 | High | D103 rough-inEach division assigns it to the other. RFI quoting both sentences side by side. | SB-022 | 08 71 00 p5 28 13 00 p9 |
Commercial exposure: calibration pending | 0.9 |
| 3 | High review | D104 powerNeither division specifies it. RFI asking which division carries the item. | SB-023 | 08 71 00 p3 28 13 00 p7 |
Commercial exposure: calibration pending | 0.55 |
| 4 | Medium | D103 powerThe documents do not settle it. Read the cited sections by hand before relying on this seam. | SB-024 | 08 71 00 p6 | Commercial exposure: calibration pending | 0.86 |
| 5 | Medium | D102 locking deviceBoth divisions carry it and agree. Confirm which one carries it and price it once. | SB-021 | 08 71 00 p5 28 13 00 p9 |
Commercial exposure: calibration pending | 0.91 |
The engine still emits an exposure band and the field is still there. The band is a structural placeholder so the ranking key has something deterministic to sort on after severity, and no band in any shipped pack is derived from cost history. The slot is kept and the number is withheld until it means something.
The full register, every citation and every rule trace Read every rule
Stage 5. Where the finding sits, and when you can still act on it.
In DevelopmentTwo views of the same five findings. One puts them on the building. The other puts one of them on a calendar. Both are drawn.
Spatial. The four controlled openings, with their findings on them.
In Development Plan extraction is not built and no module exists. The fixture spatial model records frame material, leaf count and confidence for each opening but carries no coordinates at all, so every position in this drawing was chosen by hand to be legible rather than measured off a sheet. Read it as a layout of findings, not as a floor plan.
| Opening | Frame, from the model | Findings placed on it |
|---|---|---|
| D101 | Hollow metal, exterior, confidence 0.95 | SB-020, locking device |
| D102 | Hollow metal, confidence 0.94 | SB-021, locking device |
| D103 | Hollow metal, confidence 0.93 | SB-022 rough-in, SB-024 power |
| D104 | Aluminum storefront, exterior, confidence 0.55, review_required true | SB-023, power |
Phase. One finding, four moments.
In Development SB-022 is real and its recommended action is real. This view is a framing rather than an engine output: the register carries no phase field and nothing in the run emits anything of this shape. Move the scrubber to see what changes.
- finding
- SB-022, opening D103, rough-in. Division 08 assigns the conduit to Division 28 and Division 28 assigns it back to Division 08.
- mechanism
- A pre-bid RFI quoting both sentences side by side and asking which division carries the work.
- position
- Strongest. Nothing is priced yet and the documents can still be changed. The answer costs an email.
- what changed
- Nothing. Both sentences are in the project manual and either one can still be deleted.
Quote both. Asking the question with only one of them attached invites the answer that it is obviously yours. SB-022, recommended pre-bid action
- finding
- Unchanged. The two sentences still contradict each other.
- mechanism
- A written qualification, or a stated allowance carried in the number.
- position
- Reduced. The question is no longer whether the documents will change. It is whether you carry the item or exclude it in writing, and whether a public agency will accept a qualified bid is a question for the instructions to bidders and your counsel, not for this engine.
- what changed
- The clarification window has closed. The same two sentences are about to become part of a contract.
At bid time nobody prices it, because each estimator reads their own section and correctly concludes it is not theirs. SB-022, rationale
- finding
- Unchanged, and now binding on both parties.
- mechanism
- A change order request, which is a negotiation rather than a question.
- position
- Weak. It is a negotiation with a party who can point at their contract and be right, and neither side has to move first.
- what changed
- The documents are complementary and what one requires is as binding as if all required it, so the contradiction is now inside the agreement rather than in front of it.
After award the two sentences are still there, which is why this is worth an RFI and not a phone call: the answer has to change a document. SB-022, rationale
- finding
- No longer a document question. The conduit is either in the wall or it is not.
- mechanism
- Absorbed or disputed. The work is installed by whoever is standing closest to the opening, or it stops and becomes a claim.
- position
- Lowest. Schedule pressure now decides the argument, and the party who is right is usually the party who cannot afford to wait.
- what changed
- Being right stopped being useful. The seam was determinable from the documents on day one and is now a field condition.
It is absorbed by whichever trade is standing closest to the opening when the gap is found, which in practice is the one already pulling cable. SB-023, rationale. The same run, a different target, describing the same end state
There is no cost axis on this view, and that is a decision rather than an omission. Exposure bands in the engine are structural placeholders carrying calibrated false. A figure that moved across four phases would be four uncalibrated numbers instead of one, presented in a shape that makes them look measured. The cost dimension is withheld until calibration data exists.
What the view does carry is mechanism and position, both of which are stated in the rule's own rationale and recommended action rather than invented here. Every italicised sentence above is quoted from the run and carries the rule it came from.
This walkthrough needs no JavaScript. The stage selector and the phase scrubber are form controls with a stylesheet behind them, and with the stylesheet off every stage and every phase renders in order as one long document.
What runs, what is being built, what is only specified.
Four states and no fifth. Available runs today on a real package. Pilot runs and is being validated with design partners. In Development is being built and is not reachable yet. Planned means the identifier block is reserved and no code exists.
| Capability | Qualification | State |
|---|---|---|
| Deterministic rule evaluation, validators, risk register, report | Runs today, reproducible byte for byte | Available |
| Specification and project-manual cross-check, Division 08 / 28 seam | Runs, being validated with design partners | Pilot |
| Seam rules SB-020 to SB-024 | The five rules this page walks through | Pilot |
| Scope-ownership statements, SB-001 and SB-002 | Single-statement scope rules, no join | Pilot |
| Access-control opening rules, AC-001, AC-010 to AC-014, AC-020 to AC-022, AC-030 | Base kit, egress hardware, storefront withholding, supply sizing | Pilot |
| Video-surveillance rules, VS-001 and VS-002 | Experimental. Not a promise anywhere on this site | In Development |
| Dual-vendor extraction agreement | Code written and unit tested, reached by no command | In Development |
| Hosted web application, login, chat copilot | In the repository, not deployed, nothing to sign into | In Development |
| Schedule-to-specification join, SB-010 to SB-019 | Identifiers reserved, no rules written | Planned |
| Addendum reconciliation, DC-020 to DC-029 | Identifiers reserved, no rules written | Planned |
| Cross-document contradiction, DC-001 to DC-019 | Identifiers reserved, no rules written | Planned |
| Plan and drawing extraction | No module exists | Planned |
| Bill of materials as an input | Specified, no ingest path | Planned |
AI reads. Rules decide. You approve.
Every stage above sits on one line, and the line is the same whether one vendor reads the page or two. It is not a policy in a document. It is an import-graph test that fails the build.
What a model is permitted to do
- Read a page and transcribe what is on it.
- Extract a structured fact and attach the document, page and span it came from.
- Classify a document, a section or a statement into a named type.
- Locate an element and report where it is.
- Match one reference against another and report the match with a confidence.
- Write prose about a finding that code has already produced, in the narration layer and nowhere else.
What only code may do
- Compute a quantity.
- Assign a part number or select a device.
- Produce a risk score or rank an item.
- Determine that something complies or does not.
- Decide that two readings agree, and decide what happens when they do not.
- Emit a number of any kind into the deliverable.
And two things nothing in the system does at all. No model checks a finding against the open web, because a model that searched for corroboration would be producing a judgment with a citation attached rather than a fact. No model settles a disagreement between two readings, because choosing a winner is arbitration and arbitration by a model is exactly the output this product cannot defend in a design review.
What we publish is measured. What isn't measured is labeled accordingly, which is what the states above are for and why three of the five stages on this page say Concept.
How the boundary is enforced What we will and will not claim
Three of these five stages are drawings. Help decide which one gets built next.
A pilot is a real bid package run through the stages that exist, with the output read by someone who knows what should have been on the list. Telling us what the register missed is the deliverable we want back.