Qurite
In developmentA document-analysis system that supports answers with source-resolving citations and refuses answers without enough evidence.
At a glance
- Outcome: Answers questions about high-stakes documents and proves each answer: every claim resolves to a clickable box on the source drawing, or the system refuses for lack of evidence. The demo counts W18X40 callouts on a structural drawing.
- Status: Remains in development. The upload-to-answer path checks a committed ground truth, but its parser binary and pinned pdfium make the test on-demand rather than part of the default suite.
- Role: Built solo: evidence contract, confidence model, and refusal semantics.
- Stack & libraries: Uses Go services, content-addressed source storage, and Rust pdfParse for documents. Keeps three non-extracting parser skeletons for future formats.
- Source: Keeps the source private.
- Limitations: Proves one vertical against a fixture corpus. Counts only born-digital PDFs through their text layer. Parks scanned-sheet vision until it has a separate accuracy gate.
Counting model
Identifies an instance by drawing, current revision, region role, and referenced content rather than text alone. Treats detail labels as plan cross-references, reports them as caveats, and never combines revisions. Lets steel define viewport roles and the biomedical pack define document roles while reusing the counting engine.
Separates evidence from inference. Draws evidence counts at their source boxes; labels findings such as “this connection detail is atypical” with their rule, inputs, and confidence. Uses search only for candidates and proves citations with typed pointers into stored sources, so citations survive deletion of every embedding.
Confidence and refusal
Computes confidence from retrieval match, source authority, and extraction quality. Shows the weakest axis beside the average and shows no number when an axis is missing. The unit-tested floor has no caller; unresolved citations or inaccessible sources currently trigger refusal.
Restricts every domain pack to a closed set of finding kinds. Rejects capacity, compliance, or diagnosis before loading the pack, and names the engineer of record as the authority on every finding. Enforces permissions on every read and refuses the whole answer when any scoped source is unavailable.
Fixture validation
Returned about 374 instances from an eleven-page set with a ground truth of 294, despite using no model. The parser fuzzy-matched two steel shapes and misplaced two page 9 callouts outside their region, leaving both uncounted. Now requires the exact count and a drawable box for every instance, making over-matches read high and the page-9 defect read low.
Counts callouts, not beams: a structural “typical” label can represent multiple identical members. Records 294 labels but leaves beam count blank pending manual counting; page one has seven. Beam-line detection remains unbuilt.
Displays every counted callout as a clickable box with its extraction record, three confidence axes, and stored source. Scopes counts by sheet or set, shows findings, and exports the evidence as an annotated PDF. Keeps the golden case hand-checkable, including visible misses and phantom callouts.
Rendering boundary
Replaced a Go pixel-space overlay that accepted parser images and mappings. Large formats limited legibility, and reinterpreting serialized parser geometry in Go caused defects. Moved vector PDF annotation into pdfParse while Go retained scope enforcement, delivery, and audit records. Never rewrites the source; checksums before and after prove it. Uses Rust because the parser owns geometry, not because of a language preference.
Repository structure
Splits Qurite across a Go core, per-format parsers, and Rust pdfParse. Shares an evidence contract whose pointer covers table rows, record cells, messages, streams, and video frames without requiring PDF geometry.