A corrected value is refused by the system unless it names who verified it and why. The originally parsed value is kept beside the correction, because the disagreement between them is the auditable part. Corrections are applied as an overlay on top of the parse, never as a parser change in disguise.
How we read the record, and how you check us.
Everything here is a public record we machine-read from the body that published it. Nothing is entered by hand, nothing is estimated, and nothing is inferred from a listing. This page is how you verify that claim rather than take it.
What 99.51% actually measures.
A single accuracy number is meaningless without its denominator. Here is ours, stated precisely enough that you could argue with it.
Of case records audited against the source documents they were drawn from, weighted to the corpus’s real composition, 99.51% agreed with the source. Measured on the Charleston Board of Zoning Appeals corpus, audited 2026‑07‑30.
Why the weighted figure is the honest one, when weighting usually isn’t. The sample was built deliberately hard. Whole strata of the nastiest material — cases with no zone recorded, no parcel id, a split decision, a blank grid — were pulled in at far higher rates than they occur, because those are where a parser breaks. That makes the raw score worse than the corpus actually is. Weighting each stratum back to its true share corrects for a distortion we introduced on purpose. We publish both so the correction is visible instead of assumed.
The shape of the errors is the part worth reading. Every one of the eight ordinary strata — together about 93% of the corpus — came back clean, 61 of 61. All seven errors sit in three rare strata that make up roughly 2.4% of the corpus. The sample did exactly what it was stratified to do: it found the hard cases, and it found them where they live.
This sample is spent, and we will not re-run it. The audit surfaced a systematic defect, we fixed it, and the figure above was measured after that fix. A test set that has guided a fix can no longer measure the thing it corrected — from here it survives as a regression anchor, which is what a consumed test set is for. So this number is not “re-verified every release.” It carries the date it was measured, and the next figure will come from a freshly drawn sample, not from this one.
Two further corrections were applied afterwards by hand, each verified against the source and attributed to the person who made it. Re-scoring the sample after those corrections would produce 100.00%. We will not publish that, here or anywhere: it would measure only that we fixed the rows we found, and any reader who asked how it was measured would be right to discount everything near it.
The audit date matters more than the headline. A vendor who publishes an accuracy figure without one is publishing a marketing number.
Not every fact is known the same way.
A decision read off the board’s own marked grid and one recovered from a clerk’s note beside an empty line are not equally strong, and a report that renders them identically is hiding something. But how well a decision was read is a different question from whether the record it came from can support a rate at all — and conflating the two is the most consequential mistake available here. We keep them as two separate axes.
How the decision was read
| Value | Cases | What it means |
|---|---|---|
| grid_mark | 1,938 | Read from the board’s own decision grid — the marked box on the meeting’s disposition sheet. |
| motion_and_vote | 13 | Read from the recorded motion and the vote tally in the minutes. |
| annotation_line | 12 | Read from a clerk’s annotation line beside the item. Weaker than a mark in the field meant to hold it, and labelled as such — the whole annotation is kept, not just the verb, because losing by applicant loses a fact. |
| human_correction | 2 | Overridden by a human verifier against the source, with the reason recorded in the correction log. |
| not recorded | 4,752 | No classification is recorded for these cases. That is an absence on our side, not a finding about the case — we have the decision, we have not classified how it was read. It is currently recorded only for the Charleston Board of Zoning Appeals; for every other body this column is empty across the board. |
Counts from the store, observed 2026-08-01. They are floors: they describe what we have classified, not everything that exists.
What the source is
| Kind | Rate? | Why |
|---|---|---|
| full_disposition | Yes | The source records every outcome, including refusals. |
| recommendation | No | The body recommends; another body decides. A recommendation is advice, not a result. |
| approved_only | No | The source lists what was adopted. A refusal cannot appear in it, so a rate computed from it would be 100% by construction. |
| not_a_decision_source | No | A reference layer — parcel facts, sale prices — not a record of decisions. |
| unclassified | No | Not yet classified. No rate may be computed over it until it is. This fails closed on purpose: adding a jurisdiction must never silently authorise a rate. |
Why we insist on the distinction. It would be tidier to say that better-graded evidence earns a rate. It would also be false. A decision read straight off the grid still cannot be scored if it came from a body that only recommends, and a case whose reading we never classified can be scored perfectly well if it came from a record that shows refusals. Evidence grade describes our reading; the source’s nature decides what may be computed. A rate on this site exists only where the record could have shown us a refusal.
A blank field is a claim. We don’t make it.
When a report shows nothing for wetlands, a reader concludes there are no wetlands. That inference is how listing platforms mislead people without ever stating a falsehood. Every absence on our reports is typed and labeled, and each type says what search it stands for.
The authority does not release this in any machine-readable form. No amount of work on our side changes it.
The record exists and we haven’t read it yet. This is our backlog, and it’s dated.
We searched a named registry over a stated period and this parcel isn’t in it. Absence of a record is not evidence of absence, and the page names the registry we searched.
The layer exists and this parcel is outside it. A real, checked negative — the only kind we let stand as reassurance.
What goes into a rate, and what sits beside it.
A rate is only as good as the set it divides by, and the tempting mistake is to sweep every case into the denominator. A request that was deferred or withdrawn was not refused — counting it as one quietly scores a pause as a failure and understates the approval picture.
So our denominator is final outcomes only — ratified against denied. Deferred and withdrawn cases are shown, counted, and listed separately, never folded in. The rule is applied the same way everywhere, and every rate we publish states it on the page rather than leaving you to reconstruct it.
Counts are floors wherever our coverage of a body is partial. Where we hold part of a record, a count says “at least this many,” and the page it appears on says what the rest is.
From a scanned agenda packet to a field on your report.
Harvest
Agendas, minutes, ordinance indexes, staff reports, permit exports, and GIS layers are pulled from each publishing authority. We record where each artifact came from and when — and we distinguish a document we have catalogued from one we have actually fetched, because an inventory row is not proof of a pull.
Extract
Documents are read into structured records: applicant, request, parcel, body, date, staff recommendation, motion, vote, conditions. Each extracted value keeps a pointer to the document it came from, and every case in the store can cite its own source.
Resolve to parcel
The hardest step. Records reference parcels by address, tax map number, subdivision lot, or narrative description, and those change over time through splits and merges. Anything we can’t resolve confidently is held out rather than guessed onto a parcel.
Record provenance
Each decision is stored with how it was established and any qualifier attached to it, which governs how it may be used and whether a rate can be computed from it at all.
Regression-test every change
A frozen baseline is re-parsed from the source documents on every change — not compared against the database, which would only prove nobody edited it. It catches drift, including the silent kind where a value stays the same but its provenance quietly changes. It is a change detector, not a correctness oracle, and it is labeled as one.
Audit
Accuracy is measured against source documents by a human on a stratified, seeded sample, and republished with the date it was measured. A sample that has guided a fix is retired from measuring and kept as a regression anchor.
Publish
A field reaches a report only when it carries a source, a date, and its provenance. A field that can’t carry all three doesn’t ship.
When we’re wrong, you’ll be able to tell.
A miss that traces to an extraction rule gets the whole rule re-run across every affected record, not a single-value patch. A fix that generalizes and a one-off override are different things, and we keep them separate — including when deciding what an accuracy figure is still allowed to measure.
Every correction names the person who verified it against the source and the reason they gave. A correction log without its verifier is an anonymous edit. We would rather show you two corrections with their names on them than a number you cannot interrogate.
Write to grier@upyourbids.com with the parcel and the field. We do not publish a response-time commitment here, because we have not made one, and a promise on a trust page is worth less than nothing if it is decorative.
Every human-verified correction is published with its case, the person who verified it against the source, the date, and the reasoning. Read the correction log →
Where a record is structurally ambiguous the build process makes its own call, and each one carries the sentence it was decided on. Those are a different weight of evidence and are deliberately not folded into the correction log — when they are published it will be as what they are.
We will never tell you what a board is going to do.
We publish what was decided. Base rates describe applications that were already ruled on, by a named body, in a named jurisdiction, over a stated period. That is a historical fact and you can check every case in it.
A prediction is not a fact, and a probability attached to your parcel would be our opinion wearing a number’s clothing. We won’t sell you that, because the moment we do you’re trusting our judgment instead of the record — and the record is the only thing we have that nobody else does.
Base rates are also small-n by nature. Twenty-three comparable cases in one jurisdiction is a real signal and a thin sample at the same time. We always show the count, always show the cases, and never round a count up into a confidence.
WE DO NOT RANK LIKELIHOOD OF APPROVAL.
WE DO NOT CHARACTERIZE WHY AN OFFICIAL VOTED AS THEY DID — WE QUOTE THE STATED REASON AND CITE THE PAGE.
WE DO NOT OPINE ON THE MERITS OF AN APPLICATION, YOURS OR ANYONE ELSE’S.
What this is not.
It is not a title search. We don’t hold a machine-readable easement or encumbrance index, and no report from us substitutes for a title examination.
It is not a survey, an appraisal, or a wetlands delineation. Mapped layers are screening tools; a boundary on a report is not a boundary on the ground, and a mapped wetland is a flag to go check, not a finding.
It is not a zoning determination. Only the zoning administrator determines what is permitted. Our envelope is a reading of the ordinance text as published, with the section and version cited so you can check it.
It is not a consumer report. We do not assemble information about individuals for credit, employment, insurance, or tenant screening, and our terms prohibit using it that way.
It is not legal advice, and we are not your attorney.