Colophon · What shipped
Every substantive change to the observatory: new coverage, new artifacts, corrections to the record.
semantic_search now ranks every record three ways at once, by the words in its text, by its title and by meaning, and fuses the three lists. An ordinance, case or parcel number, a subdivision or a firm ranks its record first, and a plain question still finds its record by meaning. On a known-item benchmark of 222 held-out questions, mean reciprocal rank rose from 0.683 to 0.887 against the previous ranking over the same complete index; for identifiers it rose from 0.326 to 0.840. The search index now holds every record in the corpus. Every response states its scope (the query names a covered place, a place outside coverage, or no place) and its evidence (strong when a top record contains the query's terms or closely resembles it). Each hit's matched is now a list (title, text, meaning) where it was a single string. weak_match is deprecated: this version derives it from scope and evidence, and MCP server 2.4.0 removes it. Session identifiers in the invocation log are now stored hashed. MCP server 2.3.0.
Every covered county now has a map: 25 jurisdictions across Lake, Orange, Osceola, Polk and Seminole, projected from Census TIGER boundaries, with the worst deviation from the source at 0.62 rendered pixels. The list of places comes from the corpus itself, so a map cannot cover a different set of places than the publication does. Unincorporated Lake County is the county minus its cities, which is what it is. City names sit at each jurisdiction's pole of inaccessibility, inside its own boundary even where a city is a crescent around a lake or has an enclave it grew around; 29 of 29 anchors land inside their jurisdiction. Frames widen to show the neighbouring counties and lakes, so the map answers "where is this" as well as "what is covered".
A new MCP tool finds the routes between two entities, meetings or named patterns. Three hops from any entity reach 94% of the corpus, so route length says little. Routes are ranked instead by the widest node they pass through: a route through a node with eighteen links holds for every pair that node gathers, so the narrowest waypoint is what makes a route specific. Every route reports its provenance (a curated claim on a dossier, or co-occurrence in a minuted record), the widest node and its degree, hop count, and how many equally short routes exist, so a caller can re-rank on its own terms. Each response states its coverage: 78 of 376 meeting records carry an entity link. Routes are co-occurrence; order and cause stay open. MCP server 2.2.0.
People who appear in the record only as public-comment speakers, commenters or neighbouring owners are now "a resident", and their home addresses "[address withheld]", across every reading and meeting record. Every finding survives: speaker counts, vote tallies, what was said and the positions taken are unchanged. Public officials, licensed professionals on the record, applicants and their teams, HOA officers speaking in office, citizen advisors named in binding conditions, and the addresses of the parcels under decision stay named. Those are the accountability record this observatory publishes. Verified against production: 594 of 594 contract URLs served.
Orlando, Kissimmee, Mount Dora, Eustis, Tavares and Montverde join the corpus: 83 harvested documents, six place dossiers, 25 cities in all. **Correction.** Reading Chapter 2025-190 directly showed the corpus had the direction of SB 180's window wrong. Section 28(1) prohibits adopting a more restrictive or burdensome regulation before October 1, 2027 and voids it from the start, so adopting inside the window creates exposure rather than grandfathering a code. Thirty records were corrected, and three mechanics the corpus had missed are now published: s. 252.422, which re-arms for a year after every hurricane landfall within 100 miles, the private-application safe harbor, and the 14-day cure. **Withdrawn.** The signal score is gone. It was typed into frontmatter, and no code computed the composite the published schema described. Confidence and horizon stay, labelled as the judgments they are. The site now serves from Cloudflare as static files: the home page dropped from 163 KB to 26 KB. Empty and weak search results now carry what the corpus covers. MCP server 2.1.0.
The corridor's binding constraint moves from roads to water. Five new named patterns (The Water Gate, The Surface Migration, Board Abolition Over Board Override, The Privatized-Governance Reckoning, The Shared-Counsel Substrate), the compound brief The Water Line, three new readings, five new entities and four new watches. Sanford and Winter Springs records arrive, the first through AV Capture All. **Correction.** SB 180's sunset is June 30, 2028, not June 2026: the bill that would have moved it died on March 13, 2026. The misread watch stays published with a corrected successor beside it. **MCP server 2.0.** Every tool carries annotations (read-only, closed-world), so clients can call it without a confirmation prompt. The server answers resources and prompts, returns the correct status codes for unsupported methods and protocol versions, and accepts browser agents over CORS.
Ten corpus releases in two days. Place dossiers for Winter Park and Mascotte; the first Lake County Board of County Commissioners reading; new readings for Apopka, Winter Garden and the Lake County Planning and Zoning Board; Tara Tedrow, Jimmy Crawford, McGregor Love and Crittenden Howey join the entity index; City-County Jurisdictional Friction becomes the fifteenth named pattern; and The Defense Coalesces and The Beltway Doppelganger join the briefs. Communities are a new record type, starting with Cedar Landings in Leesburg: a residential community read inside the regulatory field that shaped it. Underneath, list pages and machine surfaces now load record metadata without full text, which cut each list's cache footprint by about 85% and let the corpus keep growing past the size that had stopped the build.
The observatory ships a Citation Scaffold, Mirror Tools, Resolution Bridge, Phase-12 outputSchemas, and a public Server Card, every surface engineered to be observable to agents. Every surface except one: how agents observe back. v0.15.0 closes the symmetry. The agent surface now writes through an append-only invocation log, accepts active feedback through a new MCP tool, and publishes the reading at `/agent-observatory`. Civic systems get read through their records; the agent surface gets read through its invocation log. ### What ships - **Passive telemetry**: every `tools/call` against `/mcp` and `/api/mcp/{tool}` writes one row to `zoning_signal_mcp_invocations` with timestamp, transport, tool name, sanitized arguments (4KB capped), result status, duration, derived agent family, and a salt-hashed source identifier. Fire-and-forget via Next.js `after()` so telemetry never blocks responses. JSON-RPC batches log one row per item; protocol errors and tool errors both surface in the result_status enum. - **Active feedback**: the new `submit_agent_feedback` MCP tool accepts five categories: gap, error, praise, suggestion, citation_request. The submission auto-attaches the prior ten invocations from the same MCP-Session-Id, so operators read every submission annotated with the call sequence that produced it. No agent-side coordination required. - **Public reflection at /agent-observatory**: Decoder-voice surface rendering the trailing-30-day reading: top tools, agent-family breakdown, most-read slugs, success rates, the operator-curated quote subset. Empty state speaks directly to agents reading the page. ### The privacy posture Raw IP addresses are never stored. The `ip_hash` column carries a SHA-256 digest of a server-side salt concatenated with the source IP, so rate-shape analytics distinguish actors without ever persisting identity. The two new tables enable RLS with no public SELECT policy; every read flows through six SECURITY DEFINER aggregation RPCs that return only aggregate-safe shapes. Per-row data never leaves the database. The active feedback table mirrors the same posture: agents (and operators driving them) may submit; only the operator-curated `surfaced_publicly` subset reaches the public page. ### Why this surface matters The observatory was already symmetric to its subjects on every other axis: cities, corridors, meetings, patterns, entities, watches, briefs all received first-class citable artifacts with structured schema. The agent surface was the asymmetry. Without it, the most load-bearing signal for product evolution (ground-truth on agent behavior) silently left the building every request, then aged out of ephemeral Vercel logs within hours. With it, the corpus that generates the next `What agents asked for in May` brief is the corpus of every agent reading the field. --- ### Architecture The Mirror ships three reinforcing surfaces threading one schema spine. **Methodology + privacy posture in code.** Three migrations: `supabase/migrations/013_zoning_signal_mcp_invocations.sql` (bigserial event log, five indexes including a partial on `result_status <> 'ok'`, RLS-enabled with intentionally no SELECT policy), `supabase/migrations/014_zoning_signal_agent_feedback.sql` (uuid PK so feedback IDs travel back to the agent in the tool result envelope, `attached_invocation_ids` as `bigint[]` for the auto-attach trace, `surfaced_publicly` flag for operator curation), `supabase/migrations/015_zoning_signal_mcp_aggregation_rpcs.sql` (six SECURITY DEFINER functions returning aggregate-only shapes, granted EXECUTE to anon + authenticated). **Observability lib** at `src/lib/observability/`: `agent-family.ts` (bounded ten-family enum classified from User-Agent; SDK matchers ordered before surface-bot matchers so a programmatic `@anthropic-ai/sdk` request classifies as `anthropic-sdk` not `claude`), `ip-hash.ts` (sha256 over salt+IP via `MCP_LOG_IP_SALT`; falls back to a literal `unsalted` sentinel when the env var is missing so aggregations never break), `log-invocation.ts` (the fire-and-forget writer; never throws; size-caps args to 4KB; `recentInvocationIds(session_id, 10)` is the trace-attach helper called from the feedback tool). **MCP layer.** Eighteen tools live; `submit_agent_feedback` is the first MCP tool to read request headers (`MCP-Session-Id`, `User-Agent`), enabled by a new `ToolCallContext` surface threaded through `callTool(name, args, ctx?)`. `server.json` 1.8.0 → 1.9.0; `MCP_SERVER_INFO.version` bubbles to every `initialize` response so clients polling capability deltas see the bump. The Streamable HTTP transport at `/mcp` adds per-method telemetry spans (initialize, tools/list, tools/call, ping); batched JSON-RPC requests log one span per item. **Named patterns instantiated.** **Mutual Observation Loop** (passive telemetry + active feedback + public reflection composed across one schema source, the invocation row). **Auto-Attached Trace primitive** (feedback submissions arrive annotated with their own pre-history; operators triage with the call sequence already in context). **Single-Source Triple-Surface compound** (one schema, three readings: ground-truth log → operator inbox → public Decoder-voice page; the public page is a query, not a separate dataset). **Disclosure surfaces.** `llms.txt` adds Step 8 (send feedback) plus a Mutual Observation section; `/method` adds "The mirror" between provenance and implication. Honest disclosure shipped alongside the capability. The observatory tells agents it is reading them at the same surface where it asks them to call its tools. **Reusable across any Intelligence System MainThread builds going forward.** The Mutual Observation Loop is domain-agnostic. Any MCP surface (civic regulatory motion, aircraft-parts distribution, biosurveillance, technical literature, talent intelligence) can instantiate the same three-surface stack against its own schema spine. The craft transfers; the corpus is the only thing that changes.
The lens enum was the agent-facing API surface for cognitive-position routing, and it had drifted from canon. The manifest declared one set of seven stakeholder lenses; the shipped TypeScript declared a different set; the rendered `/method` page advertised the second; the corpus authored MDX against the second; the voice-overlays for the first set sat fully authored but unused. v0.14.0 closes the gap. The new canonical roster: **synthesis · developer · investor · broker · attorney · business · resident · civic-leader**. Eight total projections. Seven stakeholder lenses plus synthesis. The count is preserved; the contents come back to canon. ### Why this drift mattered The Lens enum is fundamentally an MCP API. When an AI agent calls `describe_place(slug, lens=X)`, the enum value is how the agent says *"the user I'm answering for sits at cognitive position X."* The chip row on the rendered web surface is the same enum exposed to humans. **The lens-naming decision is therefore an AI-agent API surface decision**, and once shipped, slugs are citation-stable. Agents pin to them. The shipped roster (`developer`, `investor`, `resident`, `business`, `civic`, `infrastructure`, `policy`) failed two structural tests at the lens level: - **`infrastructure`**: `infrastructure_unlocks` is a *signal type* in the manifest, not a cognitive position. Infrastructure is what we observe, not who is observing it. - **`policy`**: a topic that cuts across audiences. Attorneys read policy. Civic leaders read policy. Developers read policy. Topic-as-lens fails the cognitive-position test. The two slugs that should have been there, `broker` and `attorney`, are the two highest-stakes audiences on the AUDIENCE-MAP after capital allocators. Their voice overlays sat in `zoning-signal/knowledge/intelligence/intelligence-authorship/voice-overlays.md` fully authored with register, vocabulary, sentence patterns, anti-patterns, and demonstration paragraphs, and the rendered surface did not surface them. ### The decision was empirical A five-lens swarm of Sonnet research agents mapped the architectural decision across orthogonal dimensions: empirical agent-routing simulation across 48 user queries × 5 candidate enum sets; linguistic vocabulary scoring per candidate slug; SERP / market-demand research with WebSearch; corpus-fitness audit across 172 NLAA documents and 47 decoder entities; cross-domain portability mapping across 15 hypothetical Mainthread observatory domains. Compound synthesis at `zoning-signal/knowledge/_operational/sessions/2026-05-10-001-attorney-broker-lens-exploration-agents-01/compound-synthesis.md`. Five independent probes converged on one shape: the canon manifest. The empirical probe scored Set B (canon) at 68% high-confidence routing vs 44% for the shipped Set A, with a 19% hard-failure rate on Set A because attorney and broker were absent. The linguistic probe rejected `infrastructure` and `policy` as topic-not-actor and rejected `agent` and `regulatory` as collision-class slugs. The market probe identified attorney as the single largest SERP vacuum in the civic-zoning intelligence space. Westlaw owns case law, AI compliance tools own parcel-level code, **nobody owns the municipal-board-behavior + precedent + vote-pattern layer**. The corpus audit established that the migration is largely a *naming* problem, not a content problem: 69 `policy` blocks read as attorney-register; 80 `civic` blocks inhabit the civic-leader cognitive position; broker is the one genuine authoring deficit. The portability map established that only `synthesis` is structurally universal; the four cross-domain load-bearers are `synthesis` (15/15), `operator` (12/15), `attorney` (11/15), `investor` (10/15). These earn studio-canon vocabulary. ### What ships in v0.14.0 **Lens enum reconciliation.** `src/lib/types/lens.ts` updates the canonical `LensName` union to the manifest set (synthesis + developer + investor + broker + attorney + business + resident + civic-leader). `lensLabel` updates to "Civic Leader" (was "Civic"); adds Broker, Attorney; removes Infrastructure, Policy. **Alias-routing architecture.** `resolveLens()` in `src/lib/mcp/tools.ts` extends to accept natural-language synonyms agents reach for and route them to canonical before handler dispatch. The static `LENS_ALIASES` map covers cross-model variance, professional synonym vocabulary, and historical compatibility: - `legal`, `lawyer`, `counsel`, `land-use-counsel`, `regulator` → `attorney` - `realtor`, `intermediary`, `real-estate-broker` → `broker` - `civic`, `government`, `official`, `governance` → `civic-leader` - `homeowner`, `citizen` → `resident` - `operator`, `site-selector`, `occupier` → `business` - `builder`, `land-developer` → `developer` The MCP enum descriptions on every lens-aware tool (`describe_place`, `describe_corridor`, `describe_meeting`) document both canonical and aliases so AI agents can self-route before the call lands. The architectural pattern mirrors the Phase 12 mirror-tools `deprecated_aliases` discipline; the lens layer extends it for audience-projection routing. **`regulator` deferred.** Surfaced in the cross-domain portability map as a real cognitive position in the zoning domain (state-agency staff at FDOT, SJRWMD, FL DCA). Currently absent as a standalone lens because the corpus has zero first-class regional-coordination-body entities; projections would be inferential. `regulator` aliases to `attorney` for v0.14.0; promotion to standalone lens revisited when decoder index supports state-agency dossiers at depth. **Content migration: pure rename, zero quality loss.** All 69 `<Lens lens="policy">` blocks across 38 files migrate to `<Lens lens="attorney">`. All 80 `<Lens lens="civic">` blocks across 47 files migrate to `<Lens lens="civic-leader">`. The corpus-fitness audit established that this is a naming reconciliation, not a content rewrite; the underlying writing was authored against attorney-register and civic-leader-register cognitive positions; the slug labels were misfiled. **Infrastructure block routing.** 23 `<Lens lens="infrastructure">` blocks across 18 files re-routed case-by-case to investor (basis-point unlock framing), business (operational adequacy framing), or synthesis (cross-cutting framing). Calibrated routing pass per the synthesizer's judgment; no content discarded. **Broker projection authoring.** Approximately twelve broker `<Lens lens="broker">` blocks authored across the four core Lake County place dossiers (Clermont, Minneola, Leesburg, Groveland) and the two corridor dossiers (US-27 South Lake, SR-429 Western Beltway), sourced from existing developer-lens parcel-narrative content + voice-overlays.md broker register. The single new-authoring lift in v0.14.0; the rest is mechanical reconciliation. **Method page rewrite.** The eight-chip authored list at `/method` updates to the canonical roster with refreshed per-lens descriptions. New paragraph documents the alias-routing pattern visibly so AI agents reading the page (browser-class included) see both canonical and synonym vocabulary. **Machine-contract surface alignment.** `/llms.txt`, `/llms-full.txt`, `describe_zoning_signal` MCP description, the about page, the lens.css comment header: all update to enumerate the canonical lens set. ### Studio playbook crystallization: the durable IP The reusable studio artifact from this exercise lives at `intelligence-core/skills/intelligence-projection/references/lens-selection.md` (~330 lines). The methodology is parameterized for any future Mainthread observatory: - **Six-axis scoring instrument**: agent resonance, audience volume, cognitive distinctness, corpus fitness, SERP vacuum, cross-domain portability - **Five-probe research framework**: the L1-L5 dispatch-swarm pattern generalized - **Anti-pattern catalogue**: slugs to never ship (`agent`, `regulatory` in collision contexts, topic-as-lens) - **Five linguistic principles** for slug naming - **Studio archetype canon**: synthesis (15/15), operator (12/15), attorney (11/15), investor (10/15) are the four cross-domain load-bearers; `regulator`, `buyer`, `risk-manager`, `practitioner`, `advisor`, `community` are the second-tier domain-typed archetypes - **`archetype:` bridge field schema**: how project lenses declare their mapping to studio canon in INTELLIGENCE-PROJECT.md - **Decision-day checklist**: ten boxes to check before locking a lens roster INTELLIGENCE-PROJECT.md updates: every lens entry gains the `archetype:` bridge field and `mcp_aliases:` array. Two lenses gain `routing_note:` clarifications (attorney's regulator absorption, civic-leader's cross-model variance handling). ### What this isn't Not an additive expansion. Not a multi-week content rebuild. **A reconciliation release** that closes the manifest ↔ code drift while crystallizing the lens-selection methodology as a reusable studio playbook step. The brilliance compound is multiplicative: closes the architectural drift, unlocks already-authored voice work for attorney + broker, serves the largest SERP vacuum in the civic-zoning intelligence space, and ships the methodology that future Mainthread observatories inherit as a first-class playbook step. `server.json` bumps **1.7.1 → 1.8.0** (no new tools; lens enum revision + alias-routing constitutes a minor architectural shift). The MCP layer responds to the new canonical enum + alias map without breaking changes for agents pinned to the old enum names; `civic` continues to resolve via alias for one minor version (mirror of the Phase 12 tool-rename deprecation pattern; removal scheduled for v0.15.0).
The corpus doubles in size while the architecture deepens. The first MAX-mode constellation (four ignition sessions running in parallel against orthogonal axes) produced a release no single-thread session could have shipped. Content density × visual identity × geographic frontier × analytical depth, all advancing simultaneously. ### What the field reads differently - **Coverage doubles.** Sixteen active cities across three counties (Lake / Polk / Orange / Seminole), up from four cities in one county. The US-27 corridor now reads from Davenport at the I-4 interchange south through Lake Wales: fifty miles of north-Polk frontage as one continuous growth organism, rendered as Place dossiers, meeting readings, and a corridor extension. A second corridor enters the atlas: SR-429 western beltway through Apopka, Ocoee, Winter Garden, and Horizon West. - **The Decoder Index quintuples.** Forty-seven entity dossiers up from eight: sixteen Person dossiers (board members with track records), twelve Organization dossiers (developer firms, law firms, agencies), eleven Legislation and CreativeWork dossiers (ordinances, master plans, named projects). Slug convention auto-corrected to `{lastname}-{city}-{board-abbrev}` for board-member referential integrity across cities. - **The Pattern Atlas more than doubles.** Eleven named patterns up from five. Six new dossiers carry forty-four net-new claim IDs across pattern `voxel_lead`, `exhibit`, and `defensive_response` scopes. Three watches resolved with calibration data: Crooked Can opening (aligned / late / confirmed), Lake Bright denial-bloc cohesion (misread / within / overstated), Citrus Ridge bloc cohesion (misread / within / overstated). The empirical anchor: directional 33%, horizon 33%, significance 67%. Bloc-cohesion is the highest-misread risk class, two of three misreads. - **Briefs expand 5 → 26.** Thirteen new structural briefs plus thirteen deep investigative briefs from a four-lens-head pass (corridor / governance / regulatory / wild card). The deep briefs crystallize a four-axis regulatory framework: state preemption (Live Local + SB 180), federal-statutory mandate (SB 954), climate compression (SJRWMD wetland reclass), demographic capital (Wellness Way + Olympus). Cardinal operator: Lowndes Drosdick reads all four; cities individually read one or two. ### A counter-exhibit revises a confirmed pattern The North Seminole contrast pass surfaced the Winter Springs Wawa decision (October 13, 2025): Planning & Zoning Board recommended denial; City Commission unanimously approved 5-0. The Bellwether Gas Station pattern's structural mechanism breaks when a commission can unilaterally approve over board-and-staff denial. The pattern's scope revises to *appointed-board-substantive-decision-authority* configurations only. The corpus reads its own predictions and learns where they hold. ### Cartographic identity locks The map identity moves from sketch to canon. Eighteen brand-locked map subjects parameterized in the manifest (region, corridor, place dossier, interchange detail, infrastructure, source-trail). The MapTier widens from three tiers to six. The label vocabulary extends to cover the new Polk and Orange / Seminole geography. Eighteen prompts inlined in a copy-paste-optimized firing pack, the surface that drives canonical brand image generation independent of any specific generator path. The constellation pattern itself is now a permanent partnership operating mode, codified at `knowledge/_operational/mission-briefings/IGNITION-PATTERN.md` and `CONSTELLATION-CONTRACT.md`. Future MAX-mode pushes inherit the framework: orthogonal-axis ignitions, durable convergence summaries, single bundled release. The first observatory constellation. The architecture is now what we ship; no single thread could have produced it. --- ### Architecture The release is a four-vector compound bundled into one unified ship. Each vector advanced an orthogonal dimension; the compound is multiplicative. **IGNITION-ALPHA: Content density (master orchestration)** - Decoder Index: 8 → 47 entity dossiers across four canonical classes (Person, Organization, Legislation, CreativeWork). Slug convention reconciliation across board-member entities. Bidirectional links auto-derived through NER + substring scan. - Pattern Atlas: 5 → 11 named-pattern dossiers. Forty-four net-new claim IDs across the locked Phase 11 scopes (`voxel_lead`, `exhibit`, `defensive_response`). Promotion threshold honored: 3+ exhibits across distinct entities required to author as candidate. - Briefs: 5 → 26. Thirteen structural + thirteen deep investigative. The four-axis regulatory-regime framework crystallized: state preemption × federal-statutory mandate × climate-compression × demographic-capital, each operating on its own corridor-scale axis. - Tier-1 readings: 6 → 11. - Watches: 8 → 18 (3 resolved). Track Record empirical anchor: 33% directional / 33% horizon / 67% significance. Bloc-cohesion identified as highest-misread class. - Corpus: 92 → 172 standardized meeting documents. - Coverage: 4 → 10 active cities (this wave); +1 corridor (SR-429 Western Beltway). Subsequent waves brought the total to sixteen cities across three counties. - Resolution Bridge in action: PRODUCE-BRIEFS-RESUME caught the Citrus Ridge May 4 inversion mid-authoring (Rose/McCoy joined consent at substantive vote); the bloc-formation-and-resolution brief inverted thesis live. The metacognitive learning loop became visible in the authoring record. **IGNITION-BETA: Cartographic architectural compounding** - Manifest `cartography.subjects`: 3 → 18. Eighteen brand-locked map subjects with full parameterization (area_descriptor, named_features, corridors, focal, eyebrow, pressure_zones). - Label vocabulary extended (region_labels, corridor_labels, callout_labels) to cover Polk + Orange/Seminole + new corridors. - `MapTier` widened from three tiers to six (region, corridor, place_dossier, interchange, hero_background, dashboard_card, section_divider). - `parseMapKey` regex extended for the new tier vocabulary. - Universal craft: `knowledge/intelligence/cartographic-imagery/subjects.md` (~700 lines, 18 brand-locked prompts) registered as canonical reference. Project-aware via `INTELLIGENCE-PROJECT.md > cartography` parameterization (intelligence-core skill activates against this manifest). **IGNITION-GAMMA: North Seminole contrast (geographic frontier)** - Six new place dossiers (Sanford, Lake Mary, Altamonte Springs, Maitland, Oviedo, Winter Springs), an initial-harvest sample with seven anchor meeting readings. - Thematic synthesis at `knowledge/_regional/themes/north-seminole-contrast.md` with pattern × city propagation matrix. - Fourteen new candidate patterns surfaced for next Pattern Atlas batch. - **Critical counter-exhibit identified**: Winter Springs Wawa (Oct 13, 2025). PZB-recommended denial overridden by City Commission 5-0 approval. Bellwether Gas Station pattern scope revised to *appointed-board-substantive-decision-authority* configurations. The pattern atlas's first revision driven by counter-exhibit. **IGNITION-DELTA: Deep investigative synthesis (analytical depth)** - Four calibrated attention-head streams extended +989 lines total (corridor / governance / regulatory / wildcard). - Thirteen deep investigative briefs authored: `deep-corridor-*`, `deep-governance-*`, `deep-regulatory-*`, `deep-wildcard-*`, plus one master interference essay. - **Four-axis regulatory framework** crystallized: South Lake corridor produces four distinct regulatory regimes simultaneously on orthogonal axes: state preemption (Live Local + SB 180), federal-statutory mandate (SB 954), climate compression (SJRWMD wetland reclass), demographic capital (Wellness Way + Olympus). The asymmetric reading-power across these axes is the corridor's structural condition. **Constellation methodology: the meta-pattern** - `knowledge/_operational/mission-briefings/IGNITION-PATTERN.md` (META-FRAMEWORK) + `CONSTELLATION-CONTRACT.md` (multi-orchestrator coordination protocol). Path-partitioned ignitions; durable convergence summaries at `_convergence/CONSTELLATION-2026-05-09/{ID}-final.md`; bundling discipline as a craft pattern in its own right. - The constellation pattern is now a permanent partnership operating mode. Future MAX-mode pushes plug into the universal framework. **Bundled commits**: Observatory `f7c730e` (88 files, +9539); NLAA `2bb78e1` (129 files, +17089). Status.json reports `f7c730e`; live counts: places 16, patterns 11, entities 47, watches 18 (3 resolved), briefs 26, corridors 2, meetings 95.
Phase 12 (v0.12.0) shipped *The Mirror Tools*, a fully introspectable MCP layer where every content type has a canonical describe_*, every claim is structurally citable through MCP responses, and freshness disambiguates four conflated clocks. ChatGPT's third-pass review confirmed the MCP architecture is now strong (9.0 → 9.25 score) and surfaced one structural gap: **most of Phase 12 is invisible to a browsing client.** Browser-class agents (including ChatGPT's own browsing tool) couldn't directly fetch `/llms.txt`, `/.well-known/mcp.json`, `/status.json`, or `/schema/signal-model.json` without prior on-page linking. v0.12.1, *The Visible Surface*, closes that loop with five focused additions: ### Footer "For AI agents" row Every page now ends with a visible monospaced row linking the five canonical machine surfaces: `/llms.txt`, `/llms-full.txt`, `/.well-known/mcp.json`, `/status.json`, `/schema/signal-model.json`. Browser-class agents that satisfy "prior-result" safety checks before fetching can now see the full agent surface from any page on the site. Plain `<a>` tags (not Next.js `<Link>`) ensure regular HTTP fetches for the file-extension routes. ### Citation anchors collapsed details Every place / pattern / watch dossier gains a `<details>` element collapsed by default at the bottom titled "Citation anchors: N stable references on this page." Expanding reveals the claim ID slugs as plain text with the verbatim claim text below each. **Light form**: one line of chrome (collapsed) so the editorial surface isn't diluted; expanded form provides text-only crawlers (the agent class ChatGPT's browsing tool revealed) with first-class access to the claim layer that was previously only in HTML data-attrs / JSON-LD / MCP responses. The architectural rejection from Phase 11/12 stands for *prominently visible inline* claim listings (gold-plating that pollutes editorial surfaces). The collapsed details element is the elegant light form. ### FreshnessFooter visible render The Phase 12 deferred item lands. Every place / corridor / pattern / meeting / watch dossier gains a small `<dl>` block at the end of the body showing three deterministic clocks: corpus_last_harvested, dossier_last_material_update, site_build_committed. The fourth clock (page_last_rendered) lives only in the dynamic MCP `describe_*` response; including it in the static prerender would break Cache Components determinism. Single source of truth: `computeFreshness` / `deriveDossierLastUpdate` from `src/lib/stats/freshness.ts` powers both surfaces. ### JSON-LD ItemList for dense markdown tables The Recent Motions table on every place dossier gains a parallel `Schema.org ItemList` JSON-LD node. Each row becomes a `ListItem` with the row's cell values exposed as `additionalProperty` entries (PropertyValue per column). Same data as the visible markdown table, machine-parseable, no visual change. Text-only crawlers that flatten the visible `<table>` (a real friction surfaced in ChatGPT's review) can now resolve column-keyed values from the structured graph. Single extraction (`extractTableUnderHeading` in `src/lib/seo/markdown-tables.ts`); two surfaces (visible markdown table + structured ItemList); zero drift. ### Comprehensive outputSchema coverage The Phase 12 deferred item lands. All 18 tool entries now carry an `outputSchema` (JSON Schema 2020-12 dialect per MCP 2025-11-25 spec) describing the success-case `result` shape. The schemas surface in: - The MCP discovery manifest at `/.well-known/mcp.json` (per-tool entry) - The Streamable HTTP `tools/list` response at `/mcp` (per-tool entry) - The REST adapter at `/api/mcp/{tool}` (described in the manifest) Shared component schemas (`CLAIM_RECORD_SCHEMA`, `FRESHNESS_CLOCKS_SCHEMA`, `SIGNAL_STATUS_SCHEMA`) inlined per-schema rather than referenced by `$ref`, because JSON Schema `$ref` with relative paths is finicky in some MCP tooling. Inlining trades duplication for portability. Agents can now validate every tool response, expect specific fields, and detect breaking changes deterministically. Future tightening (v0.13.x): add `additionalProperties: false` once response shapes stabilize. ### What this isn't Not a new architectural primitive. Not a new content type. Not a new content harvest. **A bringing-it-home point release** that closes the visible-surface gaps Phase 12 left for v0.12.x patches AND adds the browser-class affordances ChatGPT's third-pass review revealed as friction. `server.json` bumps **1.7.0 → 1.7.1** (no new tools; outputSchema additions are non-breaking schema enrichment). ### What ships v0.13.0 The remaining items from PHASE-12-POSSIBILITY-PATHWAYS.md analysis: - Optional `list_briefs` + `describe_brief` MCP tools (still classified as gold-plating per the architecture commitment; briefs are intentionally prose-led; pattern dossiers carry the structured data) - Whatever the next ChatGPT test flight surfaces The Phase 9-12 cluster (Pattern Atlas + Decoder Index + Citable Contract + Mirror Tools) is now operationally complete with both the MCP-only and the browser-class surfaces fully wired.
The tool surface catches up to the content surface. Every content type now has a canonical `list_*` and `describe_*`; every `describe_*` response surfaces the structured `claims[]` that make Phase 11's citation guarantee accessible without DOM scraping; multi-dimensional freshness disambiguates the four conflated clocks (corpus / dossier / page / build); agenda `record_status` blocks prevent agents from summarizing intent as completed action. **The MCP layer is now fully introspectable.** ### Two new describe_* tools: every content type fully tooled The dossier-introspection pattern is now complete: - **`describe_meeting(slug, lens?)`**: lens-aware meeting reading projection (mirrors describe_place / describe_corridor signature). Returns the lens-projected body, full frontmatter, citation-stable `claims[]`, four-clock `freshness`, and the structured `record_status` block (record_type / meeting_status / outcome_status / minutes_available / vote_final; the last prevents agents from summarizing agenda intent as completed action). - **`describe_watch(slug)`**: full watch-item dossier including outcome cluster (when resolved: outcome_type, prediction_assessment with directional/horizon/significance assessments, lesson, citations) plus the lesson `claims[]` entry, the calibration-derived insight as a citation-stable reference (Phase 11 Citable Contract × Phase 8 Resolution Bridge compound). ### Tool taxonomy alignment: content-type vocabulary across the codebase Phase 12 renames two existing tools to match the canonical content-type vocabulary used everywhere else in the codebase (loader, URLs, describe tools, frontmatter): - **`list_cities` → `list_places`**: the content type is `place` everywhere; URLs are `/places/{slug}`; the loader is `getAllContent("place")`. The list tool now matches. - **`current_named_patterns` → `list_patterns`**: the content type is `pattern`; URLs are `/patterns/{slug}`; the describe tool is `describe_pattern`. The list tool now matches. **Backward-compat discipline**: `list_cities` and `current_named_patterns` continue to route to the same handlers as deprecated aliases for one minor version with explicit deprecation notices in their tool descriptions. They are removed in v0.13.0. Pinning agents migrate gracefully. The codebase now reads as one coherent ontology. `server.json` bumps **1.6.0 → 1.7.0**; **eighteen tool entries advertised** (sixteen canonical + two deprecated aliases): `describe_zoning_signal`, `list_places` (canonical) + `list_cities` (deprecated alias), `list_corridors`, `list_patterns` (canonical) + `current_named_patterns` (deprecated alias), `describe_pattern`, `list_entities`, `describe_entity`, `meeting_index`, `list_meetings`, **`describe_meeting`** (NEW), `list_watch_items`, **`describe_watch`** (NEW), `get_track_record`, `describe_place`, `describe_corridor`, `semantic_search`. ### Claims[] in every describe_*: Phase 11 compound through the tool layer The five locked claim_id_scopes from Phase 11 (place.primary_force, pattern.voxel_lead, pattern.exhibit, pattern.defensive_response, watch.lesson) now surface as a structured `claims[]` array on every relevant describe_* MCP response: ```ts claims: Array<{ id: string // "self-storage-canary.voxel_lead.canary-corridor-signal" facet: string // "voxel_lead" | "exhibit" | "defensive_response" | "primary_force" | "lesson" text: string // verbatim claim text schema_id: string // full @id URL for JSON-LD reference citations: Array<{ id?: string; url?: string }> }> ``` Text-only agents that can't parse JSON-LD or HTML `data-claim-id` attributes now have first-class access through the same MCP layer they're already using. **Single source of truth**: the same helper that writes the rendered HTML attributes (Phase 11) populates the `claims[]` array (Phase 12). One function, two surfaces, structurally impossible drift. ### Multi-dimensional freshness: four clocks, never confused again Every describe_* response carries a `freshness` cluster: ```json "freshness": { "corpus_last_harvested": "2026-05-07", "dossier_last_material_update": "2026-04-15", "page_last_rendered": "2026-05-09T01:29:21Z", "site_build_committed": "0ff8ae7" } ``` The four conflated freshness clocks (corpus / dossier / page / build) are now structurally disambiguated. Agents reasoning about freshness no longer have to guess what "Updated" means. Per-content-type derivation rules are documented in `src/lib/stats/freshness.ts`. ### Agenda record_status: preventing the most common agent reasoning error Meeting cards with `document_type: agenda` now emit a structured `additionalProperty` block in their JSON-LD schema graph: ```json "additionalProperty": [ { "@type": "PropertyValue", "name": "record_type", "value": "agenda" }, { "@type": "PropertyValue", "name": "meeting_status", "value": "convened" }, { "@type": "PropertyValue", "name": "outcome_status", "value": "pending" }, { "@type": "PropertyValue", "name": "minutes_available", "value": false }, { "@type": "PropertyValue", "name": "vote_final", "value": false } ] ``` Same five fields surface on `describe_meeting` MCP responses as a top-level `record_status` field. Prevents agents from summarizing agenda intent as completed action: a structural fix to the most common AI-reasoning error on civic-record artifacts. ### What this exists for ChatGPT's second-pass review (after Phase 11 deploy, May 9 2026) scored AI-agent usability **9.0 / 10**, up from 8.4 / 10, and surfaced one bluntest critique: *"the machine contract has caught up conceptually, but it now needs strict interface hygiene."* That's the seed of Phase 12. The same trajectory that drove Phases 8-11 (each phase made a layer of the architecture more rigorous) now reaches the *tool surface itself*. **The Mirror Tools is the next stride in the same direction.** Agents that can ONLY call MCP get the same structured truth as agents that can scrape HTML, without DOM scraping, without prose parsing, without ambiguity about freshness or agenda-vs-minutes. ### Honest scope reduction (deferred to v0.12.x point releases) Two architectural commits in MIRROR-TOOLS-ARCHITECTURE.md ship as v0.12.0 *primitives* with the visible / comprehensive surfacing landing in v0.12.x patches: - **`outputSchema` on every `ToolDefinition`**: introduced as the design pattern in v0.12.0 with concrete schemas on the new tools (describe_meeting, describe_watch); comprehensive coverage of all 18 tool entries lands in v0.12.1. Same discipline as how Phase 11 deferred meeting.notable_decision until the data model surfaces it. - **Multi-dimensional freshness footer on dossier renders**: the freshness primitive ships in MCP responses (the architectural compound; agents access freshness through every describe_* call). The visible per-dossier render footer lands in v0.12.1. The architectural primitives are shipped; the visible surfaces follow. --- ### Architecture The Mirror Tools is the **tool-introspection primitive** for Intelligence Systems: the tool surface catches up to the content surface. Agents that can ONLY call MCP get the same structured truth as agents that can scrape HTML. - **Project commitment**: `zoning-signal-observatory/knowledge/methodology/MIRROR-TOOLS-ARCHITECTURE.md` (~430 lines), the civic-regulatory commitment. Locks the URL grammar (no new public URLs; the work is in the MCP tool surface and dossier render layer), the post-Phase-12 tool taxonomy table (every content type → list_* + describe_*), the outputSchema discipline, the claim-surfacing shape (single source of truth via `extractClaimRecords`), the four-clock freshness model with per-content-type derivation rules, the agenda record_status block, the lens-count canonical phrasing, the 16-step rollout, and the regression-watch contracts. - **Field-state record**: `zoning-signal-observatory/knowledge/methodology/PHASE-12-POSSIBILITY-PATHWAYS.md` (~310 lines), the prelude doc. Captures the catalyzing ChatGPT second-pass review verbatim, sorts every signal through three filters (ground-truth verification → structurally true → compounds vs fragments), documents what was agreed and what was rejected (the "visible claim anchors" inventory was rejected as gold-plating; the "MCP response examples in /llms-full.txt" was redirected to outputSchema as the structurally-correct surface; the "status/schema in MCP resources" item was already shipped in Phase 11), and locks the v0.12.0 single-coherent-release decision. - **Tool taxonomy = content-type vocabulary**: historical drift (`list_cities`, `current_named_patterns`) eliminated. New canonical names match the content type slug used everywhere else in the codebase. Deprecated aliases retained for one minor version with explicit removal-version notices. - **Lens-aware describe_* extended to meetings**: `callDescribeProjection` now accepts `'place' | 'corridor' | 'meeting'`. The same eight-projection model the place dossier uses now applies to meeting readings. Agents requesting describe_meeting(slug, "developer") get the developer-lens projection of the meeting body if authored; falls back to synthesis with `fell_back_to_synthesis: true` otherwise. - **describe_watch is single-shape**: watches don't carry lens projections (the resolved watch's structured outcome cluster IS the canonical truth). Returns the full dossier including significance, outcome (when resolved), lesson, citations, and the lesson `claims[]` entry. - **Single source of truth for claims and freshness**: `extractClaimRecords*` helpers in `src/lib/seo/claims.ts` produce both the rendered HTML `data-claim-id` attributes (Phase 11) AND the MCP `claims[]` array (Phase 12). One function reads frontmatter, two surfaces emit. Drift becomes structurally impossible. Same pattern: `computeFreshness` in `src/lib/stats/freshness.ts` is the single source for the four-clock model: the MCP `freshness` cluster (Phase 12) and the deferred dossier-page footer (v0.12.1) both read from it. - **Agenda record_status as additionalProperty**: Schema.org's `additionalProperty` is the canonical extension surface. Five PropertyValue entries (record_type, meeting_status, outcome_status, minutes_available, vote_final) surface in the meeting card schema graph; the same five fields surface as a top-level cluster on describe_meeting MCP responses. Two surfaces, single derivation, no drift. - **outputSchema introduced as design pattern**: `ToolDefinition` is extended with `outputSchema?` (per MCP 2025-11-25 spec). Concrete schemas land progressively: v0.12.0 demonstrates the principle on the new tools; v0.12.1 ships comprehensive coverage of all 18 tool entries with shared component schemas via `$ref` for `claim_record`, `freshness_clocks`, `signal_status_summary`. - **NLAA agent integration**: `INTELLIGENCE-PROJECT.md` registers a `mirror_tools:` configuration block parameterizing the universal pattern against this project. The block locks the tool taxonomy, the deprecation_aliases registry, the output_schema_progressive_coverage roadmap, the claim-surfacing protocol, the freshness clock model, and the lens-count canonical phrasing. - **MCP republish to v1.7.0**: `server.json` bumps from 1.6.0 → 1.7.0. Agents discover the new tools (describe_meeting, describe_watch) and the renamed canonical names (list_places, list_patterns) on next manifest fetch. The Phase 9 + Phase 10 + Phase 11 + Phase 12 cluster is now one coherent compound. **Pattern Atlas + Decoder Index + Citable Contract + Mirror Tools**: every artifact type is canonical, every claim is citable, every tool reflects its full shape. AI agents can reason about the corpus through the MCP layer alone, with stable citation primitives, without DOM scraping, without prose parsing.
The contract layer between content and AI agents catches up to the prose layer. Three projections of one underlying primitive ship together: corpus state becomes dereferenceable through `/status.json`; metric definitions become versioned through `/schema/signal-model.json`; the highest-value structural claims become citation-stable through selective `data-claim-id` annotations with parallel JSON-LD `Claim` graph nodes. Plus the orientation surface: `/llms.txt` restructures from content listing into the agent start page. **The machine contract is now as structurally rigorous as the human narrative.** ### The State Contract: `/status.json` One canonical URL where the live corpus state is dereferenceable. AI agents that cached an older snapshot can fetch `/status.json` to detect drift (compare the `version` discriminator) and decide whether to re-fetch. Every value derives from canonical engines: `getFieldStats()` for counts, `getTrackRecord()` for calibration, `git rev-parse HEAD` at build time, `server.json` for the MCP version. **Never hand-authored.** Cache-Control: `public, max-age=60, s-maxage=300`, short enough that agents can re-fetch reliably for drift detection, long enough that build storms don't hammer the route. The shape consolidates everything an agent needs to verify freshness: corpus version + counts (places, corridors, meetings, patterns, entities, watch breakdown by status, briefs); calibration accuracy across resolved watches; MCP server version + tool count; pinned schema versions; canonical surface URLs. ### The Definitions Contract: `/schema/signal-model.json` Every metric definition the observatory uses (*signal_strength* range and inputs, *direction* enum thresholds (rising / stable / cooling), *confidence* levels and their evidence requirements, *confidence_pips* mapping, watch and pattern *lifecycle states* with promotion criteria, *prediction_assessment* axes with rating scales, the *track_record_calibration* formulas) is consolidated into one versioned, citable JSON URL. Date-coded version (`2026-05-08`); when definitions materially change, the version bumps and agents detect drift. Backward compatibility through versioned URLs: when a definition fundamentally changes, the next schema ships at `/schema/signal-model-v2.json` alongside the old. Once this surface ships, every other surface (method-page prose, AUDIENCE-MAP, intelligence-core skill files, dossier renders) references the schema rather than re-asserting definitions. **Operator updates the schema → all downstream surfaces inherit on next build.** ### The Claims Contract: selective `data-claim-id` annotations The highest-value structural claims become citation-stable references. Slug grammar locked: `{scope}.{facet}.{noun}`, for example `clermont.primary_force.hartwood-marsh-road`, `self-storage-canary.exhibit.clermont-pz-2026-02-self-storage`, `lake-bright-council-mar-23.lesson.mitigation-capital-floor`. Once a claim ID ships, the slug is preserved across rewordings; bump the noun only when the structural claim itself materially changes. Five scopes ship live in this release: - **`place.primary_force`**: Primary Forces on every place dossier. The structural-causality claims that drive the city's evolution. - **`pattern.voxel_lead`**: the canonical definitional claim for each named pattern. - **`pattern.exhibit`**: every exhibit in a pattern's inventory; data-source-ids reference the originating meeting. - **`pattern.defensive_response`**: what cities do when the pattern is detected. - **`watch.lesson`**: the calibration-derived insight on every resolved watch (Resolution Bridge × Machine Contract compound). Each claim emits a parallel JSON-LD `Claim` graph node with `appearance` referencing the article and `citation` array referencing the supporting sources where present. `meeting.notable_decision` is deferred: the meeting frontmatter does not currently surface a dedicated array; ships when the data model extends. **Selective adoption is the discipline.** Body prose, lens-projection prose, filler sentences, and editorial commentary do not get claim IDs. The leverage is at the structural-claim layer; gold-plating dilutes it. ### The Orientation Surface: `/llms.txt` as agent start page The first file most agents fetch. Restructured to lead with the orientation answers (*what is this and how should I use it*) in 30 seconds: 1. Description (preserved) 2. **Current corpus state** (NEW, derived from the same engines `/status.json` uses) 3. **Recommended agent workflow** (NEW: a concrete six-step MCP tool sequence) 4. **Canonical surfaces** (NEW: every agent surface stable URL listed once, including `/status.json` + `/schema/signal-model.json`) 5. Content listings (preserved at lower priority; agents that previously parsed listings continue to find them) `describe_zoning_signal` extends to surface `status_url`, `schema_url`, `track_record`, `patterns_atlas`, and `decoder_index` so agents calling the canonical orientation tool immediately discover the freshness and definitions contracts. Self-bootstrapping. `/llms-full.txt` cleans the stale "eight public read-only tools" assertion (now fourteen across Phases 7–10) and adds a Machine-Contract Surfaces section pointing at the new contract URLs. `/.well-known/mcp.json` advertises `/status.json` and `/schema/signal-model.json` as canonical resources. ### What this exists for ChatGPT's third-party AI-agent review of the observatory the day prior captured the gap precisely: *"the prose and ontology are ahead of the machine contract."* The same trajectory drove Phases 8–10: Phase 8 ClaimReview schema, Phase 9 DefinedTerm canonical home, Phase 10 typed entity schema. **Phase 11 is the next stride in the same direction.** The agent-citation layer reaches the rigor the human-citation layer already had. For AI agents, this is the citation-grade upgrade. Pin to `/status.json` `version` to detect cached drift. Pin to `/schema/signal-model.json` `version` to detect definitional drift. Cite individual structural claims by their `data-claim-id` for stability across rewordings. Discover the contract URLs through `describe_zoning_signal` or `/llms.txt` or `/.well-known/mcp.json`: three discovery paths converging on the same canonical surfaces. --- ### Architecture The Machine Contract is the **citation-stability primitive** for Intelligence Systems: the contract layer between content and AI-agent consumers becomes as structurally rigorous as the human narrative. Continues the four-skill universal-craft cadence in `intelligence-core`: `resolution-bridge → pattern-atlas → decoder-index → machine-contract`. Each is a universal primitive an Intelligence System needs. - **Universal craft**: `intelligence-core/skills/machine-contract/SKILL.md` (~400 lines). Domain-agnostic. Captures the three projections (State / Definitions / Claims) plus the Orientation surface, the universal envelopes for `/status.json` and `/schema/{model}.json`, the locked claim-ID scopes the universal pattern names (primary causality / pattern definitions / resolution lessons / notable decisions), the slug-grammar discipline (`{scope}.{facet}.{noun}`), the cache strategy locked at the contract level (60s/300s for state, 300s/86400s for schemas), the per-project configuration contract, and the agent integration protocol. Includes copy-paste-ready reference artifacts in `references/` (`status.json.example.json`, `signal-model.json.example.json`, `llms.txt.template.md`, `claim-annotation.example.html`). Reusable across any Intelligence System MainThread builds going forward. - **Project commitment**: `zoning-signal-observatory/knowledge/methodology/MACHINE-CONTRACT-ARCHITECTURE.md` (~340 lines), the civic-regulatory-motion projection. Locks the URL grammar (`/status.json`, `/schema/signal-model.json`), the storage decision (no new content type; wraps existing surfaces), the locked status.json shape with project-specific civic-regulatory counts, the locked signal-model schema covering the full metric vocabulary the observatory uses, the five locked claim-ID scopes (deferring `meeting.notable_decision` honestly until the data model surfaces it), the locked /llms.txt restructure with corpus state block + workflow + canonical surfaces, the 10-step rollout, and the regression-watch contracts. - **Field-state record**: `zoning-signal-observatory/knowledge/methodology/PHASE-11-POSSIBILITY-PATHWAYS.md` (~275 lines), the prelude doc. Captures the catalyzing ChatGPT review verbatim, sorts every signal through three filters (structurally true / already addressed / compounds), documents what was agreed and what was rejected (rejected: `/agent.json` as fourth canonical surface; per-page `.json` siblings; full-prose claim IDs), and locks the v0.11.0 single-coherent-release decision. Future sessions reading this can reconstruct the architectural reasoning at any depth. - **Single source of truth derivation**: `/status.json` is composed at request time from `getFieldStats()` + `getTrackRecord()` + `process.env.VERCEL_GIT_COMMIT_SHA` + `server.json` import. Every value flows through the same engines that drive every other surface. The homepage Field Status pulse, the Track Record page, and the MCP tool responses all dereference the same numbers. **Drift between surfaces becomes structurally impossible.** - **Selective claim ID infrastructure**: `src/lib/seo/claims.ts` (`buildClaimDataAttr`, `buildClaimNode`, `composeClaimId`, `deriveClaimNoun`). The slug derivation strips stopwords and takes the first four surviving tokens, stable across whitespace / punctuation / minor wording changes, breaks only on structural claim changes. Per-dossier integration in `src/app/patterns/[slug]/page.tsx`, `src/app/watch/[slug]/page.tsx`, `src/app/places/[slug]/page.tsx`; each emits HTML `data-claim-id` attributes on rendered elements + parallel `Claim` JSON-LD nodes pushed into the schema graph. Loader Extension Pattern compound: every place / pattern / watch dossier in the corpus gains claim IDs automatically as the data evolves. - **Schema versioning**: `/schema/signal-model.json` carries the date-coded version (`2026-05-08` at ship). When definitions materially change, the date bumps and agents pinning to the version detect drift. Backward compatibility is path-based: future v2 ships at `/schema/signal-model-v2.json` alongside v1, and agents continue to work until they migrate. - **Cache strategy intentional**: `/status.json`: short cache so drift detection works (60s browser / 300s edge). `/schema/signal-model.json`: long cache because definitions rarely change (300s browser / 86400s edge). The architecture-commitment locks these values; future changes need explicit reasoning in the changelog. - **NLAA agent integration**: `INTELLIGENCE-PROJECT.md` registers a `machine_contract:` configuration block parameterizing the universal craft against this project. The harvest skill and synthesize skill operate aware of the contract layer; numeric assertions in published artifacts derive from canonical engines, never hand-typed. The discipline is enforced at authorship. - **MCP tool catalog extension**: `describe_zoning_signal` returns `status_url` + `schema_url` + `track_record` + `patterns_atlas` + `decoder_index` so agents calling the canonical orientation tool immediately discover the contract URLs. `server.json` bumps **1.5.0 → 1.6.0**; fourteen tools live across discovery + description + lens-aware projection surfaces. The contract layer wraps every existing surface with citation stability. Phase 7 Track Record gains dereferenceable calibration definitions through the schema. Phase 8 Resolution Bridge predictions gain stable claim IDs for `lesson`. Phase 9 Pattern Atlas dossiers gain citable lifecycle definitions + `voxel_lead` / `exhibit` / `defensive_response` claim IDs. Phase 10 Decoder Index entities surface through `/status.json` counts. Every dossier exposes its corpus version. **Every claim an AI agent might cite is now version-pinned to definitions that won't drift silently.**
Every named entity the South Lake County corpus references (board members, applicants, attorneys, agencies, legislation, specific projects) becomes a first-class artifact at `/entities/{slug}` with typed Schema.org graph and bidirectional links to every meeting / brief / watch / pattern where the entity appears. The implicit entity graph is now navigable. **The smallest citable unit of authority in the corpus has its own URL.** ### The Decoder Index - **`/entities`**: the hub. Named entities grouped by Schema.org class (Person · Organization · Legislation · Project) with class-color border accents and signal-sortable cards. - **`/entities/{slug}`**: per-entity dossier. Voxel lead, class-specific cluster (voting record for board members, jurisdiction for organizations, legal status for legislation, case number for projects), bidirectional links to meetings / briefs / watches / patterns, related entities, places + corridors active in, provenance trail. ### Eight seed entities across all four classes - **People**: Anita Geraci-Carver (former Groveland City Attorney; departed mid-EAR-cycle) - **Organizations**: Hanover Land Company (Lake Bright-Brighurst applicant); Leesburg Planning Commission (Marshall–Carter–Bowersox–Robertson denial bloc); DPZ CoDesign (Clermont New Urbanism engagement) - **Legislation**: Florida SB 180 (the August 2024 retroactive line); Wellness Way Design Standards (Clermont 2022, the cardinal pre-line code) - **Projects**: Lake Bright-Brighurst PUD (the cardinal council-fracture event); Wellness Way Master Plan (15,500 acres; Olympus + Hills Town Center; the Southern Transformation evidence) ### Bidirectional graph density Every entity dossier surfaces every artifact where the entity appears: meetings (with voting records for board members), briefs that analyze the entity, watches the entity is involved in, patterns the entity exhibits. The entity graph closes: from any entity, navigate to any artifact; from any artifact, navigate to any entity present. ### MCP layer: entity-aware tools for AI agents Two new MCP tools land alongside the surface to make the Decoder Index programmatically queryable for AI agents: - **`list_entities(entity_class?, place?, search?)`**: discovery surface. Returns the full entity registry with class-aware summary fields (jobTitle for Person; jurisdiction for Organization / Legislation / Project; legal_status for Legislation; case_number + work_status for Project) plus cross-reference counts (meetings_count, briefs_count, watches_count, patterns_count) for at-a-glance entity-graph density. Filter by class, jurisdiction, or natural-language search substring. - **`describe_entity(slug)`**: full structured dossier. Returns voxel_lead, the class-specific cluster (person.voting_record, organization details, legislation status, creative_work case identifiers), the bidirectional graph references, the provenance_chain, and the canonical surfaces (dossier URL, schema_id, decoder_index_hub). Each `schema_id` is a stable cross-page reference that resolves to the canonical Schema.org node (Person / Organization / Legislation / CreativeWork) for AI-citation grounding. `describe_zoning_signal` updated to enumerate all eight canonical content types (place, corridor, meeting, brief, field, watch, pattern, entity); the prior surface listed only four. `server.json` bumps **1.4.0 → 1.5.0**; **fourteen MCP tools live**: `describe_zoning_signal`, `list_cities`, `list_corridors`, `current_named_patterns`, `describe_pattern`, **`list_entities`**, **`describe_entity`**, `meeting_index`, `list_meetings`, `list_watch_items`, `get_track_record`, `describe_place`, `describe_corridor`, `semantic_search`. Named entities are the smallest citable unit of authority. The Decoder Index is the surface that lets every reference dereference. --- ### Architecture The Decoder Index is the **named-entity primitive** for Intelligence Systems: a separation that promotes every named actor, organization, instrument, and object referenced in the corpus to a first-class artifact with its own canonical URL, typed schema graph, and bidirectional links to every artifact where the entity appears. Renders the implicit entity graph as navigable surfaces. - **Universal craft**: `intelligence-core/skills/decoder-index/SKILL.md` (~360 lines). Domain-agnostic. Captures the universal entity-class taxonomy (Person / Organization / Legislation / CreativeWork), the universal frontmatter contract with class-specific clusters (person.voting_record, organization.type, legislation.legal_status, creative_work.case_number), the bidirectional-link auto-derivation discipline (NER + substring scan against meeting bodies; reverse-derivation across briefs, watches, patterns), the privacy + accuracy floor (public actors, public actions, public record only), and the agent integration protocol (pre-harvest entity briefing, during-harvest extraction, post-harvest dossier updates, synthesis-time entity weaving). Reusable across any Intelligence System MainThread builds going forward: civic regulatory motion, aircraft-parts supply chains (airlines / parts / recall numbers / airworthiness directives), biosurveillance (pathogens / health authorities / outbreak codes), technical literature (authors / institutions / paper IDs). - **Project commitment**: `zoning-signal-observatory/knowledge/methodology/DECODER-INDEX-ARCHITECTURE.md` (~360 lines), the civic-regulatory-motion projection. Locks the four-class taxonomy (Person, Organization, Legislation, Project), the Path A storage decision (`content/entities/{slug}.mdx`), the disambiguation-at-the-slug discipline, the threshold for dossier authoring (3+ corpus appearances OR cardinal significance), the 12-step rollout, and the regression-watch contracts. - **Schema.org adaptations**: class-specific emission. **Person** entities emit `Person` with `jobTitle`, `affiliation`, `subjectOf` array referencing every artifact. **Organization** entities emit `Organization` with `areaServed`, `subjectOf`. **Legislation** entities emit `Legislation` with `legislationStatus`, `legislationDate`, `legislationJurisdiction`. **Project / Case** entities emit `CreativeWork` with `genre: civic-development-project`, `identifier` (case number), `spatialCoverage`. Every dossier carries a companion `Article` with `subjectOf` linking back to the typed entity node, the canonical fact-rendering relation. The schema graph closes the entity loop. - **Bidirectional links auto-derive**: the corpus IS the source. `appears_in_meetings` derives from substring scan against meeting bodies. `appears_in_briefs` derives from brief prose. `appears_in_watches` derives from watch frontmatter + body. `exhibits_patterns` cross-references pattern dossiers. `voting_record` for board members projects from meeting agenda-item vote tallies. Operator authors voxel_lead and class cluster; the corpus populates everything else. - **Privacy + accuracy discipline**: public officials acting on the public record + public organizations with public roles only. Voting records, public statements, on-the-record motions, formally filed applications. Never private commentary, personal life, or off-record speech. The corpus is the source; nothing else gets dossiered. - **Per-entity Track Record** (Decoder Index × Resolution Bridge cross-product): for board members and other entities with calibration-relevant action histories, voting alignment with denial blocs, motion-second pairings, and pattern associations become structured data. *Bowersox: 47 votes recorded; voted with the bloc majority 89% of the time.* Citable in MCP responses; surfaceable as schema graph variableMeasured. (Full activation requires NER pass over corpus; this release seeds the architecture.) - **NLAA agent integration**: `INTELLIGENCE-PROJECT.md` registers a `decoder_index:` configuration block. The harvest skill loads relevant entities scoped to the harvest entity before any source fetch (per the established pre-harvest briefing protocol from resolution-bridge + pattern-atlas). The synthesize skill weaves entity references explicitly with canonical slug links. - **MCP tool catalog extension**: `list_entities` and `describe_entity` enter the canonical tool set. `describe_zoning_signal` updated to enumerate all eight canonical content types. server.json bumps to **1.5.0**; fourteen tools live across the discovery + description + lens-aware projection surfaces. Each entity dossier's `schema_id` (`/entities/{slug}#{class.toLowerCase()}`) is the stable cross-page Schema.org reference AI agents resolve to when citing the entity. - **Loader Extension Pattern compound**: same architecture as Phase 7 (Watch), Phase 8 (Resolution Bridge), Phase 9 (Pattern Atlas). One operator-authored entity dossier; **fifteen+ downstream surfaces** including the new MCP layer. The implicit entity graph rendered as navigable surfaces. Every reference dereferences. Every claim is auditable. Every entity is citable. **This is what makes an Intelligence System a graph, not just a record.**
Named patterns become first-class artifacts. Each pattern the observatory has crystallized (*The Self-Storage Canary*, *The Grandfather Window*, *The Six-Month Board Flip*, *The Quiet Revolution on Highway 27*, *The Bellwether Gas Station*) now has its own dossier at `/patterns/{slug}` carrying the structured pattern data the entity graph resolves to. The brief is the prose; the pattern dossier is the data. ### The Pattern Atlas - **`/patterns`**: the hub. Five named patterns sorted by lifecycle stage (confirmed → revised → candidate → retired) then signal score. - **`/patterns/{slug}`**: per-pattern dossier. Voxel lead, signal-strength reading, exhibits inventory with detection metadata, defensive responses, related briefs, related places, related corridors, provenance chain, and a Track Record line for per-pattern calibration accuracy. ### Five patterns seeded as confirmed lifecycle stage - **The Self-Storage Canary**: Signal 78, six exhibits, rising. Detected in Clermont, Minneola, Groveland. - **The Grandfather Window**: Signal 87, three exhibits, stable through October 2027 SB 180 sunset. Detected across all four cities. - **The Six-Month Board Flip**: Signal 82, four exhibits, stable. Detected in Clermont. - **The Quiet Revolution on Highway 27**: Signal 82, four exhibits, stable. The meta-pattern containing the others; detected across all four cities. - **The Bellwether Gas Station**: Signal 78, two exhibits, rising. Detected in Clermont and Minneola. ### Bidirectional integration - **DefinedTerm canonical URL migrates** from `/briefs/{slug}` to `/patterns/{slug}`. Every meeting card schema graph that previously linked DefinedTerm to a brief now links to the pattern dossier as the canonical entity-graph node. Briefs continue to publish the prose analysis and remain valid surfaces; the pattern carries the canonical home. - **Per-place "Patterns active here"**: every place dossier renders the patterns detected in that jurisdiction with signal scores and exhibit counts. - **Per-corridor "Patterns crossing this corridor"**: corridor dossiers carry the same shape. - **Mega-menu Patterns ▾**: confirmed patterns first, sorted by signal score; subtitle shows lifecycle stage + signal. - **Per-pattern Track Record**: the Resolution Bridge × Pattern Atlas cross-product. Watches scoped to a pattern accumulate calibration data; the pattern's accuracy is auditable per scope and informs lifecycle revision. Named patterns are the vocabulary of the field. The Atlas is the durable taxonomy the system contributes to its domain. --- ### Architecture The Pattern Atlas is the **named-pattern primitive** for Intelligence Systems: a separation of *the pattern (data)* from *the brief (prose)* that promotes recurring structures named by the analyst to first-class entities with their own canonical URLs, DefinedTerm schema homes, exhibits inventories, and bidirectional links to every artifact where each pattern is detected. - **Universal craft**: `intelligence-core/skills/pattern-atlas/SKILL.md` (~340 lines). Domain-agnostic. Captures the universal frontmatter contract, the lifecycle-state discipline (`candidate` / `confirmed` / `revised` / `retired` with explicit promotion criteria tied to Track Record calibration data), the agent integration protocol (pre-harvest pattern briefing, during-harvest detection including counter-exhibits, post-harvest pattern updates, synthesis-time pattern crystallization), and the universal schema graph. Reusable across any Intelligence System MainThread builds going forward: civic regulatory motion, aircraft-parts supply chains, biosurveillance, technical literature, supply-chain motion. - **Project commitment**: `zoning-signal-observatory/knowledge/methodology/PATTERN-ATLAS-ARCHITECTURE.md` (~340 lines), the civic-regulatory-motion projection. Locks the slug grammar (zero-cost migration; pattern slug = brief slug), the Path A storage decision (`content/patterns/{slug}.mdx`), the 6-step rollout, the regression watch (existing brief URLs preserved, watch `scope.brief` retained for backward compat). - **Schema.org adaptations**: three novel uses of the trust-coded structured-data category. **DefinedTerm canonical URL migrated** from `/briefs/{slug}` to `/patterns/{slug}` across the entire meeting-corpus schema graph. **DefinedTermSet** emitted at the Atlas hub (`@id: /patterns#set`) registering all named patterns as a citable taxonomy. **Article.subjectOf: DefinedTerm** on each pattern dossier links the prose to the canonical entity. `Dataset` schema on each dossier surfaces `variableMeasured` (exhibits count, signal score, lifecycle stage) for AI-citation grounding. - **MCP layer**: new tool `describe_pattern(slug)` returns the full structured dossier: `voxel_lead`, `signal_status`, `pattern_scope` (spatial / temporal / topical / corridors), full `exhibits` inventory with detection metadata, `defensive_response` taxonomy, `provenance_chain`, related briefs / places / corridors, audiences, named_at, and the canonical surfaces (`dossier`, `defined_term_id`, `defined_term_set`, `list_in_atlas`). `current_named_patterns` extended to read from the canonical pattern dossiers (not briefs), returning lifecycle stage, signal score, exhibits count, spatial scope, related briefs, and voxel_lead. `server.json` bumps **1.3.0 → 1.4.0**; twelve tools live. - **NLAA agent integration**: `INTELLIGENCE-PROJECT.md` registers a `pattern_atlas:` configuration block (pattern_directory, registry path, MCP tools, lifecycle_stages, candidate_threshold, civic-domain `defensive_response_taxonomy`). The harvest skill loads active patterns scoped to the entity before any source fetch and flags resolution events, pattern exhibits, AND counter-exhibits during extraction. Counter-exhibits are highest-value: they're the data that drives pattern revision. The synthesize skill enforces the candidate-threshold discipline (3+ exhibits across distinct entities required to author as candidate) and ties revision authority to calibration evidence. - **Phase 8 × Phase 9 compound**: **per-pattern Track Record**. The Resolution Bridge tracks calibration per scope; Phase 9 adds per-pattern scope. Watches anchored to a pattern accumulate directional / horizon / significance assessments; the pattern's lifecycle stage transitions are operator-authored based on the accumulating calibration record. Patterns aren't static essays; they're learning entities. - **Loader Extension Pattern compound**: same architecture as Phase 7 (Watch) and Phase 8 (Resolution Bridge). One operator-authored pattern dossier; **twelve+ downstream surfaces**: the pattern URL, the Atlas hub, every meeting whose key_signals references it, every brief that cites it (`cites_patterns: []`), every watch scoped to it, every place / corridor where detected, per-pattern Track Record, MCP `describe_pattern` + `current_named_patterns`, mega-menu Patterns ▾, sitemap, `/llms.txt` Pattern Atlas section. Single source of truth across all consumers. - **Authoring discipline**: operator authors the pattern's name, voxel_lead (134-167 word voxel), match term, lifecycle stage, and revision notes. The exhibits inventory derives from substring-scan of meeting key_signals; `evidence_count` derives from `exhibits.length`; `related_briefs` reverse-derives from briefs declaring `cites_patterns: []`. Claims that require judgment are authored; counts and aggregations are derived. Named patterns are the vocabulary of the field. The Pattern Atlas is what makes an Intelligence System a vocabulary, not just a record.
The Watch now closes its loop. When a watched event resolves, the observatory records the outcome, links it to the original prediction, names what was learned, and aggregates every directional read into a public **Track Record**. Right or wrong. Misreads count. ### Resolution surface - **`/watch/{slug}`**: status-aware render. The closing-loop panel reads as the new lede on resolved watches; the original prediction body becomes historical context below it. Outcome type pill, prediction-assessment chips (directional / horizon / significance), the operator's lesson, and the source citation trail surface in that order. - **`/watch/track-record`**: the public scorecard. Directional accuracy (aligned + 0.5 × mixed), horizon accuracy, significance accuracy. Calibration stratified by the authoring confidence pip count. Recently resolved list. Per-jurisdiction breakdown. Methodology section. - **`/watch/resolved`**: filtered hub view of every closed-loop watch, sorted most-recently-resolved first. ### Hub + per-page integration - **Tabs above the bulletin board**: Active · Resolved · Track Record. - **Per-place track-record line**: every place dossier carries a one-line pulse on directional accuracy for watches scoped to that jurisdiction. Silent when no resolutions yet. - **Recently Resolved embed**: every place, corridor, and brief dossier now renders the most recent resolved watches scoped to that entity. - **Mega-menu Watch ▾** surfaces the most-recently-resolved item alongside the active forward calendar and a direct Track Record link. ### Two retroactive resolutions seed the discipline - **Lake Bright-Brighurst at Leesburg City Commission**: postponed from March 23 to April 13, then approved 4-1 (Connell dissenting). The $2.3M intersection mitigation paired with Lake County's approval of the plan flipped the council. P&Z denial bloc fractured. Predicted bloc would hold; misread. - **Citrus Ridge Commercial PUD at Minneola P&Z**: approved 4-0 on May 4, advancing to City Council May 19. The Rose/McCoy pair that tabled in April did not dissent at substantive vote. Predicted bloc cohesion; misread. Both write-ups follow the locked voice: past tense, specific verbs, vote tallies, named entities, lesson stated as inference. The track record opens publicly at the actual numbers, not the flattering ones. The civic record moves before the market reacts. Reading every meeting was the first half. Reading what came of every prediction is the second. --- ### Architecture The Resolution Bridge is the **epistemic-accountability primitive** for Intelligence Systems: a closing-loop surface that converts forward-looking watches into auditable calibration data. Phase 8 ships the universal craft, the project commitment, and the schema graph that makes forecasting accuracy a public, citable artifact. - **Universal craft**: `intelligence-core/skills/resolution-bridge/SKILL.md` (~270 lines). Domain-agnostic. Captures the universal frontmatter contract (`outcome.{resolved_date, resolved_at_artifact, outcome_type, outcome_summary, prediction_assessment, lesson, citations}`), the four-point rating scale (aligned / mixed / misread / unforeseen), the universal voice template, and the agent integration protocol. Reusable across any Intelligence System MainThread builds going forward: civic regulatory motion, aircraft-parts supply chains, biosurveillance, technical literature. - **Project commitment**: `zoning-signal-observatory/knowledge/methodology/WATCH-RESOLUTION-ARCHITECTURE.md` (~280 lines), the civic-regulatory-motion projection. Locks the lifecycle states (pending → resolved → obsolete → archived), the project-specific outcome enum, and the 10-step rollout. - **Schema.org adaptation**: **`ClaimReview` emitted on every resolved watch**. Novel adaptation of Google's canonical fact-check schema family applied to forward-looking civic predictions. The original prediction becomes the `claimReviewed`; the directional assessment becomes the `reviewRating` (1–4 scale with `alternateName` and `ratingExplanation`); the resolution date is the review publication date. `itemReviewed.appearance` references the original watch authoring node. First-mover surface in a trust-coded structured-data category for forward-looking domain predictions. - **Event lifecycle migration**: `Event.eventStatus` driven by `outcome.status`: `EventScheduled` → `EventCompleted` on resolution; `EventCancelled` on obsolescence. `endDate` set to `resolved_date`. `Article.subjectOf: ClaimReview` links the prose article to the canonical fact-check anchor. - **MCP layer**: new tool `get_track_record(jurisdiction?, corridor?, brief?)` returns the full calibration scorecard with optional scope: directional / horizon / significance accuracy, per-confidence-pip stratification, recent resolutions, per-jurisdiction breakdown, surface URLs. `server.json` bumps **1.2.0 → 1.3.0**; eleven tools live. - **Loader Extension Pattern compound**: one canonical `getTrackRecord({ scope? })` derivation engine; **nine downstream surfaces**: public scorecard, hub summary line, per-place / per-corridor / per-brief track-record lines, MCP `get_track_record`, mega-menu pulse, schema graph variableMeasured cluster, `llms.txt` Resolved section, RSS / JSON Feed resolution events. Single source of truth across all consumers. - **Authoring discipline**: `outcome_summary` voxel-disciplined (134-167 words, BLUF, ≥1 specific fact, ≥1 mechanism). `prediction_assessment` is honest by construction; misreads are reported. The operator's `lesson` is the irreplaceable human judgment layer: the named insight about how the field actually works, distilled from the difference between prediction and outcome. The Resolution Bridge is the move from *forecaster* to *forecaster with epistemic accountability*. Calibration accumulates with the corpus, not with marketing spend. A static observatory loses authority over time as content stales; a watch-with-resolution observatory gains authority as the track record extends.
The observatory now publishes what it is tracking. **The Watch** is a sixth canonical content type: first-class artifacts for forward-looking events, scheduled hearings, regulatory sunsets, and condition-triggered milestones the field is tracking. Every place dossier, corridor page, and brief now carries an inline bulletin board. The dedicated hub at `/watch` is the cross-field forward calendar. ### Eight initial watch items The corpus seeds with the cardinal pending decisions and milestones across south Lake County: - **Lake Bright-Brighurst at Leesburg City Commission**: second reading of the P&Z-denied 202-acre PUD with $2.3M mitigation, March 23, 2026 - **Citrus Ridge Commercial PUD substantive vote** at Minneola P&Z, May 4, 2026; tests whether the Rose/McCoy bloc holds at full hearing - **SB 180 self-expiration**: June 2026; all four cities enter their post-sunset adoption windows simultaneously - **Groveland names a new City Attorney**: successor to Anita Geraci-Carver mid-EAR cycle - **Groveland CDC V5 form-based code adoption**: the regulatory architecture awaiting the SB 180 lift - **Crooked Can Brewing opens at Hills Town Center**: April 2026 target; the cardinal Hills Town Center validation - **Hartwood Marsh Road widening construction**: funded since 2007; the binding capacity constraint for Wellness Way - **Clermont C-2 food-truck permitted-use text amendment**: Council-directed; the CUP cadence that broke the code ### Per-page bulletin boards Every place dossier renders the watch items scoped to that city below the per-city meeting directory. Every corridor page renders items scoped to that corridor. Every brief renders watch items linked to that named pattern. The same data feeds all three surfaces. ### Each item is structurally citable Every watch item carries a trigger (date or condition), scope chips (place / corridor / brief / region), a significance score (0-100), a horizon (imminent / near-term / structural), a 134-167 word voxel describing why it matters, and a provenance link to the meeting or brief that surfaced it. After the trigger date passes, items resolve with an outcome assessment that becomes part of the published record, and the observatory's predictive track record compounds over time. ### AI agents gain a queryable forward calendar - **Schema graph**: each watch item emits Schema.org `Event` + `AnalysisNewsArticle` + `Speakable`. The `/watch` hub emits `ItemList`. AI extractors gain stable cross-page `@id` references between the place dossier, the meeting reading that surfaced the item, the brief that defines the related pattern, and the watch item itself. - **`list_watch_items()` MCP tool**: new tool, filters by status / horizon / place / corridor / brief. Bumps the registry to 1.2.0. - **RSS + JSON Feed**: watch items appear in `/rss.xml` and `/feed.json` with `[Watch]` prefix. - **`/llms.txt`**: a new "The Watch · Forward Calendar" section lists pending items. ### The Watch in chrome `Watch ▾` is a top-level nav item alongside Places, Corridors, Readings, Briefs, Method. The mega-menu surfaces the most imminent items; the mobile drilldown bottom sheet picks them up automatically. The civic record moves before the market reacts. Reading every meeting was the first half. Reading what comes next is the second.
The full standardized meeting record from January 2024 through May 2026 is now readable on the observatory: 92 meetings across Clermont, Leesburg, Minneola, and Groveland P&Z boards, each as its own URL with structured items, public-comment summary, key signals, and source trail. ### The full corpus Eighty-nine new meeting readings join the three existing in-depth interpretations. Each renders the harvest pipeline's standardized record: meeting snapshot, agenda items with motion-makers and votes, public testimony aggregate, and three to five key signals. Speakable schema markers point AI extractors at the voxel lead; per-page Open Graph cards generate via Satori; sitemap and the `/meetings` hub enumerate the full set. ### Three new in-depth readings Three meetings carry full eight-lens interpretation: - **Clermont P&Z, April 7, 2026**: the Kohl's voluntary annexation at 12305 US-27, 7-0 on both the comp plan amendment and rezoning, with the city's leverage strategy named on the record - **Groveland P&Z, April 2, 2026**: City Attorney Anita Geraci-Carver's last meeting, closing the multi-year SB 180 thread for the city most exposed to it - **Leesburg Planning Commission, January 22, 2026**: the Lake Bright-Brighurst denial cascade, four items denied including a 202-acre, 502-unit PUD with $2.3M of developer-funded intersection mitigation rejected at 3-3 ### Discovery surfaces for AI agents - **RSS** at `/rss.xml` and **JSON Feed** at `/feed.json`: high-cadence streams of recent readings, declared via `<link rel="alternate">` for autodiscovery - **`list_meetings()`**: a new MCP tool, the no-city variant of `meeting_index`. Bulk-pull or scan across cities by date range - **DefinedTerm schema**: meetings whose key signals reference a named pattern (the Quiet Revolution, the Bellwether Gas Station, the Six-Month Board Flip, the Self-Storage Canary, the Grandfather Window) now cite the brief that defines the pattern via `Article.about`. Cross-page entity graph density compounds. The civic record moves before the market reacts. Reading every meeting is now possible.
Subscriptions now drive a personalized feed. Click Follow on any place, corridor, brief, or meeting reading; `/feed` merges those direct watches with adjacent activity (briefs covering watched places, readings on watched corridors), recency-sorted into one stream with reason attribution per row. ### Follow on every artifact Every place dossier, corridor signal, signal brief, and meeting reading now carries a Follow toggle in its hero. The state flips optimistically: instant feedback, server reconciles in the background. Anonymous click routes to `/login` with the path and intent preserved; sign in and pick up exactly where you were. ### /feed: your personalized stream The feed merges five activity sources on every visit: - **Direct watches**: anything you've followed shows up in the stream - **Meetings on watched places**: a city you track had a planning meeting - **Meetings on watched corridors**: a corridor reading dropped - **Briefs covering watched places**: a named pattern names a place you follow - **Briefs covering watched corridors**: the same, at corridor scope Each row carries a reason attribution ("Brief covering a place you follow"), so the why is visible alongside the what. The stream isn't a flat list of titles; it's the temporal organism made personal. ### /account/watchlists: manage in one view Subscriptions grouped by type (Places · Corridors · Named patterns · Meeting readings). One-click unfollow on any row. Empty state guides into the indices. ### What this enables The same subscription primitive that drives the in-product feed will drive the Weekly Signal newsletter cadence. One follow shapes both surfaces. Future paid intelligence tiers will layer on top of this same primitive, and your watchlist becomes the personalization spine.
The observatory now recognizes returning readers. Sign in with Google or a password, and your watchlists persist across sessions and devices. ### Watchlists Mark any place dossier, corridor, meeting reading, or signal brief for ongoing attention. The watchlist surface at `/account/watchlists` collects everything you're tracking in one view. Named watchlists let you organize by project, jurisdiction, or any frame that suits the work. The signal is dense. The civic record moves in multiple directions at once. Watchlists give you a stable vantage point while the field shifts beneath it. ### Auth - **Email + password**: standard account with confirmation flow - **Google OAuth**: one click, no password to manage - **ProfileMenu**: avatar in the header shows sign-in state; dropdown links to watchlists, account, and sign out - **Session persistence**: Supabase Auth handles the cookie lifecycle; server components read the session at request time so no hydration flash ### Content gates Authentication never gates content. Every place dossier, corridor analysis, meeting reading, and signal brief is publicly readable. Auth is infrastructure for persistence (watchlists) and communication (newsletter and future alert cadences), not a paywall.
Two new access paths to the civic intelligence graph: one for human readers, one for AI agents. ### Semantic search `/search` accepts natural-language queries and returns ranked results from the full content corpus: place dossiers, corridors, meeting readings, and signal briefs. The ranking is powered by 1024-dimensional Voyage AI embeddings stored as `halfvec` in Supabase's pgvector extension. Queries embed at inference time via Voyage 4 Lite (the asymmetric query model); documents embed at build time via Voyage 4 (the asymmetric index model). The same embedding space makes the match precise without requiring exact terminology. Ask "aquifer recharge restrictions" and surface the Minneola water ordinance. Ask "density corridor commercial pressure" and find the US-27 corridor analysis. The query vocabulary doesn't need to match the source text; meaning does. ### MCP discovery server `/.well-known/mcp.json` exposes a public read-only MCP server for AI agents. Declared tools: - `describe_zoning_signal`: what this observatory is and what it covers - `list_cities`: all place dossiers with signal summary - `list_corridors`: cross-municipal corridor analyses - `current_named_patterns`: active signal patterns from the regional synthesis - `meeting_index`: meeting readings filtered by jurisdiction and date range - `describe_place` and `describe_corridor`: lens-aware projection per cognitive position - `semantic_search`: query the content corpus by meaning Perplexity, Claude, ChatGPT, and Gemini can now locate and traverse the observatory's intelligence graph without requiring a human intermediary. GEO (Generative Engine Optimization) is first-mover territory in civic intelligence; this surface is the mechanism. ### Cross-link resolver The bidirectional cross-link resolver connects related artifacts across the corpus. A meeting reading for Clermont's planning commission references the Clermont place dossier and the US-27 corridor automatically. Place dossiers surface related meeting readings and corridor analyses inline. The graph densifies as content grows.
Four index pages and the core navigation system that structures how the observatory is traversed. ### The Field (homepage) `/` is the observatory's entry point: a visual field constellation showing the civic intelligence graph as a spatial arrangement. Places, corridors, meetings, and briefs appear as positioned nodes in the field with signal-strength indicators. The layout algorithm distributes by signal intensity and proximity relationships, not alphabetical order. ### Four index pages Each content type has a dedicated index organized for its specific material: - **Places** (`/places`): place dossiers by signal strength, with jurisdiction, reading count, and development pressure summary - **Corridors** (`/corridors`): cross-municipal economic topology analyses, with municipal crosscurrents and infrastructure unlock status - **Readings** (`/meetings`): meeting readings in reverse chronological order, with jurisdiction, meeting type, and signal extraction count - **Briefs** (`/briefs`): named-pattern essays in publication order ### Lens system The lens switcher on index pages toggles the analytical frame: **Signal** (intelligence extracted), **Development** (physical-change pressure), **Infrastructure** (unlock and constraint conditions), and **Policy** (regulatory direction). The underlying data is identical across lenses; the frame shifts, not the evidence. ### Design chrome The full observatory aesthetic is live: dark field plate for navigation and editorial surfaces, parchment plate for reading surfaces, signal gold (amber) for active state, teal for navigation chrome. Cormorant Garamond carries page identity; IBM Plex Mono carries instrument metadata; Inter carries interface.
The launch surface shipped with one place dossier and one corridor. This release expands the corpus to four places, five named patterns, and three citation-grade meeting readings, and the entire visual system is now on the canonical Zoning Signal aesthetic. ### Content depth - **Four place dossiers**: Clermont, Minneola, Groveland, Leesburg. Each carries eight-projection lens content (synthesis plus seven analytical positions), a twelve-month signal drift, a six-node provenance chain, signal-strength score (0–100), and the city's regulatory state under Florida's SB 180. - **Five named-pattern briefs**: *The Quiet Revolution on Highway 27* · *The Self-Storage Canary* · *The Six-Month Board Flip* · *The Grandfather Window* · *The Bellwether Gas Station*. Each names a recurring shape in the regional record, anchored in real votes, real dates, real attribution. - **Three meeting readings**: Clermont's October 2025 7-Eleven denial (Wellness Way Design Standards enforced unanimously), Minneola's September 2025 gas-station 4-0 denial at the Hancock/CR-561A residential gateway, and Leesburg's December 2025 Planning Commission. Each follows the Citation Scaffold structure (BLUF · statistic · attribution · structured list · FAQPage schema). - **Field Atlas** at `/field/south-lake-florida`: the regional showpiece. Hero stat panel, regional map, twelve-month drift strip, places-in-field grid, corridors-in-motion grid, six-node visual provenance trail, MainThread coda. ### Design system The Anthropic claude.ai/design team built a complete brand system. We ported it whole: deep charcoal + signal gold + parchment palette tokens, three typefaces (Cormorant Garamond display, IBM Plex Mono instrument, Inter interface), and sixteen component primitives: Header, Footer, LensSwitcher (seven-lens), SourceTrail (visual provenance chain), DriftTimeline (twelve-month strip), StatPanel, MapPlate, PlaceCard, CorridorCard, and others. Maps generate via ChatGPT Image 2.0 with the prompt grammar codified at `/knowledge/design/MAP-ASSET-PIPELINE.md`; the cartographic-imagery skill at `intelligence-core/skills/cartographic-imagery/` is the universal craft, parameterized for Zoning Signal here. ### Per-page social cards Every place, corridor, brief, and meeting URL now generates its own OpenGraph card at request time: title, signal score, signal state line, all on the dark observatory plate. Sharing `/briefs/grandfather-window` on Slack or Twitter produces a Grandfather-Window-specific preview, not a generic site card. Favicon and apple-touch-icon use the woven-thread signal mark. ### Trust pages elevated `/method`, `/sources`, and `/built-by-mainthread` graduate from stub placeholders to substantive editorial. The Method essay names the four artifacts, the eight cognitive positions, the four-step source pipeline (Harvest → Standardize → Synthesize → Publish), and the validation discipline. Sources enumerates seventy-seven harvested documents across four cities and three planning boards, with verifiable portal links per jurisdiction.
The Zoning Signal Observatory is live. ### What this is A civic intelligence observatory for places in motion. The agendas, minutes, staff reports, and planning records that shape a region's future, read as a living atlas. The civic record moves before the market reacts; this surface makes that movement legible. The observatory publishes four artifact types: - **Place dossiers**: per-jurisdiction synthesis: current reading, signal strength, primary forces, development pressure zones, key entities (developers, attorneys, recurring parcels), source trail - **Corridor analyses**: cross-municipal economic topology: corridor thesis, pressure map, municipal crosscurrents, infrastructure unlocks, commercial gravity, residential expansion - **Meeting readings**: temporal artifacts: one per harvested meeting, plain-English summary, signal extraction, entity map, delta from prior reading - **Signal briefs**: named-pattern essays: one recurring shape in the civic record per essay, anchored in evidence from the regional corpus ### The pipeline behind it The intelligence comes from the NLAA (Natural Language Agent Application) at `zoning-signal/`, a harvest and synthesis pipeline operating across 19 Lake County jurisdictions since January 2024. 77 documents harvested. Four city syntheses. One regional synthesis. The observatory is the publishing surface; the NLAA is the engine. ### The domain `zoningsignal.com`: a standalone TLD. The decision not to use a subdomain of mainthread.ai is intentional: this surface builds its own search authority on civic-intelligence terms, not on the studio's domain. MainThread attribution is through JSON-LD entity graph and the footer, not the URL. ### SEO and AI-agent discoverability The observatory ships with full structured data (JSON-LD on every page), an explicit AI-crawler allow list in `robots.txt`, `llms.txt` and `llms-full.txt` for AI indexers, and the MCP discovery server at `/.well-known/mcp.json`. GEO (Generative Engine Optimization) alongside traditional SEO from day one, not retrofit. This is a live system. Content grows as the pipeline harvests. The signal sharpens with each reading.