Your Land HistoryAboutBooks & VideosStart Your Land File

About › Technical Appendix

Technical Appendix: Technology Reference

How the system finds records, checks evidence, and builds Land Files. Technical reference for researchers, archivists, and developers.

Download documents: PDF (v1.2) · Word (.docx) · Large Print Word (.docx)

Version Archive and Baseline

Current Technical Baseline: Edition 2.0 (October 16, 2026). Repository: dave-schooltrustlands/yourlandhistory.

This technical appendix documents the architecture, data sources, and verification pipelines of YourLandHistory.org. The system is built so that menus and manuals report only what is verified in the live capability ledger.

Version Date Milestone & Architecture Documents
v2.0 (Current) October 16, 2026 Multimodal evidence engine, 50 States 50 Places showcase with archival photos/lidar, SSURGO soils integration, strict citation provenance. Web edition (below) · PDF
v1.2 October 15, 2026 Complete 8-layer architecture documentation, R2 triple-bucket storage classes (P/M/D), polite fetcher and rate-limiting contracts. PDF · Word
v1.1 October 10, 2026 Expansion to multi-state support (Utah and Oregon), cadastral parcel tie-ins, and automated fact consistency linter. Archived
v1.0 October 1, 2026 Initial prototype architecture, GLO Willamette Meridian township parsing, and Polk County pilot parcel verification. Archived

What This Book Is and Is Not

This book explains how YourLandHistory works behind the screen: where its records come from, how they are checked, how a Land File is written, where information is stored, who can see it, how changes reach the live site, and where the technology is headed.

It is not a how-to for landowners. For that, read the Quick Start Guide and the state guides, such as the Oregon Guide. It is not a legal document either. The site’s Terms and Privacy pages govern the legal relationship between the project and its users. Above all, a Land File is a historical research account. It is not a title-insurance policy, a boundary survey, or a legal opinion about who owns what.

How to Read This Book

The book is written for three kinds of readers at once. Pick your path:

Nothing you need to understand the overall flow appears only in an IT box. Those boxes add exact names, routes, tables, and file paths for the people who will operate or audit the system.

Visual Conventions and Core Vocabulary

Status badges. Each chapter ends with a status strip. The badges mean:

Badge Meaning
[BUILT] Running today.
[PARTIAL] Some of it runs today; the strip says what is done and what isn’t.
[PENDING] Small, known follow-up work that’s under way.
[PLANNED] Designed or intended but not yet built. Never described as live.

Diagram borders. In the figures, a solid green border means built, a dashed border with a yellow fill means partial or pending, and a dotted border with a gray fill means planned. A double red border marks a checkpoint, a place where the system stops something that fails a rule. The shapes stay distinct when printed in black and white.

Seven words used throughout:

Part I: The Big Picture

1 What YourLandHistory Is and the Land File

In short. YourLandHistory.org is the public website of America’s School Trust Library. A landowner picks a state, finds their land, and gets a Land File: a history of that land told from today backward, where every sentence points to a real record. Owners can add whatever they have about their land, from management plans and deeds to letters and family stories. Today the Land File is presented as one standard report. The layers underneath are built so the same knowledge can later be presented in many other ways. The site says only what it can actually do today.

1.1 A walk through a sample parcel

Imagine the owner of a sample tree-farm parcel in Oregon. They open yourlandhistory.org and are asked one question first: Where is your land? Oregon and Utah are open now. Washington is next, with a target of early 2027, then North Carolina, aiming for mid-2027. The rest of the states and DC come after that.

Next, the owner finds the land. They can type a street address or a county tax account number, pick a county map and tax lot, or paste a legal description from a deed. Our sample farm is made up of several tax lots, so the owner puts them all in the multi-lot tray, and the site groups the lots that touch into one piece of land.

Then the system goes to work, the way a research librarian would. It works out which public records exist for that land, fetches the ones it is allowed to fetch, reads them, and turns each fact into an evidence card. A writer program drafts the story from those cards, and a separate checker program removes any sentence the cards don’t support.

While the system works, the owner can add their own material. Our sample owner has a 2004 forest management plan, a copy of the deed from the family that sold them the land, a hand-drawn map of old skid roads, and a letter from the previous owner about planting the north slope. Today they photograph or scan those pages and add them to the Land File with a short caption each. Later, when the planned document reader and other file types arrive, they could upload the plan as a PDF and record the family story in their own words.

What the owner gets back is a Land File, presented today as one standard report:

That report is the first way of presenting the Land File, not the last. The same checked knowledge about the sample farm could later become a land-focused view of its soils, trees, plants, animals, and birds, or a people-focused history of the families who held it, including the previous owner’s letter if the owner chooses to include it. It could also be printed as a book, published as a website, or narrated as a video. Those views and formats are planned; the section “One body of knowledge, many ways to present it” below explains why the system is built for them.

Figure 1.1: What goes into a Land File, and the many ways it can come out. Today’s standard report is built; themed views and other formats are future.

1.2 What owners can add

The public record is only half of a land’s history. The other half sits in desk drawers, barn offices, and family albums. The design invites owners to add anything they have about their property, for example:

Here is the honest line between today and the plan. Today the upload accepts images: JPEG or PNG images up to 8 megabytes each, up to 24 per Land File, each with an optional caption, who is in it or who wrote it, and when. Any paper can come in today as a photograph or scan, so a page of a management plan, a deed, a letter, or a map can be added now and appears in the owner’s private Land File with its caption. Planned are other file types, such as PDF documents, word-processing files, and typed or recorded family stories, and a document reader that can read the text inside an upload and offer its facts as evidence cards (Chapters 9 and 14). Until that reader arrives, an owner’s material sits beside the record-based story but doesn’t yet feed it.

1.3 One body of knowledge, many ways to present it

The Land File the owner receives today is a simple, standardized report: the brief and the eight story chapters, at the reading level and depth the owner picks. That is the first presentation, not the only one the system is built for.

Everything under the website (the evidence cards, the people recorded as dated roles, the places, the records and the owner’s own material) is stored as structured knowledge, not as finished pages. Because the knowledge is kept apart from the way it is shown, the same knowledge can be presented in many ways. Possibilities the design is built to support include:

These views and formats are planned (Chapter 14). The point for readers of this manual is that they don’t require a new system. They are new presentations of the same checked knowledge, held to the same rules: every sentence traces to evidence, and private material stays private unless its owner chooses otherwise.

1.4 A living file, not a one-time report

A Land File is revisable. It can grow when the owner adds material, when a volunteer checks a reading, or when a new source comes online for that county. That isn’t surveillance; the system doesn’t watch anyone’s land. It just means the history never stays frozen at a draft that later proves incomplete.

1.5 Who it’s for

YourLandHistory is built first for landowners: families, tree farmers, ranchers, and homeowners who want to know the story of the ground they live on and care for. It also serves historians and genealogists, who want sources they can check. It serves teachers, who want local history their students can touch, and woodland and watershed groups, whose members share a landscape. Over time it aims to serve partner organizations, such as historical societies, landowner associations, and school-trust advocates, that want to offer Land Files to their members (Chapter 14). The design choices in this book, from the source rule to the private storage room, come from what these readers need in order to trust what they read.

1.6 Where YourLandHistory sits

YourLandHistory is one part of America’s School Trust Library (ASTL), whose home is schooltrusts.org. A companion showcase, The School Sections, explains the lands Congress granted to the states to support public schools. A good deal of the history this system tells starts with those grants and with the government surveys that laid them out.

1.7 The promise: no unbuilt promises

The site keeps a strict rule: say only what is live. Its menus, manuals, and state guides draw their claims from two master lists kept with the code. The capability ledger says what each part of the site actually does today. The state source registry says which records can be reached in each state. Anything not yet working is labeled as planned, and this manual follows the same rule.

Why This Choice. Landowners, historians, and partners need to trust what the site tells them. Promising features that don’t exist would spend that trust. A ledger checked against the live site keeps the promises honest. (See Chapter 3, Rule 5.)

For IT: Under the Hood. The ledgers are ledger/capabilities_ledger.json (each capability has an id, a screen, and a status such as live, live_demo_backend_planned, or in_progress) and ledger/states_config.json (sources per state, each with a mode). The eight story chapters are listed under CAP-S5-CHRONOLOGICAL-SPINE. The public site is the Cloudflare Worker yourlandhistory-web, which serves yourlandhistory.org, yourlandhistory.com, and their www hosts.

Status strip, Chapter 1

Capability Status
State-first front door (Oregon and Utah open) [BUILT]
Four ways to find land; multi-lot tray [BUILT]
Today-backward story, reading levels, Brief and Full [BUILT]
Read-only Story link that hides the owner’s name [BUILT]
Owner uploads (images and scans of any paper, with captions), private to the Land File [BUILT]
Other upload types (PDF and other documents, typed or recorded stories) [PLANNED]
Reading of uploaded documents (deeds, surveys) [PARTIAL] (a demonstration screen is live; the full reader is planned)
One standard report presentation [BUILT]
Themed views (land, people, and more) and other formats (print book, website, video) [PLANNED]
Washington (target early 2027), North Carolina (target mid-2027), other states [PLANNED]

New terms: Land File, multi-lot tray, story chapters, Story link, capability ledger, presentation.

2 The Building: Eight Layers Numbered 0 to 7

In short. The system is built in eight layers, like the floors of a library. Raw records arrive at the loading dock (Layer 0), and the public reads the finished work in the public rooms (Layer 7). Each floor has one job, and requests pass between floors through set doors rather than shortcuts.

2.1 Why layers

A layered design keeps each job in one place. The website never reaches straight into the stacks; it asks at the service window. A report-writing program never edits the catalog directly. That makes the system easier to check and easier to repair. It is also safer, because every request passes the same locks.

The layers are numbered from zero at the bottom, because Layer 0 is the outside world: the archives and offices the library depends on but doesn’t own.

Figure 2.1: The eight-layer architecture.

2.2 A floor-by-floor tour

Layer 0: Sources (the loading dock). The outside record keepers: the Bureau of Land Management’s General Land Office records (land patents, survey plats, and surveyors’ field notes), the national survey-grid dataset called CadNSDI, county assessors, recorders, and surveyors, state archives, the U.S. Geological Survey (USGS), the Natural Resources Conservation Service (NRCS, for soils), the National Oceanic and Atmospheric Administration (NOAA, for climate), the Census Bureau, and the Library of Congress. The library visits them politely. It sends no more than one request per second to any one website, follows each site’s posted rules for automated visitors, and records each source’s terms of use before keeping a copy.

Layer 1: Accounts and tenancy (the front desk). Who someone is and what they may see: users, organizations, memberships, roles, API keys (stored only in scrambled form), and an append-only audit log. The rule is that an individual landowner owns their private Land File by default, and an organization, such as a woodland association, can sponsor access for its members without seeing their files. The tables and the database’s ownership rules are built. Member sign-in through these tables is planned (Chapter 10). Today a private Land File opens only with its own secret link key (Chapter 9).

Layer 2: Entities (the catalog room). The things history is about. Places are parcels described in any of the six American survey traditions. People are recorded as dated roles tied to a source (“patentee in 1871,” “deputy surveyor in 1854”) rather than as a single “owner” field. Organizations, record repositories, and statutes live here too.

Layer 3: Records (the stacks). The documents themselves: fetched public records and members’ own material (anything an owner adds, from management plans to family letters), with the text read from them and notes on where each came from. Each file is stored once, under a digital fingerprint computed from its contents. The permanent design sorts them into three storage rooms (public, private, and donated), described in Chapter 9.

Layer 4: Knowledge (the reading room). What the library knows: the registry of sources state by state, the capability ledger, the findings, the catalog of books, and the state research guides. Reference text lives in Markdown and JSON files kept with the code. Findings and live registry data live in databases.

Layer 5: Services (the service window). The one door that requests pass through: a single small program at the network edge that offers a standard web application programming interface (API) and an interface for AI agents (Chapter 10). Before a paid AI call, today’s report path checks a kill switch and a monthly spending guard. A per-Land-File budget reservation is built in the permanent database and will guard every paid call once the move to that database is complete (Chapter 11).

Layer 6: Agents (the library staff). The AI workers: the report writer, the independent checker, a machine reader for old survey notes, the researcher, and the planned Reference Desk (“Ask About Your Land”). The design rule is that agents use the same service door and audit trail as any other client, with no back doors to the database. Today the writer, checker, and survey-note reader run inside the backend’s report pipeline. Giving outside agents their own limited keys is planned.

Layer 7: Presentation (the public rooms). The website, the planned partner portals, and the manuals and guides. This floor holds no business rules; it only shows what the lower floors produce. Today it shows a Land File as one standard report. Because the knowledge below is kept separate from how it is shown, this floor can grow many presentations of the same knowledge: land-focused and people-focused views, other themed views, and formats such as a printed book, a website, or a video (Chapters 1, 7, and 14). This manual is itself a Layer 7 product, written in Markdown (see the Colophon).

2.3 Following one request through the floors

To see how the floors work together, follow a single request. The sample owner taps a sentence in Chapter 5 of their Land File to see its evidence.

  1. Layer 7. The browser asks the website for the card behind that sentence. The website has no data of its own, so it passes the request along.
  2. Layer 5. The request crosses the private line to the backend service, which checks that the request carries the Land File’s secret link key. Without the key, a private file opens nothing.
  3. Layer 4. The backend looks up the card in the report’s knowledge: the claim, its scope, its verification status, and the holding it came from.
  4. Layer 3. The card points to a holding, here a scanned field-note page, stored once under its fingerprint, along with its provenance.
  5. Layer 2. The holding is tied to a place (the section corner) and to a person in a dated role (the deputy surveyor who wrote the note).
  6. Layer 0. The card’s locator link points back to the original page at the Bureau of Land Management, so the owner can check it with their own eyes.
  7. Layer 1 is the gate that every request passes. Today that gate is the secret link key and, for data routes, the administrator key. With member sign-in, it becomes the member’s own account.

Nothing in that journey skipped a floor, and nothing reached past the service door to the data directly. That discipline is what lets a new floor-level component, such as a partner portal on Layer 7 or a new AI model on Layer 6, be added without weakening the others.

2.4 One important note on the databases

Today the live site keeps its working report data, including its evidence cards and written sections, in a fast edge database (Cloudflare D1). The permanent system of record is built: a full Postgres database with map geometry (Supabase Postgres with PostGIS). The move into it is under way. Chapter 8 explains this two-engine reality, and the rest of the book is careful to say which engine does what.

Why This Choice. Numbering the floors and giving each one a single job means a new partner portal, a new state, or a new AI model can be added on one floor without rebuilding the others. (ADR-0001, ADR-0004.)

For IT: Under the Hood. Layer 7 is the Worker yourlandhistory-web (static assets through the ASSETS binding). Layer 5 is the Worker parcel-v2-backend, serving /v1, /mcp, and /api/v2. The working report store is the D1 database parcel-v2-db. Layers 1, 2, and 4 have their target home in the Supabase project astl-core (Postgres with PostGIS, pgvector, pgcrypto, uuid-ossp, pg_stat_statements, and Vault; UUIDv7 keys). Layer 3 is content-addressed storage keyed by SHA-256, with three R2 buckets for the permanent classes. Layer 0 politeness is in backend/src/fetch/polite.js and robots.js.

Status strip, Chapter 2

Capability Status
Layers 0, 4, 5, and 7 in daily use [BUILT]
Layer 1 tables and ownership rules [BUILT]; member sign-in [PLANNED]
Layer 2 schema for six survey systems [BUILT]; data beyond the open states [PARTIAL]
Layer 3 content-addressed storage [BUILT]; moving into the three class rooms [PARTIAL]
Layer 6 writer, checker, survey-note reader [BUILT]; Reference Desk backend and outside-agent keys [PLANNED]
Partner portals [PLANNED]

New terms: layer, source, entity, holding, service door, agent.

3 Seven Rules the System Keeps

In short. Seven rules run through every part of the system. Together they make sure the history it tells is traceable, honest about its limits, respectful of privacy, and checked by someone other than its author.

These rules are written into the project’s governing document, AGENTS.md. Where possible they are also written into the software, so they can’t be forgotten.

Rule 1: No source, no sentence. Every sentence in a Land File must cite a record, the page or region within it, and the record’s review status, whether that is unreviewed, checker-passed, or person-verified. Citing a source is required; having a person confirm it is the highest level of trust, not a precondition. The report checker drops uncited sentences today, and the permanent database refuses to save a finding without a source. (Chapters 6 and 7.)

Rule 2: Nearby is not here. A record about the neighborhood, the township, or the county is never written as if it happened on this land. The checker removes sentences that blur that line. (Chapter 7.)

Rule 3: A person’s reading beats a machine’s. When a volunteer has read a surveyor’s handwriting, that reading stands. A machine reading is labeled “Reading needs checking” and can never overwrite a person’s. (Chapter 6.)

Rule 4: Members own their private material; public records stay public. A member’s own material belongs to that member. It is kept private to their Land File, is not used to train AI models (only AI services whose terms forbid training on what we send are used), and can be erased. Public government records are licensed for open reuse under the Creative Commons Attribution license (CC BY 4.0) where the source’s terms allow. Direct public downloads and archive mirrors are planned. (Chapter 9.)

Rule 5: Say only what is live. Menus, manuals, and guides draw from the capability ledger and the state source registry. Planned features are labeled as planned. (Chapter 1.)

Rule 6: Mechanical breakers, not human gates. Instead of a person approving each expensive step, automatic switches limit spending and can stop all AI calls at once. Work stays fast without risking a runaway bill. (Chapter 11.)

Rule 7: The builder never grades its own work. The agent or model that builds a feature, guide, or manual doesn’t approve its own release. A different reviewer checks it. (Chapters 11 and 12.)

3.1 The rules in action

Rules are easiest to understand through examples. Here is each one at work on the sample farm.

3.2 House style

The house style supports these rules. Reports use US customary units only: feet, chains, links, acres, and miles. (A chain is 66 feet. A link is one-hundredth of a chain, or 7.92 inches. These are the units the original surveyors used.) Reports are written in American English, and Native history is written as factual history, drawn from treaties, survey records, and scholarship.

Why This Choice. Historians judge a history by its footnotes. These rules give every Land File the footnotes a careful historian would demand, and they make the checks automatic instead of relying on someone to remember.

For IT: Under the Hood. Rule 1 is enforced at report time by the sentence checker in backend/src/report/writer.js, and in the Postgres system of record by the check constraint chk_finding_has_source on findings, which requires a holding_id or a paper_id. Rule 5 is the ledger pair under ledger/. Rule 6 is ADR-0006 (the LLM kill switch, the monthly guard, and reserve_ai_budget). Rule 7 is “cross-model separation of duties” in AGENTS.md §1.

Status strip, Chapter 3

Rule Where enforced today Status
1 No source, no sentence Report checker; Postgres constraint for the permanent store [BUILT]
2 Nearby is not here Report checker [BUILT]
3 Person beats machine Readings store and register [BUILT]
4 Member owns private material Secret-link access, image cleaning, Forget [BUILT]; member sign-in and document-text redaction on the server [PLANNED]
5 Say only what is live Ledgers [BUILT]
6 Mechanical breakers Kill switch, monthly guard [BUILT]; per-file and per-organization budgets in live traffic [PLANNED]
7 Builder never grades itself Release process [BUILT]

New terms: chain, link, separation of duties.

Part II: How a Land File Is Made

Part II follows one sample tree-farm parcel from the moment its owner types an address to the moment they share a finished story. It borrows a second picture from the land-records world: the title-abstract examiner. An examiner works from a checklist, keeps a chain of custody for every document, and has a second examiner at a separate desk check the work with a red pencil. (A Land File, though, is a historical account, not a title policy.)

4 Finding the Land Across Six Survey Systems

In short. The owner describes their land in whatever way they know it. The system turns that description into one or more tax lots, groups the lots that touch, and works out how the land was first surveyed, so it knows which old records to look for.

4.1 The owner’s view

Our sample owner doesn’t know the township, range, and section of their tree farm, and they don’t need to. They know their address, and they have last year’s property-tax statement on the kitchen table. They choose Oregon, type the address, and the site shows the county’s tax-lot outline over a map, with the lot’s map number and account number beside it.

The farm is actually three tax lots: a large wooded lot and two smaller lots along the road, which were bought at different times. The owner taps each one into the multi-lot tray. The site notices that all three share boundaries and offers to treat them as one piece of land with one story. A fourth lot the family owns across the valley doesn’t touch the others, so the site keeps it separate. It could get a Land File of its own.

Behind the scenes, the site has now done three things. It has found the county records for each lot. It has drawn an outline around the whole holding. And it has asked which original survey that outline falls in. In Oregon, the answer is the federal rectangular survey that began at the Willamette Meridian in 1851, along with the Donation Land Claims that early settlers filed before and during that survey. That one fact decides which old records exist: township plats, surveyors’ field notes, claim files, and land patents.

If one of the lots had been inside a town or a filed subdivision, the site would have noticed that too. A house lot in town shares most of its history with its neighbors, so the story would lean on the neighborhood: the subdivision plat, fire-insurance maps, and the house itself. Where no automatic source exists for those records yet, the site points to where to look.

4.2 Four ways in

The intake screens accept four kinds of description:

  1. Street address: the easiest. It is matched to a point by the Census Bureau’s address service, then to the county’s tax lot. The address itself is never saved in the public holdings.
  2. Tax account number: from a property-tax statement, looked up in the county’s assessor data where the county publishes it.
  3. County map and tax lot: the assessor’s map number and lot number.
  4. Legal description: the words in a deed, such as a township, range, and section, or a claim number.

County lookups run through an adapter, one per county or statewide layer. Each adapter answers the same questions: find by map and lot, by account, by point, by drawn outline, and find which lots touch a given lot. That uniform design lets the start page, the multi-lot tray, and the report builder treat every county the same way. A county without an adapter falls back to the national sources, and the site says so plainly.

Figure 4.1: Parcel intake and the six US survey systems.

4.3 Six ways America described land

American land wasn’t all surveyed the same way, so the permanent database is designed to hold all six major traditions:

Being able to describe a place in a system is not the same as having data for it. The schema supports all six today, and ten states are registered across them. Live parcel lookups currently run through the county adapters and the working report database (D1). The permanent places table in Postgres has its geometry and survey fields built and is seeded lightly while the move continues.

4.4 People as dated roles

The design doesn’t store “the owner” as a single field that gets overwritten. It records people and organizations as dated role assertions: this person, with the name spelled as the record spells it, was the patentee in this year, according to this record. A parcel’s history then becomes a series of sourced claims that can’t erase each other, which is exactly what a historian needs. Each person also carries a living-status label based on the record dates, so living people can be treated with more care than historical ones.

Why This Choice. A single owner field forgets the past. Dated roles keep every claim with its source, so conflicting records can sit side by side until someone works out which is right. (ADR-0001.)

For IT: Under the Hood. The lookup routes on the backend are /api/v2/lookup/address, /lookup/taxlot, /lookup/lots, and /lookup/town. Address and town lookups are in backend/src/fetchers/finder.js. The county adapters are in backend/src/adapters/: arcgis.js (one configuration per county, with the same five lookups), polk.js and benton.js (tax lots plus assessor records), owrd.js (the Oregon Water Resources Department’s statewide tax-lot outline layer, outlines and lot IDs only), and index.js (the registry). Grouping and town plats are in backend/src/pipeline/town.js and aliquot.js. In Postgres, places holds place_key, survey_system, PLSS fields, is_school_trust_section, PostGIS geom with validity dates, and UUIDv7 keys; land_file_places links places to Land Files; and role_assertions holds person_name_as_written, role_type, assertion_date, and living_or_presumed_dead.

Status strip, Chapter 4

Capability Status
Four intake modes, multi-lot tray, grouping of touching lots [BUILT] (in the working report database)
Town-lot and plat detection [BUILT] (in Oregon counties with adapters)
Permanent schema for six survey systems and dated roles [BUILT]
Place data in Postgres beyond the open states [PARTIAL]

New terms: PLSS, Donation Land Claim, metes and bounds, adapter, role assertion.

5 The Research Plan, Polite Fetching and Record Extraction

In short. For each parcel, the system builds a research checklist from the state source registry. It fetches what it is allowed to fetch, politely and within each source’s rules, and stores each record once with a note of where it came from. Then it reads the details out of the old survey notes.

5.1 The owner’s view

Once the sample farm’s outline is known, the owner sees a short “looking” screen while the system works. Behind that screen it is running a checklist much like a title examiner’s. Which township is this? Who surveyed it, and when? Which claims and patents touch these sections? What do the soil and geology maps say? Is there a water right on file? Which treaty covered this ground? Which offices hold the deeds that aren’t online?

For most of these, the system can go and get the record itself. The township’s original plat comes from the Bureau of Land Management, as do the surveyors’ field notes from the 1850s and the land patents that turned public land into private property. The soil map unit and the geologic unit come from the national services, as do the old USGS topographic maps of the area and the treaty boundary. For others, such as county deed books from the early 1900s, the system can’t fetch them, but it knows which office holds them, and the research plan says how to ask.

A few minutes later, the owner’s Land File has a shelf of holdings behind it: the plat, perhaps a dozen field-note pages, two patents, a soil report, a geology summary, a water-right record, several historical maps, and a treaty reference. Each one has a fingerprint, a source, a date, and a link back to where it lives.

5.2 The checklist

Every state has an entry in the state source registry, which lists each known source and how it can be reached. Each source gets one of five modes:

From this, the system makes a research plan for the parcel: the steps it does itself, plus the steps the owner can take, such as which office to write to and what to ask for.

Figure 5.1: Research plan modes and the polite-fetching gate.

5.3 Polite fetching

Every automatic source passes through a single polite-fetching gate. It sends no more than one request per second to any one host. It reads and obeys each site’s robots.txt file, the posted rules for automated visitors. It records the source’s terms of use before keeping a copy. And it identifies itself honestly. Public archives are shared resources, and the library intends to be a good guest. Where a service’s rules forbid automated queries, the system doesn’t query it. One national geology service, for example, is used from a one-time download instead of its blocked point service.

5.4 What each fetcher retrieves

The fetchers are small modules, one per source:

5.5 When a source changes or fails

Public data services change without warning: a county moves its map server, a federal site redesigns its search, a service goes down for maintenance. The system is built to fail honestly. A fetch that fails is recorded as a failure, not silently skipped. The research plan shows the step as not yet done, and the Land File’s gap box says what couldn’t be reached and where to look in the meantime. Holdings already fetched keep working, because they are stored copies. A diagnostic route reports which source hosts the backend can currently reach, so an operator can tell a broken adapter from a temporary outage. When a source changes for good, its adapter is updated and the registry’s “last checked” date moves forward. Until then, the source’s mode can be dropped back to “follow link” or “ask office,” so the site never promises what it can’t deliver.

5.6 Holdings: stored once, traced forever

Each fetched record becomes a holding. It is stored once, under a digital fingerprint computed from its contents (a SHA-256 content hash). Two identical files always have the same fingerprint, so if two Land Files need the same plat, they share one copy, and the fingerprint proves the copy hasn’t changed since it was fetched. With each holding the system records its provenance: the source, the item’s identifier at that source, when it was fetched, under what terms, and which parser read it. If someone later questions a fact, its record can be traced back to the original.

5.7 Reading the old survey notes

When a federal surveyor set a section corner in the 1850s, he marked nearby trees as witnesses. For each one he recorded the species, the trunk’s diameter in inches, its compass bearing from the corner, and its distance in links. A typical line reads something like “a fir 24 ins dia bears N 45 E 112 lks dist.” These bearing trees are some of the most vivid evidence of what the land looked like before settlement. Was it oak savanna, fir forest, or open prairie? Where were the creeks and the trails?

The system reads bearing trees out of the field notes in a pluggable step with two parts:

Person readings and machine readings are stored separately and labeled with their method. A machine reading is shown as “Reading needs checking” and never replaces a person’s (Rule 3). The register of a corner’s trees is built from people’s readings wherever a person has keyed that corner. Machine readings appear only where nobody has read the page by hand yet, and then always with their label.

Why This Choice. Fetching once, storing by fingerprint, and logging the terms keeps costs low, keeps the archives friendly, and gives every fact an unbroken trail back to its source. (ADR-0003.)

For IT: Under the Hood. Modes are defined under status_tags in ledger/states_config.json. National sources (CADNSDI, GLO, USGS_TNM_3DEP_EPQS, USDA_NRCS_SDA, NOAA_NCEI, US_CENSUS_TIGER, ROYCE_KAPPLER) carry host, coverage, refresh interval, and storage class. Planning is in backend/src/pipeline/plan.js; the fetch gate is in backend/src/fetch/polite.js and robots.js; the fetchers are in backend/src/fetchers/ (glo, blmor, cadnsdi, county, polkmap, sda, sgmc, dogami, gnis, tnm, royce, finder). Holdings go through backend/src/kb/holdings.js (getOrFetch by place, source, item type, and item key) and blobstore.js. Bearing trees are in backend/src/extract/trees.js (parseTreeText plus pluggable readers); readings carry method (person or llm) and, for machine readings, the model name and verification: 'needs-checking'. Admin reading tools are under /api/v2/admin/readings and /api/v2/admin/machine-read.

Status strip, Chapter 5

Capability Status
Five source modes and a per-parcel research plan [BUILT]
Polite-fetching gate [BUILT]
The fetchers listed above [BUILT]
Holdings stored once by fingerprint, with provenance [BUILT]; moving holdings into the three class rooms [PARTIAL]
Person and machine bearing-tree readings [BUILT]
“Found, not wired” sources [PENDING] (adapter code, source by source)

New terms: research plan, source mode, polite fetching, holding, provenance, bearing tree, parser.

6 Evidence Cards, Verification States and Honest Gaps

In short. Every fact becomes an evidence card that says where it came from and how far it reaches. Facts climb a ladder of trust, from unreviewed to checker-passed to person-verified. Whatever the system couldn’t find, it says so plainly.

6.1 The owner’s view

Open any chapter of the sample farm’s Land File and tap a sentence. A card slides out. Say the sentence is about a big fir at the northwest corner. The card says the fact comes from the deputy surveyor’s field notes for that township, page such-and-such, written in March 1854. It gives a link to the scanned page at the Bureau of Land Management, and it says the fact concerns a corner of this land. If a volunteer has checked the reading against the scan, the card says person-verified. If only a machine has read it, the card says Reading needs checking.

Tap a different sentence, about a wagon road through the valley, and the card looks different. Its source is a county history, and its scope is marked region. The story can say that a road ran through the valley. It can’t say the road crossed this farm.

Scroll to the end of the chapter and you’ll find a short box titled with three plain headings: what was found, what was not found, and where more might be. For the sample farm it might say that no early deed for the smaller roadside lot was found online, that the county clerk holds the deed books for those years, and what the clerk charges for a copy. That box is as much a part of the history as the sentences above it.

6.2 Anatomy of an evidence card

An evidence card holds:

Scope matters because a township survey or a county history may describe the area without proving anything about one particular parcel. The card says which it is, and the writing step honors that (Rule 2). Numbers on cards are shown in the surveyors’ own units with feet alongside, for example “59.59 chains (3,933 feet).”

Figure 6.1: Chain of custody and verification states.

6.3 Where cards live today, and where they’re going

Today the live site keeps evidence cards with each report in its working database (D1). Rule 1 is enforced at report time by the checker described in Chapter 7: a sentence that cites no card, or the wrong card, is dropped.

In the permanent Postgres system of record, a card is saved as a finding. There, a built-in database rule, a check constraint, refuses any finding that lacks a source, whether that source is a holding or a member’s paper. A finding also carries a supporting quotation, the model and prompt version that produced it (if a machine did), a link to any finding it conflicts with, and who verified it and when. As the working data moves into Postgres, that database rule takes over the job of making unsourced findings impossible.

6.4 The ladder of trust

Each finding sits on one rung of a three-step ladder:

  1. Unreviewed: captured with a source, but not yet checked.
  2. Checker-passed: an automated check has confirmed that the claim matches its cited source and stays within that source’s scope.
  3. Person-verified: a person has compared it against the original record and confirmed it.

This ladder applies to facts. It is separate from the sentence check in Chapter 7, which makes sure the story’s sentences match the cards. Only person verification confirms a fact against the original archive.

6.5 When records disagree

Old records often disagree. Two surveys may give different distances for the same line, an index may misspell a name that the patent spells correctly, or a county history may give a date the original record contradicts. The system doesn’t hide disagreements, and it doesn’t pick a winner silently. Each claim keeps its own card and source. In the permanent database, a finding can point to another finding it conflicts with. The story says plainly when the records differ (“the index gives 1871; the patent itself is dated 1872”) and leaves the conflicting cards side by side, so a reader or a volunteer can settle the question against the originals. Where a person has settled it, the person-verified reading stands.

6.6 Honest gaps

A good researcher reports what they didn’t find. Each Land File lists open questions: records not found, where more might be, and which office to ask. The system keeps checked contact details for many county offices and for tribal cultural-resource and historic-preservation offices, and it shows the date each was checked. The bearing-tree register is honest in the same way: a corner where the surveyor recorded no trees is listed as having none, not quietly dropped.

Why This Choice. Telling a reader what’s missing earns more trust than a seamless story that hides its gaps, and it gives the owner a real next step. (Rules 1 and 2.)

For IT: Under the Hood. In the working database, cards carry locators[], dates, scope, and verification labels. The bearing-tree register card records data.register_from, which is 'person, keyed corners', 'person', or 'machine', and lists machine entries separately in data.machine_entries, each with verification: 'needs-checking'. In Postgres, findings has claim_text, holding_id, paper_id, locator, supporting_quote, conflicts_with_finding_id, produced_by_model, prompt_version, review_status, verified_by, verified_at, and an embedding column for planned search. The constraint chk_finding_has_source and FORCE ROW LEVEL SECURITY apply. Review states are unreviewed, checker_passed, and person_verified. Open questions come from /api/v2/open-questions, and tribal-office contacts from /api/v2/kb/tribal-offices (backend/src/data/tribal_offices.js).

Status strip, Chapter 6

Capability Status
Evidence cards with locators, dates, scope (working database) [BUILT]
Postgres findings with the “must have a source” rule [BUILT] in the schema; live cards still in D1 [PARTIAL]
Three-step ladder of trust [BUILT]
Open questions and office contacts [BUILT]
Volunteer verification at scale [PARTIAL] (volunteer transcription is under way on sample registers)

New terms: evidence card, scope, finding, verification state, open question.

7 Writing, Checking and Sharing the Story

In short. A writer program turns the cards into readable prose, one section at a time. A separate checker removes any sentence that cites the wrong card, invents a number, or puts a nearby record “on this land.” Sections written by historians are locked, so the writer can never change them. The owner can share a read-only version that hides their name.

7.1 The owner’s view

When the sample farm’s records are in, the owner sees the chapters of today’s standard report fill in one after another. Each chapter opens with a few plain paragraphs. A small control lets them switch the reading level: Kids for a grandchild, Adults for most readers, or PhDs for the historian in the family. A second control switches between Brief and Full.

Here is how one fact from the Sullivan tree farm near Pedee reads at each level.

Every one of those sentences carries the same card. Change the level and the words change, but the evidence stays the same.

7.2 The eight story chapters

Each Land File has eight story chapters, ordered from today backward so the reader starts in the familiar present and walks into the past:

  1. This land today, and the last fifty years: current use, the assessor’s record, recent aerial and map history.
  2. The title and deed bridge: the chain of private ownership back to the first patent, where records allow.
  3. The township and its school-trust sections: the sections granted to the state for schools, and what became of them.
  4. The first owners: donation claims, cash entries, homesteads, and patents.
  5. The surveyors: who surveyed the township and when, and what they saw: bearing trees, creeks, trails, prairies, and houses.
  6. Before the surveyors: the Native peoples who lived on and used the land, drawn from treaties, survey records, and scholarship.
  7. The land itself: rock, soil, elevation, water, and floods.
  8. Your research plan: what to look up next, and where.

At the top sits “The story in brief,” a short summary written after the chapters.

7.3 The writer

The writer is a small, fast AI model. It writes one section at a time, plus the brief. It sees only that section’s evidence cards, and only under display names. A township key becomes plain words such as “a township in the Willamette Meridian,” and internal card IDs, accession numbers, book and file numbers, and source codes are taken out before it sees them. It must attach card references to every sentence it writes.

Figure 7.1: Writing and checking the story.

7.4 The independent checker (the red pencil)

A separate checker reads every sentence the writer produced and drops any sentence that:

If a sentence still contains an internal code, it goes back to the writer once to be rewritten. If the rewrite also fails, the sentence is dropped. The sentences that survive go on to the reader filter and the style linter. If nothing in a section survives, the section shows a short note instead of made-up text.

The checker confirms that sentences match the cards. It doesn’t re-examine the cards against the original archives. That is the job of person verification (Chapter 6).

7.5 Editor-locked sections

Some sections are too important to hand to a machine. The best example is “Before the surveyors,” the account of the Native peoples who lived on and used the land. For the sample, it was drafted from treaties, the survey records, and published scholarship, including Bob Zybach’s 1999 Oregon State University master’s thesis on the Soap Creek Valley and the stories recorded in 1913–14. It was reviewed by editors and then locked. A locked section is stored exactly as approved, at each reading level. The writer never writes “Before the surveyors” and can never replace any locked text. Scholarship like the thesis is cited and quoted, never redistributed as a file.

7.6 The reader filter and the house style

Before anything is shown to the public, a reader filter hides working notes, such as lines marked as gaps for the editors or notes addressed to the builders. The stored copy is unchanged, and the system records what it hid. A house-style linter enforces US customary units (feet, chains, links, acres, and miles) and American English. Surveyors’ names are shown in full only where a record gives them in full. Otherwise they appear as the index spells them, with a note saying so.

7.7 Staying in step with the evidence

Written text belongs to the specific build of evidence it came from. When the evidence is rebuilt, the old text is hidden until it’s rewritten, so stale prose never sits on top of new facts. When a build finishes, all sections are written in parallel, and then the brief.

7.8 Today’s report is the first presentation

The eight chapters, the brief, the levels, and the depths make up today’s standard report. Every Land File uses the same structure, which keeps it simple to read, check, and compare.

The writer, the checker, and the evidence cards don’t depend on that structure. The writer is handed a set of cards and a section to write; the checker tests each sentence against its cards. The same machinery can therefore write other presentations from the same knowledge (planned):

Whatever the view or format, the same rules hold. Every sentence must trace to a card, the checker still runs, and private material appears only where its owner chooses.

7.9 Sharing

The owner can share a read-only Story link. It removes the owner’s name, never includes private material such as the owner’s uploads, and can’t be used to change anything.

Why This Choice. Fast AI writing makes Land Files affordable. The independent checker and the editor-locked sections make them trustworthy. Neither would be enough without the other. (Rules 1, 2, and 7.)

For IT: Under the Hood. The modules are backend/src/report/assemble.js, writer.js, and texts.js (levels adults, kids, phds, and all). The writer is called through backend/src/lib/llm.js, which applies the kill switch and spend guard. On-demand writing is POST /api/v2/admin/write and locked text is POST /api/v2/admin/section-text with locked: true, both requiring the admin bearer key. Rewrites are logged as writer:<slug>:rewrite. The reader filter records what it hid in hidden_from_readers. Setting the Worker variable WRITER=off, or turning the LLM kill switch off, stops the writer. Each section carries text_brief for the Brief depth when an author has filed one. Text rows carry format: plain | markdown.

Status strip, Chapter 7

Capability Status
Eight story chapters, three levels, two depths, and the brief [BUILT]
Writer with display names only [BUILT]
Independent sentence checker and one-rewrite rule [BUILT]
Editor-locked sections [BUILT]
Reader filter and house-style linter [BUILT]
Read-only Story link [BUILT]
Themed views (land, people, others) and formats (print book, website, video) from the same cards [PLANNED]

New terms: writer, checker, editor-locked section, reader filter, linter.

Part III: What Holds It Up

Snapshot of the live infrastructure on October 15, 2026. Part III names the actual programs, databases, and storage rooms running today. It’s the part of the book most likely to change, so check the live ledgers for the current migration status. It uses plain, literal terms rather than metaphors.

8 Where Things Run and the Two-Database Transition

In short. The site runs as two small programs at the network edge, one for the website and one for the backend, joined by a private line. Working report data lives today in a fast edge database. A full Postgres database with map geometry is built as the permanent system of record, and the move into it is partway done.

8.1 Two programs at the edge

Both the website and the backend run as Cloudflare Workers: small programs that run in Cloudflare’s data centers around the world, close to each visitor. There are no servers to patch, and capacity grows automatically with traffic.

The web Worker talks to the backend over a service binding, a private, direct line between two Workers that never crosses the public internet. Each Worker has a staging twin, with -dev added to its name, which is hidden from search engines and used for testing before anything goes live. The staging twins talk only to each other, never to production.

Figure 8.1: Where things run, and the two-database transition.

8.2 The two-engine reality

Two databases are in play right now, and it matters to be clear about which does what.

Why move? D1 is fast and simple, and it serves the live site well. But the long-term library needs real map geometry across six survey systems, row-by-row ownership rules for many members and organizations, rich relationships between people, places, and records, and a standard database that any competent IT team can operate, back up, and audit. Postgres with PostGIS does all of that. When the move is complete, D1 will remain only as a short-lived cache at the edge (ADR-0001).

8.3 How data will move

The intended approach is gradual and reversible: new permanent records (places, holdings, findings, story versions) are written to Postgres first while the live report path keeps reading from D1, and then the live path switches over one area at a time, each switch checked on staging before it reaches production. Nothing is deleted from D1 until the Postgres copy has been verified. This manual will be updated as each area moves.

8.4 A report build from start to finish

Here is the order of events when the sample owner presses “make my Land File,” with roughly where each step happens:

  1. The website sends the chosen lots to the backend over the private line.
  2. The backend creates the report record in the working database, issues the report’s secret link key (keeping only its fingerprint), and starts a build job.
  3. The planner reads the state source registry and lays out the steps.
  4. The fetchers run through the polite-fetching gate. New records become holdings in the content-addressed store, and already-held records are reused.
  5. The extractors read structured details, such as bearing trees, corners, soil units, and patent rows, into cards, each labeled with its method and verification.
  6. The assembler sorts cards into the eight story chapters and the evidence panels.
  7. The writer and checker write each chapter in parallel, and then the brief. Every AI call passes the kill switch and the monthly guard and is logged with its cost.
  8. The report is ready. The owner’s browser holds the link key, and the build is recorded so later rebuilds can tell which text belongs to which evidence.

The report page shows progress while the build runs. If a written section isn’t ready when the owner opens the report, the next visit carries the writing forward, a couple of sections at a time.

8.5 Manuals as code

The project’s manuals and state guides are written in Markdown and kept in the same repository as the code. A build script uses Pandoc to turn each one into a Word document, a Large Print Word document, and a PDF. So far it builds the Quick Start Guide and the Oregon Guide. This manual was produced the same way, from Markdown, through Pandoc, into Word, Large Print Word, PDF, and the web page. One source feeds every format, so the formats can’t drift apart (ADR-0005).

Why This Choice. Running at the edge keeps the site fast and inexpensive anywhere in the country. Moving to Postgres gives the library a durable, standard database that any competent IT team can operate. (ADR-0001, ADR-0005.)

For IT: Under the Hood. Production yourlandhistory-web serves the yourlandhistory.org and yourlandhistory.com custom domains and their www hosts. Its static assets are in web/public (bound as ASSETS), and its service binding API points to parcel-v2-backend. Staging is yourlandhistory-web-dev, bound to parcel-v2-backend-dev. The backend’s D1 binding is DB (parcel-v2-db, or parcel-v2-db-dev on staging), with migrations in backend/migrations (0001–0012). Knowledge-base migrations 0019–0022 are applied on staging only, and production gets them through ops/PROMOTE_KB.sh. The Postgres extensions are pgcrypto, uuid-ossp, postgis, vector, pg_stat_statements, and supabase_vault, and the schema is supabase/migrations/0001_astl_foundation.sql. The backend reaches Supabase over HTTPS (PostgREST) with a server-only key. Docs are built with node scripts/build-docs.mjs, from content/ into dist/docs/.

Status strip, Chapter 8

Capability Status
Web and backend Workers, staging twins, service binding [BUILT]
D1 working report database [BUILT]
Postgres system of record (schema, row-level security, functions) [BUILT]
Moving working data from D1 to Postgres [PARTIAL]
Search by meaning (pgvector installed) [PLANNED]
Markdown-to-Pandoc document pipeline [BUILT]

New terms: Cloudflare Worker, service binding, staging, D1, Postgres, PostGIS.

9 The Three Data Classes, Storage and Privacy

In short. The design sorts every stored file into one of three storage rooms: public records, members’ private material, or donated heritage. Members can add anything they have about their land. Today it arrives as images (photographs and scans of papers), stripped of hidden location data, kept private to the Land File’s secret link, and erasable. Other file types and reading the text inside documents are planned.

9.1 Three classes, three rooms

The permanent design classifies each file when it arrives and stores it in its own Cloudflare R2 bucket, a digital storage room:

All three storage rooms exist and are connected to the backend. Moving the working collection into them is part of the move described in Chapter 8. Today the working holdings and uploads sit in the backend’s content-addressed store.

Figure 9.1: The three data classes.

9.2 License versus serving

A license says what people may do with something. Serving is whether the files are actually published for download. The Class P license is set. Direct public downloads from the storage rooms aren’t switched on yet, and the planned quarterly mirrors to Zenodo, the Internet Archive, and Oregon State University Libraries haven’t started. For now, public records reach people through Land Files and through links back to the original sources. Class D follows the same path: it will be served and mirrored once public serving opens.

9.3 What happens to a member’s upload today

The intent is that an owner can add anything they have about the land: a forest management plan, a farm plan, a consultant’s report, a deed, a survey, a map, a letter, notes about prior owners, a family story, or a photograph of an old barn or a boundary marker.

Today the live upload accepts images: JPEG or PNG files up to 8 megabytes each, up to 24 per Land File. That covers photographs and also scans or phone pictures of any paper, so a page of a management plan or a deed can be added now. Each upload can carry a short caption, who is in it or who wrote it, and when. When an upload arrives:

  1. The backend checks its size and type.
  2. It strips the hidden information inside the image file, including the GPS location where it was taken. The date it was taken is kept.
  3. It stores the cleaned file, linked only to that Land File, marked as the owner’s own material and not public.
  4. The upload is shown only to someone who opens that Land File with its secret link key. The system keeps only a fingerprint of that key, not the key itself, so a Land File’s web address alone opens nothing. The public sample reports are the only exceptions.
  5. The owner can delete any upload, or ask the system to forget the whole Land File, which erases its uploads, plans, versions, and records.

9.4 More file types, document reading, and the redaction rule (D4-v2)

Two steps are planned. The first is accepting more kinds of files, such as PDF documents, word-processing files, and typed or recorded family stories. The second is reading what owners upload, so that facts in a management plan, deed, survey, or tax statement can become evidence cards in the owner’s private Land File. The Edition 2.0 site shows how it will work on its “Add your land papers” screen. That screen runs the redaction check in the visitor’s browser as a live demonstration. The rule it demonstrates, called D4-v2, is deliberately narrow:

Enforcing the text redaction on the server, on every path where a model reads a document, comes with the full document reader, which is planned alongside member sign-in.

Figure 9.2: Intake redaction and privacy.

9.5 If the project ever ends

The About page makes promises about the long term, and the architecture is built to keep them. Owners can download what is in their files. The project commits to at least twelve months’ notice before any closing or transfer. Private files are never sold or handed over without the owner’s consent. Material that owners choose to publish carries an open license and is meant to be deposited with a named successor archive. Content-addressed storage, a standard Postgres database, open licenses on public records, and planned public mirrors all make those promises practical to keep.

9.6 AI providers and training

The rule for any private material is that it goes only to paid AI services whose terms forbid training on what we send. The site’s code keeps a short list of allowed providers and refuses requests to any model not on it. The Privacy page names the current provider and its retention terms.

9.7 What changes with member sign-in

Today’s protections rest on the secret link key, image cleaning, Story links that hide names, and erasure. With member sign-in, each Land File and paper is tied to a signed-in owner, the database’s row-level security filters every request to that owner, private files are handed out only through short-lived signed links, and owners get self-service export, a named successor, and Forget me for their whole account. Cloudflare R2 encrypts stored data at rest by default.

Why This Choice. Members will trust the library with family papers only if the papers stay theirs. Public records grow in value when everyone can reuse them. Keeping the two in separate rooms with separate rules serves both. (ADR-0002, ADR-0003.)

For IT: Under the Hood. The buckets and bindings are astl-class-p-public (R2_CLASS_P_PUBLIC), astl-class-m-private (R2_CLASS_M_PRIVATE), and astl-class-d-donated (R2_CLASS_D_DONATED). As of October 15, 2026 all three have r2.dev access off and no custom domains. Photo uploads go to POST /api/v2/property/:id/uploads (multipart field photo, 8 MB limit) and are cleaned by cleanImage() in backend/src/lib/imgclean.js, then stored in the blob store under uploads/<property>/<upload>. The uploads table records permission: 'owner' and public_ok: 0. Report link keys are stored only as SHA-256 hashes (properties.token_hash, migration 0011), enforced when REPORT_TOKENS=on, with PUBLIC_REPORT_IDS listing the public samples. Erasure is POST /api/v2/property/:id/forget → backend/src/report/forget.js. The D4-v2 browser check is in web/public/argon/. In Postgres, papers carries pii_redacted, exif_stripped, reader_model, and rights_holder, with FORCE ROW LEVEL SECURITY.

Status strip, Chapter 9

Capability Status
Three R2 storage rooms [BUILT]; moving the collection in [PARTIAL]
Class P license (CC BY 4.0) [BUILT]
Public downloads and archive mirrors [PLANNED]
Image uploads (photographs and scans of any paper) with GPS stripped, private to the secret link [BUILT]
Other file types (PDF, documents, typed or recorded stories) [PLANNED]
Forget a Land File [BUILT]
D4-v2 text redaction [PARTIAL] (live demonstration in the browser; server enforcement planned)
Document reader for deeds, surveys, statements [PLANNED]
Member sign-in, signed links, self-service export and successor [PLANNED]

New terms: R2 bucket, Class P, M, and D, CC BY 4.0, secret link key, redaction, Forget.

10 Accounts, Authentication and the Single API Door

In short. Every request goes through one door, the backend service. Today, the sensitive parts of that door are locked with a long administrator key, and each private Land File opens only with its own secret link key. Member sign-in, per-member database rules, and limited keys for partners and agents are planned.

10.1 One door

The backend offers three entrances, all in the same program:

Website screens, future partner portals, and AI agents all come through this one door. Behind it, the same queries, permissions, and cost controls apply. There are no back doors into the database (ADR-0004).

Figure 10.1: The single API door.

10.2 Authentication today

10.3 A review catch on October 15, 2026

On October 15, 2026, the new /v1 and /mcp routes were briefly reachable without a login check. The coordinator found this in review and closed it the same day by requiring the administrator key on every data route. The fix was deployed to production and committed to the repository, so future deploys build from the corrected code. This is the review process doing its job: a problem found and closed on the day it appeared.

Figure 10.2: Authentication today versus planned.

10.4 Authentication planned

10.5 The agent interface in more detail

For an IT reader or a future partner, here is how the agent interface works today.

The envelope. /mcp speaks JSON-RPC 2.0. A client sends a POST with a JSON body containing jsonrpc: "2.0", an id, a method, and params. The methods are initialize (it returns the server’s name, version, and capabilities), ping, tools/list (it returns the seven tools and their input schemas), and tools/call (it runs one tool with name and arguments). Each call is independent. The server keeps no session, so any number of copies can answer requests. Results come back as result.content containing the tool’s JSON output. Errors use standard JSON-RPC error objects, and a request without a valid administrator key gets an HTTP 401 before any tool runs.

The seven tools.

Tool Inputs Returns
list_states optional status (open, partial, coming_soon) States from the registry, with survey system, meridians, and status
find_land any of place_key, state_code, county_name, plss_township, plss_range, plss_section, is_school_trust_section Matching places
get_place id or place_key One place with its survey fields and geometry summary
list_holdings optional place_id, source_id, sha256_hash Public holdings with their fingerprints and provenance
get_land_file id Land File metadata and its cited findings
get_findings optional land_file_id, place_id, review_status Source-cited claims with review status
reserve_ai_budget land_file_id, estimated_cost_usd Whether the reservation fits under the per-file and per-organization ceilings

The REST twin. Each tool has a matching /v1 route (see Appendix A), described in /v1/openapi.json, so the same functions can be called from any ordinary web client or a generated software development kit (SDK). Both doors read from the permanent Postgres database. While the move from D1 continues, they show the Postgres collection, not the live report data.

Status codes. 200 for success, 400 for a malformed request, 401 for a missing or wrong key, 404 for an unknown route or record, and 5xx if the database can’t be reached. Every response carries headers that tell search engines not to index it.

10.6 Security at a glance

Concern Today Planned
Who can open a private Land File Holder of its secret link key (fingerprint stored, never the key) Signed-in owner, plus explicit shares
Who can call the data API and agent interface Holder of the administrator key Partners and agents with limited, hashed, revocable keys
Who can change report text or switch AI off Holder of the admin key Same, with every action in the audit log
Where secrets live Cloudflare Worker secret storage only Same
What the database enforces Row-level security on every table (no ordinary access without policies); a source required for every finding Per-member policies in live traffic
What protects owner uploads Hidden GPS removed; private to the Land File; never on Story links Signed short-lived links
What protects document text Redaction rule demonstrated in the browser Server-side redaction before any model reads it
How problems are caught Staging first, independent review, smoke tests Plus automatic staging deploys and active audit review

Why This Choice. One door means one set of locks to get right and one audit trail, and that same door can later serve the website, partners, and AI agents equally. (ADR-0004.)

For IT: Under the Hood. The door is implemented in backend/src/api/v1_mcp.js (handleV1AndMcp()) and tested in backend/test/v1_mcp.test.mjs. The open routes are GET /v1, /v1/health, /v1/openapi.json, and CORS OPTIONS. Every other /v1 route, and GET or POST /mcp, requires Authorization: Bearer <administrator key>, compared in constant time, with a key of at least 32 characters. The administrator key and the backend’s database key are Worker secrets, set with npx wrangler secret put. Admin /api/v2/admin/* routes require their own admin bearer key. The planned design verifies Supabase Auth JWTs in the Worker and uses the public anon key together with the member’s JWT, so row-level security filters per member, while budget reservation stays server-only. The Layer 1 tables are users, orgs, org_memberships, api_keys (key_prefix, key_hash, scopes, monthly_limit_usd, expires_at, revoked_at), and audit_log (actor_user_id, actor_agent, action, target_type, target_id, cost_usd).

Status strip, Chapter 10

Capability Status
Single door: /v1, /mcp, /api/v2 [BUILT]
Administrator-key lock on data routes and /mcp [BUILT]
Secret link keys for private Land Files [BUILT]
Secrets only in Worker secret storage [BUILT]
Row-level security switched on in the schema [BUILT]
Member sign-in and per-member row filtering in live traffic [PLANNED]
Limited hashed keys for partners and agents; active audit log [PLANNED]

New terms: API, OpenAPI, MCP, JSON-RPC, administrator key, row-level security, audit log.

11 Spend Guardrails, Safety and Release Operations

In short. Automatic breakers keep AI spending within bounds and can stop it instantly. Every change goes to a hidden staging copy first, gets an independent check, and only then goes live, under firm rules about databases and secrets.

11.1 Spending breakers

AI calls cost money, so the system protects itself mechanically instead of asking a person to approve each call (ADR-0006). On today’s live report path, every AI call goes through one gate that runs these checks in order:

  1. The kill switch. One setting turns all AI calls off. It can be set as a Worker setting or flipped by an administrator, and when it’s off, every call is refused.
  2. The monthly spending guard. Once the month’s AI spending reaches its limit, calls are refused.
  3. An optional per-report cap. It’s available but switched off by the owner’s choice. The monthly guard stays on.
  4. Logging. Every call, and every refusal, is logged with its token counts and estimated cost.

The permanent database adds a fifth breaker, the budget reservation. Before a paid call, it reserves the estimated cost against two ceilings: $15 per Land File and $300 per month per organization by default. If either ceiling would be exceeded, the reservation is refused before any money is spent. This breaker is built and can be called through the API today. It will guard the live report path once the move to Postgres is complete and organization accounts exist.

Figure 11.1: Spending and safety breakers.

11.2 Other safety locks

11.3 How a change reaches the live site

  1. The build and infrastructure agent makes the change in the repository and runs the tests.
  2. It deploys to staging, the hidden twin. Today this is a manual deploy command. The automatic “deploy staging on every push” workflow is being restored.
  3. The independent reviewer checks it. A reviewer who didn’t build the change does a quick check and smoke test on staging: the main pages load, the changed feature works, and nothing private shows.
  4. The coordinator or the build agent promotes it to production. During the current testing period, the owner has given standing authorization to promote tested changes without asking each time (see Appendix H). Staging and the independent check still come first.
  5. The shared STATUS.md file is updated at the end of every task, so every agent and person can see the exact live state.
Figure 11.2: Release and promotion flow.

11.4 What the independent reviewer looks for

A smoke test is short, but it isn’t casual. For each change, the reviewer works through four questions.

  1. Does it load? The home page, the About pages, videos, the user manual, and the start page all open on staging.
  2. Does it do what it says? The changed feature behaves as described in the change note, including on a phone-sized screen.
  3. Did it break anything nearby? Pages that share code with the change still work, and the backend’s health check still reports the database reachable.
  4. Is anything exposed that shouldn’t be? No key value or private file appears on a changed page, and a data route without a key still answers “not authorized.”

If any answer is no, the change goes back to the build agent with a note, and the cycle starts again on staging. Production never sees it.

11.5 Hard rules for operators

Why This Choice. Mechanical breakers let the team move fast during testing without risking a runaway bill, and a staging copy plus an independent reviewer catch mistakes before the public sees them. (ADR-0006.)

For IT: Under the Hood. The gate is backend/src/lib/llm.js. The kill switch is the Worker variable LLM_ENABLED='off' or the settings row llm_enabled='off', set with POST /api/v2/admin/llm and the admin bearer key. Usage goes to the D1 table llm_usage (tokens and cents, per month, job, and property, ok flag, and a note for refusals). The per-report cap is LLM_REPORT_CAP_CENTS (unset). The writer switch is WRITER=off. The Postgres breaker is public.reserve_ai_budget(p_land_file_id uuid, p_estimated_cost_usd numeric), which atomically checks and increments land_files.budget_spent_usd and orgs.monthly_budget_spent_usd. It is exposed as POST /v1/budget/reserve and the MCP tool reserve_ai_budget. Tests run with npm test in backend/. Staging deploys with npx wrangler deploy --env dev and production with npx wrangler deploy. The CI workflow source is ci/staging.yml, being restored to .github/workflows/. Responses carry X-Robots-Tag: noindex, nofollow, and the backend’s /robots.txt disallows everything.

Status strip, Chapter 11

Capability Status
Kill switch, monthly guard, logging (live path) [BUILT]
Per-report cap [BUILT] (switched off by choice)
Postgres budget reservation [BUILT]; on the live path and per organization [PLANNED]
Staging-first release with an independent check [BUILT]
Automatic staging deploy on push [PENDING]
Production knowledge-base migrations via script [PENDING] (not yet run)

New terms: kill switch, circuit-breaker, staging, smoke test, promotion, rollback, STATUS.md.

Part IV: People, Agents and Key Decisions

12 Who Does What: Humans and Agents

In short. People make the decisions. Specialist reasoning models handle deep research and substantive writing, coordinator agents orchestrate workflows and mechanical verification, and the build agent owns the code, presentation layer, and canonical facts. None grades its own work.

This chapter describes roles. The current names of the agents and models filling those roles, which will change over time, are in Appendix H.

Figure 12.1: Who does what.

12.1 Build and governance roles

A typical project runs like this manual did. The owner asks the coordinator for something. The coordinator gathers the facts and sends a brief to the lead planner and the helpers. The helpers answer the lead planner, and the lead planner merges their answers into a plan. The work is done against that plan, and a second round of independent reviews checks it. The coordinator applies the fixes and delivers the result to the owner.

12.2 Models at work inside each Land File

Outside the report pipeline, the project’s video and outreach work also uses speech-to-text tools for recorded interviews and text-to-speech tools for narration. Those tools don’t touch Land Files.

12.3 People in the loop

Why This Choice. Clear roles make it obvious who is accountable for each step. Separating the builder from the reviewer, and using several different models for important questions, keeps mistakes from slipping through unchallenged. (Rule 7, ADR-0006.)

For IT: Under the Hood. Separation of duties is in AGENTS.md §1, and the release process in AGENTS.md §4. The writer model and its guards are in backend/src/report/writer.js and backend/src/lib/llm.js. Machine readings carry method: 'llm' and the model name. The Postgres audit_log has an actor_agent column, so agent actions can be attributed once the log is in active use.

Status strip, Chapter 12

Role Status
Owner, coordinator, build agent, reviewer, lead planner, helpers [BUILT] (in daily use)
Section writer, checker, survey-note reader [BUILT]
Volunteer transcription [PARTIAL]
Document reader; Reference Desk agent [PLANNED] (Reference Desk demonstration screen live)

New terms: coordinator, reviewer, lead planner, fan-out review.

13 Why We Made These Decisions

In short. Six recorded decisions shape the system. Each names the question faced, the choice made, why it matters, and what it costs.

The project records major choices as Architecture Decision Records (ADRs) in docs/decisions/. Here they are in plain language. Fuller digests are in Appendix E.

ADR-0001: A real map database as the system of record. Question: Where should the library’s permanent data live? Choice: Supabase Postgres with PostGIS (map geometry) and pgvector (similarity search), with the edge database (D1) kept only as a fast cache once the move is done. Why it matters: real geometry across six survey systems, row-by-row ownership for many tenants, and a standard database any IT team knows. Trade-off: two databases during the transition. Status: schema [BUILT]; move [PARTIAL].

ADR-0002: Landowners own their private material. Question: Who owns a member’s uploads when an organization sponsors them? Choice: the individual, always, by default. A sponsoring organization provides branding and a pooled AI budget, not automatic visibility into members’ files. The policy gives owners export, a named successor, and erasure, plus narrow redaction before any model reads a document. Why it matters: families will share papers only if the papers stay theirs. Trade-off: organizations see less by default. Status: secret-link privacy, photo cleaning, and Forget [BUILT]; member sign-in, self-service export and successor, and server-side text redaction [PLANNED].

ADR-0003: Public records are shared openly. Question: What may the public do with records the library fetches? Choice: CC BY 4.0 with attribution where source terms allow, rights flags checked for each source, and quarterly mirrors to Zenodo, the Internet Archive, and Oregon State University (OSU) Libraries, so the record survives independently of any one company. Why it matters: the public commons should be permanent and reusable. Trade-off: rights must be tracked source by source. Status: license and storage [BUILT]; public serving and mirrors [PLANNED].

ADR-0004: One door for everyone. Question: How should the website, partners, and AI agents reach the data? Choice: one service with a standard REST API (/v1) and an agent interface (/mcp), backed by the same queries, permissions, and cost controls. Why it matters: one set of locks, one audit trail, no back doors. Trade-off: everything has to be designed as an API first. Status: [BUILT], locked to administrators; partner and agent keys [PLANNED].

ADR-0005: Manuals as code. Question: How do we keep manuals true to the live site? Choice: Markdown in the repository, compiled by Pandoc into Word, Large Print Word, and PDF, and checked against the ledgers. Why it matters: one source, every format, no drift. Trade-off: writers work in plain text. Status: [BUILT] for the Quick Start and Oregon guides; this manual uses the same method.

ADR-0006: Mechanical breakers instead of human gates. Question: How do we move fast without runaway costs or self-graded work? Choice: agents act directly in staging and tests, spending is guarded by automatic breakers, and an independent checker plus database rules verify every claim. Why it matters: speed with safety. Trade-off: the breakers must be set correctly. Status: kill switch and monthly guard [BUILT]; Postgres reservation [BUILT]; on the live path and per organization [PLANNED].

13.1 Decisions we may revisit

A recorded decision isn’t a promise never to change course. It’s a promise to change course openly. Three decisions are the likeliest to be revisited as the system grows:

Any change of this kind gets a new numbered ADR that explains what changed and why. The old one stays on file.

Why This Choice. Writing decisions down, with the reasons and the trade-offs, lets a new board member, partner, or engineer see why the system is shaped as it is, and lets the team revisit a decision honestly when circumstances change.

For IT: Under the Hood. The ADR files are docs/decisions/0001-postgres-postgis-over-d1.md, 0002-individual-ownership-class-m-files.md, 0003-cc-by-class-p-public-holdings.md, 0004-single-openapi-and-mcp-door.md, 0005-markdown-to-pandoc-docs.md, and 0006-mechanical-spend-circuit-breakers.md. The rights flags in source_registry are right_retrieve, right_retain, right_reproduce, right_publish, and right_paid_use.

Status strip, Chapter 13

Decision Status
ADR-0001 Postgres system of record [PARTIAL]
ADR-0002 Members own private material [PARTIAL]
ADR-0003 Open public records [PARTIAL]
ADR-0004 One door [BUILT] (administrators only)
ADR-0005 Manuals as code [BUILT]
ADR-0006 Mechanical breakers [PARTIAL]

New terms: ADR, system of record, rights flags.

Part V: How the Technology Will Change Over Time

14 The Road Ahead

In short. Here is where the technology is headed, in three phases. Dates are targets, not promises. Software and AI change quickly, and the plans will change with them.

14.1 An honest premise

No one can predict the future of software or AI with certainty. What follows is our best current plan. The first phase is mostly finishing work already under way. The later phases depend on funding, partners, volunteers, and how the technology itself changes. Partners should build on what Chapters 1–13 mark as [BUILT] and treat everything here as direction, not commitment.

Figure 14.1: The road ahead.

14.2 Phase 1: Near term (finishing the core and opening member accounts)

14.3 Phase 2: Next year (partners, the Reference Desk, and developer access)

14.4 Phase 3: Longer term (national scale and changing AI)

14.5 What a partner can build on today

For an organization considering working with America’s School Trust Library, here is the practical line between today and tomorrow.

We’d rather under-promise and deliver. If any of the planned items matters to your plans, talk to us. Partners help decide what comes first.

14.6 How we’ll handle changing AI models

AI models will keep getting faster, cheaper, and more capable, and old ones will be retired. The architecture treats them as replaceable workers on Layer 6. When a better model arrives, we can swap the writer, a reader, or the Reference Desk model behind the same interfaces. What stays fixed is the frame around them: evidence cards with sources, the database rule that refuses unsourced findings, the checker’s rules, editor-locked history, and the people who verify readings. That frame is what makes a Land File trustworthy, whichever model writes the sentences.

14.7 Risks, and how we’d respond

A candid roadmap names its risks:

Why This Choice. Building the trust frame first, and treating models as replaceable, means the library can take advantage of better AI without having to re-earn its readers’ trust each time.

For IT: Under the Hood. The roadmap items map to existing scaffolding. Postgres tables and functions are in supabase/migrations/0001_astl_foundation.sql. Org budgets are orgs.monthly_budget_limit_usd. Limited keys are api_keys. Branding is orgs.custom_domain and branding_config. Search by meaning will use findings.embedding (pgvector). The SDK can be generated from /v1/openapi.json. The staging workflow is ci/staging.yml. None of these are live features until the ledger says so.

Status strip, Chapter 14

Item Status
Postgres and storage move [PARTIAL]
Automatic staging deploys [PENDING]
Member sign-in, public Class P access, Washington [PLANNED] (Phase 1 targets)
North Carolina, document reader, Reference Desk, partner portals, SDK and agent keys, mirrors [PLANNED] (Phase 2 targets)
All states, national scale, search by meaning [PLANNED] (Phase 3 direction)

Appendix A: Route and Interface Directory

A.1 Web routes (yourlandhistory-web).

Route Purpose Status
/ Home: the state-first front door [BUILT]
/start, /find, /state, /state/confirm, /lots, /map Find and confirm land; multi-lot tray [BUILT]
/land-file, /my-land, /examples Land File entry, the owner’s land, worked examples [BUILT]
/oregon, /utah, /coverage, /catalog State pages, coverage by county, the catalog of record types [BUILT]
/books-videos, /books, /videos, /guides/, /howto, /manual Books, videos, state guides, quick start, user manual [BUILT]
/school-sections/ The School Sections showcase [BUILT]
/about, /about/technology, /how-it-works, /plans, /privacy, /terms, /text-size About pages (including this manual) and policy pages [BUILT]
/argon/* Edition 2.0 interactive screens, including the Add Papers demonstration [BUILT]
/sign-in Sign-in screen for secret-key access [BUILT]; member accounts through Supabase Auth [PLANNED]
/api/* Passed through to the backend over the service binding [BUILT]

A.2 /v1 (OpenAPI 3.1) on parcel-v2-backend.

Method and route Purpose Main parameters Access
GET /v1 API index none Open
GET /v1/health Service and database connectivity none Open
GET /v1/openapi.json The OpenAPI 3.1 contract none Open
GET /v1/states State registry status Administrator key
GET /v1/states/:state One state two-letter code Administrator key
GET /v1/places List places state, county, PLSS fields Administrator key
POST /v1/places/find Find places JSON body like find_land Administrator key
GET /v1/places/:id One place UUID Administrator key
GET /v1/holdings Public holdings with provenance place_id, source_id, sha256_hash Administrator key
GET /v1/land-files Land File list none Administrator key
GET /v1/land-files/:id One Land File, with findings UUID Administrator key
GET /v1/findings Source-cited claims land_file_id, place_id, review_status Administrator key
POST /v1/budget/reserve Budget reservation land_file_id, estimated_cost_usd Administrator key

A.3 /mcp (JSON-RPC 2.0, stateless, administrator key). The methods are initialize, ping, tools/list, and tools/call. The tools are list_states, find_land, get_place, list_holdings, get_land_file, get_findings, and reserve_ai_budget, with their inputs as in Chapter 10. An example call:

POST /mcp
Authorization: Bearer <administrator key>
Content-Type: application/json

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"list_states","arguments":{"status":"open"}}}

A.4 /api/v2 (legacy routes used by the website).

Route Purpose Access
GET /api/v2/health Health Open
GET /api/v2/registry, /catalog, /coverage Source registry, record-type catalog, county coverage Open
GET /api/v2/holdings Holdings index Open
/api/v2/lookup/address, /taxlot, /lots, /town Find land Open
POST /api/v2/property; GET /api/v2/property/:id Build a report; read a report Open; private reports need their secret link key
/api/v2/property/:id/uploads List, add, or remove the owner’s uploads (images today) Secret link key
POST /api/v2/property/:id/forget Erase a Land File Secret link key
GET /api/v2/open-questions Open questions Open
GET /api/v2/kb/tribal-offices, /kb/zybach Office contacts; cited scholarship index Open
GET /api/v2/diag/reach Network reachability check Open
/api/v2/admin/write, /section-text, /holdings, /llm, /readings, /evidence, /machine-read, /survey-dates Administration Admin key

Appendix B: Database Reference

B.1 Supabase Postgres (astl-core). All 16 tables have row-level security switched on. FORCE ROW LEVEL SECURITY, which applies the rules even to the table’s owner, is set on land_files, papers, and findings. A table with row-level security and no policy refuses all ordinary access, so until member sign-in adds per-member policies, only the backend’s server-only key can read or write these tables. Primary keys are time-ordered UUIDs from uuidv7(), except where noted.

Layer Table Purpose Key columns
1 orgs Sponsoring organizations slug, name, custom_domain, branding_config, org_owns_member_files (default false), monthly_budget_limit_usd ($300 default), monthly_budget_spent_usd
1 users Members email, display_name, successor_name, successor_email
1 org_memberships Who belongs to which organization org_id → orgs, user_id → users, role
1 api_keys Limited keys (hashed) org_id, user_id, key_prefix, key_hash, scopes, monthly_limit_usd, monthly_spent_usd, expires_at, revoked_at
1 audit_log Append-only record of actions org_id, actor_user_id, actor_agent, action, target_type, target_id, cost_usd, metadata
0/4 states_registry States and survey systems (key: state_code) state_name, status, primary_survey_system, meridian_summary, capabilities, bbox, last_verified_date
0/4 source_registry Sources and their rights state_code, county_fips, office_name, source_url, allows_owner_name_search, right_retrieve, right_retain, right_reproduce, right_publish, right_paid_use, terms_notes, last_checked_at, parser_version
2 places Parcels and survey units place_key, state_code, county_name, survey_system, PLSS fields, is_school_trust_section, external_identifiers, geom (PostGIS), geom_date_valid_from/_to
2 role_assertions People as dated roles land_file_id, place_id, holding_id, paper_id, person_name_as_written, role_type, assertion_date, living_or_presumed_dead
3/5 land_files Land Files org_id, owner_user_id, secret_claim_token_hash, title, state_code, primary_place_id, data_class, encryption_key_ref, budget_limit_usd ($15 default), budget_spent_usd, deleted_at
3/5 land_file_places Places in a Land File (composite key) land_file_id, place_id, relationship_note
3 holdings Public and donated records data_class, source_id, place_id, r2_object_key, sha256_hash, mime_type, title, document_date, extracted_text, license, fetched_at
3 papers Member material land_file_id, org_id, owner_user_id, data_class, origin, r2_object_key, sha256_hash, original_filename, mime_type, pii_redacted, exif_stripped, extracted_text, reader_model, reader_prompt_version, rights_holder
4 findings Source-cited claims land_file_id, place_id, claim_text, holding_id, paper_id, locator, supporting_quote, conflicts_with_finding_id, produced_by_model, prompt_version, review_status, verified_by, verified_at, embedding; constraint chk_finding_has_source
5 research_plan_steps Steps of a research plan step_number, step_kind, target_office, legal_description_scope, estimated_fee_usd, user_consented, status, instructions_or_draft_letter
5 story_versions Published editions of a story edition_number, reading_level, markdown_body, change_notes, writer_model, checker_model, source_manifest_hashes, is_published_class_d

Functions. uuidv7() generates time-ordered keys. reserve_ai_budget(p_land_file_id, p_estimated_cost_usd) atomically checks and increments the per-file and per-organization spending.

B.2 Where the live data is today.

Data Lives in
Live reports: properties, lots and trays, evidence cards, readings, written sections, uploads metadata, report link-key fingerprints, settings, AI usage Cloudflare D1 parcel-v2-db (migrations 0001–0012; knowledge-base 0019–0022 on staging only)
Fetched records and owner uploads (file contents) The backend’s content-addressed store
Foundation schema, state and source registries, seed data Supabase Postgres astl-core
Permanent class storage R2 astl-class-p-public, astl-class-m-private, astl-class-d-donated (connected; being filled)

Appendix C: State Coverage and Source Inventory

C.1 Registered states (states_registry).

State Status Survey system
Oregon Open PLSS (Willamette Meridian) and Donation Land Claims
Utah Open PLSS (Salt Lake Meridian)
Washington Coming (target early 2027) PLSS (Willamette Meridian) and Donation Land Claims
Idaho Registered, coming later PLSS (Boise Meridian)
California Registered, coming later PLSS (Mount Diablo and others); Spanish and Mexican grants
New Mexico Registered, coming later PLSS (New Mexico Principal Meridian); Spanish and Mexican grants
Illinois Registered, coming later PLSS (2nd and 3rd Principal Meridians)
Texas Registered, coming later Texas abstracts and sections
Virginia Registered, coming later Metes and bounds
Hawaii Registered, coming later Ahupuaʻa (Great Māhele)

North Carolina is listed in the source ledger with a target of mid-2027.

C.2 National sources in the source ledger. BLM CadNSDI and GLO records are fetched automatically, as are USGS National Map products, USDA NRCS soils, and the Royce/Kappler treaty cessions. NOAA NCEI climate data and US Census data are used through the county fetcher. These entries record host, coverage, refresh interval, storage class, and the date each was checked.

C.3 Fetchers and adapters. Fetchers: glo, blmor, cadnsdi, county, polkmap, sda, sgmc, dogami, gnis, tnm, royce, finder. County adapters: arcgis (generic), polk, benton, owrd (statewide outlines in the 13 Oregon counties that allowed public viewing on October 12, 2026).

C.4 Source modes. automatic, follow_link, ask_office, found_not_wired, not_verified.

Appendix D: Operations Runbook

This runbook is for operators. All commands assume a clone of dave-schooltrustlands/yourlandhistory and Wrangler authenticated with a Cloudflare token that is allowed to deploy Workers. Never paste a key value into a command line that is logged, a ticket, or a chat.

D.1 Everyday change

  1. Test (from backend/). cd backend && npm test, then cd .. to return to the repository root.
  2. Build docs (from the repository root), if content changed. node scripts/build-docs.mjs. The outputs land in dist/docs/.
  3. Deploy the backend to staging (from backend/). npx wrangler deploy --env dev.
  4. Deploy the website to staging (from web/). npx wrangler deploy --env dev. The web build step regenerates the book pages first.
  5. Smoke test staging. The test passes when all of these hold:
    • the staging home page, /about, /videos/, /manual, and /start return 200 (after redirects);
    • the changed feature works as described;
    • GET /v1/health on the staging backend reports the database reachable;
    • a /v1 data route without a key returns 401;
    • no private material or key appears on any changed page.
  6. Independent review. The independent reviewer signs off on staging.
  7. Promote to production. Run npx wrangler deploy (no --env) in backend/ and/or web/. Under the testing-mode authorization (Appendix H), no further approval is needed.
  8. Verify production. Repeat the step 5 checks on yourlandhistory.org and the production backend.
  9. Record. Update and commit STATUS.md with the new Worker version IDs.

D.2 Database changes

D.3 Secrets

Set a secret with npx wrangler secret put NAME (add --env dev for staging) and type the value at the prompt. List secret names with npx wrangler secret list; values are never shown. To rotate a key, set the new value, verify, then revoke the old one wherever it was issued.

D.4 Emergency stop for AI spending

Either set the Worker variable LLM_ENABLED to off and redeploy, or switch it off at runtime (send true to switch it back on):

curl -X POST https://<backend host>/api/v2/admin/llm \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'

GET /api/v2/admin/llm, with the same header, reports the switch and the month’s spending. To stop only report writing, set WRITER to off.

D.5 Rollback and recovery

Appendix E: Decision Digests (ADRs 0001–0006)

E.1 ADR-0001: Supabase Postgres + PostGIS + pgvector over Cloudflare D1 (docs/decisions/0001-postgres-postgis-over-d1.md)

E.2 ADR-0002: Individual ownership of Class M files (docs/decisions/0002-individual-ownership-class-m-files.md)

E.3 ADR-0003: CC BY 4.0 for Class P public holdings (docs/decisions/0003-cc-by-class-p-public-holdings.md)

E.4 ADR-0004: A single OpenAPI and MCP service door (docs/decisions/0004-single-openapi-and-mcp-door.md)

E.5 ADR-0005: Docs as code, Markdown compiled by Pandoc (docs/decisions/0005-markdown-to-pandoc-docs.md)

E.6 ADR-0006: Mechanical spend circuit-breakers over human gates (docs/decisions/0006-mechanical-spend-circuit-breakers.md)

Appendix F: Worked Examples

These examples follow the system’s real formats and data models, drawn from the Sullivan tree farm near Pedee (T9S R6W Sec 33, Polk County, OR, 386.4 acres) and pipeline test cases.

F.1 A bearing tree, from field note to verified reading

Raw field note (transcribed): “Set post for cor. to secs. … from which a fir 24 ins dia bears N 45 E 112 lks dist.”

Machine reading (structured):

{ "corner": "C4", "species": "fir", "diameter_in": 24,
  "bearing": "N 45 E", "distance_links": 112, "distance_feet": 74,
  "method": "llm", "verification": "needs-checking" }

As shown: “Fir, 24 inches, N 45° E, 112 links (about 74 feet). Reading needs checking.”

Person verification. A volunteer opens the scanned page beside the reading. The volunteer reads 112 links and confirms it, and the reading becomes "method": "person", person-verified. Had the volunteer read 142 links, the person’s reading would be stored and used, and the machine reading would stay in the machine list, still labeled.

F.2 A sentence the checker drops

Cards in the section: k1, a county history describing a wagon road through the valley in 1852, with scope region; and k2, a township plat (1855) showing a trail along a creek in the section, with scope region.

Writer draft: “In 1852 a wagon road crossed this land [k1].”

Checker. Every card the sentence cites is about the region, not this land, and the sentence says “this land.” Dropped: places a regional or nearby record on this land.

A sentence that passes: “A wagon road ran through the valley by 1852 [k1].” It is regional and says so.

When the original would pass. If a card were an 1852 field note or plat showing the road crossing this parcel’s own boundaries (scope this-land), the original sentence would pass, and the year 1852 would have to appear on that card.

F.3 An upload and the redaction rule

Today (an image). An owner uploads a phone picture of the first page of their forest management plan, captioned “2004 management plan, page 1.” The file carries the GPS location where it was taken. The backend strips it, keeps the date taken, stores the cleaned image linked only to that Land File, and reports how many bytes of hidden data were removed. The image appears only to someone holding that Land File’s secret link key. It never appears on the Story link.

The planned document path (demonstrated on the Add Papers screen). A scanned tax statement contains a tax account number, a Social Security number, and a bank routing number. After redaction, the text a model would see reads:

Account: 12345 (kept)    SSN: [REDACTED]    Routing: [REDACTED]

The tax account number stays because the history needs it. The owner can still see their original page.

Appendix G: Glossary and Component Index

Plain term Technical term Chapter
Small program at the network edge Cloudflare Worker 8
Private line between two Workers Service binding 8
Hidden test copy of the site Staging (-dev) 8, 11
Working report database Cloudflare D1 8
Permanent system of record Supabase Postgres + PostGIS 8
Digital storage room R2 bucket 9
Digital fingerprint of a file SHA-256 content hash 5
Where a record came from Provenance 5
Secret key that opens a private Land File Report link key (hashed) 9
Database rules that limit rows to their owner Row-level security (RLS) 10
Spending switch that trips before money is spent Transactional circuit-breaker 11
Master lists of what is live capabilities_ledger.json, states_config.json 1
Machine-readable API menu OpenAPI 3.1 10
Agent interface Model Context Protocol (MCP), JSON-RPC 2.0 10
Recorded design decision Architecture Decision Record (ADR) 13
Surveyors’ units Chain (66 feet); link (7.92 inches) 3
Trees marking a survey corner Bearing (witness) trees 5
Anything an owner adds about their land (plans, deeds, maps, letters, stories, photographs) Owner upload; Class M material 1, 9
One way of showing the same knowledge (today’s standard report; planned themed views and formats) Presentation (Layer 7) 1, 2, 7, 14

Component index.

Appendix H: Current Team Roster and Operating Mode (as of October 15, 2026)

Role (Chapter 12) Currently filled by Operational Scope & Authority
Owner and decision-maker Dave Sullivan Strategic direction, legal/business posture, sole sign-off on sent communications, direct voice drafting.
Chief of Staff & Coordinator Chaney (Grok Bot) Owner’s single contact; docket triage, un-spun packet preparation, fan-out orchestration, mechanical verification, draft staging. Zero substantive prose or research.
Specialist Bot Crew Herald, Advocate, Librarian, Social, Bunny Writer, Masthead, Sullishak Domain docket coordination, source intake, mechanical citation checks, draft staging in review queues.
Build, Presentation & Facts Engine Antigravity (Google’s agent environment) 100% of code, edge APIs, database schemas, presentation-layer rendering across all surfaces (Web, Video, Print), style systems, and canonical fact registry.
Independent reviewer Builder (formerly build-and-deploy) Staging review, automated smoke testing, and pre-production quality gatekeeper. Independent of build agent.
Primary Research Farm ChatGPT 6 Astra, Claude Fable, Argon (Gemini 4) Deep primary records, archival wisdom, cross-document reconciliation. Fable is restricted: never route gating, security, or procedural tasks to Fable.
Primary Writing Farm Claude Opus 5.5, Argon (Gemini 4) Outbound prose, persuasive advocacy, book chapters, technical manuals. Opus 5.5 routes through the existing Farm Fable helper.
Auxiliary & Red-Team Farm ChatGPT (General), Grok Simple tasks get 1 model; most tasks get best model or fan-out with merged results; adversarial cross-checks.
Product Report Pipeline (Layer 6) Internal pipeline models Automated section writer and survey-note reader inside each Land File (named in backend/src/report/writer.js).

Model Routing Guide & Team Rules. Detailed routing policies, prompt boundaries, and fan-out procedures are maintained canonically in docs/MODEL_ROUTING_GUIDE.md and ledger/team_roster.json in the primary repository (dave-schooltrustlands/yourlandhistory).

Testing-mode authorization. On October 15, 2026, the owner gave standing authorization, for the current testing period, for the coordinator and the build agent to promote tested changes to production without asking each time. Staging deployment and an independent smoke test still come first. The owner can revoke the authorization at any time. It is recorded in AGENTS.md.

Appendix I: Questions Readers Often Ask

For landowners, historians, and board members

Is a Land File a legal document? No. It’s a historical research account with sources. For boundaries or title, consult a licensed surveyor, a title company, or an attorney.

Can the AI make things up? The writer can draft a wrong sentence, which is why the checker exists. A sentence must cite a card from its own section, can’t contain a number its cards don’t have, and can’t place a regional record on your land. If it fails, it’s dropped. The most sensitive history is written by people and locked.

What can I add to my Land File? Anything you have about your land: management or farm plans, reports, deeds, surveys, maps, letters, notes about prior owners, family stories, and photographs. Today the upload takes images, so photograph or scan the pages. Other file types are planned.

Will the Land File always look like this? Today it is one standard report. The same checked knowledge is built to be presented in other ways later, such as land-focused or people-focused views, and as a printed book, a website, or a video (planned).

Who can see my Land File? Only someone with its secret link key. The public samples are the only exceptions. If you share a Story link, it hides your name and leaves out your photographs.

Will my uploads train an AI? No. Private material goes only to paid AI services whose terms forbid training on what we send.

Can I delete everything? Yes. You can delete any upload, or ask the system to forget a whole Land File. Self-service export and account-wide “Forget me” arrive with member sign-in.

Why only Oregon and Utah? Each state’s records live in different places under different rules. A state opens only when its sources are wired, checked, and politely reachable. Washington is the next target.

How is Native history handled? As factual history, from treaties, survey records, and scholarship, written or reviewed by people and locked so the AI writer can’t alter it. Tribal cultural-resource and historic-preservation offices are listed with checked contact details.

For IT professionals

Where is the source of truth today? For live reports, D1 (parcel-v2-db). For the permanent schema, registries, and future collection, Postgres (astl-core). Appendix B lists where each kind of data lives.

How are secrets handled? As Cloudflare Worker secrets, set with wrangler secret put. They are never in Git, never in logs, and never in this manual.

What stops runaway AI spending? On the live path: the kill switch, the monthly guard, and per-call logging. In Postgres: transactional per-file and per-organization reservations, ready for the live path after the move.

How do I get API access? Today, only with an administrator key, issued for supervised collaborations. Limited self-service keys are planned (Chapter 14).

Is the code open? The repository is private during testing. The About page records the project’s commitment to an open architecture, and the decision records in this manual describe the design in full.

How do I recover from a bad deploy? wrangler rollback to the previous Worker version. Then fix forward through staging (Appendix D).

Appendix J: Keeping This Manual Current

This manual is meant to stay true, so its upkeep is part of the release process.

Version history

Version Date Notes
1.2 October 15, 2026 Team roles and model routing updated: coordinator and specialist crew coordinate only; research farm adds ChatGPT 6 Astra alongside Fable and Argon (gating/security guardrail on Fable); writing farm with Opus 5.5 (via Farm Fable) and Argon; Antigravity presentation ownership across web, video, and audience-specific print formats; Builder independent review gate. Removed owner property privacy restrictions; real owner examples restored.
1.1 October 15, 2026 Owner uploads described as anything an owner has about the land (plans, reports, deeds, surveys, maps, letters, prior owners, family stories, photographs), with today’s image-only upload kept distinct from planned file types. Presentation made a theme: today’s standard report as the first of many planned views and formats. Figure 1.1 redrawn; Figures 9.1, 9.2 and 14.1 updated.
1.0 October 15, 2026 First edition. Outline from a four-model planning round; draft checked against the code; fifty numbered review fixes applied.

Colophon

This manual was written in Markdown. Its fifteen diagrams were drawn as Graphviz source files and rendered to SVG and PNG. It was compiled with Pandoc into Word, Large Print Word, and HTML, and the PDF was printed from the HTML, following the same docs-as-code approach the system uses for its own manuals (ADR-0005). Its outline came from a planning round across four AI models led by the lead planner. The draft was checked against the code and reviewed in a second independent round, and fifty numbered fixes were applied before publication.