diff --git a/CHANGELOG.md b/CHANGELOG.md index fe1136b..746685e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +> Windows delivery: this package is included in [MSI 1.7.0.1](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-windows-1.7.0.1); [installed acceptance](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/ACCEPTANCE-Windows-1.7.0.1.md) applies only to the identified artifact. Earlier entries retain their original release context. + + ## [0.2.3] - Unreleased naming candidate - Rename the principal distribution/import to the Townlight Zoning identities and pair with Townlight Core 1.3.0.dev2. diff --git a/README.md b/README.md index 0f94176..413876d 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,204 @@ -> **Prepared naming, Access and Notice candidate — 2 November 2026.** Build, signing, installed acceptance and publication remain pending. Earlier signed releases and receipts apply only to their identified artifacts. +Windows x64 Beta 1 · MSI 1.7.0.1 + +The signed [Windows x64 beta 1.7.0.1](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-windows-1.7.0.1) passed the documented fresh Windows Sandbox checks with synthetic data. + +- Townlight Zoning Manual + - Contents + - Using this manual + - Beta identity + - First run + - Daily workflow + - Connected workflows + - Architecture + - Discretionary processes and staff review + - Technical specifications + - Configuration and administration + - API and integration examples + - MCP and automation boundary + - Security and permissions + - Backup recovery and maintenance + - Troubleshooting + - Verified workflows and limits + - Terms of service and license + - Glossary + - Alphabetical subject index + - Source and document control + +# Townlight Zoning Manual + +**Townlight Beta 1** · Naming candidate documentation edition 2 November 2026 + +## Contents + +- [Using this manual](https://townlight.github.io/manuals/zoning.html#using-this-manual) +- [Beta identity](https://townlight.github.io/manuals/zoning.html#beta-identity) +- [First run](https://townlight.github.io/manuals/zoning.html#first-run) +- [Daily workflow](https://townlight.github.io/manuals/zoning.html#daily-workflow) +- [Connected workflows](https://townlight.github.io/manuals/zoning.html#connected-workflows) +- [Architecture](https://townlight.github.io/manuals/zoning.html#architecture) +- [Discretionary processes and staff review](https://townlight.github.io/manuals/zoning.html#discretionary-processes-and-staff-review) +- [Technical specifications](https://townlight.github.io/manuals/zoning.html#technical-specifications) +- [Configuration and administration](https://townlight.github.io/manuals/zoning.html#configuration-and-administration) +- [API and integration examples](https://townlight.github.io/manuals/zoning.html#api-and-integration-examples) +- [MCP and automation boundary](https://townlight.github.io/manuals/zoning.html#mcp-and-automation-boundary) +- [Security and permissions](https://townlight.github.io/manuals/zoning.html#security-and-permissions) +- [Backup recovery and maintenance](https://townlight.github.io/manuals/zoning.html#backup-recovery-and-maintenance) +- [Troubleshooting](https://townlight.github.io/manuals/zoning.html#troubleshooting) +- [Verified workflows and limits](https://townlight.github.io/manuals/zoning.html#verified-workflows-and-limits) +- [Terms of service and license](https://townlight.github.io/manuals/zoning.html#terms-of-service-and-license) +- [Glossary](https://townlight.github.io/manuals/zoning.html#glossary) +- [Alphabetical subject index](https://townlight.github.io/manuals/zoning.html#alphabetical-subject-index) +- [Source and document control](https://townlight.github.io/manuals/zoning.html#source-and-document-control) + +## Using this manual + +Townlight Zoning helps planners, land-use staff and authorized reviewers. Zoning combines local parcel geometry, cited zoning rules and staff review. It retains questions, corrections and snapshots with provenance so downstream staff can identify the precise evidence used. + +Staff should begin with First run and Daily workflow. Administrators should also read Architecture, Technical specifications, Configuration, Security and Recovery. Developers should use the exact API/data dictionary and examples. The table of contents and alphabetical subject index link to the relevant sections in the HTML edition; the PDF preserves headings and searchable text. An editable Word edition is included with the same documentation companion. + +## Beta identity -# Townlight Zoning +| Identity | Value | +|----|----| +| Documentation | Townlight Beta 1 naming, Access and Notice candidate | +| Intended installer version | 1.7.0.1 | +| Product component | townlight-zoning 0.2.3 | +| Principal import package | townlight_zoning | +| Native desktop source version | 1.7.0-1 | +| Candidate hashes | [SHA-256 checksums](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/SHA256SUMS-Windows-1.7.0.1.txt) and [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/ACCEPTANCE-Windows-1.7.0.1.md) | +| Current owned software license | AGPL-3.0-only | +| Acceptance composition | Fresh Windows x64 profile; inspections-preview; Station configured separately | -**Townlight Beta 1** · Naming candidate; component versions advanced · AGPL-3.0-only +Use an empty database and fresh Windows profile. The installer refuses legacy profile initialization. The approved profile path is `%LOCALAPPDATA%\CivicSuite`. Keep existing profiles and backups. -Zoning combines local parcel geometry, cited zoning rules and staff review. It retains questions, corrections and snapshots with provenance so downstream staff can identify the precise evidence used. +## First run -## Start here +1. Download the signed MSI, matching source companion and checksums from the [public Windows release](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-windows-1.7.0.1). +2. Verify the MSI hash and Authenticode publisher before installing on a fresh Windows profile. See the [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/ACCEPTANCE-Windows-1.7.0.1.md) for the tested setup. +3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. +4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. +5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. +6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. +7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. -Staff should use the operating manual. Administrators should read first-run, configuration and recovery before changing a deployment. Developers should read the exact API/schema reference and matching source companion. This edition describes the prepared source candidate; obtain its installer only after signing and installed acceptance identify the exact artifact. +## Daily workflow -- [Operating manual](docs/beta-1/manuals/zoning.html) · [Printable PDF](docs/beta-1/pdf/Townlight-Zoning-Manual-Beta-1.pdf) · [Editable Word manual](docs/beta-1/docx/Townlight-Zoning-Manual-Beta-1.docx) -- [API and data dictionary](docs/beta-1/api/zoning.html) · [OpenAPI JSON](docs/beta-1/api/zoning-openapi.json) -- [Product and suite directory](docs/beta-1/index.html) · [Terms and full license](docs/beta-1/terms.html) + -## Exact version and candidate +### 1. Prepare parcel data -| Identity | Value | -| --- | --- | -| Documentation | Townlight Beta 1 naming, Access and Notice candidate | -| Intended installer version | 1.7.0.1; build and acceptance pending | -| Native desktop source version | 1.7.0-1 | -| Product component | townlight-zoning 0.2.3 | -| Principal import package | townlight_zoning | -| Candidate hashes | Pending build, signing and installed acceptance | -| License | AGPL-3.0-only | +Use the complete supported bundle, including jurisdiction, dataset metadata and original hashes. The coordinates must be EPSG:4326. A loose geometry file is not the full source envelope. + + + +### 2. Import and inspect + +Check the complete source envelope before selecting Import parcel dataset. That control submits directly; inspect the saved validation/provenance result afterward. Correct a refused source bundle and preserve the evidence. Do not force acceptance by editing SQL. + + + +### 3. Register cited rules + +Associate the zone, rule kind/key and value with the relevant public Code section. Inspect overlays and effective context. Leave missing authority visible for planner review. -Use a fresh profile and empty database. Existing unmarked city data is refused before initialization; no in-place upgrade is supported. Preserve the existing `%LOCALAPPDATA%\CivicSuite` profile, data and recovery material. Historical releases retain their original identities. + -## What staff can do +### 4. Ask a parcel question -- **Prepare parcel data:** Use the complete supported bundle, including jurisdiction, dataset metadata and original hashes. The coordinates must be EPSG:4326. A loose geometry file is not the full source envelope. -- **Import and inspect:** Check the complete source envelope before selecting Import parcel dataset. That control submits directly; inspect the saved validation/provenance result afterward. Correct a refused source bundle and preserve the evidence. Do not force acceptance by editing SQL. -- **Register cited rules:** Associate the zone, rule kind/key and value with the relevant public Code section. Inspect overlays and effective context. Leave missing authority visible for planner review. -- **Ask a parcel question:** Look up the intended parcel and ask the supported question. Read the returned citation, applicability and disclaimer. Do not present an uncertain answer as an official decision. -- **Record review and context:** Record a correction and its reason when needed. Select permitted Meetings history explicitly. Preserve the question/review history and distinguish staff-only precedent from public material. -- **Create a snapshot:** Review the audience and exact content before creating the immutable snapshot. A public snapshot must satisfy its permitted-source contract; choosing a public label does not sanitize private notes. -- **Use it downstream:** Select the exact snapshot for Records or the permitted provider path. The receiving workflow rechecks visibility, source identity and hash before retaining or exporting it. +Look up the intended parcel and ask the supported question. Read the returned citation, applicability and disclaimer. Do not present an uncertain answer as an official decision. -## Operating procedures and examples + -The operating manual now includes these existing procedures, with synthetic inputs, readback and limits. Follow the actual app boundary identified there; a standalone source capability is not automatically a desktop screen. +### 5. Record review and context -- [Discretionary processes and staff review](docs/beta-1/manuals/zoning.html#discretionary-processes-and-staff-review). -- [Explain the cited process](docs/beta-1/manuals/zoning.html#explain-the-cited-process). -- [Keep parcel import and inspection in the right order](docs/beta-1/manuals/zoning.html#keep-parcel-import-and-inspection-in-the-right-order). -- [Use the existing specialist review contracts](docs/beta-1/manuals/zoning.html#use-the-existing-specialist-review-contracts). +Record a correction and its reason when needed. Select permitted Meetings history explicitly. Preserve the question/review history and distinguish staff-only precedent from public material. -## Architecture and data + + +### 6. Create a snapshot + +Review the audience and exact content before creating the immutable snapshot. A public snapshot must satisfy its permitted-source contract; choosing a public label does not sanitize private notes. + + + +### 7. Use it downstream + +Select the exact snapshot for Records or the permitted provider path. The receiving workflow rechecks visibility, source identity and hash before retaining or exporting it. + +### Working safely + +Use your own named account and save before leaving a screen. A saved draft is durable; unsaved form text may not be. If a write has an unknown result, reopen its record before repeating it. + +Read source jurisdiction, dates, citation, version and visibility. A copied source hash identifies exact bytes, not their legal applicability. If a source changes or permission is removed, resolve the source problem rather than substituting stale cached content. + +Keep originals and derivatives separate. Review the intended audience before export. A public summary excludes private fields only through the applicable copy contract and your review. A renamed private packet is still private content. + +Drafting, review, approval, attachment, export, fulfillment and publication are separate operations. A Townlight workpaper does not itself adopt law, issue a permit, impose a fine or release a records response. The responsible staff member records the applicable decision. + +## Connected workflows + +Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting. + +| Direction | Material | +|----|----| +| Input | A supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset metadata, public Code authority and permitted meeting evidence. | +| Output | Source-backed parcel context, informational answers, recorded human corrections and reviewed snapshots with stable hashes. | + +### Product boundary + +The accepted path is local GeoJSON/PostGIS. It does not establish every ArcGIS, assessor or CKAN connector. Answers and process explanations are informational and do not issue an entitlement or an official zoning determination. + +## Architecture + +
+Townlight Zoning architecture and evidence flow + +
+ +The drawing shows the principal staff/evidence path. Native commands carry trusted identity to Python business services; PostgreSQL and retained original files hold durable state. A downstream copy does not silently transfer decision authority. Station has its own configured authority/media boundary, database and mutable files. The connected-workflow text supplies the drawing’s reading order and accessibility alternative. + +## Discretionary processes and staff review + +### Explain the cited process + +In the existing Zoning workspace, complete **Variance, conditional use or nonconformity question**. Supply the applicable process **Code section**, **zone code**, optional comma-separated **standard to cite**, and optional **observed condition**, for example `front_setback=8 feet`. Select **Explain the cited process**. Choose actual imported public authority; the synthetic values below require matching synthetic sources to return supported guidance. + +The mounted API is `POST /desktop/v1/zoning/standards/process-explanation` under the normal authenticated staff session. Its equivalent request body is: + +``` json +{"question":"Explain the synthetic variance process","process_section":"18.20.050","zone_code":"SYN-R","rule_types":["front_setback"],"observed":{"front_setback":"8 feet"}} +``` + +Read process citations and each cited standard independently. The output can explain a verified process while reporting unavailable standards or review flags. A difference between an observation and a cited standard is an informational flag; it is not a variance finding, approval, nonconformity determination or substitute for planner review. If no relevant authority is available, obtain the source or leave the item unavailable. Do not attach an unrelated citation to a proposed requirement. + +### Keep parcel import and inspection in the right order + +Check the complete JSON envelope, original hashes and EPSG:4326 geometry before submitting **Import parcel dataset**. That control sends the import directly; it does not open a separate preview/commit screen. Inspect the returned validation/provenance and saved dataset. The browser refuses bundle files larger than 20 MiB; valid geometry and metadata remain subject to server validation. Correct the source bundle after a refusal and retain earlier evidence rather than forcing SQL changes. + +### Use the existing specialist review contracts + +The standalone Zoning application’s review/analytics/report routes are documented source capabilities, not extra native desktop screens. In a deployment where its actual staff authentication is already configured: + +- Create an ambiguity review with `zone_code`, `question` and `reason` at `/api/v1/townlight_zoning/staff/ambiguity-reviews`. Read its returned ID and list state. Update that ID with `status`, optional `assigned_to` and `resolution`; use `open`, `in_review`, `resolved` or `closed`. Resolving or closing requires a nonempty `resolution`. +- Retain a flagged answer at `/api/v1/townlight_zoning/staff/flagged-answers` with the original question/answer, zone, flag reason and source citations. Use `/{review_id}/improve` with `improved_answer` and `improvement_notes`. Preserve the original and improvement attribution; a correction does not rewrite the imported Code source. +- Read `/api/v1/townlight_zoning/staff/questions/analytics` with the desired `high_volume_threshold` to identify repeated questions and uncertain answers. Analytics counts are review aids, not jurisdictional conclusions. +- Create `/api/v1/townlight_zoning/staff/reports/outline` with a title and actual selected `question_ids`/`queue_item_ids`. Review the resulting outline and citations before incorporating it in a staff report. It is not a filed report or a meeting decision. + +A synthetic ambiguity request is: + +``` json +{"zone_code":"SYN-R","question":"Which retained setback rule applies?","reason":"Synthetic overlay ambiguity requires planner review"} +``` + +Do not send invented staff-role headers or assume these standalone paths exist at the installed desktop origin. The native workspace’s supported review/history/snapshot controls continue to use its fixed authenticated bridge. Use the technical supplement to distinguish the two surfaces. + +Source contracts: `townlight_runtime/zoning_bridge.py`, `townlight_zoning/main.py`, the imported rule/source models and desktop Zoning view. + +## Technical specifications ### Runtime and storage -This prepared source candidate targets **Windows x64 fresh installation**. Its native shell uses **Rust 2021, Tauri 2 and Microsoft WebView2**; browser assets are JavaScript built with **Vite 8.1.6**. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled **CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic**, with **PostgreSQL 17 / PostGIS** and managed original files. The prior accepted runtime contained FastAPI 0.162.0; this changed candidate requires its own installed dependency verification. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. +The accepted package targets **Windows x64 fresh installation**. Its native shell uses **Rust 2021, Tauri 2 and Microsoft WebView2**; browser assets are JavaScript built with **Vite 8.1.6**. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled **CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic**, with **PostgreSQL 17 / PostGIS** and managed original files. The installed runtime tested here contains FastAPI 0.162.0. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. The native transport is fixed to loopback `127.0.0.1:15480`; PostgreSQL uses the configured local runtime port (default `15432`). Optional local model service defaults to `127.0.0.1:15434`. Those are deployment defaults, not internet endpoints. The runtime has health, module and readiness endpoints; readiness is stronger than process existence. The task queue is the existing local Core task infrastructure, not an assertion that a separate Redis service is required for this desktop composition. @@ -65,30 +212,12 @@ Versioned saves use expected prior revision identifiers where defined. Reopen an ### Capacity and platform statements -This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The new installer size remains pending its build; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. - -The exact [runtime payload lock](docs/beta-1/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](docs/beta-1/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. - - -| Data contract | Description | -| --- | --- | -| Input | A supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset metadata, public Code authority and permitted meeting evidence. | -| Retained records | GeoJSON import datasets; parcels and zone/overlay context; cited rules; questions and answers; review events; selected Meetings history; immutable snapshots. | -| Output | Source-backed parcel context, informational answers, recorded human corrections and reviewed snapshots with stable hashes. | -| Connections | Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting. | - +This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The signed MSI is 2,082,697,216 bytes; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. -## Setup and operation +The exact [runtime payload lock](https://townlight.github.io/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](https://townlight.github.io/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. -1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. -2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. Installed acceptance for this source candidate remains pending; no in-place legacy upgrade is supported. -3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. -4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. -5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. -6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. -7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. +## Configuration and administration -## Configuration ### Native deployment configuration Use Setup, Settings and System Health for supported staff operation. Administrators provision folders, backup storage, named accounts and the city profile. Select `inspections-preview` for the bounded desktop composition, including Access and Notice. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. @@ -97,12 +226,13 @@ Technical deployments use `TOWNLIGHT_PRODUCT_PROFILE`, `TOWNLIGHT_PROFILE_ROOT`, The isolated documentation exporter sets a fictional profile and unusable synthetic database origin only to read schemas; those values are not deployment configuration. Keep deployment values in the intended process/account scope. An already-running process does not automatically inherit later environment edits. -## API usage +## API and integration examples + ### Native command example The following JavaScript belongs in the existing trusted Townlight frontend/development environment with `invoke` imported from `@tauri-apps/api/core`. It is not a command for an arbitrary web page or an instruction for nontechnical staff. IDs must come from records created in an isolated synthetic exercise. -```javascript +``` javascript import { invoke } from '@tauri-apps/api/core'; const result = await invoke('zoning_domain_request', {request: {operation: 'history', id: questionId}}); console.log(result); @@ -112,7 +242,7 @@ console.log(result); An administrator/developer can inspect an already-configured isolated runtime from a trusted local process. This PowerShell example reads the signed-in synthetic profile’s existing proof into memory; it does not create a user, seed a session, reveal the proof in output or bypass a permission check. Do not use real city data in development examples. A read response does not prove approval or publication. -```powershell +``` powershell $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite' $sessionPath = Join-Path $profilePath 'config\local-session.json' $session = Get-Content -LiteralPath $sessionPath -Raw | ConvertFrom-Json @@ -123,13 +253,13 @@ Remove-Variable session, headers ### Complete synthetic source bundle -The [synthetic Zoning bundle](docs/beta-1/reference/examples/synthetic-geo-bundle.json) is the retained fixture used by the beta staff exercise. It includes the complete supported source envelope rather than a shortened pseudo-payload. Keep its fictional source labels. For Planning, wrap it as `{"bundle": BUNDLE, "expected_previous_revision": null}`; for Permitting use `{"bundle": BUNDLE, "expected_revision": null}`. Code and Zoning take their own complete import envelopes. Replace null with the current expected revision when revising an existing source, as the applicable schema requires. These are import examples, not legal authority or permission to load them into a live city profile. +The [synthetic Zoning bundle](https://townlight.github.io/reference/examples/synthetic-geo-bundle.json) is the retained fixture used by the beta staff exercise. It includes the complete supported source envelope rather than a shortened pseudo-payload. Keep its fictional source labels. For Planning, wrap it as `{"bundle": BUNDLE, "expected_previous_revision": null}`; for Permitting use `{"bundle": BUNDLE, "expected_revision": null}`. Code and Zoning take their own complete import envelopes. Replace null with the current expected revision when revising an existing source, as the applicable schema requires. These are import examples, not legal authority or permission to load them into a live city profile. ### A synthetic write with subsequent readback This example demonstrates the existing Meetings HTTP contract in an isolated exercise. It is intentionally fictional. It does not start a service. Its authentication setup is included so it can be run independently under the signed-in synthetic account. If a write times out, inspect current records before repeating it. -```powershell +``` powershell $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite' $sessionPath = Join-Path $profilePath 'config/local-session.json' $session = Get-Content -LiteralPath $sessionPath -Raw | ConvertFrom-Json @@ -151,7 +281,11 @@ Remove-Variable session, headers This write requires Meetings to be enabled and the signed-in staff role to permit it. It is a cross-suite integration example; for this product’s request models, use the complete technical reference below. -## MCP status +### Complete technical contract + +Read the [Zoning API reference](https://townlight.github.io/api/zoning.html) for every documented operation, request field, constraint, response declaration and source supplement. Download the [OpenAPI JSON](https://townlight.github.io/api/zoning-openapi.json) for tools. For Station this is the suite-side schema only; its separate service contract is documented in the API supplement. The [reference directory](https://townlight.github.io/reference/index.html) includes configuration/source inventories, dependency declarations, native command contracts, MCP signatures and candidate evidence. + +## MCP and automation boundary No direct product MCP server is exposed by the accepted Townlight desktop or Station boundary. Do not configure an invented `townlight mcp` command or assume an AI client has staff permissions. The integration surfaces for this beta are native IPC, the documented HTTP APIs, source bundle imports, exact exports and the existing Station CLI. @@ -159,59 +293,186 @@ The bundled transcription code includes a **TextFlowKit MCP adapter** as a separ For a transcription client already provisioned separately, an illustrative tool call is: -```json +``` json {"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} ``` -Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the [MCP source reference](docs/beta-1/reference/mcp.html). Station meeting capture does not become live speech recognition because this optional donor adapter exists. +Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the [MCP source reference](https://townlight.github.io/reference/mcp.html). Station meeting capture does not become live speech recognition because this optional donor adapter exists. + +## Security and permissions + +Use your own named account and save before leaving a screen. A saved draft is durable; unsaved form text may not be. If a write has an unknown result, reopen its record before repeating it. + +Read source jurisdiction, dates, citation, version and visibility. A copied source hash identifies exact bytes, not their legal applicability. If a source changes or permission is removed, resolve the source problem rather than substituting stale cached content. + +Keep originals and derivatives separate. Review the intended audience before export. A public summary excludes private fields only through the applicable copy contract and your review. A renamed private packet is still private content. + +Drafting, review, approval, attachment, export, fulfillment and publication are separate operations. A Townlight workpaper does not itself adopt law, issue a permit, impose a fine or release a records response. The responsible staff member records the applicable decision. + +The native session is validated and mapped to a persisted SQL identity. An editable actor/reviewer label is not authentication. Product/module permissions and source visibility apply at the server boundary. Revoked/unavailable authority fails closed for new Station operations; a previous permission result is not a perpetual authorization. + +Use protected local folders, account permissions and credential storage. Never include the native session file, database passwords, provider keys or unredacted support bundles in a public issue or generated public documentation. A local public view is not automatically a secured internet deployment. Keep network exposure and real equipment acceptance specific to the chosen beta site. + +## Backup recovery and maintenance + +Save work and use Core’s canonical **Backup Now** before maintenance. That operation stops writers. Preserve the coherent profile/database/document backup and its receipt, then use **Start** to resume. A source export is not a full backup. + +Use **Restore Latest Backup** through the supported controls. If the result says **Restore needs service start**, use **Start**, then **Check**, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. + +Keep Station’s dedicated database and media evidence together in its own backup. Core’s native-profile backup must not be assumed to include an external Station data directory. Stop writers during a coordinated backup. Preserve failed media attempts and logs. + +On failure, record the time, selected composition, component/installer versions and exact message. Check System Health for stopped, starting, ready or failed dependencies. Use the existing Retry control after readiness; do not create duplicate business records to refresh a stale view. Share only a redacted diagnostic bundle. Preserve secrets, original evidence, recovery material and unrelated installations. + +## Troubleshooting + +| Symptom | Likely meaning | Next action | +|----|----|----| +| Workspace absent | Wrong product composition or unavailable canonical runtime. | Check selected composition; activate through Finish Records Migration; wait for readiness. | +| Cannot sign in / 401 | Missing or expired named account session. | Sign in normally; reopen a Station launch ticket if applicable. | +| Permission denied / 403 | Account, module, source or browser-origin permission. | Ask the authorized administrator to inspect the intended permission; do not invent role headers. | +| Save conflict / 409 | The saved revision, expected source hash or lifecycle changed. | Keep edits, reopen current state and reconcile deliberately. | +| Invalid input / 422 | Required field, format, geometry, source envelope or state is invalid. | Read the field detail and correct the input/source; preserve originals. | +| Service unavailable / 503 | Database, schema, connected source or configuration unavailable. | Inspect System Health and the named dependency. Preserve work; retry only after readiness. | +| Export refused | Missing exact review, approval, audience or source authorization. | Read the refusal and complete the owning product’s explicit decision. | +| Restore needs service start | The snapshot was restored but services have not resumed. | Use Start, then Check and verify a saved record; do not blindly repeat restore. | -## Verification and known limits +## Verified workflows and limits | Product | Recorded result | Precisely exercised | -| --- | --- | --- | +|----|----|----| | Zoning | PASS | GeoJSON/PostGIS import, cited dimensional rule, parcel answer, staff review/history/snapshot and native workspace. | - These results come from the identified signed candidate’s fresh normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source bundles and media were synthetic. The guest install/uninstall and recovery passed, and the owned Sandbox stopped. No host installed application or standalone CivicCast was changed. This documentation task reuses those receipts; it does not claim a new software acceptance run. -The [workflow matrix](docs/beta-1/reference/workflow-matrix.json) identifies raw receipt filenames. The [evidence index](docs/beta-1/reference/sandbox-evidence-index.json) retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. +See the [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/ACCEPTANCE-Windows-1.7.0.1.md) for this MSI. The historical [evidence index](https://townlight.github.io/reference/sandbox-evidence-index.json) applies to its original build. The limits remain: actual city field acceptance and equipment/network commissioning; Station automatic provisioning/SCM commissioning; every UI/role combination; field recognition accuracy; and historical in-place upgrades are not certified. They are not five invented feature requirements. Fresh-install controlled beta handoff remains the accepted scope. This package makes no city-deployment, publication or general-availability claim. -The accepted path is local GeoJSON/PostGIS. It does not establish every ArcGIS, assessor or CKAN connector. Answers and process explanations are informational and do not issue an entitlement or an official zoning determination. +## Terms of service and license -## Development and repository map +### Scope and status -Use the corresponding source for the candidate rather than assuming the public default branch matches it. The source companion contains `installed-owned-source`, product build inputs, desktop Rust/browser sources, locks and `BUILD.md`. It excludes credentials and third-party binary/model payloads. Use the recorded runtime lock when reproducing packaging. +These terms describe the Townlight Beta 1 software and this documentation package. This public Windows beta is for evaluation. No uptime commitment, support response time, indemnity, data-processing agreement or paid service is created by these documents. A separate signed agreement, if any, governs services it actually provides. -Relevant source contracts: +### Software license and rights -- `townlight_zoning/geo_import.py` -- `townlight_zoning/discretionary.py` -- `townlight_runtime/zoning_bridge.py` -- `townlight_runtime/zoning_records.py` +Current Townlight-owned distributions identified in this candidate use **AGPL-3.0-only**. The full license is supplied with this documentation and with the source companion. The license governs rights to run, copy, modify and convey the covered software; these operational terms do not add restrictions to those rights. Historical grants and dependency licenses retain their own terms. CivicCast remains a separate product and is not relicensed by this documentation work. -The desktop package defines `npm run build`, `npm test`, `npm run test:browser` and its Tauri command. Python products retain their own `pyproject.toml`, tests and migrations; use the matching checkout’s declared dependencies and test configuration. Do not run a sample server against a production profile. This documentation build validates documentation only and reuses the separately identified installed acceptance; it does not claim a new complete application CI run. +When conveying covered software, retain applicable notices and provide the corresponding source and installation/build information required by the license. For a modified version supporting remote network interaction, follow section 13’s source-offer requirement. The companion archive identifies the source for this candidate; a link to a different public branch is not a substitute for the matching source. Read the supplied license for the complete conditions. See the [GNU license reference](https://www.gnu.org/licenses/agpl-3.0.html) and [GNU licensing FAQ](https://www.gnu.org/licenses/gpl-faq.en.html). -## Recovery and support +### Data ownership and access -Save work and use Core’s canonical **Backup Now** before maintenance. That operation stops writers. Preserve the coherent profile/database/document backup and its receipt, then use **Start** to resume. A source export is not a full backup. +Importing a document does not transfer its ownership or grant permission to publish it. The operating organization controls its accounts, access decisions, lawful source use, retention and review/release policy. Keep resident information, credentials, private notes and restricted evidence in their authorized locations. Documentation examples contain fictional data. No real city account, credential or record is required to exercise these examples in an isolated test environment. -Use **Restore Latest Backup** through the supported controls. If the result says **Restore needs service start**, use **Start**, then **Check**, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. +### Local operation and external processors -Keep Station’s dedicated database and media evidence together in its own backup. Core’s native-profile backup must not be assumed to include an external Station data directory. Stop writers during a coordinated backup. Preserve failed media attempts and logs. +The accepted beta workflow is local and uses named staff accounts. Station has separate storage and credentials. Configure backup destinations and optional model/network providers deliberately. A configured external provider may receive submitted prompts, images or audio according to that configuration and provider’s terms; this documentation does not promise that every optional configuration is offline. An email outbox or local public view does not establish external delivery or an internet deployment. This static documentation site has no analytics, account collection or remote font dependency. + +### Staff decisions and source applicability + +Staff verify the jurisdiction, source currency, permissions, citations and proposed audience. Model output and generated guidance require review. No draft is automatically an official legal interpretation, zoning determination, permit approval, fee assessment, enforcement notice or records-release decision. Official permit fee authority remains with the adopted source and responsible organization; imported amounts do not become a new authoritative calculation. + +### Beta operation and recovery + +Use the identified candidate in its supported fresh-install scope. Preserve backups and original evidence. Test physical equipment and chosen network/service configuration before relying on them. The supplied acceptance describes selected synthetic workflows, not every screen, vendor, field condition or upgrade. Operators decide whether a particular deployment meets their own operational obligations. + +### Warranty and liability + +The covered software’s warranty and liability conditions are those in sections 15–17 of the supplied AGPL and any applicable separate written undertaking. This documentation creates no additional warranty or limitation beyond those terms. Third-party software is subject to its retained license notices. Nothing here removes rights that applicable law makes nonwaivable. + +### Support and incident reporting + +Use the project’s existing SUPPORT and SECURITY guidance for its matching repository. Report reproducible behavior with the version, operation and redacted logs. Do not put credentials, resident records or unredacted evidence in a public issue. Coordinate sensitive reports through the channel designated in SECURITY. No new support address or service commitment is invented here. + +### Ending a beta exercise and document changes + +When an organization ends testing, it controls retention/export and removes access according to its policy. Uninstall may retain data; back up and inspect the selected removal options. Ending an exercise does not revoke rights already granted by AGPL. Later software/documentation versions must identify their changed candidate and scope; historical receipts retain their original identities. These terms do not claim that a city has accepted a contract merely by reading a manual. + +## Glossary + +| Term | Meaning | +|----|----| +| Approval | An explicit authorized decision on the saved text/artifact. It is separate from saving or attachment. | +| Canonical record | The owning product’s retained identity and saved version, rather than an editable copied label. | +| Composition | The selected set of desktop modules; inspections-preview exposes the eight staff products. | +| Corresponding source | The source/build material matching the delivered covered program, subject to its license. | +| Derivative / Records copy | A separately prepared document with its own intended audience and hash. | +| Hash / SHA256 | A fingerprint of exact bytes. It detects change; it does not establish legal authority. | +| Idempotency | Repeating the same identified request has the same intended effect; changing its payload can be refused. | +| IPC | The native desktop command boundary between its browser interface and Rust host. | +| MCP | Model Context Protocol; no direct Townlight product server is enabled by this beta. | +| Original | Retained source bytes. A reviewed derivative does not replace them. | +| Provenance | Source, version, date, actor and relationship information retained with evidence. | +| Revision | An immutable saved version. Later edits do not inherit an earlier review automatically. | +| Snapshot | A fixed audience-specific copy tied to a source/reviewed revision. | +| Station | Townlight’s separate media boundary using a pinned CivicCast-derived engine; standalone CivicCast remains separate. | + +## Alphabetical subject index + +- **Accounts and authentication** — [Security and permissions](https://townlight.github.io/manuals/zoning.html#security-and-permissions). +- **AGPL and source** — [Terms of service and license](https://townlight.github.io/manuals/zoning.html#terms-of-service-and-license). +- **API contracts** — [API and integration examples](https://townlight.github.io/manuals/zoning.html#api-and-integration-examples). +- **Architecture** — [Architecture](https://townlight.github.io/manuals/zoning.html#architecture). +- **Backup** — [Backup recovery and maintenance](https://townlight.github.io/manuals/zoning.html#backup-recovery-and-maintenance). +- **Beta version** — [Beta identity](https://townlight.github.io/manuals/zoning.html#beta-identity). +- **Configuration** — [Configuration and administration](https://townlight.github.io/manuals/zoning.html#configuration-and-administration). +- **Evidence and acceptance** — [Verified workflows and limits](https://townlight.github.io/manuals/zoning.html#verified-workflows-and-limits). +- **Fees and official decisions** — [Terms of service and license](https://townlight.github.io/manuals/zoning.html#terms-of-service-and-license). +- **First run** — [First run](https://townlight.github.io/manuals/zoning.html#first-run). +- **Handoffs and audience** — [Connected workflows](https://townlight.github.io/manuals/zoning.html#connected-workflows). +- **MCP** — [MCP and automation boundary](https://townlight.github.io/manuals/zoning.html#mcp-and-automation-boundary). +- **Originals and provenance** — [Security and permissions](https://townlight.github.io/manuals/zoning.html#security-and-permissions). +- **Recovery** — [Backup recovery and maintenance](https://townlight.github.io/manuals/zoning.html#backup-recovery-and-maintenance). +- **Staff procedures** — [Daily workflow](https://townlight.github.io/manuals/zoning.html#daily-workflow). +- **Station configuration** — [Configuration and administration](https://townlight.github.io/manuals/zoning.html#configuration-and-administration). +- **Technical stack** — [Technical specifications](https://townlight.github.io/manuals/zoning.html#technical-specifications). +- **Troubleshooting** — [Troubleshooting](https://townlight.github.io/manuals/zoning.html#troubleshooting). + +### Operating subject links + +- **Discretionary processes and staff review** — [Discretionary processes and staff review](https://townlight.github.io/manuals/zoning.html#discretionary-processes-and-staff-review). +- **Explain the cited process** — [Explain the cited process](https://townlight.github.io/manuals/zoning.html#explain-the-cited-process). +- **Keep parcel import and inspection in the right order** — [Keep parcel import and inspection in the right order](https://townlight.github.io/manuals/zoning.html#keep-parcel-import-and-inspection-in-the-right-order). +- **Use the existing specialist review contracts** — [Use the existing specialist review contracts](https://townlight.github.io/manuals/zoning.html#use-the-existing-specialist-review-contracts). + +## Source and document control + +This edition is authored from the immutable corresponding-source companion, the generated installed-domain schema and the retained workflow receipts. The current software versions and signed artifacts are unchanged. Public historical pages are not synchronized or published by this local documentation task. + +### Workflow subject index + +- **Ask a parcel question** — [Daily workflow, step 4](https://townlight.github.io/manuals/zoning.html#workflow-4). + +- **Create a snapshot** — [Daily workflow, step 6](https://townlight.github.io/manuals/zoning.html#workflow-6). + +- **Import and inspect** — [Daily workflow, step 2](https://townlight.github.io/manuals/zoning.html#workflow-2). + +- **Prepare parcel data** — [Daily workflow, step 1](https://townlight.github.io/manuals/zoning.html#workflow-1). + +- **Record review and context** — [Daily workflow, step 5](https://townlight.github.io/manuals/zoning.html#workflow-5). + +- **Register cited rules** — [Daily workflow, step 3](https://townlight.github.io/manuals/zoning.html#workflow-3). + +- **Use it downstream** — [Daily workflow, step 7](https://townlight.github.io/manuals/zoning.html#workflow-7). + +- [Source inventory and file hashes](https://townlight.github.io/reference/source-inventory.json) + +- [All component metadata](https://townlight.github.io/reference/component-metadata.json) + +- [Installed domain OpenAPI](https://townlight.github.io/reference/desktop-domain-openapi.json) + +- [Workflow matrix](https://townlight.github.io/reference/workflow-matrix.json) + +- [Full AGPL text](https://townlight.github.io/reference/AGPL-3.0.txt) -On failure, record the time, selected composition, component/installer versions and exact message. Check System Health for stopped, starting, ready or failed dependencies. Use the existing Retry control after readiness; do not create duplicate business records to refresh a stale view. Share only a redacted diagnostic bundle. Preserve secrets, original evidence, recovery material and unrelated installations. -## Prepared package installation +## Source package installation -The renamed distributions are not yet published on a package index. Use the -matching verified candidate wheel directory, not a renamed historical release -URL. Installation of these Python packages is a developer/package check; +Use locally built wheels from the exact component sources in the corresponding-source companion and verify their hashes. Do not relabel historical release assets. Installation of these Python packages is a developer/package check; the signed Windows MSI and its installed acceptance remain separate. In a new Windows virtual environment, replace the example wheel-directory path -with the directory accompanying this candidate and verify its SHA256 manifest: +with your locally built wheel directory from the matching pinned source and verify its SHA256 manifest: ```powershell python -m venv .venv diff --git a/README.txt b/README.txt index 2961a6c..5467a09 100644 --- a/README.txt +++ b/README.txt @@ -1,111 +1,379 @@ - Prepared naming, Access and Notice candidate — 2 November 2026. Build, signing, installed acceptance and publication remain pending. Earlier signed releases and receipts apply only to their identified artifacts. +Windows x64 Beta 1 · MSI 1.7.0.1 + +The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows +Sandbox checks with synthetic data. + +- Townlight Zoning Manual + - Contents + - Using this manual + - Beta identity + - First run + - Daily workflow + - Connected workflows + - Architecture + - Discretionary processes and staff review + - Technical specifications + - Configuration and administration + - API and integration examples + - MCP and automation boundary + - Security and permissions + - Backup recovery and maintenance + - Troubleshooting + - Verified workflows and limits + - Terms of service and license + - Glossary + - Alphabetical subject index + - Source and document control + +Townlight Zoning Manual + +Townlight Beta 1 · Naming candidate documentation edition 2 November +2026 + +Contents + +- Using this manual +- Beta identity +- First run +- Daily workflow +- Connected workflows +- Architecture +- Discretionary processes and staff review +- Technical specifications +- Configuration and administration +- API and integration examples +- MCP and automation boundary +- Security and permissions +- Backup recovery and maintenance +- Troubleshooting +- Verified workflows and limits +- Terms of service and license +- Glossary +- Alphabetical subject index +- Source and document control + +Using this manual + +Townlight Zoning helps planners, land-use staff and authorized +reviewers. Zoning combines local parcel geometry, cited zoning rules and +staff review. It retains questions, corrections and snapshots with +provenance so downstream staff can identify the precise evidence used. + +Staff should begin with First run and Daily workflow. Administrators +should also read Architecture, Technical specifications, Configuration, +Security and Recovery. Developers should use the exact API/data +dictionary and examples. The table of contents and alphabetical subject +index link to the relevant sections in the HTML edition; the PDF +preserves headings and searchable text. An editable Word edition is +included with the same documentation companion. + +Beta identity + + Identity Value + -------------------------------- ------------------------------------------------------------------------------- + Documentation Townlight Beta 1 naming, Access and Notice candidate + Intended installer version 1.7.0.1 + Product component townlight-zoning 0.2.3 + Principal import package townlight_zoning + Native desktop source version 1.7.0-1 + Candidate hashes SHA-256 checksums and Windows acceptance summary + Current owned software license AGPL-3.0-only + Acceptance composition Fresh Windows x64 profile; inspections-preview; Station configured separately + +Use an empty database and fresh Windows profile. The installer refuses +legacy profile initialization. The approved profile path is +%LOCALAPPDATA%\CivicSuite. Keep existing profiles and backups. + +First run + +1. Download the signed MSI, matching source companion and checksums + from the public Windows release. +2. Verify the MSI hash and Authenticode publisher before installing on + a fresh Windows profile. See the Windows acceptance summary for the + tested setup. +3. Launch Townlight under the intended named Windows account. Choose + the storage folders. Select Townlight Inspections candidate + (inspections-preview) for the bounded desktop composition, including + Access and Notice. A narrower default selection will not expose all + workspaces. +4. Enter the city profile, time zone and contacts. Create the first + named local administrator, sign in and choose protected backup + storage. Continue without local AI is valid for the deterministic + workflows. +5. Run Health Check and wait for readiness. Open Townlight. In System + Health select Finish Records Migration to activate the canonical + Python/PostgreSQL runtime. Do not fabricate migration receipts or + seed accounts. +6. Create named staff through Settings. Import authorized sources using + each product’s source library. All examples in this package are + synthetic; they are not municipal authority. +7. Provision Station separately if it is part of the beta exercise. + Selecting the desktop composition does not start or configure + Station. Configure vision explicitly only if automatic photo + drafting is selected. + +Daily workflow + +1. Prepare parcel data + +Use the complete supported bundle, including jurisdiction, dataset +metadata and original hashes. The coordinates must be EPSG:4326. A loose +geometry file is not the full source envelope. + +2. Import and inspect + +Check the complete source envelope before selecting Import parcel +dataset. That control submits directly; inspect the saved +validation/provenance result afterward. Correct a refused source bundle +and preserve the evidence. Do not force acceptance by editing SQL. + +3. Register cited rules + +Associate the zone, rule kind/key and value with the relevant public +Code section. Inspect overlays and effective context. Leave missing +authority visible for planner review. + +4. Ask a parcel question + +Look up the intended parcel and ask the supported question. Read the +returned citation, applicability and disclaimer. Do not present an +uncertain answer as an official decision. + +5. Record review and context + +Record a correction and its reason when needed. Select permitted +Meetings history explicitly. Preserve the question/review history and +distinguish staff-only precedent from public material. + +6. Create a snapshot + +Review the audience and exact content before creating the immutable +snapshot. A public snapshot must satisfy its permitted-source contract; +choosing a public label does not sanitize private notes. + +7. Use it downstream + +Select the exact snapshot for Records or the permitted provider path. +The receiving workflow rechecks visibility, source identity and hash +before retaining or exporting it. + +Working safely + +Use your own named account and save before leaving a screen. A saved +draft is durable; unsaved form text may not be. If a write has an +unknown result, reopen its record before repeating it. + +Read source jurisdiction, dates, citation, version and visibility. A +copied source hash identifies exact bytes, not their legal +applicability. If a source changes or permission is removed, resolve the +source problem rather than substituting stale cached content. + +Keep originals and derivatives separate. Review the intended audience +before export. A public summary excludes private fields only through the +applicable copy contract and your review. A renamed private packet is +still private content. + +Drafting, review, approval, attachment, export, fulfillment and +publication are separate operations. A Townlight workpaper does not +itself adopt law, issue a permit, impose a fine or release a records +response. The responsible staff member records the applicable decision. + +Connected workflows + +Consumes Code authority and permitted Meetings evidence. Supplies +permitted snapshots to Records and context to Planning and Permitting. + + Direction Material + ----------- ---------------------------------------------------------------------------------------------------------------------------------- + Input A supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset metadata, public Code authority and permitted meeting evidence. + Output Source-backed parcel context, informational answers, recorded human corrections and reviewed snapshots with stable hashes. + +Product boundary + +The accepted path is local GeoJSON/PostGIS. It does not establish every +ArcGIS, assessor or CKAN connector. Answers and process explanations are +informational and do not issue an entitlement or an official zoning +determination. + +Architecture + +The drawing shows the principal staff/evidence path. Native commands +carry trusted identity to Python business services; PostgreSQL and +retained original files hold durable state. A downstream copy does not +silently transfer decision authority. Station has its own configured +authority/media boundary, database and mutable files. The +connected-workflow text supplies the drawing’s reading order and +accessibility alternative. -Townlight Zoning +Discretionary processes and staff review -Townlight Beta 1 · Naming candidate; component versions advanced · AGPL-3.0-only +Explain the cited process -Zoning combines local parcel geometry, cited zoning rules and staff review. It retains questions, corrections and snapshots with provenance so downstream staff can identify the precise evidence used. +In the existing Zoning workspace, complete Variance, conditional use or +nonconformity question. Supply the applicable process Code section, zone +code, optional comma-separated standard to cite, and optional observed +condition, for example front_setback=8 feet. Select Explain the cited +process. Choose actual imported public authority; the synthetic values +below require matching synthetic sources to return supported guidance. -Start here +The mounted API is POST /desktop/v1/zoning/standards/process-explanation +under the normal authenticated staff session. Its equivalent request +body is: -Staff should use the operating manual. Administrators should read first-run, configuration and recovery before changing a deployment. Developers should read the exact API/schema reference and matching source companion. This edition describes the prepared source candidate; obtain its installer only after signing and installed acceptance identify the exact artifact. + {"question":"Explain the synthetic variance process","process_section":"18.20.050","zone_code":"SYN-R","rule_types":["front_setback"],"observed":{"front_setback":"8 feet"}} -- Operating manual · Printable PDF · Editable Word manual -- API and data dictionary · OpenAPI JSON -- Product and suite directory · Terms and full license +Read process citations and each cited standard independently. The output +can explain a verified process while reporting unavailable standards or +review flags. A difference between an observation and a cited standard +is an informational flag; it is not a variance finding, approval, +nonconformity determination or substitute for planner review. If no +relevant authority is available, obtain the source or leave the item +unavailable. Do not attach an unrelated citation to a proposed +requirement. + +Keep parcel import and inspection in the right order -Exact version and candidate - - Identity Value - ------------------------------- ------------------------------------------------------ - Documentation Townlight Beta 1 naming, Access and Notice candidate - Intended installer version 1.7.0.1; build and acceptance pending - Native desktop source version 1.7.0-1 - Product component townlight-zoning 0.2.3 - Principal import package townlight_zoning - Candidate hashes Pending build, signing and installed acceptance - License AGPL-3.0-only - -Use a fresh profile and empty database. Existing unmarked city data is refused before initialization; no in-place upgrade is supported. Preserve the existing %LOCALAPPDATA%\CivicSuite profile, data and recovery material. Historical releases retain their original identities. - -What staff can do - -- Prepare parcel data: Use the complete supported bundle, including jurisdiction, dataset metadata and original hashes. The coordinates must be EPSG:4326. A loose geometry file is not the full source envelope. -- Import and inspect: Check the complete source envelope before selecting Import parcel dataset. That control submits directly; inspect the saved validation/provenance result afterward. Correct a refused source bundle and preserve the evidence. Do not force acceptance by editing SQL. -- Register cited rules: Associate the zone, rule kind/key and value with the relevant public Code section. Inspect overlays and effective context. Leave missing authority visible for planner review. -- Ask a parcel question: Look up the intended parcel and ask the supported question. Read the returned citation, applicability and disclaimer. Do not present an uncertain answer as an official decision. -- Record review and context: Record a correction and its reason when needed. Select permitted Meetings history explicitly. Preserve the question/review history and distinguish staff-only precedent from public material. -- Create a snapshot: Review the audience and exact content before creating the immutable snapshot. A public snapshot must satisfy its permitted-source contract; choosing a public label does not sanitize private notes. -- Use it downstream: Select the exact snapshot for Records or the permitted provider path. The receiving workflow rechecks visibility, source identity and hash before retaining or exporting it. - -Operating procedures and examples - -The operating manual now includes these existing procedures, with synthetic inputs, readback and limits. Follow the actual app boundary identified there; a standalone source capability is not automatically a desktop screen. - -- Discretionary processes and staff review. -- Explain the cited process. -- Keep parcel import and inspection in the right order. -- Use the existing specialist review contracts. - -Architecture and data +Check the complete JSON envelope, original hashes and EPSG:4326 geometry +before submitting Import parcel dataset. That control sends the import +directly; it does not open a separate preview/commit screen. Inspect the +returned validation/provenance and saved dataset. The browser refuses +bundle files larger than 20 MiB; valid geometry and metadata remain +subject to server validation. Correct the source bundle after a refusal +and retain earlier evidence rather than forcing SQL changes. + +Use the existing specialist review contracts + +The standalone Zoning application’s review/analytics/report routes are +documented source capabilities, not extra native desktop screens. In a +deployment where its actual staff authentication is already configured: + +- Create an ambiguity review with zone_code, question and reason at + /api/v1/townlight_zoning/staff/ambiguity-reviews. Read its returned ID + and list state. Update that ID with status, optional assigned_to and + resolution; use open, in_review, resolved or closed. Resolving or + closing requires a nonempty resolution. +- Retain a flagged answer at + /api/v1/townlight_zoning/staff/flagged-answers with the original + question/answer, zone, flag reason and source citations. Use + /{review_id}/improve with improved_answer and improvement_notes. + Preserve the original and improvement attribution; a correction does + not rewrite the imported Code source. +- Read /api/v1/townlight_zoning/staff/questions/analytics with the + desired high_volume_threshold to identify repeated questions and + uncertain answers. Analytics counts are review aids, not + jurisdictional conclusions. +- Create /api/v1/townlight_zoning/staff/reports/outline with a title and + actual selected question_ids/queue_item_ids. Review the resulting + outline and citations before incorporating it in a staff report. It is + not a filed report or a meeting decision. + +A synthetic ambiguity request is: + + {"zone_code":"SYN-R","question":"Which retained setback rule applies?","reason":"Synthetic overlay ambiguity requires planner review"} + +Do not send invented staff-role headers or assume these standalone paths +exist at the installed desktop origin. The native workspace’s supported +review/history/snapshot controls continue to use its fixed authenticated +bridge. Use the technical supplement to distinguish the two surfaces. + +Source contracts: townlight_runtime/zoning_bridge.py, +townlight_zoning/main.py, the imported rule/source models and desktop +Zoning view. + +Technical specifications Runtime and storage -This prepared source candidate targets Windows x64 fresh installation. Its native shell uses Rust 2021, Tauri 2 and Microsoft WebView2; browser assets are JavaScript built with Vite 8.1.6. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic, with PostgreSQL 17 / PostGIS and managed original files. The prior accepted runtime contained FastAPI 0.162.0; this changed candidate requires its own installed dependency verification. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. - -The native transport is fixed to loopback 127.0.0.1:15480; PostgreSQL uses the configured local runtime port (default 15432). Optional local model service defaults to 127.0.0.1:15434. Those are deployment defaults, not internet endpoints. The runtime has health, module and readiness endpoints; readiness is stronger than process existence. The task queue is the existing local Core task infrastructure, not an assertion that a separate Redis service is required for this desktop composition. - -The default native profile is %LOCALAPPDATA%\CivicSuite; the historical directory name remains part of compatibility. Do not rename it to Townlight. A configured TOWNLIGHT_PROFILE_ROOT must be absolute. Local configuration and secrets live under that profile; protected managed files and database state must be backed up coherently. Source/runtime identity is distinct from a product’s display label. +The accepted package targets Windows x64 fresh installation. Its native +shell uses Rust 2021, Tauri 2 and Microsoft WebView2; browser assets are +JavaScript built with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled CPython +3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic, with PostgreSQL 17 / +PostGIS and managed original files. The installed runtime tested here +contains FastAPI 0.162.0. Package minimum Python requirements can differ +from the bundled executable; the metadata reference preserves both. No +stack rewrite is implied by the beta label. + +The native transport is fixed to loopback 127.0.0.1:15480; PostgreSQL +uses the configured local runtime port (default 15432). Optional local +model service defaults to 127.0.0.1:15434. Those are deployment +defaults, not internet endpoints. The runtime has health, module and +readiness endpoints; readiness is stronger than process existence. The +task queue is the existing local Core task infrastructure, not an +assertion that a separate Redis service is required for this desktop +composition. + +The default native profile is %LOCALAPPDATA%\CivicSuite; the historical +directory name remains part of compatibility. Do not rename it to +Townlight. A configured TOWNLIGHT_PROFILE_ROOT must be absolute. Local +configuration and secrets live under that profile; protected managed +files and database state must be backed up coherently. Source/runtime +identity is distinct from a product’s display label. Data and consistency -GeoJSON import datasets; parcels and zone/overlay context; cited rules; questions and answers; review events; selected Meetings history; immutable snapshots. +GeoJSON import datasets; parcels and zone/overlay context; cited rules; +questions and answers; review events; selected Meetings history; +immutable snapshots. -Versioned saves use expected prior revision identifiers where defined. Reopen and reconcile on conflict. Exact exports and handoffs use source IDs, current visibility, revision and SHA256. Review belongs to the saved revision and does not transfer silently to edited text. Database changes use the owning product’s migrations; a request or readiness check is not an authorization to mutate schema. +Versioned saves use expected prior revision identifiers where defined. +Reopen and reconcile on conflict. Exact exports and handoffs use source +IDs, current visibility, revision and SHA256. Review belongs to the +saved revision and does not transfer silently to edited text. Database +changes use the owning product’s migrations; a request or readiness +check is not an authorization to mutate schema. Capacity and platform statements -This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The new installer size remains pending its build; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. - -The exact runtime payload lock records pinned files, sizes and hashes. The component metadata records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. - - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Data contract Description - ----------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------- - Input A supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset metadata, public Code authority and permitted meeting evidence. - - Retained records GeoJSON import datasets; parcels and zone/overlay context; cited rules; questions and answers; review events; selected Meetings history; immutable snapshots. - - Output Source-backed parcel context, informational answers, recorded human corrections and reviewed snapshots with stable hashes. - - Connections Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting. - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +This beta has synthetic single-profile workflow evidence. It does not +have a published benchmark for concurrent staff capacity, minimum +RAM/CPU, large-source limits or a field SLA. Do not turn a developer +machine’s specification into a supported minimum. The signed MSI is +2,082,697,216 bytes; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads. -Setup and operation +The exact runtime payload lock records pinned files, sizes and hashes. +The component metadata records shipped dependency declarations. These +references are more precise than a manually copied dependency list. +Third-party and historical license notices must accompany their matching +payloads. -1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. -2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. Installed acceptance for this source candidate remains pending; no in-place legacy upgrade is supported. -3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select Townlight Inspections candidate (inspections-preview) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. -4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. Continue without local AI is valid for the deterministic workflows. -5. Run Health Check and wait for readiness. Open Townlight. In System Health select Finish Records Migration to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. -6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. -7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. - -Configuration +Configuration and administration Native deployment configuration -Use Setup, Settings and System Health for supported staff operation. Administrators provision folders, backup storage, named accounts and the city profile. Select inspections-preview for the bounded desktop composition, including Access and Notice. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. - -Technical deployments use TOWNLIGHT_PRODUCT_PROFILE, TOWNLIGHT_PROFILE_ROOT, DATABASE_URL, TOWNLIGHT_RUNTIME_PORT, PORTAL_MODE and the runtime-managed secret files. Treat database URLs and native session proofs as secrets. The installed native domain runtime explicitly refuses non-loopback binding. PORTAL_MODE=private is the accepted posture; changing it does not by itself commission an internet portal, authentication provider or reverse proxy. - -The isolated documentation exporter sets a fictional profile and unusable synthetic database origin only to read schemas; those values are not deployment configuration. Keep deployment values in the intended process/account scope. An already-running process does not automatically inherit later environment edits. - -API usage +Use Setup, Settings and System Health for supported staff operation. +Administrators provision folders, backup storage, named accounts and the +city profile. Select inspections-preview for the bounded desktop +composition, including Access and Notice. Station remains a separate +service boundary. Do not use a standalone product’s demo server as a +substitute for the installed workspace. + +Technical deployments use TOWNLIGHT_PRODUCT_PROFILE, +TOWNLIGHT_PROFILE_ROOT, DATABASE_URL, TOWNLIGHT_RUNTIME_PORT, +PORTAL_MODE and the runtime-managed secret files. Treat database URLs +and native session proofs as secrets. The installed native domain +runtime explicitly refuses non-loopback binding. PORTAL_MODE=private is +the accepted posture; changing it does not by itself commission an +internet portal, authentication provider or reverse proxy. + +The isolated documentation exporter sets a fictional profile and +unusable synthetic database origin only to read schemas; those values +are not deployment configuration. Keep deployment values in the intended +process/account scope. An already-running process does not automatically +inherit later environment edits. + +API and integration examples Native command example -The following JavaScript belongs in the existing trusted Townlight frontend/development environment with invoke imported from @tauri-apps/api/core. It is not a command for an arbitrary web page or an instruction for nontechnical staff. IDs must come from records created in an isolated synthetic exercise. +The following JavaScript belongs in the existing trusted Townlight +frontend/development environment with invoke imported from +@tauri-apps/api/core. It is not a command for an arbitrary web page or +an instruction for nontechnical staff. IDs must come from records +created in an isolated synthetic exercise. import { invoke } from '@tauri-apps/api/core'; const result = await invoke('zoning_domain_request', {request: {operation: 'history', id: questionId}}); @@ -113,7 +381,12 @@ The following JavaScript belongs in the existing trusted Townlight frontend/deve Trusted local HTTP example -An administrator/developer can inspect an already-configured isolated runtime from a trusted local process. This PowerShell example reads the signed-in synthetic profile’s existing proof into memory; it does not create a user, seed a session, reveal the proof in output or bypass a permission check. Do not use real city data in development examples. A read response does not prove approval or publication. +An administrator/developer can inspect an already-configured isolated +runtime from a trusted local process. This PowerShell example reads the +signed-in synthetic profile’s existing proof into memory; it does not +create a user, seed a session, reveal the proof in output or bypass a +permission check. Do not use real city data in development examples. A +read response does not prove approval or publication. $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite' $sessionPath = Join-Path $profilePath 'config\local-session.json' @@ -124,11 +397,24 @@ An administrator/developer can inspect an already-configured isolated runtime fr Complete synthetic source bundle -The synthetic Zoning bundle is the retained fixture used by the beta staff exercise. It includes the complete supported source envelope rather than a shortened pseudo-payload. Keep its fictional source labels. For Planning, wrap it as {"bundle": BUNDLE, "expected_previous_revision": null}; for Permitting use {"bundle": BUNDLE, "expected_revision": null}. Code and Zoning take their own complete import envelopes. Replace null with the current expected revision when revising an existing source, as the applicable schema requires. These are import examples, not legal authority or permission to load them into a live city profile. +The synthetic Zoning bundle is the retained fixture used by the beta +staff exercise. It includes the complete supported source envelope +rather than a shortened pseudo-payload. Keep its fictional source +labels. For Planning, wrap it as +{"bundle": BUNDLE, "expected_previous_revision": null}; for Permitting +use {"bundle": BUNDLE, "expected_revision": null}. Code and Zoning take +their own complete import envelopes. Replace null with the current +expected revision when revising an existing source, as the applicable +schema requires. These are import examples, not legal authority or +permission to load them into a live city profile. A synthetic write with subsequent readback -This example demonstrates the existing Meetings HTTP contract in an isolated exercise. It is intentionally fictional. It does not start a service. Its authentication setup is included so it can be run independently under the signed-in synthetic account. If a write times out, inspect current records before repeating it. +This example demonstrates the existing Meetings HTTP contract in an +isolated exercise. It is intentionally fictional. It does not start a +service. Its authentication setup is included so it can be run +independently under the signed-in synthetic account. If a write times +out, inspect current records before repeating it. $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite' $sessionPath = Join-Path $profilePath 'config/local-session.json' @@ -148,65 +434,338 @@ This example demonstrates the existing Meetings HTTP contract in an isolated exe -Headers $headers Remove-Variable session, headers -This write requires Meetings to be enabled and the signed-in staff role to permit it. It is a cross-suite integration example; for this product’s request models, use the complete technical reference below. +This write requires Meetings to be enabled and the signed-in staff role +to permit it. It is a cross-suite integration example; for this +product’s request models, use the complete technical reference below. -MCP status +Complete technical contract -No direct product MCP server is exposed by the accepted Townlight desktop or Station boundary. Do not configure an invented townlight mcp command or assume an AI client has staff permissions. The integration surfaces for this beta are native IPC, the documented HTTP APIs, source bundle imports, exact exports and the existing Station CLI. - -The bundled transcription code includes a TextFlowKit MCP adapter as a separate source capability. It offers job-based transcribe_media, get_transcript, list_jobs, get_job_status and export_transcript, and additional tools declared in that adapter. It uses stdio first and optional Streamable HTTP, with the MCP SDK as an optional extra. It is not automatically launched, authenticated as Townlight staff or accepted as a Townlight product MCP deployment. This documentation does not add such a service. - -For a transcription client already provisioned separately, an illustrative tool call is: - - {"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} +Read the Zoning API reference for every documented operation, request +field, constraint, response declaration and source supplement. Download +the OpenAPI JSON for tools. For Station this is the suite-side schema +only; its separate service contract is documented in the API supplement. +The reference directory includes configuration/source inventories, +dependency declarations, native command contracts, MCP signatures and +candidate evidence. -Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the MCP source reference. Station meeting capture does not become live speech recognition because this optional donor adapter exists. +MCP and automation boundary -Verification and known limits +No direct product MCP server is exposed by the accepted Townlight +desktop or Station boundary. Do not configure an invented townlight mcp +command or assume an AI client has staff permissions. The integration +surfaces for this beta are native IPC, the documented HTTP APIs, source +bundle imports, exact exports and the existing Station CLI. - -------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Product Recorded result Precisely exercised - ----------------------- ----------------------- -------------------------------------------------------------------------------------------------------------------- - Zoning PASS GeoJSON/PostGIS import, cited dimensional rule, parcel answer, staff review/history/snapshot and native workspace. +The bundled transcription code includes a TextFlowKit MCP adapter as a +separate source capability. It offers job-based transcribe_media, +get_transcript, list_jobs, get_job_status and export_transcript, and +additional tools declared in that adapter. It uses stdio first and +optional Streamable HTTP, with the MCP SDK as an optional extra. It is +not automatically launched, authenticated as Townlight staff or accepted +as a Townlight product MCP deployment. This documentation does not add +such a service. - -------------------------------------------------------------------------------------------------------------------------------------------------------------------- +For a transcription client already provisioned separately, an +illustrative tool call is: -These results come from the identified signed candidate’s fresh normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source bundles and media were synthetic. The guest install/uninstall and recovery passed, and the owned Sandbox stopped. No host installed application or standalone CivicCast was changed. This documentation task reuses those receipts; it does not claim a new software acceptance run. - -The workflow matrix identifies raw receipt filenames. The evidence index retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. - -The limits remain: actual city field acceptance and equipment/network commissioning; Station automatic provisioning/SCM commissioning; every UI/role combination; field recognition accuracy; and historical in-place upgrades are not certified. They are not five invented feature requirements. Fresh-install controlled beta handoff remains the accepted scope. This package makes no city-deployment, publication or general-availability claim. - -The accepted path is local GeoJSON/PostGIS. It does not establish every ArcGIS, assessor or CKAN connector. Answers and process explanations are informational and do not issue an entitlement or an official zoning determination. - -Development and repository map - -Use the corresponding source for the candidate rather than assuming the public default branch matches it. The source companion contains installed-owned-source, product build inputs, desktop Rust/browser sources, locks and BUILD.md. It excludes credentials and third-party binary/model payloads. Use the recorded runtime lock when reproducing packaging. - -Relevant source contracts: + {"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} -- townlight_zoning/geo_import.py -- townlight_zoning/discretionary.py -- townlight_runtime/zoning_bridge.py -- townlight_runtime/zoning_records.py +Use a job ID returned by that transcription service. This example does +not create a Townlight record or bypass its review/Records handoff. The +exact optional adapter tool signatures are supplied in the MCP source +reference. Station meeting capture does not become live speech +recognition because this optional donor adapter exists. + +Security and permissions + +Use your own named account and save before leaving a screen. A saved +draft is durable; unsaved form text may not be. If a write has an +unknown result, reopen its record before repeating it. + +Read source jurisdiction, dates, citation, version and visibility. A +copied source hash identifies exact bytes, not their legal +applicability. If a source changes or permission is removed, resolve the +source problem rather than substituting stale cached content. + +Keep originals and derivatives separate. Review the intended audience +before export. A public summary excludes private fields only through the +applicable copy contract and your review. A renamed private packet is +still private content. + +Drafting, review, approval, attachment, export, fulfillment and +publication are separate operations. A Townlight workpaper does not +itself adopt law, issue a permit, impose a fine or release a records +response. The responsible staff member records the applicable decision. + +The native session is validated and mapped to a persisted SQL identity. +An editable actor/reviewer label is not authentication. Product/module +permissions and source visibility apply at the server boundary. +Revoked/unavailable authority fails closed for new Station operations; a +previous permission result is not a perpetual authorization. + +Use protected local folders, account permissions and credential storage. +Never include the native session file, database passwords, provider keys +or unredacted support bundles in a public issue or generated public +documentation. A local public view is not automatically a secured +internet deployment. Keep network exposure and real equipment acceptance +specific to the chosen beta site. + +Backup recovery and maintenance + +Save work and use Core’s canonical Backup Now before maintenance. That +operation stops writers. Preserve the coherent profile/database/document +backup and its receipt, then use Start to resume. A source export is not +a full backup. + +Use Restore Latest Backup through the supported controls. If the result +says Restore needs service start, use Start, then Check, and reopen a +known record. Do not repeat restore merely because services need to +start. The fresh-profile acceptance verified that a fulfilled request +survived restore and a post-backup marker did not. + +Keep Station’s dedicated database and media evidence together in its own +backup. Core’s native-profile backup must not be assumed to include an +external Station data directory. Stop writers during a coordinated +backup. Preserve failed media attempts and logs. + +On failure, record the time, selected composition, component/installer +versions and exact message. Check System Health for stopped, starting, +ready or failed dependencies. Use the existing Retry control after +readiness; do not create duplicate business records to refresh a stale +view. Share only a redacted diagnostic bundle. Preserve secrets, +original evidence, recovery material and unrelated installations. + +Troubleshooting + + Symptom Likely meaning Next action + ----------------------------- ------------------------------------------------------------------------ -------------------------------------------------------------------------------------------------- + Workspace absent Wrong product composition or unavailable canonical runtime. Check selected composition; activate through Finish Records Migration; wait for readiness. + Cannot sign in / 401 Missing or expired named account session. Sign in normally; reopen a Station launch ticket if applicable. + Permission denied / 403 Account, module, source or browser-origin permission. Ask the authorized administrator to inspect the intended permission; do not invent role headers. + Save conflict / 409 The saved revision, expected source hash or lifecycle changed. Keep edits, reopen current state and reconcile deliberately. + Invalid input / 422 Required field, format, geometry, source envelope or state is invalid. Read the field detail and correct the input/source; preserve originals. + Service unavailable / 503 Database, schema, connected source or configuration unavailable. Inspect System Health and the named dependency. Preserve work; retry only after readiness. + Export refused Missing exact review, approval, audience or source authorization. Read the refusal and complete the owning product’s explicit decision. + Restore needs service start The snapshot was restored but services have not resumed. Use Start, then Check and verify a saved record; do not blindly repeat restore. + +Verified workflows and limits + + Product Recorded result Precisely exercised + --------- ----------------- -------------------------------------------------------------------------------------------------------------------- + Zoning PASS GeoJSON/PostGIS import, cited dimensional rule, parcel answer, staff review/history/snapshot and native workspace. + +These results come from the identified signed candidate’s fresh +normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and +selected headless controls. All accounts, source bundles and media were +synthetic. The guest install/uninstall and recovery passed, and the +owned Sandbox stopped. No host installed application or standalone +CivicCast was changed. This documentation task reuses those receipts; it +does not claim a new software acceptance run. + +See the Windows acceptance summary for this MSI. The historical evidence +index applies to its original build. + +The limits remain: actual city field acceptance and equipment/network +commissioning; Station automatic provisioning/SCM commissioning; every +UI/role combination; field recognition accuracy; and historical in-place +upgrades are not certified. They are not five invented feature +requirements. Fresh-install controlled beta handoff remains the accepted +scope. This package makes no city-deployment, publication or +general-availability claim. + +Terms of service and license + +Scope and status + +These terms describe the Townlight Beta 1 software and this +documentation package. This public Windows beta is for evaluation. No +uptime commitment, support response time, indemnity, data-processing +agreement or paid service is created by these documents. A separate +signed agreement, if any, governs services it actually provides. + +Software license and rights + +Current Townlight-owned distributions identified in this candidate use +AGPL-3.0-only. The full license is supplied with this documentation and +with the source companion. The license governs rights to run, copy, +modify and convey the covered software; these operational terms do not +add restrictions to those rights. Historical grants and dependency +licenses retain their own terms. CivicCast remains a separate product +and is not relicensed by this documentation work. + +When conveying covered software, retain applicable notices and provide +the corresponding source and installation/build information required by +the license. For a modified version supporting remote network +interaction, follow section 13’s source-offer requirement. The companion +archive identifies the source for this candidate; a link to a different +public branch is not a substitute for the matching source. Read the +supplied license for the complete conditions. See the GNU license +reference and GNU licensing FAQ. + +Data ownership and access + +Importing a document does not transfer its ownership or grant permission +to publish it. The operating organization controls its accounts, access +decisions, lawful source use, retention and review/release policy. Keep +resident information, credentials, private notes and restricted evidence +in their authorized locations. Documentation examples contain fictional +data. No real city account, credential or record is required to exercise +these examples in an isolated test environment. + +Local operation and external processors + +The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency. + +Staff decisions and source applicability + +Staff verify the jurisdiction, source currency, permissions, citations +and proposed audience. Model output and generated guidance require +review. No draft is automatically an official legal interpretation, +zoning determination, permit approval, fee assessment, enforcement +notice or records-release decision. Official permit fee authority +remains with the adopted source and responsible organization; imported +amounts do not become a new authoritative calculation. + +Beta operation and recovery + +Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations. + +Warranty and liability + +The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable. + +Support and incident reporting + +Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here. + +Ending a beta exercise and document changes + +When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual. + +Glossary + + Term Meaning + --------------------------- --------------------------------------------------------------------------------------------------------------------- + Approval An explicit authorized decision on the saved text/artifact. It is separate from saving or attachment. + Canonical record The owning product’s retained identity and saved version, rather than an editable copied label. + Composition The selected set of desktop modules; inspections-preview exposes the eight staff products. + Corresponding source The source/build material matching the delivered covered program, subject to its license. + Derivative / Records copy A separately prepared document with its own intended audience and hash. + Hash / SHA256 A fingerprint of exact bytes. It detects change; it does not establish legal authority. + Idempotency Repeating the same identified request has the same intended effect; changing its payload can be refused. + IPC The native desktop command boundary between its browser interface and Rust host. + MCP Model Context Protocol; no direct Townlight product server is enabled by this beta. + Original Retained source bytes. A reviewed derivative does not replace them. + Provenance Source, version, date, actor and relationship information retained with evidence. + Revision An immutable saved version. Later edits do not inherit an earlier review automatically. + Snapshot A fixed audience-specific copy tied to a source/reviewed revision. + Station Townlight’s separate media boundary using a pinned CivicCast-derived engine; standalone CivicCast remains separate. + +Alphabetical subject index + +- Accounts and authentication — Security and permissions. +- AGPL and source — Terms of service and license. +- API contracts — API and integration examples. +- Architecture — Architecture. +- Backup — Backup recovery and maintenance. +- Beta version — Beta identity. +- Configuration — Configuration and administration. +- Evidence and acceptance — Verified workflows and limits. +- Fees and official decisions — Terms of service and license. +- First run — First run. +- Handoffs and audience — Connected workflows. +- MCP — MCP and automation boundary. +- Originals and provenance — Security and permissions. +- Recovery — Backup recovery and maintenance. +- Staff procedures — Daily workflow. +- Station configuration — Configuration and administration. +- Technical stack — Technical specifications. +- Troubleshooting — Troubleshooting. + +Operating subject links + +- Discretionary processes and staff review — Discretionary processes and + staff review. +- Explain the cited process — Explain the cited process. +- Keep parcel import and inspection in the right order — Keep parcel + import and inspection in the right order. +- Use the existing specialist review contracts — Use the existing + specialist review contracts. + +Source and document control + +This edition is authored from the immutable corresponding-source +companion, the generated installed-domain schema and the retained +workflow receipts. The current software versions and signed artifacts +are unchanged. Public historical pages are not synchronized or published +by this local documentation task. + +Workflow subject index + +- Ask a parcel question — Daily workflow, step 4. -The desktop package defines npm run build, npm test, npm run test:browser and its Tauri command. Python products retain their own pyproject.toml, tests and migrations; use the matching checkout’s declared dependencies and test configuration. Do not run a sample server against a production profile. This documentation build validates documentation only and reuses the separately identified installed acceptance; it does not claim a new complete application CI run. +- Create a snapshot — Daily workflow, step 6. + +- Import and inspect — Daily workflow, step 2. + +- Prepare parcel data — Daily workflow, step 1. + +- Record review and context — Daily workflow, step 5. -Recovery and support +- Register cited rules — Daily workflow, step 3. -Save work and use Core’s canonical Backup Now before maintenance. That operation stops writers. Preserve the coherent profile/database/document backup and its receipt, then use Start to resume. A source export is not a full backup. +- Use it downstream — Daily workflow, step 7. -Use Restore Latest Backup through the supported controls. If the result says Restore needs service start, use Start, then Check, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. +- Source inventory and file hashes + +- All component metadata -Keep Station’s dedicated database and media evidence together in its own backup. Core’s native-profile backup must not be assumed to include an external Station data directory. Stop writers during a coordinated backup. Preserve failed media attempts and logs. +- Installed domain OpenAPI -On failure, record the time, selected composition, component/installer versions and exact message. Check System Health for stopped, starting, ready or failed dependencies. Use the existing Retry control after readiness; do not create duplicate business records to refresh a stale view. Share only a redacted diagnostic bundle. Preserve secrets, original evidence, recovery material and unrelated installations. +- Workflow matrix -Prepared package installation +- Full AGPL text + +Source package installation -The renamed distributions are not yet published on a package index. Use the matching verified candidate wheel directory, not a renamed historical release URL. Installation of these Python packages is a developer/package check; the signed Windows MSI and its installed acceptance remain separate. +Use locally built wheels from the exact component sources in the +corresponding-source companion and verify their hashes. Do not relabel +historical release assets. Installation of these Python packages is a +developer/package check; the signed Windows MSI and its installed +acceptance remain separate. -In a new Windows virtual environment, replace the example wheel-directory path with the directory accompanying this candidate and verify its SHA256 manifest: +In a new Windows virtual environment, replace the example +wheel-directory path with your locally built wheel directory from the +matching pinned source and verify its SHA256 manifest: python -m venv .venv .\.venv\Scripts\Activate.ps1 @@ -215,12 +774,22 @@ In a new Windows virtual environment, replace the example wheel-directory path w python -m pip install (Join-Path $candidateWheels 'townlight_zoning-0.2.3-py3-none-any.whl') python -c "import townlight_zoning; from importlib.metadata import version; print(version('townlight-zoning'))" -Expected principal import: townlight_zoning; expected distribution version: 0.2.3. Use a fresh empty database/profile for workflow testing. Existing city data and the previous release remain untouched; no in-place upgrade or old-import compatibility shim is supplied. +Expected principal import: townlight_zoning; expected distribution +version: 0.2.3. Use a fresh empty database/profile for workflow testing. +Existing city data and the previous release remain untouched; no +in-place upgrade or old-import compatibility shim is supplied. License and responsible use -Current owned code is AGPL-3.0-only. Preserve full license, matching corresponding source, dependency notices and historical grants. Terms of use do not remove license rights. Source imports do not confer permission to publish third-party material. Review all automatic drafts and use the separate owning-product decision before official action. CivicCast remains independent. +Current owned code is AGPL-3.0-only. Preserve full license, matching +corresponding source, dependency notices and historical grants. Terms of +use do not remove license rights. Source imports do not confer +permission to publish third-party material. Review all automatic drafts +and use the separate owning-product decision before official action. +CivicCast remains independent. Earlier documentation -Previous editions are retained under docs/history/pre-townlight-beta-1/. They describe their original software and license grants. Use the current Townlight Beta 1 manual for this candidate. +Previous editions are retained under docs/history/pre-townlight-beta-1/. +They describe their original software and license grants. Use the +current Townlight Beta 1 manual for this candidate. diff --git a/SECURITY.md b/SECURITY.md index e95c7d8..d9ddb94 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,7 +1,7 @@ # Security -Prepared naming candidate: `townlight-zoning` 0.2.3. Installed acceptance remains pending. +Current source package: `townlight-zoning` 0.2.3. Windows MSI 1.7.0.1 is [published](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-windows-1.7.0.1). Its [acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/ACCEPTANCE-Windows-1.7.0.1.md) identifies the tested workflows and limits; standalone source checks remain separate. -Townlight Zoning Current version: 0.2.2. This is a narrow truth-repair release with no functional upgrade. The previous v1.0.0 release was published in error and does not prove public-use readiness. Deploy it only for local scaffold evaluation behind the city's trusted access layer, set `TOWNLIGHT_ZONING_STAFF_TRUSTED_PROXY_CIDRS` for the reverse proxy allowed to inject staff headers, review local parcel/rule data with planning staff, and route official zoning determinations to municipal staff. +Townlight Zoning Current version: 0.2.3. This is a narrow truth-repair release with no functional upgrade. The previous v1.0.0 release was published in error and does not prove public-use readiness. Deploy it only for local scaffold evaluation behind the city's trusted access layer, set `TOWNLIGHT_ZONING_STAFF_TRUSTED_PROXY_CIDRS` for the reverse proxy allowed to inject staff headers, review local parcel/rule data with planning staff, and route official zoning determinations to municipal staff. Report suspected vulnerabilities privately to the project maintainer. Do not open public issues containing exploit details, secrets, or sensitive municipal data. diff --git a/USER-MANUAL.docx b/USER-MANUAL.docx index 8e7b61c..24abe7e 100644 Binary files a/USER-MANUAL.docx and b/USER-MANUAL.docx differ diff --git a/USER-MANUAL.md b/USER-MANUAL.md index 7a6b24b..b18bf6f 100644 --- a/USER-MANUAL.md +++ b/USER-MANUAL.md @@ -1,28 +1,54 @@ +Windows x64 Beta 1 · MSI 1.7.0.1 + +The signed [Windows x64 beta 1.7.0.1](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-windows-1.7.0.1) passed the documented fresh Windows Sandbox checks with synthetic data. + +- Townlight Zoning Manual + - Contents + - Using this manual + - Beta identity + - First run + - Daily workflow + - Connected workflows + - Architecture + - Discretionary processes and staff review + - Technical specifications + - Configuration and administration + - API and integration examples + - MCP and automation boundary + - Security and permissions + - Backup recovery and maintenance + - Troubleshooting + - Verified workflows and limits + - Terms of service and license + - Glossary + - Alphabetical subject index + - Source and document control + # Townlight Zoning Manual **Townlight Beta 1** · Naming candidate documentation edition 2 November 2026 ## Contents -- [Using this manual](#using-this-manual) -- [Beta identity](#beta-identity) -- [First run](#first-run) -- [Daily workflow](#daily-workflow) -- [Connected workflows](#connected-workflows) -- [Architecture](#architecture) -- [Discretionary processes and staff review](#discretionary-processes-and-staff-review) -- [Technical specifications](#technical-specifications) -- [Configuration and administration](#configuration-and-administration) -- [API and integration examples](#api-and-integration-examples) -- [MCP and automation boundary](#mcp-and-automation-boundary) -- [Security and permissions](#security-and-permissions) -- [Backup recovery and maintenance](#backup-recovery-and-maintenance) -- [Troubleshooting](#troubleshooting) -- [Verified workflows and limits](#verified-workflows-and-limits) -- [Terms of service and license](#terms-of-service-and-license) -- [Glossary](#glossary) -- [Alphabetical subject index](#alphabetical-subject-index) -- [Source and document control](#source-and-document-control) +- [Using this manual](https://townlight.github.io/manuals/zoning.html#using-this-manual) +- [Beta identity](https://townlight.github.io/manuals/zoning.html#beta-identity) +- [First run](https://townlight.github.io/manuals/zoning.html#first-run) +- [Daily workflow](https://townlight.github.io/manuals/zoning.html#daily-workflow) +- [Connected workflows](https://townlight.github.io/manuals/zoning.html#connected-workflows) +- [Architecture](https://townlight.github.io/manuals/zoning.html#architecture) +- [Discretionary processes and staff review](https://townlight.github.io/manuals/zoning.html#discretionary-processes-and-staff-review) +- [Technical specifications](https://townlight.github.io/manuals/zoning.html#technical-specifications) +- [Configuration and administration](https://townlight.github.io/manuals/zoning.html#configuration-and-administration) +- [API and integration examples](https://townlight.github.io/manuals/zoning.html#api-and-integration-examples) +- [MCP and automation boundary](https://townlight.github.io/manuals/zoning.html#mcp-and-automation-boundary) +- [Security and permissions](https://townlight.github.io/manuals/zoning.html#security-and-permissions) +- [Backup recovery and maintenance](https://townlight.github.io/manuals/zoning.html#backup-recovery-and-maintenance) +- [Troubleshooting](https://townlight.github.io/manuals/zoning.html#troubleshooting) +- [Verified workflows and limits](https://townlight.github.io/manuals/zoning.html#verified-workflows-and-limits) +- [Terms of service and license](https://townlight.github.io/manuals/zoning.html#terms-of-service-and-license) +- [Glossary](https://townlight.github.io/manuals/zoning.html#glossary) +- [Alphabetical subject index](https://townlight.github.io/manuals/zoning.html#alphabetical-subject-index) +- [Source and document control](https://townlight.github.io/manuals/zoning.html#source-and-document-control) ## Using this manual @@ -33,67 +59,67 @@ Staff should begin with First run and Daily workflow. Administrators should also ## Beta identity | Identity | Value | -| --- | --- | +|----|----| | Documentation | Townlight Beta 1 naming, Access and Notice candidate | -| Intended installer version | 1.7.0.1; build and acceptance pending | +| Intended installer version | 1.7.0.1 | | Product component | townlight-zoning 0.2.3 | | Principal import package | townlight_zoning | | Native desktop source version | 1.7.0-1 | -| Candidate hashes | Pending candidate build, signing and installed acceptance | +| Candidate hashes | [SHA-256 checksums](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/SHA256SUMS-Windows-1.7.0.1.txt) and [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/ACCEPTANCE-Windows-1.7.0.1.md) | | Current owned software license | AGPL-3.0-only | | Acceptance composition | Fresh Windows x64 profile; inspections-preview; Station configured separately | -The naming change advances this package's version and requires a new signed installer and installed acceptance. Those steps and publication remain pending. Historical tags, receipts and archived manuals keep their original names and certify only their identified artifacts. Use an empty database and fresh profile; no in-place legacy upgrade is supported. The approved Windows profile path remains `%LOCALAPPDATA%\CivicSuite`. Preserve existing profiles, data and recovery material. +Use an empty database and fresh Windows profile. The installer refuses legacy profile initialization. The approved profile path is `%LOCALAPPDATA%\CivicSuite`. Keep existing profiles and backups. ## First run -1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. -2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. Installed acceptance for this source candidate remains pending; no in-place legacy upgrade is supported. -3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. -4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. -5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. -6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. -7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. +1. Download the signed MSI, matching source companion and checksums from the [public Windows release](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-windows-1.7.0.1). +2. Verify the MSI hash and Authenticode publisher before installing on a fresh Windows profile. See the [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/ACCEPTANCE-Windows-1.7.0.1.md) for the tested setup. +3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. +4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. +5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. +6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. +7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. ## Daily workflow - + ### 1. Prepare parcel data Use the complete supported bundle, including jurisdiction, dataset metadata and original hashes. The coordinates must be EPSG:4326. A loose geometry file is not the full source envelope. - + ### 2. Import and inspect Check the complete source envelope before selecting Import parcel dataset. That control submits directly; inspect the saved validation/provenance result afterward. Correct a refused source bundle and preserve the evidence. Do not force acceptance by editing SQL. - + ### 3. Register cited rules Associate the zone, rule kind/key and value with the relevant public Code section. Inspect overlays and effective context. Leave missing authority visible for planner review. - + ### 4. Ask a parcel question Look up the intended parcel and ask the supported question. Read the returned citation, applicability and disclaimer. Do not present an uncertain answer as an official decision. - + ### 5. Record review and context Record a correction and its reason when needed. Select permitted Meetings history explicitly. Preserve the question/review history and distinguish staff-only precedent from public material. - + ### 6. Create a snapshot Review the audience and exact content before creating the immutable snapshot. A public snapshot must satisfy its permitted-source contract; choosing a public label does not sanitize private notes. - + ### 7. Use it downstream @@ -113,20 +139,21 @@ Drafting, review, approval, attachment, export, fulfillment and publication are Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting. - | Direction | Material | -| --- | --- | +|----|----| | Input | A supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset metadata, public Code authority and permitted meeting evidence. | | Output | Source-backed parcel context, informational answers, recorded human corrections and reviewed snapshots with stable hashes. | - ### Product boundary The accepted path is local GeoJSON/PostGIS. It does not establish every ArcGIS, assessor or CKAN connector. Answers and process explanations are informational and do not issue an entitlement or an official zoning determination. ## Architecture -![Townlight Zoning architecture and evidence flow](docs/beta-1/assets/zoning-architecture.svg) +
+Townlight Zoning architecture and evidence flow + +
The drawing shows the principal staff/evidence path. Native commands carry trusted identity to Python business services; PostgreSQL and retained original files hold durable state. A downstream copy does not silently transfer decision authority. Station has its own configured authority/media boundary, database and mutable files. The connected-workflow text supplies the drawing’s reading order and accessibility alternative. @@ -138,7 +165,7 @@ In the existing Zoning workspace, complete **Variance, conditional use or noncon The mounted API is `POST /desktop/v1/zoning/standards/process-explanation` under the normal authenticated staff session. Its equivalent request body is: -```json +``` json {"question":"Explain the synthetic variance process","process_section":"18.20.050","zone_code":"SYN-R","rule_types":["front_setback"],"observed":{"front_setback":"8 feet"}} ``` @@ -150,7 +177,7 @@ Check the complete JSON envelope, original hashes and EPSG:4326 geometry before ### Use the existing specialist review contracts -The standalone Zoning application's review/analytics/report routes are documented source capabilities, not extra native desktop screens. In a deployment where its actual staff authentication is already configured: +The standalone Zoning application’s review/analytics/report routes are documented source capabilities, not extra native desktop screens. In a deployment where its actual staff authentication is already configured: - Create an ambiguity review with `zone_code`, `question` and `reason` at `/api/v1/townlight_zoning/staff/ambiguity-reviews`. Read its returned ID and list state. Update that ID with `status`, optional `assigned_to` and `resolution`; use `open`, `in_review`, `resolved` or `closed`. Resolving or closing requires a nonempty `resolution`. - Retain a flagged answer at `/api/v1/townlight_zoning/staff/flagged-answers` with the original question/answer, zone, flag reason and source citations. Use `/{review_id}/improve` with `improved_answer` and `improvement_notes`. Preserve the original and improvement attribution; a correction does not rewrite the imported Code source. @@ -159,16 +186,16 @@ The standalone Zoning application's review/analytics/report routes are documente A synthetic ambiguity request is: -```json +``` json {"zone_code":"SYN-R","question":"Which retained setback rule applies?","reason":"Synthetic overlay ambiguity requires planner review"} ``` -Do not send invented staff-role headers or assume these standalone paths exist at the installed desktop origin. The native workspace's supported review/history/snapshot controls continue to use its fixed authenticated bridge. Use the technical supplement to distinguish the two surfaces. +Do not send invented staff-role headers or assume these standalone paths exist at the installed desktop origin. The native workspace’s supported review/history/snapshot controls continue to use its fixed authenticated bridge. Use the technical supplement to distinguish the two surfaces. Source contracts: `townlight_runtime/zoning_bridge.py`, `townlight_zoning/main.py`, the imported rule/source models and desktop Zoning view. - ## Technical specifications + ### Runtime and storage The accepted package targets **Windows x64 fresh installation**. Its native shell uses **Rust 2021, Tauri 2 and Microsoft WebView2**; browser assets are JavaScript built with **Vite 8.1.6**. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled **CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic**, with **PostgreSQL 17 / PostGIS** and managed original files. The installed runtime tested here contains FastAPI 0.162.0. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. @@ -185,11 +212,12 @@ Versioned saves use expected prior revision identifiers where defined. Reopen an ### Capacity and platform statements -This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The new installer size remains pending its build; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. +This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The signed MSI is 2,082,697,216 bytes; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. -The exact [runtime payload lock](docs/beta-1/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](docs/beta-1/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. +The exact [runtime payload lock](https://townlight.github.io/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](https://townlight.github.io/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. ## Configuration and administration + ### Native deployment configuration Use Setup, Settings and System Health for supported staff operation. Administrators provision folders, backup storage, named accounts and the city profile. Select `inspections-preview` for the bounded desktop composition, including Access and Notice. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. @@ -199,11 +227,12 @@ Technical deployments use `TOWNLIGHT_PRODUCT_PROFILE`, `TOWNLIGHT_PROFILE_ROOT`, The isolated documentation exporter sets a fictional profile and unusable synthetic database origin only to read schemas; those values are not deployment configuration. Keep deployment values in the intended process/account scope. An already-running process does not automatically inherit later environment edits. ## API and integration examples + ### Native command example The following JavaScript belongs in the existing trusted Townlight frontend/development environment with `invoke` imported from `@tauri-apps/api/core`. It is not a command for an arbitrary web page or an instruction for nontechnical staff. IDs must come from records created in an isolated synthetic exercise. -```javascript +``` javascript import { invoke } from '@tauri-apps/api/core'; const result = await invoke('zoning_domain_request', {request: {operation: 'history', id: questionId}}); console.log(result); @@ -213,7 +242,7 @@ console.log(result); An administrator/developer can inspect an already-configured isolated runtime from a trusted local process. This PowerShell example reads the signed-in synthetic profile’s existing proof into memory; it does not create a user, seed a session, reveal the proof in output or bypass a permission check. Do not use real city data in development examples. A read response does not prove approval or publication. -```powershell +``` powershell $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite' $sessionPath = Join-Path $profilePath 'config\local-session.json' $session = Get-Content -LiteralPath $sessionPath -Raw | ConvertFrom-Json @@ -224,13 +253,13 @@ Remove-Variable session, headers ### Complete synthetic source bundle -The [synthetic Zoning bundle](docs/beta-1/reference/examples/synthetic-geo-bundle.json) is the retained fixture used by the beta staff exercise. It includes the complete supported source envelope rather than a shortened pseudo-payload. Keep its fictional source labels. For Planning, wrap it as `{"bundle": BUNDLE, "expected_previous_revision": null}`; for Permitting use `{"bundle": BUNDLE, "expected_revision": null}`. Code and Zoning take their own complete import envelopes. Replace null with the current expected revision when revising an existing source, as the applicable schema requires. These are import examples, not legal authority or permission to load them into a live city profile. +The [synthetic Zoning bundle](https://townlight.github.io/reference/examples/synthetic-geo-bundle.json) is the retained fixture used by the beta staff exercise. It includes the complete supported source envelope rather than a shortened pseudo-payload. Keep its fictional source labels. For Planning, wrap it as `{"bundle": BUNDLE, "expected_previous_revision": null}`; for Permitting use `{"bundle": BUNDLE, "expected_revision": null}`. Code and Zoning take their own complete import envelopes. Replace null with the current expected revision when revising an existing source, as the applicable schema requires. These are import examples, not legal authority or permission to load them into a live city profile. ### A synthetic write with subsequent readback This example demonstrates the existing Meetings HTTP contract in an isolated exercise. It is intentionally fictional. It does not start a service. Its authentication setup is included so it can be run independently under the signed-in synthetic account. If a write times out, inspect current records before repeating it. -```powershell +``` powershell $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite' $sessionPath = Join-Path $profilePath 'config/local-session.json' $session = Get-Content -LiteralPath $sessionPath -Raw | ConvertFrom-Json @@ -254,7 +283,7 @@ This write requires Meetings to be enabled and the signed-in staff role to permi ### Complete technical contract -Read the [Zoning API reference](docs/beta-1/api/zoning.html) for every documented operation, request field, constraint, response declaration and source supplement. Download the [OpenAPI JSON](docs/beta-1/api/zoning-openapi.json) for tools. For Station this is the suite-side schema only; its separate service contract is documented in the API supplement. The [reference directory](docs/beta-1/reference/index.html) includes configuration/source inventories, dependency declarations, native command contracts, MCP signatures and candidate evidence. +Read the [Zoning API reference](https://townlight.github.io/api/zoning.html) for every documented operation, request field, constraint, response declaration and source supplement. Download the [OpenAPI JSON](https://townlight.github.io/api/zoning-openapi.json) for tools. For Station this is the suite-side schema only; its separate service contract is documented in the API supplement. The [reference directory](https://townlight.github.io/reference/index.html) includes configuration/source inventories, dependency declarations, native command contracts, MCP signatures and candidate evidence. ## MCP and automation boundary @@ -264,15 +293,14 @@ The bundled transcription code includes a **TextFlowKit MCP adapter** as a separ For a transcription client already provisioned separately, an illustrative tool call is: -```json +``` json {"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} ``` -Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the [MCP source reference](docs/beta-1/reference/mcp.html). Station meeting capture does not become live speech recognition because this optional donor adapter exists. +Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the [MCP source reference](https://townlight.github.io/reference/mcp.html). Station meeting capture does not become live speech recognition because this optional donor adapter exists. ## Security and permissions - Use your own named account and save before leaving a screen. A saved draft is durable; unsaved form text may not be. If a write has an unknown result, reopen its record before repeating it. Read source jurisdiction, dates, citation, version and visibility. A copied source hash identifies exact bytes, not their legal applicability. If a source changes or permission is removed, resolve the source problem rather than substituting stale cached content. @@ -298,7 +326,7 @@ On failure, record the time, selected composition, component/installer versions ## Troubleshooting | Symptom | Likely meaning | Next action | -| --- | --- | --- | +|----|----|----| | Workspace absent | Wrong product composition or unavailable canonical runtime. | Check selected composition; activate through Finish Records Migration; wait for readiness. | | Cannot sign in / 401 | Missing or expired named account session. | Sign in normally; reopen a Station launch ticket if applicable. | | Permission denied / 403 | Account, module, source or browser-origin permission. | Ask the authorized administrator to inspect the intended permission; do not invent role headers. | @@ -308,17 +336,15 @@ On failure, record the time, selected composition, component/installer versions | Export refused | Missing exact review, approval, audience or source authorization. | Read the refusal and complete the owning product’s explicit decision. | | Restore needs service start | The snapshot was restored but services have not resumed. | Use Start, then Check and verify a saved record; do not blindly repeat restore. | - ## Verified workflows and limits | Product | Recorded result | Precisely exercised | -| --- | --- | --- | +|----|----|----| | Zoning | PASS | GeoJSON/PostGIS import, cited dimensional rule, parcel answer, staff review/history/snapshot and native workspace. | - These results come from the identified signed candidate’s fresh normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source bundles and media were synthetic. The guest install/uninstall and recovery passed, and the owned Sandbox stopped. No host installed application or standalone CivicCast was changed. This documentation task reuses those receipts; it does not claim a new software acceptance run. -The [workflow matrix](docs/beta-1/reference/workflow-matrix.json) identifies raw receipt filenames. The [evidence index](docs/beta-1/reference/sandbox-evidence-index.json) retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. +See the [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/ACCEPTANCE-Windows-1.7.0.1.md) for this MSI. The historical [evidence index](https://townlight.github.io/reference/sandbox-evidence-index.json) applies to its original build. The limits remain: actual city field acceptance and equipment/network commissioning; Station automatic provisioning/SCM commissioning; every UI/role combination; field recognition accuracy; and historical in-place upgrades are not certified. They are not five invented feature requirements. Fresh-install controlled beta handoff remains the accepted scope. This package makes no city-deployment, publication or general-availability claim. @@ -326,7 +352,7 @@ The limits remain: actual city field acceptance and equipment/network commission ### Scope and status -These terms describe the Townlight Beta 1 software and this documentation package. This is a locally prepared private beta, not a hosted-service subscription, a city deployment agreement or a public release. No uptime commitment, support response time, indemnity, data-processing agreement or paid service is created by these documents. A separate signed agreement, if any, governs services it actually provides. +These terms describe the Townlight Beta 1 software and this documentation package. This public Windows beta is for evaluation. No uptime commitment, support response time, indemnity, data-processing agreement or paid service is created by these documents. A separate signed agreement, if any, governs services it actually provides. ### Software license and rights @@ -365,7 +391,7 @@ When an organization ends testing, it controls retention/export and removes acce ## Glossary | Term | Meaning | -| --- | --- | +|----|----| | Approval | An explicit authorized decision on the saved text/artifact. It is separate from saving or attachment. | | Canonical record | The owning product’s retained identity and saved version, rather than an editable copied label. | | Composition | The selected set of desktop modules; inspections-preview exposes the eight staff products. | @@ -381,34 +407,33 @@ When an organization ends testing, it controls retention/export and removes acce | Snapshot | A fixed audience-specific copy tied to a source/reviewed revision. | | Station | Townlight’s separate media boundary using a pinned CivicCast-derived engine; standalone CivicCast remains separate. | - ## Alphabetical subject index -- **Accounts and authentication** — [Security and permissions](#security-and-permissions). -- **AGPL and source** — [Terms of service and license](#terms-of-service-and-license). -- **API contracts** — [API and integration examples](#api-and-integration-examples). -- **Architecture** — [Architecture](#architecture). -- **Backup** — [Backup recovery and maintenance](#backup-recovery-and-maintenance). -- **Beta version** — [Beta identity](#beta-identity). -- **Configuration** — [Configuration and administration](#configuration-and-administration). -- **Evidence and acceptance** — [Verified workflows and limits](#verified-workflows-and-limits). -- **Fees and official decisions** — [Terms of service and license](#terms-of-service-and-license). -- **First run** — [First run](#first-run). -- **Handoffs and audience** — [Connected workflows](#connected-workflows). -- **MCP** — [MCP and automation boundary](#mcp-and-automation-boundary). -- **Originals and provenance** — [Security and permissions](#security-and-permissions). -- **Recovery** — [Backup recovery and maintenance](#backup-recovery-and-maintenance). -- **Staff procedures** — [Daily workflow](#daily-workflow). -- **Station configuration** — [Configuration and administration](#configuration-and-administration). -- **Technical stack** — [Technical specifications](#technical-specifications). -- **Troubleshooting** — [Troubleshooting](#troubleshooting). +- **Accounts and authentication** — [Security and permissions](https://townlight.github.io/manuals/zoning.html#security-and-permissions). +- **AGPL and source** — [Terms of service and license](https://townlight.github.io/manuals/zoning.html#terms-of-service-and-license). +- **API contracts** — [API and integration examples](https://townlight.github.io/manuals/zoning.html#api-and-integration-examples). +- **Architecture** — [Architecture](https://townlight.github.io/manuals/zoning.html#architecture). +- **Backup** — [Backup recovery and maintenance](https://townlight.github.io/manuals/zoning.html#backup-recovery-and-maintenance). +- **Beta version** — [Beta identity](https://townlight.github.io/manuals/zoning.html#beta-identity). +- **Configuration** — [Configuration and administration](https://townlight.github.io/manuals/zoning.html#configuration-and-administration). +- **Evidence and acceptance** — [Verified workflows and limits](https://townlight.github.io/manuals/zoning.html#verified-workflows-and-limits). +- **Fees and official decisions** — [Terms of service and license](https://townlight.github.io/manuals/zoning.html#terms-of-service-and-license). +- **First run** — [First run](https://townlight.github.io/manuals/zoning.html#first-run). +- **Handoffs and audience** — [Connected workflows](https://townlight.github.io/manuals/zoning.html#connected-workflows). +- **MCP** — [MCP and automation boundary](https://townlight.github.io/manuals/zoning.html#mcp-and-automation-boundary). +- **Originals and provenance** — [Security and permissions](https://townlight.github.io/manuals/zoning.html#security-and-permissions). +- **Recovery** — [Backup recovery and maintenance](https://townlight.github.io/manuals/zoning.html#backup-recovery-and-maintenance). +- **Staff procedures** — [Daily workflow](https://townlight.github.io/manuals/zoning.html#daily-workflow). +- **Station configuration** — [Configuration and administration](https://townlight.github.io/manuals/zoning.html#configuration-and-administration). +- **Technical stack** — [Technical specifications](https://townlight.github.io/manuals/zoning.html#technical-specifications). +- **Troubleshooting** — [Troubleshooting](https://townlight.github.io/manuals/zoning.html#troubleshooting). ### Operating subject links -- **Discretionary processes and staff review** — [Discretionary processes and staff review](#discretionary-processes-and-staff-review). -- **Explain the cited process** — [Explain the cited process](#explain-the-cited-process). -- **Keep parcel import and inspection in the right order** — [Keep parcel import and inspection in the right order](#keep-parcel-import-and-inspection-in-the-right-order). -- **Use the existing specialist review contracts** — [Use the existing specialist review contracts](#use-the-existing-specialist-review-contracts). +- **Discretionary processes and staff review** — [Discretionary processes and staff review](https://townlight.github.io/manuals/zoning.html#discretionary-processes-and-staff-review). +- **Explain the cited process** — [Explain the cited process](https://townlight.github.io/manuals/zoning.html#explain-the-cited-process). +- **Keep parcel import and inspection in the right order** — [Keep parcel import and inspection in the right order](https://townlight.github.io/manuals/zoning.html#keep-parcel-import-and-inspection-in-the-right-order). +- **Use the existing specialist review contracts** — [Use the existing specialist review contracts](https://townlight.github.io/manuals/zoning.html#use-the-existing-specialist-review-contracts). ## Source and document control @@ -416,16 +441,26 @@ This edition is authored from the immutable corresponding-source companion, the ### Workflow subject index -- **Ask a parcel question** — [Daily workflow, step 4](#workflow-4). -- **Create a snapshot** — [Daily workflow, step 6](#workflow-6). -- **Import and inspect** — [Daily workflow, step 2](#workflow-2). -- **Prepare parcel data** — [Daily workflow, step 1](#workflow-1). -- **Record review and context** — [Daily workflow, step 5](#workflow-5). -- **Register cited rules** — [Daily workflow, step 3](#workflow-3). -- **Use it downstream** — [Daily workflow, step 7](#workflow-7). - -- [Source inventory and file hashes](docs/beta-1/reference/source-inventory.json) -- [All component metadata](docs/beta-1/reference/component-metadata.json) -- [Installed domain OpenAPI](docs/beta-1/reference/desktop-domain-openapi.json) -- [Workflow matrix](docs/beta-1/reference/workflow-matrix.json) -- [Full AGPL text](docs/beta-1/reference/AGPL-3.0.txt) +- **Ask a parcel question** — [Daily workflow, step 4](https://townlight.github.io/manuals/zoning.html#workflow-4). + +- **Create a snapshot** — [Daily workflow, step 6](https://townlight.github.io/manuals/zoning.html#workflow-6). + +- **Import and inspect** — [Daily workflow, step 2](https://townlight.github.io/manuals/zoning.html#workflow-2). + +- **Prepare parcel data** — [Daily workflow, step 1](https://townlight.github.io/manuals/zoning.html#workflow-1). + +- **Record review and context** — [Daily workflow, step 5](https://townlight.github.io/manuals/zoning.html#workflow-5). + +- **Register cited rules** — [Daily workflow, step 3](https://townlight.github.io/manuals/zoning.html#workflow-3). + +- **Use it downstream** — [Daily workflow, step 7](https://townlight.github.io/manuals/zoning.html#workflow-7). + +- [Source inventory and file hashes](https://townlight.github.io/reference/source-inventory.json) + +- [All component metadata](https://townlight.github.io/reference/component-metadata.json) + +- [Installed domain OpenAPI](https://townlight.github.io/reference/desktop-domain-openapi.json) + +- [Workflow matrix](https://townlight.github.io/reference/workflow-matrix.json) + +- [Full AGPL text](https://townlight.github.io/reference/AGPL-3.0.txt) diff --git a/USER-MANUAL.pdf b/USER-MANUAL.pdf index 976f000..15371e5 100644 Binary files a/USER-MANUAL.pdf and b/USER-MANUAL.pdf differ diff --git a/USER-MANUAL.txt b/USER-MANUAL.txt index f1a96f1..1cda087 100644 --- a/USER-MANUAL.txt +++ b/USER-MANUAL.txt @@ -1,6 +1,34 @@ +Windows x64 Beta 1 · MSI 1.7.0.1 + +The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows +Sandbox checks with synthetic data. + +- Townlight Zoning Manual + - Contents + - Using this manual + - Beta identity + - First run + - Daily workflow + - Connected workflows + - Architecture + - Discretionary processes and staff review + - Technical specifications + - Configuration and administration + - API and integration examples + - MCP and automation boundary + - Security and permissions + - Backup recovery and maintenance + - Troubleshooting + - Verified workflows and limits + - Terms of service and license + - Glossary + - Alphabetical subject index + - Source and document control + Townlight Zoning Manual -Townlight Beta 1 · Naming candidate documentation edition 2 November 2026 +Townlight Beta 1 · Naming candidate documentation edition 2 November +2026 Contents @@ -26,176 +54,326 @@ Contents Using this manual -Townlight Zoning helps planners, land-use staff and authorized reviewers. Zoning combines local parcel geometry, cited zoning rules and staff review. It retains questions, corrections and snapshots with provenance so downstream staff can identify the precise evidence used. +Townlight Zoning helps planners, land-use staff and authorized +reviewers. Zoning combines local parcel geometry, cited zoning rules and +staff review. It retains questions, corrections and snapshots with +provenance so downstream staff can identify the precise evidence used. -Staff should begin with First run and Daily workflow. Administrators should also read Architecture, Technical specifications, Configuration, Security and Recovery. Developers should use the exact API/data dictionary and examples. The table of contents and alphabetical subject index link to the relevant sections in the HTML edition; the PDF preserves headings and searchable text. An editable Word edition is included with the same documentation companion. +Staff should begin with First run and Daily workflow. Administrators +should also read Architecture, Technical specifications, Configuration, +Security and Recovery. Developers should use the exact API/data +dictionary and examples. The table of contents and alphabetical subject +index link to the relevant sections in the HTML edition; the PDF +preserves headings and searchable text. An editable Word edition is +included with the same documentation companion. Beta identity - ------------------------------------------------------------------------------------------------------------------- - Identity Value - ----------------------------------- ------------------------------------------------------------------------------- - Documentation Townlight Beta 1 naming, Access and Notice candidate - - Intended installer version 1.7.0.1; build and acceptance pending - - Product component townlight-zoning 0.2.3 - - Principal import package townlight_zoning - - Native desktop source version 1.7.0-1 - - Candidate hashes Pending candidate build, signing and installed acceptance - - Current owned software license AGPL-3.0-only - - Acceptance composition Fresh Windows x64 profile; inspections-preview; Station configured separately - ------------------------------------------------------------------------------------------------------------------- - -The naming change advances this package’s version and requires a new signed installer and installed acceptance. Those steps and publication remain pending. Historical tags, receipts and archived manuals keep their original names and certify only their identified artifacts. Use an empty database and fresh profile; no in-place legacy upgrade is supported. The approved Windows profile path remains %LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data and recovery material. + Identity Value + -------------------------------- ------------------------------------------------------------------------------- + Documentation Townlight Beta 1 naming, Access and Notice candidate + Intended installer version 1.7.0.1 + Product component townlight-zoning 0.2.3 + Principal import package townlight_zoning + Native desktop source version 1.7.0-1 + Candidate hashes SHA-256 checksums and Windows acceptance summary + Current owned software license AGPL-3.0-only + Acceptance composition Fresh Windows x64 profile; inspections-preview; Station configured separately + +Use an empty database and fresh Windows profile. The installer refuses +legacy profile initialization. The approved profile path is +%LOCALAPPDATA%\CivicSuite. Keep existing profiles and backups. First run -1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. -2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. Installed acceptance for this source candidate remains pending; no in-place legacy upgrade is supported. -3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select Townlight Inspections candidate (inspections-preview) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. -4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. Continue without local AI is valid for the deterministic workflows. -5. Run Health Check and wait for readiness. Open Townlight. In System Health select Finish Records Migration to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. -6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. -7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. +1. Download the signed MSI, matching source companion and checksums + from the public Windows release. +2. Verify the MSI hash and Authenticode publisher before installing on + a fresh Windows profile. See the Windows acceptance summary for the + tested setup. +3. Launch Townlight under the intended named Windows account. Choose + the storage folders. Select Townlight Inspections candidate + (inspections-preview) for the bounded desktop composition, including + Access and Notice. A narrower default selection will not expose all + workspaces. +4. Enter the city profile, time zone and contacts. Create the first + named local administrator, sign in and choose protected backup + storage. Continue without local AI is valid for the deterministic + workflows. +5. Run Health Check and wait for readiness. Open Townlight. In System + Health select Finish Records Migration to activate the canonical + Python/PostgreSQL runtime. Do not fabricate migration receipts or + seed accounts. +6. Create named staff through Settings. Import authorized sources using + each product’s source library. All examples in this package are + synthetic; they are not municipal authority. +7. Provision Station separately if it is part of the beta exercise. + Selecting the desktop composition does not start or configure + Station. Configure vision explicitly only if automatic photo + drafting is selected. Daily workflow 1. Prepare parcel data -Use the complete supported bundle, including jurisdiction, dataset metadata and original hashes. The coordinates must be EPSG:4326. A loose geometry file is not the full source envelope. +Use the complete supported bundle, including jurisdiction, dataset +metadata and original hashes. The coordinates must be EPSG:4326. A loose +geometry file is not the full source envelope. 2. Import and inspect -Check the complete source envelope before selecting Import parcel dataset. That control submits directly; inspect the saved validation/provenance result afterward. Correct a refused source bundle and preserve the evidence. Do not force acceptance by editing SQL. +Check the complete source envelope before selecting Import parcel +dataset. That control submits directly; inspect the saved +validation/provenance result afterward. Correct a refused source bundle +and preserve the evidence. Do not force acceptance by editing SQL. 3. Register cited rules -Associate the zone, rule kind/key and value with the relevant public Code section. Inspect overlays and effective context. Leave missing authority visible for planner review. +Associate the zone, rule kind/key and value with the relevant public +Code section. Inspect overlays and effective context. Leave missing +authority visible for planner review. 4. Ask a parcel question -Look up the intended parcel and ask the supported question. Read the returned citation, applicability and disclaimer. Do not present an uncertain answer as an official decision. +Look up the intended parcel and ask the supported question. Read the +returned citation, applicability and disclaimer. Do not present an +uncertain answer as an official decision. 5. Record review and context -Record a correction and its reason when needed. Select permitted Meetings history explicitly. Preserve the question/review history and distinguish staff-only precedent from public material. +Record a correction and its reason when needed. Select permitted +Meetings history explicitly. Preserve the question/review history and +distinguish staff-only precedent from public material. 6. Create a snapshot -Review the audience and exact content before creating the immutable snapshot. A public snapshot must satisfy its permitted-source contract; choosing a public label does not sanitize private notes. +Review the audience and exact content before creating the immutable +snapshot. A public snapshot must satisfy its permitted-source contract; +choosing a public label does not sanitize private notes. 7. Use it downstream -Select the exact snapshot for Records or the permitted provider path. The receiving workflow rechecks visibility, source identity and hash before retaining or exporting it. +Select the exact snapshot for Records or the permitted provider path. +The receiving workflow rechecks visibility, source identity and hash +before retaining or exporting it. Working safely -Use your own named account and save before leaving a screen. A saved draft is durable; unsaved form text may not be. If a write has an unknown result, reopen its record before repeating it. +Use your own named account and save before leaving a screen. A saved +draft is durable; unsaved form text may not be. If a write has an +unknown result, reopen its record before repeating it. -Read source jurisdiction, dates, citation, version and visibility. A copied source hash identifies exact bytes, not their legal applicability. If a source changes or permission is removed, resolve the source problem rather than substituting stale cached content. +Read source jurisdiction, dates, citation, version and visibility. A +copied source hash identifies exact bytes, not their legal +applicability. If a source changes or permission is removed, resolve the +source problem rather than substituting stale cached content. -Keep originals and derivatives separate. Review the intended audience before export. A public summary excludes private fields only through the applicable copy contract and your review. A renamed private packet is still private content. +Keep originals and derivatives separate. Review the intended audience +before export. A public summary excludes private fields only through the +applicable copy contract and your review. A renamed private packet is +still private content. -Drafting, review, approval, attachment, export, fulfillment and publication are separate operations. A Townlight workpaper does not itself adopt law, issue a permit, impose a fine or release a records response. The responsible staff member records the applicable decision. +Drafting, review, approval, attachment, export, fulfillment and +publication are separate operations. A Townlight workpaper does not +itself adopt law, issue a permit, impose a fine or release a records +response. The responsible staff member records the applicable decision. Connected workflows -Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting. - - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Direction Material - ----------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- - Input A supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset metadata, public Code authority and permitted meeting evidence. +Consumes Code authority and permitted Meetings evidence. Supplies +permitted snapshots to Records and context to Planning and Permitting. - Output Source-backed parcel context, informational answers, recorded human corrections and reviewed snapshots with stable hashes. - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Direction Material + ----------- ---------------------------------------------------------------------------------------------------------------------------------- + Input A supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset metadata, public Code authority and permitted meeting evidence. + Output Source-backed parcel context, informational answers, recorded human corrections and reviewed snapshots with stable hashes. Product boundary -The accepted path is local GeoJSON/PostGIS. It does not establish every ArcGIS, assessor or CKAN connector. Answers and process explanations are informational and do not issue an entitlement or an official zoning determination. +The accepted path is local GeoJSON/PostGIS. It does not establish every +ArcGIS, assessor or CKAN connector. Answers and process explanations are +informational and do not issue an entitlement or an official zoning +determination. Architecture -[Townlight Zoning architecture and evidence flow] - -The drawing shows the principal staff/evidence path. Native commands carry trusted identity to Python business services; PostgreSQL and retained original files hold durable state. A downstream copy does not silently transfer decision authority. Station has its own configured authority/media boundary, database and mutable files. The connected-workflow text supplies the drawing’s reading order and accessibility alternative. +The drawing shows the principal staff/evidence path. Native commands +carry trusted identity to Python business services; PostgreSQL and +retained original files hold durable state. A downstream copy does not +silently transfer decision authority. Station has its own configured +authority/media boundary, database and mutable files. The +connected-workflow text supplies the drawing’s reading order and +accessibility alternative. Discretionary processes and staff review Explain the cited process -In the existing Zoning workspace, complete Variance, conditional use or nonconformity question. Supply the applicable process Code section, zone code, optional comma-separated standard to cite, and optional observed condition, for example front_setback=8 feet. Select Explain the cited process. Choose actual imported public authority; the synthetic values below require matching synthetic sources to return supported guidance. +In the existing Zoning workspace, complete Variance, conditional use or +nonconformity question. Supply the applicable process Code section, zone +code, optional comma-separated standard to cite, and optional observed +condition, for example front_setback=8 feet. Select Explain the cited +process. Choose actual imported public authority; the synthetic values +below require matching synthetic sources to return supported guidance. -The mounted API is POST /desktop/v1/zoning/standards/process-explanation under the normal authenticated staff session. Its equivalent request body is: +The mounted API is POST /desktop/v1/zoning/standards/process-explanation +under the normal authenticated staff session. Its equivalent request +body is: {"question":"Explain the synthetic variance process","process_section":"18.20.050","zone_code":"SYN-R","rule_types":["front_setback"],"observed":{"front_setback":"8 feet"}} -Read process citations and each cited standard independently. The output can explain a verified process while reporting unavailable standards or review flags. A difference between an observation and a cited standard is an informational flag; it is not a variance finding, approval, nonconformity determination or substitute for planner review. If no relevant authority is available, obtain the source or leave the item unavailable. Do not attach an unrelated citation to a proposed requirement. +Read process citations and each cited standard independently. The output +can explain a verified process while reporting unavailable standards or +review flags. A difference between an observation and a cited standard +is an informational flag; it is not a variance finding, approval, +nonconformity determination or substitute for planner review. If no +relevant authority is available, obtain the source or leave the item +unavailable. Do not attach an unrelated citation to a proposed +requirement. Keep parcel import and inspection in the right order -Check the complete JSON envelope, original hashes and EPSG:4326 geometry before submitting Import parcel dataset. That control sends the import directly; it does not open a separate preview/commit screen. Inspect the returned validation/provenance and saved dataset. The browser refuses bundle files larger than 20 MiB; valid geometry and metadata remain subject to server validation. Correct the source bundle after a refusal and retain earlier evidence rather than forcing SQL changes. +Check the complete JSON envelope, original hashes and EPSG:4326 geometry +before submitting Import parcel dataset. That control sends the import +directly; it does not open a separate preview/commit screen. Inspect the +returned validation/provenance and saved dataset. The browser refuses +bundle files larger than 20 MiB; valid geometry and metadata remain +subject to server validation. Correct the source bundle after a refusal +and retain earlier evidence rather than forcing SQL changes. Use the existing specialist review contracts -The standalone Zoning application’s review/analytics/report routes are documented source capabilities, not extra native desktop screens. In a deployment where its actual staff authentication is already configured: - -- Create an ambiguity review with zone_code, question and reason at /api/v1/townlight_zoning/staff/ambiguity-reviews. Read its returned ID and list state. Update that ID with status, optional assigned_to and resolution; use open, in_review, resolved or closed. Resolving or closing requires a nonempty resolution. -- Retain a flagged answer at /api/v1/townlight_zoning/staff/flagged-answers with the original question/answer, zone, flag reason and source citations. Use /{review_id}/improve with improved_answer and improvement_notes. Preserve the original and improvement attribution; a correction does not rewrite the imported Code source. -- Read /api/v1/townlight_zoning/staff/questions/analytics with the desired high_volume_threshold to identify repeated questions and uncertain answers. Analytics counts are review aids, not jurisdictional conclusions. -- Create /api/v1/townlight_zoning/staff/reports/outline with a title and actual selected question_ids/queue_item_ids. Review the resulting outline and citations before incorporating it in a staff report. It is not a filed report or a meeting decision. +The standalone Zoning application’s review/analytics/report routes are +documented source capabilities, not extra native desktop screens. In a +deployment where its actual staff authentication is already configured: + +- Create an ambiguity review with zone_code, question and reason at + /api/v1/townlight_zoning/staff/ambiguity-reviews. Read its returned ID + and list state. Update that ID with status, optional assigned_to and + resolution; use open, in_review, resolved or closed. Resolving or + closing requires a nonempty resolution. +- Retain a flagged answer at + /api/v1/townlight_zoning/staff/flagged-answers with the original + question/answer, zone, flag reason and source citations. Use + /{review_id}/improve with improved_answer and improvement_notes. + Preserve the original and improvement attribution; a correction does + not rewrite the imported Code source. +- Read /api/v1/townlight_zoning/staff/questions/analytics with the + desired high_volume_threshold to identify repeated questions and + uncertain answers. Analytics counts are review aids, not + jurisdictional conclusions. +- Create /api/v1/townlight_zoning/staff/reports/outline with a title and + actual selected question_ids/queue_item_ids. Review the resulting + outline and citations before incorporating it in a staff report. It is + not a filed report or a meeting decision. A synthetic ambiguity request is: {"zone_code":"SYN-R","question":"Which retained setback rule applies?","reason":"Synthetic overlay ambiguity requires planner review"} -Do not send invented staff-role headers or assume these standalone paths exist at the installed desktop origin. The native workspace’s supported review/history/snapshot controls continue to use its fixed authenticated bridge. Use the technical supplement to distinguish the two surfaces. +Do not send invented staff-role headers or assume these standalone paths +exist at the installed desktop origin. The native workspace’s supported +review/history/snapshot controls continue to use its fixed authenticated +bridge. Use the technical supplement to distinguish the two surfaces. -Source contracts: townlight_runtime/zoning_bridge.py, townlight_zoning/main.py, the imported rule/source models and desktop Zoning view. +Source contracts: townlight_runtime/zoning_bridge.py, +townlight_zoning/main.py, the imported rule/source models and desktop +Zoning view. Technical specifications Runtime and storage -The accepted package targets Windows x64 fresh installation. Its native shell uses Rust 2021, Tauri 2 and Microsoft WebView2; browser assets are JavaScript built with Vite 8.1.6. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic, with PostgreSQL 17 / PostGIS and managed original files. The installed runtime tested here contains FastAPI 0.162.0. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. - -The native transport is fixed to loopback 127.0.0.1:15480; PostgreSQL uses the configured local runtime port (default 15432). Optional local model service defaults to 127.0.0.1:15434. Those are deployment defaults, not internet endpoints. The runtime has health, module and readiness endpoints; readiness is stronger than process existence. The task queue is the existing local Core task infrastructure, not an assertion that a separate Redis service is required for this desktop composition. - -The default native profile is %LOCALAPPDATA%\CivicSuite; the historical directory name remains part of compatibility. Do not rename it to Townlight. A configured TOWNLIGHT_PROFILE_ROOT must be absolute. Local configuration and secrets live under that profile; protected managed files and database state must be backed up coherently. Source/runtime identity is distinct from a product’s display label. +The accepted package targets Windows x64 fresh installation. Its native +shell uses Rust 2021, Tauri 2 and Microsoft WebView2; browser assets are +JavaScript built with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled CPython +3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic, with PostgreSQL 17 / +PostGIS and managed original files. The installed runtime tested here +contains FastAPI 0.162.0. Package minimum Python requirements can differ +from the bundled executable; the metadata reference preserves both. No +stack rewrite is implied by the beta label. + +The native transport is fixed to loopback 127.0.0.1:15480; PostgreSQL +uses the configured local runtime port (default 15432). Optional local +model service defaults to 127.0.0.1:15434. Those are deployment +defaults, not internet endpoints. The runtime has health, module and +readiness endpoints; readiness is stronger than process existence. The +task queue is the existing local Core task infrastructure, not an +assertion that a separate Redis service is required for this desktop +composition. + +The default native profile is %LOCALAPPDATA%\CivicSuite; the historical +directory name remains part of compatibility. Do not rename it to +Townlight. A configured TOWNLIGHT_PROFILE_ROOT must be absolute. Local +configuration and secrets live under that profile; protected managed +files and database state must be backed up coherently. Source/runtime +identity is distinct from a product’s display label. Data and consistency -GeoJSON import datasets; parcels and zone/overlay context; cited rules; questions and answers; review events; selected Meetings history; immutable snapshots. +GeoJSON import datasets; parcels and zone/overlay context; cited rules; +questions and answers; review events; selected Meetings history; +immutable snapshots. -Versioned saves use expected prior revision identifiers where defined. Reopen and reconcile on conflict. Exact exports and handoffs use source IDs, current visibility, revision and SHA256. Review belongs to the saved revision and does not transfer silently to edited text. Database changes use the owning product’s migrations; a request or readiness check is not an authorization to mutate schema. +Versioned saves use expected prior revision identifiers where defined. +Reopen and reconcile on conflict. Exact exports and handoffs use source +IDs, current visibility, revision and SHA256. Review belongs to the +saved revision and does not transfer silently to edited text. Database +changes use the owning product’s migrations; a request or readiness +check is not an authorization to mutate schema. Capacity and platform statements -This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The new installer size remains pending its build; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. +This beta has synthetic single-profile workflow evidence. It does not +have a published benchmark for concurrent staff capacity, minimum +RAM/CPU, large-source limits or a field SLA. Do not turn a developer +machine’s specification into a supported minimum. The signed MSI is +2,082,697,216 bytes; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads. -The exact runtime payload lock records pinned files, sizes and hashes. The component metadata records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. +The exact runtime payload lock records pinned files, sizes and hashes. +The component metadata records shipped dependency declarations. These +references are more precise than a manually copied dependency list. +Third-party and historical license notices must accompany their matching +payloads. Configuration and administration Native deployment configuration -Use Setup, Settings and System Health for supported staff operation. Administrators provision folders, backup storage, named accounts and the city profile. Select inspections-preview for the bounded desktop composition, including Access and Notice. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. - -Technical deployments use TOWNLIGHT_PRODUCT_PROFILE, TOWNLIGHT_PROFILE_ROOT, DATABASE_URL, TOWNLIGHT_RUNTIME_PORT, PORTAL_MODE and the runtime-managed secret files. Treat database URLs and native session proofs as secrets. The installed native domain runtime explicitly refuses non-loopback binding. PORTAL_MODE=private is the accepted posture; changing it does not by itself commission an internet portal, authentication provider or reverse proxy. - -The isolated documentation exporter sets a fictional profile and unusable synthetic database origin only to read schemas; those values are not deployment configuration. Keep deployment values in the intended process/account scope. An already-running process does not automatically inherit later environment edits. +Use Setup, Settings and System Health for supported staff operation. +Administrators provision folders, backup storage, named accounts and the +city profile. Select inspections-preview for the bounded desktop +composition, including Access and Notice. Station remains a separate +service boundary. Do not use a standalone product’s demo server as a +substitute for the installed workspace. + +Technical deployments use TOWNLIGHT_PRODUCT_PROFILE, +TOWNLIGHT_PROFILE_ROOT, DATABASE_URL, TOWNLIGHT_RUNTIME_PORT, +PORTAL_MODE and the runtime-managed secret files. Treat database URLs +and native session proofs as secrets. The installed native domain +runtime explicitly refuses non-loopback binding. PORTAL_MODE=private is +the accepted posture; changing it does not by itself commission an +internet portal, authentication provider or reverse proxy. + +The isolated documentation exporter sets a fictional profile and +unusable synthetic database origin only to read schemas; those values +are not deployment configuration. Keep deployment values in the intended +process/account scope. An already-running process does not automatically +inherit later environment edits. API and integration examples Native command example -The following JavaScript belongs in the existing trusted Townlight frontend/development environment with invoke imported from @tauri-apps/api/core. It is not a command for an arbitrary web page or an instruction for nontechnical staff. IDs must come from records created in an isolated synthetic exercise. +The following JavaScript belongs in the existing trusted Townlight +frontend/development environment with invoke imported from +@tauri-apps/api/core. It is not a command for an arbitrary web page or +an instruction for nontechnical staff. IDs must come from records +created in an isolated synthetic exercise. import { invoke } from '@tauri-apps/api/core'; const result = await invoke('zoning_domain_request', {request: {operation: 'history', id: questionId}}); @@ -203,7 +381,12 @@ The following JavaScript belongs in the existing trusted Townlight frontend/deve Trusted local HTTP example -An administrator/developer can inspect an already-configured isolated runtime from a trusted local process. This PowerShell example reads the signed-in synthetic profile’s existing proof into memory; it does not create a user, seed a session, reveal the proof in output or bypass a permission check. Do not use real city data in development examples. A read response does not prove approval or publication. +An administrator/developer can inspect an already-configured isolated +runtime from a trusted local process. This PowerShell example reads the +signed-in synthetic profile’s existing proof into memory; it does not +create a user, seed a session, reveal the proof in output or bypass a +permission check. Do not use real city data in development examples. A +read response does not prove approval or publication. $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite' $sessionPath = Join-Path $profilePath 'config\local-session.json' @@ -214,11 +397,24 @@ An administrator/developer can inspect an already-configured isolated runtime fr Complete synthetic source bundle -The synthetic Zoning bundle is the retained fixture used by the beta staff exercise. It includes the complete supported source envelope rather than a shortened pseudo-payload. Keep its fictional source labels. For Planning, wrap it as {"bundle": BUNDLE, "expected_previous_revision": null}; for Permitting use {"bundle": BUNDLE, "expected_revision": null}. Code and Zoning take their own complete import envelopes. Replace null with the current expected revision when revising an existing source, as the applicable schema requires. These are import examples, not legal authority or permission to load them into a live city profile. +The synthetic Zoning bundle is the retained fixture used by the beta +staff exercise. It includes the complete supported source envelope +rather than a shortened pseudo-payload. Keep its fictional source +labels. For Planning, wrap it as +{"bundle": BUNDLE, "expected_previous_revision": null}; for Permitting +use {"bundle": BUNDLE, "expected_revision": null}. Code and Zoning take +their own complete import envelopes. Replace null with the current +expected revision when revising an existing source, as the applicable +schema requires. These are import examples, not legal authority or +permission to load them into a live city profile. A synthetic write with subsequent readback -This example demonstrates the existing Meetings HTTP contract in an isolated exercise. It is intentionally fictional. It does not start a service. Its authentication setup is included so it can be run independently under the signed-in synthetic account. If a write times out, inspect current records before repeating it. +This example demonstrates the existing Meetings HTTP contract in an +isolated exercise. It is intentionally fictional. It does not start a +service. Its authentication setup is included so it can be run +independently under the signed-in synthetic account. If a write times +out, inspect current records before repeating it. $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite' $sessionPath = Join-Path $profilePath 'config/local-session.json' @@ -238,158 +434,261 @@ This example demonstrates the existing Meetings HTTP contract in an isolated exe -Headers $headers Remove-Variable session, headers -This write requires Meetings to be enabled and the signed-in staff role to permit it. It is a cross-suite integration example; for this product’s request models, use the complete technical reference below. +This write requires Meetings to be enabled and the signed-in staff role +to permit it. It is a cross-suite integration example; for this +product’s request models, use the complete technical reference below. Complete technical contract -Read the Zoning API reference for every documented operation, request field, constraint, response declaration and source supplement. Download the OpenAPI JSON for tools. For Station this is the suite-side schema only; its separate service contract is documented in the API supplement. The reference directory includes configuration/source inventories, dependency declarations, native command contracts, MCP signatures and candidate evidence. +Read the Zoning API reference for every documented operation, request +field, constraint, response declaration and source supplement. Download +the OpenAPI JSON for tools. For Station this is the suite-side schema +only; its separate service contract is documented in the API supplement. +The reference directory includes configuration/source inventories, +dependency declarations, native command contracts, MCP signatures and +candidate evidence. MCP and automation boundary -No direct product MCP server is exposed by the accepted Townlight desktop or Station boundary. Do not configure an invented townlight mcp command or assume an AI client has staff permissions. The integration surfaces for this beta are native IPC, the documented HTTP APIs, source bundle imports, exact exports and the existing Station CLI. +No direct product MCP server is exposed by the accepted Townlight +desktop or Station boundary. Do not configure an invented townlight mcp +command or assume an AI client has staff permissions. The integration +surfaces for this beta are native IPC, the documented HTTP APIs, source +bundle imports, exact exports and the existing Station CLI. -The bundled transcription code includes a TextFlowKit MCP adapter as a separate source capability. It offers job-based transcribe_media, get_transcript, list_jobs, get_job_status and export_transcript, and additional tools declared in that adapter. It uses stdio first and optional Streamable HTTP, with the MCP SDK as an optional extra. It is not automatically launched, authenticated as Townlight staff or accepted as a Townlight product MCP deployment. This documentation does not add such a service. +The bundled transcription code includes a TextFlowKit MCP adapter as a +separate source capability. It offers job-based transcribe_media, +get_transcript, list_jobs, get_job_status and export_transcript, and +additional tools declared in that adapter. It uses stdio first and +optional Streamable HTTP, with the MCP SDK as an optional extra. It is +not automatically launched, authenticated as Townlight staff or accepted +as a Townlight product MCP deployment. This documentation does not add +such a service. -For a transcription client already provisioned separately, an illustrative tool call is: +For a transcription client already provisioned separately, an +illustrative tool call is: {"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} -Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the MCP source reference. Station meeting capture does not become live speech recognition because this optional donor adapter exists. +Use a job ID returned by that transcription service. This example does +not create a Townlight record or bypass its review/Records handoff. The +exact optional adapter tool signatures are supplied in the MCP source +reference. Station meeting capture does not become live speech +recognition because this optional donor adapter exists. Security and permissions -Use your own named account and save before leaving a screen. A saved draft is durable; unsaved form text may not be. If a write has an unknown result, reopen its record before repeating it. - -Read source jurisdiction, dates, citation, version and visibility. A copied source hash identifies exact bytes, not their legal applicability. If a source changes or permission is removed, resolve the source problem rather than substituting stale cached content. - -Keep originals and derivatives separate. Review the intended audience before export. A public summary excludes private fields only through the applicable copy contract and your review. A renamed private packet is still private content. - -Drafting, review, approval, attachment, export, fulfillment and publication are separate operations. A Townlight workpaper does not itself adopt law, issue a permit, impose a fine or release a records response. The responsible staff member records the applicable decision. - -The native session is validated and mapped to a persisted SQL identity. An editable actor/reviewer label is not authentication. Product/module permissions and source visibility apply at the server boundary. Revoked/unavailable authority fails closed for new Station operations; a previous permission result is not a perpetual authorization. - -Use protected local folders, account permissions and credential storage. Never include the native session file, database passwords, provider keys or unredacted support bundles in a public issue or generated public documentation. A local public view is not automatically a secured internet deployment. Keep network exposure and real equipment acceptance specific to the chosen beta site. +Use your own named account and save before leaving a screen. A saved +draft is durable; unsaved form text may not be. If a write has an +unknown result, reopen its record before repeating it. + +Read source jurisdiction, dates, citation, version and visibility. A +copied source hash identifies exact bytes, not their legal +applicability. If a source changes or permission is removed, resolve the +source problem rather than substituting stale cached content. + +Keep originals and derivatives separate. Review the intended audience +before export. A public summary excludes private fields only through the +applicable copy contract and your review. A renamed private packet is +still private content. + +Drafting, review, approval, attachment, export, fulfillment and +publication are separate operations. A Townlight workpaper does not +itself adopt law, issue a permit, impose a fine or release a records +response. The responsible staff member records the applicable decision. + +The native session is validated and mapped to a persisted SQL identity. +An editable actor/reviewer label is not authentication. Product/module +permissions and source visibility apply at the server boundary. +Revoked/unavailable authority fails closed for new Station operations; a +previous permission result is not a perpetual authorization. + +Use protected local folders, account permissions and credential storage. +Never include the native session file, database passwords, provider keys +or unredacted support bundles in a public issue or generated public +documentation. A local public view is not automatically a secured +internet deployment. Keep network exposure and real equipment acceptance +specific to the chosen beta site. Backup recovery and maintenance -Save work and use Core’s canonical Backup Now before maintenance. That operation stops writers. Preserve the coherent profile/database/document backup and its receipt, then use Start to resume. A source export is not a full backup. - -Use Restore Latest Backup through the supported controls. If the result says Restore needs service start, use Start, then Check, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. - -Keep Station’s dedicated database and media evidence together in its own backup. Core’s native-profile backup must not be assumed to include an external Station data directory. Stop writers during a coordinated backup. Preserve failed media attempts and logs. - -On failure, record the time, selected composition, component/installer versions and exact message. Check System Health for stopped, starting, ready or failed dependencies. Use the existing Retry control after readiness; do not create duplicate business records to refresh a stale view. Share only a redacted diagnostic bundle. Preserve secrets, original evidence, recovery material and unrelated installations. +Save work and use Core’s canonical Backup Now before maintenance. That +operation stops writers. Preserve the coherent profile/database/document +backup and its receipt, then use Start to resume. A source export is not +a full backup. + +Use Restore Latest Backup through the supported controls. If the result +says Restore needs service start, use Start, then Check, and reopen a +known record. Do not repeat restore merely because services need to +start. The fresh-profile acceptance verified that a fulfilled request +survived restore and a post-backup marker did not. + +Keep Station’s dedicated database and media evidence together in its own +backup. Core’s native-profile backup must not be assumed to include an +external Station data directory. Stop writers during a coordinated +backup. Preserve failed media attempts and logs. + +On failure, record the time, selected composition, component/installer +versions and exact message. Check System Health for stopped, starting, +ready or failed dependencies. Use the existing Retry control after +readiness; do not create duplicate business records to refresh a stale +view. Share only a redacted diagnostic bundle. Preserve secrets, +original evidence, recovery material and unrelated installations. Troubleshooting - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Symptom Likely meaning Next action ----------------------------- ------------------------------------------------------------------------ -------------------------------------------------------------------------------------------------- Workspace absent Wrong product composition or unavailable canonical runtime. Check selected composition; activate through Finish Records Migration; wait for readiness. - Cannot sign in / 401 Missing or expired named account session. Sign in normally; reopen a Station launch ticket if applicable. - Permission denied / 403 Account, module, source or browser-origin permission. Ask the authorized administrator to inspect the intended permission; do not invent role headers. - Save conflict / 409 The saved revision, expected source hash or lifecycle changed. Keep edits, reopen current state and reconcile deliberately. - Invalid input / 422 Required field, format, geometry, source envelope or state is invalid. Read the field detail and correct the input/source; preserve originals. - Service unavailable / 503 Database, schema, connected source or configuration unavailable. Inspect System Health and the named dependency. Preserve work; retry only after readiness. - Export refused Missing exact review, approval, audience or source authorization. Read the refusal and complete the owning product’s explicit decision. - Restore needs service start The snapshot was restored but services have not resumed. Use Start, then Check and verify a saved record; do not blindly repeat restore. - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Verified workflows and limits - -------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Product Recorded result Precisely exercised - ----------------------- ----------------------- -------------------------------------------------------------------------------------------------------------------- - Zoning PASS GeoJSON/PostGIS import, cited dimensional rule, parcel answer, staff review/history/snapshot and native workspace. - - -------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -These results come from the identified signed candidate’s fresh normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source bundles and media were synthetic. The guest install/uninstall and recovery passed, and the owned Sandbox stopped. No host installed application or standalone CivicCast was changed. This documentation task reuses those receipts; it does not claim a new software acceptance run. - -The workflow matrix identifies raw receipt filenames. The evidence index retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. - -The limits remain: actual city field acceptance and equipment/network commissioning; Station automatic provisioning/SCM commissioning; every UI/role combination; field recognition accuracy; and historical in-place upgrades are not certified. They are not five invented feature requirements. Fresh-install controlled beta handoff remains the accepted scope. This package makes no city-deployment, publication or general-availability claim. + Product Recorded result Precisely exercised + --------- ----------------- -------------------------------------------------------------------------------------------------------------------- + Zoning PASS GeoJSON/PostGIS import, cited dimensional rule, parcel answer, staff review/history/snapshot and native workspace. + +These results come from the identified signed candidate’s fresh +normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and +selected headless controls. All accounts, source bundles and media were +synthetic. The guest install/uninstall and recovery passed, and the +owned Sandbox stopped. No host installed application or standalone +CivicCast was changed. This documentation task reuses those receipts; it +does not claim a new software acceptance run. + +See the Windows acceptance summary for this MSI. The historical evidence +index applies to its original build. + +The limits remain: actual city field acceptance and equipment/network +commissioning; Station automatic provisioning/SCM commissioning; every +UI/role combination; field recognition accuracy; and historical in-place +upgrades are not certified. They are not five invented feature +requirements. Fresh-install controlled beta handoff remains the accepted +scope. This package makes no city-deployment, publication or +general-availability claim. Terms of service and license Scope and status -These terms describe the Townlight Beta 1 software and this documentation package. This is a locally prepared private beta, not a hosted-service subscription, a city deployment agreement or a public release. No uptime commitment, support response time, indemnity, data-processing agreement or paid service is created by these documents. A separate signed agreement, if any, governs services it actually provides. +These terms describe the Townlight Beta 1 software and this +documentation package. This public Windows beta is for evaluation. No +uptime commitment, support response time, indemnity, data-processing +agreement or paid service is created by these documents. A separate +signed agreement, if any, governs services it actually provides. Software license and rights -Current Townlight-owned distributions identified in this candidate use AGPL-3.0-only. The full license is supplied with this documentation and with the source companion. The license governs rights to run, copy, modify and convey the covered software; these operational terms do not add restrictions to those rights. Historical grants and dependency licenses retain their own terms. CivicCast remains a separate product and is not relicensed by this documentation work. - -When conveying covered software, retain applicable notices and provide the corresponding source and installation/build information required by the license. For a modified version supporting remote network interaction, follow section 13’s source-offer requirement. The companion archive identifies the source for this candidate; a link to a different public branch is not a substitute for the matching source. Read the supplied license for the complete conditions. See the GNU license reference and GNU licensing FAQ. +Current Townlight-owned distributions identified in this candidate use +AGPL-3.0-only. The full license is supplied with this documentation and +with the source companion. The license governs rights to run, copy, +modify and convey the covered software; these operational terms do not +add restrictions to those rights. Historical grants and dependency +licenses retain their own terms. CivicCast remains a separate product +and is not relicensed by this documentation work. + +When conveying covered software, retain applicable notices and provide +the corresponding source and installation/build information required by +the license. For a modified version supporting remote network +interaction, follow section 13’s source-offer requirement. The companion +archive identifies the source for this candidate; a link to a different +public branch is not a substitute for the matching source. Read the +supplied license for the complete conditions. See the GNU license +reference and GNU licensing FAQ. Data ownership and access -Importing a document does not transfer its ownership or grant permission to publish it. The operating organization controls its accounts, access decisions, lawful source use, retention and review/release policy. Keep resident information, credentials, private notes and restricted evidence in their authorized locations. Documentation examples contain fictional data. No real city account, credential or record is required to exercise these examples in an isolated test environment. +Importing a document does not transfer its ownership or grant permission +to publish it. The operating organization controls its accounts, access +decisions, lawful source use, retention and review/release policy. Keep +resident information, credentials, private notes and restricted evidence +in their authorized locations. Documentation examples contain fictional +data. No real city account, credential or record is required to exercise +these examples in an isolated test environment. Local operation and external processors -The accepted beta workflow is local and uses named staff accounts. Station has separate storage and credentials. Configure backup destinations and optional model/network providers deliberately. A configured external provider may receive submitted prompts, images or audio according to that configuration and provider’s terms; this documentation does not promise that every optional configuration is offline. An email outbox or local public view does not establish external delivery or an internet deployment. This static documentation site has no analytics, account collection or remote font dependency. +The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency. Staff decisions and source applicability -Staff verify the jurisdiction, source currency, permissions, citations and proposed audience. Model output and generated guidance require review. No draft is automatically an official legal interpretation, zoning determination, permit approval, fee assessment, enforcement notice or records-release decision. Official permit fee authority remains with the adopted source and responsible organization; imported amounts do not become a new authoritative calculation. +Staff verify the jurisdiction, source currency, permissions, citations +and proposed audience. Model output and generated guidance require +review. No draft is automatically an official legal interpretation, +zoning determination, permit approval, fee assessment, enforcement +notice or records-release decision. Official permit fee authority +remains with the adopted source and responsible organization; imported +amounts do not become a new authoritative calculation. Beta operation and recovery -Use the identified candidate in its supported fresh-install scope. Preserve backups and original evidence. Test physical equipment and chosen network/service configuration before relying on them. The supplied acceptance describes selected synthetic workflows, not every screen, vendor, field condition or upgrade. Operators decide whether a particular deployment meets their own operational obligations. +Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations. Warranty and liability -The covered software’s warranty and liability conditions are those in sections 15–17 of the supplied AGPL and any applicable separate written undertaking. This documentation creates no additional warranty or limitation beyond those terms. Third-party software is subject to its retained license notices. Nothing here removes rights that applicable law makes nonwaivable. +The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable. Support and incident reporting -Use the project’s existing SUPPORT and SECURITY guidance for its matching repository. Report reproducible behavior with the version, operation and redacted logs. Do not put credentials, resident records or unredacted evidence in a public issue. Coordinate sensitive reports through the channel designated in SECURITY. No new support address or service commitment is invented here. +Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here. Ending a beta exercise and document changes -When an organization ends testing, it controls retention/export and removes access according to its policy. Uninstall may retain data; back up and inspect the selected removal options. Ending an exercise does not revoke rights already granted by AGPL. Later software/documentation versions must identify their changed candidate and scope; historical receipts retain their original identities. These terms do not claim that a city has accepted a contract merely by reading a manual. +When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual. Glossary - --------------------------------------------------------------------------------------------------------------------------------------------------------- - Term Meaning - ----------------------------------- --------------------------------------------------------------------------------------------------------------------- - Approval An explicit authorized decision on the saved text/artifact. It is separate from saving or attachment. - - Canonical record The owning product’s retained identity and saved version, rather than an editable copied label. - - Composition The selected set of desktop modules; inspections-preview exposes the eight staff products. - - Corresponding source The source/build material matching the delivered covered program, subject to its license. - - Derivative / Records copy A separately prepared document with its own intended audience and hash. - - Hash / SHA256 A fingerprint of exact bytes. It detects change; it does not establish legal authority. - - Idempotency Repeating the same identified request has the same intended effect; changing its payload can be refused. - - IPC The native desktop command boundary between its browser interface and Rust host. - - MCP Model Context Protocol; no direct Townlight product server is enabled by this beta. - - Original Retained source bytes. A reviewed derivative does not replace them. - - Provenance Source, version, date, actor and relationship information retained with evidence. - - Revision An immutable saved version. Later edits do not inherit an earlier review automatically. - - Snapshot A fixed audience-specific copy tied to a source/reviewed revision. - - Station Townlight’s separate media boundary using a pinned CivicCast-derived engine; standalone CivicCast remains separate. - --------------------------------------------------------------------------------------------------------------------------------------------------------- + Term Meaning + --------------------------- --------------------------------------------------------------------------------------------------------------------- + Approval An explicit authorized decision on the saved text/artifact. It is separate from saving or attachment. + Canonical record The owning product’s retained identity and saved version, rather than an editable copied label. + Composition The selected set of desktop modules; inspections-preview exposes the eight staff products. + Corresponding source The source/build material matching the delivered covered program, subject to its license. + Derivative / Records copy A separately prepared document with its own intended audience and hash. + Hash / SHA256 A fingerprint of exact bytes. It detects change; it does not establish legal authority. + Idempotency Repeating the same identified request has the same intended effect; changing its payload can be refused. + IPC The native desktop command boundary between its browser interface and Rust host. + MCP Model Context Protocol; no direct Townlight product server is enabled by this beta. + Original Retained source bytes. A reviewed derivative does not replace them. + Provenance Source, version, date, actor and relationship information retained with evidence. + Revision An immutable saved version. Later edits do not inherit an earlier review automatically. + Snapshot A fixed audience-specific copy tied to a source/reviewed revision. + Station Townlight’s separate media boundary using a pinned CivicCast-derived engine; standalone CivicCast remains separate. Alphabetical subject index @@ -414,14 +713,21 @@ Alphabetical subject index Operating subject links -- Discretionary processes and staff review — Discretionary processes and staff review. +- Discretionary processes and staff review — Discretionary processes and + staff review. - Explain the cited process — Explain the cited process. -- Keep parcel import and inspection in the right order — Keep parcel import and inspection in the right order. -- Use the existing specialist review contracts — Use the existing specialist review contracts. +- Keep parcel import and inspection in the right order — Keep parcel + import and inspection in the right order. +- Use the existing specialist review contracts — Use the existing + specialist review contracts. Source and document control -This edition is authored from the immutable corresponding-source companion, the generated installed-domain schema and the retained workflow receipts. The current software versions and signed artifacts are unchanged. Public historical pages are not synchronized or published by this local documentation task. +This edition is authored from the immutable corresponding-source +companion, the generated installed-domain schema and the retained +workflow receipts. The current software versions and signed artifacts +are unchanged. Public historical pages are not synchronized or published +by this local documentation task. Workflow subject index diff --git a/docs/beta-1/api/access.html b/docs/beta-1/api/access.html index a6e0c5e..4bab2be 100644 --- a/docs/beta-1/api/access.html +++ b/docs/beta-1/api/access.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Access API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Access API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Access 0.5.0. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/code.html b/docs/beta-1/api/code.html index fcab814..6c86a44 100644 --- a/docs/beta-1/api/code.html +++ b/docs/beta-1/api/code.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Code API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Code API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Code 1.0.9. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/core.html b/docs/beta-1/api/core.html index 07dc8dd..ad9db42 100644 --- a/docs/beta-1/api/core.html +++ b/docs/beta-1/api/core.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Core API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Core API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Core 1.3.0.dev2. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/inspections.html b/docs/beta-1/api/inspections.html index 91ede31..415710f 100644 --- a/docs/beta-1/api/inspections.html +++ b/docs/beta-1/api/inspections.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Inspections API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Inspections API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Inspections 0.3.0+dev.2. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/meetings.html b/docs/beta-1/api/meetings.html index a0337ea..c2817c1 100644 --- a/docs/beta-1/api/meetings.html +++ b/docs/beta-1/api/meetings.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Meetings API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Meetings API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Meetings 1.0.5. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/notice.html b/docs/beta-1/api/notice.html index 275a264..c9e3b8f 100644 --- a/docs/beta-1/api/notice.html +++ b/docs/beta-1/api/notice.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Notice API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Notice API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Notice 0.3.0. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/permitting.html b/docs/beta-1/api/permitting.html index 9b8dc83..9e64463 100644 --- a/docs/beta-1/api/permitting.html +++ b/docs/beta-1/api/permitting.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Permitting API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Permitting API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Permitting 0.3.0+dev.2. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/planning.html b/docs/beta-1/api/planning.html index 39ab819..dacbe93 100644 --- a/docs/beta-1/api/planning.html +++ b/docs/beta-1/api/planning.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Planning API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Planning API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Planning 0.4.0.dev2. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/records.html b/docs/beta-1/api/records.html index 5bba24d..88a8201 100644 --- a/docs/beta-1/api/records.html +++ b/docs/beta-1/api/records.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Records API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Records API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Records 1.8.0.dev2. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/station-service-openapi.json b/docs/beta-1/api/station-service-openapi.json new file mode 100644 index 0000000..0df0b54 --- /dev/null +++ b/docs/beta-1/api/station-service-openapi.json @@ -0,0 +1,1962 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Townlight Station", + "version": "0.3.0" + }, + "paths": { + "/health": { + "get": { + "summary": "Health", + "operationId": "health_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/v1/identity": { + "get": { + "summary": "Identity", + "operationId": "identity_v1_identity_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/recordings": { + "post": { + "summary": "Capture", + "operationId": "capture_v1_recordings_post", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Capture" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "summary": "List Records", + "operationId": "list_records_v1_recordings_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/recordings/{identity}": { + "get": { + "summary": "Get Record", + "operationId": "get_record_v1_recordings__identity__get", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/recordings/{identity}/content": { + "get": { + "summary": "Content", + "operationId": "content_v1_recordings__identity__content_get", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/recordings/{identity}/retry": { + "post": { + "summary": "Retry", + "operationId": "retry_v1_recordings__identity__retry_post", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/live-sources": { + "get": { + "summary": "Live Sources", + "operationId": "live_sources_v1_live_sources_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/recordings/{identity}/stop": { + "post": { + "summary": "Stop Live", + "operationId": "stop_live_v1_recordings__identity__stop_post", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/civiccast-feeds": { + "get": { + "summary": "Catalog", + "operationId": "catalog_v1_civiccast_feeds_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/recordings/{identity}/youtube": { + "post": { + "summary": "Upload", + "operationId": "upload_v1_recordings__identity__youtube_post", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Upload" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/youtube-uploads": { + "get": { + "summary": "List Uploads", + "operationId": "list_uploads_v1_youtube_uploads_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/youtube-uploads/{identity}/retry": { + "post": { + "summary": "Retry", + "operationId": "retry_v1_youtube_uploads__identity__retry_post", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/schedules": { + "post": { + "summary": "Create Schedule", + "operationId": "create_schedule_v1_schedules_post", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScheduleRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "summary": "List Schedules", + "operationId": "list_schedules_v1_schedules_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/schedules/{identity}/cancel": { + "post": { + "summary": "Cancel Schedule", + "operationId": "cancel_schedule_v1_schedules__identity__cancel_post", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/playouts": { + "post": { + "summary": "Create Playout", + "operationId": "create_playout_v1_playouts_post", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlayoutRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "summary": "List Playouts", + "operationId": "list_playouts_v1_playouts_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/playouts/{identity}": { + "get": { + "summary": "Get Playout", + "operationId": "get_playout_v1_playouts__identity__get", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/on-air": { + "get": { + "summary": "On Air", + "operationId": "on_air_v1_on_air_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/on-air/live": { + "post": { + "summary": "Live Override", + "description": "Put a configured live input on air, in place of the scheduled program.", + "operationId": "live_override_v1_on_air_live_post", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LiveOverrideRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/on-air/return-to-schedule": { + "post": { + "summary": "Return To Schedule", + "operationId": "return_to_schedule_v1_on_air_return_to_schedule_post", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/playouts/{identity}/approve": { + "post": { + "summary": "Approve", + "operationId": "approve_v1_playouts__identity__approve_post", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApprovalRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/playouts/{identity}/publish": { + "post": { + "summary": "Publish", + "operationId": "publish_v1_playouts__identity__publish_post", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/public/playback/{identity}": { + "get": { + "summary": "Public Playback", + "operationId": "public_playback_v1_public_playback__identity__get", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/public/playback/{identity}/captions": { + "get": { + "summary": "Public Captions", + "operationId": "public_captions_v1_public_playback__identity__captions_get", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/public/playback/{identity}/program": { + "get": { + "summary": "Public Program", + "operationId": "public_program_v1_public_playback__identity__program_get", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/operator-ticket": { + "post": { + "summary": "Issue", + "operationId": "issue_v1_operator_ticket_post", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/operator/session": { + "post": { + "summary": "Exchange", + "operationId": "exchange_operator_session_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ticket" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/operator/logout": { + "post": { + "summary": "Logout", + "operationId": "logout_operator_logout_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/operator/catalog": { + "get": { + "summary": "Catalog", + "operationId": "catalog_operator_catalog_get", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/operator/meeting/{identity}": { + "get": { + "summary": "Meeting", + "operationId": "meeting_operator_meeting__identity__get", + "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/operator/handoff": { + "post": { + "summary": "Handoff", + "operationId": "handoff_operator_handoff_post", + "parameters": [ + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Handoff" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/": { + "get": { + "summary": "Page", + "operationId": "page__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/operator.js": { + "get": { + "summary": "Script", + "operationId": "script_operator_js_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/operator.css": { + "get": { + "summary": "Style", + "operationId": "style_operator_css_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ApprovalRequest": { + "properties": { + "note": { + "type": "string", + "maxLength": 500, + "minLength": 3, + "title": "Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "note" + ], + "title": "ApprovalRequest" + }, + "Capture": { + "properties": { + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "agenda_ids": { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array", + "maxItems": 100, + "title": "Agenda Ids" + }, + "source_file": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}$" + }, + { + "type": "null" + } + ], + "title": "Source File" + }, + "live_source_id": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$" + }, + { + "type": "null" + } + ], + "title": "Live Source Id" + }, + "civiccast_feed_id": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$" + }, + { + "type": "null" + } + ], + "title": "Civiccast Feed Id" + }, + "captions_file": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}\\.srt$" + }, + { + "type": "null" + } + ], + "title": "Captions File" + }, + "idempotency_key": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "title": "Idempotency Key" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "meeting_id", + "idempotency_key" + ], + "title": "Capture" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "Handoff": { + "properties": { + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "recording_id": { + "type": "string", + "format": "uuid", + "title": "Recording Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "request_id", + "recording_id", + "expected_sha256" + ], + "title": "Handoff" + }, + "LiveOverrideRequest": { + "properties": { + "live_source_id": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Live Source Id" + }, + "reason": { + "type": "string", + "maxLength": 200, + "minLength": 3, + "title": "Reason" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "live_source_id", + "reason" + ], + "title": "LiveOverrideRequest", + "description": "An on-air override naming an administrator-configured live input." + }, + "PlayoutRequest": { + "properties": { + "recording_id": { + "type": "string", + "format": "uuid", + "title": "Recording Id" + }, + "mode": { + "type": "string", + "pattern": "^(dry-run|commit)$", + "title": "Mode" + }, + "idempotency_key": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "title": "Idempotency Key" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "recording_id", + "mode", + "idempotency_key" + ], + "title": "PlayoutRequest" + }, + "ScheduleRequest": { + "properties": { + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "agenda_ids": { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array", + "maxItems": 100, + "title": "Agenda Ids" + }, + "source_file": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}$" + }, + { + "type": "null" + } + ], + "title": "Source File" + }, + "live_source_id": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$" + }, + { + "type": "null" + } + ], + "title": "Live Source Id" + }, + "captions_file": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}\\.srt$" + }, + { + "type": "null" + } + ], + "title": "Captions File" + }, + "start_at": { + "type": "string", + "format": "date-time", + "title": "Start At" + }, + "idempotency_key": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "title": "Idempotency Key" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "meeting_id", + "start_at", + "idempotency_key" + ], + "title": "ScheduleRequest" + }, + "Ticket": { + "properties": { + "ticket": { + "type": "string", + "maxLength": 128, + "minLength": 32, + "title": "Ticket" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ticket" + ], + "title": "Ticket" + }, + "Upload": { + "properties": { + "title": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "pattern": "^[^<>\\x00-\\x1f]+$", + "title": "Title" + }, + "privacy": { + "type": "string", + "enum": [ + "private", + "unlisted", + "public" + ], + "title": "Privacy", + "default": "private" + }, + "approval_note": { + "type": "string", + "maxLength": 500, + "minLength": 3, + "title": "Approval Note" + }, + "idempotency_key": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "title": "Idempotency Key" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "approval_note", + "idempotency_key" + ], + "title": "Upload" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + }, + "input": { + "title": "Input" + }, + "ctx": { + "type": "object", + "title": "Context" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + } + } + } +} \ No newline at end of file diff --git a/docs/beta-1/api/station.html b/docs/beta-1/api/station.html index 1d46cc3..256edf1 100644 --- a/docs/beta-1/api/station.html +++ b/docs/beta-1/api/station.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Station API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Station API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Station 0.3.0. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/suite.html b/docs/beta-1/api/suite.html index 7afab04..ca630ec 100644 --- a/docs/beta-1/api/suite.html +++ b/docs/beta-1/api/suite.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Suite API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Suite API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Desktop source 1.7.0-1; townlight-runtime 0.2.0. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/api/zoning.html b/docs/beta-1/api/zoning.html index e5ee5ce..5db5871 100644 --- a/docs/beta-1/api/zoning.html +++ b/docs/beta-1/api/zoning.html @@ -7,8 +7,8 @@ @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Zoning API reference

-

Prepared source candidate, November 2, 2026. New signed Windows installed acceptance and publication remain pending.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Zoning API reference

+

Windows Beta 1 · source reference. The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

Townlight Zoning 0.2.3. The HTTP host is Townlight Records 1.8.0.dev2. Component package versions and the host API version are separate identities.

Generated from the actual native inspections-preview composition without application lifespan, migrations or database/network access. It describes route and validation contracts; it does not establish endpoint behavior, individual authorization or installed acceptance. Standalone product applications have separate deployment boundaries.

Machine-readable OpenAPI schema · Operating manual and limits

diff --git a/docs/beta-1/assets/code-architecture.svg b/docs/beta-1/assets/code-architecture.svg new file mode 100644 index 0000000..a61123b --- /dev/null +++ b/docs/beta-1/assets/code-architecture.svg @@ -0,0 +1 @@ +Townlight Code architecturePrimary staff and evidence path. Additional supported connections are listed in the manual.Named staff accountReview sources and audienceCode workspaceNative fixed commandsPython domain runtimeIdentity and business validationPostgreSQL and originalsVersions and provenanceReviewed evidence copyExplicit version and hashRecords and recoverySeparate release or backupPrimary staff and evidence path. Additional supported connections are listed in the manual. \ No newline at end of file diff --git a/docs/beta-1/assets/core-architecture.svg b/docs/beta-1/assets/core-architecture.svg new file mode 100644 index 0000000..d31cb59 --- /dev/null +++ b/docs/beta-1/assets/core-architecture.svg @@ -0,0 +1 @@ +Townlight Core architecturePrimary staff and evidence path. Additional supported connections are listed in the manual.Named staff accountReview sources and audienceSetup Settings and HealthNamed accounts and readinessPython domain runtimeIdentity and business validationPostgreSQL and originalsVersions and provenanceCoherent backup controlsStop writers then snapshotRestore and readbackStart then CheckPrimary staff and evidence path. Additional supported connections are listed in the manual. \ No newline at end of file diff --git a/docs/beta-1/assets/inspections-architecture.svg b/docs/beta-1/assets/inspections-architecture.svg new file mode 100644 index 0000000..03a2f1a --- /dev/null +++ b/docs/beta-1/assets/inspections-architecture.svg @@ -0,0 +1 @@ +Townlight Inspections architecturePrimary staff and evidence path. Additional supported connections are listed in the manual.Named staff accountReview sources and audienceInspections workspaceNative fixed commandsPython domain runtimeIdentity and business validationPostgreSQL and originalsVersions and provenanceReviewed evidence copyExplicit version and hashRecords and recoverySeparate release or backupPrimary staff and evidence path. Additional supported connections are listed in the manual. \ No newline at end of file diff --git a/docs/beta-1/assets/meetings-architecture.svg b/docs/beta-1/assets/meetings-architecture.svg new file mode 100644 index 0000000..013fcaf --- /dev/null +++ b/docs/beta-1/assets/meetings-architecture.svg @@ -0,0 +1 @@ +Townlight Meetings architecturePrimary staff and evidence path. Additional supported connections are listed in the manual.Named staff accountReview sources and audienceMeetings workspaceNative fixed commandsPython domain runtimeIdentity and business validationPostgreSQL and originalsVersions and provenanceReviewed evidence copyExplicit version and hashRecords and recoverySeparate release or backupPrimary staff and evidence path. Additional supported connections are listed in the manual. \ No newline at end of file diff --git a/docs/beta-1/assets/permitting-architecture.svg b/docs/beta-1/assets/permitting-architecture.svg new file mode 100644 index 0000000..f0ea848 --- /dev/null +++ b/docs/beta-1/assets/permitting-architecture.svg @@ -0,0 +1 @@ +Townlight Permitting architecturePrimary staff and evidence path. Additional supported connections are listed in the manual.Named staff accountReview sources and audiencePermitting workspaceNative fixed commandsPython domain runtimeIdentity and business validationPostgreSQL and originalsVersions and provenanceReviewed evidence copyExplicit version and hashRecords and recoverySeparate release or backupPrimary staff and evidence path. Additional supported connections are listed in the manual. \ No newline at end of file diff --git a/docs/beta-1/assets/planning-architecture.svg b/docs/beta-1/assets/planning-architecture.svg new file mode 100644 index 0000000..7ade4b3 --- /dev/null +++ b/docs/beta-1/assets/planning-architecture.svg @@ -0,0 +1 @@ +Townlight Planning architecturePrimary staff and evidence path. Additional supported connections are listed in the manual.Named staff accountReview sources and audiencePlanning workspaceNative fixed commandsPython domain runtimeIdentity and business validationPostgreSQL and originalsVersions and provenanceReviewed evidence copyExplicit version and hashRecords and recoverySeparate release or backupPrimary staff and evidence path. Additional supported connections are listed in the manual. \ No newline at end of file diff --git a/docs/beta-1/assets/portal-architecture.svg b/docs/beta-1/assets/portal-architecture.svg new file mode 100644 index 0000000..5b3849c --- /dev/null +++ b/docs/beta-1/assets/portal-architecture.svg @@ -0,0 +1 @@ +Townlight portal architecturePrivate Meetings, Station and Records feed a native bridge. A private approved bundle flows to the separately deployed portal, which serves residents through a TLS proxy.Private staff environmentSeparate portal deploymentMeetings archiveStation recordingRecords releaseNative bridgeapproval + proof + checksWagtail portalcity pages + public archivePrivate release filesTLS reverse proxycity services + meetingsprivate ZIP diff --git a/docs/beta-1/assets/portal-home.png b/docs/beta-1/assets/portal-home.png new file mode 100644 index 0000000..c99e299 Binary files /dev/null and b/docs/beta-1/assets/portal-home.png differ diff --git a/docs/beta-1/assets/portal-meeting.png b/docs/beta-1/assets/portal-meeting.png new file mode 100644 index 0000000..524e104 Binary files /dev/null and b/docs/beta-1/assets/portal-meeting.png differ diff --git a/docs/beta-1/assets/records-architecture.svg b/docs/beta-1/assets/records-architecture.svg new file mode 100644 index 0000000..4577fb7 --- /dev/null +++ b/docs/beta-1/assets/records-architecture.svg @@ -0,0 +1 @@ +Townlight Records architecturePrimary staff and evidence path. Additional supported connections are listed in the manual.Named staff accountReview sources and audienceRecords workspaceNative fixed commandsPython domain runtimeIdentity and business validationPostgreSQL and originalsVersions and provenanceRelease decision and approvalExact reviewed responseExport and fulfillmentRetained audit trailPrimary staff and evidence path. Additional supported connections are listed in the manual. \ No newline at end of file diff --git a/docs/beta-1/assets/station-architecture.svg b/docs/beta-1/assets/station-architecture.svg new file mode 100644 index 0000000..ce93434 --- /dev/null +++ b/docs/beta-1/assets/station-architecture.svg @@ -0,0 +1 @@ +Townlight Station architectureMeetings → Station → Records. Standalone CivicCast has no shared mutable configuration or storage.Meetings and staff sessionCanonical context and authorityStation API and operatorTicket and durable requestsStation worker and mediaPinned isolated engineStation database and filesAttempts and verified mediaRecords evidence intakeHash checked private originalRecords review and releaseSeparate authorized decisionMeetings → Station → Records. Standalone CivicCast has no shared mutable configuration or storage. \ No newline at end of file diff --git a/docs/beta-1/assets/station-delivery-architecture.svg b/docs/beta-1/assets/station-delivery-architecture.svg new file mode 100644 index 0000000..bb1f02d --- /dev/null +++ b/docs/beta-1/assets/station-delivery-architecture.svg @@ -0,0 +1 @@ +Station delivery architecturePrivate capture is independent of live SRT delivery to CivicCast and completed recording uploads to YouTube.Chamber inputConfigured live MPEG-TSStation captureIndependent recording pipelinePrivate evidenceGrowing TS → verified recordingIsolated live senderEncrypted SRT; bounded buffersSeparate CivicCastPEG operator controls cableApproved upload queueSeparate worker; MP4 remuxYouTube recordingExplicit visibility and receipt \ No newline at end of file diff --git a/docs/beta-1/assets/suite-architecture.svg b/docs/beta-1/assets/suite-architecture.svg new file mode 100644 index 0000000..5206ca7 --- /dev/null +++ b/docs/beta-1/assets/suite-architecture.svg @@ -0,0 +1 @@ +Townlight Suite architectureNative desktop and canonical domain services; Station remains a separate configured boundary.Staff desktopEight product workspacesNative Rust and TauriSession and fixed IPCPython domain runtimeCanonical business rulesPostgreSQL and filesSaved work and originalsStation API and workerSeparate database and mediaRecords release workflowDecision then approvalNative desktop and canonical domain services; Station remains a separate configured boundary. \ No newline at end of file diff --git a/docs/beta-1/docx/Townlight-Access-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Access-Manual-Beta-1.docx index 2edaf64..bd2a640 100644 Binary files a/docs/beta-1/docx/Townlight-Access-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Access-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Code-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Code-Manual-Beta-1.docx index 54b01ed..8eb808d 100644 Binary files a/docs/beta-1/docx/Townlight-Code-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Code-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Core-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Core-Manual-Beta-1.docx index 529355c..1ac2765 100644 Binary files a/docs/beta-1/docx/Townlight-Core-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Core-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Inspections-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Inspections-Manual-Beta-1.docx index a801881..51f752f 100644 Binary files a/docs/beta-1/docx/Townlight-Inspections-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Inspections-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Meetings-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Meetings-Manual-Beta-1.docx index 7182d23..bf6d04d 100644 Binary files a/docs/beta-1/docx/Townlight-Meetings-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Meetings-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Notice-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Notice-Manual-Beta-1.docx index 3c63383..df4c5df 100644 Binary files a/docs/beta-1/docx/Townlight-Notice-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Notice-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Permitting-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Permitting-Manual-Beta-1.docx index 390e03b..a631a99 100644 Binary files a/docs/beta-1/docx/Townlight-Permitting-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Permitting-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Planning-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Planning-Manual-Beta-1.docx index 6754f2d..f130233 100644 Binary files a/docs/beta-1/docx/Townlight-Planning-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Planning-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Portal-Guide-Beta-1.docx b/docs/beta-1/docx/Townlight-Portal-Guide-Beta-1.docx new file mode 100644 index 0000000..d9196e3 Binary files /dev/null and b/docs/beta-1/docx/Townlight-Portal-Guide-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Records-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Records-Manual-Beta-1.docx index 7802795..3caa12c 100644 Binary files a/docs/beta-1/docx/Townlight-Records-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Records-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Station-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Station-Manual-Beta-1.docx index bb4e7a9..11f05b6 100644 Binary files a/docs/beta-1/docx/Townlight-Station-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Station-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Suite-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Suite-Manual-Beta-1.docx index cda568e..ed79d05 100644 Binary files a/docs/beta-1/docx/Townlight-Suite-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Suite-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Zoning-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Zoning-Manual-Beta-1.docx index 8e7b61c..24abe7e 100644 Binary files a/docs/beta-1/docx/Townlight-Zoning-Manual-Beta-1.docx and b/docs/beta-1/docx/Townlight-Zoning-Manual-Beta-1.docx differ diff --git a/docs/beta-1/index.html b/docs/beta-1/index.html index faa792b..3ab5ae2 100644 --- a/docs/beta-1/index.html +++ b/docs/beta-1/index.html @@ -1 +1 @@ -Townlight | Townlight Beta 1
townlightTownlight Beta 1
The connected municipal suite · Townlight Beta 1

Municipal work with a clear record.

Connected municipal products help staff prepare, review and retain municipal work. Start with a controlled private beta, keep original evidence, and make each official decision deliberately.

Suite candidate 1.7.0.1; installed acceptance pendingAGPL-3.0-onlyBeta evaluation · Windows fresh-install scope
The product family

The kept products and their connected workflows.

Designed around the record

Prepare, review, hand off.

Keep source versions and original hashes connected to staff work. Select the intended audience, review the saved revision, and explicitly attach the resulting evidence. Records retains the final response and release decisions.

A practical beta deployment

The selected Townlight desktop composition includes Access and Notice staff workspaces alongside the existing municipal workflows. Station is a separately configured capture and media service. Standalone CivicCast keeps its own product, installation and data.

The changed candidate still requires a new signed installer and exact installed acceptance before distribution. This documentation site does not provision a hosted city portal.

Architecture

The suite and its boundaries

Townlight architecture and evidence flow

Native staff workspaces use canonical Python/PostgreSQL services. Station has a separate database, media store and explicit Townlight authority.

Evidence rather than promises

Candidate installed acceptance remains pending.

Earlier releases have their own first-run and synthetic Windows Sandbox evidence. This changed source candidate requires a new signed installer and installed acceptance. This is not a claim that every screen, vendor, upgrade or city equipment configuration has been certified.

Read the exact acceptance and limits →

Ready to evaluate?

Begin with the current manual; obtain this candidate only after its exact installer and acceptance are identified. Configure the chosen test site and have its staff review source applicability and run the existing workflows.

Station delivery update

Live cable coverage and recorded video delivery

Station offers an encrypted live SRT feed to separate CivicCast while recording. The PEG operator controls cable broadcast. Completed recordings can be explicitly uploaded to YouTube with a reviewed title and chosen visibility. The private Records original stays intact.

Setup, staff steps and API examples

\ No newline at end of file +Townlight | Townlight Beta 1
townlightTownlight Beta 1
The connected municipal suite · Townlight Beta 1

Municipal work with a clear record.

Connected municipal products help staff prepare, review and retain municipal work. Start with a controlled beta evaluation, keep original evidence, and make each official decision deliberately.

Signed Windows x64 MSI 1.7.0.1AGPL-3.0-onlyBeta evaluation · Windows fresh-install scope
The product family

The kept products and their connected workflows.

Designed around the record

Prepare, review, hand off.

Keep source versions and original hashes connected to staff work. Select the intended audience, review the saved revision, and explicitly attach the resulting evidence. Records retains the final response and release decisions.

A practical beta deployment

The selected Townlight desktop composition includes Access and Notice staff workspaces alongside the existing municipal workflows. Station is a separately configured capture and media service. Standalone CivicCast keeps its own product, installation and data.

Download the Windows x64 beta 1.7.0.1, matching source and checksums from GitHub.

Architecture

The suite and its boundaries

Townlight architecture and evidence flow

Native staff workspaces use canonical Python/PostgreSQL services. Station has a separate database, media store and explicit Townlight authority.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary records the workflows exercised with synthetic data on the released MSI. This is not a claim that every screen, vendor, upgrade or city equipment configuration has been certified.

Read the exact acceptance and limits →

Ready to evaluate?

Begin with the current manual and download the Windows x64 beta 1.7.0.1. Configure the chosen test site and have its staff review source applicability and run the existing workflows.

Station delivery update

Live cable coverage and recorded video delivery

Station offers an encrypted live SRT feed to separate CivicCast while recording. The PEG operator controls cable broadcast. Completed recordings can be explicitly uploaded to YouTube with a reviewed title and chosen visibility. The private Records original stays intact.

Setup, staff steps and API examples

See the Townlight Portal Guide for the separately deployed resident portal.

\ No newline at end of file diff --git a/docs/beta-1/manuals/access.html b/docs/beta-1/manuals/access.html index bdfd729..4e0b8bf 100644 --- a/docs/beta-1/manuals/access.html +++ b/docs/beta-1/manuals/access.html @@ -1,6 +1,6 @@ -Townlight Access Manual | Townlight candidate
townlightTownlight Beta 1
+
Townlight Beta 1

Townlight +Portal +Guide

Staff guide and technical reference

Separately deployed portal beta · 2 November 2026
Existing signed installer and historical acceptance predate this integration

Townlight Portal guide

+

Townlight Beta 1 · separately deployed portal beta

Printable PDF · Editable Word

+

The portal is a separately deployed suite capability for city pages +and public meeting archives. It brings together a public Meetings +archive, a completed Station recording and a Records release copy +selected for publication. It does not add a tenth product. The existing +signed Beta 1 installer and prior Sandbox evidence predate this local +portal integration; they do not demonstrate that it is installed or +publicly deployed. CivicCast remains separate.

+

For staff: prepare and +publish

+
    +
  1. In Meetings, publish the intended non-closed meeting archive. Review +its title, scheduled time, agenda, packet, minutes and summary for +public use.
  2. +
  3. Complete the corresponding Station recording and the Records request +and release workflow. Records must have a current approved response, +completed verified artifacts, a fulfilled request and an eligible +managed release copy with verified lineage to that recording. Keep the +original private.
  4. +
  5. Obtain the Records request UUID from the trusted staff workflow. A +fulfilled request or prepared copy is not consent to publish.
  6. +
  7. A Wagtail superuser opens Townlight publication in +/admin/, enters the request UUID, selects Find +approved releases, and chooses the intended result. The form +fills the archive, meeting, recording, request and release-copy IDs and +expected SHA-256; approval remains unchecked. Review the selection and +public content, select Publish or update, and +explicitly approve. Confirm the resulting meeting page and approved file +as a resident would. Ordinary Wagtail editors cannot use this +publisher.
  8. +
  9. To remove it from the public archive, use the same selection and +hash, choose Withdraw, and explicitly approve. Verify +that the meeting and file are no longer accessible. Withdrawal hides the +projection; retain source records and follow local retention +policy.
  10. +
+

An unsuccessful synchronization leaves the previous publication +intact. Repeating a successful publication updates the same archive +identity. If source records change, review and explicitly publish again; +do not assume a source error withdraws a prior version.

+

Residents

+
+ + +
+

The meeting archive is at /meetings/. A published +meeting page at /meetings/<pk>/ presents the approved +public meeting text and links to its release at +/meetings/<pk>/release/. The approved release bytes +are served with the selected MIME type and support byte ranges for video +playback. Public text is filtered; requester contact information, +internal notes, raw payloads, local paths and session proof are not +public fields. This integration is for completed release copies, not +live YouTube streaming. Station’s separate CivicCast and YouTube +workflows retain their own controls.

+

The city-branded homepage presents a resident task finder, service +information and the latest published playable recording when one is +available. The archive offers upcoming, past and all dates, title +search, a meeting-series selector and 20 results per page. Meeting +series uses the actual public title: the source contract does not supply +a separate board taxonomy. Each date uses that meeting’s configured IANA +time zone. Cancelled entries remain identifiable, with no offered +playback or documents.

+
+ + +
+

On a native Townlight meeting, open Agenda, +Meeting packet or Approved minutes to +read the actual approved text in a separate printable page. These are +text documents, not invented PDF attachments. Video controls play the +approved release; Download approved release retrieves +the same checked bytes. Expand About this public record +for provenance IDs, hashes and precise timestamps. PrimeGov fixtures +instead identify their links as synthetic references; they do not imply +live vendor downloads or playable media.

+

Search matches published service-page titles and +published meeting titles only, with at most 50 results of each type. It +excludes drafts, restricted city pages, withdrawn meetings and private +staff content. It does not search the bodies of documents, external +systems or private Records requests. Service buttons name the +destination host before taking a resident to the city’s configured +existing service. Applications, requests and payments stay in that +designated system. Navigation, the task finder and filters work without +JavaScript; JavaScript enhances the mobile menu.

+

City editors: +branding and service content

+
    +
  1. Open the home page in Wagtail. Set Brand name, +Brand prefix, the optional city Logo +and Hero image, the Hero title, +introduction, address and hours. Uploaded imagery must be approved for +public use. With no uploaded images, the original generic civic emblem +and illustrations are used. The page title is the fallback brand name; +TOWNLIGHT_BRAND remains the administrative +site-name/fallback setting. Existing versions stay unchanged and the +suite label is Townlight Beta 1.
  2. +
  3. Create or edit a Service page under the home page. +Set its title, kind, summary, section heading and body. Enter one next +step per line. Optional question/answer blocks become expandable common +questions. Set the department and public contact details where +relevant.
  4. +
  5. For a handoff, enter the designated HTTPS Destination +URL and clear Destination label. Addresses +containing credentials and non-HTTPS schemes are rejected. The resident +sees the destination host. This field is a link, not a vendor connector +or new portal transaction. Verify it against the city’s authorized +service before use.
  6. +
  7. Page kinds determine icons and shared links. records, +permits, code, planning and +contact are resident service entries. +government supplies the government navigation link; +privacy and accessibility supply +footer/utility links. Only live, public pages appear. Use Wagtail’s +existing editor submission and moderator approval workflow; editing a +draft does not update public pages.
  8. +
  9. Review the public home, service page and phone layout after +publishing. Unpublishing or restricting a page removes it from +navigation, the task finder and title search. Configure city-approved +privacy, accessibility and contact content; the fictional +demonstration’s notices are examples, not an adopted city’s +policies.
  10. +
+

setup_demo creates the fictional Juniper +Falls homepage and eight information pages on a fresh portal. +The persistent synthetic notice is controlled by the home page’s +Synthetic demo field. Example service destinations use +reserved .example domains and do not operate real services. +Repeating the command preserves any existing Townlight home and its +editorial content; it does not replace a city’s website. Existing +deployments receive additive fields through migrate; no +existing text is overwritten. Configure their home and service pages +through Wagtail after migration.

+

No resident account framework, official fee calculation, payment +processor, live-stream host or new vendor integration is introduced by +this interface.

+

Deployment and setup

+

The portal is a separate Wagtail deployment with its own database. +Keep the native desktop runtime bound to loopback; do not expose it to +the internet. Arrange a trusted private connection between the portal +service and native runtime. The bridge accepts HTTPS origins or loopback +HTTP origins; it does not follow redirects or use environment proxies. +Restrict the server-side proof file to the portal service account and +provision a native principal with both Meetings and Records permissions. +Never put the proof in a browser, selection file, log or public +document.

+

From the portal directory, use Python 3.13, install +python -m pip install --require-hashes -r requirements.lock, +run python manage.py migrate, +python manage.py setup_demo, and +python manage.py createsuperuser. For local evaluation run +python manage.py runserver 127.0.0.1:8000. Set a unique +TOWNLIGHT_SECRET_KEY, TOWNLIGHT_DEBUG=0, +allowed hosts, TLS and appropriate static and media service before +deployment. TOWNLIGHT_DB selects the database path; +TOWNLIGHT_BRAND selects the site name. Protect the database +and the private release directory together. +TOWNLIGHT_RELEASE_ROOT is an absolute private directory +outside public media; by default it is private-releases +under the portal directory. These setup steps do not commission a hosted +site or alter the already released installer.

+

Set TOWNLIGHT_NATIVE_ORIGIN to the trusted native origin +and TOWNLIGHT_NATIVE_PROOF_FILE to an absolute private +proof-file path. Sign in to the active native desktop with an account +authorized for both modules. The active profile’s +config/local-session.json contains +session_hash; this is an active session proof, not a +durable service token. Copy it without displaying it into an absolute +file in a directory already restricted to the portal service account. +Replace both placeholders in this PowerShell command with the actual +private paths:

+
[System.IO.File]::WriteAllText('<protected-absolute-path>\portal-proof.txt', (Get-Content -LiteralPath '<active-profile>\config\local-session.json' -Raw | ConvertFrom-Json).session_hash, [System.Text.UTF8Encoding]::new($false))
+

Refresh the protected proof after session expiry, sign-out, account +change or credential change. Do not print or publish it. +TOWNLIGHT_DISPLAY_TIMEZONE is an IANA time zone, defaulting +to UTC. A private selection file can drive the same +operation from the portal directory:

+
{"action":"publish","approve_publication":true,"archive_id":"00000000-0000-4000-8000-000000000001","meeting_id":"00000000-0000-4000-8000-000000000002","recording_id":"00000000-0000-4000-8000-000000000003","request_id":"00000000-0000-4000-8000-000000000004","release_copy_id":"00000000-0000-4000-8000-000000000005","expected_release_sha256":"0000000000000000000000000000000000000000000000000000000000000000"}
+

These IDs and hash are placeholders. Run +python manage.py sync_townlight selection.json. For +withdrawal change action to withdraw, retain +the selection fields and explicit approval, and verify removal. Restrict +the selection file because it contains internal identifiers.

+

Prepare the candidate +native runtime

+

The existing signed installer predates the portal bridge and does not +include its native endpoints. Prepare a separate matching native runtime +with the compatible Records, Meetings, Core, Access and Notice +dependencies, normal activation, profile and database contracts. Do not +patch the installed host runtime. From the suite source root, build the +candidate wheel into a chosen output directory:

+
python -m pip wheel --no-deps --wheel-dir '<wheel-output>' desktop/runtime/python-services
+

In the separately prepared matching runtime, use its Python +executable to install the built +townlight_runtime-0.2.0-py3-none-any.whl with +python -m pip install --no-deps --force-reinstall '<wheel-output>\townlight_runtime-0.2.0-py3-none-any.whl'. +Preserve the intended profile, activation and database configuration; +use meetings-beta or a higher applicable product profile. +With that runtime’s Python, start +python -m townlight_runtime.services; it binds +127.0.0.1:15480 by default, or the port selected by +TOWNLIGHT_RUNTIME_PORT. Keep this private and provide the +portal’s server-side active proof and trusted origin as described above. +Verify the authenticated selections endpoint with a real eligible +request in the prepared environment before relying on publication. See +verification and test inputs for the +isolated acceptance runner and its explicit flags. These instructions do +not upgrade the old installer or establish installed or public +deployment acceptance.

+

Production service and +reverse proxy

+

runserver is for local demonstration only. For +deployment set TOWNLIGHT_DEBUG=0, a unique +TOWNLIGHT_SECRET_KEY of at least 50 characters, +TOWNLIGHT_ALLOWED_HOSTS to the canonical host, +TOWNLIGHT_BASE_URL to the HTTPS origin, +TOWNLIGHT_CSRF_TRUSTED_ORIGINS to that HTTPS origin, and +TOWNLIGHT_STATIC_ROOT to the private deployment’s +collected-static directory. Run python manage.py migrate, +then python manage.py collectstatic, and start +python serve.py --port 8000 under a supervised service +account. Waitress binds only 127.0.0.1; stop the supervised +service cleanly before backup or maintenance. In production Django +enables secure cookies, HTTPS redirect and HSTS.

+

Terminate TLS in a reverse proxy on the same host. Set +TOWNLIGHT_TRUST_TLS_PROXY=1 only when the proxy removes +client-supplied forwarded headers and sets its own HTTPS scheme and +canonical Host. Never expose the native desktop port. Replace the +example hostname, certificate and static directory with deployment +values; serve only collected static files directly. The application +handles all other routes, including approved release files:

+
server {
+    listen 443 ssl;
+    server_name town.example.gov;
+    ssl_certificate /etc/ssl/town/fullchain.pem;
+    ssl_certificate_key /etc/ssl/town/privkey.pem;
+    location /static/ { alias /srv/townlight/static/; }
+    location /media/images/ { alias /srv/townlight/media/images/; }
+    location / {
+        proxy_pass http://127.0.0.1:8000;
+        proxy_set_header Host town.example.gov;
+        proxy_set_header X-Forwarded-Proto https;
+        proxy_set_header X-Forwarded-For "";
+        proxy_set_header X-Forwarded-Host "";
+        proxy_set_header Forwarded "";
+    }
+}
+

Keep the release directory outside every public static or media +alias. Test the deployed HTTPS origin, admin, archive, range playback +and explicit withdrawal using an approved synthetic record before +use.

+

TOWNLIGHT_MEDIA_ROOT selects Wagtail’s uploaded-media +storage (default portal/media). The image alias above +serves generated branding renditions from that root’s +images directory. Set the actual path for the deployment. +Do not alias the entire media root: Wagtail document downloads may have +their own access restrictions, and private releases must never be placed +there. Back up the full media root privately, including originals, with +the database.

+

Architecture and API

+
+ + +
+

The server calls POST /desktop/v1/portal/bundle with the +selection JSON and the X-Townlight-Session header. The +native principal must have both townlight_meetings and +townlight_records permissions. The returned ZIP contains +manifest.json and, for publication, +release.bin; the portal validates identity, hashes, sizes +and allowable fields before an atomic update. Withdrawal carries a +manifest without release bytes. The public projection includes meeting +text and ID/hash provenance, not the private source payload. The bridge +streams bundles and release bytes through private files. Set +TOWNLIGHT_PORTAL_MAX_BYTES consistently on both services; +the default is 8 GiB and the maximum is 64 GiB. Allow private disk space +for the bundle, staged copy and retained releases. The portal serves MP4 +or octet-stream releases. This transport limit is not the end-to-end +recording limit: the inherited Records managed-file receipt limits both +originals and release copies to 2,147,483,647 bytes. At Station’s +default 6,000 kbps video rate, approximately 47 minutes reaches 2 GiB +before accounting for audio and container overhead. Plan capture +duration and bitrate before recording: for example, 2,000 kbps video +plus audio for two hours is roughly 1.9 GB, depending on actual rates +and overhead. Measure the resulting files and leave margin. The portal +does not automatically transcode recordings. Consult the checked-in +bridge and portal source for the exact contract and errors; do not log +session proofs.

+

python manage.py export_public <empty-directory> +exports published pages, metadata and approved release bytes with +hashes. Secure the export as appropriate. Stop the portal and any +synchronization before taking a consistent backup of the SQLite database +and private release directory together; preserve private configuration +and proof separately. Restore the matched database and releases to an +isolated environment, set permissions and paths, then verify public +pages, approved file hashes and withdrawal state before resuming +service. A failed source sync preserves the prior projection; +investigate permissions, source eligibility, IDs, expected hash, +connection and proof-file access before retrying. An explicit withdrawal +is necessary to remove a previously published item.

+

The export also includes city branding fields, all published service +guidance, destinations, contact details, question/answer blocks and the +original uploaded logo/hero files referenced by the published home, with +hashes. It excludes draft/restricted page content and unreferenced +uploads. Back up Wagtail’s media directory with its database as well as +the private approved releases; city-uploaded branding is stored in media +and its generated renditions must be served by the deployment. The +public export is a portable content bundle, not a replacement for a +consistent full backup or a one-command restore.

+

Public presentation routes

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RouteBehavior and example
GET /City home, live/public service navigation and latest published +playable recording
GET /find-service/?service=meetingsTask finder redirects to the archive; a numeric ID selects a +live/public service under this site’s home; arbitrary redirect +destinations are refused
GET /meetings/?period=past&q=Council&series=Council%20Meeting&page=1Published-title filters; period is +upcoming, past or all; series +matches a full public title; pages contain at most 20 results
GET /meetings/<pk>/Published meeting and available public materials; unpublished +identity returns 404
GET /meetings/<pk>/documents/agenda/Approved native agenda text; packet and +minutes select the other approved text documents; +unavailable, cancelled, non-native or unpublished material returns +404
GET /meetings/<pk>/release/Existing integrity-checked approved release route with byte ranges; +publication status is checked on every request
GET /search/?q=recordsLive/public service title and published meeting title search; no +private or external search
GET /<service-slug>/Wagtail-published guidance and any configured service handoff
GET /source/Allowlisted corresponding portal source, including deployed CSS, +JavaScript, SVG illustrations, templates and native bridge source when +present
+

These resident routes create no records or accounts. The private +native API and explicit publication approval contract below are +unchanged. There is no new portal MCP endpoint.

+

Editable data and +presentation specifications

+ ++++ + + + + + + + + + + + + + + + + + + + + +
ModelAdditional presentation fields
HomePageBrand name (120 characters), prefix (40), hero title (160), +introduction, address, hours, synthetic notice flag and optional Wagtail +logo/hero image references
ServicePageKind (20), summary (300), heading (180), body and next-step text, +destination URL and label (120), department (120), public contact text +and Wagtail question/answer blocks
MeetingExisting public identity, timestamps/time zone, +cancellation/publication status, agenda/document projection and approved +release/provenance fields; no invented board metadata
+

The layouts reuse the approved civic navy/teal, warm white and gold +design with local fonts and original local illustrations. CSS and a +small menu script ship in portal/website/static/website/; +there are no remote fonts, analytics or client-side vendor calls. +Existing Wagtail permissions, revisions, media storage and static +collection are reused. Focus styles, skip navigation, semantic headings, +phone layouts, reduced-motion handling and printable document styling +are included. Accessible source material, captions/transcripts where +applicable and the adopting city’s assistance contact remain part of its +content responsibilities; no accessibility certification is claimed.

+

Bundle contract and errors

+

For discovery, the trusted portal server can call +GET /desktop/v1/portal/selections?request_id=<UUID> +with X-Townlight-Session. The native actor must have both +module permissions. The JSON response is +{"selections":[{"title":"<public archive title>","selection":{...}}]}; +each selection has all publication request fields, with +action set to publish and +approve_publication set to false. The Wagtail +lookup uses this endpoint. Selecting a result supplies +request_id, release_copy_id and +archive_id as query parameters and fills the form without +granting approval. An empty list means no eligible choice was returned; +review source readiness and the request.

+

The JSON request requires action (publish +or withdraw), boolean approve_publication set +to true, UUIDs archive_id, +meeting_id, recording_id, +request_id, release_copy_id, and a +64-character lowercase expected_release_sha256. No extra +request fields are accepted. Send it only from the trusted portal server +with X-Townlight-Session containing its private session +proof. For example, the supported operator command +python manage.py sync_townlight selection.json reads the +selection illustrated above and supplies that header from the protected +proof file.

+

A successful publish returns application/zip with +manifest.json and release.bin. Manifest +version 1 contains version, action, +archive_id, meeting_id, +recording_id, request_id, +release_copy_id, original_sha256, +title, timezone-aware scheduled_start, +agenda, packet, minutes, +summary, and release. The release +object contains path (release.bin), +sha256, size, and media_type. +Withdrawal returns a ZIP containing only manifest.json with +version, action and archive_id. +The portal validates the selection, manifest and bytes before changing +its projection.

+

Invalid input or missing explicit approval is rejected; authorization +failures are rejected by the native identity layer. Unavailable or +changed source data produces HTTP 409 with +Publication sources unavailable or changed; the portal +command reports synchronization failure and retains the existing +publication. Resolve the underlying staff-side source, identity, hash or +connectivity issue before retrying. Do not publish error logs containing +proof or private source details.

+

Source, license and +demonstration data

+

The synthetic PrimeGov transport is for demonstration and does not +contact a real tenant. Townlight-owned portal code is AGPL-3.0-only; +vendored CivicCast code retains its Apache-2.0 notices. +/source/ offers allowlisted portal source and the native +bridge from a repository checkout. Operators must provide the exact +deployed corresponding source, modifications and dependencies as +required by their license obligations. See the repository licenses, +portal/UPSTREAM.md, and the existing terms and license; no city-specific +legal terms are supplied here.

+

Subject index

+
    +
  • Approval and selection: For staff: prepare and publish
  • +
  • Database and recovery: Deployment and setup; Architecture and +API
  • +
  • Proof and permissions: Deployment and setup; Architecture and +API
  • +
  • Resident pages and file: Residents
  • +
  • Branding and city service guidance: City editors: branding and +service content
  • +
  • Search, filtering and document routes: Public presentation +routes
  • +
  • Data fields and responsive design: Editable data and presentation +specifications
  • +
  • Source and license: Source, license and demonstration data
  • +
  • Withdrawal: For staff: prepare and publish; Architecture and +API
  • +
+

Rebuild this guide

+

From the suite repository root, install the repository’s Node +dependencies (including Playwright), install a Playwright Chromium +browser and make Python and Pandoc available on PATH. Run +node scripts/docs/build_portal_guide.cjs. This rebuilds the +portal guide HTML, editable Word, PDF and architecture PNG, and the +portal verification reference HTML, from the checked-in Markdown, SVG, +template and Word reference. To use an existing Playwright installation +or Chromium executable, set PLAYWRIGHT_MODULE or +CHROMIUM_EXECUTABLE; PYTHON selects a Python +executable. The sibling product repositories are not needed to rebuild +this +guide.

+ \ No newline at end of file diff --git a/docs/beta-1/manuals/records.html b/docs/beta-1/manuals/records.html index 31905a3..09d1bd6 100644 --- a/docs/beta-1/manuals/records.html +++ b/docs/beta-1/manuals/records.html @@ -1,6 +1,6 @@ -Townlight Records Manual | Townlight candidate
townlightTownlight Beta 1
-
Townlight Beta 1

Townlight -Zoning -README

Staff guide and technical reference

Documentation edition 30 October 2026
Existing component versions retained
Signed suite installer 1.6.0.1
Private beta documentation companion

Townlight Beta -1 · Existing component versions retained · AGPL-3.0-only

-

Zoning combines local parcel geometry, cited zoning rules and staff -review. It retains questions, corrections and snapshots with provenance -so downstream staff can identify the precise evidence used.

-

Start here

-

Staff should use the operating manual. Administrators should read -first-run, configuration and recovery before changing a deployment. -Developers should read the exact API/schema reference and matching -source companion. This is a private candidate documentation update; it -neither changes public downloads nor publishes a release.

- -

Exact version and candidate

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IdentityValue
Public documentation identityTownlight Beta 1
Installer version1.6.0.1
Product componenttownlight_zoning 0.2.2
Native desktop source version1.6.0-1
Candidate MSI SHA25698bcdef11ebdf5c767f620c904ff49f85115fde3b5c23f62703b111e645aaf86
Corresponding-source SHA25684a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06b
Current owned software licenseAGPL-3.0-only
Supported acceptance profileWindows x64 fresh install; inspections-preview; separate Station -configuration
-

“Townlight Beta 1” identifies this coordinated beta delivery. It does -not renumber the installer, native binary, Python packages or historical -receipts. Component versions may differ. This documentation is a later -companion to unchanged signed bytes, not a rebuilt installer. Historical -release pages and manuals describe their own versions and are not the -download instructions for this private candidate.

-

What staff can do

-
    -
  • Prepare parcel data: Use the complete supported -bundle, including jurisdiction, dataset metadata and original hashes. -The coordinates must be EPSG:4326. A loose geometry file is not the full -source envelope.
  • -
  • Import and inspect: Check the complete source -envelope before selecting Import parcel dataset. That control submits -directly; inspect the saved validation/provenance result afterward. -Correct a refused source bundle and preserve the evidence. Do not force -acceptance by editing SQL.
  • -
  • Register cited rules: Associate the zone, rule -kind/key and value with the relevant public Code section. Inspect -overlays and effective context. Leave missing authority visible for -planner review.
  • -
  • Ask a parcel question: Look up the intended parcel -and ask the supported question. Read the returned citation, -applicability and disclaimer. Do not present an uncertain answer as an -official decision.
  • -
  • Record review and context: Record a correction and -its reason when needed. Select permitted Meetings history explicitly. -Preserve the question/review history and distinguish staff-only -precedent from public material.
  • -
  • Create a snapshot: Review the audience and exact -content before creating the immutable snapshot. A public snapshot must -satisfy its permitted-source contract; choosing a public label does not -sanitize private notes.
  • -
  • Use it downstream: Select the exact snapshot for -Records or the permitted provider path. The receiving workflow rechecks -visibility, source identity and hash before retaining or exporting -it.
  • -
-

Operating procedures and -examples

-

The operating manual now includes these existing procedures, with -synthetic inputs, readback and limits. Follow the actual app boundary -identified there; a standalone source capability is not automatically a -desktop screen.

- -

Architecture and data

-

Runtime and storage

-

The accepted package targets Windows x64 fresh -installation. Its native shell uses Rust 2021, Tauri 2 -and Microsoft WebView2; browser assets are JavaScript built -with Vite 8.1.6. This describes the native desktop -frontend; Station has a separate React operator, specified below or in -its product manual. Canonical business workflows use bundled -CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and -Alembic, with PostgreSQL 17 / PostGIS and -managed original files. The installed runtime tested here contains -FastAPI 0.162.0. Package minimum Python requirements can differ from the -bundled executable; the metadata reference preserves both. No stack -rewrite is implied by the beta label.

-

The native transport is fixed to loopback -127.0.0.1:15480; PostgreSQL uses the configured local -runtime port (default 15432). Optional local model service -defaults to 127.0.0.1:15434. Those are deployment defaults, -not internet endpoints. The runtime has health, module and readiness -endpoints; readiness is stronger than process existence. The task queue -is the existing local Core task infrastructure, not an assertion that a -separate Redis service is required for this desktop composition.

-

The default native profile is %LOCALAPPDATA%\CivicSuite; -the historical directory name remains part of compatibility. Do not -rename it to Townlight. A configured TOWNLIGHT_PROFILE_ROOT -must be absolute. Local configuration and secrets live under that -profile; protected managed files and database state must be backed up -coherently. Source/runtime identity is distinct from a product’s display -label.

-

Data and consistency

-

GeoJSON import datasets; parcels and zone/overlay context; cited -rules; questions and answers; review events; selected Meetings history; -immutable snapshots.

-

Versioned saves use expected prior revision identifiers where -defined. Reopen and reconcile on conflict. Exact exports and handoffs -use source IDs, current visibility, revision and SHA256. Review belongs -to the saved revision and does not transfer silently to edited text. -Database changes use the owning product’s migrations; a request or -readiness check is not an authorization to mutate schema.

-

Capacity and platform -statements

-

This beta has synthetic single-profile workflow evidence. It does not -have a published benchmark for concurrent staff capacity, minimum -RAM/CPU, large-source limits or a field SLA. Do not turn a developer -machine’s specification into a supported minimum. Installer size is -2,092,122,112 bytes before installation; allow additional disk for -extracted runtime, database, originals, exports, media and backups. -Select equipment/storage after sizing those actual workloads.

-

The exact runtime -payload lock records pinned files, sizes and hashes. The component metadata -records shipped dependency declarations. These references are more -precise than a manually copied dependency list. Third-party and -historical license notices must accompany their matching payloads.

- ---- - - - - - - - - - - - - - - - - - - - - - - - - -
Data contractDescription
InputA supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset -metadata, public Code authority and permitted meeting evidence.
Retained recordsGeoJSON import datasets; parcels and zone/overlay context; cited -rules; questions and answers; review events; selected Meetings history; -immutable snapshots.
OutputSource-backed parcel context, informational answers, recorded human -corrections and reviewed snapshots with stable hashes.
ConnectionsConsumes Code authority and permitted Meetings evidence. Supplies -permitted snapshots to Records and context to Planning and -Permitting.
-

Setup and operation

-
    -
  1. Obtain the identified signed private candidate and its -corresponding-source companion from the beta coordinator. The landing -pages in this documentation are not an installer download service.
  2. -
  3. On the intended fresh Windows test installation, verify the MSI hash -and publisher signature before installing. Preserve unrelated profiles -and recovery material. This candidate has fresh-install acceptance; -historical in-place upgrades are unverified.
  4. -
  5. Launch Townlight under the intended named Windows account. Choose -the storage folders. Select Townlight Inspections -candidate (inspections-preview) for all eight -desktop products. A narrower default selection will not expose all -workspaces.
  6. -
  7. Enter the city profile, time zone and contacts. Create the first -named local administrator, sign in and choose protected backup storage. -Continue without local AI is valid for the -deterministic workflows.
  8. -
  9. Run Health Check and wait for readiness. Open Townlight. In System -Health select Finish Records Migration to activate the -canonical Python/PostgreSQL runtime. Do not fabricate migration receipts -or seed accounts.
  10. -
  11. Create named staff through Settings. Import authorized sources using -each product’s source library. All examples in this package are -synthetic; they are not municipal authority.
  12. -
  13. Provision Station separately if it is part of the beta exercise. -Selecting the desktop composition does not start or configure Station. -Configure vision explicitly only if automatic photo drafting is -selected.
  14. -
-

Configuration

-

Native deployment -configuration

-

Use Setup, Settings and System Health for supported staff operation. -Administrators provision folders, backup storage, named accounts and the -city profile. Select inspections-preview for the full -eight-workspace desktop. Station remains a separate service boundary. Do -not use a standalone product’s demo server as a substitute for the -installed workspace.

-

Technical deployments use TOWNLIGHT_PRODUCT_PROFILE, -TOWNLIGHT_PROFILE_ROOT, DATABASE_URL, -TOWNLIGHT_RUNTIME_PORT, PORTAL_MODE and the -runtime-managed secret files. Treat database URLs and native session -proofs as secrets. The installed native domain runtime explicitly -refuses non-loopback binding. PORTAL_MODE=private is the -accepted posture; changing it does not by itself commission an internet -portal, authentication provider or reverse proxy.

-

The isolated documentation exporter sets a fictional profile and -unusable synthetic database origin only to read schemas; those values -are not deployment configuration. Keep deployment values in the intended -process/account scope. An already-running process does not automatically -inherit later environment edits.

-

API usage

-

Native command example

-

The following JavaScript belongs in the existing trusted Townlight -frontend/development environment with invoke imported from -@tauri-apps/api/core. It is not a command for an arbitrary -web page or an instruction for nontechnical staff. IDs must come from -records created in an isolated synthetic exercise.

-
import { invoke } from '@tauri-apps/api/core';
-const result = await invoke('zoning_domain_request', {request: {operation: 'history', id: questionId}});
-console.log(result);
-

Trusted local HTTP example

-

An administrator/developer can inspect an already-configured isolated -runtime from a trusted local process. This PowerShell example reads the -signed-in synthetic profile’s existing proof into memory; it does not -create a user, seed a session, reveal the proof in output or bypass a -permission check. Do not use real city data in development examples. A -read response does not prove approval or publication.

-
$profilePath = Join-Path $env:LOCALAPPDATA 'Townlight'
-$sessionPath = Join-Path $profilePath 'config\local-session.json'
-$session = Get-Content -LiteralPath $sessionPath -Raw | ConvertFrom-Json
-$headers = @{ 'X-Townlight-Session' = $session.session_hash }
-Invoke-RestMethod -Uri 'http://127.0.0.1:15480/desktop/v1/zoning/workspace' -Headers $headers
-Remove-Variable session, headers
-

Complete synthetic source -bundle

-

The synthetic Zoning -bundle is the retained fixture used by the beta staff exercise. It -includes the complete supported source envelope rather than a shortened -pseudo-payload. Keep its fictional source labels. For Planning, wrap it -as {"bundle": BUNDLE, "expected_previous_revision": null}; -for Permitting use -{"bundle": BUNDLE, "expected_revision": null}. Code and -Zoning take their own complete import envelopes. Replace null with the -current expected revision when revising an existing source, as the -applicable schema requires. These are import examples, not legal -authority or permission to load them into a live city profile.

-

A synthetic write -with subsequent readback

-

This example demonstrates the existing Meetings HTTP contract in an -isolated exercise. It is intentionally fictional. It does not start a -service. Its authentication setup is included so it can be run -independently under the signed-in synthetic account. If a write times -out, inspect current records before repeating it.

-
$profilePath = Join-Path $env:LOCALAPPDATA 'Townlight'
-$sessionPath = Join-Path $profilePath 'config/local-session.json'
-$session = Get-Content -LiteralPath $sessionPath -Raw | ConvertFrom-Json
-$headers = @{ 'X-Townlight-Session' = $session.session_hash }
-$body = @{
-  title = 'Synthetic documentation exercise'
-  scheduled_start = '2026-11-05T18:00:00-07:00'
-  location = 'Synthetic room'
-  meeting_type = 'regular'
-} | ConvertTo-Json
-$meeting = Invoke-RestMethod -Method Post `
-  -Uri 'http://127.0.0.1:15480/desktop/v1/meetings/meetings' `
-  -Headers $headers -ContentType 'application/json' -Body $body
-Invoke-RestMethod `
-  -Uri ('http://127.0.0.1:15480/desktop/v1/meetings/meetings/' + $meeting.id) `
-  -Headers $headers
-Remove-Variable session, headers
-

This write requires Meetings to be enabled and the signed-in staff -role to permit it. It is a cross-suite integration example; for this -product’s request models, use the complete technical reference -below.

-

MCP status

-

No direct product MCP server is exposed by the accepted Townlight -desktop or Station boundary. Do not configure an invented -townlight mcp command or assume an AI client has staff -permissions. The integration surfaces for this beta are native IPC, the -documented HTTP APIs, source bundle imports, exact exports and the -existing Station CLI.

-

The bundled transcription code includes a TextFlowKit MCP -adapter as a separate source capability. It offers job-based -transcribe_media, get_transcript, -list_jobs, get_job_status and -export_transcript, and additional tools declared in that -adapter. It uses stdio first and optional Streamable HTTP, with the MCP -SDK as an optional extra. It is not automatically launched, -authenticated as Townlight staff or accepted as a Townlight product MCP -deployment. This documentation does not add such a service.

-

For a transcription client already provisioned separately, an -illustrative tool call is:

-
{"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}}
-

Use a job ID returned by that transcription service. This example -does not create a Townlight record or bypass its review/Records handoff. -The exact optional adapter tool signatures are supplied in the MCP source reference. Station meeting -capture does not become live speech recognition because this optional -donor adapter exists.

-

Verification and known -limits

- ----- - - - - - - - - - - - - - - -
ProductRecorded resultPrecisely exercised
ZoningPASSGeoJSON/PostGIS import, cited dimensional rule, parcel answer, staff -review/history/snapshot and native workspace.
-

These results come from the identified signed candidate’s fresh -normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and -selected headless controls. All accounts, source bundles and media were -synthetic. The guest install/uninstall and recovery passed, and the -owned Sandbox stopped. No host installed application or standalone -CivicCast was changed. This documentation task reuses those receipts; it -does not claim a new software acceptance run.

-

The workflow matrix -identifies raw receipt filenames. The evidence index -retains their original hashes; raw receipts remain in the private beta -handoff rather than being silently republished with the documentation -site.

-

The limits remain: actual city field acceptance and equipment/network -commissioning; Station automatic provisioning/SCM commissioning; every -UI/role combination; field recognition accuracy; and historical in-place -upgrades are not certified. They are not five invented feature -requirements. Fresh-install controlled beta handoff remains the accepted -scope. This package makes no city-deployment, publication or -general-availability claim.

-

The accepted path is local GeoJSON/PostGIS. It does not establish -every ArcGIS, assessor or CKAN connector. Answers and process -explanations are informational and do not issue an entitlement or an -official zoning determination.

-

Development and repository -map

-

Use the corresponding source for the candidate rather than assuming -the public default branch matches it. The source companion contains -installed-owned-source, product build inputs, desktop -Rust/browser sources, locks and BUILD.md. It excludes -credentials and third-party binary/model payloads. Use the recorded -runtime lock when reproducing packaging.

-

Relevant source contracts:

-
    -
  • townlight_zoning/geo_import.py
  • -
  • townlight_zoning/discretionary.py
  • -
  • townlight_runtime/zoning_bridge.py
  • -
  • townlight_runtime/zoning_records.py
  • -
-

The desktop package defines npm run build, -npm test, npm run test:browser and its Tauri -command. Python products retain their own pyproject.toml, -tests and migrations; use the matching checkout’s declared dependencies -and test configuration. Do not run a sample server against a production -profile. This documentation build validates documentation only and -reuses the separately identified installed acceptance; it does not claim -a new complete application CI run.

-

Recovery and support

-

Save work and use Core’s canonical Backup Now before -maintenance. That operation stops writers. Preserve the coherent -profile/database/document backup and its receipt, then use -Start to resume. A source export is not a full -backup.

-

Use Restore Latest Backup through the supported -controls. If the result says Restore needs service -start, use Start, then Check, -and reopen a known record. Do not repeat restore merely because services -need to start. The fresh-profile acceptance verified that a fulfilled -request survived restore and a post-backup marker did not.

-

Keep Station’s dedicated database and media evidence together in its -own backup. Core’s native-profile backup must not be assumed to include -an external Station data directory. Stop writers during a coordinated -backup. Preserve failed media attempts and logs.

-

On failure, record the time, selected composition, -component/installer versions and exact message. Check System Health for -stopped, starting, ready or failed dependencies. Use the existing Retry -control after readiness; do not create duplicate business records to -refresh a stale view. Share only a redacted diagnostic bundle. Preserve -secrets, original evidence, recovery material and unrelated -installations.

-

License and responsible use

-

Current owned code is AGPL-3.0-only. Preserve full license, matching -corresponding source, dependency notices and historical grants. Terms of -use do not remove license rights. Source imports do not confer -permission to publish third-party material. Review all automatic drafts -and use the separate owning-product decision before official action. -CivicCast remains -independent.

- \ No newline at end of file + +Townlight Zoning documentation
Townlight

Townlight Zoning documentation

Read the current Zoning manual for the Windows x64 beta 1.7.0.1.

See component versions and release evidence for exact installed versions.

diff --git a/docs/beta-1/reference/component-metadata.json b/docs/beta-1/reference/component-metadata.json index 6a78a48..f7195b3 100644 --- a/docs/beta-1/reference/component-metadata.json +++ b/docs/beta-1/reference/component-metadata.json @@ -1,19 +1,19 @@ { - "townlight_access-0.4.0.dist-info": { + "townlight_access-0.5.0.dist-info": { "Name": [ - "townlight_access" + "townlight-access" ], "Version": [ - "0.4.0" + "0.5.0" ], "Requires-Python": [ ">=3.11" ], "Requires-Dist": [ - "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.0/townlight_core-1.2.0-py3-none-any.whl#sha256=a94ce958e36fb03c8d961e4db4672ce5bcfa25765c57d75886e999cf15703ec7", "fastapi<1.0.0,>=0.115.0", "psycopg2-binary<3.0.0,>=2.9.0", "sqlalchemy<3.0.0,>=2.0.0", + "townlight-core==1.3.0.dev2", "uvicorn[standard]<1.0.0,>=0.30.0", "build<2.0.0,>=1.2.0; extra == 'dev'", "httpx<1.0.0,>=0.27.0; extra == 'dev'", @@ -25,39 +25,12 @@ "AGPL-3.0-only" ] }, - "townlight_meetings-1.0.4.dist-info": { + "townlight_code-1.0.9.dist-info": { "Name": [ - "townlight_meetings" + "townlight-code" ], "Version": [ - "1.0.4" - ], - "Requires-Python": [ - ">=3.11" - ], - "Requires-Dist": [ - "celery[redis]<6.0.0,>=5.4.0", - "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", - "fastapi<1.0.0,>=0.115.0", - "httpx<1.0.0,>=0.27.0", - "psycopg2-binary<3.0.0,>=2.9.0", - "pyjwt<3.0.0,>=2.8.0", - "uvicorn[standard]<1.0.0,>=0.30.0", - "httpx<1.0.0,>=0.27.0; extra == 'dev'", - "pytest-asyncio<1.0.0,>=0.23.0; extra == 'dev'", - "pytest<9.0.0,>=8.0.0; extra == 'dev'" - ], - "License": [ - "AGPL-3.0-only" - ], - "License-Expression": [] - }, - "townlight_code-1.0.8.dist-info": { - "Name": [ - "townlight_code" - ], - "Version": [ - "1.0.8" + "1.0.9" ], "Requires-Python": [ ">=3.11" @@ -65,11 +38,11 @@ "Requires-Dist": [ "alembic<2.0.0,>=1.13.0", "asyncpg<1.0.0,>=0.29.0", - "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", "psycopg2-binary<3.0.0,>=2.9.0", "pymupdf<2.0.0,>=1.26.0", "sqlalchemy<3.0.0,>=2.0.0", + "townlight-core==1.3.0.dev2", "uvicorn[standard]<1.0.0,>=0.30.0", "build<2.0.0,>=1.2.0; extra == 'dev'", "httpx<1.0.0,>=0.27.0; extra == 'dev'", @@ -82,75 +55,75 @@ ], "License-Expression": [] }, - "townlight_core-1.3.0.dev1.dist-info": { + "townlight_core-1.3.0.dev2.dist-info": { "Name": [ - "townlight_core\r" + "townlight-core" ], "Version": [ - "1.3.0.dev1\r" + "1.3.0.dev2" ], "Requires-Python": [ - ">=3.11\r" + ">=3.11" ], "Requires-Dist": [ - "packaging>=24.0\r", - "fastapi>=0.135.0\r", - "uvicorn[standard]>=0.44.0\r", - "sqlalchemy[asyncio]>=2.0.49\r", - "asyncpg>=0.31.0\r", - "alembic>=1.18.0\r", - "pgvector>=0.4.2\r", - "pydantic>=2.12.0\r", - "pydantic-settings>=2.13.0\r", - "fastapi-users[sqlalchemy]>=15.0.0\r", - "python-jose[cryptography]>=3.5.0\r", - "passlib[bcrypt]>=1.7.4\r", - "celery>=5.6.0\r", - "croniter>=2.0.0\r", - "redis<8.0.0,>=5.0.0\r", - "httpx>=0.28.0\r", - "pdfplumber>=0.11.0\r", - "python-docx>=1.1.0\r", - "openpyxl>=3.1.0\r", - "beautifulsoup4>=4.12.0\r", - "Pillow>=11.0.0\r", - "pytesseract>=0.3.10\r", - "aiofiles>=24.1.0\r", - "PyJWT>=2.8.0\r", - "regex>=2024.0.0\r", - "anthropic>=0.40.0; extra == \"anthropic\"\r", - "openai>=1.50.0; extra == \"openai\"\r", - "build>=1.2.0; extra == \"dev\"\r", - "psycopg2-binary>=2.9.0; extra == \"dev\"\r", - "pytest>=9.0.0; extra == \"dev\"\r", - "pytest-asyncio>=1.0.0; extra == \"dev\"\r", - "respx>=0.22.0; extra == \"dev\"\r", - "ruff==0.15.22; extra == \"dev\"\r", - "testcontainers[postgres]>=4.9.0; extra == \"dev\"\r", - "openai>=1.50.0; extra == \"dev\"\r", - "anthropic>=0.40.0; extra == \"dev\"\r" + "packaging>=24.0", + "fastapi>=0.135.0", + "uvicorn[standard]>=0.44.0", + "sqlalchemy[asyncio]>=2.0.49", + "asyncpg>=0.31.0", + "alembic>=1.18.0", + "pgvector>=0.4.2", + "pydantic>=2.12.0", + "pydantic-settings>=2.13.0", + "fastapi-users[sqlalchemy]>=15.0.0", + "python-jose[cryptography]>=3.5.0", + "passlib[bcrypt]>=1.7.4", + "celery>=5.6.0", + "croniter>=2.0.0", + "redis<8.0.0,>=5.0.0", + "httpx>=0.28.0", + "pdfplumber>=0.11.0", + "python-docx>=1.1.0", + "openpyxl>=3.1.0", + "beautifulsoup4>=4.12.0", + "Pillow>=11.0.0", + "pytesseract>=0.3.10", + "aiofiles>=24.1.0", + "PyJWT>=2.8.0", + "regex>=2024.0.0", + "anthropic>=0.40.0; extra == \"anthropic\"", + "openai>=1.50.0; extra == \"openai\"", + "build>=1.2.0; extra == \"dev\"", + "psycopg2-binary>=2.9.0; extra == \"dev\"", + "pytest>=9.0.0; extra == \"dev\"", + "pytest-asyncio>=1.0.0; extra == \"dev\"", + "respx>=0.22.0; extra == \"dev\"", + "ruff==0.15.22; extra == \"dev\"", + "testcontainers[postgres]>=4.9.0; extra == \"dev\"", + "openai>=1.50.0; extra == \"dev\"", + "anthropic>=0.40.0; extra == \"dev\"" ], "License": [], "License-Expression": [ - "AGPL-3.0-only\r" + "AGPL-3.0-only" ] }, - "townlight_inspections-0.3.0+dev.1.dist-info": { + "townlight_inspections-0.3.0+dev.2.dist-info": { "Name": [ - "townlight_inspections" + "townlight-inspections" ], "Version": [ - "0.3.0+dev.1" + "0.3.0+dev.2" ], "Requires-Python": [ ">=3.11" ], "Requires-Dist": [ "alembic<2.0.0,>=1.14.0", - "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", "psycopg2-binary<3.0.0,>=2.9.0", "sqlalchemy<3.0.0,>=2.0.0", + "townlight-core==1.3.0.dev2", "uvicorn[standard]<1.0.0,>=0.30.0", "build<2.0.0,>=1.2.0; extra == 'dev'", "httpx<1.0.0,>=0.27.0; extra == 'dev'", @@ -163,20 +136,47 @@ ], "License-Expression": [] }, - "townlight_notice-0.2.0.dist-info": { + "townlight_meetings-1.0.5.dist-info": { "Name": [ - "townlight_notice" + "townlight-meetings" ], "Version": [ - "0.2.0" + "1.0.5" + ], + "Requires-Python": [ + ">=3.11" + ], + "Requires-Dist": [ + "celery[redis]<6.0.0,>=5.4.0", + "fastapi<1.0.0,>=0.115.0", + "httpx<1.0.0,>=0.27.0", + "psycopg2-binary<3.0.0,>=2.9.0", + "pyjwt<3.0.0,>=2.8.0", + "townlight-core==1.3.0.dev2", + "uvicorn[standard]<1.0.0,>=0.30.0", + "httpx<1.0.0,>=0.27.0; extra == 'dev'", + "pytest-asyncio<1.0.0,>=0.23.0; extra == 'dev'", + "pytest<9.0.0,>=8.0.0; extra == 'dev'" + ], + "License": [ + "AGPL-3.0-only" + ], + "License-Expression": [] + }, + "townlight_notice-0.3.0.dist-info": { + "Name": [ + "townlight-notice" + ], + "Version": [ + "0.3.0" ], "Requires-Python": [ ">=3.11" ], "Requires-Dist": [ - "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.0/townlight_core-1.2.0-py3-none-any.whl#sha256=a94ce958e36fb03c8d961e4db4672ce5bcfa25765c57d75886e999cf15703ec7", "fastapi<1.0.0,>=0.115.0", "sqlalchemy<3.0.0,>=2.0.0", + "townlight-core==1.3.0.dev2", "uvicorn[standard]<1.0.0,>=0.30.0", "build<2.0.0,>=1.2.0; extra == 'dev'", "httpx<1.0.0,>=0.27.0; extra == 'dev'", @@ -190,25 +190,26 @@ "AGPL-3.0-only" ] }, - "townlight_permitting-0.3.0+dev.1.dist-info": { + "townlight_permitting-0.3.0+dev.2.dist-info": { "Name": [ - "townlight_permitting" + "townlight-permitting" ], "Version": [ - "0.3.0+dev.1" + "0.3.0+dev.2" ], "Requires-Python": [ ">=3.11" ], "Requires-Dist": [ "alembic<2.0.0,>=1.13.0", - "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", "sqlalchemy<3.0.0,>=2.0.0", + "townlight-core==1.3.0.dev2", "uvicorn[standard]<1.0.0,>=0.30.0", "build<2.0.0,>=1.2.0; extra == 'dev'", "httpx<1.0.0,>=0.27.0; extra == 'dev'", "psycopg2-binary<3.0.0,>=2.9.0; extra == 'dev'", + "pymupdf<2,>=1.24; extra == 'dev'", "pytest<9.0.0,>=8.0.0; extra == 'dev'", "ruff==0.15.22; extra == 'dev'" ], @@ -217,21 +218,21 @@ ], "License-Expression": [] }, - "townlight_planning-0.4.0.dev1.dist-info": { + "townlight_planning-0.4.0.dev2.dist-info": { "Name": [ - "townlight_planning" + "townlight-planning" ], "Version": [ - "0.4.0.dev1" + "0.4.0.dev2" ], "Requires-Python": [ ">=3.11" ], "Requires-Dist": [ - "townlight_core==1.3.0.dev1", "fastapi<1.0.0,>=0.115.0", "psycopg2-binary<3.0.0,>=2.9.0", "sqlalchemy<3.0.0,>=2.0.0", + "townlight-core==1.3.0.dev2", "uvicorn[standard]<1.0.0,>=0.30.0", "build<2.0.0,>=1.2.0; extra == 'dev'", "httpx<1.0.0,>=0.27.0; extra == 'dev'", @@ -244,65 +245,65 @@ "AGPL-3.0-only" ] }, - "townlight_records-1.8.0.dev1.dist-info": { + "townlight_records-1.8.0.dev2.dist-info": { "Name": [ - "townlight_records\r" + "townlight-records" ], "Version": [ - "1.8.0.dev1\r" + "1.8.0.dev2" ], "Requires-Python": [ - ">=3.12\r" + ">=3.12" ], "Requires-Dist": [ - "fastapi>=0.135.0\r", - "uvicorn[standard]>=0.44.0\r", - "sqlalchemy[asyncio]>=2.0.49\r", - "asyncpg>=0.31.0\r", - "alembic>=1.18.0\r", - "pgvector>=0.4.2\r", - "pydantic>=2.12.0\r", - "pydantic-settings>=2.13.0\r", - "fastapi-users[sqlalchemy]>=15.0.0\r", - "python-jose[cryptography]>=3.5.0\r", - "passlib[bcrypt]>=1.7.4\r", - "celery>=5.6.0\r", - "townlight_core==1.3.0.dev1\r", - "redis<8.0.0,>=5.0.0\r", - "httpx>=0.28.0\r", - "pdfplumber>=0.11.0\r", - "python-docx>=1.1.0\r", - "openpyxl>=3.1.0\r", - "beautifulsoup4>=4.12.0\r", - "Pillow>=11.0.0\r", - "pytesseract>=0.3.10\r", - "aiofiles>=24.1.0\r", - "PyJWT>=2.8.0\r", - "regex>=2024.0.0\r", - "pytest>=9.0.0; extra == \"dev\"\r", - "pytest-asyncio>=1.0.0; extra == \"dev\"\r", - "respx>=0.22.0; extra == \"dev\"\r", - "ruff==0.15.21; extra == \"dev\"\r", - "psycopg2-binary>=2.9.0; extra == \"dev\"\r" + "fastapi>=0.135.0", + "uvicorn[standard]>=0.44.0", + "sqlalchemy[asyncio]>=2.0.49", + "asyncpg>=0.31.0", + "alembic>=1.18.0", + "pgvector>=0.4.2", + "pydantic>=2.12.0", + "pydantic-settings>=2.13.0", + "fastapi-users[sqlalchemy]>=15.0.0", + "python-jose[cryptography]>=3.5.0", + "passlib[bcrypt]>=1.7.4", + "celery>=5.6.0", + "townlight-core==1.3.0.dev2", + "redis<8.0.0,>=5.0.0", + "httpx>=0.28.0", + "pdfplumber>=0.11.0", + "python-docx>=1.1.0", + "openpyxl>=3.1.0", + "beautifulsoup4>=4.12.0", + "Pillow>=11.0.0", + "pytesseract>=0.3.10", + "aiofiles>=24.1.0", + "PyJWT>=2.8.0", + "regex>=2024.0.0", + "pytest>=9.0.0; extra == \"dev\"", + "pytest-asyncio>=1.0.0; extra == \"dev\"", + "respx>=0.22.0; extra == \"dev\"", + "ruff==0.15.21; extra == \"dev\"", + "psycopg2-binary>=2.9.0; extra == \"dev\"" ], "License": [], "License-Expression": [ - "AGPL-3.0-only\r" + "AGPL-3.0-only" ] }, - "townlight_runtime-0.1.0.dist-info": { + "townlight_runtime-0.2.0.dist-info": { "Name": [ - "townlight_runtime" + "townlight-runtime" ], "Version": [ - "0.1.0" + "0.2.0" ], "Requires-Python": [ ">=3.11" ], "Requires-Dist": [ - "fastapi>=0.135.0", "sqlalchemy>=2.0", + "fastapi>=0.135.0", "uvicorn>=0.44.0" ], "License": [], @@ -310,19 +311,19 @@ "AGPL-3.0-only" ] }, - "townlight_zoning-0.2.2.dist-info": { + "townlight_zoning-0.2.3.dist-info": { "Name": [ - "townlight_zoning" + "townlight-zoning" ], "Version": [ - "0.2.2" + "0.2.3" ], "Requires-Python": [ ">=3.11" ], "Requires-Dist": [ - "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", + "townlight-core==1.3.0.dev2", "uvicorn[standard]<1.0.0,>=0.30.0", "build<2.0.0,>=1.2.0; extra == 'dev'", "httpx<1.0.0,>=0.27.0; extra == 'dev'", @@ -334,45 +335,5 @@ "AGPL-3.0-only" ], "License-Expression": [] - }, - "townlight_inspection_transcriber-0.1.19.dist-info": { - "Name": [ - "townlight-inspection-transcriber" - ], - "Version": [ - "0.1.19" - ], - "Requires-Python": [ - ">=3.11" - ], - "Requires-Dist": [], - "License": [], - "License-Expression": [ - "AGPL-3.0-only" - ] - }, - "townlight_station-0.3.0.dist-info": { - "Name": [ - "townlight-station\r" - ], - "Version": [ - "0.3.0\r" - ], - "Requires-Python": [ - ">=3.12\r" - ], - "Requires-Dist": [ - "fastapi<1,>=0.115\r", - "uvicorn<1,>=0.30\r", - "httpx<1,>=0.27\r", - "sqlalchemy<3,>=2\r", - "psycopg2-binary<3,>=2.9\r", - "pydantic<3,>=2\r", - "pywin32>=311; sys_platform == \"win32\"\r" - ], - "License": [], - "License-Expression": [ - "AGPL-3.0-only\r" - ] } -} \ No newline at end of file +} diff --git a/docs/beta-1/reference/index.html b/docs/beta-1/reference/index.html index 49e778d..17a9413 100644 --- a/docs/beta-1/reference/index.html +++ b/docs/beta-1/reference/index.html @@ -1 +1 @@ -Townlight candidate technical reference
Townlight

Current candidate technical reference

Prepared November 2, 2026. Build, signing, exact installed acceptance and publication remain pending.

The API pages describe the actual native composition; standalone applications and the separate Station service have their documented boundaries.

Complete native domain API · Current source inventory and SHA-256 values · Component versions

ProductContractInventory
Townlight CoreAPI reference114 source files
Townlight RecordsAPI reference126 source files
Townlight MeetingsAPI reference59 source files
Townlight CodeAPI reference49 source files
Townlight ZoningAPI reference30 source files
Townlight PlanningAPI reference31 source files
Townlight PermittingAPI reference18 source files
Townlight InspectionsAPI reference20 source files
Townlight AccessAPI reference10 source files
Townlight NoticeAPI reference16 source files
Townlight StationAPI reference21 source files
Townlight RuntimeAPI reference101 source files

AST route declarations alone do not prove mounting or runtime behavior. The inventory marks source companion assembly as pending until an actual built companion is supplied; it makes no signed-installer claim.

Townlight · AGPL-3.0-only
\ No newline at end of file +Townlight candidate technical reference
Townlight

Windows beta technical reference

The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data. See the Windows acceptance summary.

The API pages describe the actual native composition; standalone applications and the separate Station service have their documented boundaries.

Complete native domain API · Windows release source pins and archive hashes · Component versions

ProductContractInventory
Townlight CoreAPI reference114 source files
Townlight RecordsAPI reference126 source files
Townlight MeetingsAPI reference59 source files
Townlight CodeAPI reference49 source files
Townlight ZoningAPI reference30 source files
Townlight PlanningAPI reference31 source files
Townlight PermittingAPI reference18 source files
Townlight InspectionsAPI reference20 source files
Townlight AccessAPI reference10 source files
Townlight NoticeAPI reference16 source files
Townlight StationAPI reference21 source files
Townlight RuntimeAPI reference101 source files

The corresponding source archive and its repository pins identify the released Windows build. The earlier source inventory documents a preparation snapshot. Source declarations describe contracts. The Windows acceptance summary records installed behavior.

The resident portal is deployed separately. See the Townlight Portal Guide for its workflow and acceptance limits.

Townlight · AGPL-3.0-only
\ No newline at end of file diff --git a/docs/beta-1/reference/mcp.html b/docs/beta-1/reference/mcp.html index 645757a..b68015c 100644 --- a/docs/beta-1/reference/mcp.html +++ b/docs/beta-1/reference/mcp.html @@ -7,8 +7,8 @@ main,.toc a,.hero h1{overflow-wrap:anywhere} @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -
townlightTownlight Beta 1
-
Townlight Beta 1

MCP +
townlightTownlight Beta 1
+

Historical MCP reference for Windows 1.6.0.1. For Windows 1.7.0.1, use the matching source archive and technical reference index.

Townlight Beta 1

MCP and Transcription Source Reference

Staff guide and technical reference

Documentation edition 30 October 2026
Existing component versions retained
Signed suite installer 1.6.0.1
Private beta documentation companion

+transcribe_media.

\ No newline at end of file diff --git a/docs/beta-1/reference/native.html b/docs/beta-1/reference/native.html index 5e4e403..a068b3a 100644 --- a/docs/beta-1/reference/native.html +++ b/docs/beta-1/reference/native.html @@ -7,8 +7,8 @@ main,.toc a,.hero h1{overflow-wrap:anywhere} @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -
townlightTownlight Beta 1
-
Townlight Beta 1

Native +
townlightTownlight Beta 1
+

Historical Native commands reference for Windows 1.6.0.1. For Windows 1.7.0.1, use the matching source archive and technical reference index.

Townlight Beta 1

Native IPC Contracts

Staff guide and technical reference

Documentation edition 30 October 2026
Existing component versions retained
Signed suite installer 1.6.0.1
Private beta documentation companion

}; let full_path = format!("{prefix}{path}"); send(method, full_path, body, &proof).await -}
+}
\ No newline at end of file diff --git a/docs/beta-1/reference/portal-resident-website-acceptance.json b/docs/beta-1/reference/portal-resident-website-acceptance.json new file mode 100644 index 0000000..d87ae14 --- /dev/null +++ b/docs/beta-1/reference/portal-resident-website-acceptance.json @@ -0,0 +1,142 @@ +{ + "identity": "Townlight Beta 1 approved resident website implementation", + "recorded_utc": "2026-11-03T00:42:20.409855+00:00", + "passed": true, + "scope": "Source implementation and isolated synthetic application/workflow verification; unpublished", + "source_base_commit": "4b83414dca1e672b057031380fae6be446f28bd3", + "source_hashes": { + "scripts/portal-e2e.py": "0b67fabf5b731bc052eae81541955fea47382a2d299646c1fa57cb7b44e829bb", + "scripts/portal-e2e-browser.cjs": "922ae16cb14b073bd75cfbb1e48368cc4388aeef8196ca59f83412a686836bae", + "portal/website/townlight.py": "40d19eb490c614312b557ee1ebdd0d3b0cba560092eabd610be438fae2e4d836", + "portal/website/views.py": "26641b71cfa2aed67f8d296b6587958a8e1d1cf6d4e530f92e7129298a16f96c", + "portal/website/wagtail_hooks.py": "7a24e16300538415aa0d05bfdf2ac5ddfd8a16fa15185dc1057f5796f632e0c9", + "portal/serve.py": "461c28ae493c2fe70cf988b9cd8b83c5e4dfe89901bcf7d37770b5ca9703e6fa", + "portal/manage.py": "fd2d426e0131b607d89462510280abe0a5d58f2b32e88f6a9dd252d4c8861bc0", + "portal/portal/settings.py": "17850c1db7daafd8a0c94c4e2f54be9eb4fde9dd99ebf8a4ed96582d02f04b65", + "portal/portal/urls.py": "4b4cf3a5a53ed910a7bdab9c0b5a63002ceb242d93ef8d00764292ce82da5d40", + "portal/portal/wsgi.py": "13b259e5b7ba828c62320b9c82b3049fdb1f6091918db0d6ebc459ad8e2f94fd", + "portal/portal/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "portal/vendor/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "portal/website/context_processors.py": "c6d5ddfb4a859834095c2b034b0de9e8c4d641a425aa0b1fc55335423525474a", + "portal/website/importing.py": "1c6da9559513ef9d533fd8cf783d3e08c66bcead42f5a3946e8b7cbc86684320", + "portal/website/models.py": "b59471207de5aae9633b535df3369b96803d657b67fc5d1291d0ddbdcbdfe19f", + "portal/website/tests.py": "b8b0053c75725b9659679923484a3413e3e81cb40b7458e18ab8ada50269f84e", + "portal/website/test_deployment.py": "314aa2c6b54b1441097fc2e21e771e6651897cebaa2d23818eacd6ab1c39790e", + "portal/website/test_meeting_timezone.py": "4cbafc977c66ec7bf48e114d3f1b758906647a836730b54eaf9b537e3934a38e", + "portal/website/test_public_website.py": "0d1fb6d774c02404c5b3639c0cf160c52bcca29ab80f63d3576435c1e62c414d", + "portal/website/test_source_archive.py": "78c7fc810a33aa4eaa1deb07ee3e77399a98f7b14ed5904d23f359072d64acc9", + "portal/website/test_townlight.py": "e137e67090f38aa1ee2af41bdac3a89e628d23dcb63dbd2e536bdae3fe7eb980", + "portal/website/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "portal/website/management/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "portal/website/migrations/0001_initial.py": "efe85c69fce793f6fd214d6045f5b8fb94aa3920ec371afa61881252358332f9", + "portal/website/migrations/0002_meeting_release.py": "061a91daaab9b249382db6cd830f84208c88f0087365d9d165f5a9360dbb6c66", + "portal/website/migrations/0003_public_website_design.py": "d365635651f73e0ff7336888cbbf3f676b565de7755ffac1672c698caf6545d9", + "portal/website/migrations/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "portal/website/templates/base.html": "32473d5cab6dca0db073fa93fe8f75ea265abdeaad54c9c84af95102341431cc", + "portal/website/templates/website/home_page.html": "b50af92027c65237eeb8ff4d0ee77b108466eb41192f04f993d0c3ac2821bf0b", + "portal/website/templates/website/meeting.html": "2cce92037e880364163b30f0ed348af8df970081fecf0eeabedc64c9b0f388bb", + "portal/website/templates/website/meetings.html": "8217faa8e9610d4b8fcee81f87df2acc92374811b3e5cd27b1c4d20a29e324ad", + "portal/website/templates/website/meeting_document.html": "43206c6fa1ec548e7d254ac88fa687174a2a969096ecd8718e438e85d411f39d", + "portal/website/templates/website/publication_admin.html": "25dc52ae07e441581326d074c537b890e5ee462765ac7f6386f41e44de1437c0", + "portal/website/templates/website/search.html": "a2bb3da8c90d2916c223ad0ba1ecb7326fc5258063607cb4bffc8dec6cee447d", + "portal/website/templates/website/service_page.html": "84aee07a39570ceff45a7d768140be43c36733fbd630725aaf42056da0cf0604", + "portal/website/templates/website/includes/brand.html": "288ccef15949b69e0961ec1f1f65b2b7e68140e950607076b3cb1b7fc7b1dde3", + "portal/website/templates/website/includes/icon.html": "5250a5fa9427b149ea6256904d3088bd5b51852514becbed3a56635d06228aff", + "portal/website/templates/website/includes/icons.html": "1b577248d54e1265dd5bd06949de5f2f8471a9ef470c1b22971865bf94418a56", + "portal/website/static/website/chamber.svg": "d6c7e2202e8dca5912b96b4f1fff5dac070ac60df151447f4c8d38e1dd829495", + "portal/website/static/website/cityscape.svg": "d5d22bfcea670d125ec2b111e44438846995b4fde3989ebe5e04ccd22e588861", + "portal/website/static/website/portal.css": "96438126a7ec6c5c344a0eee9dd3b9922adf971ff9e25c887dc6246df7630c67", + "portal/website/static/website/portal.js": "8aaed38f88bc8bb57361d652b860f5820a167c99d6332cf5dcb797d811fc4e35", + "portal/website/management/commands/export_public.py": "ae861e0d49cc52ee3677ce9a2d25bb7418e641592f7e6d27e2bc9f21c8815a77", + "portal/website/management/commands/import_synthetic.py": "d113088e20d0ec892ee283ba9d11d4863d3b8781197d86cbecfdfb6198517cd9", + "portal/website/management/commands/setup_demo.py": "71dbc1b39b65d0385ef648af3c571d9626aad739e3459bc038989886de426ea9", + "portal/website/management/commands/sync_townlight.py": "adae7b3b850ebb17c81d98aa36f89081b58e08bb32f9409ce05a8423fa4fe683", + "portal/website/management/commands/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "portal/vendor/civiccast/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "portal/vendor/civiccore/manifest.py": "15caa167acce428facdf7683085d47dd4a01b02cc2d05df25d6aa1d157bb79bd", + "portal/vendor/civiccore/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "portal/vendor/civiccast/agenda_import/base.py": "d35605c2534aa6a635754fb7b831a971639689775e88fa6f73290e6390d257ef", + "portal/vendor/civiccast/agenda_import/docparse.py": "8fff0ec6df605a63c9895c69eca68ea246170edae063c93cf686b553c7be15c4", + "portal/vendor/civiccast/agenda_import/models.py": "832ac35ccab0fec09670da7de2e30c342c6a739c587276101549f90a73986845", + "portal/vendor/civiccast/agenda_import/primegov.py": "9f788b2840ef3f234e943bde1fbb3827b94dd572ae243fa52b32b5efa56c5f96", + "portal/vendor/civiccast/agenda_import/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "portal_tests": { + "passed": 23, + "missing_migrations": false + }, + "workflow_checks": [ + "real isolated PostgreSQL Records, Meetings, Station and portal migrations", + "public archive, agenda, packet and minutes created via Meetings HTTP", + "actual Station worker processed synthetic video and returned hash-verified recording", + "publication denies absent proof, wrong role, missing approval and unfulfilled request", + "Records HTTP handoff, approved release copy, current approval, verified response and package, and fulfillment", + "native publisher lookup returns eligible public choice without granting approval and denies wrong role", + "bundle authenticates real public sources, rejects closed archive/wrong hash, contains only approved bytes", + "portal repeat sync is idempotent; public page and ranged release are hash-verified and exclude private content", + "public export contains approved release bytes and excludes private meeting title and request data", + "production Waitress entry enforces HTTPS redirect and serves approved range behind configured loopback TLS proxy", + "native service failure leaves existing public release available", + "headless browser verifies resident desktop/mobile/no-JS flows, editor content and authenticated publication with actual MP4 playback", + "explicit withdrawal hides meeting, documents, search, homepage feature and release routes" + ], + "headless_browser_checks": [ + "four actual Wagtail views render approved desktop layout and collected local assets", + "resident task finder opens real service page with explicit existing-service destination", + "archive opens actual meeting, all three approved documents and decodable MP4", + "public title search and archive empty state work without private source text", + "four phone layouts fit; mobile menu, Escape and navigation work", + "resident navigation, task finder and filtering work with JavaScript disabled", + "Wagtail staff publishes editable service presentation; resident sees saved content", + "Wagtail superuser lookup retains separate explicit publication approval" + ], + "page_errors": [], + "failed_browser_requests": [], + "executed_input_hashes_verified": 64, + "owned_services_terminal": true, + "temporary_proofs_removed": true, + "native_runtime": "Existing isolated installed candidate wheel; native source unchanged for this presentation work", + "evidence_limits": [ + "Short synthetic capture and approved MP4 only", + "No real city credentials, tenant or hardware", + "No new YouTube or CivicCast delivery test; their code is unchanged", + "No remote CI, new signed installer, host installation changes, public deployment or publishing", + "Existing Records original/release size limit and active native session-proof requirements remain" + ], + "screenshots": [ + "home-desktop", + "archive-desktop", + "meeting-desktop", + "service-desktop", + "home-mobile", + "archive-mobile", + "meeting-mobile", + "service-mobile" + ], + "documentation": { + "passed": true, + "responsive_views_checked": 10, + "manuals": [ + { + "manual": "Portal-Guide", + "pdf_pages": 12, + "word_images": 3, + "pdf_sha256": "ddc222df10b99d3eaf62372619252485b0092ed290755a0f7464567fc4cd4fcc", + "docx_sha256": "1310c494e279089fb1f6c1066b9f23d01123e2f03754914e96b523db3545c147" + }, + { + "manual": "Suite-Manual", + "pdf_pages": 20, + "word_images": 2, + "pdf_sha256": "70f8eb3c544769cc413300f592b4581a5affd014ea6e6646396e4e7edac92087", + "docx_sha256": "72f4d30b6477441d4622c1ac68ce084fa1411edf1ecd13ad544d8250fd081ef5" + } + ], + "portal_links_checked": [ + "manuals/portal.html", + "reference/portal-verification.html" + ], + "collected_assets_verified": 4 + }, + "required_native_compile_check": true +} diff --git a/docs/beta-1/reference/portal-verification.html b/docs/beta-1/reference/portal-verification.html new file mode 100644 index 0000000..ccea3c4 --- /dev/null +++ b/docs/beta-1/reference/portal-verification.html @@ -0,0 +1,112 @@ +Townlight Portal +Verification | Townlight Beta 1
townlightTownlight Beta 1
+
Townlight Beta 1

Townlight +Portal +Verification

Staff guide and technical reference

Separately deployed portal beta · 2 November 2026
Existing signed installer predates this integration

Portal verification and +isolated acceptance

+

Resident website design +verification

+

The approved city-facing interface is implemented in the Wagtail +application, not just in the separate design mockup. The retained +website acceptance receipt is resident website +synthetic acceptance. It supplements the historical +native-integration receipt; the older installer and Sandbox results do +not demonstrate this portal deployment.

+

The affected Django suite covers city-content export, source assets, +restricted/draft navigation and search, safe service destinations, +public text documents, time/date filters, and withdrawal. Existing +editor submission/moderator approval and native bundle/refusal tests +remain in the suite. The real-service runner exercises actual synthetic +Meetings, Station capture, Records release approval/fulfillment and +portal publication, then checks the four resident layouts at desktop and +phone widths, JavaScript-disabled navigation, actual MP4 decoding, all +three approved text documents, staff service-content publication and the +separate native-publication approval. Withdrawal is checked across +document, playback, homepage and search routes. Failed source +synchronization must preserve the prior public release.

+

No city credentials, real tenant requests, physical capture +equipment, YouTube upload or CivicCast broadcast are exercised by these +portal checks. Existing unrelated product/hardware evidence is not +relabeled as a new pass. Remote CI, a new signed installer, hosted +deployment and public publication are not performed by this local +verification.

+

The existing signed Beta 1 installer predates the portal endpoints. +The candidate wheel must be built and installed in a separately prepared +matching runtime as described in the portal +guide; do not modify a host installation as a verification shortcut. +Preserve activation, profile and database contracts. The portal and +native services should use a private origin and an active authorized +session proof. Use a synthetic request and release for test +environments, and do not publish confidential material or proofs in +receipts.

+

For an integration check, use the Wagtail publication lookup with a +valid Records request UUID or call +GET /desktop/v1/portal/selections?request_id=<UUID> +on the private native origin using the server-side +X-Townlight-Session proof. An authenticated 200 response +contains a selections array; an empty array does not prove +a matching eligible source is ready. Select a reviewed result and +confirm that approve_publication is false until the +operator separately approves. Exercise publication, resident page and +release, then explicit withdrawal; distinguish source, test and +installed evidence in the result. Never expose the native runtime +port.

+

Isolated synthetic runner

+

scripts/portal-e2e.py is a Windows-oriented isolated, +synthetic real-service test harness. Use a harness Python environment +containing httpx, psycopg2 and +cryptography. From the suite repository root, inspect its +current options with:

+
python scripts/portal-e2e.py --help
+

Use explicit paths appropriate to the test machine. The output +directory must not already exist; the harness creates databases, test +identities and owned local services under that directory. The module +root contains sunshine/backend, core, +meetings, access and notice; the +Station root contains the Station Python source. The media source is a +separate Python source tree with pyproject.toml. Provide a +PostgreSQL bin directory containing Windows executables, Python +environments with the harness and relevant service dependencies, and a +dedicated browser executable and Playwright module. Example +placeholders, not production paths:

+
python scripts/portal-e2e.py `
+  --station-root '<station-source>' --modules-root '<module-source-root>' `
+  --native-runtime-root '<native-runtime-source>' --services-python '<services-python.exe>' `
+  --media-python '<media-python.exe>' --portal-python '<portal-python.exe>' `
+  --postgres-bin '<postgres-bin>' --media-source '<media-source>' `
+  --ffmpeg '<ffmpeg.exe>' --ffprobe '<ffprobe.exe>' --node '<node.exe>' `
+  --playwright '<playwright-module-directory>' --chromium '<chromium.exe>' `
+  --output '<new-isolated-output-directory>'
+

The runner uses synthetic test configuration and identities and +records its inputs and owned processes. Its results are test evidence +for those inputs; they do not by themselves prove an installed wheel, +signed installer, real city deployment or public site. Consult +--help and the current script for the exact supported +options and prerequisites. Stop only services owned by the run and +preserve its evidence. Verification of the separately prepared wheel and +normal activation requires its own matching-runtime +evidence.

+ \ No newline at end of file diff --git a/docs/beta-1/reference/windows-1.7.0.1-source-pins.json b/docs/beta-1/reference/windows-1.7.0.1-source-pins.json new file mode 100644 index 0000000..9af547e --- /dev/null +++ b/docs/beta-1/reference/windows-1.7.0.1-source-pins.json @@ -0,0 +1,92 @@ +{ + "windows_msi": "1.7.0.1", + "suite_commit": "706028abab771d0b4c8458e52c759a8bbd9ce3ba", + "source_archive": "https://github.com/townlight/townlight/releases/download/townlight-beta-1-windows-1.7.0.1/Townlight-Candidate-706028a-Corresponding-Source.zip", + "source_archive_sha256": "a83be287bd91129292f9cf505b956141466636c9cf7a391f1097b723863ef6d5", + "repositories": { + "core": { + "commit": "3021821bf9a92c790a399ad12aed821d65b09105", + "archive": "core.zip", + "sha256": "d9dc9c1138a47012dae445cb3b14f627674f918d8fd38a3618baa7f3be2f59df", + "bytes": 24352951 + }, + "access": { + "commit": "f377a9a6e2a14d890333a20eab9277d644a9aaeb", + "archive": "access.zip", + "sha256": "fe43140af35f2e27c3bcd850f2476d55c9ce5386e7ddec24e0f31b8a0a8d3a21", + "bytes": 1980387 + }, + "notice": { + "commit": "4edf01296b0ad56a331e7fdd9b7c2d19c20b8e48", + "archive": "notice.zip", + "sha256": "e92b9d371722ddc2b4362c4abb3a5892da8f755f559da1fd2a02edc64a97fb4b", + "bytes": 2867717 + }, + "ordinances": { + "commit": "22d00f560cc45088a5b24a3f997787ee9c7a5e31", + "archive": "ordinances.zip", + "sha256": "2a08040e3112338c8e217b215ee0d2b1ccd60b22e75bf1d4187aa060c2e20d2e", + "bytes": 62013181 + }, + "zone": { + "commit": "fb352955720db2e6e21caca816a8eb609a49f768", + "archive": "zone.zip", + "sha256": "81edbe00cade83c617609374d12ad43f1ac7c3ed2ac2240a04d6f49cd55bec98", + "bytes": 12322937 + }, + "plan": { + "commit": "7de514f1afd720f93bd70a4866c3389ef621dc49", + "archive": "plan.zip", + "sha256": "bf3248dbf6de00e36f16010ec5d0956e6525f784f03dd475cedf8c89c1d17b7e", + "bytes": 12209129 + }, + "permit": { + "commit": "224116d9c714f613646f2b6ce2cbb687cb5e0040", + "archive": "permit.zip", + "sha256": "6e92dfe626b77097f596b5aca3e0e10b24e66e9a559e29c544a75aa2e144606b", + "bytes": 9539129 + }, + "inspect": { + "commit": "a6861f262328e7645557ad2a2600db4a12a5046c", + "archive": "inspect.zip", + "sha256": "dd79ab5d9ad3251d24f1671ba369b90263c6960edc3b01341bfdf3a1b9e7bf96", + "bytes": 13303207 + }, + "meetings": { + "commit": "e0577a165cc8f09a3597ec3ce54ecc23168f8d62", + "archive": "meetings.zip", + "sha256": "d9201c71718c8a7425be3380d66f48dcceea119a8bd999e3acf29cab93b57625", + "bytes": 139517100 + }, + "sunshine": { + "commit": "ad5559709bce55e3dd53e3a3ca45b3b234730099", + "archive": "sunshine.zip", + "sha256": "b75564d325b690db685d6208439d2cfa7e3b741463b4d5859c5da92720924909", + "bytes": 26157769 + }, + "station": { + "commit": "7205ed1b07132b1649c994e190b381d773807aff", + "archive": "station.zip", + "sha256": "b25ce00d7ac322c7e7c2ff75d5995dfb6255621500f6cca9984781ca704c6dab", + "bytes": 11022196 + }, + ".github": { + "commit": "9308e62c0c496d8a48dfc018dcfa6b7669deeb07", + "archive": ".github.zip", + "sha256": "8f7dc1c04c0e8bc65616212d4eba3fd087b68dfd8f5aeca12ec6c0bf7e4c4a7c", + "bytes": 27492 + }, + "townlight.github.io": { + "commit": "af59418189338bc5dd12ed0a0b5744b7a29220e3", + "archive": "townlight.github.io.zip", + "sha256": "b28a0e3a2b3b6218c1eb9834490e29c214dd9ee45d7ed15b766b5f648167b0f4", + "bytes": 4160462 + }, + "townlight": { + "commit": "706028abab771d0b4c8458e52c759a8bbd9ce3ba", + "archive": "townlight-706028a.zip", + "sha256": "d5faa05daeebbd32536d79b64b0e8e8a52fc48d9a57578e392a90d466e922070", + "bytes": 103303008 + } + } +} diff --git a/docs/beta-1/terms.html b/docs/beta-1/terms.html index a53c4df..8d5eb50 100644 --- a/docs/beta-1/terms.html +++ b/docs/beta-1/terms.html @@ -7,10 +7,10 @@ main,.toc a,.hero h1{overflow-wrap:anywhere} @page{size:Letter;margin:.7in .65in .75in} @media print{html{scroll-behavior:auto}body{font:10.5pt/1.45 Arial,sans-serif;color:#172f39}header,footer,.search-area,.screen-only{display:none}.doclayout{display:block;padding:0;max-width:none}.toc{position:static;max-height:none;overflow:visible;font-size:10pt;break-after:page}.toc>h2{border:0}.toc ul{columns:2;column-gap:.3in}.toc li{break-inside:avoid}.docbody h1{font-size:30pt}.docbody h2{font-size:19pt;break-after:avoid;padding-top:.15in;margin-top:.35in}.docbody h3{font-size:12pt;break-after:avoid}.docbody h4{break-after:avoid}p{orphans:3;widows:3}pre{font-size:8.2pt;line-height:1.4;padding:.1in;break-inside:auto}table{font-size:8.4pt;line-height:1.35}th,td{padding:.06in .07in}tr{break-inside:avoid}.flow{max-height:6in;object-fit:contain;break-inside:avoid}a{color:#172f39;text-decoration:underline}.cover{break-after:page;padding-top:1in}.cover .edition{font-size:11pt}.cover h1{font-size:32pt}.cover .lead{font-size:14pt}.api-entry{break-inside:auto}.api-entry h3{break-after:avoid}.index-columns{columns:2}} -
townlightTownlight Beta 1
+
townlightTownlight Beta 1
Townlight Beta 1

Terms of Service and -License

Staff guide and technical reference

Documentation edition 30 October 2026
Existing component versions retained
Signed suite installer 1.6.0.1
Private beta documentation companion

+text.

\ No newline at end of file diff --git a/docs/beta-1/versions.html b/docs/beta-1/versions.html index 04ad542..4e728b5 100644 --- a/docs/beta-1/versions.html +++ b/docs/beta-1/versions.html @@ -12,10 +12,10 @@
Townlight
-

Naming, Access and Notice source candidate · 2 November 2026

-

Prepared documentation. Build, signing, installed acceptance and publication remain pending.

+

Windows x64 Beta 1 · MSI 1.7.0.1

+

The signed Windows x64 beta 1.7.0.1 passed the documented fresh Windows Sandbox checks with synthetic data.

Component versions

-

This is the prepared naming, Access and Notice candidate. It has not -yet passed signed Windows installed acceptance or been published.

+

These components are included in the signed Windows x64 beta 1.7.0.1. See the Windows acceptance summary for the tested workflows.

- + @@ -97,9 +96,7 @@

Component versions

Product DistributionCandidate versionInstalled version
-

Desktop source version: 1.7.0-1. Intended MSI version: -1.7.0.1. Candidate MSI, signature, hashes and installed -acceptance remain pending.

+

Desktop source version 1.7.0-1. Windows MSI version 1.7.0.1. See the SHA-256 checksums and Windows acceptance summary.

Historical releases retain their original package identities, version numbers and evidence. These candidate names do not rename historical artifacts.

diff --git a/docs/index.html b/docs/index.html index 87b4975..5c39961 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1 +1 @@ -Townlight Zoning | Townlight Beta 1
townlightTownlight Beta 1
Townlight Zoning · Townlight Beta 1

Bring parcel context and cited rules into one review.

Zoning combines local parcel geometry, cited zoning rules and staff review. It retains questions, corrections and snapshots with provenance so downstream staff can identify the precise evidence used.

townlight-zoning 0.2.3AGPL-3.0-onlyPrivate beta · Windows fresh-install scope
For Planners, land-use staff and authorized reviewers

What the workflow delivers

  1. Prepare parcel data. Use the complete supported bundle, including jurisdiction, dataset metadata and original hashes. The coordinates must be EPSG:4326. A loose geometry file is not the full source envelope.
  2. Import and inspect. Check the complete source envelope before selecting Import parcel dataset. That control submits directly; inspect the saved validation/provenance result afterward. Correct a refused source bundle and preserve the evidence. Do not force acceptance by editing SQL.
  3. Register cited rules. Associate the zone, rule kind/key and value with the relevant public Code section. Inspect overlays and effective context. Leave missing authority visible for planner review.
  4. Ask a parcel question. Look up the intended parcel and ask the supported question. Read the returned citation, applicability and disclaimer. Do not present an uncertain answer as an official decision.

Connected evidence

Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting.

Know the beta boundary

The accepted path is local GeoJSON/PostGIS. It does not establish every ArcGIS, assessor or CKAN connector. Answers and process explanations are informational and do not issue an entitlement or an official zoning determination.

Architecture

Where the evidence goes

Townlight Zoning architecture and evidence flow

Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting.

Evidence rather than promises

Candidate installed acceptance remains pending.

Earlier releases have their own first-run and synthetic Windows Sandbox evidence. This changed source candidate requires a new signed installer and installed acceptance. This is not a claim that every screen, vendor, upgrade or city equipment configuration has been certified.

Read the exact acceptance and limits →

Ready to evaluate?

Begin with the current manual; obtain this candidate only after its exact installer and acceptance are identified. Configure the chosen test site and have its staff review source applicability and run the existing workflows.

\ No newline at end of file +Townlight Zoning | Townlight Beta 1
townlightTownlight Beta 1
Townlight Zoning · Townlight Beta 1

Bring parcel context and cited rules into one review.

Zoning combines local parcel geometry, cited zoning rules and staff review. It retains questions, corrections and snapshots with provenance so downstream staff can identify the precise evidence used.

townlight-zoning 0.2.3AGPL-3.0-onlyBeta evaluation · Windows fresh-install scope
For Planners, land-use staff and authorized reviewers

What the workflow delivers

  1. Prepare parcel data. Use the complete supported bundle, including jurisdiction, dataset metadata and original hashes. The coordinates must be EPSG:4326. A loose geometry file is not the full source envelope.
  2. Import and inspect. Check the complete source envelope before selecting Import parcel dataset. That control submits directly; inspect the saved validation/provenance result afterward. Correct a refused source bundle and preserve the evidence. Do not force acceptance by editing SQL.
  3. Register cited rules. Associate the zone, rule kind/key and value with the relevant public Code section. Inspect overlays and effective context. Leave missing authority visible for planner review.
  4. Ask a parcel question. Look up the intended parcel and ask the supported question. Read the returned citation, applicability and disclaimer. Do not present an uncertain answer as an official decision.

Connected evidence

Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting.

Know the beta boundary

The accepted path is local GeoJSON/PostGIS. It does not establish every ArcGIS, assessor or CKAN connector. Answers and process explanations are informational and do not issue an entitlement or an official zoning determination.

Architecture

Where the evidence goes

Townlight Zoning architecture and evidence flow

Consumes Code authority and permitted Meetings evidence. Supplies permitted snapshots to Records and context to Planning and Permitting.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary records the workflows exercised with synthetic data on the released MSI. This is not a claim that every screen, vendor, upgrade or city equipment configuration has been certified.

Read the exact acceptance and limits →

Ready to evaluate?

Begin with the current manual and download the Windows x64 beta 1.7.0.1. Configure the chosen test site and have its staff review source applicability and run the existing workflows.