Tagged as plat2json, gbbopen, blackboard, computer vision
Written on 2026-06-30 14:00:00
"Good heavens! For more than forty years I have been speaking prose without knowing it." — Molière, Le Bourgeois Gentilhomme
I've been building a thing that reads survey platsplat2json — scanned or vector plat in, CAD-ready geometry out. The name tells you everything about my naming instincts and nothing about what it does. The longer I work on it, the more it rhymes with a piece of old AI I'd been reading for an unrelated project: the blackboard system. I want to write the rhyme down, because it's the most interesting thing about the project and it changed how I think about the parts that actually work.
A warning first, so I don't oversell: plat2json is not a blackboard system. It's a pipeline — stage feeds stage feeds stage. But the stages that work best are the ones where I reached for blackboard moves without knowing their name. Less "look at my blackboard," more "look at the moment I learned I'd been speaking prose."
Picture specialists around a chalkboardborn in a 1970s speech system called Hearsay-II, which had to turn a noisy smear of sound into words — no single trick does that, so it let a sounds-expert, a syllables-expert, a words-expert and a grammar-expert all scribble guesses on a shared board until a sentence everyone could live with emerged. Nobody's in charge. Each one watches the board, and the moment they can contribute, they write their piece and step back. One expert's partial answer is the clue another was waiting for. The puzzle solves itself, no master plan.
The living Lisp version is GBBopen. The board is a set of space instances; the things on it are unit instances arranged along dimensions (x, y, time — whatever the problem needs); the experts are knowledge sources that declare which events they care about and a function to run when one fires. A control shell runs a loop so simple it's almost rude: process the events that arrived, wake the knowledge sources that care, let each propose an activation with a rating, run the highest-rated one, watch that write new facts to the board and fire new events — repeat until nobody wants to move"quiescence," which is a lovely word for it. The data structure does the scheduling. Nothing runs a script.
Trace a plat down to linework and you get chains of points. Nothing is labelled. That squiggle is a curve, that one's a lot line, those tiny rotated characters are a bearing — a surveyor knows at a glance, the computer knows nothing. So it has to guess and check.
Is this chain an arc? Fit a circle by least squares, measure the residualhow far, on average, the points stray from the circle you just fit them to, and run it past four gates: enough points, low residual, sane radius, real sweep. Pass → it's reborn an arc. Fail → it stays lines. A straight lot line fails on its own, because the best circle through nearly-collinear points has a silly radius and a residual that blows the gate. The geometry refutes the bad guess for you.
Arcs that grew up apart. A long curve usually traces as broken fragmentsthe skeletonizer stutters at every intersection and label. So after fitting, the code seeds on a fragment that fit as an arc and asks each neighbour one question: if I glue you on, does the combined set still fit the same circle? Yes → absorb and keep growing. No → leave it. Two different curves that merely touch get rejected, because the joined fit spikes the residual. The curve reassembles itself, each fragment admitted only because it agrees with the emerging whole. That's a blackboard solution island, and I did not set out to build one — I set out to stop a curve being chopped into seven useless pieces. The pattern was just the natural shape of the fix.
Arguing with an outside authority. A recorded plat carries a curve table — the surveyor's own published radii and lengths. The refiner snaps each self-assembled arc to the nearest published radius, then checks the arc length the geometry implies against the one the surveyor wrote down. Agreement is a quiet win. Disagreement is a flag: go look. Same logic runs on the text — a local vision model reads the bearings and distancesmore on that in the next post, and not one of its reads is trusted alone; each is matched against the geometry the pipeline already measured. A hallucinated digit has nowhere to hide.
This is the thesis I keep circling back to, the same one from the buoy piece: the claim is never "one perfect estimator measured the truth." It's "two independent estimators agreed, and their agreement is the measurement."
No, and being precise about that is more useful than claiming the badge. plat2json has a fixed order of operations — no agenda, no rated queue of competing experts, no events waking knowledge sources on their own. Want it to recognise a north arrow or a section corner? I'd wire it in by hand. In a real blackboard system I'd write one more knowledge source, give it a rating, and drop it in the room; the control shell would work out when to call it. That gap is the whole game.
What the project taught me is that the blackboard pattern isn't exotic. It's what you converge on, piece by piece, whenever one pass can't resolve the ambiguity: generate cheap hypotheses, test them against whatever evidence you have, let partial answers reinforce each other, and refuse to call anything true until two independent things agree. I reinvented a corner of Hearsay-II by accident, the way you hum a folk melody you've never consciously heardthe next thing I want to try is to stop reinventing it: let the arc-fitter, the label-reader and the curve-table-checker all watch one shared board and argue. Whether that's worth the machinery for a single-document problem is a genuinely open question — but at least now I know what I'm reaching for, and that someone worked it out fifty years ago so I wouldn't have to.
TWO ESTIMATORS AGREED. THAT IS THE MEASUREMENT. SURFACING. U-2.