00 · Executive Brief
The parcel backend works. The zoning intelligence is typed in by hand, district by district. That is the wall. This brief is the case for turning rules into reviewed data and computing one authoritative answer on the server.
Built from a full code review + the live API + the Aug 10 & Aug 17 tactical calls · Rowan · 2026-08-18
Decision strip · Decision Required
Nothing below is approved yet
Wed, August 19, 2026 · Scott
Rules-store architecture, the canonical column set, and sync/cache performance.
To validate
Thu, August 20, 2026 · Steve / Barry
Priority user, approved direction, budget/timeline and developer sourcing.
Decision required
Before any branded launch
Authentication, access control and real market coverage. See 08 · Launch Gates.
Launch blocker
State of the three layers
Parcel layer
Built and working. Solid fill: verified today.
Rules layer
Exists, but hand-typed. Hatched fill: human labour per district.
Verdict layer
Empty outline: no server-side evaluator exists yet.
Every status is stated in words as well as colour.
01 · Address → Answer
One pass through the whole experience before any architecture. Each step is labelled by how it works today.
02 · Today vs Target
Seven stages, each one column. The two cards in a column are the same stage before and after.
The one-sentence difference
The hand-authored spine becomes reviewed data, and the browser math becomes one authoritative server verdict.
Adding a market becomes a review rather than a rebuild. Quantified in 05 · Why it doesn't scale.
03 · Worked Property Example
Two real Asheville properties in the same zoning district. The rulebook does not change; the parcel inputs do.
Input A · the parcel
{{ pName }}
{{ pKind }}
Parcel record
{{ pParcel }}
Zoning district read
{{ pDistrict }}
Lot schematic · not to scale
Outer line: the lot. Dashed line: the buildable area inside the front, side and rear setbacks.
Automatic · verified today
Input B · shared rulebook
RM8 rules object
Identical for both properties.
Permitted use
{{ pUses }}
Dimensional standards
Front / side / rear 15 / 6 / 15 ft. ADU capped at 70% of heated living area, maximum 800 sq ft.
Hand-authored today
Output · the verdict
Calculation
{{ pCalc }}
{{ pVerdict }}
{{ pModel }}
{{ pLesson }}
Preliminary estimate · not a permit determination
floor( min(0.70 × heated_living_area, 800) / 10 ) × 10
Fairfax: approximately 760 sq ft of heated living area on a 0.26-acre lot returns approximately 530 sq ft. Old Haywood: no primary home, so the ADU maximum is 0 and the story becomes building a primary home first. Full worked numbers and sources are in the appendix.
04 · Verified Current System
Every statement in the first two columns was checked against the existing code and the live API. A working three-tier app on Compact Cottages' DigitalOcean: NestJS and Postgres.
Keep / reuse
The parcel half is solid
zones-api: NestJS and Postgres. Parcels loaded from CSV, versioned and activated; scales to 100k–1M records.
Verified today
Fast public search by address or PIN (trigram index).
Verified today
The matrix-and-formula concept itself is sound. It needs to stop being hand-typed.
Recommended reading of the evidence
Rebuild / replace
The zoning-intelligence layer
The permitted-use grid is one global sheet, filled one keystroke per cell. The bulk-import button is dead code.
Verified today
Size formulas are hand-built per district with every number baked in.
Verified today
The answer is computed in the browser, and the admin preview uses a second evaluator: two computation paths.
Verified today · drift risk
Parcel-to-rule matching is exact-string; drift shows nothing rather than an error.
Verified today
Launch blocker
Security and access control
Does not block the rebuild. Must be closed before a branded or public deployment.
The read API is public and unauthenticated.
Verified today · must fix before launch
The admin password resets to a default value on every boot, and a hard-coded fallback secret is present.
Verified today · must fix before launch
No role checks: any logged-in viewer can rewrite the rulebook.
Verified today · must fix before launch
05 · Why It Doesn't Scale
Scott, the internal zoning specialist, maintains the translator by hand today. The original developers required manual rule entry per jurisdiction on every data upload, which is exactly why the dimensional standards are hard to maintain.
Approximate operational illustration · not production telemetry
~25–30
manual actions per zoning district: approximately 15 permitted-use cells plus 8–10 formulas
×
~15–30
zoning districts in a typical county
×
many
counties, if coverage is going to mean anything to a realtor
Thousands to tens of thousands of manual rule entries, re-verified on every data refresh.
One county today · every cell a keystroke
Every cell in that grid stands for a value a person types and then retypes after a data refresh. Schematic, not a count.
vs
Same county as proposed · one reviewed record set
Effort per new market stays roughly flat, because the work becomes reading rather than typing.
The standardization wrinkle · raised Aug 17 · the developer must design around this
Rows vary by jurisdiction. Columns standardize.
Asheville rows
Buncombe County rows
→
Shared canonical columns
To validate · column set to be locked with Scott's translator
Same fields everywhere, different zoning-code rows per market. That is what makes a single shared rules table possible, and it is why exact-string matching has to be replaced by a normalized district key.
06 · Product Vision
Almost two different tools, same data. The recommended sequencing is homeowner-on-site as V1, realtor as V2, off the same shared backend.
Shared capability · proposed
Zoning rules + server verdict engine
Approved rules, normalized district matching, one authoritative evaluation, exposed through a shared API.
↓
Product · recommended V2
Realtor data service
Standalone and brandable: any address in, what can be built there out. Reads as a utility, with Compact Cottages surfacing as the recommendation rather than the pitch.
Product · recommended V1
Homeowner ADU tool
"Can I build an ADU?" answered with eligibility, size and the model that fits. The Compact Cottages conversion experience, on-site and already scaffolded.
↓
Chatbot ADU flow
Eligibility answered inside the existing chat, through the same API.
Per-listing zoning cards
A zoning summary attached to each land listing.
Additional surfaces
Anything else that can consume one shared verdict.
Recommendation · not yet approved
Today · what a visitor gets
Correct, but it reads like a permit-office printout.
Proposed · a plain-English verdict
"Yes, you can build a detached ADU up to about 530 sq ft in your backyard."
Eligibility. Allowed by right in this district.
Approximate size. Up to about 530 sq ft.
Caveat. A preliminary estimate, not a permit or legal determination.
Matching model. The Origami Home (384 sq ft) fits your lot.
Next action · Start a study · $650
07 · Target Architecture
Authoring rules and answering a lookup are separate paths that meet at the approved rules. Reading them as a single pipeline is what hides the human-approval step.
08 · Validation & Launch Gates
Every open risk in this briefing, in one place. A gate is only marked complete when the evidence says it is complete.
09 · Decisions Required
Engineering questions for Scott on Wednesday, August 19, 2026. Strategic decisions for Steve and Barry on Thursday, August 20, 2026. Each recommendation below is a recommendation only.
Engineering · Wednesday, August 19, 2026 · with Scott
Strategic · Thursday, August 20, 2026 · with Steve & Barry
10 · Developer Handoff
Scope extracted from the sections above. Outcomes are stated as testable results, not as implementation instructions.
Keep / reuse
The existing DigitalOcean parcel backend: Postgres, CSV upload, versioning and activation.
Fast address and PIN search.
The existing code and API as reference. Port the good parts.
Build / rebuild
The structured rules model with shared canonical columns.
The rules publishing and sync workflow.
Normalized district matching.
One server-side verdict layer.
The shared API capability.
Plain-English result UX and the required product surfaces.
Validate
The eight gates in 08, each with its owner and status.
Nothing here is a build task until its gate closes.
Fix before public launch
The three issues verified in 04: a public unauthenticated read API, default admin credentials with a hard-coded fallback secret, and missing role checks on rule editing.
Gate conditions in 08.
Inputs required
Repository, backend and admin access.
Scott's cleaned zoning translator.
Confirmed loaded markets.
The priority-user decision.
Approved direction and scope.
Acceptance outcomes · testable, implementation-agnostic
An address reliably resolves to a normalized zoning district.
Approved rules can be updated without rebuilding application logic district by district.
The customer-facing and administrative results use one authoritative evaluation path.
A covered property returns permitted-use information, an ADU-size result where applicable, and a matching cottage recommendation through a shared backend capability.
A new market can be demonstrated end to end: AI draft → human review → approval → publish and sync.
Unauthorized users cannot modify the production rules dataset.
Unknown or unsupported data produces an explicit safe state, never a silent blank or a fabricated verdict.
11 · Rollout Plan
The rebuild comes in-house to Rowan. Nothing after phase 3 starts until one new market has been proven end to end.
Immediate gates
This week
Brief ready
This briefing, the master proposal and the developer brief prepared.
Wed, August 19, 2026 · 3:00 PM
Backend deep-dive
Walk the backend with Scott; settle the rules columns and the sync approach.
Thu, August 20, 2026
Direction lock
Steve validates the priority user and direction; green-light scope.
Then
Scope, quotes, sourcing
Draft scope and initial quotes; begin the senior developer search.
Appendix
Anticipated questions
No. Columns 01 and 02 of the swap board in 02 stay exactly as they are; enough of the upload tools are functional. The rebuild is the rules layer, the missing server-side lookup and the front end.
Same rulebook, different parcel inputs. Worked through in 03.
No, because a lookup never queries the authoring store. The recommended sync is drawn in 07: rules are edited in one place and served from another. Still to validate.
AI drafts from the county's published ordinance; it does not decide. Scott validates and approves every county before it goes live, and every result is framed as a preliminary estimate rather than legal advice. The change is from typing hundreds of cells to reviewing a drafted table.
Same content, structured and reusable. Today the spreadsheet feeds a developer who hard-codes it into the app, and a data upload can force redoing rules. In the proposed model the approved table is the rules: edited once, synced live, reused by every surface, and AI-drafted for new markets.
The inputs listed in 10: repository and backend/admin access, Scott's tidied translator, the priority-user decision and confirmation of which markets are actually loaded. Then scope and quotes, and developer sourcing.
Worked numbers · from the live tool
178 Fairfax Ave, Asheville · RM8: existing approximately 760 sq ft home on a 0.26-acre lot; detached ADU allowed, maximum approximately 530 sq ft; the Origami Home (384 sq ft) fits.
1717 Old Haywood Rd, Asheville · RM8: vacant, ADU maximum 0 with no primary home yet; a build-from-scratch and density story.
ADU-max formula: floor( min(0.70 × heated_living_area, 800) / 10 ) × 10.
Sources & provenance
Full read of the cloned zones-api, zones-admin and zones-site code, cross-checked against the live API.
Aug 10 and Aug 17 Compact Cottages tactical calls (Steve, Barry, Scott).
Scott's translator: 2026-08-11 zoning translator.xlsx (Dropbox · consultant files).
Companion docs: master proposal, developer brief, flow diagram and plain-English explainer.
Preliminary planning briefing: not a permit or legal advice. Compact Cottages × Rowan · 2026-08-18. Quantities marked with "approximately" or "~" are estimates; coverage claims remain pending verification of the loaded datasets.