diff --git a/CHANGELOG.md b/CHANGELOG.md index c541379..38d6106 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. + + All notable changes to **civiccore** are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/README.md b/README.md index 2ad3dc2..94f1c87 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,231 @@ -> **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 Core Manual + - Contents + - Using this manual + - Beta identity + - First run + - Daily workflow + - Connected workflows + - Architecture + - Shared catalog rules and scaffolding + - 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 Core Manual + +**Townlight Beta 1** · Naming candidate documentation edition 2 November 2026 + +## Contents + +- [Using this manual](https://townlight.github.io/manuals/core.html#using-this-manual) +- [Beta identity](https://townlight.github.io/manuals/core.html#beta-identity) +- [First run](https://townlight.github.io/manuals/core.html#first-run) +- [Daily workflow](https://townlight.github.io/manuals/core.html#daily-workflow) +- [Connected workflows](https://townlight.github.io/manuals/core.html#connected-workflows) +- [Architecture](https://townlight.github.io/manuals/core.html#architecture) +- [Shared catalog rules and scaffolding](https://townlight.github.io/manuals/core.html#shared-catalog-rules-and-scaffolding) +- [Technical specifications](https://townlight.github.io/manuals/core.html#technical-specifications) +- [Configuration and administration](https://townlight.github.io/manuals/core.html#configuration-and-administration) +- [API and integration examples](https://townlight.github.io/manuals/core.html#api-and-integration-examples) +- [MCP and automation boundary](https://townlight.github.io/manuals/core.html#mcp-and-automation-boundary) +- [Security and permissions](https://townlight.github.io/manuals/core.html#security-and-permissions) +- [Backup recovery and maintenance](https://townlight.github.io/manuals/core.html#backup-recovery-and-maintenance) +- [Troubleshooting](https://townlight.github.io/manuals/core.html#troubleshooting) +- [Verified workflows and limits](https://townlight.github.io/manuals/core.html#verified-workflows-and-limits) +- [Terms of service and license](https://townlight.github.io/manuals/core.html#terms-of-service-and-license) +- [Glossary](https://townlight.github.io/manuals/core.html#glossary) +- [Alphabetical subject index](https://townlight.github.io/manuals/core.html#alphabetical-subject-index) +- [Source and document control](https://townlight.github.io/manuals/core.html#source-and-document-control) + +## Using this manual + +Townlight Core helps IT administrators and platform maintainers. Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product. + +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 Core +| Identity | Value | +|----|----| +| Documentation | Townlight Beta 1 naming, Access and Notice candidate | +| Intended installer version | 1.7.0.1 | +| Product component | townlight-core 1.3.0.dev2 | +| Principal import package | townlight_core | +| 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. -Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product. +## 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/core.html) · [Printable PDF](docs/beta-1/pdf/Townlight-Core-Manual-Beta-1.pdf) · [Editable Word manual](docs/beta-1/docx/Townlight-Core-Manual-Beta-1.docx) -- [API and data dictionary](docs/beta-1/api/core.html) · [OpenAPI JSON](docs/beta-1/api/core-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. Complete setup -| 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-core 1.3.0.dev2 | -| Principal import package | townlight_core | -| Candidate hashes | Pending build, signing and installed acceptance | -| License | AGPL-3.0-only | +Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed. + + + +### 2. Activate the runtime + +Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database. + + + +### 3. Create staff access + +Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users. + + + +### 4. Import through the right product + +Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review. + + + +### 5. Make a coherent backup + +Save open work. Use Backup Now; it stops writers to preserve a consistent snapshot. Retain the backup receipt, then use Start to resume services. + + + +### 6. Restore and verify + +Use Restore Latest Backup after preserving current recovery material. A result of Restore needs service start is an intermediate state: use Start, then Check. Reopen a known saved record to confirm recovery. + + + +### 7. Collect diagnostics + +Record the time, selected composition, version, operation and exact error. Inspect System Health and create a redacted support bundle. Do not delete a profile as the first repair step. + +### Working safely -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. +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. -## What staff can do +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. -- **Complete setup:** Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed. -- **Activate the runtime:** Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database. -- **Create staff access:** Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users. -- **Import through the right product:** Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review. -- **Make a coherent backup:** Save open work. Use Backup Now; it stops writers to preserve a consistent snapshot. Retain the backup receipt, then use Start to resume services. -- **Restore and verify:** Use Restore Latest Backup after preserving current recovery material. A result of Restore needs service start is an intermediate state: use Start, then Check. Reopen a known saved record to confirm recovery. -- **Collect diagnostics:** Record the time, selected composition, version, operation and exact error. Inspect System Health and create a redacted support bundle. Do not delete a profile as the first repair step. +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. -## Operating procedures and examples +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 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. +## Connected workflows + +All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals and are covered by the Windows acceptance summary. + +| Direction | Material | +|----|----| +| Input | Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. | +| Output | Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. | + +### Product boundary + +Shared catalog, exemption and module-generator code exists in this private candidate. It is not a centrally hosted federation service. A business product still owns its decisions, identity mapping and permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation. + +## Architecture + +
+Townlight Core 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. + +## Shared catalog rules and scaffolding + +These are existing Core developer and administrator contracts. They do not add a new Core administration screen. Staff use the owning product’s normal controls; developers call the library only inside an authenticated application or an isolated synthetic test. The caller owns authorization and database commit or rollback. + +### Catalog import and readback + +1. Review the catalog’s `catalog_version`, domain names and systems. Each system supplies vendor name, protocol, data shape, record types, redaction tier 1–3 and optional discovery hints. Hints are limited to `ports`, `db_patterns` and `service_accounts`; do not put credentials in them. +2. In an authorized application transaction, call `townlight_core.catalog.import_catalog(session, bundle, actor_id=actual_actor_id)`. The actor is the authenticated application’s identity. A changed or incomplete existing version is refused rather than overwritten. Use a newly reviewed version for changed catalog contents. +3. Read `domains(session)`, `system_catalog(session, domain)` and `connectors_for(session, domain)` before committing. Commit only the intended import; roll back on refusal. Repeating an identical complete version is a no-op. +4. Treat returned systems and connector recommendations as catalog information. Import does not discover vendor endpoints, install a connector or establish access to a city’s system. + +The following synthetic library example belongs inside an existing authorized async transaction. `session` and `actual_actor_id` are supplied by that application; this is not a command that seeds an administrator. + +``` python +from townlight_core.catalog import import_catalog, system_catalog + +bundle = { + "catalog_version": "synthetic-1", + "domains": [{"domain": "synthetic-records", "systems": [{ + "vendor_name": "Synthetic file source", + "access_protocol": "file", "data_shape": "json", + "common_record_types": ["synthetic minutes"], + "redaction_tier": 2, "discovery_hints": {} + }]}] +} +loaded = await import_catalog(session, bundle, actor_id=actual_actor_id) +rows = await system_catalog(session, "synthetic-records") +``` + +The Records compatibility facade reads its bundled `app/data/systems_catalog.json` through Core. Its existing administrator `POST /catalog/load` takes no replacement bundle body; `GET /catalog/domains`, `/catalog/systems?domain=...` and `/catalog/connectors?domain=...` expose readback. These non-desktop routes use the application’s actual authenticated staff/admin dependencies. Do not substitute an invented role header. The shared SDK example above is the route for a developer-supplied bundle. + +### Jurisdictional rule evaluation and review + +Select the jurisdiction and active reviewed rule versions before evaluating document text. Core’s `Rule` carries `id`, `state_code`, `category`, `rule_type`, `definition` and integer `version`. Supported supplied rule types are `keyword` and `regex`; an unsupported rule or incomplete/timed-out scan raises `RuleEvaluationError`. An error must remain an incomplete scan, never “no exemptions found.” Core does not assume a jurisdiction or claim complete legal coverage. + +``` python +from uuid import UUID +from townlight_core.exemptions import Rule, evaluate, RuleEvaluationError + +rule = Rule( + id=UUID("11111111-1111-4111-8111-111111111111"), + state_code="CO", category="Synthetic review flag", + rule_type="keyword", definition="synthetic protected text", version=1 +) +try: + flags = evaluate("Contains synthetic protected text", "CO", rules=[rule]) +except RuleEvaluationError: + raise # The owning application records an incomplete scan. +``` + +This is fictional test text, not a Colorado exemption rule. Read each result’s matched text, rule identity/version and confidence, then use Records’ explicit reviewer decision and legal/source basis. A flag is not an authorized withholding or redaction. Records’ existing exemption rule/history/test and flag-review endpoints are listed in its technical reference; record changes through those controls, preserving history. + +### Scaffold plan and generate + +Run the existing CLI from a developer environment containing the matching Core package. Choose an existing empty parent workspace directory, not an installed application’s directory. The module’s own directory will be created underneath it. The following creates only a fictional module project; it does not register, install, migrate or run it. + +``` powershell +& $control -m townlight_core.scaffold plan civicnotes ` + --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' +& $control -m townlight_core.scaffold generate civicnotes ` + --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' ` + --target 'C:\TownlightSynthetic' --dry-run +``` -- [Shared catalog rules and scaffolding](docs/beta-1/manuals/core.html#shared-catalog-rules-and-scaffolding). -- [Catalog import and readback](docs/beta-1/manuals/core.html#catalog-import-and-readback). -- [Jurisdictional rule evaluation and review](docs/beta-1/manuals/core.html#jurisdictional-rule-evaluation-and-review). -- [Scaffold plan and generate](docs/beta-1/manuals/core.html#scaffold-plan-and-generate). +Here `$control` is the Python executable in that isolated developer environment. Inspect the plan and files, then remove `--dry-run` only when that exact target is approved for generation. Existing files are refused, not silently overwritten. Exit 0 indicates success; refusal exits 2. Options include `--version`, `--townlight_core-min-version`, `--permission-key`, repeated `--staff-role` and `--route-path`; inspect `--help` for the exact invocation. Keep generated access requirements and migration stubs under the new module’s own review. No automatic product deployment follows generation. -## Architecture and data +Source contracts: `townlight_core/catalog/__init__.py`, `townlight_core/exemptions/__init__.py`, `townlight_core/scaffold/cli.py`, `project.py`, and the Records catalog facade. + +## Technical specifications ### Runtime and storage @@ -65,30 +243,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 | Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. | -| Retained records | Named local accounts; native sessions; source and department authority; task receipts; profile configuration; coherent backup manifests; catalog, exemption and scaffold contracts. | -| Output | Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. | -| Connections | All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals; installed acceptance remains pending. | +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](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. -## Setup and operation +## Configuration and administration -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 ### 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 +257,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('get_app_state', {}); console.log(result); @@ -112,7 +273,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 @@ -125,7 +286,7 @@ Remove-Variable session, headers 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 @@ -147,7 +308,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 [Core API reference](https://townlight.github.io/api/core.html) for every documented operation, request field, constraint, response declaration and source supplement. Download the [OpenAPI JSON](https://townlight.github.io/api/core-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. @@ -155,75 +320,174 @@ 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. -## Verification and known limits +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 | -| --- | --- | --- | +|----|----|----| | Core | PASS | Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. | - 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. -Shared catalog, exemption and module-generator code exists in this private candidate. It is not a centrally hosted federation service. A business product still owns its decisions, identity mapping and permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation. +## Terms of service and license -## Development and repository map +### Scope and status -### Fresh source checkout and exact local wheel +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. -This renamed candidate is not yet published on a package index. From this -exact candidate checkout, build its wheel before installing consumers. Use a -separate empty development environment, never an existing municipal profile: +### Software license and rights -```powershell -py -3.13 -m venv .venv -.\.venv\Scripts\python.exe -m pip install --upgrade pip build -.\.venv\Scripts\python.exe -m build --wheel --outdir ..\candidate-wheels -.\.venv\Scripts\python.exe -m pip install ..\candidate-wheels\townlight_core-1.3.0.dev2-py3-none-any.whl -.\.venv\Scripts\python.exe -c "import townlight_core; assert townlight_core.__version__ == '1.3.0.dev2'" -``` +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. -Consumers install this exact Core wheel first, then their matching local -candidate wheel. The corresponding-source manifest identifies the source -commit; a moving default branch is not a reproducible candidate pin. Package -installation does not initialize a database or establish installed acceptance. +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). -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. +### Data ownership and access -Relevant source contracts: +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. -- `townlight_core/auth` -- `townlight_core/catalog` -- `townlight_core/exemptions` -- `townlight_core/scaffold` -- `townlight_runtime/services.py` -- `desktop/src-tauri/src/supervisor.rs` +### Local operation and external processors -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. +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. -## Recovery and support +### Staff decisions and source applicability -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. +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. -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. +### Beta operation and recovery -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. +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. -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. +### 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/core.html#security-and-permissions). +- **AGPL and source** — [Terms of service and license](https://townlight.github.io/manuals/core.html#terms-of-service-and-license). +- **API contracts** — [API and integration examples](https://townlight.github.io/manuals/core.html#api-and-integration-examples). +- **Architecture** — [Architecture](https://townlight.github.io/manuals/core.html#architecture). +- **Backup** — [Backup recovery and maintenance](https://townlight.github.io/manuals/core.html#backup-recovery-and-maintenance). +- **Beta version** — [Beta identity](https://townlight.github.io/manuals/core.html#beta-identity). +- **Configuration** — [Configuration and administration](https://townlight.github.io/manuals/core.html#configuration-and-administration). +- **Evidence and acceptance** — [Verified workflows and limits](https://townlight.github.io/manuals/core.html#verified-workflows-and-limits). +- **Fees and official decisions** — [Terms of service and license](https://townlight.github.io/manuals/core.html#terms-of-service-and-license). +- **First run** — [First run](https://townlight.github.io/manuals/core.html#first-run). +- **Handoffs and audience** — [Connected workflows](https://townlight.github.io/manuals/core.html#connected-workflows). +- **MCP** — [MCP and automation boundary](https://townlight.github.io/manuals/core.html#mcp-and-automation-boundary). +- **Originals and provenance** — [Security and permissions](https://townlight.github.io/manuals/core.html#security-and-permissions). +- **Recovery** — [Backup recovery and maintenance](https://townlight.github.io/manuals/core.html#backup-recovery-and-maintenance). +- **Staff procedures** — [Daily workflow](https://townlight.github.io/manuals/core.html#daily-workflow). +- **Station configuration** — [Configuration and administration](https://townlight.github.io/manuals/core.html#configuration-and-administration). +- **Technical stack** — [Technical specifications](https://townlight.github.io/manuals/core.html#technical-specifications). +- **Troubleshooting** — [Troubleshooting](https://townlight.github.io/manuals/core.html#troubleshooting). + +### Operating subject links + +- **Catalog import and readback** — [Catalog import and readback](https://townlight.github.io/manuals/core.html#catalog-import-and-readback). +- **Jurisdictional rule evaluation and review** — [Jurisdictional rule evaluation and review](https://townlight.github.io/manuals/core.html#jurisdictional-rule-evaluation-and-review). +- **Scaffold plan and generate** — [Scaffold plan and generate](https://townlight.github.io/manuals/core.html#scaffold-plan-and-generate). +- **Shared catalog rules and scaffolding** — [Shared catalog rules and scaffolding](https://townlight.github.io/manuals/core.html#shared-catalog-rules-and-scaffolding). + +## 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 + +- **Activate the runtime** — [Daily workflow, step 2](https://townlight.github.io/manuals/core.html#workflow-2). + +- **Collect diagnostics** — [Daily workflow, step 7](https://townlight.github.io/manuals/core.html#workflow-7). + +- **Complete setup** — [Daily workflow, step 1](https://townlight.github.io/manuals/core.html#workflow-1). + +- **Create staff access** — [Daily workflow, step 3](https://townlight.github.io/manuals/core.html#workflow-3). + +- **Import through the right product** — [Daily workflow, step 4](https://townlight.github.io/manuals/core.html#workflow-4). + +- **Make a coherent backup** — [Daily workflow, step 5](https://townlight.github.io/manuals/core.html#workflow-5). + +- **Restore and verify** — [Daily workflow, step 6](https://townlight.github.io/manuals/core.html#workflow-6). + +- [Source inventory and file hashes](https://townlight.github.io/reference/source-inventory.json) -## License and responsible use +- [All component metadata](https://townlight.github.io/reference/component-metadata.json) -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. +- [Installed domain OpenAPI](https://townlight.github.io/reference/desktop-domain-openapi.json) -## Earlier documentation +- [Workflow matrix](https://townlight.github.io/reference/workflow-matrix.json) -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. +- [Full AGPL text](https://townlight.github.io/reference/AGPL-3.0.txt) diff --git a/README.txt b/README.txt index a46edae..2dcdf6c 100644 --- a/README.txt +++ b/README.txt @@ -1,111 +1,422 @@ - 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. - -Townlight Core - -Townlight Beta 1 · Naming candidate; component versions advanced · AGPL-3.0-only - -Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product. - -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 edition describes the prepared source candidate; obtain its installer only after signing and installed acceptance identify the exact artifact. - -- Operating manual · Printable PDF · Editable Word manual -- API and data dictionary · OpenAPI JSON -- Product and suite directory · Terms and full license - -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-core 1.3.0.dev2 - Principal import package townlight_core - 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 - -- Complete setup: Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed. -- Activate the runtime: Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database. -- Create staff access: Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users. -- Import through the right product: Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review. -- Make a coherent backup: Save open work. Use Backup Now; it stops writers to preserve a consistent snapshot. Retain the backup receipt, then use Start to resume services. -- Restore and verify: Use Restore Latest Backup after preserving current recovery material. A result of Restore needs service start is an intermediate state: use Start, then Check. Reopen a known saved record to confirm recovery. -- Collect diagnostics: Record the time, selected composition, version, operation and exact error. Inspect System Health and create a redacted support bundle. Do not delete a profile as the first repair step. - -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. - -- Shared catalog rules and scaffolding. -- Catalog import and readback. -- Jurisdictional rule evaluation and review. -- Scaffold plan and generate. - -Architecture and data +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 Core Manual + - Contents + - Using this manual + - Beta identity + - First run + - Daily workflow + - Connected workflows + - Architecture + - Shared catalog rules and scaffolding + - 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 Core Manual + +Townlight Beta 1 · Naming candidate documentation edition 2 November +2026 + +Contents + +- Using this manual +- Beta identity +- First run +- Daily workflow +- Connected workflows +- Architecture +- Shared catalog rules and scaffolding +- 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 Core helps IT administrators and platform maintainers. Core +provides the shared contracts, ingestion, identity helpers, task +infrastructure and recovery foundation used by Townlight. Staff +encounter these capabilities through Setup, Settings and System Health. +Business decisions stay with their owning product. + +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-core 1.3.0.dev2 + Principal import package townlight_core + 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. Complete setup + +Choose folders and the full product composition. Create the city profile +and the first named administrator. Choose a protected backup location. +Defer optional local AI if it is not needed. + +2. Activate the runtime + +Run the first-run health check, wait for readiness and open Townlight. +In System Health select Finish Records Migration to activate the +canonical Python and PostgreSQL services. A running process alone is not +a ready database. + +3. Create staff access + +Use Settings to create named staff. Sign out and confirm that staff can +sign in with their own account. Keep administrator privileges with +people responsible for setup; ordinary staff cannot administer users. + +4. Import through the right product + +Use the source library of Code, Zoning, Planning or Permitting. Inspect +provenance and permissions there. Core ingestion helpers do not bypass +the owning product’s source review. + +5. Make a coherent backup + +Save open work. Use Backup Now; it stops writers to preserve a +consistent snapshot. Retain the backup receipt, then use Start to resume +services. + +6. Restore and verify + +Use Restore Latest Backup after preserving current recovery material. A +result of Restore needs service start is an intermediate state: use +Start, then Check. Reopen a known saved record to confirm recovery. + +7. Collect diagnostics + +Record the time, selected composition, version, operation and exact +error. Inspect System Health and create a redacted support bundle. Do +not delete a profile as the first repair step. + +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 + +All products use selected Core contracts. Core does not create +unrestricted access between products. Access and Notice provide the +bounded staff workflows documented in their current manuals and are +covered by the Windows acceptance summary. + + Direction Material + ----------- ---------------------------------------------------------------------------------------------------------------------------------------- + Input Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. + Output Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. + +Product boundary + +Shared catalog, exemption and module-generator code exists in this +private candidate. It is not a centrally hosted federation service. A +business product still owns its decisions, identity mapping and +permission checks. Historical placeholder ADRs are retained as history, +rather than descriptions of the current implementation. + +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. + +Shared catalog rules and scaffolding + +These are existing Core developer and administrator contracts. They do +not add a new Core administration screen. Staff use the owning product’s +normal controls; developers call the library only inside an +authenticated application or an isolated synthetic test. The caller owns +authorization and database commit or rollback. + +Catalog import and readback + +1. Review the catalog’s catalog_version, domain names and systems. Each + system supplies vendor name, protocol, data shape, record types, + redaction tier 1–3 and optional discovery hints. Hints are limited + to ports, db_patterns and service_accounts; do not put credentials + in them. +2. In an authorized application transaction, call + townlight_core.catalog.import_catalog(session, bundle, actor_id=actual_actor_id). + The actor is the authenticated application’s identity. A changed or + incomplete existing version is refused rather than overwritten. Use + a newly reviewed version for changed catalog contents. +3. Read domains(session), system_catalog(session, domain) and + connectors_for(session, domain) before committing. Commit only the + intended import; roll back on refusal. Repeating an identical + complete version is a no-op. +4. Treat returned systems and connector recommendations as catalog + information. Import does not discover vendor endpoints, install a + connector or establish access to a city’s system. + +The following synthetic library example belongs inside an existing +authorized async transaction. session and actual_actor_id are supplied +by that application; this is not a command that seeds an administrator. + + from townlight_core.catalog import import_catalog, system_catalog + + bundle = { + "catalog_version": "synthetic-1", + "domains": [{"domain": "synthetic-records", "systems": [{ + "vendor_name": "Synthetic file source", + "access_protocol": "file", "data_shape": "json", + "common_record_types": ["synthetic minutes"], + "redaction_tier": 2, "discovery_hints": {} + }]}] + } + loaded = await import_catalog(session, bundle, actor_id=actual_actor_id) + rows = await system_catalog(session, "synthetic-records") + +The Records compatibility facade reads its bundled +app/data/systems_catalog.json through Core. Its existing administrator +POST /catalog/load takes no replacement bundle body; +GET /catalog/domains, /catalog/systems?domain=... and +/catalog/connectors?domain=... expose readback. These non-desktop routes +use the application’s actual authenticated staff/admin dependencies. Do +not substitute an invented role header. The shared SDK example above is +the route for a developer-supplied bundle. + +Jurisdictional rule evaluation and review + +Select the jurisdiction and active reviewed rule versions before +evaluating document text. Core’s Rule carries id, state_code, category, +rule_type, definition and integer version. Supported supplied rule types +are keyword and regex; an unsupported rule or incomplete/timed-out scan +raises RuleEvaluationError. An error must remain an incomplete scan, +never “no exemptions found.” Core does not assume a jurisdiction or +claim complete legal coverage. + + from uuid import UUID + from townlight_core.exemptions import Rule, evaluate, RuleEvaluationError + + rule = Rule( + id=UUID("11111111-1111-4111-8111-111111111111"), + state_code="CO", category="Synthetic review flag", + rule_type="keyword", definition="synthetic protected text", version=1 + ) + try: + flags = evaluate("Contains synthetic protected text", "CO", rules=[rule]) + except RuleEvaluationError: + raise # The owning application records an incomplete scan. + +This is fictional test text, not a Colorado exemption rule. Read each +result’s matched text, rule identity/version and confidence, then use +Records’ explicit reviewer decision and legal/source basis. A flag is +not an authorized withholding or redaction. Records’ existing exemption +rule/history/test and flag-review endpoints are listed in its technical +reference; record changes through those controls, preserving history. + +Scaffold plan and generate + +Run the existing CLI from a developer environment containing the +matching Core package. Choose an existing empty parent workspace +directory, not an installed application’s directory. The module’s own +directory will be created underneath it. The following creates only a +fictional module project; it does not register, install, migrate or run +it. + + & $control -m townlight_core.scaffold plan civicnotes ` + --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' + & $control -m townlight_core.scaffold generate civicnotes ` + --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' ` + --target 'C:\TownlightSynthetic' --dry-run + +Here $control is the Python executable in that isolated developer +environment. Inspect the plan and files, then remove --dry-run only when +that exact target is approved for generation. Existing files are +refused, not silently overwritten. Exit 0 indicates success; refusal +exits 2. Options include --version, --townlight_core-min-version, +--permission-key, repeated --staff-role and --route-path; inspect --help +for the exact invocation. Keep generated access requirements and +migration stubs under the new module’s own review. No automatic product +deployment follows generation. + +Source contracts: townlight_core/catalog/__init__.py, +townlight_core/exemptions/__init__.py, townlight_core/scaffold/cli.py, +project.py, and the Records catalog facade. + +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 -Named local accounts; native sessions; source and department authority; task receipts; profile configuration; coherent backup manifests; catalog, exemption and scaffold contracts. +Named local accounts; native sessions; source and department authority; +task receipts; profile configuration; coherent backup manifests; +catalog, exemption and scaffold contracts. -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 Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. +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. - Retained records Named local accounts; native sessions; source and department authority; task receipts; profile configuration; coherent backup manifests; catalog, exemption and scaffold contracts. +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. - Output Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. - - Connections All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals; installed acceptance remains pending. - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -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. 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('get_app_state', {}); @@ -113,7 +424,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,7 +440,11 @@ An administrator/developer can inspect an already-configured isolated runtime fr 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' @@ -144,78 +464,322 @@ 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. - -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 - - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Product Recorded result Precisely exercised - ----------------------- ----------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Core PASS Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. - - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -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. +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. -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. +Complete technical contract -Shared catalog, exemption and module-generator code exists in this private candidate. It is not a centrally hosted federation service. A business product still owns its decisions, identity mapping and permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation. +Read the Core 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. -Development and repository map +MCP and automation boundary -Fresh source checkout and exact local wheel +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. -This renamed candidate is not yet published on a package index. From this exact candidate checkout, build its wheel before installing consumers. Use a separate empty development environment, never an existing municipal profile: +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. - py -3.13 -m venv .venv - .\.venv\Scripts\python.exe -m pip install --upgrade pip build - .\.venv\Scripts\python.exe -m build --wheel --outdir ..\candidate-wheels - .\.venv\Scripts\python.exe -m pip install ..\candidate-wheels\townlight_core-1.3.0.dev2-py3-none-any.whl - .\.venv\Scripts\python.exe -c "import townlight_core; assert townlight_core.__version__ == '1.3.0.dev2'" +For a transcription client already provisioned separately, an +illustrative tool call is: -Consumers install this exact Core wheel first, then their matching local candidate wheel. The corresponding-source manifest identifies the source commit; a moving default branch is not a reproducible candidate pin. Package installation does not initialize a database or establish installed acceptance. - -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_core/auth -- townlight_core/catalog -- townlight_core/exemptions -- townlight_core/scaffold -- townlight_runtime/services.py -- desktop/src-tauri/src/supervisor.rs - -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. + {"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} -Earlier documentation +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 + --------- ----------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Core PASS Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. + +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 + +- Catalog import and readback — Catalog import and readback. +- Jurisdictional rule evaluation and review — Jurisdictional rule + evaluation and review. +- Scaffold plan and generate — Scaffold plan and generate. +- Shared catalog rules and scaffolding — Shared catalog rules and + scaffolding. + +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 + +- Activate the runtime — Daily workflow, step 2. + +- Collect diagnostics — Daily workflow, step 7. + +- Complete setup — Daily workflow, step 1. + +- Create staff access — Daily workflow, step 3. + +- Import through the right product — Daily workflow, step 4. + +- Make a coherent backup — Daily workflow, step 5. + +- Restore and verify — Daily workflow, step 6. + +- Source inventory and file hashes + +- All component metadata + +- Installed domain OpenAPI + +- Workflow matrix -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. +- Full AGPL text diff --git a/USER-MANUAL.docx b/USER-MANUAL.docx index 529355c..1ac2765 100644 Binary files a/USER-MANUAL.docx and b/USER-MANUAL.docx differ diff --git a/USER-MANUAL.md b/USER-MANUAL.md index d309578..94f1c87 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 Core Manual + - Contents + - Using this manual + - Beta identity + - First run + - Daily workflow + - Connected workflows + - Architecture + - Shared catalog rules and scaffolding + - 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 Core 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) -- [Shared catalog rules and scaffolding](#shared-catalog-rules-and-scaffolding) -- [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/core.html#using-this-manual) +- [Beta identity](https://townlight.github.io/manuals/core.html#beta-identity) +- [First run](https://townlight.github.io/manuals/core.html#first-run) +- [Daily workflow](https://townlight.github.io/manuals/core.html#daily-workflow) +- [Connected workflows](https://townlight.github.io/manuals/core.html#connected-workflows) +- [Architecture](https://townlight.github.io/manuals/core.html#architecture) +- [Shared catalog rules and scaffolding](https://townlight.github.io/manuals/core.html#shared-catalog-rules-and-scaffolding) +- [Technical specifications](https://townlight.github.io/manuals/core.html#technical-specifications) +- [Configuration and administration](https://townlight.github.io/manuals/core.html#configuration-and-administration) +- [API and integration examples](https://townlight.github.io/manuals/core.html#api-and-integration-examples) +- [MCP and automation boundary](https://townlight.github.io/manuals/core.html#mcp-and-automation-boundary) +- [Security and permissions](https://townlight.github.io/manuals/core.html#security-and-permissions) +- [Backup recovery and maintenance](https://townlight.github.io/manuals/core.html#backup-recovery-and-maintenance) +- [Troubleshooting](https://townlight.github.io/manuals/core.html#troubleshooting) +- [Verified workflows and limits](https://townlight.github.io/manuals/core.html#verified-workflows-and-limits) +- [Terms of service and license](https://townlight.github.io/manuals/core.html#terms-of-service-and-license) +- [Glossary](https://townlight.github.io/manuals/core.html#glossary) +- [Alphabetical subject index](https://townlight.github.io/manuals/core.html#alphabetical-subject-index) +- [Source and document control](https://townlight.github.io/manuals/core.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-core 1.3.0.dev2 | | Principal import package | townlight_core | | 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. Complete setup Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed. - + ### 2. Activate the runtime Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database. - + ### 3. Create staff access Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users. - + ### 4. Import through the right product Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review. - + ### 5. Make a coherent backup Save open work. Use Backup Now; it stops writers to preserve a consistent snapshot. Retain the backup receipt, then use Start to resume services. - + ### 6. Restore and verify Use Restore Latest Backup after preserving current recovery material. A result of Restore needs service start is an intermediate state: use Start, then Check. Reopen a known saved record to confirm recovery. - + ### 7. Collect diagnostics @@ -111,39 +137,40 @@ Drafting, review, approval, attachment, export, fulfillment and publication are ## Connected workflows -All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals; installed acceptance remains pending. - +All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals and are covered by the Windows acceptance summary. | Direction | Material | -| --- | --- | +|----|----| | Input | Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. | | Output | Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. | - ### Product boundary Shared catalog, exemption and module-generator code exists in this private candidate. It is not a centrally hosted federation service. A business product still owns its decisions, identity mapping and permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation. ## Architecture -![Townlight Core architecture and evidence flow](docs/beta-1/assets/core-architecture.svg) +
+Townlight Core 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. ## Shared catalog rules and scaffolding -These are existing Core developer and administrator contracts. They do not add a new Core administration screen. Staff use the owning product's normal controls; developers call the library only inside an authenticated application or an isolated synthetic test. The caller owns authorization and database commit or rollback. +These are existing Core developer and administrator contracts. They do not add a new Core administration screen. Staff use the owning product’s normal controls; developers call the library only inside an authenticated application or an isolated synthetic test. The caller owns authorization and database commit or rollback. ### Catalog import and readback -1. Review the catalog's `catalog_version`, domain names and systems. Each system supplies vendor name, protocol, data shape, record types, redaction tier 1–3 and optional discovery hints. Hints are limited to `ports`, `db_patterns` and `service_accounts`; do not put credentials in them. -2. In an authorized application transaction, call `townlight_core.catalog.import_catalog(session, bundle, actor_id=actual_actor_id)`. The actor is the authenticated application's identity. A changed or incomplete existing version is refused rather than overwritten. Use a newly reviewed version for changed catalog contents. -3. Read `domains(session)`, `system_catalog(session, domain)` and `connectors_for(session, domain)` before committing. Commit only the intended import; roll back on refusal. Repeating an identical complete version is a no-op. -4. Treat returned systems and connector recommendations as catalog information. Import does not discover vendor endpoints, install a connector or establish access to a city's system. +1. Review the catalog’s `catalog_version`, domain names and systems. Each system supplies vendor name, protocol, data shape, record types, redaction tier 1–3 and optional discovery hints. Hints are limited to `ports`, `db_patterns` and `service_accounts`; do not put credentials in them. +2. In an authorized application transaction, call `townlight_core.catalog.import_catalog(session, bundle, actor_id=actual_actor_id)`. The actor is the authenticated application’s identity. A changed or incomplete existing version is refused rather than overwritten. Use a newly reviewed version for changed catalog contents. +3. Read `domains(session)`, `system_catalog(session, domain)` and `connectors_for(session, domain)` before committing. Commit only the intended import; roll back on refusal. Repeating an identical complete version is a no-op. +4. Treat returned systems and connector recommendations as catalog information. Import does not discover vendor endpoints, install a connector or establish access to a city’s system. The following synthetic library example belongs inside an existing authorized async transaction. `session` and `actual_actor_id` are supplied by that application; this is not a command that seeds an administrator. -```python +``` python from townlight_core.catalog import import_catalog, system_catalog bundle = { @@ -159,13 +186,13 @@ loaded = await import_catalog(session, bundle, actor_id=actual_actor_id) rows = await system_catalog(session, "synthetic-records") ``` -The Records compatibility facade reads its bundled `app/data/systems_catalog.json` through Core. Its existing administrator `POST /catalog/load` takes no replacement bundle body; `GET /catalog/domains`, `/catalog/systems?domain=...` and `/catalog/connectors?domain=...` expose readback. These non-desktop routes use the application's actual authenticated staff/admin dependencies. Do not substitute an invented role header. The shared SDK example above is the route for a developer-supplied bundle. +The Records compatibility facade reads its bundled `app/data/systems_catalog.json` through Core. Its existing administrator `POST /catalog/load` takes no replacement bundle body; `GET /catalog/domains`, `/catalog/systems?domain=...` and `/catalog/connectors?domain=...` expose readback. These non-desktop routes use the application’s actual authenticated staff/admin dependencies. Do not substitute an invented role header. The shared SDK example above is the route for a developer-supplied bundle. ### Jurisdictional rule evaluation and review -Select the jurisdiction and active reviewed rule versions before evaluating document text. Core's `Rule` carries `id`, `state_code`, `category`, `rule_type`, `definition` and integer `version`. Supported supplied rule types are `keyword` and `regex`; an unsupported rule or incomplete/timed-out scan raises `RuleEvaluationError`. An error must remain an incomplete scan, never “no exemptions found.” Core does not assume a jurisdiction or claim complete legal coverage. +Select the jurisdiction and active reviewed rule versions before evaluating document text. Core’s `Rule` carries `id`, `state_code`, `category`, `rule_type`, `definition` and integer `version`. Supported supplied rule types are `keyword` and `regex`; an unsupported rule or incomplete/timed-out scan raises `RuleEvaluationError`. An error must remain an incomplete scan, never “no exemptions found.” Core does not assume a jurisdiction or claim complete legal coverage. -```python +``` python from uuid import UUID from townlight_core.exemptions import Rule, evaluate, RuleEvaluationError @@ -180,13 +207,13 @@ except RuleEvaluationError: raise # The owning application records an incomplete scan. ``` -This is fictional test text, not a Colorado exemption rule. Read each result's matched text, rule identity/version and confidence, then use Records' explicit reviewer decision and legal/source basis. A flag is not an authorized withholding or redaction. Records' existing exemption rule/history/test and flag-review endpoints are listed in its technical reference; record changes through those controls, preserving history. +This is fictional test text, not a Colorado exemption rule. Read each result’s matched text, rule identity/version and confidence, then use Records’ explicit reviewer decision and legal/source basis. A flag is not an authorized withholding or redaction. Records’ existing exemption rule/history/test and flag-review endpoints are listed in its technical reference; record changes through those controls, preserving history. ### Scaffold plan and generate -Run the existing CLI from a developer environment containing the matching Core package. Choose an existing empty parent workspace directory, not an installed application's directory. The module's own directory will be created underneath it. The following creates only a fictional module project; it does not register, install, migrate or run it. +Run the existing CLI from a developer environment containing the matching Core package. Choose an existing empty parent workspace directory, not an installed application’s directory. The module’s own directory will be created underneath it. The following creates only a fictional module project; it does not register, install, migrate or run it. -```powershell +``` powershell & $control -m townlight_core.scaffold plan civicnotes ` --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' & $control -m townlight_core.scaffold generate civicnotes ` @@ -194,12 +221,12 @@ Run the existing CLI from a developer environment containing the matching Core p --target 'C:\TownlightSynthetic' --dry-run ``` -Here `$control` is the Python executable in that isolated developer environment. Inspect the plan and files, then remove `--dry-run` only when that exact target is approved for generation. Existing files are refused, not silently overwritten. Exit 0 indicates success; refusal exits 2. Options include `--version`, `--townlight_core-min-version`, `--permission-key`, repeated `--staff-role` and `--route-path`; inspect `--help` for the exact invocation. Keep generated access requirements and migration stubs under the new module's own review. No automatic product deployment follows generation. +Here `$control` is the Python executable in that isolated developer environment. Inspect the plan and files, then remove `--dry-run` only when that exact target is approved for generation. Existing files are refused, not silently overwritten. Exit 0 indicates success; refusal exits 2. Options include `--version`, `--townlight_core-min-version`, `--permission-key`, repeated `--staff-role` and `--route-path`; inspect `--help` for the exact invocation. Keep generated access requirements and migration stubs under the new module’s own review. No automatic product deployment follows generation. Source contracts: `townlight_core/catalog/__init__.py`, `townlight_core/exemptions/__init__.py`, `townlight_core/scaffold/cli.py`, `project.py`, and the Records catalog facade. - ## 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. @@ -216,11 +243,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. @@ -230,11 +258,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('get_app_state', {}); console.log(result); @@ -244,7 +273,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 @@ -257,7 +286,7 @@ Remove-Variable session, headers 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 @@ -281,7 +310,7 @@ This write requires Meetings to be enabled and the signed-in staff role to permi ### Complete technical contract -Read the [Core API reference](docs/beta-1/api/core.html) for every documented operation, request field, constraint, response declaration and source supplement. Download the [OpenAPI JSON](docs/beta-1/api/core-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 [Core API reference](https://townlight.github.io/api/core.html) for every documented operation, request field, constraint, response declaration and source supplement. Download the [OpenAPI JSON](https://townlight.github.io/api/core-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 @@ -291,15 +320,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. @@ -325,7 +353,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. | @@ -335,17 +363,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 | -| --- | --- | --- | +|----|----|----| | Core | PASS | Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. | - 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. @@ -353,7 +379,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 @@ -392,7 +418,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. | @@ -408,34 +434,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/core.html#security-and-permissions). +- **AGPL and source** — [Terms of service and license](https://townlight.github.io/manuals/core.html#terms-of-service-and-license). +- **API contracts** — [API and integration examples](https://townlight.github.io/manuals/core.html#api-and-integration-examples). +- **Architecture** — [Architecture](https://townlight.github.io/manuals/core.html#architecture). +- **Backup** — [Backup recovery and maintenance](https://townlight.github.io/manuals/core.html#backup-recovery-and-maintenance). +- **Beta version** — [Beta identity](https://townlight.github.io/manuals/core.html#beta-identity). +- **Configuration** — [Configuration and administration](https://townlight.github.io/manuals/core.html#configuration-and-administration). +- **Evidence and acceptance** — [Verified workflows and limits](https://townlight.github.io/manuals/core.html#verified-workflows-and-limits). +- **Fees and official decisions** — [Terms of service and license](https://townlight.github.io/manuals/core.html#terms-of-service-and-license). +- **First run** — [First run](https://townlight.github.io/manuals/core.html#first-run). +- **Handoffs and audience** — [Connected workflows](https://townlight.github.io/manuals/core.html#connected-workflows). +- **MCP** — [MCP and automation boundary](https://townlight.github.io/manuals/core.html#mcp-and-automation-boundary). +- **Originals and provenance** — [Security and permissions](https://townlight.github.io/manuals/core.html#security-and-permissions). +- **Recovery** — [Backup recovery and maintenance](https://townlight.github.io/manuals/core.html#backup-recovery-and-maintenance). +- **Staff procedures** — [Daily workflow](https://townlight.github.io/manuals/core.html#daily-workflow). +- **Station configuration** — [Configuration and administration](https://townlight.github.io/manuals/core.html#configuration-and-administration). +- **Technical stack** — [Technical specifications](https://townlight.github.io/manuals/core.html#technical-specifications). +- **Troubleshooting** — [Troubleshooting](https://townlight.github.io/manuals/core.html#troubleshooting). ### Operating subject links -- **Catalog import and readback** — [Catalog import and readback](#catalog-import-and-readback). -- **Jurisdictional rule evaluation and review** — [Jurisdictional rule evaluation and review](#jurisdictional-rule-evaluation-and-review). -- **Scaffold plan and generate** — [Scaffold plan and generate](#scaffold-plan-and-generate). -- **Shared catalog rules and scaffolding** — [Shared catalog rules and scaffolding](#shared-catalog-rules-and-scaffolding). +- **Catalog import and readback** — [Catalog import and readback](https://townlight.github.io/manuals/core.html#catalog-import-and-readback). +- **Jurisdictional rule evaluation and review** — [Jurisdictional rule evaluation and review](https://townlight.github.io/manuals/core.html#jurisdictional-rule-evaluation-and-review). +- **Scaffold plan and generate** — [Scaffold plan and generate](https://townlight.github.io/manuals/core.html#scaffold-plan-and-generate). +- **Shared catalog rules and scaffolding** — [Shared catalog rules and scaffolding](https://townlight.github.io/manuals/core.html#shared-catalog-rules-and-scaffolding). ## Source and document control @@ -443,16 +468,26 @@ This edition is authored from the immutable corresponding-source companion, the ### Workflow subject index -- **Activate the runtime** — [Daily workflow, step 2](#workflow-2). -- **Collect diagnostics** — [Daily workflow, step 7](#workflow-7). -- **Complete setup** — [Daily workflow, step 1](#workflow-1). -- **Create staff access** — [Daily workflow, step 3](#workflow-3). -- **Import through the right product** — [Daily workflow, step 4](#workflow-4). -- **Make a coherent backup** — [Daily workflow, step 5](#workflow-5). -- **Restore and verify** — [Daily workflow, step 6](#workflow-6). - -- [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) +- **Activate the runtime** — [Daily workflow, step 2](https://townlight.github.io/manuals/core.html#workflow-2). + +- **Collect diagnostics** — [Daily workflow, step 7](https://townlight.github.io/manuals/core.html#workflow-7). + +- **Complete setup** — [Daily workflow, step 1](https://townlight.github.io/manuals/core.html#workflow-1). + +- **Create staff access** — [Daily workflow, step 3](https://townlight.github.io/manuals/core.html#workflow-3). + +- **Import through the right product** — [Daily workflow, step 4](https://townlight.github.io/manuals/core.html#workflow-4). + +- **Make a coherent backup** — [Daily workflow, step 5](https://townlight.github.io/manuals/core.html#workflow-5). + +- **Restore and verify** — [Daily workflow, step 6](https://townlight.github.io/manuals/core.html#workflow-6). + +- [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 cb3ea25..4bdbaf1 100644 Binary files a/USER-MANUAL.pdf and b/USER-MANUAL.pdf differ diff --git a/USER-MANUAL.txt b/USER-MANUAL.txt index fab95cb..2dcdf6c 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 Core Manual + - Contents + - Using this manual + - Beta identity + - First run + - Daily workflow + - Connected workflows + - Architecture + - Shared catalog rules and scaffolding + - 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 Core Manual -Townlight Beta 1 · Naming candidate documentation edition 2 November 2026 +Townlight Beta 1 · Naming candidate documentation edition 2 November +2026 Contents @@ -26,118 +54,192 @@ Contents Using this manual -Townlight Core helps IT administrators and platform maintainers. Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product. +Townlight Core helps IT administrators and platform maintainers. Core +provides the shared contracts, ingestion, identity helpers, task +infrastructure and recovery foundation used by Townlight. Staff +encounter these capabilities through Setup, Settings and System Health. +Business decisions stay with their owning product. -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-core 1.3.0.dev2 - - Principal import package townlight_core - - 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-core 1.3.0.dev2 + Principal import package townlight_core + 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. Complete setup -Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed. +Choose folders and the full product composition. Create the city profile +and the first named administrator. Choose a protected backup location. +Defer optional local AI if it is not needed. 2. Activate the runtime -Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database. +Run the first-run health check, wait for readiness and open Townlight. +In System Health select Finish Records Migration to activate the +canonical Python and PostgreSQL services. A running process alone is not +a ready database. 3. Create staff access -Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users. +Use Settings to create named staff. Sign out and confirm that staff can +sign in with their own account. Keep administrator privileges with +people responsible for setup; ordinary staff cannot administer users. 4. Import through the right product -Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review. +Use the source library of Code, Zoning, Planning or Permitting. Inspect +provenance and permissions there. Core ingestion helpers do not bypass +the owning product’s source review. 5. Make a coherent backup -Save open work. Use Backup Now; it stops writers to preserve a consistent snapshot. Retain the backup receipt, then use Start to resume services. +Save open work. Use Backup Now; it stops writers to preserve a +consistent snapshot. Retain the backup receipt, then use Start to resume +services. 6. Restore and verify -Use Restore Latest Backup after preserving current recovery material. A result of Restore needs service start is an intermediate state: use Start, then Check. Reopen a known saved record to confirm recovery. +Use Restore Latest Backup after preserving current recovery material. A +result of Restore needs service start is an intermediate state: use +Start, then Check. Reopen a known saved record to confirm recovery. 7. Collect diagnostics -Record the time, selected composition, version, operation and exact error. Inspect System Health and create a redacted support bundle. Do not delete a profile as the first repair step. +Record the time, selected composition, version, operation and exact +error. Inspect System Health and create a redacted support bundle. Do +not delete a profile as the first repair step. 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 -All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals; installed acceptance remains pending. - - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Direction Material - ----------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------- - Input Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. +All products use selected Core contracts. Core does not create +unrestricted access between products. Access and Notice provide the +bounded staff workflows documented in their current manuals and are +covered by the Windows acceptance summary. - Output Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Direction Material + ----------- ---------------------------------------------------------------------------------------------------------------------------------------- + Input Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. + Output Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. Product boundary -Shared catalog, exemption and module-generator code exists in this private candidate. It is not a centrally hosted federation service. A business product still owns its decisions, identity mapping and permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation. +Shared catalog, exemption and module-generator code exists in this +private candidate. It is not a centrally hosted federation service. A +business product still owns its decisions, identity mapping and +permission checks. Historical placeholder ADRs are retained as history, +rather than descriptions of the current implementation. Architecture -[Townlight Core 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. Shared catalog rules and scaffolding -These are existing Core developer and administrator contracts. They do not add a new Core administration screen. Staff use the owning product’s normal controls; developers call the library only inside an authenticated application or an isolated synthetic test. The caller owns authorization and database commit or rollback. +These are existing Core developer and administrator contracts. They do +not add a new Core administration screen. Staff use the owning product’s +normal controls; developers call the library only inside an +authenticated application or an isolated synthetic test. The caller owns +authorization and database commit or rollback. Catalog import and readback -1. Review the catalog’s catalog_version, domain names and systems. Each system supplies vendor name, protocol, data shape, record types, redaction tier 1–3 and optional discovery hints. Hints are limited to ports, db_patterns and service_accounts; do not put credentials in them. -2. In an authorized application transaction, call townlight_core.catalog.import_catalog(session, bundle, actor_id=actual_actor_id). The actor is the authenticated application’s identity. A changed or incomplete existing version is refused rather than overwritten. Use a newly reviewed version for changed catalog contents. -3. Read domains(session), system_catalog(session, domain) and connectors_for(session, domain) before committing. Commit only the intended import; roll back on refusal. Repeating an identical complete version is a no-op. -4. Treat returned systems and connector recommendations as catalog information. Import does not discover vendor endpoints, install a connector or establish access to a city’s system. - -The following synthetic library example belongs inside an existing authorized async transaction. session and actual_actor_id are supplied by that application; this is not a command that seeds an administrator. +1. Review the catalog’s catalog_version, domain names and systems. Each + system supplies vendor name, protocol, data shape, record types, + redaction tier 1–3 and optional discovery hints. Hints are limited + to ports, db_patterns and service_accounts; do not put credentials + in them. +2. In an authorized application transaction, call + townlight_core.catalog.import_catalog(session, bundle, actor_id=actual_actor_id). + The actor is the authenticated application’s identity. A changed or + incomplete existing version is refused rather than overwritten. Use + a newly reviewed version for changed catalog contents. +3. Read domains(session), system_catalog(session, domain) and + connectors_for(session, domain) before committing. Commit only the + intended import; roll back on refusal. Repeating an identical + complete version is a no-op. +4. Treat returned systems and connector recommendations as catalog + information. Import does not discover vendor endpoints, install a + connector or establish access to a city’s system. + +The following synthetic library example belongs inside an existing +authorized async transaction. session and actual_actor_id are supplied +by that application; this is not a command that seeds an administrator. from townlight_core.catalog import import_catalog, system_catalog @@ -153,11 +255,24 @@ The following synthetic library example belongs inside an existing authorized as loaded = await import_catalog(session, bundle, actor_id=actual_actor_id) rows = await system_catalog(session, "synthetic-records") -The Records compatibility facade reads its bundled app/data/systems_catalog.json through Core. Its existing administrator POST /catalog/load takes no replacement bundle body; GET /catalog/domains, /catalog/systems?domain=... and /catalog/connectors?domain=... expose readback. These non-desktop routes use the application’s actual authenticated staff/admin dependencies. Do not substitute an invented role header. The shared SDK example above is the route for a developer-supplied bundle. +The Records compatibility facade reads its bundled +app/data/systems_catalog.json through Core. Its existing administrator +POST /catalog/load takes no replacement bundle body; +GET /catalog/domains, /catalog/systems?domain=... and +/catalog/connectors?domain=... expose readback. These non-desktop routes +use the application’s actual authenticated staff/admin dependencies. Do +not substitute an invented role header. The shared SDK example above is +the route for a developer-supplied bundle. Jurisdictional rule evaluation and review -Select the jurisdiction and active reviewed rule versions before evaluating document text. Core’s Rule carries id, state_code, category, rule_type, definition and integer version. Supported supplied rule types are keyword and regex; an unsupported rule or incomplete/timed-out scan raises RuleEvaluationError. An error must remain an incomplete scan, never “no exemptions found.” Core does not assume a jurisdiction or claim complete legal coverage. +Select the jurisdiction and active reviewed rule versions before +evaluating document text. Core’s Rule carries id, state_code, category, +rule_type, definition and integer version. Supported supplied rule types +are keyword and regex; an unsupported rule or incomplete/timed-out scan +raises RuleEvaluationError. An error must remain an incomplete scan, +never “no exemptions found.” Core does not assume a jurisdiction or +claim complete legal coverage. from uuid import UUID from townlight_core.exemptions import Rule, evaluate, RuleEvaluationError @@ -172,11 +287,21 @@ Select the jurisdiction and active reviewed rule versions before evaluating docu except RuleEvaluationError: raise # The owning application records an incomplete scan. -This is fictional test text, not a Colorado exemption rule. Read each result’s matched text, rule identity/version and confidence, then use Records’ explicit reviewer decision and legal/source basis. A flag is not an authorized withholding or redaction. Records’ existing exemption rule/history/test and flag-review endpoints are listed in its technical reference; record changes through those controls, preserving history. +This is fictional test text, not a Colorado exemption rule. Read each +result’s matched text, rule identity/version and confidence, then use +Records’ explicit reviewer decision and legal/source basis. A flag is +not an authorized withholding or redaction. Records’ existing exemption +rule/history/test and flag-review endpoints are listed in its technical +reference; record changes through those controls, preserving history. Scaffold plan and generate -Run the existing CLI from a developer environment containing the matching Core package. Choose an existing empty parent workspace directory, not an installed application’s directory. The module’s own directory will be created underneath it. The following creates only a fictional module project; it does not register, install, migrate or run it. +Run the existing CLI from a developer environment containing the +matching Core package. Choose an existing empty parent workspace +directory, not an installed application’s directory. The module’s own +directory will be created underneath it. The following creates only a +fictional module project; it does not register, install, migrate or run +it. & $control -m townlight_core.scaffold plan civicnotes ` --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' @@ -184,47 +309,114 @@ Run the existing CLI from a developer environment containing the matching Core p --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' ` --target 'C:\TownlightSynthetic' --dry-run -Here $control is the Python executable in that isolated developer environment. Inspect the plan and files, then remove --dry-run only when that exact target is approved for generation. Existing files are refused, not silently overwritten. Exit 0 indicates success; refusal exits 2. Options include --version, --townlight_core-min-version, --permission-key, repeated --staff-role and --route-path; inspect --help for the exact invocation. Keep generated access requirements and migration stubs under the new module’s own review. No automatic product deployment follows generation. +Here $control is the Python executable in that isolated developer +environment. Inspect the plan and files, then remove --dry-run only when +that exact target is approved for generation. Existing files are +refused, not silently overwritten. Exit 0 indicates success; refusal +exits 2. Options include --version, --townlight_core-min-version, +--permission-key, repeated --staff-role and --route-path; inspect --help +for the exact invocation. Keep generated access requirements and +migration stubs under the new module’s own review. No automatic product +deployment follows generation. -Source contracts: townlight_core/catalog/__init__.py, townlight_core/exemptions/__init__.py, townlight_core/scaffold/cli.py, project.py, and the Records catalog facade. +Source contracts: townlight_core/catalog/__init__.py, +townlight_core/exemptions/__init__.py, townlight_core/scaffold/cli.py, +project.py, and the Records catalog facade. 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 -Named local accounts; native sessions; source and department authority; task receipts; profile configuration; coherent backup manifests; catalog, exemption and scaffold contracts. +Named local accounts; native sessions; source and department authority; +task receipts; profile configuration; coherent backup manifests; +catalog, exemption and scaffold contracts. -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('get_app_state', {}); @@ -232,7 +424,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' @@ -243,7 +440,11 @@ An administrator/developer can inspect an already-configured isolated runtime fr 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' @@ -263,158 +464,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 Core 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 Core 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 - ----------------------- ----------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Core PASS Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. - - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -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 + --------- ----------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Core PASS Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. + +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 @@ -440,13 +744,19 @@ Alphabetical subject index Operating subject links - Catalog import and readback — Catalog import and readback. -- Jurisdictional rule evaluation and review — Jurisdictional rule evaluation and review. +- Jurisdictional rule evaluation and review — Jurisdictional rule + evaluation and review. - Scaffold plan and generate — Scaffold plan and generate. -- Shared catalog rules and scaffolding — Shared catalog rules and scaffolding. +- Shared catalog rules and scaffolding — Shared catalog rules and + scaffolding. 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/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/assets/zoning-architecture.svg b/docs/beta-1/assets/zoning-architecture.svg new file mode 100644 index 0000000..76b21c6 --- /dev/null +++ b/docs/beta-1/assets/zoning-architecture.svg @@ -0,0 +1 @@ +Townlight Zoning architecturePrimary staff and evidence path. Additional supported connections are listed in the manual.Named staff accountReview sources and audienceZoning 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/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 -Core -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

-

Core provides the shared contracts, ingestion, identity helpers, task -infrastructure and recovery foundation used by Townlight. Staff -encounter these capabilities through Setup, Settings and System Health. -Business decisions stay with their owning product.

-

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_core 1.3.0.dev1
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

-
    -
  • Complete setup: Choose folders and the full product -composition. Create the city profile and the first named administrator. -Choose a protected backup location. Defer optional local AI if it is not -needed.
  • -
  • Activate the runtime: Run the first-run health -check, wait for readiness and open Townlight. In System Health select -Finish Records Migration to activate the canonical Python and PostgreSQL -services. A running process alone is not a ready database.
  • -
  • Create staff access: Use Settings to create named -staff. Sign out and confirm that staff can sign in with their own -account. Keep administrator privileges with people responsible for -setup; ordinary staff cannot administer users.
  • -
  • Import through the right product: Use the source -library of Code, Zoning, Planning or Permitting. Inspect provenance and -permissions there. Core ingestion helpers do not bypass the owning -product’s source review.
  • -
  • Make a coherent backup: Save open work. Use Backup -Now; it stops writers to preserve a consistent snapshot. Retain the -backup receipt, then use Start to resume services.
  • -
  • Restore and verify: Use Restore Latest Backup after -preserving current recovery material. A result of Restore needs service -start is an intermediate state: use Start, then Check. Reopen a known -saved record to confirm recovery.
  • -
  • Collect diagnostics: Record the time, selected -composition, version, operation and exact error. Inspect System Health -and create a redacted support bundle. Do not delete a profile as the -first repair step.
  • -
-

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

-

Named local accounts; native sessions; source and department -authority; task receipts; profile configuration; coherent backup -manifests; catalog, exemption and scaffold contracts.

-

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
InputAdministrator setup choices, named staff accounts, source material -submitted through the owning product, and protected backup storage.
Retained recordsNamed local accounts; native sessions; source and department -authority; task receipts; profile configuration; coherent backup -manifests; catalog, exemption and scaffold contracts.
OutputReady local services, permission-aware shared contracts, task -results, diagnostics and coherent backup or restore receipts.
ConnectionsAll products use selected Core contracts. Core does not create -unrestricted access between products. Notice and Access are supporting -components, rather than additional products in this nine-product -beta.
-

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('get_app_state', {});
-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/suite/state' -Headers $headers
-Remove-Variable session, headers
-

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
CorePASSNormal empty-profile setup; canonical activation; UI-created staff -and sign-in; staff denied user administration; coherent backup, -mutation, restore, Start/Check and retained/absent record readback.
-

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.

-

Shared catalog, exemption and module-generator code exists in this -private candidate. It is not a centrally hosted federation service. A -business product still owns its decisions, identity mapping and -permission checks. Historical placeholder ADRs are retained as history, -rather than descriptions of the current implementation.

-

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_core/auth
  • -
  • townlight_core/catalog
  • -
  • townlight_core/exemptions
  • -
  • townlight_core/scaffold
  • -
  • townlight_runtime/services.py
  • -
  • desktop/src-tauri/src/supervisor.rs
  • -
-

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 Core documentation
Townlight

Townlight Core documentation

Read the current Core 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/readmes/inspections.html b/docs/beta-1/readmes/inspections.html new file mode 100644 index 0000000..1adbbf3 --- /dev/null +++ b/docs/beta-1/readmes/inspections.html @@ -0,0 +1,2 @@ + +Townlight Inspections documentation
Townlight

Townlight Inspections documentation

Read the current Inspections 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/readmes/meetings.html b/docs/beta-1/readmes/meetings.html new file mode 100644 index 0000000..5ec7648 --- /dev/null +++ b/docs/beta-1/readmes/meetings.html @@ -0,0 +1,2 @@ + +Townlight Meetings documentation
Townlight

Townlight Meetings documentation

Read the current Meetings 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/readmes/permitting.html b/docs/beta-1/readmes/permitting.html new file mode 100644 index 0000000..06a4f21 --- /dev/null +++ b/docs/beta-1/readmes/permitting.html @@ -0,0 +1,2 @@ + +Townlight Permitting documentation
Townlight

Townlight Permitting documentation

Read the current Permitting 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/readmes/planning.html b/docs/beta-1/readmes/planning.html new file mode 100644 index 0000000..9ea445e --- /dev/null +++ b/docs/beta-1/readmes/planning.html @@ -0,0 +1,2 @@ + +Townlight Planning documentation
Townlight

Townlight Planning documentation

Read the current Planning 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/readmes/records.html b/docs/beta-1/readmes/records.html new file mode 100644 index 0000000..f8be222 --- /dev/null +++ b/docs/beta-1/readmes/records.html @@ -0,0 +1,2 @@ + +Townlight Records documentation
Townlight

Townlight Records documentation

Read the current Records 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/readmes/station.html b/docs/beta-1/readmes/station.html new file mode 100644 index 0000000..7e7c464 --- /dev/null +++ b/docs/beta-1/readmes/station.html @@ -0,0 +1,2 @@ + +Townlight Station documentation
Townlight

Townlight Station documentation

Read the current Station 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/readmes/suite.html b/docs/beta-1/readmes/suite.html new file mode 100644 index 0000000..d2fe332 --- /dev/null +++ b/docs/beta-1/readmes/suite.html @@ -0,0 +1,2 @@ + +Townlight Suite documentation
Townlight

Townlight Suite documentation

Read the current Suite 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/readmes/zoning.html b/docs/beta-1/readmes/zoning.html new file mode 100644 index 0000000..7e92e87 --- /dev/null +++ b/docs/beta-1/readmes/zoning.html @@ -0,0 +1,2 @@ + +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 c52be20..f4803ca 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1 +1 @@ -Townlight Core | Townlight Beta 1
townlightTownlight Beta 1
Townlight Core · Townlight Beta 1

A shared foundation for accountable municipal work.

Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product.

townlight-core 1.3.0.dev2AGPL-3.0-onlyPrivate beta · Windows fresh-install scope
For IT administrators and platform maintainers

What the workflow delivers

  1. Complete setup. Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed.
  2. Activate the runtime. Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database.
  3. Create staff access. Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users.
  4. Import through the right product. Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review.

Connected evidence

All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows described in their current manuals; installed acceptance remains pending.

Know the beta boundary

Shared catalog, exemption and module-generator code exists in this private candidate. It is not a centrally hosted federation service. A business product still owns its decisions, identity mapping and permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation.

Architecture

Where the evidence goes

Townlight Core architecture and evidence flow

All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows described in their current manuals; installed acceptance remains pending.

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 Core | Townlight Beta 1
townlightTownlight Beta 1
Townlight Core · Townlight Beta 1

A shared foundation for accountable municipal work.

Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product.

townlight-core 1.3.0.dev2AGPL-3.0-onlyBeta evaluation · Windows fresh-install scope
For IT administrators and platform maintainers

What the workflow delivers

  1. Complete setup. Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed.
  2. Activate the runtime. Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database.
  3. Create staff access. Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users.
  4. Import through the right product. Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review.

Connected evidence

All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows described in their current manuals and acceptance summary.

Know the beta boundary

Shared catalog, exemption and module-generator code exists in the released Windows beta. It is not a centrally hosted federation service. A business product still owns its decisions, identity mapping and permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation.

Architecture

Where the evidence goes

Townlight Core architecture and evidence flow

All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows described in their current manuals and acceptance summary.

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.

diff --git a/docs/ops/README.md b/docs/ops/README.md index 56f6dc4..15cda49 100644 --- a/docs/ops/README.md +++ b/docs/ops/README.md @@ -2,8 +2,7 @@ The current candidate is `townlight-core` 1.3.0.dev2 with principal import `townlight_core`. Its README, user manual and governing `AGENTS.md` describe -current source and fresh-install boundaries. Signed Windows installed acceptance -for the coordinated naming, Access and Notice candidate remains pending. +current source and fresh-install boundaries. 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. The CO-3 ledger, CO-4 report, CO-7 freeze readiness and CO-9 release/audit reports are historical records for their identified releases. Their original filenames,