diff --git a/README.md b/README.md index 9313eee..b00a5cd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -Windows x64 Beta 1 · MSI 1.8.0.1 +Windows x64 Beta 1 · MSI 1.8.1.1 -The signed [Windows x64 beta 1.8.0.1](https://github.com/townlight/townlight/releases/tag/townlight-windows-v1.8.0.1) adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. +Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. - Townlight Core Manual - Contents @@ -26,6 +26,17 @@ The signed [Windows x64 beta 1.8.0.1](https://github.com/townlight/townlight/rel # Townlight Core Manual +## Shared meeting imports · Windows 1.8.1.1 + +Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. + +[All 31 sources, formats and handoffs](https://townlight.github.io/manuals/meeting-imports.html) · [Installed acceptance](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.1.md). + +Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service. + +The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged. + + **Townlight Beta 1** · Naming candidate documentation edition 2 November 2026 ## Contents @@ -61,11 +72,11 @@ Staff should begin with First run and Daily workflow. Administrators should also | Identity | Value | |----|----| | Documentation | Townlight Beta 1 naming, Access and Notice candidate | -| Windows MSI version | 1.8.0.1 | +| Windows MSI version | 1.8.1.1 | | Product component | townlight-core 1.3.0.dev2 | | Principal import package | townlight_core | -| Native desktop source version | 1.8.0-1 | -| Candidate hashes | [SHA-256 checksums](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/SHA256SUMS-Windows-1.8.0.1.txt) and [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/ACCEPTANCE-Windows-1.8.0.1.md) | +| Native desktop source version | 1.8.1-1 | +| Candidate hashes | [SHA-256 checksums](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/SHA256SUMS-Windows-1.8.1.1.txt) and [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.1.md) | | Current owned software license | AGPL-3.0-only | | Acceptance composition | Windows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration. | @@ -73,14 +84,14 @@ Start a new installation with an empty database and fresh Windows profile. For a ## First run -**Upgrade from 1.7.2.1.** For the tested upgrade from 1.7.2.1, back up city data and settings, close Townlight, run the signed Windows 1.8.0.1 MSI, and reopen Townlight under the same Windows account with its existing profile. Keep the existing `%LOCALAPPDATA%\CivicSuite` directory. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. +Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service. ### Fresh installation -Run the signed Windows 1.8.0.1 MSI and use an empty database and a new Townlight profile for first run. +Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run. -1. Download the signed MSI, matching source companion and checksums from the [public Windows release](https://github.com/townlight/townlight/releases/tag/townlight-windows-v1.8.0.1). -2. Verify the MSI hash and Authenticode publisher before installation. See the [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/ACCEPTANCE-Windows-1.8.0.1.md) for the tested setup. +1. Download the signed MSI, matching source companion and checksums from the [public Windows release](https://github.com/townlight/townlight/releases/tag/townlight-windows-v1.8.1.1). +2. Verify the MSI hash and Authenticode publisher before installation. See the [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.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. @@ -371,7 +382,7 @@ On failure, record the time, selected composition, component/installer versions ## Verified workflows and limits -The table records selected synthetic workflows from the original [Windows 1.6.0.1 Beta 1](https://github.com/townlight/townlight/releases/tag/townlight-beta-1) Sandbox run. Station’s later delivery has [separate Windows 1.6.0.1 acceptance](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-station-delivery). See the [Windows 1.8.0.1 acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/ACCEPTANCE-Windows-1.8.0.1.md) for the workflows and upgrade path exercised on the current MSI. +The table records selected synthetic workflows from the original [Windows 1.6.0.1 Beta 1](https://github.com/townlight/townlight/releases/tag/townlight-beta-1) Sandbox run. Station’s later delivery has [separate Windows 1.6.0.1 acceptance](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-station-delivery). See the [Windows 1.8.0.1 acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/ACCEPTANCE-Windows-1.8.0.1.md) for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI. | Product | Recorded result | Precisely exercised | |----|----|----| diff --git a/README.txt b/README.txt index ffa6759..1383442 100644 --- a/README.txt +++ b/README.txt @@ -1,6 +1,17 @@ -Windows x64 Beta 1 · MSI 1.8.0.1 -The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and +## Shared meeting imports · Windows 1.8.1.1 + +Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. + +[All 31 sources, formats and handoffs](https://townlight.github.io/manuals/meeting-imports.html) · [Installed acceptance](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.1.md). + +Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service. + +The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged. + +Windows x64 Beta 1 · MSI 1.8.1.1 + +The signed Windows x64 beta 1.8.1.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. - Townlight Core Manual @@ -73,10 +84,10 @@ Beta identity Identity Value -------------------------------- ------------------------------------------------------------------------------------------------------------------- Documentation Townlight Beta 1 naming, Access and Notice candidate - Windows MSI version 1.8.0.1 + Windows MSI version 1.8.1.1 Product component townlight-core 1.3.0.dev2 Principal import package townlight_core - Native desktop source version 1.8.0-1 + Native desktop source version 1.8.1-1 Candidate hashes SHA-256 checksums and Windows acceptance summary Current owned software license AGPL-3.0-only Acceptance composition Windows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration. @@ -89,7 +100,7 @@ profiles and backups. First run Upgrade from 1.7.2.1. For the tested upgrade from 1.7.2.1, back up city -data and settings, close Townlight, run the signed Windows 1.8.0.1 MSI, +data and settings, close Townlight, run the signed Windows 1.8.1.1 MSI, and reopen Townlight under the same Windows account with its existing profile. Keep the existing %LOCALAPPDATA%\CivicSuite directory. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its @@ -97,7 +108,7 @@ separately configured service. Fresh installation -Run the signed Windows 1.8.0.1 MSI and use an empty database and a new +Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run. 1. Download the signed MSI, matching source companion and checksums @@ -595,7 +606,7 @@ Verified workflows and limits The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary -for the workflows and upgrade path exercised on the current MSI. +for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI. Product Recorded result Precisely exercised --------- ----------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/SUPPORT.md b/SUPPORT.md index a0a7c5d..eae2b51 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -1,5 +1,16 @@ # Support +## Shared meeting imports · Windows 1.8.1.1 + +Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. + +[All 31 sources, formats and handoffs](https://townlight.github.io/manuals/meeting-imports.html) · [Installed acceptance](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.1.md). + +Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service. + +The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged. + + townlight_core is a shared platform library for the Townlight product family. Support is community-driven via GitHub. ## Where to ask diff --git a/USER-MANUAL.docx b/USER-MANUAL.docx index 0d6c110..6933d3b 100644 Binary files a/USER-MANUAL.docx and b/USER-MANUAL.docx differ diff --git a/USER-MANUAL.md b/USER-MANUAL.md index 9313eee..b00a5cd 100644 --- a/USER-MANUAL.md +++ b/USER-MANUAL.md @@ -1,6 +1,6 @@ -Windows x64 Beta 1 · MSI 1.8.0.1 +Windows x64 Beta 1 · MSI 1.8.1.1 -The signed [Windows x64 beta 1.8.0.1](https://github.com/townlight/townlight/releases/tag/townlight-windows-v1.8.0.1) adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. +Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. - Townlight Core Manual - Contents @@ -26,6 +26,17 @@ The signed [Windows x64 beta 1.8.0.1](https://github.com/townlight/townlight/rel # Townlight Core Manual +## Shared meeting imports · Windows 1.8.1.1 + +Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. + +[All 31 sources, formats and handoffs](https://townlight.github.io/manuals/meeting-imports.html) · [Installed acceptance](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.1.md). + +Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service. + +The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged. + + **Townlight Beta 1** · Naming candidate documentation edition 2 November 2026 ## Contents @@ -61,11 +72,11 @@ Staff should begin with First run and Daily workflow. Administrators should also | Identity | Value | |----|----| | Documentation | Townlight Beta 1 naming, Access and Notice candidate | -| Windows MSI version | 1.8.0.1 | +| Windows MSI version | 1.8.1.1 | | Product component | townlight-core 1.3.0.dev2 | | Principal import package | townlight_core | -| Native desktop source version | 1.8.0-1 | -| Candidate hashes | [SHA-256 checksums](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/SHA256SUMS-Windows-1.8.0.1.txt) and [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/ACCEPTANCE-Windows-1.8.0.1.md) | +| Native desktop source version | 1.8.1-1 | +| Candidate hashes | [SHA-256 checksums](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/SHA256SUMS-Windows-1.8.1.1.txt) and [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.1.md) | | Current owned software license | AGPL-3.0-only | | Acceptance composition | Windows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration. | @@ -73,14 +84,14 @@ Start a new installation with an empty database and fresh Windows profile. For a ## First run -**Upgrade from 1.7.2.1.** For the tested upgrade from 1.7.2.1, back up city data and settings, close Townlight, run the signed Windows 1.8.0.1 MSI, and reopen Townlight under the same Windows account with its existing profile. Keep the existing `%LOCALAPPDATA%\CivicSuite` directory. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. +Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service. ### Fresh installation -Run the signed Windows 1.8.0.1 MSI and use an empty database and a new Townlight profile for first run. +Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run. -1. Download the signed MSI, matching source companion and checksums from the [public Windows release](https://github.com/townlight/townlight/releases/tag/townlight-windows-v1.8.0.1). -2. Verify the MSI hash and Authenticode publisher before installation. See the [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/ACCEPTANCE-Windows-1.8.0.1.md) for the tested setup. +1. Download the signed MSI, matching source companion and checksums from the [public Windows release](https://github.com/townlight/townlight/releases/tag/townlight-windows-v1.8.1.1). +2. Verify the MSI hash and Authenticode publisher before installation. See the [Windows acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.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. @@ -371,7 +382,7 @@ On failure, record the time, selected composition, component/installer versions ## Verified workflows and limits -The table records selected synthetic workflows from the original [Windows 1.6.0.1 Beta 1](https://github.com/townlight/townlight/releases/tag/townlight-beta-1) Sandbox run. Station’s later delivery has [separate Windows 1.6.0.1 acceptance](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-station-delivery). See the [Windows 1.8.0.1 acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/ACCEPTANCE-Windows-1.8.0.1.md) for the workflows and upgrade path exercised on the current MSI. +The table records selected synthetic workflows from the original [Windows 1.6.0.1 Beta 1](https://github.com/townlight/townlight/releases/tag/townlight-beta-1) Sandbox run. Station’s later delivery has [separate Windows 1.6.0.1 acceptance](https://github.com/townlight/townlight/releases/tag/townlight-beta-1-station-delivery). See the [Windows 1.8.0.1 acceptance summary](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.0.1/ACCEPTANCE-Windows-1.8.0.1.md) for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI. | Product | Recorded result | Precisely exercised | |----|----|----| diff --git a/USER-MANUAL.pdf b/USER-MANUAL.pdf index 343c506..fa17fab 100644 Binary files a/USER-MANUAL.pdf and b/USER-MANUAL.pdf differ diff --git a/USER-MANUAL.txt b/USER-MANUAL.txt index ffa6759..1383442 100644 --- a/USER-MANUAL.txt +++ b/USER-MANUAL.txt @@ -1,6 +1,17 @@ -Windows x64 Beta 1 · MSI 1.8.0.1 -The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and +## Shared meeting imports · Windows 1.8.1.1 + +Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. + +[All 31 sources, formats and handoffs](https://townlight.github.io/manuals/meeting-imports.html) · [Installed acceptance](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.1.md). + +Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service. + +The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged. + +Windows x64 Beta 1 · MSI 1.8.1.1 + +The signed Windows x64 beta 1.8.1.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. - Townlight Core Manual @@ -73,10 +84,10 @@ Beta identity Identity Value -------------------------------- ------------------------------------------------------------------------------------------------------------------- Documentation Townlight Beta 1 naming, Access and Notice candidate - Windows MSI version 1.8.0.1 + Windows MSI version 1.8.1.1 Product component townlight-core 1.3.0.dev2 Principal import package townlight_core - Native desktop source version 1.8.0-1 + Native desktop source version 1.8.1-1 Candidate hashes SHA-256 checksums and Windows acceptance summary Current owned software license AGPL-3.0-only Acceptance composition Windows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration. @@ -89,7 +100,7 @@ profiles and backups. First run Upgrade from 1.7.2.1. For the tested upgrade from 1.7.2.1, back up city -data and settings, close Townlight, run the signed Windows 1.8.0.1 MSI, +data and settings, close Townlight, run the signed Windows 1.8.1.1 MSI, and reopen Townlight under the same Windows account with its existing profile. Keep the existing %LOCALAPPDATA%\CivicSuite directory. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its @@ -97,7 +108,7 @@ separately configured service. Fresh installation -Run the signed Windows 1.8.0.1 MSI and use an empty database and a new +Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run. 1. Download the signed MSI, matching source companion and checksums @@ -595,7 +606,7 @@ Verified workflows and limits The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary -for the workflows and upgrade path exercised on the current MSI. +for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI. Product Recorded result Precisely exercised --------- ----------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/docs/beta-1/api/access.html b/docs/beta-1/api/access.html index fdcd370..311a995 100644 --- a/docs/beta-1/api/access.html +++ b/docs/beta-1/api/access.html @@ -1,14 +1,14 @@ Townlight Access API reference
Townlight

Townlight Access API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Access API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -12070,4 +12070,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/beta-1/api/code.html b/docs/beta-1/api/code.html index b036212..649965e 100644 --- a/docs/beta-1/api/code.html +++ b/docs/beta-1/api/code.html @@ -1,14 +1,14 @@ Townlight Code API reference
Townlight

Townlight Code API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Code API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -12736,4 +12736,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/beta-1/api/core.html b/docs/beta-1/api/core.html index 57def9f..6c7a338 100644 --- a/docs/beta-1/api/core.html +++ b/docs/beta-1/api/core.html @@ -1,14 +1,14 @@ Townlight Core API reference
Townlight

Townlight Core API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Core API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -12633,4 +12633,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/beta-1/api/inspections.html b/docs/beta-1/api/inspections.html index add7e9e..22e6534 100644 --- a/docs/beta-1/api/inspections.html +++ b/docs/beta-1/api/inspections.html @@ -1,14 +1,14 @@ Townlight Inspections API reference
Townlight

Townlight Inspections API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Inspections API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -12285,4 +12285,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/beta-1/api/meeting-imports-openapi.json b/docs/beta-1/api/meeting-imports-openapi.json new file mode 100644 index 0000000..dfce1f1 --- /dev/null +++ b/docs/beta-1/api/meeting-imports-openapi.json @@ -0,0 +1,12457 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Townlight Records", + "description": "Source schema generated from the bundled Windows 1.8.1.1 native domain runtime without starting services.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/meetings/imports/preview": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Preview Meeting Import", + "operationId": "preview_meeting_import_desktop_v1_meetings_imports_preview_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/ImportPreviewInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/imports/sources": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "Meeting Import Sources", + "operationId": "meeting_import_sources_desktop_v1_meetings_imports_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" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/imports/fetch": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Fetch Meeting Import", + "operationId": "fetch_meeting_import_desktop_v1_meetings_imports_fetch_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/ImportSourceInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/imports/commit": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Commit Meeting Import", + "operationId": "commit_meeting_import_desktop_v1_meetings_imports_commit_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/ImportCommitInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/imports/{meeting_id}": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "Get Meeting Import", + "operationId": "get_meeting_import_desktop_v1_meetings_imports__meeting_id__get", + "parameters": [ + { + "name": "meeting_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/imports/links/{destination}": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Import Link Choices", + "operationId": "import_link_choices_desktop_v1_meetings_imports_links__destination__post", + "parameters": [ + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], + "type": "string", + "title": "Destination" + } + }, + { + "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/ImportLinkSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/imports/links/{destination}/{target_id}": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "List Import Links", + "operationId": "list_import_links_desktop_v1_meetings_imports_links__destination___target_id__get", + "parameters": [ + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], + "type": "string", + "title": "Destination" + } + }, + { + "name": "target_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Target Id" + } + }, + { + "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" + } + } + } + } + } + }, + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Create Import Link", + "operationId": "create_import_link_desktop_v1_meetings_imports_links__destination___target_id__post", + "parameters": [ + { + "name": "destination", + "in": "path", + "required": true, + "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], + "type": "string", + "title": "Destination" + } + }, + { + "name": "target_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Target Id" + } + }, + { + "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/ImportLinkInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/imports/{meeting_id}/records": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Attach Import Document", + "operationId": "attach_import_document_desktop_v1_meetings_imports__meeting_id__records_post", + "parameters": [ + { + "name": "meeting_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, + { + "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/RecordsImportDocument" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/code/imports": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Imports", + "operationId": "imports_desktop_v1_code_imports_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/ImportBundleCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "native-code" + ], + "summary": "List Imports", + "operationId": "list_imports_desktop_v1_code_imports_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" + } + } + } + } + } + } + }, + "/desktop/v1/code/imports/{job_id}/tree": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Import Tree", + "operationId": "import_tree_desktop_v1_code_imports__job_id__tree_get", + "parameters": [ + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Job Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/imports/{job_id}/provenance": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Import Provenance", + "operationId": "import_provenance_desktop_v1_code_imports__job_id__provenance_get", + "parameters": [ + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Job Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/imports": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Imports", + "operationId": "imports_desktop_v1_zoning_imports_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": { + "type": "object", + "additionalProperties": true, + "title": "Payload" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/imports/preview": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Preview Import", + "operationId": "preview_import_desktop_v1_planning_imports_preview_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/townlight_runtime__planning_bridge__Import" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/imports": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Import Source", + "operationId": "import_source_desktop_v1_planning_imports_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/townlight_runtime__planning_bridge__Import" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ActionItemInput": { + "properties": { + "description": { + "type": "string", + "minLength": 1, + "title": "Description" + }, + "assigned_to": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Assigned To" + }, + "source_motion_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Source Motion Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "description" + ], + "title": "ActionItemInput" + }, + "AdaPlan": { + "properties": { + "action": { + "type": "string", + "const": "ada-title-ii", + "title": "Action" + }, + "serviceArea": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Servicearea" + }, + "hasCoordinatorReview": { + "type": "boolean", + "title": "Hascoordinatorreview", + "default": false + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "serviceArea" + ], + "title": "AdaPlan" + }, + "AdminUserCreateRequest": { + "properties": { + "email": { + "type": "string", + "title": "Email" + }, + "password": { + "type": "string", + "title": "Password" + }, + "full_name": { + "type": "string", + "title": "Full Name", + "default": "" + }, + "role": { + "type": "string", + "title": "Role", + "default": "staff" + } + }, + "type": "object", + "required": [ + "email", + "password" + ], + "title": "AdminUserCreateRequest" + }, + "AdminUserCreateResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "email": { + "type": "string", + "title": "Email" + }, + "full_name": { + "type": "string", + "title": "Full Name" + }, + "role": { + "type": "string", + "title": "Role" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + } + }, + "type": "object", + "required": [ + "id", + "email", + "full_name", + "role", + "is_active" + ], + "title": "AdminUserCreateResponse" + }, + "AgendaAssignment": { + "properties": { + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "meeting_id" + ], + "title": "AgendaAssignment" + }, + "AgendaInput": { + "properties": { + "title": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Title" + }, + "department_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Department Name" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "department_name" + ], + "title": "AgendaInput" + }, + "AgendaReviewInput": { + "properties": { + "to_status": { + "type": "string", + "enum": [ + "DRAFTED", + "SUBMITTED", + "DEPT_APPROVED", + "LEGAL_REVIEWED", + "CLERK_ACCEPTED", + "ON_AGENDA", + "IN_PACKET", + "POSTED", + "HEARD", + "DISPOSED", + "ARCHIVED" + ], + "title": "To Status" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "to_status" + ], + "title": "AgendaReviewInput" + }, + "AmendmentInput": { + "properties": { + "expected_revision": { + "anyOf": [ + { + "type": "string", + "maxLength": 36, + "minLength": 36 + }, + { + "type": "null" + } + ], + "title": "Expected Revision" + }, + "title": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Title" + }, + "policy": { + "$ref": "#/components/schemas/PolicySelection" + }, + "proposal": { + "type": "string", + "maxLength": 20000, + "minLength": 1, + "title": "Proposal" + }, + "responsible_staff": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Responsible Staff" + }, + "status": { + "type": "string", + "enum": [ + "draft", + "review", + "adopted", + "withdrawn" + ], + "title": "Status", + "default": "draft" + }, + "review_note": { + "type": "string", + "maxLength": 5000, + "title": "Review Note", + "default": "" + }, + "adoption_revision": { + "anyOf": [ + { + "type": "string", + "maxLength": 36, + "minLength": 36 + }, + { + "type": "null" + } + ], + "title": "Adoption Revision" + }, + "note": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "policy", + "proposal", + "responsible_staff", + "note" + ], + "title": "AmendmentInput" + }, + "AnalysisObservation": { + "properties": { + "source": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "title": "Source" + }, + "filename": { + "type": "string", + "maxLength": 160, + "title": "Filename", + "default": "" + }, + "media_type": { + "type": "string", + "maxLength": 80, + "title": "Media Type", + "default": "" + }, + "text": { + "type": "string", + "maxLength": 4000, + "minLength": 1, + "title": "Text" + }, + "adapter": { + "type": "string", + "maxLength": 120, + "title": "Adapter", + "default": "" + }, + "citation_source_ids": { + "items": { + "type": "string" + }, + "type": "array", + "maxItems": 30, + "title": "Citation Source Ids" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "text" + ], + "title": "AnalysisObservation", + "description": "One draft observation, named with the adapter that actually produced it." + }, + "AnalysisRecord": { + "properties": { + "observations": { + "items": { + "$ref": "#/components/schemas/AnalysisObservation" + }, + "type": "array", + "maxItems": 30, + "title": "Observations" + }, + "cited_sections": { + "items": { + "$ref": "#/components/schemas/CitedSection" + }, + "type": "array", + "maxItems": 30, + "title": "Cited Sections" + }, + "unavailable": { + "items": { + "type": "string" + }, + "type": "array", + "maxItems": 30, + "title": "Unavailable" + }, + "runtime": { + "additionalProperties": true, + "type": "object", + "title": "Runtime" + }, + "review_required": { + "type": "boolean", + "title": "Review Required", + "default": true + } + }, + "additionalProperties": false, + "type": "object", + "title": "AnalysisRecord", + "description": "The adapter output that accompanies a saved inspection draft." + }, + "ApprovalCommand": { + "properties": { + "action": { + "type": "string", + "const": "approve-records-response", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/ApprovalPayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action" + ], + "title": "ApprovalCommand" + }, + "ApprovalPayload": { + "properties": { + "approvalNote": { + "type": "string", + "title": "Approvalnote", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ApprovalPayload" + }, + "ArchiveInput": { + "properties": { + "visibility": { + "type": "string", + "enum": [ + "public", + "closed_session" + ], + "title": "Visibility" + }, + "packet_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Packet Id" + }, + "minutes_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Minutes Id" + }, + "plain_language_summary": { + "type": "string", + "title": "Plain Language Summary", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "visibility" + ], + "title": "ArchiveInput" + }, + "ArtifactPlan": { + "properties": { + "artifact_id": { + "type": "string", + "title": "Artifact Id" + }, + "file_name": { + "type": "string", + "title": "File Name" + }, + "content": { + "type": "string", + "title": "Content" + }, + "sha256": { + "type": "string", + "title": "Sha256" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "artifact_id", + "file_name", + "content", + "sha256", + "created_at_unix_seconds" + ], + "title": "ArtifactPlan" + }, + "AssignCommand": { + "properties": { + "action": { + "type": "string", + "const": "assign-records-request", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/AssignmentPayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "AssignCommand" + }, + "AssignmentPayload": { + "properties": { + "assignedTo": { + "type": "string", + "minLength": 1, + "title": "Assignedto" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "assignedTo" + ], + "title": "AssignmentPayload" + }, + "AttachDocument": { + "properties": { + "title": { + "type": "string", + "minLength": 1, + "title": "Title" + }, + "citation": { + "type": "string", + "title": "Citation", + "default": "" + }, + "file": { + "$ref": "#/components/schemas/ManagedFileReceipt" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "file" + ], + "title": "AttachDocument" + }, + "AttachReleaseCopy": { + "properties": { + "status": { + "type": "string", + "enum": [ + "release-ready copy", + "redacted copy" + ], + "title": "Status" + }, + "note": { + "type": "string", + "title": "Note", + "default": "" + }, + "added_by": { + "type": "string", + "title": "Added By", + "default": "" + }, + "file": { + "$ref": "#/components/schemas/ManagedFileReceipt" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "status", + "file" + ], + "title": "AttachReleaseCopy" + }, + "AttendanceInput": { + "properties": { + "seat_id": { + "type": "string", + "format": "uuid", + "title": "Seat Id" + }, + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "present": { + "type": "boolean", + "title": "Present" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "seat_id", + "meeting_id", + "present" + ], + "title": "AttendanceInput" + }, + "AuditChainVerification": { + "properties": { + "is_valid": { + "type": "boolean", + "title": "Is Valid" + }, + "entries_checked": { + "type": "integer", + "title": "Entries Checked" + }, + "error_message": { + "type": "string", + "title": "Error Message" + } + }, + "type": "object", + "required": [ + "is_valid", + "entries_checked", + "error_message" + ], + "title": "AuditChainVerification" + }, + "AuditLogRead": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "prev_hash": { + "type": "string", + "title": "Prev Hash" + }, + "entry_hash": { + "type": "string", + "title": "Entry Hash" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "title": "Timestamp" + }, + "user_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "User Id" + }, + "action": { + "type": "string", + "title": "Action" + }, + "resource_type": { + "type": "string", + "title": "Resource Type" + }, + "resource_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Resource Id" + }, + "details": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Details" + }, + "ai_generated": { + "type": "boolean", + "title": "Ai Generated" + } + }, + "type": "object", + "required": [ + "id", + "prev_hash", + "entry_hash", + "timestamp", + "user_id", + "action", + "resource_type", + "resource_id", + "details", + "ai_generated" + ], + "title": "AuditLogRead" + }, + "AuditView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "module_id": { + "type": "string", + "title": "Module Id" + }, + "action": { + "type": "string", + "title": "Action" + }, + "summary": { + "type": "string", + "title": "Summary" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + }, + "previous_hash": { + "type": "string", + "title": "Previous Hash" + }, + "entry_hash": { + "type": "string", + "title": "Entry Hash" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "module_id", + "action", + "summary", + "created_at_unix_seconds", + "previous_hash", + "entry_hash" + ], + "title": "AuditView" + }, + "AwardInput": { + "properties": { + "proposal_id": { + "type": "string", + "format": "uuid", + "title": "Proposal Id" + }, + "decision_reference": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Decision Reference" + }, + "decision_note": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "Decision Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "proposal_id", + "decision_reference", + "decision_note" + ], + "title": "AwardInput" + }, + "BearerResponse": { + "properties": { + "access_token": { + "type": "string", + "title": "Access Token" + }, + "token_type": { + "type": "string", + "title": "Token Type" + } + }, + "type": "object", + "required": [ + "access_token", + "token_type" + ], + "title": "BearerResponse" + }, + "BoardInput": { + "properties": { + "board_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Board Name" + }, + "liaison": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Liaison" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "board_name", + "liaison" + ], + "title": "BoardInput" + }, + "Body_auth_jwt_login_auth_jwt_login_post": { + "properties": { + "grant_type": { + "anyOf": [ + { + "type": "string", + "pattern": "^password$" + }, + { + "type": "null" + } + ], + "title": "Grant Type" + }, + "username": { + "type": "string", + "title": "Username" + }, + "password": { + "type": "string", + "format": "password", + "title": "Password" + }, + "scope": { + "type": "string", + "title": "Scope", + "default": "" + }, + "client_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Client Id" + }, + "client_secret": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "format": "password", + "title": "Client Secret" + } + }, + "type": "object", + "required": [ + "username", + "password" + ], + "title": "Body_auth_jwt_login_auth_jwt_login_post" + }, + "Body_upload_file_datasources_upload_post": { + "properties": { + "file": { + "type": "string", + "contentMediaType": "application/octet-stream", + "title": "File" + } + }, + "type": "object", + "required": [ + "file" + ], + "title": "Body_upload_file_datasources_upload_post" + }, + "CalculateDeadlineCommand": { + "properties": { + "action": { + "type": "string", + "const": "calculate-records-deadline", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/CalculateDeadlinePayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "CalculateDeadlineCommand" + }, + "CalculateDeadlinePayload": { + "properties": { + "deadlineReceivedDate": { + "type": "string", + "title": "Deadlinereceiveddate" + }, + "deadlineRuleName": { + "type": "string", + "minLength": 1, + "title": "Deadlinerulename" + }, + "deadlineDayCount": { + "type": "string", + "title": "Deadlinedaycount" + }, + "deadlineDayType": { + "type": "string", + "title": "Deadlinedaytype" + }, + "deadlineBasis": { + "type": "string", + "minLength": 1, + "title": "Deadlinebasis" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "deadlineReceivedDate", + "deadlineRuleName", + "deadlineDayCount", + "deadlineDayType", + "deadlineBasis" + ], + "title": "CalculateDeadlinePayload" + }, + "ChapterCreate": { + "properties": { + "chapter_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Chapter Id" + }, + "title_id": { + "type": "string", + "minLength": 1, + "title": "Title Id" + }, + "chapter_number": { + "type": "string", + "minLength": 1, + "title": "Chapter Number" + }, + "chapter_name": { + "type": "string", + "minLength": 1, + "title": "Chapter Name" + }, + "sort_order": { + "type": "integer", + "title": "Sort Order", + "default": 0 + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title_id", + "chapter_number", + "chapter_name" + ], + "title": "ChapterCreate", + "description": "Request body for creating a code chapter." + }, + "CitedSection": { + "properties": { + "source_id": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Source Id" + }, + "citation": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Citation" + }, + "title": { + "type": "string", + "maxLength": 500, + "title": "Title", + "default": "" + }, + "version": { + "type": "string", + "maxLength": 80, + "title": "Version", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source_id", + "citation" + ], + "title": "CitedSection", + "description": "One resolved public Code section; never a caller-supplied quotation." + }, + "CityProfileCreate": { + "properties": { + "city_name": { + "type": "string", + "title": "City Name" + }, + "state": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State" + }, + "county": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "County" + }, + "population_band": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Population Band" + }, + "email_platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email Platform" + }, + "has_dedicated_it": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Has Dedicated It" + }, + "monthly_request_volume": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Monthly Request Volume" + }, + "profile_data": { + "additionalProperties": true, + "type": "object", + "title": "Profile Data", + "default": {} + }, + "gap_map": { + "additionalProperties": true, + "type": "object", + "title": "Gap Map", + "default": {} + } + }, + "type": "object", + "required": [ + "city_name" + ], + "title": "CityProfileCreate" + }, + "CityProfileRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "city_name": { + "type": "string", + "title": "City Name" + }, + "state": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State" + }, + "county": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "County" + }, + "population_band": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Population Band" + }, + "email_platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email Platform" + }, + "has_dedicated_it": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Has Dedicated It" + }, + "monthly_request_volume": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Monthly Request Volume" + }, + "onboarding_status": { + "type": "string", + "title": "Onboarding Status" + }, + "profile_data": { + "additionalProperties": true, + "type": "object", + "title": "Profile Data" + }, + "gap_map": { + "additionalProperties": true, + "type": "object", + "title": "Gap Map" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "id", + "city_name", + "state", + "county", + "population_band", + "email_platform", + "has_dedicated_it", + "monthly_request_volume", + "onboarding_status", + "profile_data", + "gap_map", + "created_at", + "updated_at" + ], + "title": "CityProfileRead" + }, + "CityProfileUpdate": { + "properties": { + "city_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "City Name" + }, + "state": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State" + }, + "county": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "County" + }, + "population_band": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Population Band" + }, + "email_platform": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email Platform" + }, + "has_dedicated_it": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Has Dedicated It" + }, + "monthly_request_volume": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Monthly Request Volume" + }, + "onboarding_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Onboarding Status" + }, + "profile_data": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Profile Data" + }, + "gap_map": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Gap Map" + } + }, + "type": "object", + "title": "CityProfileUpdate" + }, + "ClarificationCommand": { + "properties": { + "action": { + "type": "string", + "const": "request-records-clarification", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/ClarificationPayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "ClarificationCommand" + }, + "ClarificationPayload": { + "properties": { + "clarificationNote": { + "type": "string", + "minLength": 1, + "title": "Clarificationnote" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "clarificationNote" + ], + "title": "ClarificationPayload" + }, + "Closeout": { + "properties": { + "decision_id": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Decision Id" + }, + "version_id": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Version Id" + }, + "source_id": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Source Id" + }, + "version_label": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Version Label" + }, + "body": { + "type": "string", + "maxLength": 1000000, + "minLength": 1, + "title": "Body" + }, + "effective_start": { + "type": "string", + "format": "date", + "title": "Effective Start" + }, + "effective_end": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Effective End" + }, + "is_current": { + "type": "boolean", + "title": "Is Current" + }, + "reconciliation_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reconciliation Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "decision_id", + "version_id", + "source_id", + "version_label", + "body", + "effective_start", + "is_current" + ], + "title": "Closeout" + }, + "CodeContext": { + "properties": { + "section_number": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Section Number" + }, + "as_of": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "section_number" + ], + "title": "CodeContext" + }, + "CodeLink": { + "properties": { + "provider": { + "type": "string", + "const": "code", + "title": "Provider", + "default": "code" + }, + "source_id": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Source Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source_id", + "expected_sha256" + ], + "title": "CodeLink" + }, + "CodeSearch": { + "properties": { + "query": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Query" + }, + "as_of": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "query" + ], + "title": "CodeSearch" + }, + "CodeSourceSelection": { + "properties": { + "source_id": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Source Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Expected Sha256" + }, + "as_of": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source_id", + "expected_sha256" + ], + "title": "CodeSourceSelection" + }, + "CompleteArtifact": { + "properties": { + "export_path": { + "type": "string", + "minLength": 1, + "title": "Export Path" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "export_path" + ], + "title": "CompleteArtifact" + }, + "ConnectionSearch": { + "properties": { + "provider": { + "type": "string", + "enum": [ + "meetings", + "zoning" + ], + "title": "Provider" + }, + "query": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Query" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "provider", + "query" + ], + "title": "ConnectionSearch" + }, + "CoverageGapResponse": { + "properties": { + "jurisdictions_without_rules": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Jurisdictions Without Rules" + }, + "departments_without_staff": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Departments Without Staff" + }, + "uncovered_categories": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Uncovered Categories" + }, + "total_gaps": { + "type": "integer", + "title": "Total Gaps" + } + }, + "type": "object", + "required": [ + "jurisdictions_without_rules", + "departments_without_staff", + "uncovered_categories", + "total_gaps" + ], + "title": "CoverageGapResponse" + }, + "DataSourceAdminRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "source_type": { + "$ref": "#/components/schemas/SourceType" + }, + "sync_schedule": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sync Schedule" + }, + "schedule_enabled": { + "type": "boolean", + "title": "Schedule Enabled", + "default": true + }, + "next_sync_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Next Sync At" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + }, + "created_by": { + "type": "string", + "format": "uuid", + "title": "Created By" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "last_ingestion_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Ingestion At" + }, + "last_sync_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Sync At" + }, + "last_sync_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Sync Status" + }, + "last_error_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Error Message" + }, + "consecutive_failure_count": { + "type": "integer", + "title": "Consecutive Failure Count", + "default": 0 + }, + "sync_paused": { + "type": "boolean", + "title": "Sync Paused", + "default": false + }, + "health_status": { + "type": "string", + "title": "Health Status", + "default": "healthy" + }, + "active_failure_count": { + "type": "integer", + "title": "Active Failure Count", + "default": 0 + }, + "connector_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Connector Type" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "connection_config": { + "additionalProperties": true, + "type": "object", + "title": "Connection Config" + } + }, + "type": "object", + "required": [ + "id", + "name", + "source_type", + "is_active", + "created_by", + "created_at", + "last_ingestion_at", + "connection_config" + ], + "title": "DataSourceAdminRead", + "description": "Full datasource shape including connection_config. Returned only by admin-gated endpoints." + }, + "DataSourceCreate": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "source_type": { + "$ref": "#/components/schemas/SourceType" + }, + "connection_config": { + "additionalProperties": true, + "type": "object", + "title": "Connection Config", + "default": {} + }, + "sync_schedule": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sync Schedule" + }, + "schedule_enabled": { + "type": "boolean", + "title": "Schedule Enabled", + "default": true + } + }, + "type": "object", + "required": [ + "name", + "source_type" + ], + "title": "DataSourceCreate" + }, + "DataSourceRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "source_type": { + "$ref": "#/components/schemas/SourceType" + }, + "sync_schedule": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sync Schedule" + }, + "schedule_enabled": { + "type": "boolean", + "title": "Schedule Enabled", + "default": true + }, + "next_sync_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Next Sync At" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + }, + "created_by": { + "type": "string", + "format": "uuid", + "title": "Created By" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "last_ingestion_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Ingestion At" + }, + "last_sync_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Sync At" + }, + "last_sync_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Sync Status" + }, + "last_error_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Error Message" + }, + "consecutive_failure_count": { + "type": "integer", + "title": "Consecutive Failure Count", + "default": 0 + }, + "sync_paused": { + "type": "boolean", + "title": "Sync Paused", + "default": false + }, + "health_status": { + "type": "string", + "title": "Health Status", + "default": "healthy" + }, + "active_failure_count": { + "type": "integer", + "title": "Active Failure Count", + "default": 0 + }, + "connector_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Connector Type" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "id", + "name", + "source_type", + "is_active", + "created_by", + "created_at", + "last_ingestion_at" + ], + "title": "DataSourceRead", + "description": "Redacted datasource shape — safe for non-admin roles. connection_config omitted." + }, + "DataSourceUpdate": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "connection_config": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Connection Config" + }, + "sync_schedule": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sync Schedule" + }, + "schedule_enabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Schedule Enabled" + }, + "is_active": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Active" + } + }, + "type": "object", + "title": "DataSourceUpdate" + }, + "DeadlineCommand": { + "properties": { + "action": { + "type": "string", + "const": "set-records-deadline", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/DeadlinePayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "DeadlineCommand" + }, + "DeadlinePayload": { + "properties": { + "deadline": { + "type": "string", + "title": "Deadline" + }, + "deadlineBasis": { + "type": "string", + "minLength": 1, + "title": "Deadlinebasis" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "deadline", + "deadlineBasis" + ], + "title": "DeadlinePayload" + }, + "Decision": { + "properties": { + "id": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Id" + }, + "outcome": { + "type": "string", + "enum": [ + "adopted", + "not_adopted", + "deferred", + "withdrawn" + ], + "title": "Outcome" + }, + "decided_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Decided At" + }, + "decision_text": { + "type": "string", + "maxLength": 1000000, + "minLength": 1, + "title": "Decision Text" + }, + "supporting_references": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Supporting References" + }, + "supersedes_decision_id": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$" + }, + { + "type": "null" + } + ], + "title": "Supersedes Decision Id" + }, + "reconciliation_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reconciliation Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "outcome", + "decision_text" + ], + "title": "Decision" + }, + "DepartmentCreate": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "code": { + "type": "string", + "title": "Code" + }, + "contact_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Contact Email" + } + }, + "type": "object", + "required": [ + "name", + "code" + ], + "title": "DepartmentCreate" + }, + "DepartmentRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "code": { + "type": "string", + "title": "Code" + }, + "contact_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Contact Email" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "name", + "code", + "contact_email", + "created_at" + ], + "title": "DepartmentRead" + }, + "DepartmentUpdate": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Code" + }, + "contact_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Contact Email" + } + }, + "type": "object", + "title": "DepartmentUpdate" + }, + "DisclosureTemplateCreate": { + "properties": { + "template_type": { + "type": "string", + "title": "Template Type" + }, + "state_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State Code" + }, + "content": { + "type": "string", + "title": "Content" + } + }, + "type": "object", + "required": [ + "template_type", + "content" + ], + "title": "DisclosureTemplateCreate" + }, + "DisclosureTemplateRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "template_type": { + "type": "string", + "title": "Template Type" + }, + "state_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State Code" + }, + "content": { + "type": "string", + "title": "Content" + }, + "version": { + "type": "integer", + "title": "Version" + }, + "updated_by": { + "type": "string", + "format": "uuid", + "title": "Updated By" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "id", + "template_type", + "state_code", + "content", + "version", + "updated_by", + "updated_at" + ], + "title": "DisclosureTemplateRead" + }, + "DisclosureTemplateRendered": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "template_type": { + "type": "string", + "title": "Template Type" + }, + "rendered_content": { + "type": "string", + "title": "Rendered Content" + }, + "has_unresolved_variables": { + "type": "boolean", + "title": "Has Unresolved Variables" + } + }, + "type": "object", + "required": [ + "id", + "template_type", + "rendered_content", + "has_unresolved_variables" + ], + "title": "DisclosureTemplateRendered" + }, + "DisclosureTemplateUpdate": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Content" + }, + "state_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State Code" + } + }, + "type": "object", + "title": "DisclosureTemplateUpdate" + }, + "DocumentChunkRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "document_id": { + "type": "string", + "format": "uuid", + "title": "Document Id" + }, + "chunk_index": { + "type": "integer", + "title": "Chunk Index" + }, + "content_text": { + "type": "string", + "title": "Content Text" + }, + "token_count": { + "type": "integer", + "title": "Token Count" + }, + "page_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Page Number" + } + }, + "type": "object", + "required": [ + "id", + "document_id", + "chunk_index", + "content_text", + "token_count", + "page_number" + ], + "title": "DocumentChunkRead" + }, + "DocumentRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "source_id": { + "type": "string", + "format": "uuid", + "title": "Source Id" + }, + "source_path": { + "type": "string", + "title": "Source Path" + }, + "filename": { + "type": "string", + "title": "Filename" + }, + "file_type": { + "type": "string", + "title": "File Type" + }, + "file_hash": { + "type": "string", + "title": "File Hash" + }, + "file_size": { + "type": "integer", + "title": "File Size" + }, + "ingestion_status": { + "$ref": "#/components/schemas/IngestionStatus" + }, + "ingestion_error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Ingestion Error" + }, + "chunk_count": { + "type": "integer", + "title": "Chunk Count" + }, + "ingested_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Ingested At" + }, + "connector_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Connector Type" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "id", + "source_id", + "source_path", + "filename", + "file_type", + "file_hash", + "file_size", + "ingestion_status", + "ingestion_error", + "chunk_count", + "ingested_at" + ], + "title": "DocumentRead" + }, + "DraftCommand": { + "properties": { + "action": { + "type": "string", + "const": "draft-records-response", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/DraftPayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "DraftCommand" + }, + "DraftInput": { + "properties": { + "source_materials": { + "items": { + "$ref": "#/components/schemas/SourceInput" + }, + "type": "array", + "title": "Source Materials" + }, + "sentences": { + "items": { + "$ref": "#/components/schemas/SentenceInput" + }, + "type": "array", + "minItems": 1, + "title": "Sentences" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sentences" + ], + "title": "DraftInput" + }, + "DraftPayload": { + "properties": { + "responseDraft": { + "type": "string", + "minLength": 1, + "title": "Responsedraft" + }, + "citation": { + "type": "string", + "title": "Citation", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "responseDraft" + ], + "title": "DraftPayload" + }, + "ErrorModel": { + "properties": { + "detail": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + ], + "title": "Detail" + } + }, + "type": "object", + "required": [ + "detail" + ], + "title": "ErrorModel" + }, + "Evidence": { + "properties": { + "filename": { + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,150}$", + "title": "Filename" + }, + "description": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Description" + }, + "media_type": { + "type": "string", + "enum": [ + "text/plain", + "image/jpeg", + "image/png", + "image/webp", + "application/pdf", + "audio/webm", + "audio/ogg", + "audio/wav", + "audio/mpeg", + "audio/mp4" + ], + "title": "Media Type" + }, + "content_base64": { + "type": "string", + "maxLength": 14000000, + "minLength": 1, + "title": "Content Base64" + }, + "sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "filename", + "description", + "media_type", + "content_base64", + "sha256" + ], + "title": "Evidence" + }, + "EvidenceItem": { + "properties": { + "filename": { + "type": "string", + "maxLength": 151, + "minLength": 1, + "title": "Filename" + }, + "media_type": { + "type": "string", + "maxLength": 80, + "minLength": 1, + "title": "Media Type" + }, + "description": { + "type": "string", + "maxLength": 2000, + "title": "Description", + "default": "" + }, + "content_base64": { + "type": "string", + "maxLength": 14000000, + "minLength": 1, + "title": "Content Base64" + }, + "sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "filename", + "media_type", + "content_base64", + "sha256" + ], + "title": "EvidenceItem" + }, + "EvidenceItems": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/EvidenceItem" + }, + "type": "array", + "maxItems": 10, + "minItems": 1, + "title": "Items" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "items" + ], + "title": "EvidenceItems" + }, + "ExemptionAccuracyReport": { + "properties": { + "category": { + "type": "string", + "title": "Category" + }, + "total_flags": { + "type": "integer", + "title": "Total Flags" + }, + "accepted": { + "type": "integer", + "title": "Accepted" + }, + "rejected": { + "type": "integer", + "title": "Rejected" + }, + "pending": { + "type": "integer", + "title": "Pending" + }, + "acceptance_rate": { + "type": "number", + "title": "Acceptance Rate" + } + }, + "type": "object", + "required": [ + "category", + "total_flags", + "accepted", + "rejected", + "pending", + "acceptance_rate" + ], + "title": "ExemptionAccuracyReport" + }, + "ExemptionDashboard": { + "properties": { + "total_flags": { + "type": "integer", + "title": "Total Flags" + }, + "by_status": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "By Status" + }, + "by_category": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "By Category" + }, + "acceptance_rate": { + "type": "number", + "title": "Acceptance Rate" + }, + "total_rules": { + "type": "integer", + "title": "Total Rules" + }, + "active_rules": { + "type": "integer", + "title": "Active Rules" + } + }, + "type": "object", + "required": [ + "total_flags", + "by_status", + "by_category", + "acceptance_rate", + "total_rules", + "active_rules" + ], + "title": "ExemptionDashboard" + }, + "ExemptionDecisionCommand": { + "properties": { + "action": { + "type": "string", + "const": "add-records-exemption-decision", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/ExemptionDecisionPayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "ExemptionDecisionCommand" + }, + "ExemptionDecisionPayload": { + "properties": { + "exemptionSource": { + "type": "string", + "minLength": 1, + "title": "Exemptionsource" + }, + "exemptionKind": { + "type": "string", + "minLength": 1, + "title": "Exemptionkind" + }, + "exemptionFinding": { + "type": "string", + "minLength": 1, + "title": "Exemptionfinding" + }, + "exemptionDecision": { + "type": "string", + "enum": [ + "release", + "redact", + "exempt" + ], + "title": "Exemptiondecision" + }, + "exemptionBasis": { + "type": "string", + "minLength": 1, + "title": "Exemptionbasis" + }, + "exemptionReviewer": { + "type": "string", + "title": "Exemptionreviewer", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "exemptionSource", + "exemptionKind", + "exemptionFinding", + "exemptionDecision", + "exemptionBasis" + ], + "title": "ExemptionDecisionPayload" + }, + "ExemptionDecisionView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "source": { + "type": "string", + "title": "Source" + }, + "kind": { + "type": "string", + "title": "Kind" + }, + "finding": { + "type": "string", + "title": "Finding" + }, + "decision": { + "type": "string", + "enum": [ + "release", + "redact", + "exempt" + ], + "title": "Decision" + }, + "basis": { + "type": "string", + "title": "Basis" + }, + "reviewer": { + "type": "string", + "title": "Reviewer" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "source", + "kind", + "finding", + "decision", + "basis", + "reviewer", + "created_at_unix_seconds" + ], + "title": "ExemptionDecisionView" + }, + "ExemptionFlagRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "chunk_id": { + "type": "string", + "format": "uuid", + "title": "Chunk Id" + }, + "rule_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Rule Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "category": { + "type": "string", + "title": "Category" + }, + "matched_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Matched Text" + }, + "confidence": { + "type": "number", + "title": "Confidence" + }, + "status": { + "$ref": "#/components/schemas/FlagStatus" + }, + "reviewed_by": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Reviewed By" + }, + "reviewed_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Reviewed At" + }, + "review_reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Review Reason" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "chunk_id", + "rule_id", + "request_id", + "category", + "matched_text", + "confidence", + "status", + "reviewed_by", + "reviewed_at", + "review_reason", + "created_at" + ], + "title": "ExemptionFlagRead" + }, + "ExemptionFlagReview": { + "properties": { + "status": { + "$ref": "#/components/schemas/FlagStatus" + }, + "review_reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Review Reason" + } + }, + "type": "object", + "required": [ + "status" + ], + "title": "ExemptionFlagReview" + }, + "ExemptionNoteCommand": { + "properties": { + "action": { + "type": "string", + "const": "add-records-exemption-review", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/ExemptionNotePayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "ExemptionNoteCommand" + }, + "ExemptionNotePayload": { + "properties": { + "exemptionNote": { + "type": "string", + "minLength": 1, + "title": "Exemptionnote" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "exemptionNote" + ], + "title": "ExemptionNotePayload" + }, + "ExemptionRuleCreate": { + "properties": { + "state_code": { + "type": "string", + "title": "State Code" + }, + "category": { + "type": "string", + "title": "Category" + }, + "rule_type": { + "$ref": "#/components/schemas/RuleType" + }, + "rule_definition": { + "type": "string", + "title": "Rule Definition" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "enabled": { + "type": "boolean", + "title": "Enabled", + "default": true + } + }, + "type": "object", + "required": [ + "state_code", + "category", + "rule_type", + "rule_definition" + ], + "title": "ExemptionRuleCreate" + }, + "ExemptionRuleRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "state_code": { + "type": "string", + "title": "State Code" + }, + "category": { + "type": "string", + "title": "Category" + }, + "rule_type": { + "$ref": "#/components/schemas/RuleType" + }, + "rule_definition": { + "type": "string", + "title": "Rule Definition" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "enabled": { + "type": "boolean", + "title": "Enabled" + }, + "version": { + "type": "integer", + "title": "Version", + "default": 1 + }, + "created_by": { + "type": "string", + "format": "uuid", + "title": "Created By" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "state_code", + "category", + "rule_type", + "rule_definition", + "description", + "enabled", + "created_by", + "created_at" + ], + "title": "ExemptionRuleRead" + }, + "ExemptionRuleUpdate": { + "properties": { + "rule_definition": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Rule Definition" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "enabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enabled" + } + }, + "type": "object", + "title": "ExemptionRuleUpdate" + }, + "ExportReceipt": { + "properties": { + "export_path": { + "type": "string", + "maxLength": 32768, + "minLength": 1, + "title": "Export Path" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "export_path" + ], + "title": "ExportReceipt" + }, + "FeeEstimateCommand": { + "properties": { + "action": { + "type": "string", + "const": "estimate-records-fee", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/FeeEstimatePayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "FeeEstimateCommand" + }, + "FeeEstimatePayload": { + "properties": { + "feeEstimate": { + "type": "string", + "minLength": 1, + "title": "Feeestimate" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "feeEstimate" + ], + "title": "FeeEstimatePayload" + }, + "FeeEstimateRequest": { + "properties": { + "page_count": { + "type": "integer", + "title": "Page Count" + }, + "fee_schedule_id": { + "type": "string", + "format": "uuid", + "title": "Fee Schedule Id" + } + }, + "type": "object", + "required": [ + "page_count", + "fee_schedule_id" + ], + "title": "FeeEstimateRequest" + }, + "FeeEstimateResponse": { + "properties": { + "page_count": { + "type": "integer", + "title": "Page Count" + }, + "unit_price": { + "type": "number", + "title": "Unit Price" + }, + "total": { + "type": "number", + "title": "Total" + }, + "fee_type": { + "type": "string", + "title": "Fee Type" + }, + "description": { + "type": "string", + "title": "Description" + } + }, + "type": "object", + "required": [ + "page_count", + "unit_price", + "total", + "fee_type", + "description" + ], + "title": "FeeEstimateResponse" + }, + "FeeLineCommand": { + "properties": { + "action": { + "type": "string", + "const": "add-records-fee-line", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/FeeLinePayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "FeeLineCommand" + }, + "FeeLineItemCreate": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "quantity": { + "type": "integer", + "title": "Quantity", + "default": 1 + }, + "unit_price": { + "type": "number", + "title": "Unit Price" + }, + "fee_schedule_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Fee Schedule Id" + } + }, + "type": "object", + "required": [ + "description", + "unit_price" + ], + "title": "FeeLineItemCreate" + }, + "FeeLineItemRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "fee_schedule_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Fee Schedule Id" + }, + "description": { + "type": "string", + "title": "Description" + }, + "quantity": { + "type": "integer", + "title": "Quantity" + }, + "unit_price": { + "type": "number", + "title": "Unit Price" + }, + "total": { + "type": "number", + "title": "Total" + }, + "status": { + "type": "string", + "title": "Status" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "request_id", + "fee_schedule_id", + "description", + "quantity", + "unit_price", + "total", + "status", + "created_at" + ], + "title": "FeeLineItemRead" + }, + "FeeLinePayload": { + "properties": { + "feeLineDescription": { + "type": "string", + "minLength": 1, + "title": "Feelinedescription" + }, + "feeScheduleBasis": { + "type": "string", + "minLength": 1, + "title": "Feeschedulebasis" + }, + "feeLineAmount": { + "type": "string", + "title": "Feelineamount" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "feeLineDescription", + "feeScheduleBasis", + "feeLineAmount" + ], + "title": "FeeLinePayload" + }, + "FeeLineView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "description": { + "type": "string", + "title": "Description" + }, + "schedule_basis": { + "type": "string", + "title": "Schedule Basis" + }, + "amount_cents": { + "type": "integer", + "title": "Amount Cents" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "description", + "schedule_basis", + "amount_cents", + "created_at_unix_seconds" + ], + "title": "FeeLineView" + }, + "FeeScheduleCreate": { + "properties": { + "jurisdiction": { + "type": "string", + "title": "Jurisdiction" + }, + "fee_type": { + "type": "string", + "title": "Fee Type" + }, + "amount": { + "type": "number", + "title": "Amount" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "effective_date": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Effective Date" + } + }, + "type": "object", + "required": [ + "jurisdiction", + "fee_type", + "amount" + ], + "title": "FeeScheduleCreate" + }, + "FeeScheduleRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "jurisdiction": { + "type": "string", + "title": "Jurisdiction" + }, + "fee_type": { + "type": "string", + "title": "Fee Type" + }, + "amount": { + "type": "number", + "title": "Amount" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "effective_date": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Effective Date" + }, + "created_by": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "jurisdiction", + "fee_type", + "amount", + "description", + "effective_date", + "created_by", + "created_at" + ], + "title": "FeeScheduleRead" + }, + "FeeScheduleUpdate": { + "properties": { + "fee_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Fee Type" + }, + "amount": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Amount" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "effective_date": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Effective Date" + } + }, + "type": "object", + "title": "FeeScheduleUpdate" + }, + "FeeWaiverCommand": { + "properties": { + "action": { + "type": "string", + "const": "waive-records-fee", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/FeeWaiverPayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "FeeWaiverCommand" + }, + "FeeWaiverCreateRequest": { + "properties": { + "waiver_type": { + "type": "string", + "title": "Waiver Type" + }, + "reason": { + "type": "string", + "title": "Reason" + } + }, + "type": "object", + "required": [ + "waiver_type", + "reason" + ], + "title": "FeeWaiverCreateRequest" + }, + "FeeWaiverPayload": { + "properties": { + "feeWaiverReason": { + "type": "string", + "minLength": 1, + "title": "Feewaiverreason" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "feeWaiverReason" + ], + "title": "FeeWaiverPayload" + }, + "FeeWaiverReadResponse": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "waiver_type": { + "type": "string", + "title": "Waiver Type" + }, + "reason": { + "type": "string", + "title": "Reason" + }, + "status": { + "type": "string", + "title": "Status" + }, + "review_notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Review Notes" + }, + "created_at": { + "type": "string", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "request_id", + "waiver_type", + "reason", + "status", + "created_at" + ], + "title": "FeeWaiverReadResponse" + }, + "FeeWaiverReviewRequest": { + "properties": { + "status": { + "type": "string", + "title": "Status" + }, + "review_notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Review Notes" + } + }, + "type": "object", + "required": [ + "status" + ], + "title": "FeeWaiverReviewRequest" + }, + "FinishCommand": { + "properties": { + "action": { + "type": "string", + "enum": [ + "fulfill-records-request", + "close-records-request" + ], + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/NativePayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action" + ], + "title": "FinishCommand" + }, + "FlagStatus": { + "type": "string", + "enum": [ + "flagged", + "reviewed", + "accepted", + "rejected" + ], + "title": "FlagStatus" + }, + "FormPlan": { + "properties": { + "action": { + "type": "string", + "const": "form-plan", + "title": "Action" + }, + "formName": { + "type": "string", + "maxLength": 500, + "title": "Formname", + "default": "" + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array", + "maxItems": 50, + "title": "Fields" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action" + ], + "title": "FormPlan" + }, + "GeneratedDraft": { + "properties": { + "text": { + "type": "string", + "minLength": 1, + "title": "Text" + }, + "model": { + "type": "string", + "minLength": 1, + "title": "Model" + }, + "previous_response_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Previous Response Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text", + "model", + "previous_response_sha256" + ], + "title": "GeneratedDraft" + }, + "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" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "request_id" + ], + "title": "Handoff" + }, + "ImportBundleCreate": { + "properties": { + "job_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Job Id" + }, + "connector_type": { + "type": "string", + "minLength": 1, + "title": "Connector Type" + }, + "source": { + "$ref": "#/components/schemas/SourceCreate" + }, + "sources": { + "items": { + "$ref": "#/components/schemas/SourceCreate" + }, + "type": "array", + "title": "Sources" + }, + "titles": { + "items": { + "$ref": "#/components/schemas/TitleCreate" + }, + "type": "array", + "title": "Titles" + }, + "chapters": { + "items": { + "$ref": "#/components/schemas/ChapterCreate" + }, + "type": "array", + "title": "Chapters" + }, + "sections": { + "items": { + "$ref": "#/components/schemas/SectionCreate" + }, + "type": "array", + "title": "Sections" + }, + "versions": { + "items": { + "$ref": "#/components/schemas/SectionVersionCreate" + }, + "type": "array", + "title": "Versions" + }, + "provenance": { + "additionalProperties": true, + "type": "object", + "title": "Provenance" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector_type", + "source" + ], + "title": "ImportBundleCreate", + "description": "Request body for local fixture/file-drop import jobs." + }, + "ImportCommitInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" + }, + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" + }, + "content_base64": { + "type": "string", + "maxLength": 22369624, + "minLength": 1, + "title": "Content Base64" + }, + "external_id": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "External Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector", + "source_url", + "input_format", + "content_base64", + "external_id", + "expected_sha256" + ], + "title": "ImportCommitInput" + }, + "ImportLinkInput": { + "properties": { + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "meeting_id" + ], + "title": "ImportLinkInput" + }, + "ImportLinkSearch": { + "properties": { + "target_query": { + "type": "string", + "maxLength": 255, + "title": "Target Query", + "default": "" + }, + "meeting_query": { + "type": "string", + "maxLength": 255, + "title": "Meeting Query", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ImportLinkSearch" + }, + "ImportPreviewInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" + }, + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" + }, + "content_base64": { + "type": "string", + "maxLength": 22369624, + "minLength": 1, + "title": "Content Base64" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector", + "source_url", + "input_format", + "content_base64" + ], + "title": "ImportPreviewInput" + }, + "ImportSourceInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" + }, + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector", + "source_url", + "input_format" + ], + "title": "ImportSourceInput" + }, + "InclusionStatus": { + "type": "string", + "enum": [ + "included", + "excluded", + "pending" + ], + "title": "InclusionStatus" + }, + "IngestionStats": { + "properties": { + "total_sources": { + "type": "integer", + "title": "Total Sources" + }, + "active_sources": { + "type": "integer", + "title": "Active Sources" + }, + "total_documents": { + "type": "integer", + "title": "Total Documents" + }, + "documents_by_status": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Documents By Status" + }, + "total_chunks": { + "type": "integer", + "title": "Total Chunks" + } + }, + "type": "object", + "required": [ + "total_sources", + "active_sources", + "total_documents", + "documents_by_status", + "total_chunks" + ], + "title": "IngestionStats" + }, + "IngestionStatus": { + "type": "string", + "enum": [ + "pending", + "processing", + "completed", + "failed" + ], + "title": "IngestionStatus" + }, + "InitiativeInput": { + "properties": { + "expected_revision": { + "anyOf": [ + { + "type": "string", + "maxLength": 36, + "minLength": 36 + }, + { + "type": "null" + } + ], + "title": "Expected Revision" + }, + "title": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Title" + }, + "policy": { + "$ref": "#/components/schemas/PolicySelection" + }, + "responsible_staff": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Responsible Staff" + }, + "target": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Target" + }, + "unit": { + "type": "string", + "maxLength": 80, + "minLength": 1, + "title": "Unit" + }, + "due_on": { + "type": "string", + "format": "date", + "title": "Due On" + }, + "status": { + "type": "string", + "enum": [ + "planned", + "active", + "completed", + "cancelled" + ], + "title": "Status", + "default": "planned" + }, + "milestones": { + "items": { + "$ref": "#/components/schemas/Milestone" + }, + "type": "array", + "maxItems": 100, + "title": "Milestones" + }, + "measurements": { + "items": { + "$ref": "#/components/schemas/Measurement" + }, + "type": "array", + "maxItems": 1000, + "title": "Measurements" + }, + "note": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "policy", + "responsible_staff", + "target", + "unit", + "due_on", + "note" + ], + "title": "InitiativeInput" + }, + "InspectionInput": { + "properties": { + "expected_revision": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Expected Revision" + }, + "title": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Title" + }, + "property_reference": { + "type": "string", + "maxLength": 1000, + "minLength": 1, + "title": "Property Reference" + }, + "inspection_reference": { + "type": "string", + "maxLength": 160, + "minLength": 1, + "title": "Inspection Reference" + }, + "dataset_kind": { + "type": "string", + "enum": [ + "municipal", + "fictional" + ], + "title": "Dataset Kind" + }, + "inspector_notes": { + "type": "string", + "maxLength": 10000, + "minLength": 1, + "title": "Inspector Notes" + }, + "photo_observations": { + "items": { + "type": "string" + }, + "type": "array", + "maxItems": 30, + "title": "Photo Observations" + }, + "voice_notes": { + "type": "string", + "maxLength": 10000, + "title": "Voice Notes", + "default": "" + }, + "evidence": { + "items": { + "$ref": "#/components/schemas/Evidence" + }, + "type": "array", + "maxItems": 10, + "title": "Evidence" + }, + "linked_sources": { + "items": { + "$ref": "#/components/schemas/townlight_inspections__workflow_models__SourceLink" + }, + "type": "array", + "maxItems": 30, + "title": "Linked Sources" + }, + "assigned_to": { + "type": "string", + "maxLength": 255, + "title": "Assigned To", + "default": "" + }, + "staff_notes": { + "type": "string", + "maxLength": 10000, + "title": "Staff Notes", + "default": "" + }, + "notice_draft": { + "type": "string", + "maxLength": 10000, + "title": "Notice Draft", + "default": "" + }, + "review_state": { + "type": "string", + "enum": [ + "draft", + "follow_up", + "reviewed" + ], + "title": "Review State", + "default": "draft" + }, + "review_notes": { + "type": "string", + "maxLength": 4000, + "title": "Review Notes", + "default": "" + }, + "public_summary": { + "type": "string", + "maxLength": 10000, + "title": "Public Summary", + "default": "" + }, + "analysis": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnalysisRecord" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "property_reference", + "inspection_reference", + "dataset_kind", + "inspector_notes" + ], + "title": "InspectionInput" + }, + "IntakeInput": { + "properties": { + "expected_revision": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Expected Revision" + }, + "project_name": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Project Name" + }, + "project_description": { + "type": "string", + "maxLength": 10000, + "minLength": 1, + "title": "Project Description" + }, + "location": { + "type": "string", + "maxLength": 1000, + "minLength": 1, + "title": "Location" + }, + "applicant_contact": { + "type": "string", + "maxLength": 2000, + "title": "Applicant Contact", + "default": "" + }, + "requirement_revision": { + "type": "string", + "format": "uuid", + "title": "Requirement Revision" + }, + "materials": { + "items": { + "$ref": "#/components/schemas/MaterialReview" + }, + "type": "array", + "maxItems": 100, + "minItems": 1, + "title": "Materials" + }, + "linked_sources": { + "items": { + "$ref": "#/components/schemas/townlight_permitting__workflow_models__SourceLink" + }, + "type": "array", + "maxItems": 30, + "title": "Linked Sources" + }, + "staff_notes": { + "type": "string", + "maxLength": 10000, + "title": "Staff Notes", + "default": "" + }, + "assigned_to": { + "type": "string", + "maxLength": 255, + "title": "Assigned To", + "default": "" + }, + "review_state": { + "type": "string", + "enum": [ + "draft", + "follow_up", + "reviewed" + ], + "title": "Review State", + "default": "draft" + }, + "review_notes": { + "type": "string", + "maxLength": 4000, + "title": "Review Notes", + "default": "" + }, + "public_summary": { + "type": "string", + "maxLength": 10000, + "title": "Public Summary", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "project_name", + "project_description", + "location", + "requirement_revision", + "materials" + ], + "title": "IntakeInput" + }, + "InterpretationNoteCreate": { + "properties": { + "note_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Note Id" + }, + "note_text": { + "type": "string", + "minLength": 1, + "title": "Note Text" + }, + "status": { + "type": "string", + "title": "Status", + "default": "draft" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "note_text" + ], + "title": "InterpretationNoteCreate", + "description": "Request body for staff-only interpretation notes." + }, + "InterviewRequest": { + "properties": { + "last_answer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Answer" + }, + "last_field": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Field" + }, + "skipped_fields": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Skipped Fields" + } + }, + "type": "object", + "title": "InterviewRequest" + }, + "InterviewResponse": { + "properties": { + "question": { + "type": "string", + "title": "Question" + }, + "target_field": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Target Field" + }, + "all_complete": { + "type": "boolean", + "title": "All Complete" + }, + "completed_fields": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Completed Fields" + }, + "onboarding_status": { + "type": "string", + "title": "Onboarding Status" + }, + "skipped_fields": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Skipped Fields" + } + }, + "type": "object", + "required": [ + "question", + "target_field", + "all_complete", + "completed_fields", + "onboarding_status", + "skipped_fields" + ], + "title": "InterviewResponse" + }, + "ManagedFileReceipt": { + "properties": { + "original_path": { + "type": "string", + "minLength": 1, + "title": "Original Path" + }, + "stored_path": { + "type": "string", + "minLength": 1, + "title": "Stored Path" + }, + "file_name": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "File Name" + }, + "sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Sha256" + }, + "size_bytes": { + "type": "integer", + "maximum": 2147483647.0, + "minimum": 0.0, + "title": "Size Bytes" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "original_path", + "stored_path", + "file_name", + "sha256", + "size_bytes" + ], + "title": "ManagedFileReceipt" + }, + "ManagedSource": { + "properties": { + "original_path": { + "type": "string", + "title": "Original Path" + }, + "stored_path": { + "type": "string", + "title": "Stored Path" + }, + "file_name": { + "type": "string", + "title": "File Name" + }, + "sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Sha256" + }, + "size_bytes": { + "type": "integer", + "minimum": 0.0, + "title": "Size Bytes" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "original_path", + "stored_path", + "file_name", + "sha256", + "size_bytes" + ], + "title": "ManagedSource" + }, + "Material": { + "properties": { + "material_id": { + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,80}$", + "title": "Material Id" + }, + "description": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Description" + }, + "citation": { + "type": "string", + "maxLength": 1000, + "minLength": 1, + "title": "Citation" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "material_id", + "description", + "citation" + ], + "title": "Material" + }, + "MaterialReview": { + "properties": { + "material_id": { + "type": "string", + "maxLength": 80, + "minLength": 1, + "title": "Material Id" + }, + "status": { + "type": "string", + "enum": [ + "not_reviewed", + "provided", + "missing", + "unclear" + ], + "title": "Status", + "default": "not_reviewed" + }, + "note": { + "type": "string", + "maxLength": 2000, + "title": "Note", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "material_id" + ], + "title": "MaterialReview" + }, + "Measurement": { + "properties": { + "recorded_on": { + "type": "string", + "format": "date", + "title": "Recorded On" + }, + "value": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Value" + }, + "evidence": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Evidence" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "recorded_on", + "value", + "evidence" + ], + "title": "Measurement" + }, + "MediaAnalysis": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/EvidenceItem" + }, + "type": "array", + "maxItems": 10, + "minItems": 1, + "title": "Items" + }, + "code_links": { + "items": { + "$ref": "#/components/schemas/CodeLink" + }, + "type": "array", + "maxItems": 30, + "title": "Code Links" + }, + "inspector_supplied_text": { + "type": "string", + "maxLength": 10000, + "title": "Inspector Supplied Text", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "items" + ], + "title": "MediaAnalysis" + }, + "MeetingInput": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "scheduled_start": { + "type": "string", + "format": "date-time", + "title": "Scheduled Start" + }, + "location": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Location" + }, + "meeting_type": { + "type": "string", + "enum": [ + "regular", + "special", + "emergency", + "closed_session", + "executive" + ], + "title": "Meeting Type", + "default": "regular" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "scheduled_start", + "location" + ], + "title": "MeetingInput" + }, + "MeetingLink": { + "properties": { + "source_id": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Source Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Expected Sha256" + }, + "relation": { + "type": "string", + "enum": [ + "hearing", + "context", + "precedent" + ], + "title": "Relation" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source_id", + "expected_sha256", + "relation" + ], + "title": "MeetingLink" + }, + "MeetingSearch": { + "properties": { + "query": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Query" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "query" + ], + "title": "MeetingSearch" + }, + "MeetingStageInput": { + "properties": { + "to_status": { + "type": "string", + "enum": [ + "SCHEDULED", + "NOTICED", + "PACKET_POSTED", + "IN_PROGRESS", + "RECESSED", + "ADJOURNED", + "TRANSCRIPT_READY", + "MINUTES_DRAFTED", + "MINUTES_POSTED", + "MINUTES_ADOPTED", + "MINUTES_SIGNED", + "ARCHIVED", + "CANCELLED" + ], + "title": "To Status" + }, + "statutory_basis": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Statutory Basis" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "to_status" + ], + "title": "MeetingStageInput" + }, + "MeetingsSearch": { + "properties": { + "query": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Query" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "query" + ], + "title": "MeetingsSearch" + }, + "MeetingsSourceSelection": { + "properties": { + "source_id": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Source Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source_id", + "expected_sha256" + ], + "title": "MeetingsSourceSelection" + }, + "MessageCommand": { + "properties": { + "action": { + "type": "string", + "const": "add-records-message", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/MessagePayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "MessageCommand" + }, + "MessageCreate": { + "properties": { + "message_text": { + "type": "string", + "title": "Message Text" + }, + "is_internal": { + "type": "boolean", + "title": "Is Internal", + "default": false + } + }, + "type": "object", + "required": [ + "message_text" + ], + "title": "MessageCreate" + }, + "MessagePayload": { + "properties": { + "requestMessageBody": { + "type": "string", + "minLength": 1, + "title": "Requestmessagebody" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "requestMessageBody" + ], + "title": "MessagePayload" + }, + "MessageRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "sender_type": { + "type": "string", + "title": "Sender Type" + }, + "sender_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Sender Id" + }, + "message_text": { + "type": "string", + "title": "Message Text" + }, + "is_internal": { + "type": "boolean", + "title": "Is Internal" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "request_id", + "sender_type", + "sender_id", + "message_text", + "is_internal", + "created_at" + ], + "title": "MessageRead" + }, + "MessageView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "author": { + "type": "string", + "title": "Author" + }, + "author_role": { + "type": "string", + "title": "Author Role" + }, + "body": { + "type": "string", + "title": "Body" + }, + "visibility": { + "type": "string", + "title": "Visibility" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "author", + "author_role", + "body", + "visibility", + "created_at_unix_seconds" + ], + "title": "MessageView" + }, + "Milestone": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "due_on": { + "type": "string", + "format": "date", + "title": "Due On" + }, + "completed_on": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Completed On" + }, + "evidence": { + "type": "string", + "maxLength": 2000, + "title": "Evidence", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "due_on" + ], + "title": "Milestone" + }, + "MinutesDecision": { + "properties": { + "action": { + "type": "string", + "enum": [ + "post", + "adopt", + "sign" + ], + "title": "Action" + }, + "note": { + "type": "string", + "title": "Note", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action" + ], + "title": "MinutesDecision" + }, + "ModelRegistryCreate": { + "properties": { + "model_name": { + "type": "string", + "title": "Model Name" + }, + "model_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Version" + }, + "parameter_count": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parameter Count" + }, + "license": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "License" + }, + "model_card_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Card Url" + }, + "is_active": { + "type": "boolean", + "title": "Is Active", + "default": false + }, + "context_window_size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Context Window Size" + }, + "supports_ner": { + "type": "boolean", + "title": "Supports Ner", + "default": false + }, + "supports_vision": { + "type": "boolean", + "title": "Supports Vision", + "default": false + } + }, + "type": "object", + "required": [ + "model_name" + ], + "title": "ModelRegistryCreate", + "description": "Schema for creating a new model_registry record (POST body)." + }, + "ModelRegistryRead": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "model_name": { + "type": "string", + "title": "Model Name" + }, + "model_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Version" + }, + "parameter_count": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parameter Count" + }, + "license": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "License" + }, + "model_card_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Card Url" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + }, + "added_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Added At" + }, + "context_window_size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Context Window Size" + }, + "supports_ner": { + "type": "boolean", + "title": "Supports Ner" + }, + "supports_vision": { + "type": "boolean", + "title": "Supports Vision" + } + }, + "type": "object", + "required": [ + "id", + "model_name", + "is_active", + "supports_ner", + "supports_vision" + ], + "title": "ModelRegistryRead", + "description": "Schema for returning a model_registry record (GET response).\n\n``from_attributes=True`` allows construction directly from an ORM instance." + }, + "ModelRegistryUpdate": { + "properties": { + "model_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Name" + }, + "model_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Version" + }, + "parameter_count": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parameter Count" + }, + "license": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "License" + }, + "model_card_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Card Url" + }, + "is_active": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Active" + }, + "context_window_size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Context Window Size" + }, + "supports_ner": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Supports Ner" + }, + "supports_vision": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Supports Vision" + } + }, + "type": "object", + "title": "ModelRegistryUpdate", + "description": "Schema for partially updating a model_registry record (PATCH body).\n\nEvery field is optional so callers can send only the fields they want to\nchange." + }, + "MotionCorrection": { + "properties": { + "text": { + "type": "string", + "minLength": 1, + "title": "Text" + }, + "reason": { + "type": "string", + "minLength": 1, + "title": "Reason" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text", + "reason" + ], + "title": "MotionCorrection" + }, + "MotionInput": { + "properties": { + "text": { + "type": "string", + "minLength": 1, + "title": "Text" + }, + "seconded_by": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Seconded By" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text" + ], + "title": "MotionInput" + }, + "NativePayload": { + "properties": {}, + "additionalProperties": false, + "type": "object", + "title": "NativePayload" + }, + "NativeRequestRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "requester_name": { + "type": "string", + "title": "Requester Name" + }, + "requester_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Requester Email" + }, + "requester_phone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Requester Phone" + }, + "requester_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Requester Type" + }, + "date_received": { + "type": "string", + "format": "date-time", + "title": "Date Received" + }, + "statutory_deadline": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Statutory Deadline" + }, + "description": { + "type": "string", + "title": "Description" + }, + "status": { + "$ref": "#/components/schemas/RequestStatus" + }, + "assigned_to": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Assigned To" + }, + "created_by": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "response_draft": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Response Draft" + }, + "review_notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Review Notes" + }, + "department_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Department Id" + }, + "estimated_fee": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Estimated Fee" + }, + "fee_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Fee Status" + }, + "fee_waiver_requested": { + "type": "boolean", + "title": "Fee Waiver Requested", + "default": false + }, + "priority": { + "type": "string", + "title": "Priority", + "default": "normal" + }, + "scope_assessment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scope Assessment" + }, + "closed_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Closed At" + }, + "closure_reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Closure Reason" + }, + "desktop_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Desktop Id" + }, + "public_tracking_number": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Public Tracking Number" + }, + "submitted_via": { + "type": "string", + "title": "Submitted Via" + }, + "deadline_label": { + "type": "string", + "title": "Deadline Label" + }, + "deadline_basis": { + "type": "string", + "title": "Deadline Basis" + }, + "deadline_reviewed_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deadline Reviewed At" + } + }, + "type": "object", + "required": [ + "id", + "requester_name", + "requester_email", + "date_received", + "statutory_deadline", + "description", + "status", + "assigned_to", + "created_by", + "created_at", + "response_draft", + "review_notes", + "desktop_id", + "public_tracking_number", + "submitted_via", + "deadline_label", + "deadline_basis", + "deadline_reviewed_at" + ], + "title": "NativeRequestRead" + }, + "NoticeDocumentInput": { + "properties": { + "text": { + "type": "string", + "minLength": 1, + "title": "Text" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text" + ], + "title": "NoticeDocumentInput" + }, + "NoticeDraft": { + "properties": { + "title": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Title" + }, + "body": { + "type": "string", + "maxLength": 100000, + "minLength": 1, + "title": "Body" + }, + "notice_type": { + "type": "string", + "maxLength": 160, + "minLength": 1, + "title": "Notice Type" + }, + "statutory_basis": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Statutory Basis" + }, + "event_date": { + "type": "string", + "format": "date", + "title": "Event Date" + }, + "lead_days": { + "type": "integer", + "maximum": 365.0, + "minimum": 0.0, + "title": "Lead Days" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "body", + "notice_type", + "statutory_basis", + "event_date", + "lead_days" + ], + "title": "NoticeDraft" + }, + "NoticeInput": { + "properties": { + "notice_type": { + "type": "string", + "enum": [ + "regular", + "special", + "emergency", + "closed_session", + "executive" + ], + "title": "Notice Type" + }, + "posted_at": { + "type": "string", + "format": "date-time", + "title": "Posted At" + }, + "minimum_notice_hours": { + "type": "integer", + "minimum": 0.0, + "title": "Minimum Notice Hours" + }, + "statutory_basis": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Statutory Basis" + }, + "approved_by": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Approved By" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "notice_type", + "posted_at", + "minimum_notice_hours" + ], + "title": "NoticeInput" + }, + "NoticeProofInput": { + "properties": { + "location": { + "type": "string", + "minLength": 1, + "title": "Location" + }, + "note": { + "type": "string", + "title": "Note", + "default": "" + }, + "document_delivery_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Document Delivery Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "location" + ], + "title": "NoticeProofInput" + }, + "NotificationLogRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "template_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Template Id" + }, + "recipient_email": { + "type": "string", + "title": "Recipient Email" + }, + "request_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Request Id" + }, + "channel": { + "type": "string", + "title": "Channel" + }, + "status": { + "type": "string", + "title": "Status" + }, + "sent_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Sent At" + }, + "error_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error Message" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "template_id", + "recipient_email", + "request_id", + "channel", + "status", + "sent_at", + "error_message", + "created_at" + ], + "title": "NotificationLogRead" + }, + "NotificationTemplateCreate": { + "properties": { + "event_type": { + "type": "string", + "title": "Event Type" + }, + "channel": { + "type": "string", + "title": "Channel", + "default": "email" + }, + "subject_template": { + "type": "string", + "title": "Subject Template" + }, + "body_template": { + "type": "string", + "title": "Body Template" + } + }, + "type": "object", + "required": [ + "event_type", + "subject_template", + "body_template" + ], + "title": "NotificationTemplateCreate" + }, + "NotificationTemplateRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "event_type": { + "type": "string", + "title": "Event Type" + }, + "channel": { + "type": "string", + "title": "Channel" + }, + "subject_template": { + "type": "string", + "title": "Subject Template" + }, + "body_template": { + "type": "string", + "title": "Body Template" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "event_type", + "channel", + "subject_template", + "body_template", + "is_active", + "created_at" + ], + "title": "NotificationTemplateRead" + }, + "NotificationTemplateUpdate": { + "properties": { + "subject_template": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Subject Template" + }, + "body_template": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Body Template" + }, + "is_active": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Active" + } + }, + "type": "object", + "title": "NotificationTemplateUpdate" + }, + "NotificationView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "notification_id": { + "type": "string", + "title": "Notification Id" + }, + "module_id": { + "type": "string", + "title": "Module Id" + }, + "record_id": { + "type": "string", + "title": "Record Id" + }, + "audience": { + "type": "string", + "title": "Audience" + }, + "channel": { + "type": "string", + "title": "Channel" + }, + "subject": { + "type": "string", + "title": "Subject" + }, + "body": { + "type": "string", + "title": "Body" + }, + "status": { + "type": "string", + "title": "Status" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + }, + "sent_at_unix_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Sent At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "notification_id", + "module_id", + "record_id", + "audience", + "channel", + "subject", + "body", + "status", + "created_at_unix_seconds", + "sent_at_unix_seconds" + ], + "title": "NotificationView" + }, + "OllamaModelInfo": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Size" + }, + "details": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Details" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "OllamaModelInfo" + }, + "OllamaStatus": { + "properties": { + "status": { + "type": "string", + "title": "Status" + }, + "models": { + "items": { + "$ref": "#/components/schemas/OllamaModelInfo" + }, + "type": "array", + "title": "Models" + } + }, + "type": "object", + "required": [ + "status", + "models" + ], + "title": "OllamaStatus" + }, + "OperationalMetrics": { + "properties": { + "average_response_time_days": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Average Response Time Days" + }, + "median_response_time_days": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Median Response Time Days" + }, + "requests_by_status": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Requests By Status" + }, + "requests_by_department": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Requests By Department" + }, + "deadline_compliance_rate": { + "type": "number", + "title": "Deadline Compliance Rate" + }, + "total_open": { + "type": "integer", + "title": "Total Open" + }, + "total_closed": { + "type": "integer", + "title": "Total Closed" + }, + "total_overdue": { + "type": "integer", + "title": "Total Overdue" + }, + "clarification_frequency": { + "type": "number", + "title": "Clarification Frequency" + }, + "top_request_topics": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Top Request Topics" + } + }, + "type": "object", + "required": [ + "average_response_time_days", + "median_response_time_days", + "requests_by_status", + "requests_by_department", + "deadline_compliance_rate", + "total_open", + "total_closed", + "total_overdue", + "clarification_frequency", + "top_request_topics" + ], + "title": "OperationalMetrics" + }, + "Outline": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "question_ids": { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array", + "maxItems": 50, + "minItems": 1, + "title": "Question Ids" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "question_ids" + ], + "title": "Outline" + }, + "Packet": { + "properties": { + "expected_revision": { + "type": "string", + "format": "uuid", + "title": "Expected Revision" + }, + "visibility": { + "type": "string", + "enum": [ + "staff_only", + "records_copy" + ], + "title": "Visibility" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "expected_revision", + "visibility" + ], + "title": "Packet" + }, + "PacketInput": { + "properties": { + "agenda_item_ids": { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array", + "title": "Agenda Item Ids" + }, + "source_files": { + "items": { + "$ref": "#/components/schemas/ManagedSource" + }, + "type": "array", + "title": "Source Files" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "agenda_item_ids" + ], + "title": "PacketInput" + }, + "Pathway": { + "properties": { + "project_type": { + "type": "string", + "maxLength": 120, + "minLength": 1, + "title": "Project Type" + }, + "proposal": { + "type": "string", + "maxLength": 4000, + "title": "Proposal", + "default": "" + }, + "location_context": { + "type": "string", + "maxLength": 1000, + "title": "Location Context", + "default": "" + }, + "requirement_revision": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Requirement Revision" + }, + "fee_link": { + "anyOf": [ + { + "$ref": "#/components/schemas/townlight_permitting__workflow_models__SourceLink" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "project_type" + ], + "title": "Pathway" + }, + "PathwayStep": { + "properties": { + "step": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Step" + }, + "citation": { + "type": "string", + "maxLength": 1000, + "minLength": 1, + "title": "Citation" + }, + "typical_time": { + "type": "string", + "maxLength": 1000, + "title": "Typical Time", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "step", + "citation" + ], + "title": "PathwayStep" + }, + "PlainLanguageSummaryCreate": { + "properties": { + "summary_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Summary Id" + }, + "section_version_id": { + "type": "string", + "minLength": 1, + "title": "Section Version Id" + }, + "summary_text": { + "type": "string", + "minLength": 1, + "title": "Summary Text" + }, + "language_code": { + "type": "string", + "title": "Language Code", + "default": "en" + }, + "status": { + "type": "string", + "title": "Status", + "default": "draft" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "section_version_id", + "summary_text" + ], + "title": "PlainLanguageSummaryCreate", + "description": "Request body for staff-drafted plain-language summaries." + }, + "PolicySelection": { + "properties": { + "plan_id": { + "type": "string", + "maxLength": 160, + "minLength": 1, + "title": "Plan Id" + }, + "revision_id": { + "type": "string", + "maxLength": 36, + "minLength": 36, + "title": "Revision Id" + }, + "policy_id": { + "type": "string", + "maxLength": 160, + "minLength": 1, + "title": "Policy Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "plan_id", + "revision_id", + "policy_id" + ], + "title": "PolicySelection" + }, + "PortalModeResponse": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "public", + "private" + ], + "title": "Mode", + "description": "Active portal posture for this deployment. ``public`` = minimal resident surface (landing + authenticated records-request submission + resident registration) reachable without staff auth. ``private`` = staff-only; no public routes, no resident self-registration." + } + }, + "type": "object", + "required": [ + "mode" + ], + "title": "PortalModeResponse", + "description": "T5D — schema for ``GET /config/portal-mode``.\n\nExposed to the frontend on boot so it can branch routing without a\nuser-identity lookup. The payload is intentionally the single field\nbelow — no staff config, no user state, no schema version." + }, + "PrepareArtifact": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "response", + "release-package" + ], + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "PrepareArtifact" + }, + "Proof": { + "properties": { + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" + }, + "filename": { + "type": "string", + "maxLength": 150, + "minLength": 1, + "title": "Filename" + }, + "content_base64": { + "type": "string", + "maxLength": 7000000, + "minLength": 1, + "title": "Content Base64" + }, + "location": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Location" + }, + "published_at": { + "type": "string", + "maxLength": 80, + "minLength": 1, + "title": "Published At" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sequence", + "filename", + "content_base64", + "location", + "published_at" + ], + "title": "Proof" + }, + "Proposal": { + "properties": { + "id": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Id" + }, + "version_id": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Version Id" + }, + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "title": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Title" + }, + "ordinance_number": { + "type": "string", + "maxLength": 120, + "minLength": 1, + "title": "Ordinance Number" + }, + "proposed_text": { + "type": "string", + "maxLength": 1000000, + "minLength": 1, + "title": "Proposed Text" + }, + "supersedes_id": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$" + }, + { + "type": "null" + } + ], + "title": "Supersedes Id" + }, + "reconciliation_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reconciliation Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "version_id", + "meeting_id", + "title", + "ordinance_number", + "proposed_text" + ], + "title": "Proposal" + }, + "ProposalInput": { + "properties": { + "vendor_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Vendor Name" + }, + "summary": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "Summary" + }, + "staff_score": { + "type": "integer", + "maximum": 100.0, + "minimum": 0.0, + "title": "Staff Score" + }, + "staff_exceptions": { + "type": "string", + "maxLength": 8000, + "title": "Staff Exceptions", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "vendor_name", + "summary", + "staff_score" + ], + "title": "ProposalInput" + }, + "PublicExplore": { + "properties": { + "goal": { + "type": "string", + "maxLength": 500, + "title": "Goal", + "default": "" + }, + "topic": { + "type": "string", + "maxLength": 160, + "title": "Topic", + "default": "" + }, + "neighborhood": { + "type": "string", + "maxLength": 255, + "title": "Neighborhood", + "default": "" + }, + "plan_type": { + "type": "string", + "maxLength": 120, + "title": "Plan Type", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "title": "PublicExplore" + }, + "PublicIntake": { + "properties": { + "requester": { + "type": "string", + "minLength": 1, + "title": "Requester" + }, + "requesterContact": { + "type": "string", + "minLength": 1, + "title": "Requestercontact" + }, + "summary": { + "type": "string", + "minLength": 1, + "title": "Summary" + }, + "deadline": { + "type": "string", + "title": "Deadline", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "requester", + "requesterContact", + "summary" + ], + "title": "PublicIntake" + }, + "PublicLookup": { + "properties": { + "trackingNumber": { + "type": "string", + "minLength": 1, + "title": "Trackingnumber" + }, + "requesterContact": { + "type": "string", + "minLength": 1, + "title": "Requestercontact" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "trackingNumber", + "requesterContact" + ], + "title": "PublicLookup" + }, + "PublicMessage": { + "properties": { + "trackingNumber": { + "type": "string", + "minLength": 1, + "title": "Trackingnumber" + }, + "requesterContact": { + "type": "string", + "minLength": 1, + "title": "Requestercontact" + }, + "publicRequestMessage": { + "type": "string", + "minLength": 1, + "title": "Publicrequestmessage" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "trackingNumber", + "requesterContact", + "publicRequestMessage" + ], + "title": "PublicMessage" + }, + "PublicStatusView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "label": { + "type": "string", + "title": "Label" + }, + "summary": { + "type": "string", + "title": "Summary" + }, + "status": { + "type": "string", + "title": "Status" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "label", + "summary", + "status", + "created_at_unix_seconds" + ], + "title": "PublicStatusView" + }, + "PublicationView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "source_module": { + "type": "string", + "title": "Source Module" + }, + "source_record_id": { + "type": "string", + "title": "Source Record Id" + }, + "record_type": { + "type": "string", + "title": "Record Type" + }, + "public_payload": { + "type": "string", + "title": "Public Payload" + }, + "payload_hash": { + "type": "string", + "title": "Payload Hash" + }, + "published_at_unix_seconds": { + "type": "integer", + "title": "Published At Unix Seconds" + }, + "retracted_at_unix_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Retracted At Unix Seconds" + }, + "retracted_by": { + "type": "string", + "title": "Retracted By", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "source_module", + "source_record_id", + "record_type", + "public_payload", + "payload_hash", + "published_at_unix_seconds" + ], + "title": "PublicationView" + }, + "PublishingPlan": { + "properties": { + "action": { + "type": "string", + "const": "publishing-workflow", + "title": "Action" + }, + "title": { + "type": "string", + "maxLength": 500, + "title": "Title", + "default": "" + }, + "hasReview": { + "type": "boolean", + "title": "Hasreview", + "default": false + }, + "hasPlainLanguage": { + "type": "boolean", + "title": "Hasplainlanguage", + "default": false + }, + "hasTranslationReview": { + "type": "boolean", + "title": "Hastranslationreview", + "default": false + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action" + ], + "title": "PublishingPlan" + }, + "Question": { + "properties": { + "jurisdiction": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Jurisdiction" + }, + "query": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Query" + }, + "question": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Question" + }, + "kind": { + "type": "string", + "enum": [ + "use", + "dimension" + ], + "title": "Kind" + }, + "key": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Key" + }, + "audience": { + "type": "string", + "enum": [ + "resident", + "staff" + ], + "title": "Audience", + "default": "resident" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "jurisdiction", + "query", + "question", + "kind", + "key" + ], + "title": "Question" + }, + "QuestionAnswerRequest": { + "properties": { + "question": { + "type": "string", + "minLength": 1, + "title": "Question" + }, + "section_number": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Section Number" + }, + "as_of": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "question" + ], + "title": "QuestionAnswerRequest", + "description": "Request body for citation-grounded code Q&A." + }, + "RecordsDocumentView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "attachment_id": { + "type": "string", + "title": "Attachment Id" + }, + "title": { + "type": "string", + "title": "Title" + }, + "original_path": { + "type": "string", + "title": "Original Path" + }, + "stored_path": { + "type": "string", + "title": "Stored Path" + }, + "citation": { + "type": "string", + "title": "Citation" + }, + "sha256": { + "type": "string", + "title": "Sha256" + }, + "size_bytes": { + "type": "integer", + "title": "Size Bytes" + }, + "status": { + "type": "string", + "title": "Status" + }, + "added_by": { + "type": "string", + "title": "Added By" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + }, + "release_original_path": { + "type": "string", + "title": "Release Original Path", + "default": "" + }, + "release_stored_path": { + "type": "string", + "title": "Release Stored Path", + "default": "" + }, + "release_file_name": { + "type": "string", + "title": "Release File Name", + "default": "" + }, + "release_sha256": { + "type": "string", + "title": "Release Sha256", + "default": "" + }, + "release_size_bytes": { + "type": "integer", + "title": "Release Size Bytes", + "default": 0 + }, + "release_status": { + "type": "string", + "title": "Release Status", + "default": "" + }, + "release_note": { + "type": "string", + "title": "Release Note", + "default": "" + }, + "release_added_by": { + "type": "string", + "title": "Release Added By", + "default": "" + }, + "release_added_at_unix_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Release Added At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "attachment_id", + "title", + "original_path", + "stored_path", + "citation", + "sha256", + "size_bytes", + "status", + "added_by", + "created_at_unix_seconds" + ], + "title": "RecordsDocumentView" + }, + "RecordsImportDocument": { + "properties": { + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "document_index": { + "type": "integer", + "minimum": 0.0, + "title": "Document Index" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "request_id", + "document_index" + ], + "title": "RecordsImportDocument" + }, + "RecordsOperationRead": { + "properties": { + "action": { + "type": "string", + "title": "Action" + }, + "message": { + "type": "string", + "title": "Message" + }, + "request": { + "$ref": "#/components/schemas/RecordsView" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "message", + "request" + ], + "title": "RecordsOperationRead" + }, + "RecordsStateRead": { + "properties": { + "demo_fixture": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Demo Fixture" + }, + "records_requests": { + "items": { + "$ref": "#/components/schemas/RecordsView" + }, + "type": "array", + "title": "Records Requests" + }, + "notification_events": { + "items": { + "$ref": "#/components/schemas/NotificationView" + }, + "type": "array", + "title": "Notification Events" + }, + "publication_events": { + "items": { + "$ref": "#/components/schemas/PublicationView" + }, + "type": "array", + "title": "Publication Events" + }, + "audit_entries": { + "items": { + "$ref": "#/components/schemas/AuditView" + }, + "type": "array", + "title": "Audit Entries" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "records_requests" + ], + "title": "RecordsStateRead" + }, + "RecordsView": { + "properties": { + "request_id": { + "type": "string", + "title": "Request Id" + }, + "id": { + "type": "string", + "title": "Id" + }, + "public_tracking_number": { + "type": "string", + "title": "Public Tracking Number" + }, + "requester": { + "type": "string", + "title": "Requester" + }, + "requester_contact": { + "type": "string", + "title": "Requester Contact" + }, + "submitted_via": { + "type": "string", + "title": "Submitted Via" + }, + "summary": { + "type": "string", + "title": "Summary" + }, + "deadline": { + "type": "string", + "title": "Deadline" + }, + "deadline_basis": { + "type": "string", + "title": "Deadline Basis" + }, + "status": { + "type": "string", + "title": "Status" + }, + "assigned_to": { + "type": "string", + "title": "Assigned To" + }, + "clarification_notes": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Clarification Notes" + }, + "search_notes": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Search Notes" + }, + "search_sessions": { + "items": { + "$ref": "#/components/schemas/SearchReceiptView" + }, + "type": "array", + "title": "Search Sessions" + }, + "exemption_reviews": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Exemption Reviews" + }, + "exemption_decisions": { + "items": { + "$ref": "#/components/schemas/ExemptionDecisionView" + }, + "type": "array", + "title": "Exemption Decisions" + }, + "fee_estimate": { + "type": "string", + "title": "Fee Estimate" + }, + "fee_line_items": { + "items": { + "$ref": "#/components/schemas/FeeLineView" + }, + "type": "array", + "title": "Fee Line Items" + }, + "fee_waiver_reason": { + "type": "string", + "title": "Fee Waiver Reason" + }, + "citations": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Citations" + }, + "response_draft": { + "type": "string", + "title": "Response Draft" + }, + "approval_notes": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Approval Notes" + }, + "exports": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Exports" + }, + "documents": { + "items": { + "$ref": "#/components/schemas/RecordsDocumentView" + }, + "type": "array", + "title": "Documents" + }, + "release_packages": { + "items": { + "$ref": "#/components/schemas/ReleasePackageView" + }, + "type": "array", + "title": "Release Packages" + }, + "timeline": { + "items": { + "$ref": "#/components/schemas/TimelineView" + }, + "type": "array", + "title": "Timeline" + }, + "public_status_events": { + "items": { + "$ref": "#/components/schemas/PublicStatusView" + }, + "type": "array", + "title": "Public Status Events" + }, + "messages": { + "items": { + "$ref": "#/components/schemas/MessageView" + }, + "type": "array", + "title": "Messages" + }, + "deadline_reviewed_at_unix_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Deadline Reviewed At Unix Seconds" + }, + "approved_at_unix_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Approved At Unix Seconds" + }, + "fulfilled_at_unix_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Fulfilled At Unix Seconds" + }, + "closed_at_unix_seconds": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Closed At Unix Seconds" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "request_id", + "id", + "public_tracking_number", + "requester", + "requester_contact", + "submitted_via", + "summary", + "deadline", + "deadline_basis", + "status", + "assigned_to", + "clarification_notes", + "search_notes", + "search_sessions", + "exemption_reviews", + "exemption_decisions", + "fee_estimate", + "fee_line_items", + "fee_waiver_reason", + "citations", + "response_draft", + "approval_notes", + "exports", + "timeline", + "public_status_events", + "messages", + "deadline_reviewed_at_unix_seconds", + "approved_at_unix_seconds", + "fulfilled_at_unix_seconds", + "closed_at_unix_seconds", + "created_at_unix_seconds" + ], + "title": "RecordsView" + }, + "ReleasePackageView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "export_path": { + "type": "string", + "title": "Export Path" + }, + "package_hash": { + "type": "string", + "title": "Package Hash" + }, + "document_count": { + "type": "integer", + "title": "Document Count" + }, + "release_artifact_count": { + "type": "integer", + "title": "Release Artifact Count" + }, + "search_session_count": { + "type": "integer", + "title": "Search Session Count" + }, + "release_count": { + "type": "integer", + "title": "Release Count" + }, + "redacted_count": { + "type": "integer", + "title": "Redacted Count" + }, + "exempt_count": { + "type": "integer", + "title": "Exempt Count" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "export_path", + "package_hash", + "document_count", + "release_artifact_count", + "search_session_count", + "release_count", + "redacted_count", + "exempt_count", + "created_at_unix_seconds" + ], + "title": "ReleasePackageView" + }, + "RepeatLookup": { + "properties": { + "property_reference": { + "type": "string", + "maxLength": 1000, + "minLength": 1, + "title": "Property Reference" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "property_reference" + ], + "title": "RepeatLookup" + }, + "RequestCreate": { + "properties": { + "requester_name": { + "type": "string", + "maxLength": 255, + "title": "Requester Name" + }, + "requester_email": { + "anyOf": [ + { + "type": "string", + "maxLength": 255 + }, + { + "type": "null" + } + ], + "title": "Requester Email" + }, + "requester_phone": { + "anyOf": [ + { + "type": "string", + "maxLength": 50 + }, + { + "type": "null" + } + ], + "title": "Requester Phone" + }, + "requester_type": { + "anyOf": [ + { + "type": "string", + "maxLength": 100 + }, + { + "type": "null" + } + ], + "title": "Requester Type" + }, + "description": { + "type": "string", + "maxLength": 10000, + "title": "Description" + }, + "statutory_deadline": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Statutory Deadline" + }, + "priority": { + "type": "string", + "title": "Priority", + "default": "normal" + }, + "scope_assessment": { + "anyOf": [ + { + "type": "string", + "pattern": "^(narrow|moderate|broad)$" + }, + { + "type": "null" + } + ], + "title": "Scope Assessment" + }, + "department_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Department Id" + } + }, + "type": "object", + "required": [ + "requester_name", + "description" + ], + "title": "RequestCreate" + }, + "RequestDocumentAdd": { + "properties": { + "document_id": { + "type": "string", + "format": "uuid", + "title": "Document Id" + }, + "relevance_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Relevance Note" + } + }, + "type": "object", + "required": [ + "document_id" + ], + "title": "RequestDocumentAdd" + }, + "RequestDocumentRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "document_id": { + "type": "string", + "format": "uuid", + "title": "Document Id" + }, + "relevance_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Relevance Note" + }, + "exemption_flags": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Exemption Flags" + }, + "inclusion_status": { + "$ref": "#/components/schemas/InclusionStatus" + }, + "attached_at": { + "type": "string", + "format": "date-time", + "title": "Attached At" + }, + "attached_by": { + "type": "string", + "format": "uuid", + "title": "Attached By" + } + }, + "type": "object", + "required": [ + "id", + "request_id", + "document_id", + "relevance_note", + "exemption_flags", + "inclusion_status", + "attached_at", + "attached_by" + ], + "title": "RequestDocumentRead" + }, + "RequestRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "requester_name": { + "type": "string", + "title": "Requester Name" + }, + "requester_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Requester Email" + }, + "requester_phone": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Requester Phone" + }, + "requester_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Requester Type" + }, + "date_received": { + "type": "string", + "format": "date-time", + "title": "Date Received" + }, + "statutory_deadline": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Statutory Deadline" + }, + "description": { + "type": "string", + "title": "Description" + }, + "status": { + "$ref": "#/components/schemas/RequestStatus" + }, + "assigned_to": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Assigned To" + }, + "created_by": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "response_draft": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Response Draft" + }, + "review_notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Review Notes" + }, + "department_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Department Id" + }, + "estimated_fee": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Estimated Fee" + }, + "fee_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Fee Status" + }, + "fee_waiver_requested": { + "type": "boolean", + "title": "Fee Waiver Requested", + "default": false + }, + "priority": { + "type": "string", + "title": "Priority", + "default": "normal" + }, + "scope_assessment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scope Assessment" + }, + "closed_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Closed At" + }, + "closure_reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Closure Reason" + } + }, + "type": "object", + "required": [ + "id", + "requester_name", + "requester_email", + "date_received", + "statutory_deadline", + "description", + "status", + "assigned_to", + "created_by", + "created_at", + "response_draft", + "review_notes" + ], + "title": "RequestRead" + }, + "RequestStats": { + "properties": { + "total_requests": { + "type": "integer", + "title": "Total Requests" + }, + "by_status": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "By Status" + }, + "approaching_deadline": { + "type": "integer", + "title": "Approaching Deadline" + }, + "overdue": { + "type": "integer", + "title": "Overdue" + } + }, + "type": "object", + "required": [ + "total_requests", + "by_status", + "approaching_deadline", + "overdue" + ], + "title": "RequestStats" + }, + "RequestStatus": { + "type": "string", + "enum": [ + "received", + "clarification_needed", + "assigned", + "searching", + "in_review", + "ready_for_release", + "drafted", + "approved", + "fulfilled", + "closed" + ], + "title": "RequestStatus" + }, + "RequestUpdate": { + "properties": { + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "status": { + "anyOf": [ + { + "$ref": "#/components/schemas/RequestStatus" + }, + { + "type": "null" + } + ] + }, + "assigned_to": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Assigned To" + }, + "response_draft": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Response Draft" + }, + "statutory_deadline": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Statutory Deadline" + }, + "scope_assessment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scope Assessment" + } + }, + "type": "object", + "title": "RequestUpdate" + }, + "RequirementBundle": { + "properties": { + "requirement_id": { + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,100}$", + "title": "Requirement Id" + }, + "title": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Title" + }, + "jurisdiction": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Jurisdiction" + }, + "project_type": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Project Type" + }, + "source_reference": { + "type": "string", + "maxLength": 1000, + "minLength": 1, + "title": "Source Reference" + }, + "source_date": { + "type": "string", + "format": "date", + "title": "Source Date" + }, + "effective_on": { + "type": "string", + "format": "date", + "title": "Effective On" + }, + "dataset_kind": { + "type": "string", + "enum": [ + "municipal", + "fictional" + ], + "title": "Dataset Kind" + }, + "filename": { + "type": "string", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,150}$", + "title": "Filename" + }, + "content_base64": { + "type": "string", + "maxLength": 14000000, + "minLength": 1, + "title": "Content Base64" + }, + "sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Sha256" + }, + "materials": { + "items": { + "$ref": "#/components/schemas/Material" + }, + "type": "array", + "maxItems": 100, + "minItems": 1, + "title": "Materials" + }, + "pathway": { + "items": { + "$ref": "#/components/schemas/PathwayStep" + }, + "type": "array", + "maxItems": 100, + "title": "Pathway" + }, + "fee_link": { + "anyOf": [ + { + "$ref": "#/components/schemas/townlight_permitting__workflow_models__SourceLink" + }, + { + "type": "null" + } + ] + }, + "staff_note": { + "type": "string", + "maxLength": 4000, + "title": "Staff Note", + "default": "" + }, + "change_note": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Change Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "requirement_id", + "title", + "jurisdiction", + "project_type", + "source_reference", + "source_date", + "effective_on", + "dataset_kind", + "filename", + "content_base64", + "sha256", + "materials", + "change_note" + ], + "title": "RequirementBundle" + }, + "ResponseLetterCreate": { + "properties": { + "template_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Template Id" + } + }, + "type": "object", + "title": "ResponseLetterCreate" + }, + "ResponseLetterRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "template_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Template Id" + }, + "generated_content": { + "type": "string", + "title": "Generated Content" + }, + "edited_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Edited Content" + }, + "status": { + "type": "string", + "title": "Status" + }, + "generated_by": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Generated By" + }, + "approved_by": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Approved By" + }, + "sent_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Sent At" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "request_id", + "template_id", + "generated_content", + "edited_content", + "status", + "generated_by", + "approved_by", + "sent_at", + "created_at" + ], + "title": "ResponseLetterRead" + }, + "ResponseLetterUpdate": { + "properties": { + "edited_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Edited Content" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + "type": "object", + "title": "ResponseLetterUpdate" + }, + "ReviewInput": { + "properties": { + "title": { + "type": "string", + "maxLength": 500, + "title": "Title", + "default": "" + }, + "body": { + "type": "string", + "maxLength": 5000, + "title": "Body", + "default": "" + }, + "hasAltText": { + "type": "boolean", + "title": "Hasalttext", + "default": false + }, + "language": { + "type": "string", + "maxLength": 80, + "title": "Language", + "default": "en" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ReviewInput" + }, + "Revision": { + "properties": { + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" + }, + "document": { + "$ref": "#/components/schemas/NoticeDraft" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sequence", + "document" + ], + "title": "Revision" + }, + "RewriteInput": { + "properties": { + "action": { + "type": "string", + "enum": [ + "plain-language", + "language-variant" + ], + "title": "Action" + }, + "text": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Text" + }, + "language": { + "type": "string", + "maxLength": 80, + "title": "Language", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "text" + ], + "title": "RewriteInput" + }, + "RewriteResult": { + "properties": { + "action": { + "type": "string", + "enum": [ + "plain-language", + "language-variant" + ], + "title": "Action" + }, + "text": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Text" + }, + "language": { + "type": "string", + "maxLength": 80, + "title": "Language", + "default": "" + }, + "outcome": { + "type": "string", + "enum": [ + "generated", + "unavailable" + ], + "title": "Outcome" + }, + "generated": { + "anyOf": [ + { + "type": "string", + "maxLength": 100000 + }, + { + "type": "null" + } + ], + "title": "Generated" + }, + "model": { + "anyOf": [ + { + "type": "string", + "maxLength": 200 + }, + { + "type": "null" + } + ], + "title": "Model" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "text", + "outcome" + ], + "title": "RewriteResult" + }, + "RfpInput": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "procurement_type": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Procurement Type" + }, + "city_need": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "City Need" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "procurement_type", + "city_need" + ], + "title": "RfpInput" + }, + "Rule": { + "properties": { + "jurisdiction": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Jurisdiction" + }, + "zone_code": { + "type": "string", + "maxLength": 80, + "minLength": 1, + "title": "Zone Code" + }, + "key": { + "type": "string", + "maxLength": 120, + "minLength": 1, + "title": "Key" + }, + "section_number": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Section Number" + }, + "kind": { + "type": "string", + "enum": [ + "use", + "dimension" + ], + "title": "Kind" + }, + "value": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Value" + }, + "overlay_code": { + "anyOf": [ + { + "type": "string", + "maxLength": 255 + }, + { + "type": "null" + } + ], + "title": "Overlay Code" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "jurisdiction", + "zone_code", + "key", + "section_number", + "kind", + "value" + ], + "title": "Rule" + }, + "RuleTestMatch": { + "properties": { + "matched_text": { + "type": "string", + "title": "Matched Text" + }, + "start": { + "type": "integer", + "title": "Start" + }, + "end": { + "type": "integer", + "title": "End" + } + }, + "type": "object", + "required": [ + "matched_text", + "start", + "end" + ], + "title": "RuleTestMatch" + }, + "RuleTestRequest": { + "properties": { + "sample_text": { + "type": "string", + "title": "Sample Text" + } + }, + "type": "object", + "required": [ + "sample_text" + ], + "title": "RuleTestRequest" + }, + "RuleTestResponse": { + "properties": { + "rule_id": { + "type": "string", + "format": "uuid", + "title": "Rule Id" + }, + "rule_type": { + "type": "string", + "title": "Rule Type" + }, + "matched": { + "type": "boolean", + "title": "Matched" + }, + "matches": { + "items": { + "$ref": "#/components/schemas/RuleTestMatch" + }, + "type": "array", + "title": "Matches" + } + }, + "type": "object", + "required": [ + "rule_id", + "rule_type", + "matched", + "matches" + ], + "title": "RuleTestResponse" + }, + "RuleType": { + "type": "string", + "enum": [ + "regex", + "keyword", + "llm_prompt" + ], + "title": "RuleType" + }, + "SaveReview": { + "properties": { + "title": { + "type": "string", + "maxLength": 500, + "title": "Title", + "default": "" + }, + "body": { + "type": "string", + "maxLength": 5000, + "title": "Body", + "default": "" + }, + "hasAltText": { + "type": "boolean", + "title": "Hasalttext", + "default": false + }, + "language": { + "type": "string", + "maxLength": 80, + "title": "Language", + "default": "en" + }, + "ai_analysis": { + "anyOf": [ + { + "type": "string", + "maxLength": 100000 + }, + { + "type": "null" + } + ], + "title": "Ai Analysis" + }, + "ai_analysis_model": { + "anyOf": [ + { + "type": "string", + "maxLength": 200 + }, + { + "type": "null" + } + ], + "title": "Ai Analysis Model" + }, + "ai_outcome": { + "type": "string", + "enum": [ + "generated", + "unavailable", + "failed" + ], + "title": "Ai Outcome" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ai_outcome" + ], + "title": "SaveReview" + }, + "SearchFilterOptions": { + "properties": { + "file_types": { + "items": { + "type": "string" + }, + "type": "array", + "title": "File Types" + }, + "source_names": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Source Names" + }, + "departments": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Departments", + "default": [] + }, + "date_range": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Date Range" + } + }, + "type": "object", + "required": [ + "file_types", + "source_names" + ], + "title": "SearchFilterOptions" + }, + "SearchInput": { + "properties": { + "query": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Query" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "query" + ], + "title": "SearchInput" + }, + "SearchNoteCommand": { + "properties": { + "action": { + "type": "string", + "const": "record-records-search", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/SearchNotePayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "SearchNoteCommand" + }, + "SearchNotePayload": { + "properties": { + "sourceNote": { + "type": "string", + "minLength": 1, + "title": "Sourcenote" + }, + "citation": { + "type": "string", + "title": "Citation", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sourceNote" + ], + "title": "SearchNotePayload" + }, + "SearchReceiptCommand": { + "properties": { + "action": { + "type": "string", + "const": "record-records-search-session", + "title": "Action" + }, + "payload": { + "$ref": "#/components/schemas/SearchReceiptPayload" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "payload" + ], + "title": "SearchReceiptCommand" + }, + "SearchReceiptPayload": { + "properties": { + "searchQuery": { + "type": "string", + "minLength": 1, + "title": "Searchquery" + }, + "searchLocations": { + "type": "string", + "minLength": 1, + "title": "Searchlocations" + }, + "searchResultTitle": { + "type": "string", + "minLength": 1, + "title": "Searchresulttitle" + }, + "searchResultCitation": { + "type": "string", + "minLength": 1, + "title": "Searchresultcitation" + }, + "searchResultSummary": { + "type": "string", + "minLength": 1, + "title": "Searchresultsummary" + }, + "searchResultStatus": { + "type": "string", + "title": "Searchresultstatus", + "default": "" + }, + "searchReviewer": { + "type": "string", + "title": "Searchreviewer", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "searchQuery", + "searchLocations", + "searchResultTitle", + "searchResultCitation", + "searchResultSummary" + ], + "title": "SearchReceiptPayload" + }, + "SearchReceiptView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "query": { + "type": "string", + "title": "Query" + }, + "locations": { + "type": "string", + "title": "Locations" + }, + "reviewer": { + "type": "string", + "title": "Reviewer" + }, + "results": { + "items": { + "$ref": "#/components/schemas/SearchResultView" + }, + "type": "array", + "title": "Results" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "query", + "locations", + "reviewer", + "results", + "created_at_unix_seconds" + ], + "title": "SearchReceiptView" + }, + "SearchRequest": { + "properties": { + "query": { + "type": "string", + "title": "Query" + }, + "session_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Session Id" + }, + "filters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Filters" + }, + "limit": { + "type": "integer", + "maximum": 50.0, + "title": "Limit", + "default": 10 + }, + "synthesize": { + "type": "boolean", + "title": "Synthesize", + "default": false + } + }, + "type": "object", + "required": [ + "query" + ], + "title": "SearchRequest" + }, + "SearchResponse": { + "properties": { + "query_id": { + "type": "string", + "format": "uuid", + "title": "Query Id" + }, + "session_id": { + "type": "string", + "format": "uuid", + "title": "Session Id" + }, + "query_text": { + "type": "string", + "title": "Query Text" + }, + "results": { + "items": { + "$ref": "#/components/schemas/SearchResultItem" + }, + "type": "array", + "title": "Results" + }, + "results_count": { + "type": "integer", + "title": "Results Count" + }, + "synthesized_answer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Synthesized Answer" + }, + "ai_generated": { + "type": "boolean", + "title": "Ai Generated", + "default": false + } + }, + "type": "object", + "required": [ + "query_id", + "session_id", + "query_text", + "results", + "results_count" + ], + "title": "SearchResponse" + }, + "SearchResultItem": { + "properties": { + "chunk_id": { + "type": "string", + "format": "uuid", + "title": "Chunk Id" + }, + "document_id": { + "type": "string", + "format": "uuid", + "title": "Document Id" + }, + "filename": { + "type": "string", + "title": "Filename" + }, + "file_type": { + "type": "string", + "title": "File Type" + }, + "source_path": { + "type": "string", + "title": "Source Path" + }, + "page_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Page Number" + }, + "content_text": { + "type": "string", + "title": "Content Text" + }, + "similarity_score": { + "type": "number", + "title": "Similarity Score" + }, + "rank": { + "type": "integer", + "title": "Rank" + } + }, + "type": "object", + "required": [ + "chunk_id", + "document_id", + "filename", + "file_type", + "source_path", + "page_number", + "content_text", + "similarity_score", + "rank" + ], + "title": "SearchResultItem" + }, + "SearchResultView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "title": { + "type": "string", + "title": "Title" + }, + "citation": { + "type": "string", + "title": "Citation" + }, + "summary": { + "type": "string", + "title": "Summary" + }, + "status": { + "type": "string", + "title": "Status" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "title", + "citation", + "summary", + "status" + ], + "title": "SearchResultView" + }, + "SearchSessionRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "user_id": { + "type": "string", + "format": "uuid", + "title": "User Id" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "queries": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Queries", + "default": [] + } + }, + "type": "object", + "required": [ + "id", + "user_id", + "created_at" + ], + "title": "SearchSessionRead" + }, + "SeatInput": { + "properties": { + "board_id": { + "type": "string", + "format": "uuid", + "title": "Board Id" + }, + "seat_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Seat Name" + }, + "member_name": { + "anyOf": [ + { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Member Name" + }, + "term_start": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Term Start" + }, + "term_end": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Term End" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "board_id", + "seat_name" + ], + "title": "SeatInput" + }, + "SectionCreate": { + "properties": { + "section_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Section Id" + }, + "chapter_id": { + "type": "string", + "minLength": 1, + "title": "Chapter Id" + }, + "section_number": { + "type": "string", + "minLength": 1, + "title": "Section Number" + }, + "section_heading": { + "type": "string", + "minLength": 1, + "title": "Section Heading" + }, + "parent_section_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parent Section Id" + }, + "sort_order": { + "type": "integer", + "title": "Sort Order", + "default": 0 + }, + "administrative_regulation_refs": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Administrative Regulation Refs" + }, + "resolution_refs": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Resolution Refs" + }, + "policy_refs": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Policy Refs" + }, + "approved_summary_refs": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Approved Summary Refs" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "chapter_id", + "section_number", + "section_heading" + ], + "title": "SectionCreate", + "description": "Request body for creating a code section or subsection." + }, + "SectionVersionCreate": { + "properties": { + "version_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version Id" + }, + "section_id": { + "type": "string", + "minLength": 1, + "title": "Section Id" + }, + "source_id": { + "type": "string", + "minLength": 1, + "title": "Source Id" + }, + "version_label": { + "type": "string", + "minLength": 1, + "title": "Version Label" + }, + "body": { + "type": "string", + "minLength": 1, + "title": "Body" + }, + "effective_start": { + "type": "string", + "format": "date", + "title": "Effective Start" + }, + "effective_end": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Effective End" + }, + "status": { + "type": "string", + "title": "Status", + "default": "draft" + }, + "is_current": { + "type": "boolean", + "title": "Is Current", + "default": false + }, + "adoption_event_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Adoption Event Id" + }, + "amendment_event_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Amendment Event Id" + }, + "amendment_summary": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Amendment Summary" + }, + "prior_version_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Prior Version Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "section_id", + "source_id", + "version_label", + "body", + "effective_start" + ], + "title": "SectionVersionCreate", + "description": "Request body for adding an immutable section version." + }, + "SentenceInput": { + "properties": { + "text": { + "type": "string", + "minLength": 1, + "title": "Text" + }, + "citations": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Citations" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text" + ], + "title": "SentenceInput" + }, + "ServiceAccountCreate": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "role": { + "$ref": "#/components/schemas/UserRole", + "default": "read_only" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "ServiceAccountCreate" + }, + "ServiceAccountCreated": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "role": { + "$ref": "#/components/schemas/UserRole" + }, + "created_by": { + "type": "string", + "format": "uuid", + "title": "Created By" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + }, + "api_key": { + "type": "string", + "title": "Api Key" + } + }, + "type": "object", + "required": [ + "id", + "name", + "role", + "created_by", + "created_at", + "is_active", + "api_key" + ], + "title": "ServiceAccountCreated", + "description": "Returned only on creation — includes the plaintext API key (shown once)." + }, + "ServiceAccountRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "role": { + "$ref": "#/components/schemas/UserRole" + }, + "created_by": { + "type": "string", + "format": "uuid", + "title": "Created By" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + } + }, + "type": "object", + "required": [ + "id", + "name", + "role", + "created_by", + "created_at", + "is_active" + ], + "title": "ServiceAccountRead" + }, + "ServiceAccountUpdate": { + "properties": { + "role": { + "anyOf": [ + { + "$ref": "#/components/schemas/UserRole" + }, + { + "type": "null" + } + ] + }, + "is_active": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Active" + } + }, + "type": "object", + "title": "ServiceAccountUpdate" + }, + "SignedAgreement": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "vendor_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Vendor Name" + }, + "owner": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Owner" + }, + "start_date": { + "type": "string", + "format": "date", + "title": "Start Date" + }, + "expiration_date": { + "type": "string", + "format": "date", + "title": "Expiration Date" + }, + "renewal_due": { + "type": "string", + "format": "date", + "title": "Renewal Due" + }, + "document_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Document Name" + }, + "document_content": { + "type": "string", + "maxLength": 8388608, + "format": "base64", + "contentMediaType": "application/octet-stream", + "title": "Document Content" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "vendor_name", + "owner", + "start_date", + "expiration_date", + "renewal_due", + "document_name", + "document_content" + ], + "title": "SignedAgreement" + }, + "Snapshot": { + "properties": { + "expected_revision": { + "type": "string", + "format": "uuid", + "title": "Expected Revision" + }, + "visibility": { + "type": "string", + "enum": [ + "staff_only", + "public" + ], + "title": "Visibility" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "expected_revision", + "visibility" + ], + "title": "Snapshot" + }, + "SourceCreate": { + "properties": { + "source_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Id" + }, + "name": { + "type": "string", + "minLength": 1, + "title": "Name" + }, + "publisher": { + "type": "string", + "minLength": 1, + "title": "Publisher" + }, + "source_type": { + "type": "string", + "minLength": 1, + "title": "Source Type" + }, + "source_category": { + "type": "string", + "minLength": 1, + "title": "Source Category" + }, + "source_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Url" + }, + "file_reference": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Reference" + }, + "retrieved_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Retrieved At" + }, + "retrieval_method": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Retrieval Method" + }, + "checksum": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Checksum" + }, + "source_owner": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Owner" + }, + "is_official": { + "type": "boolean", + "title": "Is Official", + "default": true + }, + "official_status_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Official Status Note" + }, + "status": { + "type": "string", + "title": "Status", + "default": "draft" + }, + "staff_notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Staff Notes" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "name", + "publisher", + "source_type", + "source_category" + ], + "title": "SourceCreate", + "description": "Request body for registering an official or explicitly labeled source." + }, + "SourceInput": { + "properties": { + "source_id": { + "type": "string", + "minLength": 1, + "title": "Source Id" + }, + "label": { + "type": "string", + "minLength": 1, + "title": "Label" + }, + "text": { + "type": "string", + "minLength": 1, + "title": "Text" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source_id", + "label", + "text" + ], + "title": "SourceInput" + }, + "SourceSnapshot": { + "properties": { + "visibility": { + "type": "string", + "enum": [ + "public", + "staff_only" + ], + "title": "Visibility" + }, + "meeting_event_ids": { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array", + "maxItems": 50, + "title": "Meeting Event Ids" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "visibility" + ], + "title": "SourceSnapshot" + }, + "SourceType": { + "type": "string", + "enum": [ + "manual_drop", + "file_system", + "rest_api", + "odbc" + ], + "title": "SourceType" + }, + "StaffRecordsIntake": { + "properties": { + "requester": { + "type": "string", + "minLength": 1, + "title": "Requester" + }, + "summary": { + "type": "string", + "minLength": 1, + "title": "Summary" + }, + "deadline": { + "type": "string", + "title": "Deadline" + }, + "deadlineBasis": { + "type": "string", + "title": "Deadlinebasis", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "requester", + "summary", + "deadline" + ], + "title": "StaffRecordsIntake", + "description": "Existing native create-records-request input; no caller-supplied actor." + }, + "StandardsExplanation": { + "properties": { + "question": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Question" + }, + "process_section": { + "type": "string", + "maxLength": 255, + "title": "Process Section", + "default": "" + }, + "zone_code": { + "type": "string", + "maxLength": 40, + "title": "Zone Code", + "default": "" + }, + "rule_types": { + "items": { + "type": "string" + }, + "type": "array", + "maxItems": 10, + "title": "Rule Types" + }, + "observed": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Observed" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "question" + ], + "title": "StandardsExplanation" + }, + "SyncFailureRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "source_id": { + "type": "string", + "format": "uuid", + "title": "Source Id" + }, + "source_path": { + "type": "string", + "title": "Source Path" + }, + "error_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error Message" + }, + "error_class": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error Class" + }, + "http_status_code": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Http Status Code" + }, + "retry_count": { + "type": "integer", + "title": "Retry Count" + }, + "status": { + "type": "string", + "title": "Status" + }, + "first_failed_at": { + "type": "string", + "format": "date-time", + "title": "First Failed At" + }, + "last_retried_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Retried At" + }, + "dismissed_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Dismissed At" + }, + "dismissed_by": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Dismissed By" + } + }, + "type": "object", + "required": [ + "id", + "source_id", + "source_path", + "error_message", + "error_class", + "http_status_code", + "retry_count", + "status", + "first_failed_at", + "last_retried_at", + "dismissed_at", + "dismissed_by" + ], + "title": "SyncFailureRead" + }, + "SyncRunLogRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "source_id": { + "type": "string", + "format": "uuid", + "title": "Source Id" + }, + "started_at": { + "type": "string", + "format": "date-time", + "title": "Started At" + }, + "finished_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Finished At" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + }, + "records_attempted": { + "type": "integer", + "title": "Records Attempted" + }, + "records_succeeded": { + "type": "integer", + "title": "Records Succeeded" + }, + "records_failed": { + "type": "integer", + "title": "Records Failed" + }, + "error_summary": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error Summary" + } + }, + "type": "object", + "required": [ + "id", + "source_id", + "started_at", + "finished_at", + "status", + "records_attempted", + "records_succeeded", + "records_failed", + "error_summary" + ], + "title": "SyncRunLogRead" + }, + "SystemStatus": { + "properties": { + "version": { + "type": "string", + "title": "Version" + }, + "database": { + "type": "string", + "title": "Database" + }, + "ollama": { + "type": "string", + "title": "Ollama" + }, + "redis": { + "type": "string", + "title": "Redis" + }, + "user_count": { + "type": "integer", + "title": "User Count" + }, + "audit_log_count": { + "type": "integer", + "title": "Audit Log Count" + }, + "suite_session": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Suite Session" + } + }, + "type": "object", + "required": [ + "version", + "database", + "ollama", + "redis", + "user_count", + "audit_log_count" + ], + "title": "SystemStatus" + }, + "TaggedPlan": { + "properties": { + "action": { + "type": "string", + "const": "tagged-pdf", + "title": "Action" + }, + "headingLevels": { + "items": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 0.0 + }, + "type": "array", + "maxItems": 50, + "title": "Headinglevels" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action" + ], + "title": "TaggedPlan" + }, + "TestConnectionRequest": { + "properties": { + "source_type": { + "type": "string", + "title": "Source Type" + }, + "host": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Host" + }, + "port": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Port" + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path" + }, + "username": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Username" + }, + "password": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Password" + }, + "rest_api_config": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Rest Api Config" + }, + "odbc_config": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Odbc Config" + } + }, + "type": "object", + "required": [ + "source_type" + ], + "title": "TestConnectionRequest", + "description": "Dedicated schema for test-connection. NOT the create schema.\n\nSecurity: credentials in this request body are never persisted, never\nwritten to audit logs, and never returned in the response." + }, + "TestConnectionResponse": { + "properties": { + "success": { + "type": "boolean", + "title": "Success" + }, + "message": { + "type": "string", + "title": "Message" + }, + "latency_ms": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Latency Ms" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + }, + "warning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Warning" + }, + "differing_keys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Differing Keys" + } + }, + "type": "object", + "required": [ + "success", + "message" + ], + "title": "TestConnectionResponse" + }, + "TimelineEventCreate": { + "properties": { + "event_type": { + "type": "string", + "title": "Event Type" + }, + "description": { + "type": "string", + "title": "Description" + }, + "internal_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Internal Note" + } + }, + "type": "object", + "required": [ + "event_type", + "description" + ], + "title": "TimelineEventCreate" + }, + "TimelineEventRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "event_type": { + "type": "string", + "title": "Event Type" + }, + "actor_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Actor Id" + }, + "actor_role": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Actor Role" + }, + "description": { + "type": "string", + "title": "Description" + }, + "internal_note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Internal Note" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "request_id", + "event_type", + "actor_id", + "actor_role", + "description", + "internal_note", + "created_at" + ], + "title": "TimelineEventRead" + }, + "TimelineView": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "action": { + "type": "string", + "title": "Action" + }, + "actor": { + "type": "string", + "title": "Actor" + }, + "note": { + "type": "string", + "title": "Note" + }, + "created_at_unix_seconds": { + "type": "integer", + "title": "Created At Unix Seconds" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "action", + "actor", + "note", + "created_at_unix_seconds" + ], + "title": "TimelineView" + }, + "TitleCreate": { + "properties": { + "title_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title Id" + }, + "title_number": { + "type": "string", + "minLength": 1, + "title": "Title Number" + }, + "title_name": { + "type": "string", + "minLength": 1, + "title": "Title Name" + }, + "sort_order": { + "type": "integer", + "title": "Sort Order", + "default": 0 + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title_number", + "title_name" + ], + "title": "TitleCreate", + "description": "Request body for creating a code title." + }, + "TranscriptInput": { + "properties": { + "source_label": { + "type": "string", + "minLength": 1, + "title": "Source Label" + }, + "transcript_text": { + "type": "string", + "minLength": 1, + "title": "Transcript Text" + }, + "correction_of_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Correction Of Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source_label", + "transcript_text" + ], + "title": "TranscriptInput" + }, + "UserRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "email": { + "type": "string", + "format": "email", + "title": "Email" + }, + "is_active": { + "type": "boolean", + "title": "Is Active", + "default": true + }, + "is_superuser": { + "type": "boolean", + "title": "Is Superuser", + "default": false + }, + "is_verified": { + "type": "boolean", + "title": "Is Verified", + "default": false + }, + "full_name": { + "type": "string", + "title": "Full Name" + }, + "role": { + "$ref": "#/components/schemas/UserRole" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "last_login": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Login" + }, + "must_change_password": { + "type": "boolean", + "title": "Must Change Password", + "default": false + }, + "department_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Department Id" + } + }, + "type": "object", + "required": [ + "id", + "email", + "full_name", + "role", + "created_at", + "last_login" + ], + "title": "UserRead" + }, + "UserRole": { + "type": "string", + "enum": [ + "admin", + "staff", + "reviewer", + "read_only", + "liaison", + "public" + ], + "title": "UserRole" + }, + "UserSelfUpdate": { + "properties": { + "password": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Password" + }, + "email": { + "anyOf": [ + { + "type": "string", + "format": "email" + }, + { + "type": "null" + } + ], + "title": "Email" + }, + "is_active": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Active" + }, + "is_superuser": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Superuser" + }, + "is_verified": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Verified" + }, + "full_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Full Name" + } + }, + "type": "object", + "title": "UserSelfUpdate", + "description": "Schema for user self-update via PATCH /users/me.\n\nExcludes role and department_id. Any payload containing those fields is\nrejected at parse time (HTTP 422). Role and department changes require\nadmin privileges via /admin/users/{id}." + }, + "UserUpdateRequest": { + "properties": { + "full_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Full Name" + }, + "role": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Role" + }, + "department_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Department Id" + }, + "is_active": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Active" + } + }, + "type": "object", + "title": "UserUpdateRequest" + }, + "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" + }, + "Version": { + "properties": { + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sequence" + ], + "title": "Version" + }, + "VoteCorrection": { + "properties": { + "vote": { + "type": "string", + "minLength": 1, + "title": "Vote" + }, + "reason": { + "type": "string", + "minLength": 1, + "title": "Reason" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "vote", + "reason" + ], + "title": "VoteCorrection" + }, + "VoteInput": { + "properties": { + "voter_name": { + "type": "string", + "minLength": 1, + "title": "Voter Name" + }, + "vote": { + "type": "string", + "minLength": 1, + "title": "Vote" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "voter_name", + "vote" + ], + "title": "VoteInput" + }, + "_ParcelLookupIn": { + "properties": { + "jurisdiction": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Jurisdiction" + }, + "query": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Query" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "jurisdiction", + "query" + ], + "title": "_ParcelLookupIn" + }, + "townlight_inspections__workflow_models__SourceLink": { + "properties": { + "provider": { + "type": "string", + "const": "code", + "title": "Provider", + "default": "code" + }, + "source_id": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Source Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source_id", + "expected_sha256" + ], + "title": "SourceLink" + }, + "townlight_permitting__workflow_models__SourceLink": { + "properties": { + "provider": { + "type": "string", + "enum": [ + "code", + "zoning" + ], + "title": "Provider" + }, + "source_id": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Source Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "provider", + "source_id", + "expected_sha256" + ], + "title": "SourceLink" + }, + "townlight_records__desktop_bridge__station__Selection": { + "properties": { + "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": [ + "recording_id", + "expected_sha256" + ], + "title": "Selection" + }, + "townlight_runtime__inspections_bridge__Search": { + "properties": { + "provider": { + "type": "string", + "const": "code", + "title": "Provider" + }, + "query": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Query" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "provider", + "query" + ], + "title": "Search" + }, + "townlight_runtime__notice_bridge__Review": { + "properties": { + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" + }, + "note": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sequence", + "note" + ], + "title": "Review" + }, + "townlight_runtime__permitting_bridge__Import": { + "properties": { + "bundle": { + "$ref": "#/components/schemas/RequirementBundle" + }, + "expected_revision": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Expected Revision" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "bundle" + ], + "title": "Import" + }, + "townlight_runtime__permitting_bridge__Search": { + "properties": { + "provider": { + "type": "string", + "enum": [ + "code", + "zoning" + ], + "title": "Provider" + }, + "query": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Query" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "provider", + "query" + ], + "title": "Search" + }, + "townlight_runtime__planning_bridge__Import": { + "properties": { + "bundle": { + "additionalProperties": true, + "type": "object", + "title": "Bundle" + }, + "expected_previous_revision": { + "anyOf": [ + { + "type": "string", + "maxLength": 36, + "minLength": 36 + }, + { + "type": "null" + } + ], + "title": "Expected Previous Revision" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "bundle" + ], + "title": "Import" + }, + "townlight_runtime__planning_bridge__Search": { + "properties": { + "query": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Query" + }, + "plan_type": { + "anyOf": [ + { + "type": "string", + "maxLength": 40 + }, + { + "type": "null" + } + ], + "title": "Plan Type" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "query" + ], + "title": "Search" + }, + "townlight_runtime__portal_publication__Selection": { + "properties": { + "action": { + "type": "string", + "enum": [ + "publish", + "withdraw" + ], + "title": "Action" + }, + "approve_publication": { + "type": "boolean", + "title": "Approve Publication" + }, + "archive_id": { + "type": "string", + "format": "uuid", + "title": "Archive Id" + }, + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "recording_id": { + "type": "string", + "format": "uuid", + "title": "Recording Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "release_copy_id": { + "type": "string", + "format": "uuid", + "title": "Release Copy Id" + }, + "expected_release_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Expected Release Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "approve_publication", + "archive_id", + "meeting_id", + "recording_id", + "request_id", + "release_copy_id", + "expected_release_sha256" + ], + "title": "Selection" + }, + "townlight_runtime__zoning_bridge__Review": { + "properties": { + "answer": { + "type": "string", + "maxLength": 10000, + "title": "Answer", + "default": "" + }, + "notes": { + "type": "string", + "maxLength": 10000, + "title": "Notes", + "default": "" + }, + "queue_status": { + "type": "string", + "enum": [ + "open", + "in_review", + "resolved", + "closed" + ], + "title": "Queue Status", + "default": "resolved" + } + }, + "additionalProperties": false, + "type": "object", + "title": "Review" + } + }, + "securitySchemes": { + "OAuth2PasswordBearer": { + "type": "oauth2", + "flows": { + "password": { + "scopes": {}, + "tokenUrl": "auth/jwt/login" + } + } + } + } + }, + "x-townlight-source-commit": "0afd59de52cb7ecb317188a89bcd1fec8c578a24", + "x-townlight-health-version-discrepancy": "Distribution Runtime 0.3.1 and Meetings 1.0.6; health strings Runtime 0.3.0 and Meetings 1.0.5 in the accepted MSI." +} diff --git a/docs/beta-1/api/meetings.html b/docs/beta-1/api/meetings.html index fac5263..b9f3134 100644 --- a/docs/beta-1/api/meetings.html +++ b/docs/beta-1/api/meetings.html @@ -1,14 +1,14 @@ Townlight Meetings API reference
Townlight

Townlight Meetings API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Meetings API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -13335,4 +13335,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

\ No newline at end of file diff --git a/docs/beta-1/api/notice.html b/docs/beta-1/api/notice.html index 18780e6..6ff6967 100644 --- a/docs/beta-1/api/notice.html +++ b/docs/beta-1/api/notice.html @@ -1,14 +1,14 @@ Townlight Notice API reference
Townlight

Townlight Notice API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Notice API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -12097,4 +12097,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/beta-1/api/permitting.html b/docs/beta-1/api/permitting.html index 9ba6de3..1f6c0e8 100644 --- a/docs/beta-1/api/permitting.html +++ b/docs/beta-1/api/permitting.html @@ -1,14 +1,14 @@ Townlight Permitting API reference
Townlight

Townlight Permitting API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Permitting API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -12240,4 +12240,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/beta-1/api/planning.html b/docs/beta-1/api/planning.html index a39fcce..3372a95 100644 --- a/docs/beta-1/api/planning.html +++ b/docs/beta-1/api/planning.html @@ -1,14 +1,14 @@ Townlight Planning API reference
Townlight

Townlight Planning API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Planning API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -13075,4 +13075,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/beta-1/api/records.html b/docs/beta-1/api/records.html index cf8c8ff..a520f79 100644 --- a/docs/beta-1/api/records.html +++ b/docs/beta-1/api/records.html @@ -1,14 +1,14 @@ Townlight Records API reference
Townlight

Townlight Records API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Records API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -19620,4 +19620,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/beta-1/api/station.html b/docs/beta-1/api/station.html index 2ddf1f0..8a812c5 100644 --- a/docs/beta-1/api/station.html +++ b/docs/beta-1/api/station.html @@ -1,14 +1,14 @@ Townlight Station API reference
Townlight

Townlight Station API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Station API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -11664,4 +11664,4 @@

Request and response data dictionary

"title": "Review" } -

Separate Station service

The native operations above are the suite authority boundary. Station runs its own service and database. Its unchanged 0.3.0 service contract is available in the separate Station service schema. Schema reuse does not establish the changed suite candidate’s installed handoff acceptance.

\ No newline at end of file +

Separate Station service

The native operations above are the suite authority boundary. Station runs its own service and database. Its unchanged 0.3.0 service contract is available in the separate Station service schema. Schema reuse does not establish the changed suite candidate’s installed handoff acceptance.

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

\ No newline at end of file diff --git a/docs/beta-1/api/suite-openapi.json b/docs/beta-1/api/suite-openapi.json index b7ebbe2..a6fb945 100644 --- a/docs/beta-1/api/suite-openapi.json +++ b/docs/beta-1/api/suite-openapi.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "Townlight Records", - "description": "Prepared source schema for the actual native composition; installed acceptance remains pending. Exported without lifespan, migrations or database/network access.", + "description": "Source schema generated from the bundled Windows 1.8.1.1 native domain runtime without starting services.", "version": "1.8.0.dev2" }, "paths": { @@ -5734,7 +5734,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Selection" + "$ref": "#/components/schemas/townlight_records__desktop_bridge__station__Selection" } } } @@ -8914,24 +8914,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/stages": { + "/desktop/v1/meetings/imports/preview": { "post": { "tags": [ "native-meetings" ], - "summary": "Record Meeting Stage", - "operationId": "record_meeting_stage_desktop_v1_meetings_meetings__meeting_id__stages_post", + "summary": "Preview Meeting Import", + "operationId": "preview_meeting_import_desktop_v1_meetings_imports_preview_post", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -8954,7 +8944,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MeetingStageInput" + "$ref": "#/components/schemas/ImportPreviewInput" } } } @@ -8981,13 +8971,13 @@ } } }, - "/desktop/v1/meetings/meetings": { - "post": { + "/desktop/v1/meetings/imports/sources": { + "get": { "tags": [ "native-meetings" ], - "summary": "Create Meeting", - "operationId": "create_meeting_desktop_v1_meetings_meetings_post", + "summary": "Meeting Import Sources", + "operationId": "meeting_import_sources_desktop_v1_meetings_imports_sources_get", "parameters": [ { "name": "X-Townlight-Session", @@ -9006,18 +8996,8 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MeetingInput" - } - } - } - }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9038,24 +9018,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}": { - "get": { + "/desktop/v1/meetings/imports/fetch": { + "post": { "tags": [ "native-meetings" ], - "summary": "Get Meeting", - "operationId": "get_meeting_desktop_v1_meetings_meetings__meeting_id__get", + "summary": "Fetch Meeting Import", + "operationId": "fetch_meeting_import_desktop_v1_meetings_imports_fetch_post", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -9073,6 +9043,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportSourceInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -9095,13 +9075,13 @@ } } }, - "/desktop/v1/meetings/agenda-items": { + "/desktop/v1/meetings/imports/commit": { "post": { "tags": [ "native-meetings" ], - "summary": "Create Agenda Item", - "operationId": "create_agenda_item_desktop_v1_meetings_agenda_items_post", + "summary": "Commit Meeting Import", + "operationId": "commit_meeting_import_desktop_v1_meetings_imports_commit_post", "parameters": [ { "name": "X-Townlight-Session", @@ -9125,13 +9105,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AgendaInput" + "$ref": "#/components/schemas/ImportCommitInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9152,22 +9132,22 @@ } } }, - "/desktop/v1/meetings/agenda-items/{item_id}": { + "/desktop/v1/meetings/imports/{meeting_id}": { "get": { "tags": [ "native-meetings" ], - "summary": "Get Agenda Item", - "operationId": "get_agenda_item_desktop_v1_meetings_agenda_items__item_id__get", + "summary": "Get Meeting Import", + "operationId": "get_meeting_import_desktop_v1_meetings_imports__meeting_id__get", "parameters": [ { - "name": "item_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Meeting Id" } }, { @@ -9209,22 +9189,30 @@ } } }, - "/desktop/v1/meetings/agenda-items/{item_id}/reviews": { + "/desktop/v1/meetings/imports/links/{destination}": { "post": { "tags": [ "native-meetings" ], - "summary": "Record Agenda Review", - "operationId": "record_agenda_review_desktop_v1_meetings_agenda_items__item_id__reviews_post", + "summary": "Import Link Choices", + "operationId": "import_link_choices_desktop_v1_meetings_imports_links__destination__post", "parameters": [ { - "name": "item_id", + "name": "destination", "in": "path", "required": true, "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], "type": "string", - "format": "uuid", - "title": "Item Id" + "title": "Destination" } }, { @@ -9249,7 +9237,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AgendaReviewInput" + "$ref": "#/components/schemas/ImportLinkSearch" } } } @@ -9276,22 +9264,40 @@ } } }, - "/desktop/v1/meetings/agenda-items/{item_id}/meeting": { - "post": { + "/desktop/v1/meetings/imports/links/{destination}/{target_id}": { + "get": { "tags": [ "native-meetings" ], - "summary": "Assign Agenda", - "operationId": "assign_agenda_desktop_v1_meetings_agenda_items__item_id__meeting_post", + "summary": "List Import Links", + "operationId": "list_import_links_desktop_v1_meetings_imports_links__destination___target_id__get", "parameters": [ { - "name": "item_id", + "name": "destination", + "in": "path", + "required": true, + "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], + "type": "string", + "title": "Destination" + } + }, + { + "name": "target_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Target Id" } }, { @@ -9311,16 +9317,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AgendaAssignment" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -9341,24 +9337,40 @@ } } } - } - }, - "/desktop/v1/meetings/notices/{notice_id}/template": { - "get": { + }, + "post": { "tags": [ "native-meetings" ], - "summary": "Notice Template", - "operationId": "notice_template_desktop_v1_meetings_notices__notice_id__template_get", + "summary": "Create Import Link", + "operationId": "create_import_link_desktop_v1_meetings_imports_links__destination___target_id__post", "parameters": [ { - "name": "notice_id", + "name": "destination", + "in": "path", + "required": true, + "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], + "type": "string", + "title": "Destination" + } + }, + { + "name": "target_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Notice Id" + "title": "Target Id" } }, { @@ -9378,6 +9390,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportLinkInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -9400,22 +9422,22 @@ } } }, - "/desktop/v1/meetings/notices/{notice_id}/document": { + "/desktop/v1/meetings/imports/{meeting_id}/records": { "post": { "tags": [ "native-meetings" ], - "summary": "Notice Document", - "operationId": "notice_document_desktop_v1_meetings_notices__notice_id__document_post", + "summary": "Attach Import Document", + "operationId": "attach_import_document_desktop_v1_meetings_imports__meeting_id__records_post", "parameters": [ { - "name": "notice_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Notice Id" + "title": "Meeting Id" } }, { @@ -9440,7 +9462,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NoticeDocumentInput" + "$ref": "#/components/schemas/RecordsImportDocument" } } } @@ -9467,13 +9489,13 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/notice-checks": { + "/desktop/v1/meetings/meetings/{meeting_id}/stages": { "post": { "tags": [ "native-meetings" ], - "summary": "Check Notice", - "operationId": "check_notice_desktop_v1_meetings_meetings__meeting_id__notice_checks_post", + "summary": "Record Meeting Stage", + "operationId": "record_meeting_stage_desktop_v1_meetings_meetings__meeting_id__stages_post", "parameters": [ { "name": "meeting_id", @@ -9507,13 +9529,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NoticeInput" + "$ref": "#/components/schemas/MeetingStageInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9534,24 +9556,14 @@ } } }, - "/desktop/v1/meetings/notices/{notice_id}/proof": { + "/desktop/v1/meetings/meetings": { "post": { "tags": [ "native-meetings" ], - "summary": "Record Notice Proof", - "operationId": "record_notice_proof_desktop_v1_meetings_notices__notice_id__proof_post", + "summary": "Create Meeting", + "operationId": "create_meeting_desktop_v1_meetings_meetings_post", "parameters": [ - { - "name": "notice_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Notice Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -9574,13 +9586,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NoticeProofInput" + "$ref": "#/components/schemas/MeetingInput" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -9601,13 +9613,13 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/transcripts": { - "post": { + "/desktop/v1/meetings/meetings/{meeting_id}": { + "get": { "tags": [ "native-meetings" ], - "summary": "Capture Transcript", - "operationId": "capture_transcript_desktop_v1_meetings_meetings__meeting_id__transcripts_post", + "summary": "Get Meeting", + "operationId": "get_meeting_desktop_v1_meetings_meetings__meeting_id__get", "parameters": [ { "name": "meeting_id", @@ -9636,18 +9648,8 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TranscriptInput" - } - } - } - }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9668,24 +9670,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/action-items": { + "/desktop/v1/meetings/agenda-items": { "post": { "tags": [ "native-meetings" ], - "summary": "Capture Action Item", - "operationId": "capture_action_item_desktop_v1_meetings_meetings__meeting_id__action_items_post", + "summary": "Create Agenda Item", + "operationId": "create_agenda_item_desktop_v1_meetings_agenda_items_post", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -9708,7 +9700,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ActionItemInput" + "$ref": "#/components/schemas/AgendaInput" } } } @@ -9735,22 +9727,22 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/archive": { - "post": { + "/desktop/v1/meetings/agenda-items/{item_id}": { + "get": { "tags": [ "native-meetings" ], - "summary": "Archive Meeting", - "operationId": "archive_meeting_desktop_v1_meetings_meetings__meeting_id__archive_post", + "summary": "Get Agenda Item", + "operationId": "get_agenda_item_desktop_v1_meetings_agenda_items__item_id__get", "parameters": [ { - "name": "meeting_id", + "name": "item_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Meeting Id" + "title": "Item Id" } }, { @@ -9770,18 +9762,8 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ArchiveInput" - } - } - } - }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9802,22 +9784,22 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots": { + "/desktop/v1/meetings/agenda-items/{item_id}/reviews": { "post": { "tags": [ "native-meetings" ], - "summary": "Capture Packet", - "operationId": "capture_packet_desktop_v1_meetings_meetings__meeting_id__packet_snapshots_post", + "summary": "Record Agenda Review", + "operationId": "record_agenda_review_desktop_v1_meetings_agenda_items__item_id__reviews_post", "parameters": [ { - "name": "meeting_id", + "name": "item_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Meeting Id" + "title": "Item Id" } }, { @@ -9842,13 +9824,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PacketInput" + "$ref": "#/components/schemas/AgendaReviewInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9869,22 +9851,22 @@ } } }, - "/desktop/v1/meetings/packets/{packet_id}/deliver": { + "/desktop/v1/meetings/agenda-items/{item_id}/meeting": { "post": { "tags": [ "native-meetings" ], - "summary": "Export Packet", - "operationId": "export_packet_desktop_v1_meetings_packets__packet_id__deliver_post", + "summary": "Assign Agenda", + "operationId": "assign_agenda_desktop_v1_meetings_agenda_items__item_id__meeting_post", "parameters": [ { - "name": "packet_id", + "name": "item_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Packet Id" + "title": "Item Id" } }, { @@ -9904,7 +9886,17 @@ } } ], - "responses": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AgendaAssignment" + } + } + } + }, + "responses": { "200": { "description": "Successful Response", "content": { @@ -9926,22 +9918,22 @@ } } }, - "/desktop/v1/meetings/minutes/{draft_id}/decisions": { - "post": { + "/desktop/v1/meetings/notices/{notice_id}/template": { + "get": { "tags": [ "native-meetings" ], - "summary": "Decide Minutes", - "operationId": "decide_minutes_desktop_v1_meetings_minutes__draft_id__decisions_post", + "summary": "Notice Template", + "operationId": "notice_template_desktop_v1_meetings_notices__notice_id__template_get", "parameters": [ { - "name": "draft_id", + "name": "notice_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Draft Id" + "title": "Notice Id" } }, { @@ -9961,16 +9953,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MinutesDecision" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -9993,22 +9975,22 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/motions": { + "/desktop/v1/meetings/notices/{notice_id}/document": { "post": { "tags": [ "native-meetings" ], - "summary": "Capture Motion", - "operationId": "capture_motion_desktop_v1_meetings_meetings__meeting_id__motions_post", + "summary": "Notice Document", + "operationId": "notice_document_desktop_v1_meetings_notices__notice_id__document_post", "parameters": [ { - "name": "meeting_id", + "name": "notice_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Meeting Id" + "title": "Notice Id" } }, { @@ -10033,13 +10015,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MotionInput" + "$ref": "#/components/schemas/NoticeDocumentInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -10060,22 +10042,22 @@ } } }, - "/desktop/v1/meetings/motions/{motion_id}/corrections": { + "/desktop/v1/meetings/meetings/{meeting_id}/notice-checks": { "post": { "tags": [ "native-meetings" ], - "summary": "Correct Motion", - "operationId": "correct_motion_desktop_v1_meetings_motions__motion_id__corrections_post", + "summary": "Check Notice", + "operationId": "check_notice_desktop_v1_meetings_meetings__meeting_id__notice_checks_post", "parameters": [ { - "name": "motion_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Motion Id" + "title": "Meeting Id" } }, { @@ -10100,7 +10082,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MotionCorrection" + "$ref": "#/components/schemas/NoticeInput" } } } @@ -10127,22 +10109,22 @@ } } }, - "/desktop/v1/meetings/motions/{motion_id}/votes": { + "/desktop/v1/meetings/notices/{notice_id}/proof": { "post": { "tags": [ "native-meetings" ], - "summary": "Capture Vote", - "operationId": "capture_vote_desktop_v1_meetings_motions__motion_id__votes_post", + "summary": "Record Notice Proof", + "operationId": "record_notice_proof_desktop_v1_meetings_notices__notice_id__proof_post", "parameters": [ { - "name": "motion_id", + "name": "notice_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Motion Id" + "title": "Notice Id" } }, { @@ -10167,13 +10149,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/VoteInput" + "$ref": "#/components/schemas/NoticeProofInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -10194,22 +10176,22 @@ } } }, - "/desktop/v1/meetings/votes/{vote_id}/corrections": { + "/desktop/v1/meetings/meetings/{meeting_id}/transcripts": { "post": { "tags": [ "native-meetings" ], - "summary": "Correct Vote", - "operationId": "correct_vote_desktop_v1_meetings_votes__vote_id__corrections_post", + "summary": "Capture Transcript", + "operationId": "capture_transcript_desktop_v1_meetings_meetings__meeting_id__transcripts_post", "parameters": [ { - "name": "vote_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Vote Id" + "title": "Meeting Id" } }, { @@ -10234,7 +10216,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/VoteCorrection" + "$ref": "#/components/schemas/TranscriptInput" } } } @@ -10261,13 +10243,13 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts": { + "/desktop/v1/meetings/meetings/{meeting_id}/action-items": { "post": { "tags": [ "native-meetings" ], - "summary": "Create Minutes", - "operationId": "create_minutes_desktop_v1_meetings_meetings__meeting_id__minutes_drafts_post", + "summary": "Capture Action Item", + "operationId": "capture_action_item_desktop_v1_meetings_meetings__meeting_id__action_items_post", "parameters": [ { "name": "meeting_id", @@ -10301,7 +10283,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DraftInput" + "$ref": "#/components/schemas/ActionItemInput" } } } @@ -10328,13 +10310,13 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/proceedings": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/archive": { + "post": { "tags": [ "native-meetings" ], - "summary": "Proceedings", - "operationId": "proceedings_desktop_v1_meetings_meetings__meeting_id__proceedings_get", + "summary": "Archive Meeting", + "operationId": "archive_meeting_desktop_v1_meetings_meetings__meeting_id__archive_post", "parameters": [ { "name": "meeting_id", @@ -10363,8 +10345,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArchiveInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10385,15 +10377,24 @@ } } }, - "/desktop/v1/meetings/station/catalog": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots": { + "post": { "tags": [ "native-meetings" ], - "summary": "Station Catalog", - "description": "Authorized name-based operator selection from canonical Meetings data.", - "operationId": "station_catalog_desktop_v1_meetings_station_catalog_get", + "summary": "Capture Packet", + "operationId": "capture_packet_desktop_v1_meetings_meetings__meeting_id__packet_snapshots_post", "parameters": [ + { + "name": "meeting_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10411,8 +10412,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PacketInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10433,22 +10444,38 @@ } } }, - "/public/meetings": { - "get": { + "/desktop/v1/meetings/packets/{packet_id}/deliver": { + "post": { "tags": [ - "public-meetings" + "native-meetings" ], - "summary": "Public Archive Index", - "operationId": "public_archive_index_public_meetings_get", + "summary": "Export Packet", + "operationId": "export_packet_desktop_v1_meetings_packets__packet_id__deliver_post", "parameters": [ { - "name": "q", - "in": "query", - "required": false, + "name": "packet_id", + "in": "path", + "required": true, "schema": { "type": "string", - "default": "", - "title": "Q" + "format": "uuid", + "title": "Packet Id" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" } } ], @@ -10456,10 +10483,8 @@ "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -10476,33 +10501,57 @@ } } }, - "/public/meetings/{record_id}": { - "get": { + "/desktop/v1/meetings/minutes/{draft_id}/decisions": { + "post": { "tags": [ - "public-meetings" + "native-meetings" ], - "summary": "Public Archive Detail", - "operationId": "public_archive_detail_public_meetings__record_id__get", + "summary": "Decide Minutes", + "operationId": "decide_minutes_desktop_v1_meetings_minutes__draft_id__decisions_post", "parameters": [ { - "name": "record_id", + "name": "draft_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Record Id" + "title": "Draft Id" + } + }, + { + "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/MinutesDecision" + } + } + } + }, "responses": { "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -10519,41 +10568,53 @@ } } }, - "/public/meetings/{record_id}/{kind}.txt": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/motions": { + "post": { "tags": [ - "public-meetings" + "native-meetings" ], - "summary": "Public Archive Download", - "operationId": "public_archive_download_public_meetings__record_id___kind__txt_get", + "summary": "Capture Motion", + "operationId": "capture_motion_desktop_v1_meetings_meetings__meeting_id__motions_post", "parameters": [ { - "name": "record_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Record Id" + "title": "Meeting Id" } }, { - "name": "kind", - "in": "path", - "required": true, + "name": "X-Townlight-Session", + "in": "header", + "required": false, "schema": { - "enum": [ - "agenda", - "packet", - "minutes" + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } ], - "type": "string", - "title": "Kind" + "title": "X-Townlight-Session" } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MotionInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10574,14 +10635,24 @@ } } }, - "/desktop/v1/code/imports": { + "/desktop/v1/meetings/motions/{motion_id}/corrections": { "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Imports", - "operationId": "imports_desktop_v1_code_imports_post", + "summary": "Correct Motion", + "operationId": "correct_motion_desktop_v1_meetings_motions__motion_id__corrections_post", "parameters": [ + { + "name": "motion_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Motion Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10604,13 +10675,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ImportBundleCreate" + "$ref": "#/components/schemas/MotionCorrection" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10629,14 +10700,26 @@ } } } - }, - "get": { + } + }, + "/desktop/v1/meetings/motions/{motion_id}/votes": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "List Imports", - "operationId": "list_imports_desktop_v1_code_imports_get", + "summary": "Capture Vote", + "operationId": "capture_vote_desktop_v1_meetings_motions__motion_id__votes_post", "parameters": [ + { + "name": "motion_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Motion Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10654,8 +10737,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VoteInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10676,14 +10769,24 @@ } } }, - "/desktop/v1/code/sources": { - "get": { + "/desktop/v1/meetings/votes/{vote_id}/corrections": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Sources", - "operationId": "sources_desktop_v1_code_sources_get", + "summary": "Correct Vote", + "operationId": "correct_vote_desktop_v1_meetings_votes__vote_id__corrections_post", "parameters": [ + { + "name": "vote_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Vote Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10701,8 +10804,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VoteCorrection" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10723,14 +10836,24 @@ } } }, - "/desktop/v1/code/workspace": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Workspace", - "operationId": "workspace_desktop_v1_code_workspace_get", + "summary": "Create Minutes", + "operationId": "create_minutes_desktop_v1_meetings_meetings__meeting_id__minutes_drafts_post", "parameters": [ + { + "name": "meeting_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10748,8 +10871,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DraftInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10770,38 +10903,22 @@ } } }, - "/desktop/v1/code/lookup": { + "/desktop/v1/meetings/meetings/{meeting_id}/proceedings": { "get": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Lookup", - "operationId": "lookup_desktop_v1_code_lookup_get", + "summary": "Proceedings", + "operationId": "proceedings_desktop_v1_meetings_meetings__meeting_id__proceedings_get", "parameters": [ { - "name": "section_number", - "in": "query", + "name": "meeting_id", + "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Number" - } - }, - { - "name": "as_of", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "As Of" + "format": "uuid", + "title": "Meeting Id" } }, { @@ -10843,23 +10960,15 @@ } } }, - "/desktop/v1/code/sections/{section_id}/history": { + "/desktop/v1/meetings/station/catalog": { "get": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Section History", - "operationId": "section_history_desktop_v1_code_sections__section_id__history_get", + "summary": "Station Catalog", + "description": "Authorized name-based operator selection from canonical Meetings data.", + "operationId": "station_catalog_desktop_v1_meetings_station_catalog_get", "parameters": [ - { - "name": "section_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Section Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -10899,54 +11008,22 @@ } } }, - "/desktop/v1/code/citation": { + "/public/meetings/data/index": { "get": { "tags": [ - "native-code" + "public-meetings" ], - "summary": "Citation", - "operationId": "citation_desktop_v1_code_citation_get", + "summary": "Public Archive Data", + "operationId": "public_archive_data_public_meetings_data_index_get", "parameters": [ { - "name": "section_number", - "in": "query", - "required": true, - "schema": { - "type": "string", - "title": "Section Number" - } - }, - { - "name": "as_of", + "name": "q", "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "As Of" - } - }, - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" + "type": "string", + "default": "", + "title": "Q" } } ], @@ -10972,37 +11049,22 @@ } } }, - "/desktop/v1/code/search": { + "/public/meetings/data/{record_id}": { "get": { "tags": [ - "native-code" + "public-meetings" ], - "summary": "Search", - "operationId": "search_desktop_v1_code_search_get", + "summary": "Public Archive Record Data", + "operationId": "public_archive_record_data_public_meetings_data__record_id__get", "parameters": [ { - "name": "q", - "in": "query", + "name": "record_id", + "in": "path", "required": true, "schema": { "type": "string", - "title": "Q" - } - }, - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" + "format": "uuid", + "title": "Record Id" } } ], @@ -11028,37 +11090,65 @@ } } }, - "/desktop/v1/code/imports/{job_id}/tree": { + "/public/meetings": { "get": { "tags": [ - "native-code" + "public-meetings" ], - "summary": "Import Tree", - "operationId": "import_tree_desktop_v1_code_imports__job_id__tree_get", + "summary": "Public Archive Index", + "operationId": "public_archive_index_public_meetings_get", "parameters": [ { - "name": "job_id", - "in": "path", - "required": true, + "name": "q", + "in": "query", + "required": false, "schema": { "type": "string", - "title": "Job Id" + "default": "", + "title": "Q" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } } }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/public/meetings/{record_id}": { + "get": { + "tags": [ + "public-meetings" + ], + "summary": "Public Archive Detail", + "operationId": "public_archive_detail_public_meetings__record_id__get", + "parameters": [ { - "name": "X-Townlight-Session", - "in": "header", - "required": false, + "name": "record_id", + "in": "path", + "required": true, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" + "type": "string", + "format": "uuid", + "title": "Record Id" } } ], @@ -11066,8 +11156,10 @@ "200": { "description": "Successful Response", "content": { - "application/json": { - "schema": {} + "text/html": { + "schema": { + "type": "string" + } } } }, @@ -11084,37 +11176,36 @@ } } }, - "/desktop/v1/code/imports/{job_id}/provenance": { + "/public/meetings/{record_id}/{kind}.txt": { "get": { "tags": [ - "native-code" + "public-meetings" ], - "summary": "Import Provenance", - "operationId": "import_provenance_desktop_v1_code_imports__job_id__provenance_get", + "summary": "Public Archive Download", + "operationId": "public_archive_download_public_meetings__record_id___kind__txt_get", "parameters": [ { - "name": "job_id", + "name": "record_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Job Id" + "format": "uuid", + "title": "Record Id" } }, { - "name": "X-Townlight-Session", - "in": "header", - "required": false, + "name": "kind", + "in": "path", + "required": true, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "enum": [ + "agenda", + "packet", + "minutes" ], - "title": "X-Townlight-Session" + "type": "string", + "title": "Kind" } } ], @@ -11140,38 +11231,23 @@ } } }, - "/desktop/v1/code/export": { + "/desktop/v1/portal/selections": { "get": { "tags": [ - "native-code" + "portal-publication" ], - "summary": "Export Section", - "operationId": "export_section_desktop_v1_code_export_get", + "summary": "Selections", + "description": "Find reviewed choices without exposing SQL, private text or file paths.", + "operationId": "selections_desktop_v1_portal_selections_get", "parameters": [ { - "name": "section_ref", + "name": "request_id", "in": "query", "required": true, "schema": { "type": "string", - "title": "Section Ref" - } - }, - { - "name": "as_of", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "As Of" + "format": "uuid", + "title": "Request Id" } }, { @@ -11213,13 +11289,13 @@ } } }, - "/desktop/v1/code/questions": { + "/desktop/v1/portal/bundle": { "post": { "tags": [ - "native-code" + "portal-publication" ], - "summary": "Questions", - "operationId": "questions_desktop_v1_code_questions_post", + "summary": "Bundle", + "operationId": "bundle_desktop_v1_portal_bundle_post", "parameters": [ { "name": "X-Townlight-Session", @@ -11243,7 +11319,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/QuestionAnswerRequest" + "$ref": "#/components/schemas/townlight_runtime__portal_publication__Selection" } } } @@ -11270,23 +11346,14 @@ } } }, - "/desktop/v1/code/sections/{section_id}/notes": { + "/desktop/v1/code/imports": { "post": { "tags": [ "native-code" ], - "summary": "Create Note", - "operationId": "create_note_desktop_v1_code_sections__section_id__notes_post", + "summary": "Imports", + "operationId": "imports_desktop_v1_code_imports_post", "parameters": [ - { - "name": "section_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Section Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11309,7 +11376,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InterpretationNoteCreate" + "$ref": "#/components/schemas/ImportBundleCreate" } } } @@ -11339,18 +11406,9 @@ "tags": [ "native-code" ], - "summary": "List Notes", - "operationId": "list_notes_desktop_v1_code_sections__section_id__notes_get", + "summary": "List Imports", + "operationId": "list_imports_desktop_v1_code_imports_get", "parameters": [ - { - "name": "section_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Section Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11390,23 +11448,14 @@ } } }, - "/desktop/v1/code/sections/{section_id}/summaries": { - "post": { + "/desktop/v1/code/sources": { + "get": { "tags": [ "native-code" ], - "summary": "Create Summary", - "operationId": "create_summary_desktop_v1_code_sections__section_id__summaries_post", + "summary": "Sources", + "operationId": "sources_desktop_v1_code_sources_get", "parameters": [ - { - "name": "section_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Section Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11424,16 +11473,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PlainLanguageSummaryCreate" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -11454,23 +11493,16 @@ } } } - }, + } + }, + "/desktop/v1/code/workspace": { "get": { "tags": [ "native-code" ], - "summary": "List Summaries", - "operationId": "list_summaries_desktop_v1_code_sections__section_id__summaries_get", + "summary": "Workspace", + "operationId": "workspace_desktop_v1_code_workspace_get", "parameters": [ - { - "name": "section_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Section Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11510,21 +11542,38 @@ } } }, - "/desktop/v1/code/summaries/{summary_id}/approve": { - "post": { + "/desktop/v1/code/lookup": { + "get": { "tags": [ "native-code" ], - "summary": "Approve Summary", - "operationId": "approve_summary_desktop_v1_code_summaries__summary_id__approve_post", + "summary": "Lookup", + "operationId": "lookup_desktop_v1_code_lookup_get", "parameters": [ { - "name": "summary_id", - "in": "path", + "name": "section_number", + "in": "query", "required": true, "schema": { "type": "string", - "title": "Summary Id" + "title": "Section Number" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" } }, { @@ -11566,11 +11615,23 @@ } } }, - "/desktop/v1/code/connections": { + "/desktop/v1/code/sections/{section_id}/history": { "get": { - "summary": "List Connections", - "operationId": "list_connections_desktop_v1_code_connections_get", + "tags": [ + "native-code" + ], + "summary": "Section History", + "operationId": "section_history_desktop_v1_code_sections__section_id__history_get", "parameters": [ + { + "name": "section_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -11608,11 +11669,42 @@ } } } - }, - "post": { - "summary": "Create Connection", - "operationId": "create_connection_desktop_v1_code_connections_post", + } + }, + "/desktop/v1/code/citation": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Citation", + "operationId": "citation_desktop_v1_code_citation_get", "parameters": [ + { + "name": "section_number", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Section Number" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -11630,16 +11722,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Proposal" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -11662,19 +11744,21 @@ } } }, - "/desktop/v1/code/connections/{connection_id}": { + "/desktop/v1/code/search": { "get": { - "summary": "Get Connection", - "operationId": "get_connection_desktop_v1_code_connections__connection_id__get", + "tags": [ + "native-code" + ], + "summary": "Search", + "operationId": "search_desktop_v1_code_search_get", "parameters": [ { - "name": "connection_id", - "in": "path", + "name": "q", + "in": "query", "required": true, "schema": { "type": "string", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "title": "Connection Id" + "title": "Q" } }, { @@ -11716,19 +11800,21 @@ } } }, - "/desktop/v1/code/connections/{connection_id}/closeout": { - "post": { - "summary": "Closeout Connection", - "operationId": "closeout_connection_desktop_v1_code_connections__connection_id__closeout_post", + "/desktop/v1/code/imports/{job_id}/tree": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Import Tree", + "operationId": "import_tree_desktop_v1_code_imports__job_id__tree_get", "parameters": [ { - "name": "connection_id", + "name": "job_id", "in": "path", "required": true, "schema": { "type": "string", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "title": "Connection Id" + "title": "Job Id" } }, { @@ -11748,16 +11834,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Closeout" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -11780,11 +11856,23 @@ } } }, - "/desktop/v1/meetings/code-connections": { + "/desktop/v1/code/imports/{job_id}/provenance": { "get": { - "summary": "List Code Connections", - "operationId": "list_code_connections_desktop_v1_meetings_code_connections_get", + "tags": [ + "native-code" + ], + "summary": "Import Provenance", + "operationId": "import_provenance_desktop_v1_code_imports__job_id__provenance_get", "parameters": [ + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Job Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -11824,19 +11912,38 @@ } } }, - "/desktop/v1/meetings/code-connections/{connection_id}": { + "/desktop/v1/code/export": { "get": { - "summary": "Get Code Connection", - "operationId": "get_code_connection_desktop_v1_meetings_code_connections__connection_id__get", + "tags": [ + "native-code" + ], + "summary": "Export Section", + "operationId": "export_section_desktop_v1_code_export_get", "parameters": [ { - "name": "connection_id", - "in": "path", + "name": "section_ref", + "in": "query", "required": true, "schema": { "type": "string", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "title": "Connection Id" + "title": "Section Ref" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" } }, { @@ -11878,21 +11985,14 @@ } } }, - "/desktop/v1/meetings/code-connections/{connection_id}/decisions": { + "/desktop/v1/code/questions": { "post": { - "summary": "Record Decision", - "operationId": "record_decision_desktop_v1_meetings_code_connections__connection_id__decisions_post", + "tags": [ + "native-code" + ], + "summary": "Questions", + "operationId": "questions_desktop_v1_code_questions_post", "parameters": [ - { - "name": "connection_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "title": "Connection Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11915,7 +12015,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Decision" + "$ref": "#/components/schemas/QuestionAnswerRequest" } } } @@ -11942,48 +12042,56 @@ } } }, - "/townlight_code": { - "get": { - "summary": "Home", - "operationId": "home_townlight_code_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/html": { - "schema": { - "type": "string" - } - } - } - } - } - } - }, - "/townlight_code/search": { - "get": { - "summary": "Search", - "operationId": "search_townlight_code_search_get", + "/desktop/v1/code/sections/{section_id}/notes": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Create Note", + "operationId": "create_note_desktop_v1_code_sections__section_id__notes_post", "parameters": [ { - "name": "q", - "in": "query", - "required": false, + "name": "section_id", + "in": "path", + "required": true, "schema": { "type": "string", - "default": "", - "title": "Q" + "title": "Section Id" + } + }, + { + "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/InterpretationNoteCreate" + } + } + } + }, "responses": { "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -11998,26 +12106,26 @@ } } } - } - }, - "/townlight_code/answer": { + }, "get": { - "summary": "Answer", - "operationId": "answer_townlight_code_answer_get", - "parameters": [ - { - "name": "q", - "in": "query", - "required": false, + "tags": [ + "native-code" + ], + "summary": "List Notes", + "operationId": "list_notes_desktop_v1_code_sections__section_id__notes_get", + "parameters": [ + { + "name": "section_id", + "in": "path", + "required": true, "schema": { "type": "string", - "default": "", - "title": "Q" + "title": "Section Id" } }, { - "name": "section_number", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { "anyOf": [ @@ -12028,35 +12136,82 @@ "type": "null" } ], - "title": "Section Number" + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/sections/{section_id}/summaries": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Create Summary", + "operationId": "create_summary_desktop_v1_code_sections__section_id__summaries_post", + "parameters": [ + { + "name": "section_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Id" } }, { - "name": "as_of", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { "anyOf": [ { - "type": "string", - "format": "date" + "type": "string" }, { "type": "null" } ], - "title": "As Of" + "title": "X-Townlight-Session" } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PlainLanguageSummaryCreate" + } + } + } + }, "responses": { "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -12071,37 +12226,37 @@ } } } - } - }, - "/townlight_code/sections/{section_ref}": { + }, "get": { - "summary": "Detail", - "operationId": "detail_townlight_code_sections__section_ref__get", + "tags": [ + "native-code" + ], + "summary": "List Summaries", + "operationId": "list_summaries_desktop_v1_code_sections__section_id__summaries_get", "parameters": [ { - "name": "section_ref", + "name": "section_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Ref" + "title": "Section Id" } }, { - "name": "as_of", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { "anyOf": [ { - "type": "string", - "format": "date" + "type": "string" }, { "type": "null" } ], - "title": "As Of" + "title": "X-Townlight-Session" } } ], @@ -12109,10 +12264,8 @@ "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -12129,35 +12282,37 @@ } } }, - "/townlight_code/sections/{section_ref}/export": { - "get": { - "summary": "Export", - "operationId": "export_townlight_code_sections__section_ref__export_get", + "/desktop/v1/code/summaries/{summary_id}/approve": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Approve Summary", + "operationId": "approve_summary_desktop_v1_code_summaries__summary_id__approve_post", "parameters": [ { - "name": "section_ref", + "name": "summary_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Ref" + "title": "Summary Id" } }, { - "name": "as_of", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { "anyOf": [ { - "type": "string", - "format": "date" + "type": "string" }, { "type": "null" } ], - "title": "As Of" + "title": "X-Townlight-Session" } } ], @@ -12165,10 +12320,8 @@ "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -12185,13 +12338,10 @@ } } }, - "/desktop/v1/zoning/imports": { - "post": { - "tags": [ - "native-zoning" - ], - "summary": "Imports", - "operationId": "imports_desktop_v1_zoning_imports_post", + "/desktop/v1/code/connections": { + "get": { + "summary": "List Connections", + "operationId": "list_connections_desktop_v1_code_connections_get", "parameters": [ { "name": "X-Townlight-Session", @@ -12210,18 +12360,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": true, - "title": "Payload" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12242,15 +12380,10 @@ } } } - } - }, - "/desktop/v1/zoning/parcels/lookup": { + }, "post": { - "tags": [ - "native-zoning" - ], - "summary": "Parcel Lookup", - "operationId": "parcel_lookup_desktop_v1_zoning_parcels_lookup_post", + "summary": "Create Connection", + "operationId": "create_connection_desktop_v1_code_connections_post", "parameters": [ { "name": "X-Townlight-Session", @@ -12274,7 +12407,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/_ParcelLookupIn" + "$ref": "#/components/schemas/Proposal" } } } @@ -12301,22 +12434,19 @@ } } }, - "/desktop/v1/zoning/questions/{question_id}/history": { + "/desktop/v1/code/connections/{connection_id}": { "get": { - "tags": [ - "native-zoning" - ], - "summary": "Question History", - "operationId": "question_history_desktop_v1_zoning_questions__question_id__history_get", + "summary": "Get Connection", + "operationId": "get_connection_desktop_v1_code_connections__connection_id__get", "parameters": [ { - "name": "question_id", + "name": "connection_id", "in": "path", "required": true, "schema": { "type": "string", - "format": "uuid", - "title": "Question Id" + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Connection Id" } }, { @@ -12358,14 +12488,21 @@ } } }, - "/desktop/v1/zoning/meetings/search": { + "/desktop/v1/code/connections/{connection_id}/closeout": { "post": { - "tags": [ - "native-zoning" - ], - "summary": "Search Meetings", - "operationId": "search_meetings_desktop_v1_zoning_meetings_search_post", + "summary": "Closeout Connection", + "operationId": "closeout_connection_desktop_v1_code_connections__connection_id__closeout_post", "parameters": [ + { + "name": "connection_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Connection Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -12388,7 +12525,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MeetingSearch" + "$ref": "#/components/schemas/Closeout" } } } @@ -12415,24 +12552,11 @@ } } }, - "/desktop/v1/zoning/questions/{question_id}/meetings": { - "post": { - "tags": [ - "native-zoning" - ], - "summary": "Link Meeting", - "operationId": "link_meeting_desktop_v1_zoning_questions__question_id__meetings_post", + "/desktop/v1/meetings/code-connections": { + "get": { + "summary": "List Code Connections", + "operationId": "list_code_connections_desktop_v1_meetings_code_connections_get", "parameters": [ - { - "name": "question_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Question Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -12450,16 +12574,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MeetingLink" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12482,22 +12596,19 @@ } } }, - "/desktop/v1/zoning/questions/{question_id}/snapshots": { - "post": { - "tags": [ - "native-zoning" - ], - "summary": "Create Snapshot", - "operationId": "create_snapshot_desktop_v1_zoning_questions__question_id__snapshots_post", + "/desktop/v1/meetings/code-connections/{connection_id}": { + "get": { + "summary": "Get Code Connection", + "operationId": "get_code_connection_desktop_v1_meetings_code_connections__connection_id__get", "parameters": [ { - "name": "question_id", + "name": "connection_id", "in": "path", "required": true, "schema": { "type": "string", - "format": "uuid", - "title": "Question Id" + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Connection Id" } }, { @@ -12517,16 +12628,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SourceSnapshot" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12549,14 +12650,21 @@ } } }, - "/desktop/v1/zoning/rules": { + "/desktop/v1/meetings/code-connections/{connection_id}/decisions": { "post": { - "tags": [ - "native-zoning" - ], - "summary": "Create Rule", - "operationId": "create_rule_desktop_v1_zoning_rules_post", + "summary": "Record Decision", + "operationId": "record_decision_desktop_v1_meetings_code_connections__connection_id__decisions_post", "parameters": [ + { + "name": "connection_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Connection Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -12579,7 +12687,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Rule" + "$ref": "#/components/schemas/Decision" } } } @@ -12606,41 +12714,22 @@ } } }, - "/desktop/v1/zoning/questions": { - "post": { - "tags": [ - "native-zoning" - ], - "summary": "Create Question", - "operationId": "create_question_desktop_v1_zoning_questions_post", + "/townlight_code/public-data/search": { + "get": { + "summary": "Search Data", + "operationId": "search_data_townlight_code_public_data_search_get", "parameters": [ { - "name": "X-Townlight-Session", - "in": "header", + "name": "q", + "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" + "type": "string", + "default": "", + "title": "Q" } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Question" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12663,28 +12752,35 @@ } } }, - "/desktop/v1/zoning/workspace": { + "/townlight_code/public-data/section": { "get": { - "tags": [ - "native-zoning" - ], - "summary": "Get Workspace", - "operationId": "get_workspace_desktop_v1_zoning_workspace_get", + "summary": "Section Data", + "operationId": "section_data_townlight_code_public_data_section_get", "parameters": [ { - "name": "X-Townlight-Session", - "in": "header", + "name": "section_number", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Section Number" + } + }, + { + "name": "as_of", + "in": "query", "required": false, "schema": { "anyOf": [ { - "type": "string" + "type": "string", + "format": "date" }, { "type": "null" } ], - "title": "X-Townlight-Session" + "title": "As Of" } } ], @@ -12710,51 +12806,38 @@ } } }, - "/desktop/v1/zoning/questions/{question_id}/reviews": { - "post": { - "tags": [ - "native-zoning" - ], - "summary": "Create Review", - "operationId": "create_review_desktop_v1_zoning_questions__question_id__reviews_post", + "/townlight_code/public-data/export": { + "get": { + "summary": "Export Data", + "operationId": "export_data_townlight_code_public_data_export_get", "parameters": [ { - "name": "question_id", - "in": "path", + "name": "section_number", + "in": "query", "required": true, "schema": { "type": "string", - "format": "uuid", - "title": "Question Id" + "title": "Section Number" } }, { - "name": "X-Townlight-Session", - "in": "header", + "name": "as_of", + "in": "query", "required": false, "schema": { "anyOf": [ { - "type": "string" + "type": "string", + "format": "date" }, { "type": "null" } ], - "title": "X-Townlight-Session" + "title": "As Of" } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/townlight_runtime__zoning_bridge__Review" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12777,17 +12860,23 @@ } } }, - "/desktop/v1/zoning/outlines": { - "post": { - "tags": [ - "native-zoning" - ], - "summary": "Create Outline", - "operationId": "create_outline_desktop_v1_zoning_outlines_post", + "/townlight_code/public-data/answer": { + "get": { + "summary": "Answer Data", + "operationId": "answer_data_townlight_code_public_data_answer_get", "parameters": [ { - "name": "X-Townlight-Session", - "in": "header", + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Q" + } + }, + { + "name": "section_number", + "in": "query", "required": false, "schema": { "anyOf": [ @@ -12798,20 +12887,27 @@ "type": "null" } ], - "title": "X-Townlight-Session" + "title": "Section Number" } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Outline" - } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" } } - }, + ], "responses": { "200": { "description": "Successful Response", @@ -12834,47 +12930,48 @@ } } }, - "/desktop/v1/zoning/code-context": { - "post": { - "tags": [ - "native-zoning" - ], - "summary": "Create Code Context", - "operationId": "create_code_context_desktop_v1_zoning_code_context_post", + "/townlight_code": { + "get": { + "summary": "Home", + "operationId": "home_townlight_code_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/townlight_code/search": { + "get": { + "summary": "Search", + "operationId": "search_townlight_code_search_get", "parameters": [ { - "name": "X-Townlight-Session", - "in": "header", + "name": "q", + "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" + "type": "string", + "default": "", + "title": "Q" } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeContext" - } - } - } - }, "responses": { "200": { "description": "Successful Response", "content": { - "application/json": { - "schema": {} + "text/html": { + "schema": { + "type": "string" + } } } }, @@ -12891,18 +12988,24 @@ } } }, - "/desktop/v1/zoning/standards/process-explanation": { - "post": { - "tags": [ - "native-zoning" - ], - "summary": "Standards Explanation", - "description": "Cited variance/CUP/nonconformity process; never a determination.", - "operationId": "standards_explanation_desktop_v1_zoning_standards_process_explanation_post", + "/townlight_code/answer": { + "get": { + "summary": "Answer", + "operationId": "answer_townlight_code_answer_get", "parameters": [ { - "name": "X-Townlight-Session", - "in": "header", + "name": "q", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "", + "title": "Q" + } + }, + { + "name": "section_number", + "in": "query", "required": false, "schema": { "anyOf": [ @@ -12913,26 +13016,35 @@ "type": "null" } ], - "title": "X-Townlight-Session" + "title": "Section Number" } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/StandardsExplanation" - } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" } } - }, + ], "responses": { "200": { "description": "Successful Response", "content": { - "application/json": { - "schema": {} + "text/html": { + "schema": { + "type": "string" + } } } }, @@ -12949,26 +13061,46 @@ } } }, - "/townlight_zoning/questions": { - "post": { - "summary": "Public Question", - "operationId": "public_question_townlight_zoning_questions_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Question" - } + "/townlight_code/sections/{section_ref}": { + "get": { + "summary": "Detail", + "operationId": "detail_townlight_code_sections__section_ref__get", + "parameters": [ + { + "name": "section_ref", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Ref" } }, - "required": true - }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + } + ], "responses": { "200": { "description": "Successful Response", "content": { - "application/json": { - "schema": {} + "text/html": { + "schema": { + "type": "string" + } } } }, @@ -12985,26 +13117,46 @@ } } }, - "/townlight_zoning/parcels/lookup": { - "post": { - "summary": "Public Parcel Lookup", - "operationId": "public_parcel_lookup_townlight_zoning_parcels_lookup_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/_ParcelLookupIn" - } + "/townlight_code/sections/{section_ref}/export": { + "get": { + "summary": "Export", + "operationId": "export_townlight_code_sections__section_ref__export_get", + "parameters": [ + { + "name": "section_ref", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Ref" } }, - "required": true - }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + } + ], "responses": { "200": { "description": "Successful Response", "content": { - "application/json": { - "schema": {} + "text/html": { + "schema": { + "type": "string" + } } } }, @@ -13021,13 +13173,13 @@ } } }, - "/desktop/v1/planning/imports/preview": { + "/desktop/v1/zoning/imports": { "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Preview Import", - "operationId": "preview_import_desktop_v1_planning_imports_preview_post", + "summary": "Imports", + "operationId": "imports_desktop_v1_zoning_imports_post", "parameters": [ { "name": "X-Townlight-Session", @@ -13051,7 +13203,9 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" + "type": "object", + "additionalProperties": true, + "title": "Payload" } } } @@ -13078,13 +13232,13 @@ } } }, - "/desktop/v1/planning/imports": { + "/desktop/v1/zoning/parcels/lookup": { "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Import Source", - "operationId": "import_source_desktop_v1_planning_imports_post", + "summary": "Parcel Lookup", + "operationId": "parcel_lookup_desktop_v1_zoning_parcels_lookup_post", "parameters": [ { "name": "X-Townlight-Session", @@ -13108,7 +13262,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" + "$ref": "#/components/schemas/_ParcelLookupIn" } } } @@ -13135,36 +13289,22 @@ } } }, - "/desktop/v1/planning/sources": { + "/desktop/v1/zoning/questions/{question_id}/history": { "get": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Source List", - "operationId": "source_list_desktop_v1_planning_sources_get", + "summary": "Question History", + "operationId": "question_history_desktop_v1_zoning_questions__question_id__history_get", "parameters": [ { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - }, - { - "name": "offset", - "in": "query", - "required": false, + "name": "question_id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" + "type": "string", + "format": "uuid", + "title": "Question Id" } }, { @@ -13206,35 +13346,14 @@ } } }, - "/desktop/v1/planning/sources/{plan_id}/history": { - "get": { + "/desktop/v1/zoning/meetings/search": { + "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Source History", - "operationId": "source_history_desktop_v1_planning_sources__plan_id__history_get", + "summary": "Search Meetings", + "operationId": "search_meetings_desktop_v1_zoning_meetings_search_post", "parameters": [ - { - "name": "plan_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Plan Id" - } - }, - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -13252,6 +13371,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MeetingSearch" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -13274,22 +13403,22 @@ } } }, - "/desktop/v1/planning/revisions/{revision_id}": { - "get": { + "/desktop/v1/zoning/questions/{question_id}/meetings": { + "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Revision", - "operationId": "revision_desktop_v1_planning_revisions__revision_id__get", + "summary": "Link Meeting", + "operationId": "link_meeting_desktop_v1_zoning_questions__question_id__meetings_post", "parameters": [ { - "name": "revision_id", + "name": "question_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Revision Id" + "title": "Question Id" } }, { @@ -13309,6 +13438,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MeetingLink" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -13331,31 +13470,22 @@ } } }, - "/desktop/v1/planning/revisions/{revision_id}/documents/{document_id}": { - "get": { + "/desktop/v1/zoning/questions/{question_id}/snapshots": { + "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Staff Original", - "operationId": "staff_original_desktop_v1_planning_revisions__revision_id__documents__document_id__get", + "summary": "Create Snapshot", + "operationId": "create_snapshot_desktop_v1_zoning_questions__question_id__snapshots_post", "parameters": [ { - "name": "revision_id", + "name": "question_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Revision Id" - } - }, - { - "name": "document_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Document Id" + "title": "Question Id" } }, { @@ -13375,6 +13505,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SourceSnapshot" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -13397,13 +13537,13 @@ } } }, - "/desktop/v1/planning/policies/search": { + "/desktop/v1/zoning/rules": { "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Policies", - "operationId": "policies_desktop_v1_planning_policies_search_post", + "summary": "Create Rule", + "operationId": "create_rule_desktop_v1_zoning_rules_post", "parameters": [ { "name": "X-Townlight-Session", @@ -13427,7 +13567,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" + "$ref": "#/components/schemas/Rule" } } } @@ -13454,38 +13594,14 @@ } } }, - "/desktop/v1/planning/analyses": { - "get": { + "/desktop/v1/zoning/questions": { + "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Analyses", - "operationId": "analyses_desktop_v1_planning_analyses_get", + "summary": "Create Question", + "operationId": "create_question_desktop_v1_zoning_questions_post", "parameters": [ - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - }, - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -13503,6 +13619,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Question" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -13523,13 +13649,15 @@ } } } - }, - "post": { + } + }, + "/desktop/v1/zoning/workspace": { + "get": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Create Analysis", - "operationId": "create_analysis_desktop_v1_planning_analyses_post", + "summary": "Get Workspace", + "operationId": "get_workspace_desktop_v1_zoning_workspace_get", "parameters": [ { "name": "X-Townlight-Session", @@ -13548,18 +13676,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": true, - "title": "Body" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -13582,22 +13698,22 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}/revisions": { + "/desktop/v1/zoning/questions/{question_id}/reviews": { "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Revise Analysis", - "operationId": "revise_analysis_desktop_v1_planning_analyses__analysis_id__revisions_post", + "summary": "Create Review", + "operationId": "create_review_desktop_v1_zoning_questions__question_id__reviews_post", "parameters": [ { - "name": "analysis_id", + "name": "question_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Analysis Id" + "title": "Question Id" } }, { @@ -13622,9 +13738,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "additionalProperties": true, - "title": "Body" + "$ref": "#/components/schemas/townlight_runtime__zoning_bridge__Review" } } } @@ -13651,24 +13765,14 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}": { - "get": { + "/desktop/v1/zoning/outlines": { + "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Analysis", - "operationId": "analysis_desktop_v1_planning_analyses__analysis_id__get", + "summary": "Create Outline", + "operationId": "create_outline_desktop_v1_zoning_outlines_post", "parameters": [ - { - "name": "analysis_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Analysis Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -13686,6 +13790,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Outline" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -13708,36 +13822,14 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}/history": { - "get": { + "/desktop/v1/zoning/code-context": { + "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Analysis History", - "operationId": "analysis_history_desktop_v1_planning_analyses__analysis_id__history_get", + "summary": "Create Code Context", + "operationId": "create_code_context_desktop_v1_zoning_code_context_post", "parameters": [ - { - "name": "analysis_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Analysis Id" - } - }, - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -13755,6 +13847,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CodeContext" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -13777,24 +13879,15 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}/snapshot-preview": { + "/desktop/v1/zoning/standards/process-explanation": { "post": { "tags": [ - "native-planning" + "native-zoning" ], - "summary": "Preview Snapshot", - "operationId": "preview_snapshot_desktop_v1_planning_analyses__analysis_id__snapshot_preview_post", + "summary": "Standards Explanation", + "description": "Cited variance/CUP/nonconformity process; never a determination.", + "operationId": "standards_explanation_desktop_v1_zoning_standards_process_explanation_post", "parameters": [ - { - "name": "analysis_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Analysis Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -13817,7 +13910,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Snapshot" + "$ref": "#/components/schemas/StandardsExplanation" } } } @@ -13844,50 +13937,19 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}/snapshots": { + "/townlight_zoning/questions": { "post": { - "tags": [ - "native-planning" - ], - "summary": "Snapshot", - "operationId": "snapshot_desktop_v1_planning_analyses__analysis_id__snapshots_post", - "parameters": [ - { - "name": "analysis_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Analysis Id" + "summary": "Public Question", + "operationId": "public_question_townlight_zoning_questions_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Question" + } } }, - { - "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/Snapshot" - } - } - } + "required": true }, "responses": { "200": { @@ -13911,55 +13973,20 @@ } } }, - "/desktop/v1/planning/snapshots": { - "get": { - "tags": [ - "native-planning" - ], - "summary": "Snapshots", - "operationId": "snapshots_desktop_v1_planning_snapshots_get", - "parameters": [ - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - }, - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" + "/townlight_zoning/parcels/lookup": { + "post": { + "summary": "Public Parcel Lookup", + "operationId": "public_parcel_lookup_townlight_zoning_parcels_lookup_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/_ParcelLookupIn" + } } }, - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" - } - } - ], + "required": true + }, "responses": { "200": { "description": "Successful Response", @@ -13982,24 +14009,14 @@ } } }, - "/desktop/v1/planning/snapshots/{snapshot_id}": { - "get": { + "/desktop/v1/planning/imports/preview": { + "post": { "tags": [ "native-planning" ], - "summary": "Document", - "operationId": "document_desktop_v1_planning_snapshots__snapshot_id__get", + "summary": "Preview Import", + "operationId": "preview_import_desktop_v1_planning_imports_preview_post", "parameters": [ - { - "name": "snapshot_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Snapshot Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -14017,6 +14034,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -14039,24 +14066,14 @@ } } }, - "/desktop/v1/planning/snapshots/{snapshot_id}/access-advice": { + "/desktop/v1/planning/imports": { "post": { "tags": [ "native-planning" ], - "summary": "Access Advice", - "operationId": "access_advice_desktop_v1_planning_snapshots__snapshot_id__access_advice_post", + "summary": "Import Source", + "operationId": "import_source_desktop_v1_planning_imports_post", "parameters": [ - { - "name": "snapshot_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Snapshot Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -14074,6 +14091,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -14096,14 +14123,38 @@ } } }, - "/desktop/v1/planning/connections/search": { - "post": { + "/desktop/v1/planning/sources": { + "get": { "tags": [ "native-planning" ], - "summary": "Connections", - "operationId": "connections_desktop_v1_planning_connections_search_post", + "summary": "Source List", + "operationId": "source_list_desktop_v1_planning_sources_get", "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -14121,16 +14172,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConnectionSearch" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -14153,14 +14194,23 @@ } } }, - "/desktop/v1/planning/progress/targets": { + "/desktop/v1/planning/sources/{plan_id}/history": { "get": { "tags": [ "native-planning" ], - "summary": "Municipal Progress", - "operationId": "municipal_progress_desktop_v1_planning_progress_targets_get", + "summary": "Source History", + "operationId": "source_history_desktop_v1_planning_sources__plan_id__history_get", "parameters": [ + { + "name": "plan_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Plan Id" + } + }, { "name": "offset", "in": "query", @@ -14212,24 +14262,22 @@ } } }, - "/desktop/v1/planning/amendments/history": { + "/desktop/v1/planning/revisions/{revision_id}": { "get": { "tags": [ "native-planning" ], - "summary": "Municipal Amendments", - "operationId": "municipal_amendments_desktop_v1_planning_amendments_history_get", + "summary": "Revision", + "operationId": "revision_desktop_v1_planning_revisions__revision_id__get", "parameters": [ { - "name": "offset", - "in": "query", - "required": false, + "name": "revision_id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" + "type": "string", + "format": "uuid", + "title": "Revision Id" } }, { @@ -14271,22 +14319,31 @@ } } }, - "/desktop/v1/planning/municipal-work/{item_id}/history": { + "/desktop/v1/planning/revisions/{revision_id}/documents/{document_id}": { "get": { "tags": [ "native-planning" ], - "summary": "Municipal History", - "operationId": "municipal_history_desktop_v1_planning_municipal_work__item_id__history_get", + "summary": "Staff Original", + "operationId": "staff_original_desktop_v1_planning_revisions__revision_id__documents__document_id__get", "parameters": [ { - "name": "item_id", + "name": "revision_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Revision Id" + } + }, + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" } }, { @@ -14328,13 +14385,13 @@ } } }, - "/desktop/v1/planning/initiatives": { + "/desktop/v1/planning/policies/search": { "post": { "tags": [ "native-planning" ], - "summary": "Create Initiative", - "operationId": "create_initiative_desktop_v1_planning_initiatives_post", + "summary": "Policies", + "operationId": "policies_desktop_v1_planning_policies_search_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14358,7 +14415,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InitiativeInput" + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" } } } @@ -14385,22 +14442,36 @@ } } }, - "/desktop/v1/planning/initiatives/{item_id}/revisions": { - "post": { + "/desktop/v1/planning/analyses": { + "get": { "tags": [ "native-planning" ], - "summary": "Update Initiative", - "operationId": "update_initiative_desktop_v1_planning_initiatives__item_id__revisions_post", + "summary": "Analyses", + "operationId": "analyses_desktop_v1_planning_analyses_get", "parameters": [ { - "name": "item_id", - "in": "path", - "required": true, + "name": "limit", + "in": "query", + "required": false, "schema": { - "type": "string", - "format": "uuid", - "title": "Item Id" + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" } }, { @@ -14420,16 +14491,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InitiativeInput" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -14450,15 +14511,13 @@ } } } - } - }, - "/desktop/v1/planning/amendments": { + }, "post": { "tags": [ "native-planning" ], - "summary": "Create Amendment", - "operationId": "create_amendment_desktop_v1_planning_amendments_post", + "summary": "Create Analysis", + "operationId": "create_analysis_desktop_v1_planning_analyses_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14482,7 +14541,9 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AmendmentInput" + "type": "object", + "additionalProperties": true, + "title": "Body" } } } @@ -14509,22 +14570,22 @@ } } }, - "/desktop/v1/planning/amendments/{item_id}/revisions": { + "/desktop/v1/planning/analyses/{analysis_id}/revisions": { "post": { "tags": [ "native-planning" ], - "summary": "Update Amendment", - "operationId": "update_amendment_desktop_v1_planning_amendments__item_id__revisions_post", + "summary": "Revise Analysis", + "operationId": "revise_analysis_desktop_v1_planning_analyses__analysis_id__revisions_post", "parameters": [ { - "name": "item_id", + "name": "analysis_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Analysis Id" } }, { @@ -14549,7 +14610,9 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AmendmentInput" + "type": "object", + "additionalProperties": true, + "title": "Body" } } } @@ -14576,63 +14639,41 @@ } } }, - "/townlight_planning/policies/search": { - "post": { + "/desktop/v1/planning/analyses/{analysis_id}": { + "get": { "tags": [ - "local-public-planning" + "native-planning" ], - "summary": "Public Policies", - "operationId": "public_policies_townlight_planning_policies_search_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } + "summary": "Analysis", + "operationId": "analysis_desktop_v1_planning_analyses__analysis_id__get", + "parameters": [ + { + "name": "analysis_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Analysis Id" } }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" } - } + ], + "title": "X-Townlight-Session" } } - } - } - }, - "/townlight_planning/plan-explore": { - "post": { - "tags": [ - "local-public-planning" ], - "summary": "Public Plan Explore", - "description": "Topic/goal/plan-type exploration over adopted public plan sources only.", - "operationId": "public_plan_explore_townlight_planning_plan_explore_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicExplore" - } - } - }, - "required": true - }, "responses": { "200": { "description": "Successful Response", @@ -14655,24 +14696,22 @@ } } }, - "/townlight_planning/snapshots": { + "/desktop/v1/planning/analyses/{analysis_id}/history": { "get": { "tags": [ - "local-public-planning" + "native-planning" ], - "summary": "Public Snapshots", - "operationId": "public_snapshots_townlight_planning_snapshots_get", + "summary": "Analysis History", + "operationId": "analysis_history_desktop_v1_planning_analyses__analysis_id__history_get", "parameters": [ { - "name": "limit", - "in": "query", - "required": false, + "name": "analysis_id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" + "type": "string", + "format": "uuid", + "title": "Analysis Id" } }, { @@ -14686,6 +14725,22 @@ "default": 0, "title": "Offset" } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } } ], "responses": { @@ -14710,25 +14765,51 @@ } } }, - "/townlight_planning/snapshots/{snapshot_id}": { - "get": { + "/desktop/v1/planning/analyses/{analysis_id}/snapshot-preview": { + "post": { "tags": [ - "local-public-planning" + "native-planning" ], - "summary": "Public Document", - "operationId": "public_document_townlight_planning_snapshots__snapshot_id__get", + "summary": "Preview Snapshot", + "operationId": "preview_snapshot_desktop_v1_planning_analyses__analysis_id__snapshot_preview_post", "parameters": [ { - "name": "snapshot_id", + "name": "analysis_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Snapshot Id" + "title": "Analysis Id" + } + }, + { + "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/Snapshot" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -14751,34 +14832,51 @@ } } }, - "/townlight_planning/revisions/{revision_id}/documents/{document_id}": { - "get": { + "/desktop/v1/planning/analyses/{analysis_id}/snapshots": { + "post": { "tags": [ - "local-public-planning" + "native-planning" ], - "summary": "Public Original", - "operationId": "public_original_townlight_planning_revisions__revision_id__documents__document_id__get", + "summary": "Snapshot", + "operationId": "snapshot_desktop_v1_planning_analyses__analysis_id__snapshots_post", "parameters": [ { - "name": "revision_id", + "name": "analysis_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Revision Id" + "title": "Analysis Id" } }, { - "name": "document_id", - "in": "path", - "required": true, + "name": "X-Townlight-Session", + "in": "header", + "required": false, "schema": { - "type": "string", - "title": "Document Id" + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Snapshot" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -14801,13 +14899,198 @@ } } }, - "/desktop/v1/permitting/requirements": { - "post": { + "/desktop/v1/planning/snapshots": { + "get": { "tags": [ - "native-permitting" + "native-planning" ], - "summary": "Import Requirements", - "operationId": "import_requirements_desktop_v1_permitting_requirements_post", + "summary": "Snapshots", + "operationId": "snapshots_desktop_v1_planning_snapshots_get", + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/planning/snapshots/{snapshot_id}": { + "get": { + "tags": [ + "native-planning" + ], + "summary": "Document", + "operationId": "document_desktop_v1_planning_snapshots__snapshot_id__get", + "parameters": [ + { + "name": "snapshot_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Snapshot Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/planning/snapshots/{snapshot_id}/access-advice": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Access Advice", + "operationId": "access_advice_desktop_v1_planning_snapshots__snapshot_id__access_advice_post", + "parameters": [ + { + "name": "snapshot_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Snapshot Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/planning/connections/search": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Connections", + "operationId": "connections_desktop_v1_planning_connections_search_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14831,7 +15114,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__permitting_bridge__Import" + "$ref": "#/components/schemas/ConnectionSearch" } } } @@ -14856,13 +15139,15 @@ } } } - }, + } + }, + "/desktop/v1/planning/progress/targets": { "get": { "tags": [ - "native-permitting" + "native-planning" ], - "summary": "Requirements", - "operationId": "requirements_desktop_v1_permitting_requirements_get", + "summary": "Municipal Progress", + "operationId": "municipal_progress_desktop_v1_planning_progress_targets_get", "parameters": [ { "name": "offset", @@ -14915,24 +15200,1365 @@ } } }, - "/desktop/v1/permitting/requirements/{revision_id}": { - "get": { + "/desktop/v1/planning/amendments/history": { + "get": { + "tags": [ + "native-planning" + ], + "summary": "Municipal Amendments", + "operationId": "municipal_amendments_desktop_v1_planning_amendments_history_get", + "parameters": [ + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/planning/municipal-work/{item_id}/history": { + "get": { + "tags": [ + "native-planning" + ], + "summary": "Municipal History", + "operationId": "municipal_history_desktop_v1_planning_municipal_work__item_id__history_get", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Item Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/planning/initiatives": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Create Initiative", + "operationId": "create_initiative_desktop_v1_planning_initiatives_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/InitiativeInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/initiatives/{item_id}/revisions": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Update Initiative", + "operationId": "update_initiative_desktop_v1_planning_initiatives__item_id__revisions_post", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Item Id" + } + }, + { + "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/InitiativeInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/amendments": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Create Amendment", + "operationId": "create_amendment_desktop_v1_planning_amendments_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/AmendmentInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/amendments/{item_id}/revisions": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Update Amendment", + "operationId": "update_amendment_desktop_v1_planning_amendments__item_id__revisions_post", + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Item Id" + } + }, + { + "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/AmendmentInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_planning/policies/search": { + "post": { + "tags": [ + "local-public-planning" + ], + "summary": "Public Policies", + "operationId": "public_policies_townlight_planning_policies_search_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_planning/plan-explore": { + "post": { + "tags": [ + "local-public-planning" + ], + "summary": "Public Plan Explore", + "description": "Topic/goal/plan-type exploration over adopted public plan sources only.", + "operationId": "public_plan_explore_townlight_planning_plan_explore_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicExplore" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_planning/snapshots": { + "get": { + "tags": [ + "local-public-planning" + ], + "summary": "Public Snapshots", + "operationId": "public_snapshots_townlight_planning_snapshots_get", + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_planning/snapshots/{snapshot_id}": { + "get": { + "tags": [ + "local-public-planning" + ], + "summary": "Public Document", + "operationId": "public_document_townlight_planning_snapshots__snapshot_id__get", + "parameters": [ + { + "name": "snapshot_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Snapshot Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_planning/revisions/{revision_id}/documents/{document_id}": { + "get": { + "tags": [ + "local-public-planning" + ], + "summary": "Public Original", + "operationId": "public_original_townlight_planning_revisions__revision_id__documents__document_id__get", + "parameters": [ + { + "name": "revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Revision Id" + } + }, + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/requirements": { + "post": { + "tags": [ + "native-permitting" + ], + "summary": "Import Requirements", + "operationId": "import_requirements_desktop_v1_permitting_requirements_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/townlight_runtime__permitting_bridge__Import" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "native-permitting" + ], + "summary": "Requirements", + "operationId": "requirements_desktop_v1_permitting_requirements_get", + "parameters": [ + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/requirements/{revision_id}": { + "get": { + "tags": [ + "native-permitting" + ], + "summary": "Requirement", + "operationId": "requirement_desktop_v1_permitting_requirements__revision_id__get", + "parameters": [ + { + "name": "revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Revision Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/cases": { + "get": { + "tags": [ + "native-permitting" + ], + "summary": "Cases", + "operationId": "cases_desktop_v1_permitting_cases_get", + "parameters": [ + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, + { + "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" + } + } + } + } + } + }, + "post": { + "tags": [ + "native-permitting" + ], + "summary": "Create Case", + "operationId": "create_case_desktop_v1_permitting_cases_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/IntakeInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/cases/{case_id}": { + "get": { + "tags": [ + "native-permitting" + ], + "summary": "Case", + "operationId": "case_desktop_v1_permitting_cases__case_id__get", + "parameters": [ + { + "name": "case_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Case Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/cases/{case_id}/revisions": { + "post": { + "tags": [ + "native-permitting" + ], + "summary": "Revise", + "operationId": "revise_desktop_v1_permitting_cases__case_id__revisions_post", + "parameters": [ + { + "name": "case_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Case Id" + } + }, + { + "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/IntakeInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/cases/{case_id}/history": { + "get": { + "tags": [ + "native-permitting" + ], + "summary": "History", + "operationId": "history_desktop_v1_permitting_cases__case_id__history_get", + "parameters": [ + { + "name": "case_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Case Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/cases/{case_id}/packets": { + "post": { + "tags": [ + "native-permitting" + ], + "summary": "Packet", + "operationId": "packet_desktop_v1_permitting_cases__case_id__packets_post", + "parameters": [ + { + "name": "case_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Case Id" + } + }, + { + "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/Packet" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/packets/{packet_id}": { + "get": { + "tags": [ + "native-permitting" + ], + "summary": "Document", + "operationId": "document_desktop_v1_permitting_packets__packet_id__get", + "parameters": [ + { + "name": "packet_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Packet Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/pathway": { + "post": { + "tags": [ + "native-permitting" + ], + "summary": "Pathway", + "description": "Cited likely permit pathway, attachments and timeline; informational only.\n\n``use_model_assistance`` does not exist here: the resident live-model\nassistance flag (F-07) stays excluded, so only the deterministic cited\npathway is reachable from the shared shell.", + "operationId": "pathway_desktop_v1_permitting_pathway_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/Pathway" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/permitting/connections/search": { + "post": { + "tags": [ + "native-permitting" + ], + "summary": "Connections", + "operationId": "connections_desktop_v1_permitting_connections_search_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/townlight_runtime__permitting_bridge__Search" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/repeat-cases": { + "post": { + "tags": [ + "native-inspections" + ], + "summary": "Repeat Cases", + "operationId": "repeat_cases_desktop_v1_inspections_repeat_cases_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/RepeatLookup" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/notice-draft": { + "post": { "tags": [ - "native-permitting" + "native-inspections" ], - "summary": "Requirement", - "operationId": "requirement_desktop_v1_permitting_requirements__revision_id__get", + "summary": "Notice", + "operationId": "notice_desktop_v1_inspections_notice_draft_post", "parameters": [ - { - "name": "revision_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Revision Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -14950,6 +16576,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InspectionInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -14972,13 +16608,13 @@ } } }, - "/desktop/v1/permitting/cases": { + "/desktop/v1/inspections/cases": { "get": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Cases", - "operationId": "cases_desktop_v1_permitting_cases_get", + "operationId": "cases_desktop_v1_inspections_cases_get", "parameters": [ { "name": "offset", @@ -15032,10 +16668,10 @@ }, "post": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Create Case", - "operationId": "create_case_desktop_v1_permitting_cases_post", + "operationId": "create_case_desktop_v1_inspections_cases_post", "parameters": [ { "name": "X-Townlight-Session", @@ -15059,7 +16695,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/IntakeInput" + "$ref": "#/components/schemas/InspectionInput" } } } @@ -15086,13 +16722,13 @@ } } }, - "/desktop/v1/permitting/cases/{case_id}": { + "/desktop/v1/inspections/cases/{case_id}": { "get": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Case", - "operationId": "case_desktop_v1_permitting_cases__case_id__get", + "operationId": "case_desktop_v1_inspections_cases__case_id__get", "parameters": [ { "name": "case_id", @@ -15143,13 +16779,13 @@ } } }, - "/desktop/v1/permitting/cases/{case_id}/revisions": { + "/desktop/v1/inspections/cases/{case_id}/revisions": { "post": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Revise", - "operationId": "revise_desktop_v1_permitting_cases__case_id__revisions_post", + "operationId": "revise_desktop_v1_inspections_cases__case_id__revisions_post", "parameters": [ { "name": "case_id", @@ -15183,7 +16819,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/IntakeInput" + "$ref": "#/components/schemas/InspectionInput" } } } @@ -15210,13 +16846,13 @@ } } }, - "/desktop/v1/permitting/cases/{case_id}/history": { + "/desktop/v1/inspections/cases/{case_id}/history": { "get": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "History", - "operationId": "history_desktop_v1_permitting_cases__case_id__history_get", + "operationId": "history_desktop_v1_inspections_cases__case_id__history_get", "parameters": [ { "name": "case_id", @@ -15267,13 +16903,13 @@ } } }, - "/desktop/v1/permitting/cases/{case_id}/packets": { + "/desktop/v1/inspections/cases/{case_id}/packets": { "post": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Packet", - "operationId": "packet_desktop_v1_permitting_cases__case_id__packets_post", + "operationId": "packet_desktop_v1_inspections_cases__case_id__packets_post", "parameters": [ { "name": "case_id", @@ -15334,13 +16970,13 @@ } } }, - "/desktop/v1/permitting/packets/{packet_id}": { + "/desktop/v1/inspections/packets/{packet_id}": { "get": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Document", - "operationId": "document_desktop_v1_permitting_packets__packet_id__get", + "operationId": "document_desktop_v1_inspections_packets__packet_id__get", "parameters": [ { "name": "packet_id", @@ -15391,14 +17027,14 @@ } } }, - "/desktop/v1/permitting/pathway": { - "post": { + "/desktop/v1/inspections/evidence/supported-types": { + "get": { "tags": [ - "native-permitting" + "native-inspections" ], - "summary": "Pathway", - "description": "Cited likely permit pathway, attachments and timeline; informational only.\n\n``use_model_assistance`` does not exist here: the resident live-model\nassistance flag (F-07) stays excluded, so only the deterministic cited\npathway is reachable from the shared shell.", - "operationId": "pathway_desktop_v1_permitting_pathway_post", + "summary": "Supported Types", + "description": "The media types this deployment's product model actually accepts.", + "operationId": "supported_types_desktop_v1_inspections_evidence_supported_types_get", "parameters": [ { "name": "X-Townlight-Session", @@ -15417,16 +17053,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pathway" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -15449,13 +17075,13 @@ } } }, - "/desktop/v1/permitting/connections/search": { + "/desktop/v1/inspections/evidence/retain": { "post": { "tags": [ - "native-permitting" + "native-inspections" ], - "summary": "Connections", - "operationId": "connections_desktop_v1_permitting_connections_search_post", + "summary": "Retain", + "operationId": "retain_desktop_v1_inspections_evidence_retain_post", "parameters": [ { "name": "X-Townlight-Session", @@ -15479,7 +17105,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__permitting_bridge__Search" + "$ref": "#/components/schemas/EvidenceItems" } } } @@ -15506,13 +17132,14 @@ } } }, - "/desktop/v1/inspections/repeat-cases": { + "/desktop/v1/inspections/media/analyse": { "post": { "tags": [ "native-inspections" ], - "summary": "Repeat Cases", - "operationId": "repeat_cases_desktop_v1_inspections_repeat_cases_post", + "summary": "Media Analyse", + "description": "Run the configured adapters over retained originals; draft only.\n\nThe result carries the same observations/citations the product route returns\nplus ``analysis_record``: the exact ``AnalysisRecord`` the caller puts on its\ncase payload, so the reviewed draft is the analysed one.", + "operationId": "media_analyse_desktop_v1_inspections_media_analyse_post", "parameters": [ { "name": "X-Townlight-Session", @@ -15536,7 +17163,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RepeatLookup" + "$ref": "#/components/schemas/MediaAnalysis" } } } @@ -15563,13 +17190,13 @@ } } }, - "/desktop/v1/inspections/notice-draft": { + "/desktop/v1/inspections/connections/search": { "post": { "tags": [ "native-inspections" ], - "summary": "Notice", - "operationId": "notice_desktop_v1_inspections_notice_draft_post", + "summary": "Connections", + "operationId": "connections_desktop_v1_inspections_connections_search_post", "parameters": [ { "name": "X-Townlight-Session", @@ -15593,7 +17220,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InspectionInput" + "$ref": "#/components/schemas/townlight_runtime__inspections_bridge__Search" } } } @@ -15620,26 +17247,14 @@ } } }, - "/desktop/v1/inspections/cases": { + "/desktop/v1/municipal-staff/boards": { "get": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Cases", - "operationId": "cases_desktop_v1_inspections_cases_get", + "summary": "List Boards", + "operationId": "list_boards_desktop_v1_municipal_staff_boards_get", "parameters": [ - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -15680,10 +17295,10 @@ }, "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Create Case", - "operationId": "create_case_desktop_v1_inspections_cases_post", + "summary": "Create Board", + "operationId": "create_board_desktop_v1_municipal_staff_boards_post", "parameters": [ { "name": "X-Townlight-Session", @@ -15707,13 +17322,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InspectionInput" + "$ref": "#/components/schemas/BoardInput" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -15734,24 +17349,14 @@ } } }, - "/desktop/v1/inspections/cases/{case_id}": { - "get": { + "/desktop/v1/municipal-staff/boards/seat": { + "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Case", - "operationId": "case_desktop_v1_inspections_cases__case_id__get", + "summary": "Save Seat", + "operationId": "save_seat_desktop_v1_municipal_staff_boards_seat_post", "parameters": [ - { - "name": "case_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Case Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -15769,6 +17374,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SeatInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -15791,24 +17406,14 @@ } } }, - "/desktop/v1/inspections/cases/{case_id}/revisions": { + "/desktop/v1/municipal-staff/boards/attendance": { "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Revise", - "operationId": "revise_desktop_v1_inspections_cases__case_id__revisions_post", + "summary": "Save Attendance", + "operationId": "save_attendance_desktop_v1_municipal_staff_boards_attendance_post", "parameters": [ - { - "name": "case_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Case Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -15831,7 +17436,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InspectionInput" + "$ref": "#/components/schemas/AttendanceInput" } } } @@ -15858,24 +17463,59 @@ } } }, - "/desktop/v1/inspections/cases/{case_id}/history": { + "/desktop/v1/municipal-staff/contracts": { "get": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "History", - "operationId": "history_desktop_v1_inspections_cases__case_id__history_get", + "summary": "List Contracts", + "operationId": "list_contracts_desktop_v1_municipal_staff_contracts_get", "parameters": [ { - "name": "case_id", - "in": "path", - "required": true, + "name": "X-Townlight-Session", + "in": "header", + "required": false, "schema": { - "type": "string", - "format": "uuid", - "title": "Case Id" + "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" + } + } + } + } + } + }, + "post": { + "tags": [ + "native-municipal-staff" + ], + "summary": "Register Contract", + "operationId": "register_contract_desktop_v1_municipal_staff_contracts_post", + "parameters": [ { "name": "X-Townlight-Session", "in": "header", @@ -15893,8 +17533,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SignedAgreement" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -15915,22 +17565,22 @@ } } }, - "/desktop/v1/inspections/cases/{case_id}/packets": { + "/desktop/v1/municipal-staff/contracts/{identity}/signed": { "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Packet", - "operationId": "packet_desktop_v1_inspections_cases__case_id__packets_post", + "summary": "Record Signed", + "operationId": "record_signed_desktop_v1_municipal_staff_contracts__identity__signed_post", "parameters": [ { - "name": "case_id", + "name": "identity", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Case Id" + "title": "Identity" } }, { @@ -15955,7 +17605,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Packet" + "$ref": "#/components/schemas/SignedAgreement" } } } @@ -15982,22 +17632,22 @@ } } }, - "/desktop/v1/inspections/packets/{packet_id}": { + "/desktop/v1/municipal-staff/contracts/{identity}/document": { "get": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Document", - "operationId": "document_desktop_v1_inspections_packets__packet_id__get", + "summary": "Retrieve Contract", + "operationId": "retrieve_contract_desktop_v1_municipal_staff_contracts__identity__document_get", "parameters": [ { - "name": "packet_id", + "name": "identity", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Packet Id" + "title": "Identity" } }, { @@ -16039,14 +17689,13 @@ } } }, - "/desktop/v1/inspections/evidence/supported-types": { + "/desktop/v1/municipal-staff/procurement": { "get": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Supported Types", - "description": "The media types this deployment's product model actually accepts.", - "operationId": "supported_types_desktop_v1_inspections_evidence_supported_types_get", + "summary": "List Procurement", + "operationId": "list_procurement_desktop_v1_municipal_staff_procurement_get", "parameters": [ { "name": "X-Townlight-Session", @@ -16085,15 +17734,13 @@ } } } - } - }, - "/desktop/v1/inspections/evidence/retain": { + }, "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Retain", - "operationId": "retain_desktop_v1_inspections_evidence_retain_post", + "summary": "Save Rfp", + "operationId": "save_rfp_desktop_v1_municipal_staff_procurement_post", "parameters": [ { "name": "X-Townlight-Session", @@ -16117,13 +17764,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EvidenceItems" + "$ref": "#/components/schemas/RfpInput" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -16144,15 +17791,24 @@ } } }, - "/desktop/v1/inspections/media/analyse": { + "/desktop/v1/municipal-staff/procurement/{identity}/proposal": { "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Media Analyse", - "description": "Run the configured adapters over retained originals; draft only.\n\nThe result carries the same observations/citations the product route returns\nplus ``analysis_record``: the exact ``AnalysisRecord`` the caller puts on its\ncase payload, so the reviewed draft is the analysed one.", - "operationId": "media_analyse_desktop_v1_inspections_media_analyse_post", + "summary": "Save Proposal", + "operationId": "save_proposal_desktop_v1_municipal_staff_procurement__identity__proposal_post", "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -16175,13 +17831,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MediaAnalysis" + "$ref": "#/components/schemas/ProposalInput" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -16202,14 +17858,24 @@ } } }, - "/desktop/v1/inspections/connections/search": { + "/desktop/v1/municipal-staff/procurement/{identity}/award": { "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Connections", - "operationId": "connections_desktop_v1_inspections_connections_search_post", + "summary": "Record Award", + "operationId": "record_award_desktop_v1_municipal_staff_procurement__identity__award_post", "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -16232,11 +17898,68 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__inspections_bridge__Search" + "$ref": "#/components/schemas/AwardInput" } } } }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/municipal-staff/procurement/{identity}/contract": { + "post": { + "tags": [ + "native-municipal-staff" + ], + "summary": "Create Draft Contract", + "operationId": "create_draft_contract_desktop_v1_municipal_staff_procurement__identity__contract_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": { "200": { "description": "Successful Response", @@ -16830,6 +18553,32 @@ ], "title": "AttachReleaseCopy" }, + "AttendanceInput": { + "properties": { + "seat_id": { + "type": "string", + "format": "uuid", + "title": "Seat Id" + }, + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "present": { + "type": "boolean", + "title": "Present" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "seat_id", + "meeting_id", + "present" + ], + "title": "AttendanceInput" + }, "AuditChainVerification": { "properties": { "is_valid": { @@ -16979,6 +18728,35 @@ ], "title": "AuditView" }, + "AwardInput": { + "properties": { + "proposal_id": { + "type": "string", + "format": "uuid", + "title": "Proposal Id" + }, + "decision_reference": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Decision Reference" + }, + "decision_note": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "Decision Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "proposal_id", + "decision_reference", + "decision_note" + ], + "title": "AwardInput" + }, "BearerResponse": { "properties": { "access_token": { @@ -16997,6 +18775,29 @@ ], "title": "BearerResponse" }, + "BoardInput": { + "properties": { + "board_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Board Name" + }, + "liaison": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Liaison" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "board_name", + "liaison" + ], + "title": "BoardInput" + }, "Body_auth_jwt_login_auth_jwt_login_post": { "properties": { "grant_type": { @@ -20237,27 +22038,178 @@ "type": "array", "title": "Sections" }, - "versions": { - "items": { - "$ref": "#/components/schemas/SectionVersionCreate" - }, - "type": "array", - "title": "Versions" + "versions": { + "items": { + "$ref": "#/components/schemas/SectionVersionCreate" + }, + "type": "array", + "title": "Versions" + }, + "provenance": { + "additionalProperties": true, + "type": "object", + "title": "Provenance" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector_type", + "source" + ], + "title": "ImportBundleCreate", + "description": "Request body for local fixture/file-drop import jobs." + }, + "ImportCommitInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" + }, + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" + }, + "content_base64": { + "type": "string", + "maxLength": 22369624, + "minLength": 1, + "title": "Content Base64" + }, + "external_id": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "External Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector", + "source_url", + "input_format", + "content_base64", + "external_id", + "expected_sha256" + ], + "title": "ImportCommitInput" + }, + "ImportLinkInput": { + "properties": { + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "meeting_id" + ], + "title": "ImportLinkInput" + }, + "ImportLinkSearch": { + "properties": { + "target_query": { + "type": "string", + "maxLength": 255, + "title": "Target Query", + "default": "" + }, + "meeting_query": { + "type": "string", + "maxLength": 255, + "title": "Meeting Query", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ImportLinkSearch" + }, + "ImportPreviewInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" + }, + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" + }, + "content_base64": { + "type": "string", + "maxLength": 22369624, + "minLength": 1, + "title": "Content Base64" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector", + "source_url", + "input_format", + "content_base64" + ], + "title": "ImportPreviewInput" + }, + "ImportSourceInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" }, - "provenance": { - "additionalProperties": true, - "type": "object", - "title": "Provenance" + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" } }, "additionalProperties": false, "type": "object", "required": [ - "connector_type", - "source" + "connector", + "source_url", + "input_format" ], - "title": "ImportBundleCreate", - "description": "Request body for local fixture/file-drop import jobs." + "title": "ImportSourceInput" }, "InclusionStatus": { "type": "string", @@ -22914,6 +24866,42 @@ ], "title": "Proposal" }, + "ProposalInput": { + "properties": { + "vendor_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Vendor Name" + }, + "summary": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "Summary" + }, + "staff_score": { + "type": "integer", + "maximum": 100.0, + "minimum": 0.0, + "title": "Staff Score" + }, + "staff_exceptions": { + "type": "string", + "maxLength": 8000, + "title": "Staff Exceptions", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "vendor_name", + "summary", + "staff_score" + ], + "title": "ProposalInput" + }, "PublicExplore": { "properties": { "goal": { @@ -23364,6 +25352,27 @@ ], "title": "RecordsDocumentView" }, + "RecordsImportDocument": { + "properties": { + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "document_index": { + "type": "integer", + "minimum": 0.0, + "title": "Document Index" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "request_id", + "document_index" + ], + "title": "RecordsImportDocument" + }, "RecordsOperationRead": { "properties": { "action": { @@ -24692,6 +26701,36 @@ ], "title": "RewriteResult" }, + "RfpInput": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "procurement_type": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Procurement Type" + }, + "city_need": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "City Need" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "procurement_type", + "city_need" + ], + "title": "RfpInput" + }, "Rule": { "properties": { "jurisdiction": { @@ -25343,6 +27382,65 @@ ], "title": "SearchSessionRead" }, + "SeatInput": { + "properties": { + "board_id": { + "type": "string", + "format": "uuid", + "title": "Board Id" + }, + "seat_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Seat Name" + }, + "member_name": { + "anyOf": [ + { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Member Name" + }, + "term_start": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Term Start" + }, + "term_end": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Term End" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "board_id", + "seat_name" + ], + "title": "SeatInput" + }, "SectionCreate": { "properties": { "section_id": { @@ -25543,27 +27641,6 @@ "title": "SectionVersionCreate", "description": "Request body for adding an immutable section version." }, - "Selection": { - "properties": { - "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": [ - "recording_id", - "expected_sha256" - ], - "title": "Selection" - }, "SentenceInput": { "properties": { "text": { @@ -25716,6 +27793,69 @@ "type": "object", "title": "ServiceAccountUpdate" }, + "SignedAgreement": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "vendor_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Vendor Name" + }, + "owner": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Owner" + }, + "start_date": { + "type": "string", + "format": "date", + "title": "Start Date" + }, + "expiration_date": { + "type": "string", + "format": "date", + "title": "Expiration Date" + }, + "renewal_due": { + "type": "string", + "format": "date", + "title": "Renewal Due" + }, + "document_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Document Name" + }, + "document_content": { + "type": "string", + "maxLength": 8388608, + "format": "base64", + "contentMediaType": "application/octet-stream", + "title": "Document Content" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "vendor_name", + "owner", + "start_date", + "expiration_date", + "renewal_due", + "document_name", + "document_content" + ], + "title": "SignedAgreement" + }, "Snapshot": { "properties": { "expected_revision": { @@ -27053,6 +29193,27 @@ ], "title": "SourceLink" }, + "townlight_records__desktop_bridge__station__Selection": { + "properties": { + "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": [ + "recording_id", + "expected_sha256" + ], + "title": "Selection" + }, "townlight_runtime__inspections_bridge__Search": { "properties": { "provider": { @@ -27203,6 +29364,65 @@ ], "title": "Search" }, + "townlight_runtime__portal_publication__Selection": { + "properties": { + "action": { + "type": "string", + "enum": [ + "publish", + "withdraw" + ], + "title": "Action" + }, + "approve_publication": { + "type": "boolean", + "title": "Approve Publication" + }, + "archive_id": { + "type": "string", + "format": "uuid", + "title": "Archive Id" + }, + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "recording_id": { + "type": "string", + "format": "uuid", + "title": "Recording Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "release_copy_id": { + "type": "string", + "format": "uuid", + "title": "Release Copy Id" + }, + "expected_release_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Expected Release Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "approve_publication", + "archive_id", + "meeting_id", + "recording_id", + "request_id", + "release_copy_id", + "expected_release_sha256" + ], + "title": "Selection" + }, "townlight_runtime__zoning_bridge__Review": { "properties": { "answer": { @@ -27246,9 +29466,6 @@ } } }, - "x-townlight-component": { - "view": "suite", - "identity": "Desktop source 1.7.0-1; townlight-runtime 0.2.0", - "evidence": "source-schema-only" - } + "x-townlight-source-commit": "0afd59de52cb7ecb317188a89bcd1fec8c578a24", + "x-townlight-health-version-discrepancy": "Distribution Runtime 0.3.1 and Meetings 1.0.6; health strings Runtime 0.3.0 and Meetings 1.0.5 in the accepted MSI." } diff --git a/docs/beta-1/api/suite.html b/docs/beta-1/api/suite.html index a441bbc..eea2bd9 100644 --- a/docs/beta-1/api/suite.html +++ b/docs/beta-1/api/suite.html @@ -1,18 +1,18 @@ Townlight Suite API reference
Townlight

Townlight Suite API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

-

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

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Suite API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+

Desktop source 1.8.1-1; townlight-runtime 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

-

HTTP operations

+

Boards, Contracts and Procurement

These are local authenticated endpoints for the installed staff workspaces. See the staff operating guide and machine-readable municipal staff schema for the request and response contracts.

HTTP operations

GET /admin/coverage-gaps
{
   "tags": [
@@ -27521,4 +27521,4 @@ 

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +

For the local Boards, Contracts and Procurement bridge, see native staff operations and access rules.

Authenticated meeting-import HTTP schema · CLI, Python and client contracts

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

\ No newline at end of file diff --git a/docs/beta-1/api/zoning.html b/docs/beta-1/api/zoning.html index b9bbca4..b84d84d 100644 --- a/docs/beta-1/api/zoning.html +++ b/docs/beta-1/api/zoning.html @@ -1,14 +1,14 @@ Townlight Zoning API reference
Townlight

Townlight Zoning API reference

-

Windows Beta 1 · source reference. The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. This schema describes source contracts. The Windows acceptance summary identifies the installed checks.

+pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
Townlight

Townlight Zoning API reference

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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

@@ -12294,4 +12294,4 @@

Request and response data dictionary

"type": "object", "title": "Review" } -
\ No newline at end of file +
\ 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 18f34a8..3bc577b 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 c9d03a7..2936580 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 0d6c110..6933d3b 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 c1d12c9..c3c8d1c 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-Meeting-Imports-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Meeting-Imports-Manual-Beta-1.docx new file mode 100644 index 0000000..1636f49 Binary files /dev/null and b/docs/beta-1/docx/Townlight-Meeting-Imports-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 0eebbb9..142b0ff 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 4602f67..77a74af 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 b16b652..09b2574 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 50a8193..8d19b13 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-Records-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Records-Manual-Beta-1.docx index 6688ade..e1104e2 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 99cb82a..5402a30 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 94378e0..25e435d 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-Windows-Staff-Workflows-1.8.1.1.docx b/docs/beta-1/docx/Townlight-Windows-Staff-Workflows-1.8.1.1.docx new file mode 100644 index 0000000..f814b7a Binary files /dev/null and b/docs/beta-1/docx/Townlight-Windows-Staff-Workflows-1.8.1.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 517d4a5..c2a2b22 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 ad439d8..8501ed6 100644 --- a/docs/beta-1/index.html +++ b/docs/beta-1/index.html @@ -1 +1,110 @@ -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.8.0.1AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
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.8.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 describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

Begin with the current manual and download the Windows x64 beta 1.8.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 + + + + + + Townlight | Municipal software cities can own + + + + + + + + + + + + +
+
+ + Townlight + + +
+
+
+
+
+
+
Townlight / Windows public beta
+

Municipal software cities can actually own.

+

Run connected municipal workflows on a Windows installation your city controls. Keep original sources, staff decisions and approved records together.

+ +

Signed Windows x64 installer · AGPL-3.0-only · Public beta

+
+
+
Workflow guideA meeting decision, end to end
+
    +
  1. Code → MeetingsBring a proposed ordinance to an agenda item with its source.
  2. +
  3. Meetings → StationPair the proceedings with a recording through the configured media service.
  4. +
  5. Station → RecordsPreserve the original recording with a verifiable file identity.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Product directory
+

Workspaces built around city work.

+

Explore the shipped workflows, operating guides and source for each component of the Windows beta.

+

Clerk and records

  • Records

    Request intake, cited search, review and fulfillment.

  • Meetings

    Agendas, packets, motions, votes and public proceedings.

  • Code

    Dated section lookup and ordinance adoption history.

  • Notice

    Draft, approve and retain proof of public notices.

+

Planning and development

  • Zoning

    Parcel lookup, district rules and cited staff workpapers.

  • Planning

    Adopted policy search, cited analysis and initiative tracking.

  • Permitting

    Cited pre-application intake and review packets.

  • Inspections Preview

    Evidence retention and cited inspection workpapers.

+

Publication and media

  • Access

    Accessibility checks, draft support and review records.

  • Station Separate setup

    Recording processing, media provenance and Records handoff.

+

City administration

  • Boards & Commissions

    Rosters, vacancies, terms and meeting-linked attendance.

  • Contracts

    Signed agreements, renewals and linked procurement records.

  • Procurement

    RFP drafts, proposal comparison and award-to-contract handoff.

+

Platform

  • Core

    Shared identity, audit, ingestion and catalog services.

+

New in this beta: Boards & Commissions, Contracts, and Procurement.

+
+
+
+
+
+
How the suite works
+

A record you can trace.

+
+

Keep original evidence

Use source links and original files to make the basis for a decision available for review.

+

Give staff the decision

Use named staff actions, review steps and separate release copies to document what was approved.

+

Connect the record

Carry meeting, ordinance and media context into the next workflow without losing its source.

+
+
+
+
+
+
+
+
Start an evaluation
+

Try one workflow with your team.

+

Install the signed Windows x64 beta, set up a test profile and choose a workflow from the suite manual. Use synthetic data first and commission city-specific sources, staff roles and equipment separately.

+ +
+
+

Release identity and evidence

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

+ +
+
+
+
+
+
Separate deployment
+

A resident-facing portal.

+

The portal beta provides a city-facing website for published material. Follow its own deployment guide and release instructions.

+ +
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/manuals/access.html b/docs/beta-1/manuals/access.html index b2a9dd8..0b80bad 100644 --- a/docs/beta-1/manuals/access.html +++ b/docs/beta-1/manuals/access.html @@ -1,21 +1,21 @@ Townlight Access Manual | Townlight Windows Beta 1 +header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto} -
Townlight +
Townlight
-

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
\ No newline at end of file +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/manuals/code.html b/docs/beta-1/manuals/code.html index 99b2b4e..2a29546 100644 --- a/docs/beta-1/manuals/code.html +++ b/docs/beta-1/manuals/code.html @@ -14,8 +14,8 @@
-

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

\ No newline at end of file diff --git a/docs/beta-1/manuals/core.html b/docs/beta-1/manuals/core.html index d3ddae8..8fe9014 100644 --- a/docs/beta-1/manuals/core.html +++ b/docs/beta-1/manuals/core.html @@ -14,8 +14,8 @@ -

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

\ No newline at end of file diff --git a/docs/beta-1/manuals/inspections.html b/docs/beta-1/manuals/inspections.html index e2f77e1..5da1093 100644 --- a/docs/beta-1/manuals/inspections.html +++ b/docs/beta-1/manuals/inspections.html @@ -14,8 +14,8 @@ -

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

\ No newline at end of file diff --git a/docs/beta-1/manuals/meeting-imports.html b/docs/beta-1/manuals/meeting-imports.html new file mode 100644 index 0000000..852e782 --- /dev/null +++ b/docs/beta-1/manuals/meeting-imports.html @@ -0,0 +1,265 @@ + + +Townlight shared meeting imports | 31 source families + +
Townlight +
+

Shared meeting imports

PDF edition · Word edition

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/manuals/meetings.html b/docs/beta-1/manuals/meetings.html index 6f0c98e..e640b60 100644 --- a/docs/beta-1/manuals/meetings.html +++ b/docs/beta-1/manuals/meetings.html @@ -14,8 +14,8 @@ -

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

\ No newline at end of file diff --git a/docs/beta-1/manuals/notice.html b/docs/beta-1/manuals/notice.html index ae81b4b..2fd8d5c 100644 --- a/docs/beta-1/manuals/notice.html +++ b/docs/beta-1/manuals/notice.html @@ -1,21 +1,21 @@ Townlight Notice Manual | Townlight Windows Beta 1 +header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto} -
Townlight +
Townlight
-

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
\ No newline at end of file +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/manuals/permitting.html b/docs/beta-1/manuals/permitting.html index 5f60197..f8b7f4e 100644 --- a/docs/beta-1/manuals/permitting.html +++ b/docs/beta-1/manuals/permitting.html @@ -14,8 +14,8 @@
-

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

\ No newline at end of file diff --git a/docs/beta-1/manuals/planning.html b/docs/beta-1/manuals/planning.html index b4617d5..f572ac7 100644 --- a/docs/beta-1/manuals/planning.html +++ b/docs/beta-1/manuals/planning.html @@ -14,8 +14,8 @@ -

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

\ No newline at end of file diff --git a/docs/beta-1/manuals/portal.html b/docs/beta-1/manuals/portal.html index 616d50b..1ef5cac 100644 --- a/docs/beta-1/manuals/portal.html +++ b/docs/beta-1/manuals/portal.html @@ -1,14 +1,14 @@ Townlight Portal Guide | Townlight Beta 1
townlightTownlight Beta 1
+header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
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

+guide.

\ No newline at end of file diff --git a/docs/beta-1/manuals/records.html b/docs/beta-1/manuals/records.html index ecfece6..6d40de1 100644 --- a/docs/beta-1/manuals/records.html +++ b/docs/beta-1/manuals/records.html @@ -14,8 +14,8 @@ -

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

\ No newline at end of file diff --git a/docs/beta-1/manuals/station.html b/docs/beta-1/manuals/station.html index 00bbb6f..cdd7213 100644 --- a/docs/beta-1/manuals/station.html +++ b/docs/beta-1/manuals/station.html @@ -14,8 +14,8 @@ -

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

Townlight Station Manual

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. The Windows acceptance summary applies to this exact MSI.

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

Using this manual

Townlight Station helps station operators, clerks, records staff and deployment administrators. Station adapts a pinned CivicCast media @@ -110,11 +110,11 @@

Beta identity

Intended installer -1.8.0.1 +1.8.1.1 Desktop source -1.8.0-1 +1.8.1-1 Runtime distribution @@ -130,7 +130,7 @@

Beta identity

Candidate hashes/signature -SHA-256 checksums and Windows acceptance summary +SHA-256 checksums and Windows acceptance summary Owned software license @@ -140,12 +140,12 @@

Beta identity

Station continues to use its separately configured service. The Windows MSI upgrade below applies to the desktop suite.

First run

-

Upgrade from 1.7.2.1. For the tested upgrade from 1.7.2.1, back up city data and settings, close Townlight, run the signed Windows 1.8.0.1 MSI, and reopen Townlight under the same Windows account with its existing profile. Keep the existing %LOCALAPPDATA%\CivicSuite directory. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

Fresh installation

-

Run the signed Windows 1.8.0.1 MSI and use an empty database and a new Townlight profile for first run.

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

    -
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. -
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. Download the signed MSI, matching source companion and checksums from the public Windows release.
  6. +
  7. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  8. Launch Townlight under the intended named Windows account. Choose the storage folders. Select Townlight Inspections candidate (inspections-preview) for the bounded @@ -1011,7 +1011,7 @@

    Troubleshooting

    Verified workflows and limits

    -

    The separately configured Station workflow was exercised on the original Windows 1.6.0.1 Beta 1. The follow-up Windows 1.6.0.1 Station delivery exercised encrypted live feed and recording delivery. The Windows 1.8.0.1 acceptance summary records the current MSI checks. Station capture and its Meetings-to-Records handoff were outside that run. Field equipment, city credentials, and live YouTube commissioning require separate local verification.

    +

    The separately configured Station workflow was exercised on the original Windows 1.6.0.1 Beta 1. The follow-up Windows 1.6.0.1 Station delivery exercised encrypted live feed and recording delivery. The Windows 1.8.0.1 acceptance summary records the previous 1.8.0.1 MSI checks. Station capture and its Meetings-to-Records handoff were outside that run. Field equipment, city credentials, and live YouTube commissioning require separate local verification.

    The separate provisioning/service boundary and existing external-service limits remain as described below. Staff remain @@ -1271,7 +1271,7 @@

    return.
  9. Source and document control

    -

    This manual covers the Station service paired with Windows MSI 1.8.0.1. The Windows acceptance summary records the tested Meetings, Station and Records handoff.

    +

    This manual covers the Station service paired with Windows MSI 1.8.1.1. The Windows acceptance summary records the tested Meetings, Station and Records handoff.

    Workflow subject index

    -

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

\ No newline at end of file +

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

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/manuals/suite.html b/docs/beta-1/manuals/suite.html index e97652b..dc8bd82 100644 --- a/docs/beta-1/manuals/suite.html +++ b/docs/beta-1/manuals/suite.html @@ -14,8 +14,8 @@ -

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

Townlight Suite Manual

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. The Windows acceptance summary applies to this exact MSI.

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

Using this manual

Townlight connects municipal workflows around retained sources, named @@ -107,15 +107,15 @@

Beta identity

Windows MSI version -1.8.0.1 +1.8.1.1 Native desktop source version -1.8.0-1 +1.8.1-1 Released artifact identity -SHA-256 checksums and Windows acceptance summary +SHA-256 checksums and Windows acceptance summary Corresponding source @@ -155,7 +155,7 @@

Component versions

Meetings townlight-meetings -1.0.5 +1.0.6 Code @@ -185,7 +185,7 @@

Component versions

Station townlight-station -0.3.0 +0.3.1 Access @@ -200,16 +200,16 @@

Component versions

Boards & Commissionstownlight-boards0.2.0 Contractstownlight-contracts0.2.0 Procurementtownlight-procurement0.3.0 -Local runtimetownlight-runtime0.3.0 +Local runtimetownlight-runtime0.3.1

First run

-

Upgrade from 1.7.2.1. For the tested upgrade from 1.7.2.1, back up city data and settings, close Townlight, run the signed Windows 1.8.0.1 MSI, and reopen Townlight under the same Windows account with its existing profile. Keep the existing %LOCALAPPDATA%\CivicSuite directory. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

Fresh installation

-

Run the signed Windows 1.8.0.1 MSI and use an empty database and a new Townlight profile for first run.

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

    -
  1. Download the signed MSI, matching source and checksums from the Windows x64 beta 1.8.0.1 release.
  2. -
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. Download the signed MSI, matching source and checksums from the Windows x64 beta 1.8.1.1 release.
  6. +
  7. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  8. Launch Townlight under the intended named Windows account. Choose the storage folders. Select Townlight Inspections candidate (inspections-preview) for the bounded @@ -723,7 +723,7 @@

    Troubleshooting

    Verified workflows and limits

    -

    The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the current MSI.

    +

    The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

    @@ -1084,4 +1084,252 @@

    Delivery subject index

    and reconciliation.
  9. Schema4: durable upload intent; existing evidence retained.
  10. -

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

    \ No newline at end of file +

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

    Shared meeting imports · Windows 1.8.1.1

    Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

    All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

    Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

    The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

    Shared meeting imports

    +

    Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

    +

    The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SourceInput to preview
    LegistarCore-format JSON export
    PrimeGovCore-format JSON export or public portal meeting list JSON
    GranicusCore-format JSON export or public ViewPublisher HTML
    NovusAGENDACore-format JSON export
    CivicPlus Agenda and Meeting Management SelectPublic Events JSON
    CivicPlus Agenda CenterPublic listing HTML
    Municode MeetingsPublic meetings HTML
    BoardBookPublic organization HTML
    eSCRIBEPublic calendar JSON
    SimbliPublic meeting listing HTML
    iCompass CivicWebPublic meeting-type listing HTML
    iQM2Public meeting list HTML
    Granicus SwagitPublic video archive HTML
    SuiteOne MediaPublic meeting archive HTML
    Granicus PeakPublic agenda center ViewPublisher HTML
    Utah Public Notice WebsitePublic notice detail HTML
    Destiny AgendaQuickPublic meeting list HTML
    Town Hall StreamsPublic archive HTML
    TelVuePublic playlist HTML
    CHAMPPublic event JSON
    Hyland OnBasePublic Agenda Online HTML
    Laserfiche WebLinkSaved public dated document folder HTML
    TownCloudSaved public agenda table JSON or public agenda detail HTML
    Digital TowpathPublic meeting detail HTML
    ClerkBasePublic meeting document HTML
    Municipality-published calendarPublic iCalendar feed
    WistiaPublic media JSON
    BoardablePublic Site meeting detail HTML
    gWorks FrontDeskPublic city meetings JSON
    Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
    Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
    +

    Staff handoffs

    +
      +
    • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
    • +
    • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
    • +
    • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
    • +
    • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
    • +
    • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
    • +
    • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
    • +
    +

    Shared interface

    +

    The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

    +
    python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
    +

    Use --fetch in place of the saved file to read a +supported public response.

    +

    Interfaces and other +products

    +

    The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

    +

    The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

    +

    CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

    +

    CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

    +

    TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

    +

    Windows acceptance and +limits

    +

    Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

    +

    Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

    +

    The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

    +

    Exact +Windows 1.8.1.1 acceptance and limits.

    +
\ No newline at end of file diff --git a/docs/beta-1/manuals/zoning.html b/docs/beta-1/manuals/zoning.html index 4b00a17..e8adebb 100644 --- a/docs/beta-1/manuals/zoning.html +++ b/docs/beta-1/manuals/zoning.html @@ -14,8 +14,8 @@ -

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

\ No newline at end of file diff --git a/docs/beta-1/pdf/Townlight-Access-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Access-Manual-Beta-1.pdf index 5526977..54eb5b4 100644 Binary files a/docs/beta-1/pdf/Townlight-Access-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Access-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Code-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Code-Manual-Beta-1.pdf index 59e8c59..5216fc7 100644 Binary files a/docs/beta-1/pdf/Townlight-Code-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Code-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Core-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Core-Manual-Beta-1.pdf index 343c506..fa17fab 100644 Binary files a/docs/beta-1/pdf/Townlight-Core-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Core-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Inspections-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Inspections-Manual-Beta-1.pdf index 6297876..8fc1758 100644 Binary files a/docs/beta-1/pdf/Townlight-Inspections-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Inspections-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Meeting-Imports-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Meeting-Imports-Manual-Beta-1.pdf new file mode 100644 index 0000000..09d764d Binary files /dev/null and b/docs/beta-1/pdf/Townlight-Meeting-Imports-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Meetings-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Meetings-Manual-Beta-1.pdf index 48c40ce..e346b87 100644 Binary files a/docs/beta-1/pdf/Townlight-Meetings-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Meetings-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Notice-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Notice-Manual-Beta-1.pdf index fe9154f..fd70ea1 100644 Binary files a/docs/beta-1/pdf/Townlight-Notice-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Notice-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Permitting-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Permitting-Manual-Beta-1.pdf index 4a5578c..f70b63c 100644 Binary files a/docs/beta-1/pdf/Townlight-Permitting-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Permitting-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Planning-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Planning-Manual-Beta-1.pdf index 9aa41ae..b162352 100644 Binary files a/docs/beta-1/pdf/Townlight-Planning-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Planning-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Records-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Records-Manual-Beta-1.pdf index 5ded0bd..4da6114 100644 Binary files a/docs/beta-1/pdf/Townlight-Records-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Records-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Station-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Station-Manual-Beta-1.pdf index 9ddb216..649587e 100644 Binary files a/docs/beta-1/pdf/Townlight-Station-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Station-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Suite-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Suite-Manual-Beta-1.pdf index fbc6186..962bf5b 100644 Binary files a/docs/beta-1/pdf/Townlight-Suite-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Suite-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Windows-Staff-Workflows-1.8.1.1.pdf b/docs/beta-1/pdf/Townlight-Windows-Staff-Workflows-1.8.1.1.pdf new file mode 100644 index 0000000..bb61269 Binary files /dev/null and b/docs/beta-1/pdf/Townlight-Windows-Staff-Workflows-1.8.1.1.pdf differ diff --git a/docs/beta-1/pdf/Townlight-Zoning-Manual-Beta-1.pdf b/docs/beta-1/pdf/Townlight-Zoning-Manual-Beta-1.pdf index 016ef9a..b4543b7 100644 Binary files a/docs/beta-1/pdf/Townlight-Zoning-Manual-Beta-1.pdf and b/docs/beta-1/pdf/Townlight-Zoning-Manual-Beta-1.pdf differ diff --git a/docs/beta-1/products/access/index.html b/docs/beta-1/products/access/index.html index 488047c..d0192fa 100644 --- a/docs/beta-1/products/access/index.html +++ b/docs/beta-1/products/access/index.html @@ -1 +1,96 @@ -Townlight Access | Townlight Beta 1
townlightTownlight Beta 1
Townlight Access · Townlight Beta 1

Review the source and preserve the advice.

Retain reviewed source, advice and draft provenance for human review.

townlight-access 0.5.0AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade

The bounded staff workflow

  1. Save and reopen an accessibility review with its actual source, findings and saved model advice.
  2. Retain plain-language or translation drafts with source/output, language, model, staff actor and review status.
  3. Export the complete Markdown record with verified bytes; attach the actual file through Records when authorized.

The Windows local-model workflow differs from the standalone service, whose language samples are explicitly not translations of the input. Human review remains required. Access does not certify ADA compliance or publish text.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

\ No newline at end of file + + + + + + Townlight Access + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Access / Publication review
+

Review for a clearer public document.

+

Help staff find accessibility issues, prepare plain-language and multilingual drafts, and keep an accountable record of the review.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideA document before publication
+
    +
  1. Bring the originalRetain the source and run the accessibility checks.
  2. +
  3. Review the adviceUse publishing and form checklists, plus optional local model drafts.
  4. +
  5. Keep the provenanceExport the reviewed source, advice and draft history for staff records.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Access supports

+
+

Make review repeatable

Use deterministic checks and publishing checklists to flag items for staff attention.

+

Draft with context

When a local model is configured, retain rewrite or translation output with its source and model details.

+

Preserve the review

Export a review record for filing and keep the named staff action in the audit history.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Enable Access in the Windows suite. Start with an example document and use the publishing checklist. Configure a local model for generated drafts.

+ +
+
+

Scope of this beta

+

Staff verify accessibility, readability and translation quality before publication.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/code/index.html b/docs/beta-1/products/code/index.html index 1491a1d..e02ed50 100644 --- a/docs/beta-1/products/code/index.html +++ b/docs/beta-1/products/code/index.html @@ -1 +1,101 @@ -Townlight Code | Townlight Beta 1
townlightTownlight Beta 1
Townlight Code · Townlight Beta 1

Trace every section to its source and history.

Code imports and preserves municipal code sources, supplies exact citations and version history, and connects proposed legislation to Meetings. Authorized staff separately record adoption evidence and codification.

townlight-code 1.0.9AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
For Code custodians, clerks, legal reviewers and staff seeking cited authority

What the workflow delivers

  1. Import a source. Inspect the complete bundle JSON for jurisdiction, section identifiers, source/effective dates, original name and hashes before selecting Import. Import submits directly; inspect the saved import and provenance afterward. There is no separate preview/confirmation step.
  2. Find the exact section. Search the topic and open the cited section. Check the requested as-of date and version. Keep explanatory wording separate from the retained source text.
  3. Inspect provenance. Read import history, original source and section history. Export the exact cited source when it is needed for a staff workpaper or Records evidence.
  4. Connect a proposal. Create the existing Code–Meetings connection for the actual proposal and agenda context. Retain the connection identifier and keep pending text distinct from adopted code.

Connected evidence

Receives Meetings decision evidence. Supplies permitted cited material to Records, Zoning, Permitting and Inspections. Planning’s selected installed evidence providers are Meetings and Zoning; no separate direct Code connection is implied.

Know the beta boundary

An imported document is not automatically adopted law. Local imports and orchestration do not establish a live agreement with every commercial codifier. Human approval and authoritative source applicability remain necessary.

Architecture

Where the evidence goes

Townlight Code architecture and evidence flow

Receives Meetings decision evidence. Supplies permitted cited material to Records, Zoning, Permitting and Inspections. Planning’s selected installed evidence providers are Meetings and Zoning; no separate direct Code connection is implied.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

\ No newline at end of file + + + + + + Townlight Code + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Code / Municipal code
+

Know which ordinance applied, and when.

+

Give clerks and researchers a source-backed way to search municipal code, compare effective versions, and follow an ordinance from proposal to codification.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideAn ordinance through adoption
+
    +
  1. Import the sourceKeep source metadata alongside the code tree and section history.
  2. +
  3. Review the proposalHand off the proposed change to a Meetings agenda item.
  4. +
  5. Record adoptionLink the meeting decision and finish codification under staff authority.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Code supports

+
+

Look up the effective text

Search and cite a section by date, with source and version history available for review.

+

Keep the adoption trail

Connect a proposed change to the recorded meeting decision before updating the code record.

+

Share structured references

Use section citations and structured section data in related staff workpapers.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Enable Code and import a supported municipal code source. Use Meetings for the proposal and adoption handoff.

+ +
+
+

Scope of this beta

+

The municipality supplies the authoritative code and records the adopted decision. Cited answers support staff research.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Code architecture diagram + Townlight Code architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/core/index.html b/docs/beta-1/products/core/index.html index 99b524c..257309b 100644 --- a/docs/beta-1/products/core/index.html +++ b/docs/beta-1/products/core/index.html @@ -1 +1,101 @@ -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 and tested 1.7.2.1 upgrade
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 describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

Begin with the current manual and download the Windows x64 beta 1.8.0.1. 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 Core / Shared platform
+

One foundation for municipal workflows.

+

Core gives Townlight components common services for staff identity, audit events, source ingestion and document discovery.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideHow a shared source becomes usable
+
    +
  1. Identify the actorNamed staff and module permissions give actions context.
  2. +
  3. Ingest the sourceParse supported files and retain the source record for retrieval.
  4. +
  5. Record the actionModules use shared audit and catalog services to support review.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Core supports

+
+

Shared staff authority

Use the same identity and authorization foundation across connected workspaces.

+

Reusable ingestion

Parse supported office, web and text formats for downstream citation and search.

+

Audit and catalog primitives

Record attributable actions and discover supported sources through shared services.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Core ships with the Windows suite. Use the technical guide for service configuration, schema migrations and module integration.

+ +
+
+

Scope of this beta

+

Core is a platform component. Staff use the product workspaces for case handling and official decisions.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Core architecture diagram + Townlight Core architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/inspections/index.html b/docs/beta-1/products/inspections/index.html index caa3930..70de882 100644 --- a/docs/beta-1/products/inspections/index.html +++ b/docs/beta-1/products/inspections/index.html @@ -1 +1,101 @@ -Townlight Inspections | Townlight Beta 1
townlightTownlight Beta 1
Townlight Inspections · Townlight Beta 1

Preserve evidence and review every draft finding.

Inspections retains original evidence, supplied observations and optional configured photo/audio analysis, then supports reviewed case workpapers and a separate Records copy. Automatic output is a draft for inspector review.

townlight-inspections 0.3.0+dev.2AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
For Inspectors and authorized reviewing staff

What the workflow delivers

  1. Create the case. Enter the property/case context and inspector observations. Keep staff-only notes and identifiers in their intended fields. Save before moving away from the workspace.
  2. Retain originals. Add original supported files using the existing evidence control. Inspect the filename, size and retained hash. Preserve originals separately from any derivative draft.
  3. Choose supplied or automatic text. Use supplied photo observations and a supplied voice summary for deterministic work. If configured, Analyse originals calls the image-capable provider and bundled audio transcriber. Read unavailable/failed results as such; do not label supplied text automatic.
  4. Review the analysis and citations. Compare automatic wording to the original evidence. Correct errors, uncertainty and Code citations. A model output is neither an official finding nor a notice.

Connected evidence

Consumes cited Code and Core contracts; supplies a reviewed copy to Records. It does not imply an automatic permit-system or enforcement-system writeback.

Know the beta boundary

The bundled Whistle CPU engine executes raw-audio transcription. Automatic photo analysis requires explicit vision configuration; missing configuration reports unavailable. Synthetic execution proves that adapters run, not field recognition accuracy. No official citation/fine issuance, inspection scheduling or enforcement-system writeback is provided.

Architecture

Where the evidence goes

Townlight Inspections architecture and evidence flow

Consumes cited Code and Core contracts; supplies a reviewed copy to Records. It does not imply an automatic permit-system or enforcement-system writeback.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

\ No newline at end of file + + + + + + Townlight Inspections + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Inspections / Field evidence
+

Keep each finding tied to the evidence.

+

Preserve original inspection evidence, connect it to cited rules and prepare a draft workpaper for an inspector to review.

+ +

Preview · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideFrom observation to review packet
+
    +
  1. Preserve the originalAttach evidence and retain the original file hash.
  2. +
  3. Document the findingRecord staff observations and link relevant Code sections.
  4. +
  5. Review and retainSave the reviewed workpaper and prepare the appropriate Records copy.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Inspections supports

+
+

Keep the original bytes

Retain evidence provenance even as staff revise the case or the report.

+

Cite the underlying rule

Keep observations, Code sections and the draft analysis in one workpaper.

+

Separate staff and public copies

Review the case and prepare a separately redacted copy for the Records workflow.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Use the Inspections preview composition of the Windows beta. Start with synthetic evidence and a known Code citation.

+ +
+
+

Scope of this beta

+

Preview scope covers evidence and staff workpapers. The released Windows evaluation did not establish automatic photo or audio interpretation.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Inspections architecture diagram + Townlight Inspections architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/meetings/index.html b/docs/beta-1/products/meetings/index.html index 2e454c8..f892e41 100644 --- a/docs/beta-1/products/meetings/index.html +++ b/docs/beta-1/products/meetings/index.html @@ -1 +1,101 @@ -Townlight Meetings | Townlight Beta 1
townlightTownlight Beta 1
Townlight Meetings · Townlight Beta 1

Keep the agenda, decisions and evidence connected.

Meetings supports clerk preparation and the retained proceedings of a meeting: agenda items, packets, motions, votes, supplied transcript material, minutes decisions and archives. It supplies canonical meeting and agenda context to Station.

townlight-meetings 1.0.5AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
For Clerks, meeting coordinators and authorized reviewers

What the workflow delivers

  1. Create the meeting. Enter its title, date/time including the intended time zone, location and meeting type. Save and reopen it before adding downstream evidence.
  2. Prepare the agenda and packet. Create agenda items, assign them to the actual meeting and record review. Assemble a packet from the selected items and source documents. Check the saved assembly’s packet identifier before using it for an archive or delivery.
  3. Record notice work. Use the existing notice checklist, template and posting-proof controls where applicable. A calculated checklist is evidence for clerk review; staff verify the jurisdiction’s notice requirements and actual posting.
  4. Record proceedings. Capture the actual motion, seconder and votes. Record corrections as corrections, preserving the earlier event. Retain supplied transcript text with its source label.

Connected evidence

Provides evidence to Records, Code, Zoning and Planning, and meeting identity to Station. Code adoption and codification remain separate. Supporting Notice and Access do not replace clerk review.

Know the beta boundary

Supplied transcript handling is not automatic audio transcription. Station adds capture; it does not imply a Meetings livestream hosting service. Vendor sync code and adapters are not proof that every vendor is configured or live.

Architecture

Where the evidence goes

Townlight Meetings architecture and evidence flow

Provides evidence to Records, Code, Zoning and Planning, and meeting identity to Station. Code adoption and codification remain separate. Supporting Notice and Access do not replace clerk review.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

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

\ No newline at end of file + + + + + + Townlight Meetings + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Meetings / Clerk operations
+

Keep the meeting and its record together.

+

Prepare the agenda, assemble the packet, record the decisions and keep the approved proceedings connected to their original material.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideFrom agenda to public archive
+
    +
  1. Build the packetAttach source documents and organize items for review.
  2. +
  3. Record the decisionCapture motions, votes and actions against the agenda item.
  4. +
  5. Publish proceedingsReview and adopt minutes, then retain the agenda, packet and minutes in the archive.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Meetings supports

+
+

Prepare for the dais

Assemble packet documents, create notice workpapers and retain posting proof.

+

Record what happened

Keep motion and vote corrections, action items, and adopted minutes with the meeting.

+

Carry decisions forward

Link a Code proposal to its adopted decision or pass meeting context to a separately configured Station.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Enable Meetings in the Windows suite. Create a test meeting and walk one agenda item through packet preparation, vote, minutes and archive.

+ +
+
+

Scope of this beta

+

Clerks review and adopt proceedings. Resident website deployment and Station media configuration each have their own setup.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Meetings architecture diagram + Townlight Meetings architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/notice/index.html b/docs/beta-1/products/notice/index.html index 27fe8fc..421ce85 100644 --- a/docs/beta-1/products/notice/index.html +++ b/docs/beta-1/products/notice/index.html @@ -1 +1,96 @@ -Townlight Notice | Townlight Beta 1
townlightTownlight Beta 1
Townlight Notice · Townlight Beta 1

Keep review, posting proof and the archive connected.

Review, approve and retain actual posting proof and a verified archive.

townlight-notice 0.3.0AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade

The bounded staff workflow

  1. Save the actual notice and staff-selected deadline workpaper.
  2. Review and approve the saved content; mechanical checks never establish legal approval.
  3. After official publication outside Townlight, retain actual proof files with location and posting time.
  4. Create and verify the archive, then explicitly attach it to the intended Records request with both Notice and Records authority.

Content edits invalidate current approval while preserving history. Subscriber delivery, official publication and jurisdiction-specific legal administration are outside this bounded workflow.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

\ No newline at end of file + + + + + + Townlight Notice + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Notice / Publication records
+

Keep proof of what was posted.

+

Prepare a notice, record the posting evidence and retain an archive that connects the approved text to the actual proof.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideFrom notice draft to evidence package
+
    +
  1. Prepare the draftRecord the proposed notice, rule reference and deadline.
  2. +
  3. Review and approveUse mechanical checks and capture the staff decision.
  4. +
  5. Attach proof and archiveRetain the original proof file and build a verified package for Records.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Notice supports

+
+

Start with a workpaper

Keep the notice text, checklist and deadline in a durable case history.

+

Require staff review

Record approval separately from mechanical checks. Edits invalidate earlier approval.

+

Retain original proof

Attach posting evidence with a hash and hand the reviewed archive to Records.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Enable Notice in the Windows suite. Start a test draft, review it, attach a synthetic posting proof file and inspect the archive.

+ +
+
+

Scope of this beta

+

Staff confirm applicable rules and carry out the actual posting. Mechanical checks support that review.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/permitting/index.html b/docs/beta-1/products/permitting/index.html index fb2a1b9..938fc62 100644 --- a/docs/beta-1/products/permitting/index.html +++ b/docs/beta-1/products/permitting/index.html @@ -1 +1,101 @@ -Townlight Permitting | Townlight Beta 1
townlightTownlight Beta 1
Townlight Permitting · Townlight Beta 1

Prepare a complete, cited intake for staff review.

Permitting supports pre-application and development-review intake. It imports retained requirements, produces source-grounded material/pathway guidance, saves reviewed cases and prepares a separate Records copy.

townlight-permitting 0.3.0+dev.2AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
For Permit intake staff and development-review coordinators

What the workflow delivers

  1. Import requirements. Open Requirement library and select the complete JSON RequirementBundle. Inspect jurisdiction, project type, effective/source dates, original filename/hash and material citations. Later revisions require the current revision and preserve history.
  2. Read pathway guidance. Choose the retained requirement revision and matching project type. Inspect material requirements, pathway steps and source-backed timing/fee text. If authority is absent, seek the source; do not invent a requirement, date or fee.
  3. Prepare intake. Create the case with project, location, applicant contact and staff assignment. Assess materials as not reviewed, provided, missing or unclear. Keep private notes and the proposal separate from the public summary.
  4. Select cited context. Search Code and Zoning and choose the exact permitted versions. Source availability and expected hashes are checked during search, save and export.

Connected evidence

Consumes Code and Zoning evidence and hands a reviewed Records copy to an existing request. There is no automatic creation of an Inspections case.

Know the beta boundary

Does not issue permits, collect money, calculate authoritative permit fees, schedule inspections or write decisions to a commercial permit system. Imported official fee amounts or fee-source wording are information from their source, not a new authoritative calculation. Universal vendor status mirroring and an internet applicant portal are outside this beta scope.

Architecture

Where the evidence goes

Townlight Permitting architecture and evidence flow

Consumes Code and Zoning evidence and hands a reviewed Records copy to an existing request. There is no automatic creation of an Inspections case.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

\ No newline at end of file + + + + + + Townlight Permitting + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Permitting / Development review
+

Give permit intake a clear paper trail.

+

Prepare a cited pre-application workpaper so reviewers can see the requirements, relevant context and remaining questions.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideA pre-application review
+
    +
  1. Load the requirementsImport supported local intake and review materials with provenance.
  2. +
  3. Build the caseCapture project details and link relevant Code or Zoning context.
  4. +
  5. Review the packetPreserve the staff workpaper and produce a separately reviewed Records copy.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Permitting supports

+
+

Explain the requirements

Keep the source and citation next to each applicable intake requirement.

+

Connect staff context

Attach the relevant ordinance or zoning material to the draft case.

+

Control the handoff

Retain revision history, review the case, and separate the staff packet from the Records copy.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Enable Permitting and import a supported local requirements bundle. Start with a synthetic intake, then review and export its packet.

+ +
+
+

Scope of this beta

+

The released workflow supports intake and workpapers. The permitting authority issues permits and makes entitlement decisions.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Permitting architecture diagram + Townlight Permitting architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/planning/index.html b/docs/beta-1/products/planning/index.html index 62783ad..e02a4fa 100644 --- a/docs/beta-1/products/planning/index.html +++ b/docs/beta-1/products/planning/index.html @@ -1 +1,101 @@ -Townlight Planning | Townlight Beta 1
townlightTownlight Beta 1
Townlight Planning · Townlight Beta 1

Connect policy, analysis and municipal progress.

Planning retains adopted policy imports and neighborhood applicability, saved staff analyses, reviewed snapshots, municipal initiatives and amendment history. An analysis or amendment draft does not adopt policy.

townlight-planning 0.4.0.dev2AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
For Planning staff, municipal policy reviewers and authorized administrators

What the workflow delivers

  1. Import adopted policy. Open Policy library. Preview jurisdiction, adoption/source dates, policy IDs, neighborhood applicability and originals, then confirm the complete source bundle. Retain the previous revision.
  2. Create or reopen an analysis. Open Analyses and select the project. Use Next page when the loaded page does not contain the saved work. Enter the proposal, analysis and private staff notes.
  3. Select policies and evidence. In Policies & evidence select exact policy revisions and applicable neighborhood context. Record supporting, conflicting or uncertain considerations. Select permitted Meetings or Zoning evidence with its expected hash.
  4. Save and reconcile. Use Save draft before navigating or signing out. When another revision exists, reopen it and reconcile your edits. Do not resubmit against a guessed revision identifier.

Connected evidence

Selects Meetings and Zoning evidence. Provides permitted reviewed snapshots to Records. Source selection is permission- and hash-checked and is not automatic writeback.

Know the beta boundary

Existing initiative/amendment persistence is included. A draft amendment does not change an adopted source revision. Historical standalone sample pages are not the installed staff workspace. Analysis lists and project filters operate on loaded pages; use pagination to reach additional records.

Architecture

Where the evidence goes

Townlight Planning architecture and evidence flow

Selects Meetings and Zoning evidence. Provides permitted reviewed snapshots to Records. Source selection is permission- and hash-checked and is not automatic writeback.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

\ No newline at end of file + + + + + + Townlight Planning + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Planning / Plan implementation
+

Bring the adopted plan into daily decisions.

+

Find the policy behind a recommendation, record the analysis and keep implementation progress connected to the plan.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideA policy analysis that can be reviewed
+
    +
  1. Register the planRetain imported policy text, original bytes and revision provenance.
  2. +
  3. Cite and analyzeConnect the relevant policies and supported staff context to a review workpaper.
  4. +
  5. Track the follow-throughRecord initiatives, milestones and amendment history.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Planning supports

+
+

Search the adopted source

Find policy text and confirm the underlying source or revision before using it.

+

Review and share deliberately

Prepare a cited analysis, review it and produce the appropriate staff or public snapshot.

+

Follow implementation

Track initiatives and retain status, measurement and amendment history.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Enable Planning and import a supported plan bundle. Create a cited test analysis, review it and compare staff and public exports.

+ +
+
+

Scope of this beta

+

Staff validate policy context and control publication. Adoption depends on an authorized source and recorded decision.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Planning architecture diagram + Townlight Planning architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/records/index.html b/docs/beta-1/products/records/index.html index 1099d80..c6094f5 100644 --- a/docs/beta-1/products/records/index.html +++ b/docs/beta-1/products/records/index.html @@ -1 +1,101 @@ -Townlight Records | Townlight Beta 1
townlightTownlight Beta 1
Townlight Records · Townlight Beta 1

From request intake to a deliberate release.

Records manages request intake, responsive evidence, review and the final response. Material received from another Townlight product is evidence for a request. Records separately controls release decisions, response approval, exports and fulfillment.

townlight-records 1.8.0.dev2AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
For Records officers, clerks and authorized reviewers

What the workflow delivers

  1. Receive and identify the request. Create the request with its requester, description and recorded deadline basis. Save it and retain the request identifier. Record assignment, clarification and work in the request history.
  2. Find responsive evidence. Search only the permitted sources. Inspect the source title, date, citation, visibility and version before attaching responsive material. Open the saved attachment to confirm that it is the intended evidence.
  3. Preserve the original. Keep original bytes and their hash. Add a separately reviewed release-ready or redacted copy when needed. Renaming a private file does not remove private content.
  4. Record each release decision. Explicitly record release, redact or exempt for the relevant document, with the applicable reason and source. Do not treat an AI suggestion or another product’s review as the Records legal decision.

Connected evidence

Receives selected evidence from Meetings, Code, Zoning, Planning, Permitting, Inspections and Station. Station originals are locked private evidence. A product’s public copy remains subject to the Records response workflow.

Know the beta boundary

The selected staff workflow is accepted. A resident internet deployment, every jurisdiction’s requirements, complete federation and exhaustive redaction/accessibility behavior are not certified by that acceptance. SMTP code exists; logging a message or outbox entry does not establish email delivery.

Architecture

Where the evidence goes

Townlight Records architecture and evidence flow

Receives selected evidence from Meetings, Code, Zoning, Planning, Permitting, Inspections and Station. Station originals are locked private evidence. A product’s public copy remains subject to the Records response workflow.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

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

\ No newline at end of file + + + + + + Townlight Records + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Records / Public records
+

From request to a defensible response.

+

Give records officers one place to receive requests, find the right sources, and document exactly what the city approved for release.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideA public records request
+
    +
  1. Receive and assignRecord the request, requester, deadline and staff assignment.
  2. +
  3. Find and reviewSave search work, link originals and record exemption decisions.
  4. +
  5. Approve and fulfillReview the response and selected files, then retain the release manifest.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Records supports

+
+

Keep the case together

Track clarification, deadlines, fees and correspondence in the request history.

+

Work from the source

Use cited search and linked documents to assemble a response that another officer can review.

+

Control what leaves

Keep private attachments separate from approved release files and verify the exported package.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

In Townlight for Windows, enable Records and configure named staff roles. Begin with a synthetic request, a local document, and a response approval.

+ +
+
+

Scope of this beta

+

Staff decide what may be disclosed. Local model suggestions are drafts. Public status and approved staff export are separate parts of the workflow.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Records architecture diagram + Townlight Records architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/station/index.html b/docs/beta-1/products/station/index.html index 25719e4..e9fe908 100644 --- a/docs/beta-1/products/station/index.html +++ b/docs/beta-1/products/station/index.html @@ -1 +1,101 @@ -Townlight Station | Townlight Beta 1
townlightTownlight Beta 1
Townlight Station · Townlight Beta 1

Capture the meeting and preserve its evidence.

Record council and board meetings, retain their agenda context, and deliver verified recording evidence to Records. Operators control capture, playout and approval. CivicCast remains an independent product.

townlight-station 0.3.0AGPL-3.0-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
For Station operators, clerks, Records staff and deployment administrators

What the workflow delivers

  1. Prepare meeting context. Create and save the actual meeting and agenda in Meetings. Assign each selected agenda item to that meeting. A recording request cannot substitute an editable meeting label for the canonical records.
  2. Open the operator. Sign in as authorized staff. Use the configured local operator command with the explicit native profile root. It obtains a short-lived one-use browser ticket; the native proof is not placed in the URL.
  3. Choose the input. Select the meeting, assigned agenda and administrator-configured live-source ID. For recorded-file work, place the source in the managed ingest directory and optionally supply an SRT sidecar. Callers cannot submit arbitrary pipelines or filesystem paths.
  4. Capture and stop. Start capture and distinguish waiting for a signal from active recording. Stop requests pipeline drain. Wait for completed status and validated output; a partial, failed or interrupted attempt is not a completed recording.

Connected evidence

Meetings → Station → Records is the accepted recording workflow. Townlight owns current session authority; Station owns its database, storage and media children. Standalone CivicCast remains separate, with no shared configuration, service, data directory or automatic updater fallback.

Know the beta boundary

There is no Station first-run wizard or automatic activation by the desktop composition. The accepted normal-profile path uses an explicitly configured paired Townlight HTTP process. Physical encoder/network, remote identity, SCM commissioning, CDN delivery and long-duration field quality are not certified. Station does not perform automatic meeting speech recognition.

Architecture

Where the evidence goes

Townlight Station architecture and evidence flow

Meetings → Station → Records is the accepted recording workflow. Townlight owns current session authority; Station owns its database, storage and media children. Standalone CivicCast remains separate, with no shared configuration, service, data directory or automatic updater fallback.

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

Begin with the current manual and download the Windows x64 beta 1.8.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

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

\ No newline at end of file + + + + + + Townlight Station + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Station / Municipal media
+

Keep the recording with the meeting.

+

Give municipal media operators a local service for processing meeting recordings and handing the original to the city’s Records workflow.

+ +

Separate setup · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideA meeting recording handoff
+
    +
  1. Pair the serviceConfigure Station’s own database, media storage and desktop authority.
  2. +
  3. Associate the recordingConnect the meeting context and process the media with the Station worker.
  4. +
  5. Hand off and reviewPreserve the original for Records and review any separate delivery copy.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Station supports

+
+

Connect the meeting context

Use the Meetings catalog to associate proceedings with their recording.

+

Preserve the canonical media

Hand a private recording to Records with a verifiable identity.

+

Configure delivery separately

Station includes paths for configured CivicCast SRT coverage and staff-approved completed YouTube uploads.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Use the Station guide to provision the database, media store and paired authority separately from desktop module selection.

+ +
+
+

Scope of this beta

+

The Windows acceptance exercises a synthetic recorded-file handoff. Live broadcast, physical equipment and external uploads require separate configuration and commissioning.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Station architecture diagram + Townlight Station architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/products/zoning/index.html b/docs/beta-1/products/zoning/index.html index be2f1ee..5414489 100644 --- a/docs/beta-1/products/zoning/index.html +++ b/docs/beta-1/products/zoning/index.html @@ -1 +1,101 @@ -Townlight Zoning | Townlight Beta 1
townlightTownlight Beta 1
Townlight Zoning · Townlight Beta 1

Bring parcel context and cited rules into one review.

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

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

What the workflow delivers

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

Connected evidence

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

Know the beta boundary

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

Architecture

Where the evidence goes

Townlight Zoning architecture and evidence flow

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

Evidence rather than promises

Windows Sandbox acceptance passed.

The Windows acceptance summary describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

\ No newline at end of file + + + + + + Townlight Zoning + + + + + + + + + + + + +
+ +
+
+
+
+
+
Townlight Zoning / Land use
+

Start with the parcel. Cite the rule.

+

Give planning staff a parcel-aware workspace for checking district rules and assembling the source context behind an answer.

+ +

Windows public beta · Townlight 1.8.1.1 · AGPL-3.0-only

+
+
+
Workflow guideA parcel inquiry
+
    +
  1. Find the parcelUse imported parcel and zoning data to locate the property.
  2. +
  3. Check cited rulesReview use and dimensional standards with Code context.
  4. +
  5. Save the workpaperRecord staff review and link meeting or Records context where applicable.
  6. +
+

Illustrated workflow · staff review at each decision

+
+
+
+
+
+
Inside the workflow
+

What Zoning supports

+
+

Use local parcel data

Import the municipality’s supported GeoJSON sources and review the applicable district.

+

Surface the source

Keep relevant use and dimensional citations with the inquiry.

+

Retain staff context

Save the question and review history, and attach related Code or Meetings material.

+
+
+
+
+
+
+
Evaluate locally
+

Start with one real workflow.

+

Enable Zoning and import supported parcel, district and rule data for the evaluation area. Test against a known parcel and authoritative source.

+ +
+
+

Scope of this beta

+

Source coverage drives results. Staff confirm the applicable rules and determine discretionary or site-specific outcomes.

+ Read the installed acceptance +
+
+
+
+
+
For technical teams
+

Inspect the implementation.

+

Trace the workflow to the component source pinned by the Windows release. Use the reference for integration details and the repository to report an issue or contribute a change.

+ + +
+ View the Zoning architecture diagram + Townlight Zoning architecture. The operating guide describes the services and workflow in text. +
+
+
+

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

+ + + diff --git a/docs/beta-1/readmes/code.html b/docs/beta-1/readmes/code.html index 2015371..2a29546 100644 --- a/docs/beta-1/readmes/code.html +++ b/docs/beta-1/readmes/code.html @@ -1,2 +1,1215 @@ - -Townlight Code documentation
Townlight

Townlight Code documentation

Read the current Code manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Code Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Code Manual

+

Townlight Beta 1 · Naming candidate documentation +edition 2 November 2026

+

Contents

+ +

Using this manual

+

Townlight Code helps code custodians, clerks, legal reviewers and +staff seeking cited authority. Code imports and preserves municipal code +sources, supplies exact citations and version history, and connects +proposed legislation to Meetings. Authorized staff separately record +adoption evidence and codification.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
DocumentationTownlight Beta 1 naming, Access and Notice candidate
Windows MSI version1.8.1.1
Product componenttownlight-code 1.0.9
Principal import packagetownlight_code
Native desktop source version1.8.1-1
Candidate hashesSHA-256 checksums and Windows acceptance summary
Current owned software licenseAGPL-3.0-only
Acceptance compositionWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+ +

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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.
  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. +
+

Daily workflow

+

+

1. Import a source

+

Inspect the complete bundle JSON for jurisdiction, section +identifiers, source/effective dates, original name and hashes before +selecting Import. Import submits directly; inspect the saved import and +provenance afterward. There is no separate preview/confirmation +step.

+

+

2. Find the exact section

+

Search the topic and open the cited section. Check the requested +as-of date and version. Keep explanatory wording separate from the +retained source text.

+

+

3. Inspect provenance

+

Read import history, original source and section history. Export the +exact cited source when it is needed for a staff workpaper or Records +evidence.

+

+

4. Connect a proposal

+

Create the existing Code–Meetings connection for the actual proposal +and agenda context. Retain the connection identifier and keep pending +text distinct from adopted code.

+

+

5. Record adoption

+

Record the actual authorized meeting decision with its adoption +context. An unrelated motion, packet or draft minutes does not establish +that the proposal was adopted.

+

+

6. Codify separately

+

Review the adopted text and affected sections, then record the +distinct codification closeout. Preserve prior versions and the link to +adoption evidence.

+

+

7. Share the right version

+

Select permitted source evidence downstream. If visibility or source +content changes, resolve the mismatch and select current evidence rather +than accepting a stale cached citation.

+

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

+

Receives Meetings decision evidence. Supplies permitted cited +material to Records, Zoning, Permitting and Inspections. Planning’s +selected installed evidence providers are Meetings and Zoning; no +separate direct Code connection is implied.

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputA complete supported source bundle, source and effective dates, +original file hashes and actual meeting adoption evidence.
OutputCited code text and history, exact exports, staff explanations with +source references and an explicit adoption/codification trail.
+

Product boundary

+

An imported document is not automatically adopted law. Local imports +and orchestration do not establish a live agreement with every +commercial codifier. Human approval and authoritative source +applicability remain necessary.

+

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.

+

Cited +questions summaries and local synchronization

+

Ask against an actual +retained section

+

Import and inspect the complete source bundle first. Import +submits directly; there is no separate preview/confirmation +screen in this Code UI. Check the JSON source envelope before pressing +Import, then inspect its saved import/provenance result.

+

Use the existing question control or authenticated +POST /desktop/v1/code/questions. A synthetic body is:

+
{"question":"What does the retained synthetic section require?","section_number":"18.20.050","as_of":null}
+

The section number must resolve in the imported source, and an +optional as_of must be the intended effective date. Read +the answer and cited retained version together. Missing or ambiguous +authority is a review issue, not permission to invent a section. Save +staff interpretation notes separately from official section text.

+

Draft and approve an +explanatory summary

+

Obtain the actual section ID and version ID from lookup/history. Use +POST /desktop/v1/code/sections/{section_id}/summaries with +section_version_id, summary_text, optional +language_code (default en) and draft status. +For example:

+
{"section_version_id":"synthetic-replace-with-retained-version","summary_text":"Synthetic explanatory draft for staff review.","language_code":"en","status":"draft"}
+

Reopen the section’s summaries, compare the draft with the cited +version, and use the separate +/desktop/v1/code/summaries/{summary_id}/approve operation +only after review. The summary is explanatory material, not a change to +adopted code. An approved summary does not record legislative adoption +or complete codification.

+

Operate the +existing local codifier contract

+

The local synchronization orchestrator exists in the +standalone Code application source. Its +/api/v1/townlight_code/staff/sync/... routes and +/staff/sync page are not mounted merely because the +Townlight desktop Code workspace is enabled. Use them only in an already +configured standalone deployment with genuine staff access. The +role/actor headers in its source are a trusted deployment boundary, not +credentials for an arbitrary client to invent. This guide does not ask +you to deploy another server for the desktop beta.

+
    +
  1. Register the actual official source through that application’s +source registry, preserving its vendor, official URL and source +identity. Retain the returned source_id.
  2. +
  3. Configure +/api/v1/townlight_code/staff/sync/codifier-sources with +that ID, sync_schedule and reviewed +allowlisted_hosts. Use a standard five-field cron +expression no more frequent than every 15 minutes; for example +0 3 * * *. A synthetic configure body is +{"source_id":"replace-with-registered-synthetic-id","sync_schedule":"0 3 * * *","allowlisted_hosts":[]}. +A reviewed intended on-prem host needs its explicit source-specific +allowlist; this does not bypass URL safety.
  4. +
  5. Read the configured source list and /staff/sync. Check +host validation, circuit-breaker state, delta/cursor readiness and +recorded run history. A configured source is not proof of a vendor +network connection.
  6. +
  7. Submit a local complete import payload to +/api/v1/townlight_code/staff/sync/codifier-sources/{source_id}/run. +The body is +{"payload": <complete ImportBundleCreate>, "changed_since": null}. +Use the full synthetic code-bundle example in the reference directory as +the payload, replacing source identity only with a registered synthetic +source from this exercise.
  8. +
  9. Retain the run/import identity, inspect import status, sections, +source hash and recorded cursor/history, and resolve circuit/readiness +refusals before another run. An unknown result requires readback, not +blind resubmission. This operation does not itself fetch every +commercial codifier or automatically codify an ordinance.
  10. +
+

Source contracts: townlight_runtime/code_bridge.py, +townlight_code/main.py, codifier_sync.py and +staff_sync.py. Standalone request signatures and refusals +remain in the Code API source supplement.

+

Technical specifications

+

Runtime and storage

+

The accepted package supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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

+

Source registry entries; import jobs and originals; sections and +versions; effective-date citations; questions, notes and summaries; +Meetings connections; adoption and codification closeout.

+

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 signed MSI is 2,081,316,864 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.

+

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 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.

+
import { invoke } from '@tauri-apps/api/core';
+const result = await invoke('code_domain_request', {request: {operation: 'citation', section_number: '18.20.050', as_of: null}});
+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 'CivicSuite'
+$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/code/sources' -Headers $headers
+Remove-Variable session, headers
+

Complete synthetic source +bundle

+

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

+

A synthetic write +with subsequent readback

+

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

+
$profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite'
+$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.

+

Complete technical contract

+

Read the Code 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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe 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

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

+ +++++ + + + + + + + + + + + + + + +
ProductRecorded resultPrecisely exercised
CodePASSSynthetic official source import, exact citation/history/export; +proposal into Meetings, recorded adoption and separately codified +version; native connection readback.
+ +

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

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

+ +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/core.html b/docs/beta-1/readmes/core.html index 1951bfa..8fe9014 100644 --- a/docs/beta-1/readmes/core.html +++ b/docs/beta-1/readmes/core.html @@ -1,2 +1,1238 @@ - -Townlight Core documentation
Townlight

Townlight Core documentation

Read the current Core manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Core Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Core Manual

+

Townlight Beta 1 · Naming candidate documentation +edition 2 November 2026

+

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.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
DocumentationTownlight Beta 1 naming, Access and Notice candidate
Windows MSI version1.8.1.1
Product componenttownlight-core 1.3.0.dev2
Principal import packagetownlight_core
Native desktop source version1.8.1-1
Candidate hashesSHA-256 checksums and Windows acceptance summary
Current owned software licenseAGPL-3.0-only
Acceptance compositionWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+ +

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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.
  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. +
+

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.

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputAdministrator setup choices, named staff accounts, source material +submitted through the owning product, and protected backup storage.
OutputReady 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. +
  3. 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.
  4. +
  5. 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.
  6. +
  7. 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.
  8. +
+

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 supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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. The signed MSI is 2,081,316,864 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.

+

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 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.

+
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 'CivicSuite'
+$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 'CivicSuite'
+$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.

+

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.

+

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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe 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

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

+ +++++ + + + + + + + + + + + + + + +
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.
+ +

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

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

+ +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/inspections.html b/docs/beta-1/readmes/inspections.html index f3ace51..5da1093 100644 --- a/docs/beta-1/readmes/inspections.html +++ b/docs/beta-1/readmes/inspections.html @@ -1,2 +1,1258 @@ - -Townlight Inspections documentation
Townlight

Townlight Inspections documentation

Read the current Inspections manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Inspections Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Inspections Manual

+

Townlight Beta 1 · Naming candidate documentation +edition 2 November 2026

+

Contents

+ +

Using this manual

+

Townlight Inspections helps inspectors and authorized reviewing +staff. Inspections retains original evidence, supplied observations and +optional configured photo/audio analysis, then supports reviewed case +workpapers and a separate Records copy. Automatic output is a draft for +inspector review.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
DocumentationTownlight Beta 1 naming, Access and Notice candidate
Windows MSI version1.8.1.1
Product componenttownlight-inspections 0.3.0+dev.2
Principal import packagetownlight_inspections
Native desktop source version1.8.1-1
Candidate hashesSHA-256 checksums and Windows acceptance summary
Current owned software licenseAGPL-3.0-only
Acceptance compositionWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+ +

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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.
  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. +
+

Daily workflow

+

+

1. Create the case

+

Enter the property/case context and inspector observations. Keep +staff-only notes and identifiers in their intended fields. Save before +moving away from the workspace.

+

+

2. Retain originals

+

Add original supported files using the existing evidence control. +Inspect the filename, size and retained hash. Preserve originals +separately from any derivative draft.

+

+

3. Choose supplied or +automatic text

+

Use supplied photo observations and a supplied voice summary for +deterministic work. If configured, Analyse originals calls the +image-capable provider and bundled audio transcriber. Read +unavailable/failed results as such; do not label supplied text +automatic.

+

+

4. Review the analysis and +citations

+

Compare automatic wording to the original evidence. Correct errors, +uncertainty and Code citations. A model output is neither an official +finding nor a notice.

+

+

5. Save and record review

+

Save the case and explicitly record inspector/staff review of that +revision. Later edits create a draft requiring renewed review. Retain +the case history.

+

+

6. Prepare the Records copy

+

Separately edit and review the public summary. Preview the Records +copy and confirm that private observations, property/address detail and +staff notes are excluded according to its contract.

+

+

7. Hand off exact bytes

+

Attach the reviewed copy to an existing Records request. Inspect its +attachment/hash in Records. Attachment does not issue an enforcement +action or approve a public-records response.

+

Working safely

+

Use your own named account and save before leaving a screen. A saved +draft is durable; unsaved form text may not be. If a write has an +unknown result, reopen its record before repeating it.

+

Read source jurisdiction, dates, citation, version and visibility. A +copied source hash identifies exact bytes, not their legal +applicability. If a source changes or permission is removed, resolve the +source problem rather than substituting stale cached content.

+

Keep originals and derivatives separate. Review the intended audience +before export. A public summary excludes private fields only through the +applicable copy contract and your review. A renamed private packet is +still private content.

+

Drafting, review, approval, attachment, export, fulfillment and +publication are separate operations. A Townlight workpaper does not +itself adopt law, issue a permit, impose a fine or release a records +response. The responsible staff member records the applicable +decision.

+

Connected workflows

+

Consumes cited Code and Core contracts; supplies a reviewed copy to +Records. It does not imply an automatic permit-system or +enforcement-system writeback.

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputInspector-supplied text, original supported photographs or audio, a +configured image-capable provider when photo analysis is selected, and +permitted Code authority.
OutputRetained evidence with provenance, editable automatic drafts where +configured, reviewed cases and exact audience-specific packets.
+

Product boundary

+

The bundled Whistle CPU engine executes raw-audio transcription. +Automatic photo analysis requires explicit vision configuration; missing +configuration reports unavailable. Synthetic execution proves that +adapters run, not field recognition accuracy. No official citation/fine +issuance, inspection scheduling or enforcement-system writeback is +provided.

+

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.

+

Evidence limits +outlines and previous cases

+

Select supported original +files

+

The retained-original contract accepts the following MIME types, up +to 10,000,000 bytes per original. This is a decimal +byte limit, not 10 MiB. An unsupported type or oversized file is +refused; preserve the original outside the import and choose a supported +derivative deliberately rather than changing its filename to disguise +the type.

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + +
MaterialAccepted MIME types
Photographsimage/jpeg, image/png, +image/webp
Audioaudio/webm, audio/ogg, +audio/wav, audio/mpeg, +audio/mp4
Plain texttext/plain
Documentapplication/pdf
+

The case input bounds evidence to ten items; the browser’s +upload-body guard can be more restrictive when encoding/combining files. +Read the actual refusal and reduce the selected batch rather than +assuming the per-file limit guarantees the entire request will fit. +Accepted retention of text/PDF does not promise photo analysis of that +format. Configure an image-capable vision model for photographs. Whistle +handles supported raw audio when provisioned; TextFlowKit is a +separately configured alternative. Missing configuration is unavailable, +not a fabricated successful analysis.

+

Retain the original filename, MIME type, byte count and SHA256. +Compare generated observations/transcript with the evidence, correct the +draft and record review of the saved case revision. Supplied photo +observations or a supplied voice summary must remain labeled supplied +text.

+

Find earlier retained cases

+

Use the existing repeat-case lookup or authenticated +POST /desktop/v1/inspections/repeat-cases with:

+
{"property_reference":"Synthetic parcel A"}
+

Use the same property reference as the saved synthetic case. The +mounted implementation matches the normalized property reference against +saved case heads, verifies each revision hash and returns up to 50 +entries with entity/revision identity, title and review state, plus +sample_data: false. Empty results mean no matching retained +cases in this store. This is separate from the lower-level +townlight_inspections.case_lookup.lookup_repeat_cases +helper, which returns sample context and is not the mounted saved-case +query. Neither route queries an external enforcement system. Keep any +real prior case identity and facts separate from a model’s proposed +narrative. No GIS capture or external enforcement-system connection is +implied.

+

Prepare an outline for +review

+

The mounted POST /desktop/v1/inspections/notice-draft +accepts the same InspectionInput shape as the saved +workflow, not an arbitrary notice recipient or enforcement command. For +example:

+
{"title":"Synthetic review","property_reference":"Synthetic parcel A","inspection_reference":"SYN-001","dataset_kind":"fictional","inspector_notes":"Synthetic loose panel observed","photo_observations":["Synthetic panel appears loose"],"voice_notes":"Inspector supplied summary"}
+

Inspect the returned draft/outline and its limitations. The +lower-level townlight_inspections.notice_draft.draft_notice +takes case identity, property reference, violation type and supplied +observations. This source helper supplies a reviewable outline; it does +not issue a citation, serve notice, choose an official fine or make an +enforcement determination. Where no native button exists, technical +staff use the current authenticated API rather than an invented +screen.

+

Revise the saved case’s notice_draft only after checking +the actual evidence and applicable Code source. Save and record review +again; a new revision does not inherit the previous review. The staff +packet and separately reviewed Records copy retain their existing +audience/exclusion rules. A drafted outline is neither a Records release +nor proof that a notice was delivered.

+

Source contracts: +townlight_inspections/media_analysis.py, +case_lookup.py, notice_draft.py, workflow +models and townlight_runtime/inspections_bridge.py.

+

Technical specifications

+

Runtime and storage

+

The accepted package supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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

+

Original evidence files and hashes; media analysis records; +observations and voice summaries; Code citations; case revisions; review +records; private packets and separately edited Records copies.

+

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 signed MSI is 2,081,316,864 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.

+

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.

+

Optional media analysis +configuration

+

TOWNLIGHT_INSPECTIONS_VISION_PROVIDER accepts +ollama, openai or anthropic. +Select an actually image-capable model through +TOWNLIGHT_INSPECTIONS_VISION_MODEL; an Ollama endpoint may +use TOWNLIGHT_INSPECTIONS_VISION_BASE_URL. +TOWNLIGHT_INSPECTIONS_VISION_THINK accepts +true/false/low/medium/high where that configured adapter uses it. Keep +provider credentials in protected deployment configuration, never in a +source bundle. Missing vision configuration returns unavailable rather +than invented observations.

+

TOWNLIGHT_INSPECTIONS_TRANSCRIBER selects +whistle or textflowkit; the installed +candidate provisions the bundled Whistle CPU path. The owning +transcriber assets and retained notices must stay with it. A provider +result remains an editable draft with original evidence retained. The +separate TextFlowKit MCP adapter is not an automatically enabled +Townlight server.

+

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.

+
import { invoke } from '@tauri-apps/api/core';
+const result = await invoke('inspections_domain_request', {request: {operation: 'cases', offset: 0}});
+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 'CivicSuite'
+$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/inspections/evidence/supported-types' -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 'CivicSuite'
+$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.

+

Complete technical contract

+

Read the Inspections 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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe snapshot was restored but services have not resumed.Use Start, then Check and verify a saved record; do not blindly +repeat restore.
Photo analysis unavailableNo configured image-capable vision service.Use supplied observations or have an administrator configure the +existing adapter.
Automatic text is incorrectModel recognition is uncertain or wrong.Compare original evidence, edit and record inspector review before +any official use.
+

Verified workflows and +limits

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

+ +++++ + + + + + + + + + + + + + + +
ProductRecorded resultPrecisely exercised
InspectionsPASSRetained original/hash, supplied observations and voice summary, +saved/reviewed case/readback, separate exact Records copy and private +handoff; address exclusion; native workspace.
+ +

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

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

+ +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/meetings.html b/docs/beta-1/readmes/meetings.html index ff7006d..e640b60 100644 --- a/docs/beta-1/readmes/meetings.html +++ b/docs/beta-1/readmes/meetings.html @@ -1,2 +1,1181 @@ - -Townlight Meetings documentation
Townlight

Townlight Meetings documentation

Read the current Meetings manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Meetings Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Meetings Manual

+

Townlight Beta 1 · Naming candidate documentation +edition 2 November 2026

+

Contents

+ +

Using this manual

+

Townlight Meetings helps clerks, meeting coordinators and authorized +reviewers. Meetings supports clerk preparation and the retained +proceedings of a meeting: agenda items, packets, motions, votes, +supplied transcript material, minutes decisions and archives. It +supplies canonical meeting and agenda context to Station.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
Public documentation identityTownlight Beta 1
Windows MSI version1.8.1.1
Product componenttownlight-meetings 1.0.5
Principal import packagetownlight_meetings
Native desktop source version1.8.1-1
Candidate MSI SHA256Windows acceptance summary
Corresponding-source SHA256Corresponding source archive and checksums
Current owned software licenseAGPL-3.0-only
Supported acceptance profileWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+

Windows MSI 1.8.1.1 includes Townlight Meetings 1.0.5. The approved profile path is %LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data and backups.

+

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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 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. +
+

Daily workflow

+

+

1. Create the meeting

+

Enter its title, date/time including the intended time zone, location +and meeting type. Save and reopen it before adding downstream +evidence.

+

+

2. Prepare the agenda and +packet

+

Create agenda items, assign them to the actual meeting and record +review. Assemble a packet from the selected items and source documents. +Check the saved assembly’s packet identifier before using it for an +archive or delivery.

+

+

3. Record notice work

+

Use the existing notice checklist, template and posting-proof +controls where applicable. A calculated checklist is evidence for clerk +review; staff verify the jurisdiction’s notice requirements and actual +posting.

+

+

4. Record proceedings

+

Capture the actual motion, seconder and votes. Record corrections as +corrections, preserving the earlier event. Retain supplied transcript +text with its source label.

+

+

5. Review minutes

+

Draft from identified source material. Check the citations and +wording. Record the explicit minutes decision; a draft or a motion is +not adopted minutes.

+

+

6. Record legislation evidence

+

When an ordinance or resolution is adopted, record the actual Code +connection decision. Code staff separately perform codification; meeting +adoption does not silently rewrite the code.

+

+

7. Archive and hand off

+

Choose the appropriate visibility and saved packet/minutes. Inspect +the resulting proceedings and permitted archive. Use Station’s operator +for capture and Records for a separate response/release.

+

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

+

Provides evidence to Records, Code, Zoning and Planning, and meeting +identity to Station. Code adoption and codification remain separate. +Supporting Notice and Access do not replace clerk review.

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputA meeting schedule, staff agenda material, source documents, +recorded clerk decisions and supplied transcript text.
OutputVersioned meeting evidence, packets, proceedings, reviewed minutes +and permitted archive documents. Station receives the selected meeting +and agenda snapshot.
+

Product boundary

+

Supplied transcript handling is not automatic audio transcription. +Station adds capture; it does not imply a Meetings livestream hosting +service. Vendor sync code and adapters are not proof that every vendor +is configured or live.

+

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.

+

Transcript corrections +and action items

+

Preserve supplied +transcript history

+
    +
  1. Save the actual meeting first. Retain the supplied text’s source +label and confirm that the material belongs to that meeting. Supplied +text is not automatic audio transcription.
  2. +
  3. Use the transcript capture operation. The installed route is +POST /desktop/v1/meetings/meetings/{meeting_id}/transcripts. +It requires source_label and transcript_text; +the server attributes the signed-in actor.
  4. +
  5. Read the meeting’s proceedings and retain the returned transcript +id. If text needs correction, submit a new +capture for the same meeting with correction_of_id +set to that original ID. Do not replace the original row or silently +edit its audit history.
  6. +
  7. Read proceedings again and confirm both entries, their source +labels, actor/time and correction link. A correction referencing an +entry from another meeting is refused. Reconcile the corrected text +before using it in reviewed minutes.
  8. +
+

For an already saved synthetic meeting, an initial request body +is:

+
{"source_label":"Synthetic clerk text v1","transcript_text":"The synthetic meeting opened at 18:00."}
+

A subsequent correction body is:

+
{"source_label":"Synthetic clerk correction v2","transcript_text":"The synthetic meeting opened at 18:05.","correction_of_id":"11111111-1111-4111-8111-111111111111"}
+

Replace the example UUID with the ID returned by the first capture. +An HTTP client must use the existing authenticated native proof as +described in the technical reference. Readback uses +GET /desktop/v1/meetings/meetings/{meeting_id}/proceedings; +its transcripts collection preserves the append-only +entries. Correcting a transcript does not automatically revise adopted +minutes or publish the material.

+

Retain action items +with the proceedings

+

Use +POST /desktop/v1/meetings/meetings/{meeting_id}/action-items +with a description, optional assignee and optional saved source motion +ID. For example:

+
{"description":"Prepare the synthetic follow-up report","assigned_to":"Synthetic staff","source_motion_id":null}
+

If linking a motion, obtain its actual saved identity and keep the +item in its meeting context. Inspect the returned identity and the +action_items collection in proceedings. This captures a +retained action item; it does not send an email, enforce a task deadline +or turn a note into adopted legislation. Where a native screen does not +expose this field, technical staff use the existing authenticated API +rather than an invented button.

+

Source contracts: townlight_meetings/transcripts.py, +townlight_meetings/motion_vote.py and +townlight_runtime/meetings_bridge.py. The exact motion +repository filename and all mounted route models are retained in the +source inventory/API companion.

+

Technical specifications

+

Runtime and storage

+

The accepted package supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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

+

Meetings and stages; agenda items and assignments; packet snapshots +and deliveries; notices and posting proof; motions and corrections; +votes; transcript records; minutes drafts and decisions; archives.

+

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 signed MSI is 2,081,316,864 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.

+

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 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.

+
import { invoke } from '@tauri-apps/api/core';
+const result = await invoke('meetings_domain_request', {request: {operation: 'get-proceedings', id: meetingId}});
+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 'CivicSuite'
+$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/meetings/station/catalog' -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 'CivicSuite'
+$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.

+

Complete technical contract

+

Read the Meetings 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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe 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

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

+ +++++ + + + + + + + + + + + + + + +
ProductRecorded resultPrecisely exercised
MeetingsPASSMeeting/agenda, packet assembly, motion/vote, supplied transcript, +reviewed/adopted minutes, restricted local archive and proceedings +readback; Code decision integration.
+ +

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

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

+ +

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

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/permitting.html b/docs/beta-1/readmes/permitting.html index 15f3464..f8b7f4e 100644 --- a/docs/beta-1/readmes/permitting.html +++ b/docs/beta-1/readmes/permitting.html @@ -1,2 +1,1193 @@ - -Townlight Permitting documentation
Townlight

Townlight Permitting documentation

Read the current Permitting manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Permitting Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Permitting Manual

+

Townlight Beta 1 · Naming candidate documentation +edition 2 November 2026

+

Contents

+ +

Using this manual

+

Townlight Permitting helps permit intake staff and development-review +coordinators. Permitting supports pre-application and development-review +intake. It imports retained requirements, produces source-grounded +material/pathway guidance, saves reviewed cases and prepares a separate +Records copy.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
DocumentationTownlight Beta 1 naming, Access and Notice candidate
Windows MSI version1.8.1.1
Product componenttownlight-permitting 0.3.0+dev.2
Principal import packagetownlight_permitting
Native desktop source version1.8.1-1
Candidate hashesSHA-256 checksums and Windows acceptance summary
Current owned software licenseAGPL-3.0-only
Acceptance compositionWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+ +

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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.
  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. +
+

Daily workflow

+

+

1. Import requirements

+

Open Requirement library and select the complete JSON +RequirementBundle. Inspect jurisdiction, project type, effective/source +dates, original filename/hash and material citations. Later revisions +require the current revision and preserve history.

+

+

2. Read pathway guidance

+

Choose the retained requirement revision and matching project type. +Inspect material requirements, pathway steps and source-backed +timing/fee text. If authority is absent, seek the source; do not invent +a requirement, date or fee.

+

+

3. Prepare intake

+

Create the case with project, location, applicant contact and staff +assignment. Assess materials as not reviewed, provided, missing or +unclear. Keep private notes and the proposal separate from the public +summary.

+

+

4. Select cited context

+

Search Code and Zoning and choose the exact permitted versions. +Source availability and expected hashes are checked during search, save +and export.

+

+

5. Save and review

+

Save the intake, reopen it and reconcile revision conflicts. Record +staff review with review notes. The trusted staff path derives the +reviewer; later edits require a new review.

+

+

6. Inspect each audience

+

A staff packet can contain private detail. A Records copy uses the +separately reviewed public summary and excludes applicant contact, +location, proposal, material notes and private staff notes. Preview it +before creating it.

+

+

7. Attach and verify

+

Attach the exact hash-checked copy to an existing Records request. +Reopen Records and inspect it. Records retains its separate release, +approval and fulfillment controls.

+

Working safely

+

Use your own named account and save before leaving a screen. A saved +draft is durable; unsaved form text may not be. If a write has an +unknown result, reopen its record before repeating it.

+

Read source jurisdiction, dates, citation, version and visibility. A +copied source hash identifies exact bytes, not their legal +applicability. If a source changes or permission is removed, resolve the +source problem rather than substituting stale cached content.

+

Keep originals and derivatives separate. Review the intended audience +before export. A public summary excludes private fields only through the +applicable copy contract and your review. A renamed private packet is +still private content.

+

Drafting, review, approval, attachment, export, fulfillment and +publication are separate operations. A Townlight workpaper does not +itself adopt law, issue a permit, impose a fine or release a records +response. The responsible staff member records the applicable +decision.

+

Connected workflows

+

Consumes Code and Zoning evidence and hands a reviewed Records copy +to an existing request. There is no automatic creation of an Inspections +case.

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputA complete RequirementBundle with jurisdiction, project type, source +dates, originals and citations; proposal/contact details; permitted +Code/Zoning sources.
OutputSource-grounded guidance, saved reviewed intake workpapers and an +exact audience-specific packet or Records handoff.
+

Product boundary

+

Does not issue permits, collect money, calculate authoritative permit +fees, schedule inspections or write decisions to a commercial permit +system. Imported official fee amounts or fee-source wording are +information from their source, not a new authoritative calculation. +Universal vendor status mirroring and an internet applicant portal are +outside this beta scope.

+

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.

+

Describe a +project and read source grounded guidance

+
    +
  1. Import and verify the complete requirement bundle in +Requirement library. Retain its actual revision and +matching project type. A bundle for a different project type is not +interchangeable authority.
  2. +
  3. Open Describe your project. Enter the +project type, retained requirement +revision, your proposal and location +context. The proposal explains the contemplated work; location +context helps staff understand applicability. Keep private applicant +contact and staff notes in their intended intake fields rather than a +public explanation.
  4. +
  5. Request the existing pathway. Read required materials, cited steps +and any source-backed timing or fee information together with the +retained sources.
  6. +
  7. Inspect the unavailable items. The application can +return useful cited material and also explicitly lack authority for a +fee, duration or stage. Obtain an applicable source or leave it +unavailable; do not turn a blank into zero or a guessed deadline.
  8. +
  9. If preparing a case, save the intake separately, select actual +Code/Zoning authority, record staff review and inspect the public copy +before the Records handoff. Requesting guidance is not issuance or +approval.
  10. +
+

An authenticated request to +POST /desktop/v1/permitting/pathway can use:

+
{"project_type":"synthetic-deck","requirement_revision":"11111111-1111-4111-8111-111111111111","proposal":"Replace a synthetic residential deck","location_context":"Fictional test parcel"}
+

Replace the revision and project type with the matching retained +synthetic bundle. The API’s optional fee_link is an exact +permitted source link when the client can supply one; it is not a fee +formula or arbitrary amount. The native Describe your project form does +not become a fee-authority editor. Imported official amounts and +explanatory estimates retain their source and informational status. No +authoritative fee calculation, payment collection, live-model call, +vendor status mirror or new portal is added by this workflow.

+

Expected readback is the source-grounded guidance together with +citations and explicitly unavailable items. Check actual source +identity/hash and review-required/informational indicators, rather than +treating a successful HTTP response as proof of complete or +authoritative guidance. Read the full returned shape in the API +reference and preserve a copy only through the existing +saved-case/review contracts.

+

Source contracts: townlight_permitting/pathway.py, +requirement source models, +townlight_runtime/permitting_bridge.py and the Permitting +view.

+

Technical specifications

+

Runtime and storage

+

The accepted package supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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

+

Requirement bundles and immutable revisions; cited materials and +pathway steps; source timing and fee information; intake cases and +revisions; material assessments; reviews; staff and Records packets.

+

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 signed MSI is 2,081,316,864 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.

+

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.

+

Requirement source +configuration

+

The supported requirement source is a complete versioned JSON bundle, +not an editable label pointing to an absent file. It retains project +type, source/effective dates, original name/hash and citations. Import a +later revision against the current expected revision. Pathway dates and +fee text must be tied to that retained authority. No official fee engine +or commercial permitting writeback is configured by this manual.

+

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.

+
import { invoke } from '@tauri-apps/api/core';
+const result = await invoke('permitting_domain_request', {request: {operation: 'requirements', offset: 0}});
+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 'CivicSuite'
+$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/permitting/requirements' -Headers $headers
+Remove-Variable session, headers
+

Complete synthetic source +bundle

+

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

+

A synthetic write +with subsequent readback

+

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

+
$profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite'
+$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.

+

Complete technical contract

+

Read the Permitting 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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe 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

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

+ +++++ + + + + + + + + + + + + + + +
ProductRecorded resultPrecisely exercised
PermittingPASSRetained requirement import, source-grounded +materials/pathway/timing, saved intake/review, separate hash-checked +Records copy and private handoff; contact exclusion; native +workspace.
+ +

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

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

+ +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/planning.html b/docs/beta-1/readmes/planning.html index 0ade7a7..f572ac7 100644 --- a/docs/beta-1/readmes/planning.html +++ b/docs/beta-1/readmes/planning.html @@ -1,2 +1,1225 @@ - -Townlight Planning documentation
Townlight

Townlight Planning documentation

Read the current Planning manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Planning Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Planning Manual

+

Townlight Beta 1 · Naming candidate documentation +edition 2 November 2026

+

Contents

+ +

Using this manual

+

Townlight Planning helps planning staff, municipal policy reviewers +and authorized administrators. Planning retains adopted policy imports +and neighborhood applicability, saved staff analyses, reviewed +snapshots, municipal initiatives and amendment history. An analysis or +amendment draft does not adopt policy.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
DocumentationTownlight Beta 1 naming, Access and Notice candidate
Windows MSI version1.8.1.1
Product componenttownlight-planning 0.4.0.dev2
Principal import packagetownlight_planning
Native desktop source version1.8.1-1
Candidate hashesSHA-256 checksums and Windows acceptance summary
Current owned software licenseAGPL-3.0-only
Acceptance compositionWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+ +

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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.
  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. +
+

Daily workflow

+

+

1. Import adopted policy

+

Open Policy library. Preview jurisdiction, adoption/source dates, +policy IDs, neighborhood applicability and originals, then confirm the +complete source bundle. Retain the previous revision.

+

+

2. Create or reopen an +analysis

+

Open Analyses and select the project. Use Next page when the loaded +page does not contain the saved work. Enter the proposal, analysis and +private staff notes.

+

+

3. Select policies and +evidence

+

In Policies & evidence select exact policy revisions and +applicable neighborhood context. Record supporting, conflicting or +uncertain considerations. Select permitted Meetings or Zoning evidence +with its expected hash.

+

+

4. Save and reconcile

+

Use Save draft before navigating or signing out. When another +revision exists, reopen it and reconcile your edits. Do not resubmit +against a guessed revision identifier.

+

+

5. Review the saved revision

+

In Review & export check the audience, public summary and review +notes. Save, then Record review of saved draft. The trusted staff path +derives identity/date. Editing later produces a new revision requiring +review.

+

+

6. Create and export a +snapshot

+

Preview the reviewed saved revision, inspect the returned content, +then create the snapshot. Public copies exclude staff notes and full +staff analysis under the public contract. Export verifies the expected +SHA256.

+

+

7. Track initiatives and +amendments

+

Create and revise municipal initiative status, responsibility, +targets, milestones and measurements using the existing controls. Retain +history. Draft and review amendments separately; adoption must identify +the actual adopted source revision.

+

+

8. Share deliberately

+

Select a permitted snapshot in Records. Creating a snapshot does not +publish it, release a request or adopt policy.

+

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

+

Selects Meetings and Zoning evidence. Provides permitted reviewed +snapshots to Records. Source selection is permission- and hash-checked +and is not automatic writeback.

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputComplete adopted policy source bundles, proposal context, versioned +policy selections, permitted Meetings/Zoning evidence and staff progress +updates.
OutputCited analyses, audience-specific reviewed snapshots, durable +initiative/history records and amendment lifecycle records.
+

Product boundary

+

Existing initiative/amendment persistence is included. A draft +amendment does not change an adopted source revision. Historical +standalone sample pages are not the installed staff workspace. Analysis +lists and project filters operate on loaded pages; use pagination to +reach additional records.

+

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.

+

Exploration initiatives +and amendments

+

Explore adopted plans

+

Open Policy library and find Explore adopted +plans. Enter a topic and/or choose the supplied goal, +neighborhood and plan-type filters. These are separate facets; keyword +search is not a substitute for neighborhood applicability. Run +exploration and inspect each returned plan, adopted/source dates, exact +policy references and permitted original material. Empty results can +mean no matching permitted adopted source, not an error or an invented +plan.

+

The existing public exploration transport is +planning_public_request, separate from staff +planning_domain_request. Technical clients use its +documented plan-explore operation or the mounted public +route in the API companion. A native operation fragment is:

+
{"operation":"plan-explore","payload":{"topic":"synthetic mobility","neighborhood":"Synthetic North","goal":"","plan_type":""}}
+

Only public-permitted adopted sources belong in this result. Private +staff analyses, selected restricted evidence and staff notes do not +become public through exploration. The output includes matching +plans/facets and an informational disclaimer; no cross-plan AI synthesis +or internet portal commissioning is implied.

+

Track a municipal initiative

+

Open Implementation & amendments. Choose an +actual retained policy selection, title, responsible staff, target, +unit, due date and explanatory note. Save a planned/active initiative +and reopen its current revision/history. Add milestones and measurements +with their dates and evidence. Each change uses the latest +expected_revision; reconcile a conflict by reopening the +current state rather than guessing a revision.

+

The initiative statuses are planned, +active, completed and cancelled. +A completed initiative requires measurement evidence and every supplied +milestone completed. A milestone completion needs supporting evidence +and a completion date that is not in the future. Numerical progress +without its source/evidence is not a completed municipal outcome.

+

For a synthetic exercise, create an active initiative with a +fictional policy selection, target 3, unit +synthetic reviews, an intended future due date and a note +explaining the test. Add one evidence-backed measurement, then complete +each milestone before requesting completed status. Read the saved +initiative/history after every accepted revision. No external project +system is updated by this save.

+

Retain an amendment +lifecycle

+

An amendment has its own proposal and history; changing an analysis +does not adopt an amendment. In Implementation & +amendments, select the actual policy, enter proposal text, +title, responsible staff and a note, then save draft. The +allowed amendment statuses are draft, review, +adopted and withdrawn.

+

Moving to review or adopted requires a +recorded review_note. Before recording +adopted, import and verify the actual adopted policy +revision, then supply its adoption_revision identity. Only +an adopted amendment may carry that field; draft/review/withdrawn +records must omit it or use null. The proposal’s existing policy +reference and newly imported adoption revision have distinct roles. +Staff record the authorized decision; a status choice does not itself +enact policy.

+

Use the latest expected_revision when revising. Reopen +the amendment and municipal history, confirm status, review note and +adoption link, and retain prior revisions. Public exploration changes +only when its permitted adopted sources actually change, not merely +because staff created a proposal.

+

Source contracts: townlight_planning/public_explore.py, +municipal.py, +townlight_runtime/planning_bridge.py and the Planning view. +The API dictionary carries InitiativeInput, +Milestone, Measurement, +AmendmentInput and the exact policy-selection fields; +conditional completion/adoption checks above also apply beyond simple +field validation.

+

Technical specifications

+

Runtime and storage

+

The accepted package supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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

+

Plan bundles and revisions; original documents; versioned policy +selections and neighborhood applicability; analysis revisions; reviews +and snapshots; initiatives, milestones and measurements; amendment +revisions.

+

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 signed MSI is 2,081,316,864 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.

+

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 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.

+
import { invoke } from '@tauri-apps/api/core';
+const result = await invoke('planning_domain_request', {request: {operation: 'sources', offset: 0}});
+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 'CivicSuite'
+$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/planning/sources' -Headers $headers
+Remove-Variable session, headers
+

Complete synthetic source +bundle

+

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

+

A synthetic write +with subsequent readback

+

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

+
$profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite'
+$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.

+

Complete technical contract

+

Read the Planning 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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe 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

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

+ +++++ + + + + + + + + + + + + + + +
ProductRecorded resultPrecisely exercised
PlanningPASSAdopted source import with neighborhood, saved/reviewed analysis and +snapshot, persisted initiative/history and draft amendment, public +explorer neighborhood readback and native workspace.
+ +

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

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

+ +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/records.html b/docs/beta-1/readmes/records.html index 261f27f..6d40de1 100644 --- a/docs/beta-1/readmes/records.html +++ b/docs/beta-1/readmes/records.html @@ -1,2 +1,1239 @@ - -Townlight Records documentation
Townlight

Townlight Records documentation

Read the current Records manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Records Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Records Manual

+

Townlight Beta 1 · Naming candidate documentation +edition 2 November 2026

+

Contents

+ +

Using this manual

+

Townlight Records helps records officers, clerks and authorized +reviewers. Records manages request intake, responsive evidence, review +and the final response. Material received from another Townlight product +is evidence for a request. Records separately controls release +decisions, response approval, exports and fulfillment.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
DocumentationTownlight Beta 1 naming, Access and Notice candidate
Windows MSI version1.8.1.1
Product componenttownlight-records 1.8.0.dev2
Principal import packagetownlight_records
Native desktop source version1.8.1-1
Candidate hashesSHA-256 checksums and Windows acceptance summary
Current owned software licenseAGPL-3.0-only
Acceptance compositionWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+ +

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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.
  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. +
+

Daily workflow

+

+

1. Receive and identify the +request

+

Create the request with its requester, description and recorded +deadline basis. Save it and retain the request identifier. Record +assignment, clarification and work in the request history.

+

+

2. Find responsive evidence

+

Search only the permitted sources. Inspect the source title, date, +citation, visibility and version before attaching responsive material. +Open the saved attachment to confirm that it is the intended +evidence.

+

+

3. Preserve the original

+

Keep original bytes and their hash. Add a separately reviewed +release-ready or redacted copy when needed. Renaming a private file does +not remove private content.

+

+

4. Record each release +decision

+

Explicitly record release, redact or exempt for the relevant +document, with the applicable reason and source. Do not treat an AI +suggestion or another product’s review as the Records legal +decision.

+

+

5. Draft and approve

+

Draft the response and review the selected attachments. Record +approval of the exact response text. Editing that text changes its hash +and requires a new approval.

+

+

6. Export both artifacts

+

Export the approved response and the release package. If release is +refused, inspect the missing decision, approval or source-permission +message. Resolve that condition before trying again.

+

+

7. Fulfill and retain

+

Use the explicit fulfillment action only after checking the outgoing +artifacts. Retain the response, package and history. A preview, +attachment or export by itself does not fulfill the request.

+

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

+

Receives selected evidence from Meetings, Code, Zoning, Planning, +Permitting, Inspections and Station. Station originals are locked +private evidence. A product’s public copy remains subject to the Records +response workflow.

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputA request description and requester, authorized source documents, +explicit cross-product evidence selections and a reviewer’s +decisions.
OutputA retained request history, reviewed attachments, approved response +text and a release package after the applicable release checks.
+

Product boundary

+

The selected staff workflow is accepted. A resident internet +deployment, every jurisdiction’s requirements, complete federation and +exhaustive redaction/accessibility behavior are not certified by that +acceptance. SMTP code exists; logging a message or outbox entry does not +establish email delivery.

+

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.

+

Fees messages +notifications and local intake

+

Record a fee line or waiver

+

Open the saved request’s existing fee controls. Enter the +description, adopted schedule/source basis and exact amount in dollars +and cents. For example, a synthetic line can use description “Synthetic +reproduction,” basis “Fictional test schedule” and amount +12.50. Save and reopen the request. Inspect +fee_line_items, fee_status and the resulting +estimate. The native line validator accepts positive exact cents; +additional fractional cents, negative values and a zero line are +refused.

+

To waive the request fee, record the actual waiver reason and save +through the waiver control. Reopen the request and confirm waived status +and the zero-dollar waiver explanation. Adding a later line preserves +the waiver in the current workflow; do not assume it reinstates a +payable balance. These are Records workflow amounts and decisions, not +an official permit-fee calculator or payment service.

+

A trusted native client uses records_domain_request with +operation: 'apply', the real request_id, and +action/payload fields from the fragments below +at the same level as operation and request_id. +Examples of command payloads follow; IDs and permissions still come from +the signed-in synthetic account.

+
{"action":"add-records-fee-line","payload":{"feeLineDescription":"Synthetic reproduction","feeScheduleBasis":"Fictional test schedule","feeLineAmount":"12.50"}}
+
{"action":"waive-records-fee","payload":{"feeWaiverReason":"Synthetic public-interest exercise"}}
+

Use the exact outer apply contract in the API reference rather than +sending these command fragments to an arbitrary URL. After either +operation, read the request again; a saved amount does not approve or +fulfill the response.

+

Save staff and requester +messages

+

In the saved request, enter a message and use its explicit send/save +action. The native add-records-message command’s payload +uses requestMessageBody, for example “Synthetic +clarification received.” Inspect the retained message/timeline and +intended audience before repeating the action. A persisted staff message +or locally queued notification does not prove an email reached a +requester. For a clarification requiring a response, retain the +clarification note and keep the request’s actual status distinct from +completion.

+

Configure templates +and inspect the outbox

+

Administrators use the existing /notifications/templates +create/list/update API under the application’s real authenticated +authority. A template supplies event_type, +channel (default email), +subject_template and body_template. Use the +event name actually produced by the selected workflow and the variables +it supplies; template existence alone does not cause that event to be +emitted. Staff inspect /notifications/log for recipient, +rendered content, status and error information.

+

The existing delivery function is +app.notifications.smtp_delivery.deliver_queued_notifications(session). +A technical operator invokes it only in the matching configured +application environment, with an application-owned async session. It +processes queued email entries, commits +sent or failed status, and returns counts. +Missing SMTP configuration returns +reason: smtp_not_configured. Missing rendered subject/body +or recipient is a failure, not delivery.

+

SMTP settings are SMTP_HOST, SMTP_PORT, +SMTP_USERNAME, SMTP_PASSWORD, +SMTP_FROM_EMAIL and SMTP_USE_TLS. Keep secrets +in protected process configuration. Inspect the actual setting +names/defaults in that reference before selecting a mail server. This +beta has no automatic failed-entry retry or native “Retry email” button: +failed rows are not selected by the queued-only delivery loop. Preserve +errors and resolve the cause through the owning deployment’s supported +process; do not invent a retry or reset database rows by hand. The +native notification “sent” acknowledgement is not an SMTP transmission +receipt. External mail remains a separately selected deployment +configuration, not a requirement to send email during synthetic +development.

+

Exercise +existing local public intake and tracking

+

This is the existing local contract, not a new internet portal +deployment. Under the application’s configured portal posture, a +synthetic client can submit +POST /desktop/v1/public/requests with:

+
{"requester":"Synthetic resident","requesterContact":"synthetic@example.invalid","summary":"Synthetic minutes request","deadline":""}
+

Retain the returned tracking information privately. +POST /desktop/v1/public/lookup requires +both trackingNumber and matching +requesterContact; it returns the permitted public status +rather than staff notes. /desktop/v1/public/messages +additionally requires publicRequestMessage. Read the +status/response detail and treat a portal-mode or identity refusal as a +refusal. Do not remove that gate, expose tracking/contact values in logs +or assume that changing PORTAL_MODE commissions a public +website. Named staff still use their own authenticated workspace.

+

Source contracts: app/desktop_bridge/schemas.py, +app/requests/workflow.py, notification service/router/SMTP +delivery, and the public desktop bridge routes. Full outer command +shapes and endpoint authentication remain in the Records API +reference.

+

Technical specifications

+

Runtime and storage

+

The accepted package supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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

+

Requests; assignments and deadlines; search sessions; evidence +attachments and original hashes; release copies; exemption decisions; +messages; fee line items; response approvals; export artifacts and audit +events.

+

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 signed MSI is 2,081,316,864 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.

+

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.

+

Communications and +review configuration

+

SMTP settings include host, port, username/password, sender address +and TLS choice. Configure and verify actual delivery only for a +deployment that selects external mail. Connector host allowlists and +encrypted data-source configuration are separate controls. Records fee +schedules concern the records workflow; they do not authorize Permitting +to calculate an official permit fee. Keep resident portal posture and +self-registration separate from named local staff setup.

+

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.

+
import { invoke } from '@tauri-apps/api/core';
+const result = await invoke('records_domain_request', {request: {operation: 'view', request_id: requestId}});
+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 'CivicSuite'
+$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/records-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 'CivicSuite'
+$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.

+

Complete technical contract

+

Read the Records 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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe 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

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

+ +++++ + + + + + + + + + + + + + + +
ProductRecorded resultPrecisely exercised
RecordsPASSIntake, note, original attachment/readback, separate release copy, +explicit release decision, draft/approval, approved response and release +package exports, fulfillment/readback and native workspace.
+ +

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

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

+ +

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

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/station.html b/docs/beta-1/readmes/station.html index ca50fda..cdd7213 100644 --- a/docs/beta-1/readmes/station.html +++ b/docs/beta-1/readmes/station.html @@ -1,2 +1,1796 @@ - -Townlight Station documentation
Townlight

Townlight Station documentation

Read the current Station manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Station Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Station Manual

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+

Using this manual

+

Townlight Station helps station operators, clerks, records staff and +deployment administrators. Station adapts a pinned CivicCast media +implementation into an independent Townlight boundary. It captures +managed files or configured live UDP MPEG-TS, retains canonical +meeting/agenda context, and hands verified recording evidence to +Records. Scheduling, playout, approval and local playback have distinct +controls.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
DocumentationTownlight naming, Access and Notice candidate
Intended installer1.8.1.1
Desktop source1.8.1-1
Runtime distributiontownlight-runtime 0.2.0
Station distribution/importtownlight-station 0.3.0 / townlight_station
Acceptance compositionWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
Candidate hashes/signatureSHA-256 checksums and Windows acceptance summary
Owned software licenseAGPL-3.0-only
+

Station continues to use its separately configured service. The Windows MSI upgrade below applies to the desktop suite.

+

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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.
  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. +
+

Daily workflow

+

1. Prepare meeting context

+

Create and save the actual meeting and agenda in Meetings. Assign +each selected agenda item to that meeting. A recording request cannot +substitute an editable meeting label for the canonical records.

+

2. Open the operator

+

Sign in as authorized staff. Use the configured local operator +command with the explicit native profile root. It obtains a short-lived +one-use browser ticket; the native proof is not placed in the URL.

+

3. Choose the input

+

Select the meeting, assigned agenda and administrator-configured +live-source ID. For recorded-file work, place the source in the managed +ingest directory and optionally supply an SRT sidecar. Callers cannot +submit arbitrary pipelines or filesystem paths.

+

4. Capture and stop

+

Start capture and distinguish waiting for a signal from active +recording. Stop requests pipeline drain. Wait for completed status and +validated output; a partial, failed or interrupted attempt is not a +completed recording.

+

5. Review recording evidence

+

Inspect the media and retained context/hash. Retry is explicit for +failed/interrupted recorded-file jobs. A lost live signal cannot be +reconstructed: begin a new live recording and preserve the failed +attempt.

+

6. Hand off to Records

+

Choose an existing Records request and attach the reviewed recording. +The receiver checks bytes/hash and retains a locked private original. +Repeating the same handoff retains one canonical document.

+

7. Use playout deliberately

+

Scheduling, dry-run/commit playout, staff approval and local +publication are distinct API operations. Public playback only serves the +separately approved packaged output. Nothing in capture or Records +handoff automatically publishes it.

+

8. Close and recover

+

Sign out of the operator. Back up Station’s database and media +evidence together, separately from Core’s native profile backup. Restart +interrupted work deliberately; do not automatically re-air a lost +signal.

+

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

+

Meetings → Station → Records is the accepted recording workflow. +Townlight owns current session authority; Station owns its database, +storage and media children. Standalone CivicCast remains separate, with +no shared configuration, service, data directory or automatic updater +fallback.

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputA real Townlight staff session, saved Meetings records, a dedicated +Station database/data root, a managed ingest filename or configured +live-source ID, and optional supplied SRT captions for recorded-file +input.
OutputCompleted verified recording derivatives, retained original +inputs/provenance, separately approved local playback packages and +locked private Records evidence.
+

Product boundary

+

There is no Station first-run wizard or automatic activation by the +desktop composition. The accepted normal-profile path uses an explicitly +configured paired Townlight HTTP process. Physical encoder/network, +remote identity, SCM commissioning, CDN delivery and long-duration field +quality are not certified. Station does not perform automatic meeting +speech recognition.

+

Architecture

+

Townlight Station 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.

+

Scheduling playout and +recovery

+

Schedule a +recording and interpret its state

+

Use Schedules after saving the actual meeting/agenda +and placing a complete file in Station’s managed ingest +directory. Choose the meeting, Start time, +Source file in managed ingest, and optional SRT +Caption sidecar, then select Schedule. +The browser form schedules files. The service’s schedule API also +supports a configured live-source ID; this is not a second input +selector in that browser form.

+

The browser’s datetime input is interpreted in the operator +computer’s local timezone and converted to an ISO UTC instant. Verify +that computer’s timezone before entering a city meeting time. A direct +API client should send an explicit timezone offset or Z; a +timezone-less API datetime is interpreted as UTC. A synthetic +POST /v1/schedules body is:

+
{"meeting_id":"11111111-1111-4111-8111-111111111111","agenda_ids":[],"source_file":"synthetic-program.mp4","captions_file":"synthetic-captions.srt","start_at":"2026-11-05T18:00:00-07:00","idempotency_key":"synthetic-schedule-001"}
+

Use a real synthetic meeting ID and intended future exercise time, +with files already in managed ingest. The body selects exactly one file +or configured live source; a live source cannot use a sidecar. Reusing +an idempotency key with changed input/context is a conflict. The initial +response includes id, status: scheduled and +start_at; it does not mean recording has finished.

+

Refresh Schedules and inspect the returned identity/time. +Cancel schedule is available while it remains +scheduled; cancellation of an already dispatched or terminal entry is +refused. The worker claims due work once and creates the linked +recording. A start delayed by more than ten minutes is +missed, not replayed late. A start within that grace can +dispatch on the next worker pass. Inspect the linked recording for its +own queued/running/completed or failed state. Do not assume scheduling +also commits that recording to air.

+

Apply the caption profile

+

For a managed recorded file, an explicitly supplied SRT sidecar +replaces embedded captions for this profile; otherwise embedded captions +are retained where supported by the pinned media profile. Live capture +preserves the embedded-caption path and does not accept an SRT sidecar. +An absent caption stream is not automatic speech recognition. Check the +actual captured/packaged captions for the selected synthetic input.

+

Original files are limited to 2,147,483,647 bytes and sidecars to +5,000,000 bytes. After publication, browser playback uses the packaged +MP4 and a separate WebVTT track when produced. Preserve original inputs +and recorded caption provenance separately from those derivatives.

+

Check playout and commit +deliberately

+

Open a completed recording. Select Check +playout to queue mode: dry-run. Inspect its status +and retained errors; a successful check does not change on-air state. To +render and take that program to the scheduled on-air path, explicitly +select Commit to air, which uses +mode: commit. Wait for the playout to be +complete; failed rendering is not a successful switch.

+

Equivalent POST /v1/playouts input is:

+
{"recording_id":"22222222-2222-4222-8222-222222222222","mode":"dry-run","idempotency_key":"synthetic-playout-check-001"}
+

Replace the recording ID with completed synthetic evidence. A +separate deliberate commit uses mode: commit and a new key; +do not reuse the check’s key with a changed mode. Inspect the returned +playout id and read /v1/playouts/{id} until +terminal. The scheduled on-air program follows verified committed +output, not every dry-run or every recording. Keep the worker and air +roles distinct: one renders work, the other follows durable on-air state +and emits the local program.

+

Take a live override and +return

+

In On air, choose an administrator-configured live +input and enter a reason of at least three characters. Select +Take live override and inspect the on-air mode/source. +POST /v1/on-air/live uses live_source_id and +reason; callers cannot supply an arbitrary network +pipeline.

+

While live, select Return to schedule +(POST /v1/on-air/return-to-schedule with no payload). +Confirm the mode returns to scheduled program. The override supersedes +the scheduled output; it does not delete its committed material. If no +valid committed program is available, do not assume returning has +produced a usable broadcast. Read actual output/state and any error. +These are local synthetic on-air controls, not proof of a commissioned +cable headend, physical receiver or public CDN.

+

Approve and publish local +playback

+

In Playout and playback, wait for a completed +rendered playout. Review its actual media/context/captions, then enter +the approval note and approve it. The API accepts a note of 3–500 +characters at /v1/playouts/{id}/approve. Approval is +retained with the authenticated staff actor; it does not itself +publish.

+

Select Publish locally only for that reviewed +approved playout. /v1/playouts/{id}/publish packages local +MP4/WebVTT playback. The response and subsequent playout view retain the +publication details. Open the displayed local playback, verify it +advances with the expected picture/sound, and inspect the caption track +where supplied. Unpublished content is unavailable through the public +playback route; guessing its ID does not authorize access. Repeating a +completed publication returns the retained package rather than silently +publishing changed media.

+

The local playback route /v1/public/playback/{id} serves +the packaged program; /captions serves its available +WebVTT. This approval/publication is separate from Commit to +air, capture, attachment to Records and a Records release. +Internet commissioning remains outside this local procedure.

+

Recover without +replaying unknown work

+

After a worker/API/air interruption, inspect durable schedules, +recordings, attempts, playouts and on-air state before repeating any +write. The worker marks interrupted in-flight work accordingly. Eligible +failed/interrupted file recording retries are explicit; +live loss requires a new live capture. Retain the prior attempt/logs and +do not claim a missing live interval was reconstructed.

+

Future scheduled intent survives restart. A claimed/dispatched +schedule must not be duplicated; one beyond the ten-minute grace becomes +missed. Read its linked recording and create new future intent only when +deliberately required. On-air recovery preserves attribution and does +not automatically resume a stale live override as if the source had +remained valid. Check the actual on-air mode and available committed +program after restart before choosing a new override.

+

Visible failed/interrupted states and error text in the operator are +the existing alert mechanism for this beta. Preserve the private process +logs and attempt evidence. Reopen a normal operator ticket after API +restart; do not replay an old ticket or bypass current staff authority. +Restore Station’s database and its matching media as one recovery set, +separately from Core’s native backup. Recheck original/output hashes and +intended state after restoration. No automatic repair or database reset +is implied by restart.

+

Source contracts: townlight_station/operations.py, +worker.py, airplay.py, +operator.py, the pinned media profile and +station/operator-ui/src/operator.tsx. Service request +models are in the Station API companion. The three suite-side Station +paths in its OpenAPI download are not the full separate /v1 +service schema.

+

Technical specifications

+

Runtime and storage

+

The accepted package supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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

+

Configured live-source IDs; canonical meeting/agenda snapshots; +queued recordings and immutable attempts; input/output hashes; +schedules; playout jobs and approvals; durable on-air state; publication +packages; Records attachment provenance.

+

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.

+

Station operator and +media components

+

The native desktop frontend above is distinct from Station’s browser +operator. The pinned operator package +townlight-station-operator is version +0.1.0, using React/react-dom 19.1.1, +TypeScript 5.9.2, Vite 7.3.7 and the +React Vite plugin 5.0.2. Station serves its built assets through its own +operator API. Its Python control/API package remains +townlight-station 0.3.0, while its retained storage +identity remains 0.1.0. These identities have different +purposes and are not renumbered.

+

The separate pinned CivicCast-derived media engine uses Python/native +GStreamer processing and bounded media children. It is not the +standalone CivicCast application. Station’s control database, data root, +service/configuration and update identity remain independent. This +describes the current mixed stack; no runtime rewrite or CivicCast +migration is implied.

+

Station media and +lifecycle contract

+

The package/API version is 0.3.0. Its retained storage +identity has version 0.1.0; that is a separate storage +marker and must not be rewritten to match the package. Product/app IDs +are townlight-station and +org.townlight.station; service identity is +TownlightStation, virtual account +NT SERVICE\TownlightStation, credential namespace +townlight.station, database schema station, +and update-channel identity townlight-station. An identity +name or SCM entry point does not establish that a Windows service was +registered.

+

The control service is Python; its separate pinned CivicCast-derived +engine uses native GStreamer media processing. There is no launch of the +standalone CivicCast application. Default encoding is 1920×1080, 30 fps +and 6000 kbps; explicit validated configuration may change it. The +source lock is verified before use. Media children are isolated and +bounded; unfinished attempts become interrupted on recovery.

+

Recorded-file requests accept a managed ingest filename, optional SRT +sidecar and idempotency key. Live requests accept a configured source +ID, not a path. Select exactly one file or live source; live capture +cannot also supply a sidecar. Inputs are bounded by the configured +two-hour default timeout and a 2,147,483,647-byte file limit. Supplied +SRT sidecars are bounded to 5,000,000 bytes. The queue admits at most +100 pending/running jobs; live admission is further serialized. A +repeated idempotency key must identify the same source bytes, canonical +meeting context and encoding profile.

+

queued and running do not make content +available as completed. Completion requires the worker’s clean media +teardown and stream validation. Failed/interrupted file jobs may be +explicitly retried; a live gap requires a new capture. Records receives +verified bytes and canonical provenance as a locked private original. +Local publication is an explicit later operation on separately approved +playout; its MP4/WebVTT package is distinct from the retained recording +and from a Records release.

+

Configuration and +administration

+

Prepare the +normally activated synthetic profile

+

This procedure describes a future isolated beta installation. +Documentation generation does not execute it. Complete normal Townlight +Setup under the intended Windows account, select +inspections-preview, sign in, and use Finish +Records Migration. Keep the native database running and confirm +the canonical runtime is ready. Use that account’s actual profile path; +the default is %LOCALAPPDATA%\CivicSuite. Do not create +session files, seed accounts or force +domain_enabled=True.

+

Station needs its own database and initially empty absolute data +directory. It uses the same named Townlight staff authority through an +additional configured loopback suite process. It does not launch or +modify CivicCast. No SCM installation, registry edit or replacement of +the desktop’s fixed-origin service is needed.

+

The examples reserve suite port 15481, Station port +8756 and synthetic UDP input port +19000. Choose unused ports and change both configured +origins together if needed. Never point these instructions at a city’s +live profile or data. Use the actual installation directory if Townlight +was installed elsewhere.

+

Store the independent +test configuration

+

Run the following in a deployment PowerShell session under the same +Windows user. Keep this session for startup and shutdown. The dedicated +parent holds configuration/logs; its data child is +Station’s initially empty managed store.

+
$profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite'
+$control = Join-Path $profilePath 'runtime\python\python.exe'
+$payload = 'C:\Program Files\Townlight\_up_\runtime\payload\station'
+$stationRoot = Join-Path $env:LOCALAPPDATA 'TownlightStation-Synthetic'
+if (-not (Test-Path -LiteralPath $control)) { throw 'Complete normal Townlight setup first.' }
+if (Test-Path -LiteralPath $stationRoot) { throw 'Existing Station directory: inspect it; do not overwrite.' }
+New-Item -ItemType Directory -Path $stationRoot | Out-Null
+$account = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
+& icacls.exe $stationRoot /inheritance:r /grant:r "${account}:(OI)(CI)F" '*S-1-5-18:(OI)(CI)F' | Out-Null
+if ($LASTEXITCODE -ne 0) { throw 'Cannot protect Station configuration directory.' }
+New-Item -ItemType Directory -Path (Join-Path $stationRoot 'data'),(Join-Path $stationRoot 'logs') | Out-Null
+$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
+$randomBytes = New-Object byte[] 32
+$rng.GetBytes($randomBytes)
+$rng.Dispose()
+$stationPassword = -join ($randomBytes | ForEach-Object { $_.ToString('x2') })
+$stationPassword | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString |
+  Set-Content -LiteralPath (Join-Path $stationRoot 'station-password.dpapi')
+Remove-Variable stationPassword,randomBytes
+

The password file uses the current Windows user’s DPAPI protection. +It is not portable to a different user or machine without an explicit +credential/recovery decision. Keep it out of source control, support +bundles and public documentation. Reuse this protected configuration on +restart rather than creating another database or password.

+

In the same session, establish the exact process environment. On a +later restart, set $profilePath, $control, +$payload and $stationRoot to these same +existing locations, then repeat this environment/start section, +not the first-time provisioning section.

+
$secret = Get-Content -LiteralPath (Join-Path $stationRoot 'station-password.dpapi') -Raw |
+  ConvertTo-SecureString
+$stationPassword = [System.Net.NetworkCredential]::new('', $secret).Password
+$nativePassword = (Get-Content -LiteralPath (Join-Path $profilePath 'config\secrets\postgres-password.txt') -Raw).Trim()
+$encodedNative = [uri]::EscapeDataString($nativePassword)
+$env:TOWNLIGHT_PROFILE_ROOT = $profilePath
+$env:TOWNLIGHT_DATA_DIR = Join-Path $profilePath 'Data'
+$env:TOWNLIGHT_FILE_STORAGE_DIR = Join-Path $profilePath 'Data\files'
+$env:DATABASE_URL = "postgresql+asyncpg://townlight:${encodedNative}@127.0.0.1:15432/townlight"
+$env:TOWNLIGHT_PRODUCT_PROFILE = 'inspections-preview'
+$env:PORTAL_MODE = 'private'
+$env:TOWNLIGHT_RUNTIME_HOST = '127.0.0.1'
+$env:TOWNLIGHT_RUNTIME_PORT = '15481'
+$env:TOWNLIGHT_STATION_URL = 'http://127.0.0.1:8756'
+$env:TOWNLIGHT_STATION_SUITE_URL = 'http://127.0.0.1:15481'
+$env:TOWNLIGHT_STATION_DATA_ROOT = Join-Path $stationRoot 'data'
+$env:TOWNLIGHT_STATION_DATABASE_URL = "postgresql+psycopg2://townlight_beta_station_app:${stationPassword}@127.0.0.1:15432/townlight_beta_station"
+$env:TOWNLIGHT_STATION_MEDIA_SOURCE = Join-Path $payload 'media-source'
+$env:TOWNLIGHT_STATION_MEDIA_PYTHON = Join-Path $payload 'runtime\python.exe'
+$env:TOWNLIGHT_STATION_MEDIA_RUNTIME = Join-Path $payload 'runtime'
+$env:TOWNLIGHT_STATION_FFPROBE = Join-Path $payload 'bin\ffprobe.exe'
+$env:PYTHONNOUSERSITE = '1'
+$env:PYTHONDONTWRITEBYTECODE = '1'
+Remove-Item Env:PYTHONPATH -ErrorAction SilentlyContinue
+Remove-Variable nativePassword,encodedNative,stationPassword,secret
+

Use the actual native PostgreSQL port/database/user if the deployment +differs from the accepted defaults. Environment changes here apply to +children of this shell, not the already running native supervisor. Keep +secrets out of command arguments and output. The paired runtime +deliberately uses normal verify_activation through its +standard module entry point.

+

Provision the Station +database once

+

This first-time step creates only the dedicated synthetic +role/database. Its role owns that database and its Station schema, with +no superuser/global administration grant. It connects to the normally +provisioned local database using the current profile’s protected +credential. Existing role/database names cause a refusal before +creation; do not drop or repurpose them automatically.

+
@'
+import os
+from pathlib import Path
+import psycopg2
+from psycopg2 import sql
+from sqlalchemy.engine import make_url
+
+url = make_url(os.environ['TOWNLIGHT_STATION_DATABASE_URL'])
+profile = Path(os.environ['TOWNLIGHT_PROFILE_ROOT'])
+password = (profile/'config/secrets/postgres-password.txt').read_text().strip()
+conn = psycopg2.connect(host='127.0.0.1', port=15432, user='townlight',
+                        password=password, dbname='postgres')
+conn.autocommit = True
+try:
+    with conn.cursor() as cur:
+        cur.execute('SELECT 1 FROM pg_roles WHERE rolname=%s', (url.username,))
+        role_exists = cur.fetchone() is not None
+        cur.execute('SELECT 1 FROM pg_database WHERE datname=%s', (url.database,))
+        if role_exists or cur.fetchone() is not None:
+            raise RuntimeError('Dedicated role/database already exists; inspect before continuing')
+        cur.execute(sql.SQL('CREATE ROLE {} LOGIN PASSWORD %s').format(
+            sql.Identifier(url.username)), (url.password,))
+        cur.execute(sql.SQL('CREATE DATABASE {} OWNER {}').format(
+            sql.Identifier(url.database), sql.Identifier(url.username)))
+finally:
+    conn.close()
+'@ | & $control -B -
+if ($LASTEXITCODE -ne 0) { throw 'Station database provisioning did not complete; inspect before retrying.' }
+& $control -B -m townlight_station.cli migrate
+if ($LASTEXITCODE -ne 0) { throw 'Station migration failed; retain logs and inspect the dedicated schema.' }
+

If database creation fails after the role was created, the operation +is partially complete: inspect that exact owned role/database before +resuming. Do not rerun against guessed names or remove unrelated +objects. On normal restarts, the database already exists; skip creation +and use the existing identity. migrate is explicit; API +requests do not substitute for schema migration.

+

Start and check the paired +processes

+

Use the same configured session. The standard suite entry point +verifies the existing native activation. Check readiness of that exact +paired origin, not only the desktop’s canonical port. Startup below +creates hidden children with private log files and records their +identities; it does not focus windows or install services.

+
$owned = @()
+function Start-StationRole([string]$name, [string[]]$arguments) {
+  $p = Start-Process -FilePath $control -ArgumentList $arguments -WindowStyle Hidden -PassThru `
+    -RedirectStandardOutput (Join-Path $stationRoot "logs\$name.out.log") `
+    -RedirectStandardError (Join-Path $stationRoot "logs\$name.err.log")
+  $script:owned += [pscustomobject]@{ Name=$name; Id=$p.Id; StartTime=$p.StartTime; Path=$p.Path }
+  $script:owned | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $stationRoot 'owned-processes.json')
+  return $p
+}
+function Wait-StationReady([string]$url, $process) {
+  for ($attempt=0; $attempt -lt 40; $attempt++) {
+    if ($process.HasExited) { throw "Owned process exited; inspect logs for $url" }
+    try {
+      $response = Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 2
+      if ($response.StatusCode -eq 200) { return }
+    } catch { }
+    Start-Sleep -Milliseconds 250
+  }
+  throw "Readiness not established: $url; inspect the owned logs"
+}
+$suite = Start-StationRole 'paired-suite' @('-B','-m','townlight_runtime.services')
+Wait-StationReady 'http://127.0.0.1:15481/ready' $suite
+$api = Start-StationRole 'station-api' @('-B','-m','townlight_station.cli','serve','--port','8756')
+Wait-StationReady 'http://127.0.0.1:8756/health' $api
+$worker = Start-StationRole 'station-worker' @('-B','-m','townlight_station.cli','worker')
+# Only for the on-air profile:
+$air = Start-StationRole 'station-air' @('-B','-m','townlight_station.cli','air')
+$owned | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $stationRoot 'owned-processes.json')
+

Before launching, confirm ports 15481 and 8756 are unused. If +readiness fails, inspect the relevant logs and retained profile/schema +state; do not start another copy. A port that answers belongs to the +intended process only when its ownership is established. A single worker +owns a database. worker --once performs a bounded pass; it +is not the normal continuous worker. The air role follows +durable on-air state and emits the local program; it does not commission +a physical transmitter or CDN. Its currently configured local output is +under Station’s air directory. Back up the dedicated +database and media together; Core’s native backup does not cover +them.

+

Configure a live +input and open the operator

+

Create live-sources.json under the Station +data directory with the following fictional input. An +actual sender must supply UDP MPEG-TS to that receiver; this +configuration alone does not generate a signal.

+
[{"id":"synthetic-chamber","label":"Synthetic chamber feed","kind":"udp-mpegts","address":"127.0.0.1","port":19000}]
+

At most 32 rows are accepted. IDs are unique 1–64 +letters/digits/underscore/hyphen; labels have 1–100 characters; IPv4 and +ports 1024–65535 are validated. Each row has exactly the five shown +keys. Protect the source network; UDP is not authenticated. Then, under +the same signed-in native account:

+
& $control -B -m townlight_station.cli operator --profile-root $profilePath --port 8756
+

This normal operator command opens the operator for a future staff +exercise. It reads the native session and exchanges a one-use launch +ticket; it does not seed authority or put the native proof in a URL. +Ticket expiry is 60 seconds, operator cookie lifetime 900 seconds, with +at most 256 outstanding tickets/sessions each. Reopen normally after +expiration, API restart or sign-out. Changing database/configuration +identities does not repair a staff permission refusal.

+

Bounds and shutdown

+

Default encoding is 1920×1080, 30 fps, 6000 kbps. Optional Station +variables permit MAX_SECONDS 10–86400 (default 7200), even +WIDTH 320–3840 and HEIGHT 180–2160, +FPS 1–60 and BITRATE_KBPS 128–50000; each is +prefixed TOWNLIGHT_STATION_. The media source lock and +exclusive data identity are verified before use. The dedicated database +name must end in _station; unowned nonempty storage and +escaping/reparse paths are refused. The existing SCM entry point is not +a claim of installed service acceptance.

+

To finish an exercise, stop live capture from the operator and wait +for its completed or failed terminal state. Wait for any +recording/playout work to finish, cancel unwanted future schedules, sign +out and preserve the evidence/logs. The air role starts a separate media +child; force-stopping only its parent does not run Python cleanup. Stop +only the process trees you started, checking each root’s identity before +using a saved PID:

+
foreach ($entry in @($owned | Sort-Object StartTime -Descending)) {
+  $process = Get-Process -Id $entry.Id -ErrorAction SilentlyContinue
+  if ($process -and $process.StartTime -eq $entry.StartTime -and $process.Path -eq $entry.Path) {
+    & taskkill.exe /PID $process.Id /T /F | Out-Null
+    if ($LASTEXITCODE -ne 0) { throw 'Owned process tree did not stop; inspect before proceeding.' }
+    $process.WaitForExit()
+  }
+}
+

Retain the ownership file if the shell must close; parse and verify +its actual process paths/start times before acting. Do not terminate the +native database/supervisor or CivicCast. Interrupting a worker during a +job preserves an interrupted attempt, not completed media; recovery is +described in the Station operating procedure. Clear secret-bearing +environment values when closing the dedicated deployment shell. Do not +delete the database/data root to “reset” an uncertain result.

+

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.

+
import { invoke } from '@tauri-apps/api/core';
+const result = await invoke('meetings_domain_request', {request: {operation: 'get-meeting', id: meetingId}});
+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.

+
Invoke-RestMethod -Uri 'http://127.0.0.1:8756/health'
+# Authenticated recording operations additionally require current native proof.
+

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 'CivicSuite'
+$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.

+

Recording and Records +handoff example

+

An authenticated local client sends +POST http://127.0.0.1:8756/v1/recordings with +X-Townlight-Session and this JSON, replacing the synthetic +UUIDs with saved synthetic meeting/agenda IDs. Configure +synthetic-chamber first.

+
{
+  "meeting_id": "11111111-1111-4111-8111-111111111111",
+  "agenda_ids": ["22222222-2222-4222-8222-222222222222"],
+  "live_source_id": "synthetic-chamber",
+  "idempotency_key": "synthetic-docs-capture-001"
+}
+

The initial response is 202 with a queued/running +identity rather than completed media. Read +/v1/recordings/{identity}, explicitly stop live capture +through /v1/recordings/{identity}/stop, and wait for +completed status before reading /content. Then the +authorized Records client calls +POST /desktop/v1/requests/{request_id}/station-recordings +on the paired Suite runtime with:

+
{
+  "recording_id": "33333333-3333-4333-8333-333333333333",
+  "expected_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+}
+

The shown hash is deliberately a placeholder. Use the actual +completed recording’s hash. A mismatched hash must fail. Repeating the +identical completed handoff is idempotent; it does not create a release +copy or fulfill a request.

+

Complete technical contract

+

Read the Station 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.

+

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.

+

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 prior accepted profile exercise verified +request/marker recovery for its identified artifact. Repeat the required +recovery proof for this changed signed candidate before calling it +accepted.

+

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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe snapshot was restored but services have not resumed.Use Start, then Check and verify a saved record; do not blindly +repeat restore.
Ticket expired or usedA launch is one-use and expires after 60 seconds.Reopen from the signed-in native session; do not replay the old +URL.
Recording interruptedInput/worker failed or a live signal was lost.Retain attempt/logs. Retry eligible file work explicitly; start a +new live capture for a live gap.
Recording not downloadableIt is not complete or its retained bytes failed validation.Inspect state and evidence; do not serve a partial attempt as +completed media.
+

Verified workflows and +limits

+

The separately configured Station workflow was exercised on the original Windows 1.6.0.1 Beta 1. The follow-up Windows 1.6.0.1 Station delivery exercised encrypted live feed and recording delivery. The Windows 1.8.0.1 acceptance summary records the previous 1.8.0.1 MSI checks. Station capture and its Meetings-to-Records handoff were outside that run. Field equipment, city credentials, and live YouTube commissioning require separate local verification.

+ +

The separate provisioning/service boundary and existing +external-service limits remain as described below. Staff remain +responsible for official release and publication decisions. No +additional provider or selected-model change is made.

+

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 tested Windows beta workflow 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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

Source and document control

+

This manual covers the Station service paired with Windows MSI 1.8.1.1. The Windows acceptance summary records the tested Meetings, Station and Records handoff.

+

Workflow subject index

+ +

Completed +recordings on YouTube and live CivicCast coverage

+

This source extension adds only completed-recording YouTube uploads +and a live Station-to-CivicCast feed. It is not in the published +Beta 1 installer. Existing component versions are retained. New +Station code is AGPL-3.0-only. The pinned CivicCast source and +third-party licenses remain unchanged. Standalone CivicCast is a +separate product; no installer, account, database, service or default in +it is changed by Station.

+

Staff workflow

+

For live coverage, choose a meeting, its chamber input and the +administrator’s CivicCast live feed option, then start +recording. Choose Recording only to capture privately +without a network feed. A disconnected receiver does not stop the +recording. Station sends the live MPEG-TS bytes as the recording grows; +it does not wait for the completed file. The feed is available only +during that capture. The CivicCast/PEG operator selects that source and +controls when it is broadcast on local cable. Station does not +automatically put the PEG channel on air. sending means +transport bytes were sent, not proof of cable carriage.

+

After Station shows complete, use Upload +completed recording to YouTube. Review the title, select +private/unlisted/public visibility (default private), +and enter the approval note. Click Upload to YouTube. +This is an explicit external upload to the Station-configured OAuth +account. No upload occurs just because recording stopped, a playout was +committed or a Records attachment was made. Station does not create a +YouTube livestream.

+

The upload receipt shows +queued/running/uploaded/failed/needs-reconciliation, the chosen +visibility and returned video link. uploaded is the YouTube +upload acknowledgement; YouTube may still be processing the video. The +canonical recording remains private and byte-identical for the existing +Records handoff. The YouTube visibility is separate from local +playback/disclosure approval.

+

Architecture

+

Station live feed to separate CivicCast and completed recording upload to YouTube

+

The sender has bounded, leaky buffers and follows the live edge after +congestion. Its network sink shares no pipeline with the recorder. A +late join or connection loss can leave a live coverage gap, while the +private recording continues. H.264/AAC and existing MPEG-TS captions are +forwarded without another encode. The MP4 upload remux reuses +vod_job.py; it does not generate transcripts or captions, +and does not upload a separate caption track. Upload queue work runs in +a separate process so a long upload never monopolizes the capture +worker.

+

Administrator setup

+

Use Station’s existing dedicated data root and PostgreSQL database. +Stop Station writers for a coordinated backup, retain that backup, and +run the explicit townlight-station migrate before starting +this source version. Schema 4 adds +station.youtube_uploads, keeping existing +recording/schedule/playout evidence. The data identity marker and +component versions are unchanged. Old services expect schema 3; use a +matched source/runtime and preserve the backup for rollback.

+

Create civiccast-feeds.json in the private Station data +directory:

+
[
+  {
+    "id": "peg",
+    "label": "CivicCast council feed",
+    "address": "192.0.2.10",
+    "port": 10080,
+    "secret_env": "TOWNLIGHT_STATION_SRT_PEG"
+  }
+]
+

The address is a numeric IPv4 local interface bind address on +Station, not the CivicCast computer. 192.0.2.10 is +a documentation placeholder. Use the actual Station interface, an unused +port (1024–65535), and appropriate network access between those two +systems. Clients select an administrator-defined ID, never an arbitrary +destination or media pipeline. Keep configuration files private.

+

Set TOWNLIGHT_STATION_SRT_PEG in the capture worker’s +process environment to a 10–79 character SRT passphrase. Configure a +separate CivicCast SRT live source with the caller URI +srt://<Station-address>:10080?mode=caller&latency=200 +and the same passphrase through CivicCast’s existing credential control. +Do not put the passphrase in the URI. Station’s +listener uses 128-bit SRT encryption. Keep the two accounts and +configuration stores separate; matching this specific transport +credential is the deliberate pairing. Site-specific camera, headend and +firewall commissioning remain deployment work.

+

For completed uploads, configure these Station-only +environment variables in the upload worker process. Obtain OAuth +authorization for the intended Station YouTube channel/account through +the existing deployment’s Google configuration; no OAuth onboarding +framework is added here. Do not use CivicCast’s credentials implicitly +or copy its profile.

+
    +
  • TOWNLIGHT_STATION_YOUTUBE_CLIENT_ID
  • +
  • TOWNLIGHT_STATION_YOUTUBE_CLIENT_SECRET
  • +
  • TOWNLIGHT_STATION_YOUTUBE_REFRESH_TOKEN (authorized for +YouTube video uploads)
  • +
+

Run the existing serve and capture worker, +plus the separate upload consumer with the same Station settings and +dedicated database:

+
townlight-station migrate
+townlight-station serve
+# In separate managed processes with the same explicit Station configuration:
+townlight-station worker
+townlight-station uploads
+

These are deployment commands, not commands executed against +installed apps by this development task. Run only one capture +worker and one upload worker per database. Each holds a distinct +advisory lock; media children require the existing Windows job +containment. The recorder child gets no provider credentials; the SRT +child receives only its explicit transport passphrase plus the existing +runtime allowlist. The upload worker reads only the Station OAuth +variables. OAuth/upload HTTP is restricted to Google HTTPS hosts; +redirects are not followed. The pinned donor import is checked against +Station’s declared media source.

+

HTTP API and examples

+

All /v1 operations below require the existing current +Townlight staff session header (X-Townlight-Session) or the +existing same-origin operator session. Read roles can inspect receipts. +Starting live feed/upload/retry requires the existing Station +capture capability. No new login, role system or MCP server +is added.

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method and routePurpose
GET /v1/civiccast-feedsCapture-authorized list of configured IDs and labels; no transport +credentials
POST /v1/recordingsExisting capture contract plus optional +civiccast_feed_id, allowed only with +live_source_id
POST /v1/recordings/{recording_id}/youtubeQueue one explicit completed-recording upload
GET /v1/youtube-uploadsRead-authorized latest 100 durable upload receipts
POST /v1/youtube-uploads/{upload_id}/retryCapture-authorized retry of a preparation failure +only
+

Station’s generated /openapi.json includes the new +routes and request schemas. Example bodies (use real canonical IDs from +the selected deployment):

+
{
+  "meeting_id": "11111111-1111-4111-8111-111111111111",
+  "agenda_ids": [],
+  "live_source_id": "chamber",
+  "civiccast_feed_id": "peg",
+  "idempotency_key": "council-live-2026-10-30"
+}
+
{
+  "title": "City council meeting — 30 October 2026",
+  "privacy": "private",
+  "approval_note": "Reviewed completed recording for upload",
+  "idempotency_key": "council-vod-2026-10-30"
+}
+

Upload titles are 1–100 characters; control characters and angle +brackets are rejected. Visibility is private/unlisted/public; approval +note 3–500 characters; key 1–100 characters. Repeating the same key +returns the same intent, a changed request conflicts, and another key +cannot duplicate an existing recording upload. A +missing/uncompleted/tampered recording is rejected before upload +admission; the worker independently verifies the recording hash before +remuxing/sending. Retained receipts include approving actor, note/time, +recording hash, MP4 path/ hash/size, chosen title/privacy and provider +video ID/URL after acknowledgement. No OAuth token, passphrase or donor +credential pointer is stored in receipts.

+

Recovery and limits

+

A failed preparation (for example missing Station OAuth configuration +or failed remux) is failed; correct the cause and +explicitly call its retry route. The prior attempt files remain +retained. Once any external request begins, an error is conservatively +needs-reconciliation. A worker restart also moves +interrupted running uploads to that state. There is no +automatic retry that could create a duplicate YouTube video. Check +YouTube Studio and the retained job before a human chooses another +external action. This increment provides no automatic remote +reconciliation/delete/reupload control. A valid uploaded link is +retained even if the capture worker is restarted. The existing +recording/Records path does not depend on the external upload +succeeding.

+

Live sender state is in the recording’s +details.civiccast_delivery; its final byte count and +per-attempt status/log files stay with the private recording. On +capture-worker restart, an interrupted feed is marked interrupted rather +than left appearing to send. Stop/reap is bounded even if the network +child hangs. No feed is automatically re-aired after recovery.

+

Verification and release +status

+

tests/accept_deliveries.py exercises the real Station +API/store/media/remux, CivicCast’s pinned SRT source adapter and real +YouTube file-upload client using a disposable PostgreSQL cluster, +generated audio/video, synthetic staff authority and +httpx.MockTransport for Google. No city systems or external +publication are involved. tests/accept_delivery_ui.cjs +drives the actual compiled operator controls in headless Chromium with +synthetic API responses. Existing boundary/ operations checks and +TypeScript compilation also apply.

+

Example invocation from a development environment with existing +dependencies:

+
$env:PYTHONPATH = (Resolve-Path ./beta-1).Path
+$env:STATION_TEST_PG_BIN = 'C:/test-tools/postgres/bin'
+$env:STATION_TEST_MEDIA_RUNTIME = 'C:/test-tools/station-media-runtime'
+python -B ./beta-1/tests/accept_deliveries.py C:/test-output/station-deliveries-new
+

Use a new output directory; the script starts/stops +only its owned disposable cluster and children. See the task’s retained +acceptance receipts for actual results. This evidence establishes the +new source wiring synthetically. It does not replace CivicCast’s already +established real YouTube delivery evidence, nor claim a new real YouTube +upload, physical cable broadcast, signed installer or Sandbox acceptance +of this extension. Published Beta 1 artifacts stay unchanged.

+

Delivery subject index

+
    +
  • CivicCast +live feed
  • +
  • YouTube: explicit completed recording upload; visibility; receipt +and reconciliation.
  • +
  • Schema4: durable upload intent; existing evidence retained.
  • +
+

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

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/suite.html b/docs/beta-1/readmes/suite.html index aed6f82..dc8bd82 100644 --- a/docs/beta-1/readmes/suite.html +++ b/docs/beta-1/readmes/suite.html @@ -1,2 +1,1335 @@ - -Townlight Suite documentation
Townlight

Townlight Suite documentation

Read the current Suite manual for the Windows x64 beta 1.8.0.1.

See component versions and release evidence for exact installed versions.

+ + +Townlight Suite Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Suite Manual

+
+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+
+

Using this manual

+

Townlight connects municipal workflows around retained sources, named +staff and explicit human decisions. This suite manual explains setup, +shared operating procedures and cross-product handoffs, including the +bounded Access and Notice workflows. Station is separately configured. +Standalone CivicCast remains a separate product.

+

Staff should start with First run and Connected workflows. +Administrators should read Architecture, Configuration, Security and +Recovery. Developers should use the API reference and per-product source +contracts. Each acceptance result applies only to the artifact +identified by its receipt.

+

Beta identity

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
Public documentation identityTownlight Beta 1
Windows MSI version1.8.1.1
Native desktop source version1.8.1-1
Released artifact identitySHA-256 checksums and Windows acceptance summary
Corresponding sourceReleased Windows x64 beta
Current owned software licenseAGPL-3.0-only
Supported acceptance profileWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+ +

Component versions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentDistributionInstalled version
Coretownlight-core1.3.0.dev2
Recordstownlight-records1.8.0.dev2
Meetingstownlight-meetings1.0.6
Codetownlight-code1.0.9
Zoningtownlight-zoning0.2.3
Planningtownlight-planning0.4.0.dev2
Permittingtownlight-permitting0.3.0+dev.2
Inspectionstownlight-inspections0.3.0+dev.2
Stationtownlight-station0.3.1
Accesstownlight-access0.5.0
Noticetownlight-notice0.3.0
Boards & Commissionstownlight-boards0.2.0
Contractstownlight-contracts0.2.0
Procurementtownlight-procurement0.3.0
Local runtimetownlight-runtime0.3.1
+

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source and checksums from the Windows x64 beta 1.8.1.1 release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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, Notice, Boards & Commissions, Contracts, and Procurement. A narrower 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. +
+

Daily workflow

Windows staff workflow guide covers Boards & Commissions, Contracts and Procurement.

+

Sign in with your own named account. Confirm the selected workspace, +open a saved record and check its source/version before editing. Save +the work, record the intended review and inspect its audience. Use an +explicit export or cross-product selection when a copy is required. Sign +out when finished. Use the product manual for its field-level +procedure.

+

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

+

Meeting capture to a +Records response

+
    +
  1. Meetings staff create the meeting and assign agenda items; save the +canonical records.
  2. +
  3. An authorized Station operator opens a one-use staff launch, chooses +that meeting and a configured live input or managed file, then starts +capture.
  4. +
  5. Stop and wait for completed validated media. Inspect the content and +provenance. Partial/failed attempts stay separate.
  6. +
  7. Records-authorized staff explicitly attach the completed recording +to an existing request. The receiver verifies bytes/hash and retains one +locked private original, including on an identical retry.
  8. +
  9. Records separately prepares any release copy, records +release/redact/exempt decisions, approves exact response text, exports +the response/package and fulfills the request. Capture and handoff do +not publish it.
  10. +
+

Legislation to cited staff +guidance

+

Code imports a retained source and creates a proposal connection to +actual Meetings evidence. Authorized staff record adoption, then a +separate codification decision. Zoning uses the cited Code context with +imported parcels and rules. Permitting and Inspections select permitted +cited authority for reviewed workpapers. An import, draft or meeting +motion does not replace the actual adoption/codification decisions.

+

Policy and land-use +evidence to Records

+

Planning imports adopted policy revisions, including neighborhood +applicability, and selects permitted Meetings/Zoning evidence. Staff +save and review the exact analysis, then create the audience-specific +snapshot. Planning initiatives/amendments retain their own history. +Permitting and Inspections independently review their saved cases and +prepare separate Records copies. Records rechecks the +source/version/hash and owns the response release. Private notes and +contact/property details must not be copied by relabeling a staff +packet.

+

Shared foundation and +recovery

+

Core provides shared contracts, named account/session support, +ingestion/task helpers and coherent recovery. Supporting Notice and +Access are included where selected. These relationships do not establish +all 56 directed product pairs, universal vendor integration or +unrestricted federation.

+

Product guide directory

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProductPurposeManual
CoreA shared foundation for accountable municipal work.Core
RecordsFrom request intake to a deliberate release.Records
MeetingsKeep the agenda, decisions and evidence connected.Meetings
CodeTrace every section to its source and history.Code
ZoningBring parcel context and cited rules into one review.Zoning
PlanningConnect policy, analysis and municipal progress.Planning
PermittingPrepare a complete, cited intake for staff review.Permitting
InspectionsPreserve evidence and review every draft finding.Inspections
StationCapture the meeting and preserve its evidence.Station
+

Architecture

+

Townlight Suite 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.

+

Existing product operating +guides

+

Use each product’s operating chapter for its actual controls, inputs, +readback and refusal states. The suite coordinates evidence and +authority; it does not replace those product decisions. Station requires +an explicitly configured paired runtime and its separate operating +procedure. The Code importer submits directly; Planning’s source library +has its own preview/confirmation flow.

+ +

Technical specifications

+

Runtime and storage

+

The accepted package supports Windows x64 fresh installation and upgrade from 1.7.2.1. 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

+

Each product retains the records described in its manual. The common +desktop uses one canonical PostgreSQL-backed domain with product-owned +tables/schemas and managed file storage. Station has a separate database +and media store.

+

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 signed MSI is 2,081,316,864 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.

+

Station operator and +media components

+

The native desktop frontend above is distinct from Station’s browser +operator. The pinned operator package +townlight-station-operator is version +0.1.0, using React/react-dom 19.1.1, +TypeScript 5.9.2, Vite 7.3.7 and the +React Vite plugin 5.0.2. Station serves its built assets through its own +operator API. Its Python control/API package remains +townlight-station 0.3.0, while its retained storage +identity remains 0.1.0. These identities have different +purposes and are not renumbered.

+

The separate pinned CivicCast-derived media engine uses Python/native +GStreamer processing and bounded media children. It is not the +standalone CivicCast application. Station’s control database, data root, +service/configuration and update identity remain independent. This +describes the current mixed stack; no runtime rewrite or CivicCast +migration is implied.

+

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, Notice, Boards & Commissions, Contracts, and Procurement. 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.

+
import { invoke } from '@tauri-apps/api/core';
+const result = await invoke('meetings_domain_request', {request: {operation: 'get-proceedings', id: meetingId}});
+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 'CivicSuite'
+$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/meetings/station/catalog' -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 'CivicSuite'
+$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.

+

Complete technical contract

+

Read the Suite +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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe 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

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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.
RecordsPASSIntake, note, original attachment/readback, separate release copy, +explicit release decision, draft/approval, approved response and release +package exports, fulfillment/readback and native workspace.
MeetingsPASSMeeting/agenda, packet assembly, motion/vote, supplied transcript, +reviewed/adopted minutes, restricted local archive and proceedings +readback; Code decision integration.
CodePASSSynthetic official source import, exact citation/history/export; +proposal into Meetings, recorded adoption and separately codified +version; native connection readback.
ZoningPASSGeoJSON/PostGIS import, cited dimensional rule, parcel answer, staff +review/history/snapshot and native workspace.
PlanningPASSAdopted source import with neighborhood, saved/reviewed analysis and +snapshot, persisted initiative/history and draft amendment, public +explorer neighborhood readback and native workspace.
PermittingPASSRetained requirement import, source-grounded +materials/pathway/timing, saved intake/review, separate hash-checked +Records copy and private handoff; contact exclusion; native +workspace.
InspectionsPASSRetained original/hash, supplied observations and voice summary, +saved/reviewed case/readback, separate exact Records copy and private +handoff; address exclusion; native workspace.
StationPASSActual native staff session and normally created meeting; headless +operator live start/stop, decoded generated audio/video, served hash, +private Records readback, idempotent locked original and logout.
+ +

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

Terms of service and license

+

Scope and status

+

These terms describe the Townlight Beta 1 software and this +documentation package. This is a public beta software distribution. It +does not create a hosted-service subscription or a city deployment +agreement. 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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

Source and document control

+

This edition is authored from the immutable corresponding-source +companion, the generated installed-domain schema and the retained +workflow receipts. Component version numbers are retained. The private +MSI has its own new hash and signing receipt. Historical release tags +and their artifacts remain unchanged.

+ +

Station live and recorded +delivery

+

Station now offers two explicit delivery paths. During a live +recording, staff may select an administrator-configured encrypted SRT +feed to the separate CivicCast product. The PEG operator controls local +cable take-to-air. After completion, staff may approve an upload copy to +the Station-configured YouTube account, select its title and visibility, +and inspect the durable receipt. The private canonical recording and +existing Meetings → Station → Records handoff remain independent.

+

Station live delivery and completed video uploads

+

These paths reuse the pinned CivicCast media and YouTube client code. +A separate sender isolates network backpressure from capture, and a +separate upload worker prevents long uploads from blocking recording. +YouTube starts no live broadcast here. Standalone CivicCast has separate +installation, identity, storage and operator control.

+

Administrators run the explicit Station schema4 migration and +provision Station-only OAuth and SRT pairing credentials. Existing +component versions are retained. Preparation failures can be explicitly +retried; uncertain external uploads require manual reconciliation and +are never silently duplicated. No real credentials or external video +publication are used in synthetic development acceptance.

+

See the +Station manual delivery section for full staff steps, architecture, +configuration, API request examples, permissions and recovery. Existing +eight-product workflows are unchanged; their accepted evidence is +retained rather than presented as a new run.

+

Delivery subject index

+
    +
  • CivicCast +live feed
  • +
  • YouTube: explicit completed recording upload; visibility; receipt +and reconciliation.
  • +
  • Schema4: durable upload intent; existing evidence retained.
  • +
+

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

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/readmes/zoning.html b/docs/beta-1/readmes/zoning.html index 392df71..e8adebb 100644 --- a/docs/beta-1/readmes/zoning.html +++ b/docs/beta-1/readmes/zoning.html @@ -1,2 +1,1214 @@ - -Townlight Zoning documentation
Townlight

Townlight Zoning documentation

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

See component versions and release evidence for exact installed versions.

+ + +Townlight Zoning Manual | Townlight Windows Beta 1 + +
Townlight +
+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

+ + +

Townlight Zoning Manual

+

Townlight Beta 1 · Naming candidate documentation +edition 2 November 2026

+

Contents

+ +

Using this manual

+

Townlight Zoning helps planners, land-use staff and authorized +reviewers. Zoning combines local parcel geometry, cited zoning rules and +staff review. It retains questions, corrections and snapshots with +provenance so downstream staff can identify the precise evidence +used.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentityValue
DocumentationTownlight Beta 1 naming, Access and Notice candidate
Windows MSI version1.8.1.1
Product componenttownlight-zoning 0.2.3
Principal import packagetownlight_zoning
Native desktop source version1.8.1-1
Candidate hashesSHA-256 checksums and Windows acceptance summary
Current owned software licenseAGPL-3.0-only
Acceptance compositionWindows x64 fresh install and upgrade from 1.7.2.1. Select the full profile. Station uses separate configuration.
+ +

First run

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

+

Fresh installation

+

Run the signed Windows 1.8.1.1 MSI and use an empty database and a new Townlight profile for first run.

+
    +
  1. Download the signed MSI, matching source companion and checksums from the public Windows release.
  2. +
  3. Verify the MSI hash and Authenticode publisher before installation. See the Windows acceptance summary for the tested setup.
  4. +
  5. 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.
  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. +
+

Daily workflow

+

+

1. Prepare parcel data

+

Use the complete supported bundle, including jurisdiction, dataset +metadata and original hashes. The coordinates must be EPSG:4326. A loose +geometry file is not the full source envelope.

+

+

2. Import and inspect

+

Check the complete source envelope before selecting Import parcel +dataset. That control submits directly; inspect the saved +validation/provenance result afterward. Correct a refused source bundle +and preserve the evidence. Do not force acceptance by editing SQL.

+

+

3. Register cited rules

+

Associate the zone, rule kind/key and value with the relevant public +Code section. Inspect overlays and effective context. Leave missing +authority visible for planner review.

+

+

4. Ask a parcel question

+

Look up the intended parcel and ask the supported question. Read the +returned citation, applicability and disclaimer. Do not present an +uncertain answer as an official decision.

+

+

5. Record review and context

+

Record a correction and its reason when needed. Select permitted +Meetings history explicitly. Preserve the question/review history and +distinguish staff-only precedent from public material.

+

+

6. Create a snapshot

+

Review the audience and exact content before creating the immutable +snapshot. A public snapshot must satisfy its permitted-source contract; +choosing a public label does not sanitize private notes.

+

+

7. Use it downstream

+

Select the exact snapshot for Records or the permitted provider path. +The receiving workflow rechecks visibility, source identity and hash +before retaining or exporting it.

+

Working safely

+

Use your own named account and save before leaving a screen. A saved +draft is durable; unsaved form text may not be. If a write has an +unknown result, reopen its record before repeating it.

+

Read source jurisdiction, dates, citation, version and visibility. A +copied source hash identifies exact bytes, not their legal +applicability. If a source changes or permission is removed, resolve the +source problem rather than substituting stale cached content.

+

Keep originals and derivatives separate. Review the intended audience +before export. A public summary excludes private fields only through the +applicable copy contract and your review. A renamed private packet is +still private content.

+

Drafting, review, approval, attachment, export, fulfillment and +publication are separate operations. A Townlight workpaper does not +itself adopt law, issue a permit, impose a fine or release a records +response. The responsible staff member records the applicable +decision.

+

Connected workflows

+

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

+ ++++ + + + + + + + + + + + + + + + + +
DirectionMaterial
InputA supported EPSG:4326 GeoJSON envelope, jurisdiction and dataset +metadata, public Code authority and permitted meeting evidence.
OutputSource-backed parcel context, informational answers, recorded human +corrections and reviewed snapshots with stable hashes.
+

Product boundary

+

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

+

Architecture

+
+ + +
+

The drawing shows the principal staff/evidence path. Native commands +carry trusted identity to Python business services; PostgreSQL and +retained original files hold durable state. A downstream copy does not +silently transfer decision authority. Station has its own configured +authority/media boundary, database and mutable files. The +connected-workflow text supplies the drawing’s reading order and +accessibility alternative.

+

Discretionary +processes and staff review

+

Explain the cited process

+

In the existing Zoning workspace, complete Variance, +conditional use or nonconformity question. Supply the +applicable process Code section, zone +code, optional comma-separated standard to +cite, and optional observed condition, for +example front_setback=8 feet. Select Explain the +cited process. Choose actual imported public authority; the +synthetic values below require matching synthetic sources to return +supported guidance.

+

The mounted API is +POST /desktop/v1/zoning/standards/process-explanation under +the normal authenticated staff session. Its equivalent request body +is:

+
{"question":"Explain the synthetic variance process","process_section":"18.20.050","zone_code":"SYN-R","rule_types":["front_setback"],"observed":{"front_setback":"8 feet"}}
+

Read process citations and each cited standard independently. The +output can explain a verified process while reporting unavailable +standards or review flags. A difference between an observation and a +cited standard is an informational flag; it is not a variance finding, +approval, nonconformity determination or substitute for planner review. +If no relevant authority is available, obtain the source or leave the +item unavailable. Do not attach an unrelated citation to a proposed +requirement.

+

Keep +parcel import and inspection in the right order

+

Check the complete JSON envelope, original hashes and EPSG:4326 +geometry before submitting Import parcel dataset. That +control sends the import directly; it does not open a separate +preview/commit screen. Inspect the returned validation/provenance and +saved dataset. The browser refuses bundle files larger than 20 MiB; +valid geometry and metadata remain subject to server validation. Correct +the source bundle after a refusal and retain earlier evidence rather +than forcing SQL changes.

+

Use the existing +specialist review contracts

+

The standalone Zoning application’s review/analytics/report routes +are documented source capabilities, not extra native desktop screens. In +a deployment where its actual staff authentication is already +configured:

+
    +
  • Create an ambiguity review with zone_code, +question and reason at +/api/v1/townlight_zoning/staff/ambiguity-reviews. Read its +returned ID and list state. Update that ID with status, +optional assigned_to and resolution; use +open, in_review, resolved or +closed. Resolving or closing requires a nonempty +resolution.
  • +
  • Retain a flagged answer at +/api/v1/townlight_zoning/staff/flagged-answers with the +original question/answer, zone, flag reason and source citations. Use +/{review_id}/improve with improved_answer and +improvement_notes. Preserve the original and improvement +attribution; a correction does not rewrite the imported Code +source.
  • +
  • Read /api/v1/townlight_zoning/staff/questions/analytics +with the desired high_volume_threshold to identify repeated +questions and uncertain answers. Analytics counts are review aids, not +jurisdictional conclusions.
  • +
  • Create /api/v1/townlight_zoning/staff/reports/outline +with a title and actual selected +question_ids/queue_item_ids. Review the +resulting outline and citations before incorporating it in a staff +report. It is not a filed report or a meeting decision.
  • +
+

A synthetic ambiguity request is:

+
{"zone_code":"SYN-R","question":"Which retained setback rule applies?","reason":"Synthetic overlay ambiguity requires planner review"}
+

Do not send invented staff-role headers or assume these standalone +paths exist at the installed desktop origin. The native workspace’s +supported review/history/snapshot controls continue to use its fixed +authenticated bridge. Use the technical supplement to distinguish the +two surfaces.

+

Source contracts: townlight_runtime/zoning_bridge.py, +townlight_zoning/main.py, the imported rule/source models +and desktop Zoning view.

+

Technical specifications

+

Runtime and storage

+

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

+

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

+

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

+

Data and consistency

+

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

+

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

+

Capacity and platform +statements

+

This beta has synthetic single-profile workflow evidence. It does not +have a published benchmark for concurrent staff capacity, minimum +RAM/CPU, large-source limits or a field SLA. Do not turn a developer +machine’s specification into a supported minimum. The signed MSI is 2,081,316,864 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.

+

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 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.

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

Trusted local HTTP example

+

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

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

Complete synthetic source +bundle

+

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

+

A synthetic write +with subsequent readback

+

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

+
$profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite'
+$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.

+

Complete technical contract

+

Read the Zoning API +reference for every documented operation, request field, constraint, +response declaration and source supplement. Download the OpenAPI JSON for tools. +For Station this is the suite-side schema only; its separate service +contract is documented in the API supplement. The reference directory includes +configuration/source inventories, dependency declarations, native +command contracts, MCP signatures and candidate evidence.

+

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.

+

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.

+

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 Windows 1.6.0.1 Beta 1 fresh-install 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

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymptomLikely meaningNext action
Workspace absentWrong product composition or unavailable canonical runtime.Check selected composition; activate through Finish Records +Migration; wait for readiness.
Cannot sign in / 401Missing or expired named account session.Sign in normally; reopen a Station launch ticket if applicable.
Permission denied / 403Account, module, source or browser-origin permission.Ask the authorized administrator to inspect the intended permission; +do not invent role headers.
Save conflict / 409The saved revision, expected source hash or lifecycle changed.Keep edits, reopen current state and reconcile deliberately.
Invalid input / 422Required field, format, geometry, source envelope or state is +invalid.Read the field detail and correct the input/source; preserve +originals.
Service unavailable / 503Database, schema, connected source or configuration +unavailable.Inspect System Health and the named dependency. Preserve work; retry +only after readiness.
Export refusedMissing exact review, approval, audience or source +authorization.Read the refusal and complete the owning product’s explicit +decision.
Restore needs service startThe 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

+

The table records selected synthetic workflows from the original Windows 1.6.0.1 Beta 1 Sandbox run. Station’s later delivery has separate Windows 1.6.0.1 acceptance. See the Windows 1.8.0.1 acceptance summary for the workflows and upgrade path exercised on the previous 1.8.0.1 MSI.

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

The Windows 1.8.0.1 acceptance covers the tested installation paths and selected synthetic workflows, including Boards & Commissions, Contracts, and Procurement. Earlier results apply to their original builds. City field acceptance, physical equipment and network commissioning, Station automatic provisioning, and comprehensive UI and role coverage remain outside the 1.8.0.1 checks.

+

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

+

Windows 1.8.0.1 was tested for fresh installation and in-place upgrade from 1.7.2.1. Upgrade paths from versions older than 1.7.2.1 are unverified. Station uses its separately configured service. Keep backups and original evidence. Test your physical equipment and network and service configuration before relying on them. See the acceptance summary for the tested paths.

+

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

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TermMeaning
ApprovalAn explicit authorized decision on the saved text/artifact. It is +separate from saving or attachment.
Canonical recordThe owning product’s retained identity and saved version, rather +than an editable copied label.
CompositionThe selected set of desktop modules; inspections-preview exposes the +eight staff products.
Corresponding sourceThe source/build material matching the delivered covered program, +subject to its license.
Derivative / Records copyA separately prepared document with its own intended audience and +hash.
Hash / SHA256A fingerprint of exact bytes. It detects change; it does not +establish legal authority.
IdempotencyRepeating the same identified request has the same intended effect; +changing its payload can be refused.
IPCThe native desktop command boundary between its browser interface +and Rust host.
MCPModel Context Protocol; no direct Townlight product server is +enabled by this beta.
OriginalRetained source bytes. A reviewed derivative does not replace +them.
ProvenanceSource, version, date, actor and relationship information retained +with evidence.
RevisionAn immutable saved version. Later edits do not inherit an earlier +review automatically.
SnapshotA fixed audience-specific copy tied to a source/reviewed +revision.
StationTownlight’s separate media boundary using a pinned CivicCast-derived +engine; standalone CivicCast remains separate.
+

Alphabetical subject index

+ + + +

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

+ +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

Shared meeting imports

+

Use Meetings → Import meeting records in Windows +1.8.1.1. Select a source and format, enter the original public URL, then +choose Preview import. For a saved response, select the +file before previewing. Choose a meeting and use Save selected +meeting. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the +same capture returns the existing meeting. A changed capture for that +identity is reported for staff review.

+

The source and format selector lists the supported reader pairs +below. A public URL must serve the chosen format directly. Use a saved +public response for POST-only listings, portals that require a browser +session and sources whose page does not return the required response. +The importer reads what a municipality publishes in that response. +Fields and attachments vary by municipality and by meeting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourceInput to preview
LegistarCore-format JSON export
PrimeGovCore-format JSON export or public portal meeting list JSON
GranicusCore-format JSON export or public ViewPublisher HTML
NovusAGENDACore-format JSON export
CivicPlus Agenda and Meeting Management SelectPublic Events JSON
CivicPlus Agenda CenterPublic listing HTML
Municode MeetingsPublic meetings HTML
BoardBookPublic organization HTML
eSCRIBEPublic calendar JSON
SimbliPublic meeting listing HTML
iCompass CivicWebPublic meeting-type listing HTML
iQM2Public meeting list HTML
Granicus SwagitPublic video archive HTML
SuiteOne MediaPublic meeting archive HTML
Granicus PeakPublic agenda center ViewPublisher HTML
Utah Public Notice WebsitePublic notice detail HTML
Destiny AgendaQuickPublic meeting list HTML
Town Hall StreamsPublic archive HTML
TelVuePublic playlist HTML
CHAMPPublic event JSON
Hyland OnBasePublic Agenda Online HTML
Laserfiche WebLinkSaved public dated document folder HTML
TownCloudSaved public agenda table JSON or public agenda detail HTML
Digital TowpathPublic meeting detail HTML
ClerkBasePublic meeting document HTML
Municipality-published calendarPublic iCalendar feed
WistiaPublic media JSON
BoardablePublic Site meeting detail HTML
gWorks FrontDeskPublic city meetings JSON
Diligent BoardDocsUnencrypted printed agenda PDF with numbered items
Tyler Meeting ManagerSaved public calendar JSON. Meeting information and item titles when +present.
+

Staff handoffs

+
    +
  • Core and Meetings. Core's existing vendor formats +share the same preview and save path as the public readers. The saved +meeting and any structured agenda items open in the regular Meetings +workflow.
  • +
  • Records. In Meetings, load imported documents by +meeting ID, choose a PDF and enter the destination Records request ID. +The attachment retains the citation and file hash. An HTML viewer or a +dead document link may need staff to obtain the PDF separately.
  • +
  • Notice and Access. Use Review imported +text to start a Notice draft or accessibility review with the +source citation. Use each workspace's normal review and save +actions.
  • +
  • Station. In the configured Station operator page, +select the saved meeting and stage a direct MP4. Use the private capture +workflow to queue processing. Player-only references are visible without +a staging action.
  • +
  • Code. Use the existing ordinance proposal and +adoption workflow with the canonical imported meeting and agenda +IDs.
  • +
  • Boards, Contracts, Procurement, Zoning, Planning, Permitting +and Inspections. In the destination workspace use +Imported meeting evidence. Select an existing staff +record and the saved meeting, then save the citation. The destination's +existing role and workflow apply.
  • +
+

Shared interface

+

The installed Townlight Python runtime exposes a read-only CLI. +CivicCast and other local clients can consume its normalized JSON and +apply their own access and persistence rules.

+
python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json
+

Use --fetch in place of the saved file to read a +supported public response.

+

Interfaces and other +products

+

The version-1 normalized JSON contract is shared by the Python +function +townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...) +and the CLI above. A saved response can also be read from stdin using +-. Inputs are limited to 16 MiB. Preview is read-only; the +consuming application owns persistence, staff authorization and its own +data.

+

The installed native HTTP bridge exposes +GET /desktop/v1/meetings/imports/sources, +POST /desktop/v1/meetings/imports/preview, +POST /desktop/v1/meetings/imports/fetch, +POST /desktop/v1/meetings/imports/commit, and +meeting/link/document handoff operations in the native API +schema. Use the existing X-Townlight-Session +authentication, mapped staff roles and configured local PostgreSQL +service. This is a native application interface; there is no independent +anonymous importer HTTP service or importer MCP server.

+

CivicCast: opt in through its Townlight shared +importer source setting and TOWNLIGHT_IMPORT_PYTHON (the +absolute Python executable), TOWNLIGHT_IMPORT_CONNECTOR, +TOWNLIGHT_IMPORT_FORMAT, TOWNLIGHT_IMPORT_URL +and optional TOWNLIGHT_IMPORT_CAPTURE. The adapter saves +normalized items through the existing AgendaStore. Structured agenda +availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the +default.

+

CivicCast Brief: its existing PrimeGov and Granicus +discovery routes can opt into the shared reader using +TOWNLIGHT_IMPORT_PYTHON. Brief does not expose all 31 +sources as a new selection menu. Its existing caption/media workflow +remains the consuming path. See each project's shared-import client +documentation.

+

TownReporter, Describer Workbench and Textflowkit: +no shared-import adapter was added to these products. TownReporter +retains its own PrimeGov path. Describer Workbench and Textflowkit +expose their existing transcription APIs/MCP interfaces, which do not +constitute meeting-import integration. The shared engine ships inside +Townlight Runtime; a standalone library is outside this release.

+

Windows acceptance and +limits

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, +with 34 supported source/format pairs. Installed Windows Sandbox checks +exercised preview, save and durable readback using public captures and +fixtures, plus the documented Townlight handoffs. These checks do not +establish automatic discovery on every live portal or a complete retest +of every module.

+

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to +1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested +upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an +existing-city evaluation, back up city data and settings, close +Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use +the same Windows account. Keep the prior installer and a restore path. +Station continues to use its separately configured service.

+

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 +distributions. Its health version strings still report Runtime 0.3.0 and +Meetings 1.0.5. Default-branch source corrects those display strings; +the signed MSI and its exact build source remain unchanged.

+

Exact +Windows 1.8.1.1 acceptance and limits.

+
\ No newline at end of file diff --git a/docs/beta-1/reference/component-metadata.json b/docs/beta-1/reference/component-metadata.json index f7195b3..7265645 100644 --- a/docs/beta-1/reference/component-metadata.json +++ b/docs/beta-1/reference/component-metadata.json @@ -25,6 +25,32 @@ "AGPL-3.0-only" ] }, + "townlight_boards-0.2.0.dist-info": { + "Name": [ + "townlight-boards" + ], + "Version": [ + "0.2.0" + ], + "Requires-Python": [ + ">=3.11" + ], + "Requires-Dist": [ + "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'", + "pytest<9.0.0,>=8.0.0; extra == 'dev'", + "ruff==0.15.22; extra == 'dev'" + ], + "License": [ + "AGPL-3.0-only" + ], + "License-Expression": [] + }, "townlight_code-1.0.9.dist-info": { "Name": [ "townlight-code" @@ -55,6 +81,32 @@ ], "License-Expression": [] }, + "townlight_contracts-0.2.0.dist-info": { + "Name": [ + "townlight-contracts" + ], + "Version": [ + "0.2.0" + ], + "Requires-Python": [ + ">=3.11" + ], + "Requires-Dist": [ + "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'", + "pytest<9.0.0,>=8.0.0; extra == 'dev'", + "ruff==0.15.22; extra == 'dev'" + ], + "License": [ + "AGPL-3.0-only" + ], + "License-Expression": [] + }, "townlight_core-1.3.0.dev2.dist-info": { "Name": [ "townlight-core" @@ -108,6 +160,22 @@ "AGPL-3.0-only" ] }, + "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_inspections-0.3.0+dev.2.dist-info": { "Name": [ "townlight-inspections" @@ -136,12 +204,12 @@ ], "License-Expression": [] }, - "townlight_meetings-1.0.5.dist-info": { + "townlight_meetings-1.0.6.dist-info": { "Name": [ "townlight-meetings" ], "Version": [ - "1.0.5" + "1.0.6" ], "Requires-Python": [ ">=3.11" @@ -245,6 +313,32 @@ "AGPL-3.0-only" ] }, + "townlight_procurement-0.3.0.dist-info": { + "Name": [ + "townlight-procurement" + ], + "Version": [ + "0.3.0" + ], + "Requires-Python": [ + ">=3.11" + ], + "Requires-Dist": [ + "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'", + "pytest<9.0.0,>=8.0.0; extra == 'dev'", + "ruff==0.15.22; extra == 'dev'" + ], + "License": [ + "Apache-2.0" + ], + "License-Expression": [] + }, "townlight_records-1.8.0.dev2.dist-info": { "Name": [ "townlight-records" @@ -291,12 +385,12 @@ "AGPL-3.0-only" ] }, - "townlight_runtime-0.2.0.dist-info": { + "townlight_runtime-0.3.1.dist-info": { "Name": [ "townlight-runtime" ], "Version": [ - "0.2.0" + "0.3.1" ], "Requires-Python": [ ">=3.11" @@ -304,7 +398,32 @@ "Requires-Dist": [ "sqlalchemy>=2.0", "fastapi>=0.135.0", - "uvicorn>=0.44.0" + "uvicorn>=0.44.0", + "pdfplumber<1,>=0.11.10" + ], + "License": [], + "License-Expression": [ + "AGPL-3.0-only" + ] + }, + "townlight_station-0.3.1.dist-info": { + "Name": [ + "townlight-station" + ], + "Version": [ + "0.3.1" + ], + "Requires-Python": [ + ">=3.12" + ], + "Requires-Dist": [ + "fastapi<1,>=0.115", + "uvicorn<1,>=0.30", + "httpx<1,>=0.27", + "sqlalchemy<3,>=2", + "psycopg2-binary<3,>=2.9", + "pydantic<3,>=2", + "pywin32>=311; sys_platform == \"win32\"" ], "License": [], "License-Expression": [ diff --git a/docs/beta-1/reference/desktop-domain-openapi.json b/docs/beta-1/reference/desktop-domain-openapi.json index bc0444d..a6fb945 100644 --- a/docs/beta-1/reference/desktop-domain-openapi.json +++ b/docs/beta-1/reference/desktop-domain-openapi.json @@ -2,8 +2,8 @@ "openapi": "3.1.0", "info": { "title": "Townlight Records", - "description": "AI-powered open records support for American cities", - "version": "1.8.0.dev1" + "description": "Source schema generated from the bundled Windows 1.8.1.1 native domain runtime without starting services.", + "version": "1.8.0.dev2" }, "paths": { "/auth/jwt/login": { @@ -2201,10 +2201,10 @@ "required": true, "schema": { "type": "string", - "description": "Status to reset \u2014 required", + "description": "Status to reset — required", "title": "Status" }, - "description": "Status to reset \u2014 required" + "description": "Status to reset — required" } ], "responses": { @@ -2258,10 +2258,10 @@ "required": true, "schema": { "type": "string", - "description": "Status to dismiss \u2014 required", + "description": "Status to dismiss — required", "title": "Status" }, - "description": "Status to dismiss \u2014 required" + "description": "Status to dismiss — required" } ], "responses": { @@ -3620,7 +3620,7 @@ "requests" ], "summary": "Estimate Fees", - "description": "Estimate fees based on staff-entered page count and fee schedule.\n\nPage count is a manual staff estimate \u2014 not inferred from ingested docs.", + "description": "Estimate fees based on staff-entered page count and fee schedule.\n\nPage count is a manual staff estimate — not inferred from ingested docs.", "operationId": "estimate_fees_requests__request_id__estimate_fees_post", "security": [ { @@ -5734,7 +5734,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Selection" + "$ref": "#/components/schemas/townlight_records__desktop_bridge__station__Selection" } } } @@ -8068,22 +8068,22 @@ } } }, - "/desktop/v1/access/exports/{artifact_id}/complete": { + "/desktop/v1/access/drafts/{draft_id}/export": { "post": { "tags": [ "native-access" ], - "summary": "Complete Export", - "operationId": "complete_export_desktop_v1_access_exports__artifact_id__complete_post", + "summary": "Export Draft", + "operationId": "export_draft_desktop_v1_access_drafts__draft_id__export_post", "parameters": [ { - "name": "artifact_id", + "name": "draft_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Artifact Id" + "title": "Draft Id" } }, { @@ -8103,16 +8103,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ExportReceipt" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -8135,14 +8125,24 @@ } } }, - "/desktop/v1/suite/state": { - "get": { + "/desktop/v1/access/exports/{artifact_id}/complete": { + "post": { "tags": [ - "native-records-snapshot" + "native-access" ], - "summary": "Suite State", - "operationId": "suite_state_desktop_v1_suite_state_get", + "summary": "Complete Export", + "operationId": "complete_export_desktop_v1_access_exports__artifact_id__complete_post", "parameters": [ + { + "name": "artifact_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Artifact Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -8160,6 +8160,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExportReceipt" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -8182,13 +8192,13 @@ } } }, - "/desktop/v1/suite/search": { - "post": { + "/desktop/v1/notice/notices": { + "get": { "tags": [ - "native-records-snapshot" + "native-notice" ], - "summary": "Search", - "operationId": "search_desktop_v1_suite_search_post", + "summary": "Inventory", + "operationId": "inventory_desktop_v1_notice_notices_get", "parameters": [ { "name": "X-Townlight-Session", @@ -8207,16 +8217,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SearchInput" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -8237,26 +8237,14 @@ } } } - } - }, - "/desktop/v1/meetings/meetings/{meeting_id}/stages": { + }, "post": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Record Meeting Stage", - "operationId": "record_meeting_stage_desktop_v1_meetings_meetings__meeting_id__stages_post", + "summary": "Create", + "operationId": "create_desktop_v1_notice_notices_post", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -8279,13 +8267,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MeetingStageInput" + "$ref": "#/components/schemas/NoticeDraft" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -8306,14 +8294,24 @@ } } }, - "/desktop/v1/meetings/meetings": { - "post": { + "/desktop/v1/notice/notices/{notice_id}": { + "get": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Create Meeting", - "operationId": "create_meeting_desktop_v1_meetings_meetings_post", + "summary": "Read", + "operationId": "read_desktop_v1_notice_notices__notice_id__get", "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -8331,18 +8329,8 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MeetingInput" - } - } - } - }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -8363,22 +8351,22 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}": { - "get": { + "/desktop/v1/notice/notices/{notice_id}/revisions": { + "post": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Get Meeting", - "operationId": "get_meeting_desktop_v1_meetings_meetings__meeting_id__get", + "summary": "Edit", + "operationId": "edit_desktop_v1_notice_notices__notice_id__revisions_post", "parameters": [ { - "name": "meeting_id", + "name": "notice_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Meeting Id" + "title": "Notice Id" } }, { @@ -8398,6 +8386,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Revision" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -8420,14 +8418,24 @@ } } }, - "/desktop/v1/meetings/agenda-items": { + "/desktop/v1/notice/notices/{notice_id}/review": { "post": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Create Agenda Item", - "operationId": "create_agenda_item_desktop_v1_meetings_agenda_items_post", + "summary": "Review", + "operationId": "review_desktop_v1_notice_notices__notice_id__review_post", "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -8450,13 +8458,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AgendaInput" + "$ref": "#/components/schemas/townlight_runtime__notice_bridge__Review" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -8477,22 +8485,22 @@ } } }, - "/desktop/v1/meetings/agenda-items/{item_id}": { - "get": { + "/desktop/v1/notice/notices/{notice_id}/approval": { + "post": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Get Agenda Item", - "operationId": "get_agenda_item_desktop_v1_meetings_agenda_items__item_id__get", + "summary": "Approve", + "operationId": "approve_desktop_v1_notice_notices__notice_id__approval_post", "parameters": [ { - "name": "item_id", + "name": "notice_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Notice Id" } }, { @@ -8512,6 +8520,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Version" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -8534,22 +8552,22 @@ } } }, - "/desktop/v1/meetings/agenda-items/{item_id}/reviews": { + "/desktop/v1/notice/notices/{notice_id}/proof": { "post": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Record Agenda Review", - "operationId": "record_agenda_review_desktop_v1_meetings_agenda_items__item_id__reviews_post", + "summary": "Proof", + "operationId": "proof_desktop_v1_notice_notices__notice_id__proof_post", "parameters": [ { - "name": "item_id", + "name": "notice_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Notice Id" } }, { @@ -8574,7 +8592,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AgendaReviewInput" + "$ref": "#/components/schemas/Proof" } } } @@ -8601,22 +8619,22 @@ } } }, - "/desktop/v1/meetings/agenda-items/{item_id}/meeting": { + "/desktop/v1/notice/notices/{notice_id}/archive": { "post": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Assign Agenda", - "operationId": "assign_agenda_desktop_v1_meetings_agenda_items__item_id__meeting_post", + "summary": "Archive", + "operationId": "archive_desktop_v1_notice_notices__notice_id__archive_post", "parameters": [ { - "name": "item_id", + "name": "notice_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Notice Id" } }, { @@ -8641,7 +8659,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AgendaAssignment" + "$ref": "#/components/schemas/Version" } } } @@ -8668,22 +8686,22 @@ } } }, - "/desktop/v1/meetings/notices/{notice_id}/template": { + "/desktop/v1/notice/archives/{archive_id}": { "get": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Notice Template", - "operationId": "notice_template_desktop_v1_meetings_notices__notice_id__template_get", + "summary": "Export", + "operationId": "export_desktop_v1_notice_archives__archive_id__get", "parameters": [ { - "name": "notice_id", + "name": "archive_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Notice Id" + "title": "Archive Id" } }, { @@ -8725,22 +8743,22 @@ } } }, - "/desktop/v1/meetings/notices/{notice_id}/document": { + "/desktop/v1/notice/archives/{archive_id}/records": { "post": { "tags": [ - "native-meetings" + "native-notice" ], - "summary": "Notice Document", - "operationId": "notice_document_desktop_v1_meetings_notices__notice_id__document_post", + "summary": "Handoff", + "operationId": "handoff_desktop_v1_notice_archives__archive_id__records_post", "parameters": [ { - "name": "notice_id", + "name": "archive_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Notice Id" + "title": "Archive Id" } }, { @@ -8765,7 +8783,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NoticeDocumentInput" + "$ref": "#/components/schemas/Handoff" } } } @@ -8792,24 +8810,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/notice-checks": { - "post": { + "/desktop/v1/suite/state": { + "get": { "tags": [ - "native-meetings" + "native-records-snapshot" ], - "summary": "Check Notice", - "operationId": "check_notice_desktop_v1_meetings_meetings__meeting_id__notice_checks_post", + "summary": "Suite State", + "operationId": "suite_state_desktop_v1_suite_state_get", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -8827,18 +8835,8 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/NoticeInput" - } - } - } - }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -8859,24 +8857,14 @@ } } }, - "/desktop/v1/meetings/notices/{notice_id}/proof": { + "/desktop/v1/suite/search": { "post": { "tags": [ - "native-meetings" + "native-records-snapshot" ], - "summary": "Record Notice Proof", - "operationId": "record_notice_proof_desktop_v1_meetings_notices__notice_id__proof_post", + "summary": "Search", + "operationId": "search_desktop_v1_suite_search_post", "parameters": [ - { - "name": "notice_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Notice Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -8899,7 +8887,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NoticeProofInput" + "$ref": "#/components/schemas/SearchInput" } } } @@ -8926,24 +8914,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/transcripts": { + "/desktop/v1/meetings/imports/preview": { "post": { "tags": [ "native-meetings" ], - "summary": "Capture Transcript", - "operationId": "capture_transcript_desktop_v1_meetings_meetings__meeting_id__transcripts_post", + "summary": "Preview Meeting Import", + "operationId": "preview_meeting_import_desktop_v1_meetings_imports_preview_post", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -8966,13 +8944,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TranscriptInput" + "$ref": "#/components/schemas/ImportPreviewInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -8993,24 +8971,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/action-items": { - "post": { + "/desktop/v1/meetings/imports/sources": { + "get": { "tags": [ "native-meetings" ], - "summary": "Capture Action Item", - "operationId": "capture_action_item_desktop_v1_meetings_meetings__meeting_id__action_items_post", + "summary": "Meeting Import Sources", + "operationId": "meeting_import_sources_desktop_v1_meetings_imports_sources_get", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -9028,18 +8996,8 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ActionItemInput" - } - } - } - }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9060,24 +9018,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/archive": { + "/desktop/v1/meetings/imports/fetch": { "post": { "tags": [ "native-meetings" ], - "summary": "Archive Meeting", - "operationId": "archive_meeting_desktop_v1_meetings_meetings__meeting_id__archive_post", + "summary": "Fetch Meeting Import", + "operationId": "fetch_meeting_import_desktop_v1_meetings_imports_fetch_post", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -9100,13 +9048,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ArchiveInput" + "$ref": "#/components/schemas/ImportSourceInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9127,24 +9075,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots": { + "/desktop/v1/meetings/imports/commit": { "post": { "tags": [ "native-meetings" ], - "summary": "Capture Packet", - "operationId": "capture_packet_desktop_v1_meetings_meetings__meeting_id__packet_snapshots_post", + "summary": "Commit Meeting Import", + "operationId": "commit_meeting_import_desktop_v1_meetings_imports_commit_post", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -9167,13 +9105,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PacketInput" + "$ref": "#/components/schemas/ImportCommitInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9194,22 +9132,22 @@ } } }, - "/desktop/v1/meetings/packets/{packet_id}/deliver": { - "post": { + "/desktop/v1/meetings/imports/{meeting_id}": { + "get": { "tags": [ "native-meetings" ], - "summary": "Export Packet", - "operationId": "export_packet_desktop_v1_meetings_packets__packet_id__deliver_post", + "summary": "Get Meeting Import", + "operationId": "get_meeting_import_desktop_v1_meetings_imports__meeting_id__get", "parameters": [ { - "name": "packet_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Packet Id" + "title": "Meeting Id" } }, { @@ -9251,22 +9189,30 @@ } } }, - "/desktop/v1/meetings/minutes/{draft_id}/decisions": { + "/desktop/v1/meetings/imports/links/{destination}": { "post": { "tags": [ "native-meetings" ], - "summary": "Decide Minutes", - "operationId": "decide_minutes_desktop_v1_meetings_minutes__draft_id__decisions_post", + "summary": "Import Link Choices", + "operationId": "import_link_choices_desktop_v1_meetings_imports_links__destination__post", "parameters": [ { - "name": "draft_id", + "name": "destination", "in": "path", "required": true, "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], "type": "string", - "format": "uuid", - "title": "Draft Id" + "title": "Destination" } }, { @@ -9291,7 +9237,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MinutesDecision" + "$ref": "#/components/schemas/ImportLinkSearch" } } } @@ -9318,22 +9264,40 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/motions": { - "post": { + "/desktop/v1/meetings/imports/links/{destination}/{target_id}": { + "get": { "tags": [ "native-meetings" ], - "summary": "Capture Motion", - "operationId": "capture_motion_desktop_v1_meetings_meetings__meeting_id__motions_post", + "summary": "List Import Links", + "operationId": "list_import_links_desktop_v1_meetings_imports_links__destination___target_id__get", "parameters": [ { - "name": "meeting_id", + "name": "destination", + "in": "path", + "required": true, + "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], + "type": "string", + "title": "Destination" + } + }, + { + "name": "target_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Meeting Id" + "title": "Target Id" } }, { @@ -9353,18 +9317,8 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MotionInput" - } - } - } - }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9383,24 +9337,40 @@ } } } - } - }, - "/desktop/v1/meetings/motions/{motion_id}/corrections": { + }, "post": { "tags": [ "native-meetings" ], - "summary": "Correct Motion", - "operationId": "correct_motion_desktop_v1_meetings_motions__motion_id__corrections_post", + "summary": "Create Import Link", + "operationId": "create_import_link_desktop_v1_meetings_imports_links__destination___target_id__post", "parameters": [ { - "name": "motion_id", + "name": "destination", + "in": "path", + "required": true, + "schema": { + "enum": [ + "boards", + "contracts", + "procurement", + "zoning", + "planning", + "permitting", + "inspections" + ], + "type": "string", + "title": "Destination" + } + }, + { + "name": "target_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Motion Id" + "title": "Target Id" } }, { @@ -9425,13 +9395,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MotionCorrection" + "$ref": "#/components/schemas/ImportLinkInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9452,22 +9422,22 @@ } } }, - "/desktop/v1/meetings/motions/{motion_id}/votes": { + "/desktop/v1/meetings/imports/{meeting_id}/records": { "post": { "tags": [ "native-meetings" ], - "summary": "Capture Vote", - "operationId": "capture_vote_desktop_v1_meetings_motions__motion_id__votes_post", + "summary": "Attach Import Document", + "operationId": "attach_import_document_desktop_v1_meetings_imports__meeting_id__records_post", "parameters": [ { - "name": "motion_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Motion Id" + "title": "Meeting Id" } }, { @@ -9492,13 +9462,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/VoteInput" + "$ref": "#/components/schemas/RecordsImportDocument" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9519,22 +9489,22 @@ } } }, - "/desktop/v1/meetings/votes/{vote_id}/corrections": { + "/desktop/v1/meetings/meetings/{meeting_id}/stages": { "post": { "tags": [ "native-meetings" ], - "summary": "Correct Vote", - "operationId": "correct_vote_desktop_v1_meetings_votes__vote_id__corrections_post", + "summary": "Record Meeting Stage", + "operationId": "record_meeting_stage_desktop_v1_meetings_meetings__meeting_id__stages_post", "parameters": [ { - "name": "vote_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Vote Id" + "title": "Meeting Id" } }, { @@ -9559,13 +9529,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/VoteCorrection" + "$ref": "#/components/schemas/MeetingStageInput" } } } }, "responses": { - "201": { + "200": { "description": "Successful Response", "content": { "application/json": { @@ -9586,24 +9556,14 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts": { + "/desktop/v1/meetings/meetings": { "post": { "tags": [ "native-meetings" ], - "summary": "Create Minutes", - "operationId": "create_minutes_desktop_v1_meetings_meetings__meeting_id__minutes_drafts_post", + "summary": "Create Meeting", + "operationId": "create_meeting_desktop_v1_meetings_meetings_post", "parameters": [ - { - "name": "meeting_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Meeting Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -9626,7 +9586,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/DraftInput" + "$ref": "#/components/schemas/MeetingInput" } } } @@ -9653,13 +9613,13 @@ } } }, - "/desktop/v1/meetings/meetings/{meeting_id}/proceedings": { + "/desktop/v1/meetings/meetings/{meeting_id}": { "get": { "tags": [ "native-meetings" ], - "summary": "Proceedings", - "operationId": "proceedings_desktop_v1_meetings_meetings__meeting_id__proceedings_get", + "summary": "Get Meeting", + "operationId": "get_meeting_desktop_v1_meetings_meetings__meeting_id__get", "parameters": [ { "name": "meeting_id", @@ -9710,14 +9670,13 @@ } } }, - "/desktop/v1/meetings/station/catalog": { - "get": { + "/desktop/v1/meetings/agenda-items": { + "post": { "tags": [ "native-meetings" ], - "summary": "Station Catalog", - "description": "Authorized name-based operator selection from canonical Meetings data.", - "operationId": "station_catalog_desktop_v1_meetings_station_catalog_get", + "summary": "Create Agenda Item", + "operationId": "create_agenda_item_desktop_v1_meetings_agenda_items_post", "parameters": [ { "name": "X-Townlight-Session", @@ -9736,8 +9695,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AgendaInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -9758,22 +9727,38 @@ } } }, - "/public/meetings": { + "/desktop/v1/meetings/agenda-items/{item_id}": { "get": { "tags": [ - "public-meetings" + "native-meetings" ], - "summary": "Public Archive Index", - "operationId": "public_archive_index_public_meetings_get", + "summary": "Get Agenda Item", + "operationId": "get_agenda_item_desktop_v1_meetings_agenda_items__item_id__get", "parameters": [ { - "name": "q", - "in": "query", - "required": false, + "name": "item_id", + "in": "path", + "required": true, "schema": { "type": "string", - "default": "", - "title": "Q" + "format": "uuid", + "title": "Item Id" + } + }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" } } ], @@ -9781,10 +9766,8 @@ "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -9801,82 +9784,51 @@ } } }, - "/public/meetings/{record_id}": { - "get": { + "/desktop/v1/meetings/agenda-items/{item_id}/reviews": { + "post": { "tags": [ - "public-meetings" + "native-meetings" ], - "summary": "Public Archive Detail", - "operationId": "public_archive_detail_public_meetings__record_id__get", + "summary": "Record Agenda Review", + "operationId": "record_agenda_review_desktop_v1_meetings_agenda_items__item_id__reviews_post", "parameters": [ { - "name": "record_id", + "name": "item_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Record Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/html": { - "schema": { - "type": "string" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/public/meetings/{record_id}/{kind}.txt": { - "get": { - "tags": [ - "public-meetings" - ], - "summary": "Public Archive Download", - "operationId": "public_archive_download_public_meetings__record_id___kind__txt_get", - "parameters": [ - { - "name": "record_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Record Id" + "title": "Item Id" } }, { - "name": "kind", - "in": "path", - "required": true, + "name": "X-Townlight-Session", + "in": "header", + "required": false, "schema": { - "enum": [ - "agenda", - "packet", - "minutes" + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } ], - "type": "string", - "title": "Kind" + "title": "X-Townlight-Session" } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AgendaReviewInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -9899,14 +9851,24 @@ } } }, - "/desktop/v1/code/imports": { + "/desktop/v1/meetings/agenda-items/{item_id}/meeting": { "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Imports", - "operationId": "imports_desktop_v1_code_imports_post", + "summary": "Assign Agenda", + "operationId": "assign_agenda_desktop_v1_meetings_agenda_items__item_id__meeting_post", "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Item Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -9929,7 +9891,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ImportBundleCreate" + "$ref": "#/components/schemas/AgendaAssignment" } } } @@ -9954,14 +9916,26 @@ } } } - }, + } + }, + "/desktop/v1/meetings/notices/{notice_id}/template": { "get": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "List Imports", - "operationId": "list_imports_desktop_v1_code_imports_get", + "summary": "Notice Template", + "operationId": "notice_template_desktop_v1_meetings_notices__notice_id__template_get", "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10001,14 +9975,24 @@ } } }, - "/desktop/v1/code/sources": { - "get": { + "/desktop/v1/meetings/notices/{notice_id}/document": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Sources", - "operationId": "sources_desktop_v1_code_sources_get", + "summary": "Notice Document", + "operationId": "notice_document_desktop_v1_meetings_notices__notice_id__document_post", "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10026,6 +10010,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoticeDocumentInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -10048,14 +10042,24 @@ } } }, - "/desktop/v1/code/workspace": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/notice-checks": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Workspace", - "operationId": "workspace_desktop_v1_code_workspace_get", + "summary": "Check Notice", + "operationId": "check_notice_desktop_v1_meetings_meetings__meeting_id__notice_checks_post", "parameters": [ + { + "name": "meeting_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10073,8 +10077,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoticeInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10095,38 +10109,22 @@ } } }, - "/desktop/v1/code/lookup": { - "get": { + "/desktop/v1/meetings/notices/{notice_id}/proof": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Lookup", - "operationId": "lookup_desktop_v1_code_lookup_get", + "summary": "Record Notice Proof", + "operationId": "record_notice_proof_desktop_v1_meetings_notices__notice_id__proof_post", "parameters": [ { - "name": "section_number", - "in": "query", + "name": "notice_id", + "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Number" - } - }, - { - "name": "as_of", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "As Of" + "format": "uuid", + "title": "Notice Id" } }, { @@ -10146,6 +10144,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoticeProofInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -10168,21 +10176,22 @@ } } }, - "/desktop/v1/code/sections/{section_id}/history": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/transcripts": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Section History", - "operationId": "section_history_desktop_v1_code_sections__section_id__history_get", + "summary": "Capture Transcript", + "operationId": "capture_transcript_desktop_v1_meetings_meetings__meeting_id__transcripts_post", "parameters": [ { - "name": "section_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Id" + "format": "uuid", + "title": "Meeting Id" } }, { @@ -10202,8 +10211,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TranscriptInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10224,38 +10243,22 @@ } } }, - "/desktop/v1/code/citation": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/action-items": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Citation", - "operationId": "citation_desktop_v1_code_citation_get", + "summary": "Capture Action Item", + "operationId": "capture_action_item_desktop_v1_meetings_meetings__meeting_id__action_items_post", "parameters": [ { - "name": "section_number", - "in": "query", + "name": "meeting_id", + "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Number" - } - }, - { - "name": "as_of", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "As Of" + "format": "uuid", + "title": "Meeting Id" } }, { @@ -10275,8 +10278,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActionItemInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10297,21 +10310,22 @@ } } }, - "/desktop/v1/code/search": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/archive": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Search", - "operationId": "search_desktop_v1_code_search_get", + "summary": "Archive Meeting", + "operationId": "archive_meeting_desktop_v1_meetings_meetings__meeting_id__archive_post", "parameters": [ { - "name": "q", - "in": "query", + "name": "meeting_id", + "in": "path", "required": true, "schema": { "type": "string", - "title": "Q" + "format": "uuid", + "title": "Meeting Id" } }, { @@ -10331,8 +10345,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArchiveInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10353,21 +10377,22 @@ } } }, - "/desktop/v1/code/imports/{job_id}/tree": { - "get": { + "/desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Import Tree", - "operationId": "import_tree_desktop_v1_code_imports__job_id__tree_get", + "summary": "Capture Packet", + "operationId": "capture_packet_desktop_v1_meetings_meetings__meeting_id__packet_snapshots_post", "parameters": [ { - "name": "job_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Job Id" + "format": "uuid", + "title": "Meeting Id" } }, { @@ -10387,8 +10412,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PacketInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10409,21 +10444,22 @@ } } }, - "/desktop/v1/code/imports/{job_id}/provenance": { - "get": { + "/desktop/v1/meetings/packets/{packet_id}/deliver": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Import Provenance", - "operationId": "import_provenance_desktop_v1_code_imports__job_id__provenance_get", + "summary": "Export Packet", + "operationId": "export_packet_desktop_v1_meetings_packets__packet_id__deliver_post", "parameters": [ { - "name": "job_id", + "name": "packet_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Job Id" + "format": "uuid", + "title": "Packet Id" } }, { @@ -10465,38 +10501,22 @@ } } }, - "/desktop/v1/code/export": { - "get": { + "/desktop/v1/meetings/minutes/{draft_id}/decisions": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Export Section", - "operationId": "export_section_desktop_v1_code_export_get", + "summary": "Decide Minutes", + "operationId": "decide_minutes_desktop_v1_meetings_minutes__draft_id__decisions_post", "parameters": [ { - "name": "section_ref", - "in": "query", + "name": "draft_id", + "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Ref" - } - }, - { - "name": "as_of", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "As Of" + "format": "uuid", + "title": "Draft Id" } }, { @@ -10516,6 +10536,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MinutesDecision" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -10538,14 +10568,24 @@ } } }, - "/desktop/v1/code/questions": { + "/desktop/v1/meetings/meetings/{meeting_id}/motions": { "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Questions", - "operationId": "questions_desktop_v1_code_questions_post", + "summary": "Capture Motion", + "operationId": "capture_motion_desktop_v1_meetings_meetings__meeting_id__motions_post", "parameters": [ + { + "name": "meeting_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -10568,13 +10608,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/QuestionAnswerRequest" + "$ref": "#/components/schemas/MotionInput" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10595,21 +10635,22 @@ } } }, - "/desktop/v1/code/sections/{section_id}/notes": { + "/desktop/v1/meetings/motions/{motion_id}/corrections": { "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Create Note", - "operationId": "create_note_desktop_v1_code_sections__section_id__notes_post", + "summary": "Correct Motion", + "operationId": "correct_motion_desktop_v1_meetings_motions__motion_id__corrections_post", "parameters": [ { - "name": "section_id", + "name": "motion_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Id" + "format": "uuid", + "title": "Motion Id" } }, { @@ -10634,13 +10675,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InterpretationNoteCreate" + "$ref": "#/components/schemas/MotionCorrection" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10659,21 +10700,24 @@ } } } - }, - "get": { + } + }, + "/desktop/v1/meetings/motions/{motion_id}/votes": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "List Notes", - "operationId": "list_notes_desktop_v1_code_sections__section_id__notes_get", + "summary": "Capture Vote", + "operationId": "capture_vote_desktop_v1_meetings_motions__motion_id__votes_post", "parameters": [ { - "name": "section_id", + "name": "motion_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Id" + "format": "uuid", + "title": "Motion Id" } }, { @@ -10693,8 +10737,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VoteInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10715,21 +10769,22 @@ } } }, - "/desktop/v1/code/sections/{section_id}/summaries": { + "/desktop/v1/meetings/votes/{vote_id}/corrections": { "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Create Summary", - "operationId": "create_summary_desktop_v1_code_sections__section_id__summaries_post", + "summary": "Correct Vote", + "operationId": "correct_vote_desktop_v1_meetings_votes__vote_id__corrections_post", "parameters": [ { - "name": "section_id", + "name": "vote_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Id" + "format": "uuid", + "title": "Vote Id" } }, { @@ -10754,13 +10809,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PlainLanguageSummaryCreate" + "$ref": "#/components/schemas/VoteCorrection" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10779,21 +10834,24 @@ } } } - }, - "get": { + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts": { + "post": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "List Summaries", - "operationId": "list_summaries_desktop_v1_code_sections__section_id__summaries_get", + "summary": "Create Minutes", + "operationId": "create_minutes_desktop_v1_meetings_meetings__meeting_id__minutes_drafts_post", "parameters": [ { - "name": "section_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Id" + "format": "uuid", + "title": "Meeting Id" } }, { @@ -10813,8 +10871,18 @@ } } ], - "responses": { - "200": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DraftInput" + } + } + } + }, + "responses": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -10835,21 +10903,22 @@ } } }, - "/desktop/v1/code/summaries/{summary_id}/approve": { - "post": { + "/desktop/v1/meetings/meetings/{meeting_id}/proceedings": { + "get": { "tags": [ - "native-code" + "native-meetings" ], - "summary": "Approve Summary", - "operationId": "approve_summary_desktop_v1_code_summaries__summary_id__approve_post", + "summary": "Proceedings", + "operationId": "proceedings_desktop_v1_meetings_meetings__meeting_id__proceedings_get", "parameters": [ { - "name": "summary_id", + "name": "meeting_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Summary Id" + "format": "uuid", + "title": "Meeting Id" } }, { @@ -10891,10 +10960,14 @@ } } }, - "/desktop/v1/code/connections": { + "/desktop/v1/meetings/station/catalog": { "get": { - "summary": "List Connections", - "operationId": "list_connections_desktop_v1_code_connections_get", + "tags": [ + "native-meetings" + ], + "summary": "Station Catalog", + "description": "Authorized name-based operator selection from canonical Meetings data.", + "operationId": "station_catalog_desktop_v1_meetings_station_catalog_get", "parameters": [ { "name": "X-Townlight-Session", @@ -10933,38 +11006,27 @@ } } } - }, - "post": { - "summary": "Create Connection", - "operationId": "create_connection_desktop_v1_code_connections_post", + } + }, + "/public/meetings/data/index": { + "get": { + "tags": [ + "public-meetings" + ], + "summary": "Public Archive Data", + "operationId": "public_archive_data_public_meetings_data_index_get", "parameters": [ { - "name": "X-Townlight-Session", - "in": "header", + "name": "q", + "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" + "type": "string", + "default": "", + "title": "Q" } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Proposal" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -10987,35 +11049,22 @@ } } }, - "/desktop/v1/code/connections/{connection_id}": { + "/public/meetings/data/{record_id}": { "get": { - "summary": "Get Connection", - "operationId": "get_connection_desktop_v1_code_connections__connection_id__get", + "tags": [ + "public-meetings" + ], + "summary": "Public Archive Record Data", + "operationId": "public_archive_record_data_public_meetings_data__record_id__get", "parameters": [ { - "name": "connection_id", + "name": "record_id", "in": "path", "required": true, "schema": { "type": "string", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "title": "Connection Id" - } - }, - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" + "format": "uuid", + "title": "Record Id" } } ], @@ -11041,54 +11090,76 @@ } } }, - "/desktop/v1/code/connections/{connection_id}/closeout": { - "post": { - "summary": "Closeout Connection", - "operationId": "closeout_connection_desktop_v1_code_connections__connection_id__closeout_post", + "/public/meetings": { + "get": { + "tags": [ + "public-meetings" + ], + "summary": "Public Archive Index", + "operationId": "public_archive_index_public_meetings_get", "parameters": [ { - "name": "connection_id", - "in": "path", - "required": true, + "name": "q", + "in": "query", + "required": false, "schema": { "type": "string", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "title": "Connection Id" + "default": "", + "title": "Q" } - }, - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/html": { + "schema": { "type": "string" - }, - { - "type": "null" } - ], - "title": "X-Townlight-Session" + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } } } + } + } + }, + "/public/meetings/{record_id}": { + "get": { + "tags": [ + "public-meetings" ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Closeout" - } + "summary": "Public Archive Detail", + "operationId": "public_archive_detail_public_meetings__record_id__get", + "parameters": [ + { + "name": "record_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Record Id" } } - }, + ], "responses": { "200": { "description": "Successful Response", "content": { - "application/json": { - "schema": {} + "text/html": { + "schema": { + "type": "string" + } } } }, @@ -11105,25 +11176,36 @@ } } }, - "/desktop/v1/meetings/code-connections": { + "/public/meetings/{record_id}/{kind}.txt": { "get": { - "summary": "List Code Connections", - "operationId": "list_code_connections_desktop_v1_meetings_code_connections_get", + "tags": [ + "public-meetings" + ], + "summary": "Public Archive Download", + "operationId": "public_archive_download_public_meetings__record_id___kind__txt_get", "parameters": [ { - "name": "X-Townlight-Session", - "in": "header", - "required": false, + "name": "record_id", + "in": "path", + "required": true, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "type": "string", + "format": "uuid", + "title": "Record Id" + } + }, + { + "name": "kind", + "in": "path", + "required": true, + "schema": { + "enum": [ + "agenda", + "packet", + "minutes" ], - "title": "X-Townlight-Session" + "type": "string", + "title": "Kind" } } ], @@ -11149,19 +11231,23 @@ } } }, - "/desktop/v1/meetings/code-connections/{connection_id}": { + "/desktop/v1/portal/selections": { "get": { - "summary": "Get Code Connection", - "operationId": "get_code_connection_desktop_v1_meetings_code_connections__connection_id__get", + "tags": [ + "portal-publication" + ], + "summary": "Selections", + "description": "Find reviewed choices without exposing SQL, private text or file paths.", + "operationId": "selections_desktop_v1_portal_selections_get", "parameters": [ { - "name": "connection_id", - "in": "path", + "name": "request_id", + "in": "query", "required": true, "schema": { "type": "string", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "title": "Connection Id" + "format": "uuid", + "title": "Request Id" } }, { @@ -11203,21 +11289,14 @@ } } }, - "/desktop/v1/meetings/code-connections/{connection_id}/decisions": { + "/desktop/v1/portal/bundle": { "post": { - "summary": "Record Decision", - "operationId": "record_decision_desktop_v1_meetings_code_connections__connection_id__decisions_post", + "tags": [ + "portal-publication" + ], + "summary": "Bundle", + "operationId": "bundle_desktop_v1_portal_bundle_post", "parameters": [ - { - "name": "connection_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^[A-Za-z0-9_-]{1,64}$", - "title": "Connection Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11240,7 +11319,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Decision" + "$ref": "#/components/schemas/townlight_runtime__portal_publication__Selection" } } } @@ -11267,17 +11346,101 @@ } } }, - "/townlight_code": { - "get": { - "summary": "Home", - "operationId": "home_townlight_code_get", + "/desktop/v1/code/imports": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Imports", + "operationId": "imports_desktop_v1_code_imports_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/ImportBundleCreate" + } + } + } + }, "responses": { "200": { "description": "Successful Response", "content": { - "text/html": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "native-code" + ], + "summary": "List Imports", + "operationId": "list_imports_desktop_v1_code_imports_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" } } } @@ -11285,19 +11448,28 @@ } } }, - "/townlight_code/search": { + "/desktop/v1/code/sources": { "get": { - "summary": "Search", - "operationId": "search_townlight_code_search_get", + "tags": [ + "native-code" + ], + "summary": "Sources", + "operationId": "sources_desktop_v1_code_sources_get", "parameters": [ { - "name": "q", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { - "type": "string", - "default": "", - "title": "Q" + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" } } ], @@ -11305,10 +11477,55 @@ "200": { "description": "Successful Response", "content": { - "text/html": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/code/workspace": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Workspace", + "operationId": "workspace_desktop_v1_code_workspace_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": {} } } }, @@ -11325,52 +11542,54 @@ } } }, - "/townlight_code/answer": { + "/desktop/v1/code/lookup": { "get": { - "summary": "Answer", - "operationId": "answer_townlight_code_answer_get", + "tags": [ + "native-code" + ], + "summary": "Lookup", + "operationId": "lookup_desktop_v1_code_lookup_get", "parameters": [ { - "name": "q", + "name": "section_number", "in": "query", - "required": false, + "required": true, "schema": { "type": "string", - "default": "", - "title": "Q" + "title": "Section Number" } }, { - "name": "section_number", + "name": "as_of", "in": "query", "required": false, "schema": { "anyOf": [ { - "type": "string" + "type": "string", + "format": "date" }, { "type": "null" } ], - "title": "Section Number" + "title": "As Of" } }, { - "name": "as_of", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { "anyOf": [ { - "type": "string", - "format": "date" + "type": "string" }, { "type": "null" } ], - "title": "As Of" + "title": "X-Townlight-Session" } } ], @@ -11378,10 +11597,8 @@ "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -11398,35 +11615,37 @@ } } }, - "/townlight_code/sections/{section_ref}": { + "/desktop/v1/code/sections/{section_id}/history": { "get": { - "summary": "Detail", - "operationId": "detail_townlight_code_sections__section_ref__get", + "tags": [ + "native-code" + ], + "summary": "Section History", + "operationId": "section_history_desktop_v1_code_sections__section_id__history_get", "parameters": [ { - "name": "section_ref", + "name": "section_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Section Ref" + "title": "Section Id" } }, { - "name": "as_of", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { "anyOf": [ { - "type": "string", - "format": "date" + "type": "string" }, { "type": "null" } ], - "title": "As Of" + "title": "X-Townlight-Session" } } ], @@ -11434,10 +11653,8 @@ "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -11454,18 +11671,21 @@ } } }, - "/townlight_code/sections/{section_ref}/export": { + "/desktop/v1/code/citation": { "get": { - "summary": "Export", - "operationId": "export_townlight_code_sections__section_ref__export_get", + "tags": [ + "native-code" + ], + "summary": "Citation", + "operationId": "citation_desktop_v1_code_citation_get", "parameters": [ { - "name": "section_ref", - "in": "path", + "name": "section_number", + "in": "query", "required": true, "schema": { "type": "string", - "title": "Section Ref" + "title": "Section Number" } }, { @@ -11484,16 +11704,2051 @@ ], "title": "As Of" } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/search": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Search", + "operationId": "search_desktop_v1_code_search_get", + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Q" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/imports/{job_id}/tree": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Import Tree", + "operationId": "import_tree_desktop_v1_code_imports__job_id__tree_get", + "parameters": [ + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Job Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/imports/{job_id}/provenance": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Import Provenance", + "operationId": "import_provenance_desktop_v1_code_imports__job_id__provenance_get", + "parameters": [ + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Job Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/export": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Export Section", + "operationId": "export_section_desktop_v1_code_export_get", + "parameters": [ + { + "name": "section_ref", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Section Ref" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/questions": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Questions", + "operationId": "questions_desktop_v1_code_questions_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/QuestionAnswerRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/code/sections/{section_id}/notes": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Create Note", + "operationId": "create_note_desktop_v1_code_sections__section_id__notes_post", + "parameters": [ + { + "name": "section_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Id" + } + }, + { + "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/InterpretationNoteCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "native-code" + ], + "summary": "List Notes", + "operationId": "list_notes_desktop_v1_code_sections__section_id__notes_get", + "parameters": [ + { + "name": "section_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/sections/{section_id}/summaries": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Create Summary", + "operationId": "create_summary_desktop_v1_code_sections__section_id__summaries_post", + "parameters": [ + { + "name": "section_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Id" + } + }, + { + "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/PlainLanguageSummaryCreate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "native-code" + ], + "summary": "List Summaries", + "operationId": "list_summaries_desktop_v1_code_sections__section_id__summaries_get", + "parameters": [ + { + "name": "section_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/summaries/{summary_id}/approve": { + "post": { + "tags": [ + "native-code" + ], + "summary": "Approve Summary", + "operationId": "approve_summary_desktop_v1_code_summaries__summary_id__approve_post", + "parameters": [ + { + "name": "summary_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Summary Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/connections": { + "get": { + "summary": "List Connections", + "operationId": "list_connections_desktop_v1_code_connections_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" + } + } + } + } + } + }, + "post": { + "summary": "Create Connection", + "operationId": "create_connection_desktop_v1_code_connections_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/Proposal" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/code/connections/{connection_id}": { + "get": { + "summary": "Get Connection", + "operationId": "get_connection_desktop_v1_code_connections__connection_id__get", + "parameters": [ + { + "name": "connection_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Connection Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/code/connections/{connection_id}/closeout": { + "post": { + "summary": "Closeout Connection", + "operationId": "closeout_connection_desktop_v1_code_connections__connection_id__closeout_post", + "parameters": [ + { + "name": "connection_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Connection Id" + } + }, + { + "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/Closeout" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/code-connections": { + "get": { + "summary": "List Code Connections", + "operationId": "list_code_connections_desktop_v1_meetings_code_connections_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" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/code-connections/{connection_id}": { + "get": { + "summary": "Get Code Connection", + "operationId": "get_code_connection_desktop_v1_meetings_code_connections__connection_id__get", + "parameters": [ + { + "name": "connection_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Connection Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/code-connections/{connection_id}/decisions": { + "post": { + "summary": "Record Decision", + "operationId": "record_decision_desktop_v1_meetings_code_connections__connection_id__decisions_post", + "parameters": [ + { + "name": "connection_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]{1,64}$", + "title": "Connection Id" + } + }, + { + "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/Decision" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_code/public-data/search": { + "get": { + "summary": "Search Data", + "operationId": "search_data_townlight_code_public_data_search_get", + "parameters": [ + { + "name": "q", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "", + "title": "Q" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_code/public-data/section": { + "get": { + "summary": "Section Data", + "operationId": "section_data_townlight_code_public_data_section_get", + "parameters": [ + { + "name": "section_number", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Section Number" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_code/public-data/export": { + "get": { + "summary": "Export Data", + "operationId": "export_data_townlight_code_public_data_export_get", + "parameters": [ + { + "name": "section_number", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Section Number" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_code/public-data/answer": { + "get": { + "summary": "Answer Data", + "operationId": "answer_data_townlight_code_public_data_answer_get", + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Q" + } + }, + { + "name": "section_number", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Section Number" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_code": { + "get": { + "summary": "Home", + "operationId": "home_townlight_code_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/townlight_code/search": { + "get": { + "summary": "Search", + "operationId": "search_townlight_code_search_get", + "parameters": [ + { + "name": "q", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "", + "title": "Q" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_code/answer": { + "get": { + "summary": "Answer", + "operationId": "answer_townlight_code_answer_get", + "parameters": [ + { + "name": "q", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "", + "title": "Q" + } + }, + { + "name": "section_number", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Section Number" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_code/sections/{section_ref}": { + "get": { + "summary": "Detail", + "operationId": "detail_townlight_code_sections__section_ref__get", + "parameters": [ + { + "name": "section_ref", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Ref" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_code/sections/{section_ref}/export": { + "get": { + "summary": "Export", + "operationId": "export_townlight_code_sections__section_ref__export_get", + "parameters": [ + { + "name": "section_ref", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Section Ref" + } + }, + { + "name": "as_of", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/imports": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Imports", + "operationId": "imports_desktop_v1_zoning_imports_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": { + "type": "object", + "additionalProperties": true, + "title": "Payload" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/parcels/lookup": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Parcel Lookup", + "operationId": "parcel_lookup_desktop_v1_zoning_parcels_lookup_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/_ParcelLookupIn" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/questions/{question_id}/history": { + "get": { + "tags": [ + "native-zoning" + ], + "summary": "Question History", + "operationId": "question_history_desktop_v1_zoning_questions__question_id__history_get", + "parameters": [ + { + "name": "question_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Question Id" + } + }, + { + "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" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/meetings/search": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Search Meetings", + "operationId": "search_meetings_desktop_v1_zoning_meetings_search_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/MeetingSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/questions/{question_id}/meetings": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Link Meeting", + "operationId": "link_meeting_desktop_v1_zoning_questions__question_id__meetings_post", + "parameters": [ + { + "name": "question_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Question Id" + } + }, + { + "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/MeetingLink" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/questions/{question_id}/snapshots": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Create Snapshot", + "operationId": "create_snapshot_desktop_v1_zoning_questions__question_id__snapshots_post", + "parameters": [ + { + "name": "question_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Question Id" + } + }, + { + "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/SourceSnapshot" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/rules": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Create Rule", + "operationId": "create_rule_desktop_v1_zoning_rules_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/Rule" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/questions": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Create Question", + "operationId": "create_question_desktop_v1_zoning_questions_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/Question" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/workspace": { + "get": { + "tags": [ + "native-zoning" + ], + "summary": "Get Workspace", + "operationId": "get_workspace_desktop_v1_zoning_workspace_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" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/questions/{question_id}/reviews": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Create Review", + "operationId": "create_review_desktop_v1_zoning_questions__question_id__reviews_post", + "parameters": [ + { + "name": "question_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Question Id" + } + }, + { + "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/townlight_runtime__zoning_bridge__Review" + } + } } - ], + }, "responses": { "200": { "description": "Successful Response", "content": { - "text/html": { - "schema": { - "type": "string" - } + "application/json": { + "schema": {} } } }, @@ -11510,13 +13765,13 @@ } } }, - "/desktop/v1/zoning/imports": { + "/desktop/v1/zoning/outlines": { "post": { "tags": [ "native-zoning" ], - "summary": "Imports", - "operationId": "imports_desktop_v1_zoning_imports_post", + "summary": "Create Outline", + "operationId": "create_outline_desktop_v1_zoning_outlines_post", "parameters": [ { "name": "X-Townlight-Session", @@ -11540,9 +13795,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "additionalProperties": true, - "title": "Payload" + "$ref": "#/components/schemas/Outline" } } } @@ -11569,13 +13822,13 @@ } } }, - "/desktop/v1/zoning/parcels/lookup": { + "/desktop/v1/zoning/code-context": { "post": { "tags": [ "native-zoning" ], - "summary": "Parcel Lookup", - "operationId": "parcel_lookup_desktop_v1_zoning_parcels_lookup_post", + "summary": "Create Code Context", + "operationId": "create_code_context_desktop_v1_zoning_code_context_post", "parameters": [ { "name": "X-Townlight-Session", @@ -11599,7 +13852,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/_ParcelLookupIn" + "$ref": "#/components/schemas/CodeContext" } } } @@ -11626,24 +13879,15 @@ } } }, - "/desktop/v1/zoning/questions/{question_id}/history": { - "get": { + "/desktop/v1/zoning/standards/process-explanation": { + "post": { "tags": [ "native-zoning" ], - "summary": "Question History", - "operationId": "question_history_desktop_v1_zoning_questions__question_id__history_get", + "summary": "Standards Explanation", + "description": "Cited variance/CUP/nonconformity process; never a determination.", + "operationId": "standards_explanation_desktop_v1_zoning_standards_process_explanation_post", "parameters": [ - { - "name": "question_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Question Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11661,6 +13905,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StandardsExplanation" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -11683,40 +13937,55 @@ } } }, - "/desktop/v1/zoning/meetings/search": { + "/townlight_zoning/questions": { "post": { - "tags": [ - "native-zoning" - ], - "summary": "Search Meetings", - "operationId": "search_meetings_desktop_v1_zoning_meetings_search_post", - "parameters": [ - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" + "summary": "Public Question", + "operationId": "public_question_townlight_zoning_questions_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Question" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - ], - "title": "X-Townlight-Session" + } } } - ], + } + } + }, + "/townlight_zoning/parcels/lookup": { + "post": { + "summary": "Public Parcel Lookup", + "operationId": "public_parcel_lookup_townlight_zoning_parcels_lookup_post", "requestBody": { - "required": true, "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MeetingSearch" + "$ref": "#/components/schemas/_ParcelLookupIn" } } - } + }, + "required": true }, "responses": { "200": { @@ -11740,24 +14009,14 @@ } } }, - "/desktop/v1/zoning/questions/{question_id}/meetings": { + "/desktop/v1/planning/imports/preview": { "post": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Link Meeting", - "operationId": "link_meeting_desktop_v1_zoning_questions__question_id__meetings_post", + "summary": "Preview Import", + "operationId": "preview_import_desktop_v1_planning_imports_preview_post", "parameters": [ - { - "name": "question_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Question Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11780,7 +14039,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MeetingLink" + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" } } } @@ -11807,24 +14066,14 @@ } } }, - "/desktop/v1/zoning/questions/{question_id}/snapshots": { + "/desktop/v1/planning/imports": { "post": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Create Snapshot", - "operationId": "create_snapshot_desktop_v1_zoning_questions__question_id__snapshots_post", + "summary": "Import Source", + "operationId": "import_source_desktop_v1_planning_imports_post", "parameters": [ - { - "name": "question_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Question Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -11847,7 +14096,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SourceSnapshot" + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" } } } @@ -11874,14 +14123,38 @@ } } }, - "/desktop/v1/zoning/rules": { - "post": { + "/desktop/v1/planning/sources": { + "get": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Create Rule", - "operationId": "create_rule_desktop_v1_zoning_rules_post", + "summary": "Source List", + "operationId": "source_list_desktop_v1_planning_sources_get", "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -11899,16 +14172,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Rule" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -11931,14 +14194,35 @@ } } }, - "/desktop/v1/zoning/questions": { - "post": { + "/desktop/v1/planning/sources/{plan_id}/history": { + "get": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Create Question", - "operationId": "create_question_desktop_v1_zoning_questions_post", + "summary": "Source History", + "operationId": "source_history_desktop_v1_planning_sources__plan_id__history_get", "parameters": [ + { + "name": "plan_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Plan Id" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -11956,16 +14240,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Question" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -11988,14 +14262,24 @@ } } }, - "/desktop/v1/zoning/workspace": { + "/desktop/v1/planning/revisions/{revision_id}": { "get": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Get Workspace", - "operationId": "get_workspace_desktop_v1_zoning_workspace_get", + "summary": "Revision", + "operationId": "revision_desktop_v1_planning_revisions__revision_id__get", "parameters": [ + { + "name": "revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Revision Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -12035,22 +14319,31 @@ } } }, - "/desktop/v1/zoning/questions/{question_id}/reviews": { - "post": { + "/desktop/v1/planning/revisions/{revision_id}/documents/{document_id}": { + "get": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Create Review", - "operationId": "create_review_desktop_v1_zoning_questions__question_id__reviews_post", + "summary": "Staff Original", + "operationId": "staff_original_desktop_v1_planning_revisions__revision_id__documents__document_id__get", "parameters": [ { - "name": "question_id", + "name": "revision_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Question Id" + "title": "Revision Id" + } + }, + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Document Id" } }, { @@ -12070,16 +14363,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Review" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12102,13 +14385,13 @@ } } }, - "/desktop/v1/zoning/outlines": { + "/desktop/v1/planning/policies/search": { "post": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Create Outline", - "operationId": "create_outline_desktop_v1_zoning_outlines_post", + "summary": "Policies", + "operationId": "policies_desktop_v1_planning_policies_search_post", "parameters": [ { "name": "X-Townlight-Session", @@ -12132,7 +14415,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Outline" + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" } } } @@ -12159,14 +14442,38 @@ } } }, - "/desktop/v1/zoning/code-context": { - "post": { + "/desktop/v1/planning/analyses": { + "get": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Create Code Context", - "operationId": "create_code_context_desktop_v1_zoning_code_context_post", + "summary": "Analyses", + "operationId": "analyses_desktop_v1_planning_analyses_get", "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -12184,16 +14491,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CodeContext" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12214,16 +14511,13 @@ } } } - } - }, - "/desktop/v1/zoning/standards/process-explanation": { + }, "post": { "tags": [ - "native-zoning" + "native-planning" ], - "summary": "Standards Explanation", - "description": "Cited variance/CUP/nonconformity process; never a determination.", - "operationId": "standards_explanation_desktop_v1_zoning_standards_process_explanation_post", + "summary": "Create Analysis", + "operationId": "create_analysis_desktop_v1_planning_analyses_post", "parameters": [ { "name": "X-Townlight-Session", @@ -12247,7 +14541,9 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/StandardsExplanation" + "type": "object", + "additionalProperties": true, + "title": "Body" } } } @@ -12274,19 +14570,52 @@ } } }, - "/townlight_zoning/questions": { + "/desktop/v1/planning/analyses/{analysis_id}/revisions": { "post": { - "summary": "Public Question", - "operationId": "public_question_townlight_zoning_questions_post", + "tags": [ + "native-planning" + ], + "summary": "Revise Analysis", + "operationId": "revise_analysis_desktop_v1_planning_analyses__analysis_id__revisions_post", + "parameters": [ + { + "name": "analysis_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Analysis Id" + } + }, + { + "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/Question" + "type": "object", + "additionalProperties": true, + "title": "Body" } } - }, - "required": true + } }, "responses": { "200": { @@ -12310,20 +14639,41 @@ } } }, - "/townlight_zoning/parcels/lookup": { - "post": { - "summary": "Public Parcel Lookup", - "operationId": "public_parcel_lookup_townlight_zoning_parcels_lookup_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/_ParcelLookupIn" - } + "/desktop/v1/planning/analyses/{analysis_id}": { + "get": { + "tags": [ + "native-planning" + ], + "summary": "Analysis", + "operationId": "analysis_desktop_v1_planning_analyses__analysis_id__get", + "parameters": [ + { + "name": "analysis_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Analysis Id" } }, - "required": true - }, + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], "responses": { "200": { "description": "Successful Response", @@ -12346,14 +14696,36 @@ } } }, - "/desktop/v1/planning/imports/preview": { - "post": { + "/desktop/v1/planning/analyses/{analysis_id}/history": { + "get": { "tags": [ "native-planning" ], - "summary": "Preview Import", - "operationId": "preview_import_desktop_v1_planning_imports_preview_post", + "summary": "Analysis History", + "operationId": "analysis_history_desktop_v1_planning_analyses__analysis_id__history_get", "parameters": [ + { + "name": "analysis_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Analysis Id" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -12371,16 +14743,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12403,14 +14765,24 @@ } } }, - "/desktop/v1/planning/imports": { + "/desktop/v1/planning/analyses/{analysis_id}/snapshot-preview": { "post": { "tags": [ "native-planning" ], - "summary": "Import Source", - "operationId": "import_source_desktop_v1_planning_imports_post", + "summary": "Preview Snapshot", + "operationId": "preview_snapshot_desktop_v1_planning_analyses__analysis_id__snapshot_preview_post", "parameters": [ + { + "name": "analysis_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Analysis Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -12433,7 +14805,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" + "$ref": "#/components/schemas/Snapshot" } } } @@ -12460,36 +14832,22 @@ } } }, - "/desktop/v1/planning/sources": { - "get": { + "/desktop/v1/planning/analyses/{analysis_id}/snapshots": { + "post": { "tags": [ "native-planning" ], - "summary": "Source List", - "operationId": "source_list_desktop_v1_planning_sources_get", + "summary": "Snapshot", + "operationId": "snapshot_desktop_v1_planning_analyses__analysis_id__snapshots_post", "parameters": [ { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - }, - { - "name": "offset", - "in": "query", - "required": false, + "name": "analysis_id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" + "type": "string", + "format": "uuid", + "title": "Analysis Id" } }, { @@ -12509,6 +14867,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Snapshot" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -12531,21 +14899,24 @@ } } }, - "/desktop/v1/planning/sources/{plan_id}/history": { + "/desktop/v1/planning/snapshots": { "get": { "tags": [ "native-planning" ], - "summary": "Source History", - "operationId": "source_history_desktop_v1_planning_sources__plan_id__history_get", + "summary": "Snapshots", + "operationId": "snapshots_desktop_v1_planning_snapshots_get", "parameters": [ { - "name": "plan_id", - "in": "path", - "required": true, + "name": "limit", + "in": "query", + "required": false, "schema": { - "type": "string", - "title": "Plan Id" + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" } }, { @@ -12599,22 +14970,22 @@ } } }, - "/desktop/v1/planning/revisions/{revision_id}": { + "/desktop/v1/planning/snapshots/{snapshot_id}": { "get": { "tags": [ "native-planning" ], - "summary": "Revision", - "operationId": "revision_desktop_v1_planning_revisions__revision_id__get", + "summary": "Document", + "operationId": "document_desktop_v1_planning_snapshots__snapshot_id__get", "parameters": [ { - "name": "revision_id", + "name": "snapshot_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Revision Id" + "title": "Snapshot Id" } }, { @@ -12656,31 +15027,22 @@ } } }, - "/desktop/v1/planning/revisions/{revision_id}/documents/{document_id}": { - "get": { + "/desktop/v1/planning/snapshots/{snapshot_id}/access-advice": { + "post": { "tags": [ "native-planning" ], - "summary": "Staff Original", - "operationId": "staff_original_desktop_v1_planning_revisions__revision_id__documents__document_id__get", + "summary": "Access Advice", + "operationId": "access_advice_desktop_v1_planning_snapshots__snapshot_id__access_advice_post", "parameters": [ { - "name": "revision_id", + "name": "snapshot_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Revision Id" - } - }, - { - "name": "document_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Document Id" + "title": "Snapshot Id" } }, { @@ -12722,13 +15084,13 @@ } } }, - "/desktop/v1/planning/policies/search": { + "/desktop/v1/planning/connections/search": { "post": { "tags": [ "native-planning" ], - "summary": "Policies", - "operationId": "policies_desktop_v1_planning_policies_search_post", + "summary": "Connections", + "operationId": "connections_desktop_v1_planning_connections_search_post", "parameters": [ { "name": "X-Townlight-Session", @@ -12752,7 +15114,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" + "$ref": "#/components/schemas/ConnectionSearch" } } } @@ -12779,26 +15141,14 @@ } } }, - "/desktop/v1/planning/analyses": { + "/desktop/v1/planning/progress/targets": { "get": { "tags": [ "native-planning" ], - "summary": "Analyses", - "operationId": "analyses_desktop_v1_planning_analyses_get", + "summary": "Municipal Progress", + "operationId": "municipal_progress_desktop_v1_planning_progress_targets_get", "parameters": [ - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - }, { "name": "offset", "in": "query", @@ -12848,14 +15198,28 @@ } } } - }, - "post": { + } + }, + "/desktop/v1/planning/amendments/history": { + "get": { "tags": [ "native-planning" ], - "summary": "Create Analysis", - "operationId": "create_analysis_desktop_v1_planning_analyses_post", + "summary": "Municipal Amendments", + "operationId": "municipal_amendments_desktop_v1_planning_amendments_history_get", "parameters": [ + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -12873,18 +15237,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": true, - "title": "Body" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12907,22 +15259,22 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}/revisions": { - "post": { + "/desktop/v1/planning/municipal-work/{item_id}/history": { + "get": { "tags": [ "native-planning" ], - "summary": "Revise Analysis", - "operationId": "revise_analysis_desktop_v1_planning_analyses__analysis_id__revisions_post", + "summary": "Municipal History", + "operationId": "municipal_history_desktop_v1_planning_municipal_work__item_id__history_get", "parameters": [ { - "name": "analysis_id", + "name": "item_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Analysis Id" + "title": "Item Id" } }, { @@ -12942,18 +15294,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": true, - "title": "Body" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -12976,24 +15316,14 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}": { - "get": { + "/desktop/v1/planning/initiatives": { + "post": { "tags": [ "native-planning" ], - "summary": "Analysis", - "operationId": "analysis_desktop_v1_planning_analyses__analysis_id__get", + "summary": "Create Initiative", + "operationId": "create_initiative_desktop_v1_planning_initiatives_post", "parameters": [ - { - "name": "analysis_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Analysis Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -13011,6 +15341,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InitiativeInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -13033,36 +15373,81 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}/history": { - "get": { + "/desktop/v1/planning/initiatives/{item_id}/revisions": { + "post": { "tags": [ "native-planning" ], - "summary": "Analysis History", - "operationId": "analysis_history_desktop_v1_planning_analyses__analysis_id__history_get", + "summary": "Update Initiative", + "operationId": "update_initiative_desktop_v1_planning_initiatives__item_id__revisions_post", "parameters": [ { - "name": "analysis_id", + "name": "item_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Analysis Id" + "title": "Item Id" } }, { - "name": "offset", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InitiativeInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } } }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/amendments": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Create Amendment", + "operationId": "create_amendment_desktop_v1_planning_amendments_post", + "parameters": [ { "name": "X-Townlight-Session", "in": "header", @@ -13080,6 +15465,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AmendmentInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -13102,22 +15497,22 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}/snapshot-preview": { + "/desktop/v1/planning/amendments/{item_id}/revisions": { "post": { "tags": [ "native-planning" ], - "summary": "Preview Snapshot", - "operationId": "preview_snapshot_desktop_v1_planning_analyses__analysis_id__snapshot_preview_post", + "summary": "Update Amendment", + "operationId": "update_amendment_desktop_v1_planning_amendments__item_id__revisions_post", "parameters": [ { - "name": "analysis_id", + "name": "item_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Analysis Id" + "title": "Item Id" } }, { @@ -13142,7 +15537,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Snapshot" + "$ref": "#/components/schemas/AmendmentInput" } } } @@ -13169,50 +15564,62 @@ } } }, - "/desktop/v1/planning/analyses/{analysis_id}/snapshots": { + "/townlight_planning/policies/search": { "post": { "tags": [ - "native-planning" + "local-public-planning" ], - "summary": "Snapshot", - "operationId": "snapshot_desktop_v1_planning_analyses__analysis_id__snapshots_post", - "parameters": [ - { - "name": "analysis_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Analysis Id" + "summary": "Public Policies", + "operationId": "public_policies_townlight_planning_policies_search_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" + } } }, - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - ], - "title": "X-Townlight-Session" + } } } + } + } + }, + "/townlight_planning/plan-explore": { + "post": { + "tags": [ + "local-public-planning" ], + "summary": "Public Plan Explore", + "description": "Topic/goal/plan-type exploration over adopted public plan sources only.", + "operationId": "public_plan_explore_townlight_planning_plan_explore_post", "requestBody": { - "required": true, "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Snapshot" + "$ref": "#/components/schemas/PublicExplore" } } - } + }, + "required": true }, "responses": { "200": { @@ -13236,13 +15643,13 @@ } } }, - "/desktop/v1/planning/snapshots": { + "/townlight_planning/snapshots": { "get": { "tags": [ - "native-planning" + "local-public-planning" ], - "summary": "Snapshots", - "operationId": "snapshots_desktop_v1_planning_snapshots_get", + "summary": "Public Snapshots", + "operationId": "public_snapshots_townlight_planning_snapshots_get", "parameters": [ { "name": "limit", @@ -13267,22 +15674,6 @@ "default": 0, "title": "Offset" } - }, - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" - } } ], "responses": { @@ -13307,13 +15698,13 @@ } } }, - "/desktop/v1/planning/snapshots/{snapshot_id}": { + "/townlight_planning/snapshots/{snapshot_id}": { "get": { "tags": [ - "native-planning" + "local-public-planning" ], - "summary": "Document", - "operationId": "document_desktop_v1_planning_snapshots__snapshot_id__get", + "summary": "Public Document", + "operationId": "public_document_townlight_planning_snapshots__snapshot_id__get", "parameters": [ { "name": "snapshot_id", @@ -13324,22 +15715,6 @@ "format": "uuid", "title": "Snapshot Id" } - }, - { - "name": "X-Townlight-Session", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" - } } ], "responses": { @@ -13364,38 +15739,31 @@ } } }, - "/desktop/v1/planning/snapshots/{snapshot_id}/access-advice": { - "post": { + "/townlight_planning/revisions/{revision_id}/documents/{document_id}": { + "get": { "tags": [ - "native-planning" + "local-public-planning" ], - "summary": "Access Advice", - "operationId": "access_advice_desktop_v1_planning_snapshots__snapshot_id__access_advice_post", + "summary": "Public Original", + "operationId": "public_original_townlight_planning_revisions__revision_id__documents__document_id__get", "parameters": [ { - "name": "snapshot_id", + "name": "revision_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Snapshot Id" + "title": "Revision Id" } }, { - "name": "X-Townlight-Session", - "in": "header", - "required": false, + "name": "document_id", + "in": "path", + "required": true, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Townlight-Session" + "type": "string", + "title": "Document Id" } } ], @@ -13421,13 +15789,13 @@ } } }, - "/desktop/v1/planning/connections/search": { + "/desktop/v1/permitting/requirements": { "post": { "tags": [ - "native-planning" + "native-permitting" ], - "summary": "Connections", - "operationId": "connections_desktop_v1_planning_connections_search_post", + "summary": "Import Requirements", + "operationId": "import_requirements_desktop_v1_permitting_requirements_post", "parameters": [ { "name": "X-Townlight-Session", @@ -13451,7 +15819,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ConnectionSearch" + "$ref": "#/components/schemas/townlight_runtime__permitting_bridge__Import" } } } @@ -13476,15 +15844,13 @@ } } } - } - }, - "/desktop/v1/planning/progress/targets": { + }, "get": { "tags": [ - "native-planning" + "native-permitting" ], - "summary": "Municipal Progress", - "operationId": "municipal_progress_desktop_v1_planning_progress_targets_get", + "summary": "Requirements", + "operationId": "requirements_desktop_v1_permitting_requirements_get", "parameters": [ { "name": "offset", @@ -13537,24 +15903,22 @@ } } }, - "/desktop/v1/planning/amendments/history": { + "/desktop/v1/permitting/requirements/{revision_id}": { "get": { "tags": [ - "native-planning" + "native-permitting" ], - "summary": "Municipal Amendments", - "operationId": "municipal_amendments_desktop_v1_planning_amendments_history_get", + "summary": "Requirement", + "operationId": "requirement_desktop_v1_permitting_requirements__revision_id__get", "parameters": [ { - "name": "offset", - "in": "query", - "required": false, + "name": "revision_id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" + "type": "string", + "format": "uuid", + "title": "Revision Id" } }, { @@ -13596,22 +15960,24 @@ } } }, - "/desktop/v1/planning/municipal-work/{item_id}/history": { + "/desktop/v1/permitting/cases": { "get": { "tags": [ - "native-planning" + "native-permitting" ], - "summary": "Municipal History", - "operationId": "municipal_history_desktop_v1_planning_municipal_work__item_id__history_get", + "summary": "Cases", + "operationId": "cases_desktop_v1_permitting_cases_get", "parameters": [ { - "name": "item_id", - "in": "path", - "required": true, + "name": "offset", + "in": "query", + "required": false, "schema": { - "type": "string", - "format": "uuid", - "title": "Item Id" + "type": "integer", + "maximum": 100000, + "minimum": 0, + "default": 0, + "title": "Offset" } }, { @@ -13651,15 +16017,13 @@ } } } - } - }, - "/desktop/v1/planning/initiatives": { + }, "post": { "tags": [ - "native-planning" + "native-permitting" ], - "summary": "Create Initiative", - "operationId": "create_initiative_desktop_v1_planning_initiatives_post", + "summary": "Create Case", + "operationId": "create_case_desktop_v1_permitting_cases_post", "parameters": [ { "name": "X-Townlight-Session", @@ -13683,7 +16047,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InitiativeInput" + "$ref": "#/components/schemas/IntakeInput" } } } @@ -13710,22 +16074,22 @@ } } }, - "/desktop/v1/planning/initiatives/{item_id}/revisions": { - "post": { + "/desktop/v1/permitting/cases/{case_id}": { + "get": { "tags": [ - "native-planning" + "native-permitting" ], - "summary": "Update Initiative", - "operationId": "update_initiative_desktop_v1_planning_initiatives__item_id__revisions_post", + "summary": "Case", + "operationId": "case_desktop_v1_permitting_cases__case_id__get", "parameters": [ { - "name": "item_id", + "name": "case_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Case Id" } }, { @@ -13745,16 +16109,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InitiativeInput" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -13777,14 +16131,24 @@ } } }, - "/desktop/v1/planning/amendments": { + "/desktop/v1/permitting/cases/{case_id}/revisions": { "post": { "tags": [ - "native-planning" + "native-permitting" ], - "summary": "Create Amendment", - "operationId": "create_amendment_desktop_v1_planning_amendments_post", + "summary": "Revise", + "operationId": "revise_desktop_v1_permitting_cases__case_id__revisions_post", "parameters": [ + { + "name": "case_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Case Id" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -13807,7 +16171,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AmendmentInput" + "$ref": "#/components/schemas/IntakeInput" } } } @@ -13834,22 +16198,22 @@ } } }, - "/desktop/v1/planning/amendments/{item_id}/revisions": { - "post": { + "/desktop/v1/permitting/cases/{case_id}/history": { + "get": { "tags": [ - "native-planning" + "native-permitting" ], - "summary": "Update Amendment", - "operationId": "update_amendment_desktop_v1_planning_amendments__item_id__revisions_post", + "summary": "History", + "operationId": "history_desktop_v1_permitting_cases__case_id__history_get", "parameters": [ { - "name": "item_id", + "name": "case_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Case Id" } }, { @@ -13869,16 +16233,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AmendmentInput" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -13901,62 +16255,50 @@ } } }, - "/townlight_planning/policies/search": { + "/desktop/v1/permitting/cases/{case_id}/packets": { "post": { "tags": [ - "local-public-planning" + "native-permitting" ], - "summary": "Public Policies", - "operationId": "public_policies_townlight_planning_policies_search_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } + "summary": "Packet", + "operationId": "packet_desktop_v1_permitting_cases__case_id__packets_post", + "parameters": [ + { + "name": "case_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Case Id" } }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + { + "name": "X-Townlight-Session", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" } - } + ], + "title": "X-Townlight-Session" } } - } - } - }, - "/townlight_planning/plan-explore": { - "post": { - "tags": [ - "local-public-planning" ], - "summary": "Public Plan Explore", - "description": "Topic/goal/plan-type exploration over adopted public plan sources only.", - "operationId": "public_plan_explore_townlight_planning_plan_explore_post", "requestBody": { + "required": true, "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PublicExplore" + "$ref": "#/components/schemas/Packet" } } - }, - "required": true + } }, "responses": { "200": { @@ -13980,77 +16322,38 @@ } } }, - "/townlight_planning/snapshots": { + "/desktop/v1/permitting/packets/{packet_id}": { "get": { "tags": [ - "local-public-planning" + "native-permitting" ], - "summary": "Public Snapshots", - "operationId": "public_snapshots_townlight_planning_snapshots_get", + "summary": "Document", + "operationId": "document_desktop_v1_permitting_packets__packet_id__get", "parameters": [ { - "name": "limit", - "in": "query", - "required": false, + "name": "packet_id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" + "type": "string", + "format": "uuid", + "title": "Packet Id" } }, { - "name": "offset", - "in": "query", + "name": "X-Townlight-Session", + "in": "header", "required": false, "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" } - } - } - } - } - } - }, - "/townlight_planning/snapshots/{snapshot_id}": { - "get": { - "tags": [ - "local-public-planning" - ], - "summary": "Public Document", - "operationId": "public_document_townlight_planning_snapshots__snapshot_id__get", - "parameters": [ - { - "name": "snapshot_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Snapshot Id" + ], + "title": "X-Townlight-Session" } } ], @@ -14076,34 +16379,42 @@ } } }, - "/townlight_planning/revisions/{revision_id}/documents/{document_id}": { - "get": { + "/desktop/v1/permitting/pathway": { + "post": { "tags": [ - "local-public-planning" + "native-permitting" ], - "summary": "Public Original", - "operationId": "public_original_townlight_planning_revisions__revision_id__documents__document_id__get", + "summary": "Pathway", + "description": "Cited likely permit pathway, attachments and timeline; informational only.\n\n``use_model_assistance`` does not exist here: the resident live-model\nassistance flag (F-07) stays excluded, so only the deterministic cited\npathway is reachable from the shared shell.", + "operationId": "pathway_desktop_v1_permitting_pathway_post", "parameters": [ { - "name": "revision_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Revision Id" - } - }, - { - "name": "document_id", - "in": "path", - "required": true, + "name": "X-Townlight-Session", + "in": "header", + "required": false, "schema": { - "type": "string", - "title": "Document Id" + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pathway" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -14126,13 +16437,13 @@ } } }, - "/desktop/v1/permitting/requirements": { + "/desktop/v1/permitting/connections/search": { "post": { "tags": [ "native-permitting" ], - "summary": "Import Requirements", - "operationId": "import_requirements_desktop_v1_permitting_requirements_post", + "summary": "Connections", + "operationId": "connections_desktop_v1_permitting_connections_search_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14156,7 +16467,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__permitting_bridge__Import" + "$ref": "#/components/schemas/townlight_runtime__permitting_bridge__Search" } } } @@ -14181,26 +16492,16 @@ } } } - }, - "get": { + } + }, + "/desktop/v1/inspections/repeat-cases": { + "post": { "tags": [ - "native-permitting" + "native-inspections" ], - "summary": "Requirements", - "operationId": "requirements_desktop_v1_permitting_requirements_get", + "summary": "Repeat Cases", + "operationId": "repeat_cases_desktop_v1_inspections_repeat_cases_post", "parameters": [ - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -14218,6 +16519,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RepeatLookup" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -14240,24 +16551,14 @@ } } }, - "/desktop/v1/permitting/requirements/{revision_id}": { - "get": { + "/desktop/v1/inspections/notice-draft": { + "post": { "tags": [ - "native-permitting" + "native-inspections" ], - "summary": "Requirement", - "operationId": "requirement_desktop_v1_permitting_requirements__revision_id__get", + "summary": "Notice", + "operationId": "notice_desktop_v1_inspections_notice_draft_post", "parameters": [ - { - "name": "revision_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Revision Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -14275,6 +16576,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InspectionInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -14297,13 +16608,13 @@ } } }, - "/desktop/v1/permitting/cases": { + "/desktop/v1/inspections/cases": { "get": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Cases", - "operationId": "cases_desktop_v1_permitting_cases_get", + "operationId": "cases_desktop_v1_inspections_cases_get", "parameters": [ { "name": "offset", @@ -14357,10 +16668,10 @@ }, "post": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Create Case", - "operationId": "create_case_desktop_v1_permitting_cases_post", + "operationId": "create_case_desktop_v1_inspections_cases_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14384,7 +16695,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/IntakeInput" + "$ref": "#/components/schemas/InspectionInput" } } } @@ -14411,13 +16722,13 @@ } } }, - "/desktop/v1/permitting/cases/{case_id}": { + "/desktop/v1/inspections/cases/{case_id}": { "get": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Case", - "operationId": "case_desktop_v1_permitting_cases__case_id__get", + "operationId": "case_desktop_v1_inspections_cases__case_id__get", "parameters": [ { "name": "case_id", @@ -14468,13 +16779,13 @@ } } }, - "/desktop/v1/permitting/cases/{case_id}/revisions": { + "/desktop/v1/inspections/cases/{case_id}/revisions": { "post": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Revise", - "operationId": "revise_desktop_v1_permitting_cases__case_id__revisions_post", + "operationId": "revise_desktop_v1_inspections_cases__case_id__revisions_post", "parameters": [ { "name": "case_id", @@ -14508,7 +16819,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/IntakeInput" + "$ref": "#/components/schemas/InspectionInput" } } } @@ -14535,13 +16846,13 @@ } } }, - "/desktop/v1/permitting/cases/{case_id}/history": { + "/desktop/v1/inspections/cases/{case_id}/history": { "get": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "History", - "operationId": "history_desktop_v1_permitting_cases__case_id__history_get", + "operationId": "history_desktop_v1_inspections_cases__case_id__history_get", "parameters": [ { "name": "case_id", @@ -14592,13 +16903,13 @@ } } }, - "/desktop/v1/permitting/cases/{case_id}/packets": { + "/desktop/v1/inspections/cases/{case_id}/packets": { "post": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Packet", - "operationId": "packet_desktop_v1_permitting_cases__case_id__packets_post", + "operationId": "packet_desktop_v1_inspections_cases__case_id__packets_post", "parameters": [ { "name": "case_id", @@ -14659,13 +16970,13 @@ } } }, - "/desktop/v1/permitting/packets/{packet_id}": { + "/desktop/v1/inspections/packets/{packet_id}": { "get": { "tags": [ - "native-permitting" + "native-inspections" ], "summary": "Document", - "operationId": "document_desktop_v1_permitting_packets__packet_id__get", + "operationId": "document_desktop_v1_inspections_packets__packet_id__get", "parameters": [ { "name": "packet_id", @@ -14716,14 +17027,61 @@ } } }, - "/desktop/v1/permitting/pathway": { + "/desktop/v1/inspections/evidence/supported-types": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "Supported Types", + "description": "The media types this deployment's product model actually accepts.", + "operationId": "supported_types_desktop_v1_inspections_evidence_supported_types_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" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/evidence/retain": { "post": { "tags": [ - "native-permitting" + "native-inspections" ], - "summary": "Pathway", - "description": "Cited likely permit pathway, attachments and timeline; informational only.\n\n``use_model_assistance`` does not exist here: the resident live-model\nassistance flag (F-07) stays excluded, so only the deterministic cited\npathway is reachable from the shared shell.", - "operationId": "pathway_desktop_v1_permitting_pathway_post", + "summary": "Retain", + "operationId": "retain_desktop_v1_inspections_evidence_retain_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14747,7 +17105,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Pathway" + "$ref": "#/components/schemas/EvidenceItems" } } } @@ -14774,13 +17132,14 @@ } } }, - "/desktop/v1/permitting/connections/search": { + "/desktop/v1/inspections/media/analyse": { "post": { "tags": [ - "native-permitting" + "native-inspections" ], - "summary": "Connections", - "operationId": "connections_desktop_v1_permitting_connections_search_post", + "summary": "Media Analyse", + "description": "Run the configured adapters over retained originals; draft only.\n\nThe result carries the same observations/citations the product route returns\nplus ``analysis_record``: the exact ``AnalysisRecord`` the caller puts on its\ncase payload, so the reviewed draft is the analysed one.", + "operationId": "media_analyse_desktop_v1_inspections_media_analyse_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14804,7 +17163,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/townlight_runtime__permitting_bridge__Search" + "$ref": "#/components/schemas/MediaAnalysis" } } } @@ -14831,13 +17190,13 @@ } } }, - "/desktop/v1/inspections/repeat-cases": { + "/desktop/v1/inspections/connections/search": { "post": { "tags": [ "native-inspections" ], - "summary": "Repeat Cases", - "operationId": "repeat_cases_desktop_v1_inspections_repeat_cases_post", + "summary": "Connections", + "operationId": "connections_desktop_v1_inspections_connections_search_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14861,11 +17220,58 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RepeatLookup" + "$ref": "#/components/schemas/townlight_runtime__inspections_bridge__Search" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } - }, + } + } + }, + "/desktop/v1/municipal-staff/boards": { + "get": { + "tags": [ + "native-municipal-staff" + ], + "summary": "List Boards", + "operationId": "list_boards_desktop_v1_municipal_staff_boards_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", @@ -14886,15 +17292,13 @@ } } } - } - }, - "/desktop/v1/inspections/notice-draft": { + }, "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Notice", - "operationId": "notice_desktop_v1_inspections_notice_draft_post", + "summary": "Create Board", + "operationId": "create_board_desktop_v1_municipal_staff_boards_post", "parameters": [ { "name": "X-Townlight-Session", @@ -14918,13 +17322,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InspectionInput" + "$ref": "#/components/schemas/BoardInput" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -14945,26 +17349,14 @@ } } }, - "/desktop/v1/inspections/cases": { - "get": { + "/desktop/v1/municipal-staff/boards/seat": { + "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Cases", - "operationId": "cases_desktop_v1_inspections_cases_get", + "summary": "Save Seat", + "operationId": "save_seat_desktop_v1_municipal_staff_boards_seat_post", "parameters": [ - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100000, - "minimum": 0, - "default": 0, - "title": "Offset" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -14982,6 +17374,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SeatInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -15002,13 +17404,15 @@ } } } - }, + } + }, + "/desktop/v1/municipal-staff/boards/attendance": { "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Create Case", - "operationId": "create_case_desktop_v1_inspections_cases_post", + "summary": "Save Attendance", + "operationId": "save_attendance_desktop_v1_municipal_staff_boards_attendance_post", "parameters": [ { "name": "X-Townlight-Session", @@ -15032,7 +17436,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InspectionInput" + "$ref": "#/components/schemas/AttendanceInput" } } } @@ -15059,24 +17463,14 @@ } } }, - "/desktop/v1/inspections/cases/{case_id}": { + "/desktop/v1/municipal-staff/contracts": { "get": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Case", - "operationId": "case_desktop_v1_inspections_cases__case_id__get", + "summary": "List Contracts", + "operationId": "list_contracts_desktop_v1_municipal_staff_contracts_get", "parameters": [ - { - "name": "case_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Case Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -15114,26 +17508,14 @@ } } } - } - }, - "/desktop/v1/inspections/cases/{case_id}/revisions": { + }, "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Revise", - "operationId": "revise_desktop_v1_inspections_cases__case_id__revisions_post", + "summary": "Register Contract", + "operationId": "register_contract_desktop_v1_municipal_staff_contracts_post", "parameters": [ - { - "name": "case_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Case Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -15156,13 +17538,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InspectionInput" + "$ref": "#/components/schemas/SignedAgreement" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -15183,22 +17565,22 @@ } } }, - "/desktop/v1/inspections/cases/{case_id}/history": { - "get": { + "/desktop/v1/municipal-staff/contracts/{identity}/signed": { + "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "History", - "operationId": "history_desktop_v1_inspections_cases__case_id__history_get", + "summary": "Record Signed", + "operationId": "record_signed_desktop_v1_municipal_staff_contracts__identity__signed_post", "parameters": [ { - "name": "case_id", + "name": "identity", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Case Id" + "title": "Identity" } }, { @@ -15218,6 +17600,16 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SignedAgreement" + } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -15240,22 +17632,22 @@ } } }, - "/desktop/v1/inspections/cases/{case_id}/packets": { - "post": { + "/desktop/v1/municipal-staff/contracts/{identity}/document": { + "get": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Packet", - "operationId": "packet_desktop_v1_inspections_cases__case_id__packets_post", + "summary": "Retrieve Contract", + "operationId": "retrieve_contract_desktop_v1_municipal_staff_contracts__identity__document_get", "parameters": [ { - "name": "case_id", + "name": "identity", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Case Id" + "title": "Identity" } }, { @@ -15275,16 +17667,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Packet" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -15307,24 +17689,14 @@ } } }, - "/desktop/v1/inspections/packets/{packet_id}": { + "/desktop/v1/municipal-staff/procurement": { "get": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Document", - "operationId": "document_desktop_v1_inspections_packets__packet_id__get", + "summary": "List Procurement", + "operationId": "list_procurement_desktop_v1_municipal_staff_procurement_get", "parameters": [ - { - "name": "packet_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Packet Id" - } - }, { "name": "X-Townlight-Session", "in": "header", @@ -15362,16 +17734,13 @@ } } } - } - }, - "/desktop/v1/inspections/evidence/supported-types": { - "get": { + }, + "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Supported Types", - "description": "The media types this deployment's product model actually accepts.", - "operationId": "supported_types_desktop_v1_inspections_evidence_supported_types_get", + "summary": "Save Rfp", + "operationId": "save_rfp_desktop_v1_municipal_staff_procurement_post", "parameters": [ { "name": "X-Townlight-Session", @@ -15390,8 +17759,18 @@ } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RfpInput" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -15412,14 +17791,24 @@ } } }, - "/desktop/v1/inspections/evidence/retain": { + "/desktop/v1/municipal-staff/procurement/{identity}/proposal": { "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Retain", - "operationId": "retain_desktop_v1_inspections_evidence_retain_post", + "summary": "Save Proposal", + "operationId": "save_proposal_desktop_v1_municipal_staff_procurement__identity__proposal_post", "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -15442,13 +17831,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/EvidenceItems" + "$ref": "#/components/schemas/ProposalInput" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -15469,15 +17858,24 @@ } } }, - "/desktop/v1/inspections/media/analyse": { + "/desktop/v1/municipal-staff/procurement/{identity}/award": { "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Media Analyse", - "description": "Run the configured adapters over retained originals; draft only.\n\nThe result carries the same observations/citations the product route returns\nplus ``analysis_record``: the exact ``AnalysisRecord`` the caller puts on its\ncase payload, so the reviewed draft is the analysed one.", - "operationId": "media_analyse_desktop_v1_inspections_media_analyse_post", + "summary": "Record Award", + "operationId": "record_award_desktop_v1_municipal_staff_procurement__identity__award_post", "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -15500,13 +17898,13 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MediaAnalysis" + "$ref": "#/components/schemas/AwardInput" } } } }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { @@ -15527,14 +17925,24 @@ } } }, - "/desktop/v1/inspections/connections/search": { + "/desktop/v1/municipal-staff/procurement/{identity}/contract": { "post": { "tags": [ - "native-inspections" + "native-municipal-staff" ], - "summary": "Connections", - "operationId": "connections_desktop_v1_inspections_connections_search_post", + "summary": "Create Draft Contract", + "operationId": "create_draft_contract_desktop_v1_municipal_staff_procurement__identity__contract_post", "parameters": [ + { + "name": "identity", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Identity" + } + }, { "name": "X-Townlight-Session", "in": "header", @@ -15552,16 +17960,6 @@ } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/townlight_runtime__inspections_bridge__Search" - } - } - } - }, "responses": { "200": { "description": "Successful Response", @@ -16155,6 +18553,32 @@ ], "title": "AttachReleaseCopy" }, + "AttendanceInput": { + "properties": { + "seat_id": { + "type": "string", + "format": "uuid", + "title": "Seat Id" + }, + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "present": { + "type": "boolean", + "title": "Present" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "seat_id", + "meeting_id", + "present" + ], + "title": "AttendanceInput" + }, "AuditChainVerification": { "properties": { "is_valid": { @@ -16304,6 +18728,35 @@ ], "title": "AuditView" }, + "AwardInput": { + "properties": { + "proposal_id": { + "type": "string", + "format": "uuid", + "title": "Proposal Id" + }, + "decision_reference": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Decision Reference" + }, + "decision_note": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "Decision Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "proposal_id", + "decision_reference", + "decision_note" + ], + "title": "AwardInput" + }, "BearerResponse": { "properties": { "access_token": { @@ -16317,10 +18770,33 @@ }, "type": "object", "required": [ - "access_token", - "token_type" + "access_token", + "token_type" + ], + "title": "BearerResponse" + }, + "BoardInput": { + "properties": { + "board_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Board Name" + }, + "liaison": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Liaison" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "board_name", + "liaison" ], - "title": "BearerResponse" + "title": "BoardInput" }, "Body_auth_jwt_login_auth_jwt_login_post": { "properties": { @@ -17527,7 +20003,7 @@ "last_ingestion_at" ], "title": "DataSourceRead", - "description": "Redacted datasource shape \u2014 safe for non-admin roles. connection_config omitted." + "description": "Redacted datasource shape — safe for non-admin roles. connection_config omitted." }, "DataSourceUpdate": { "properties": { @@ -19498,6 +21974,21 @@ "type": "object", "title": "HTTPValidationError" }, + "Handoff": { + "properties": { + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "request_id" + ], + "title": "Handoff" + }, "ImportBundleCreate": { "properties": { "job_id": { @@ -19569,6 +22060,157 @@ "title": "ImportBundleCreate", "description": "Request body for local fixture/file-drop import jobs." }, + "ImportCommitInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" + }, + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" + }, + "content_base64": { + "type": "string", + "maxLength": 22369624, + "minLength": 1, + "title": "Content Base64" + }, + "external_id": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "External Id" + }, + "expected_sha256": { + "type": "string", + "pattern": "^[a-f0-9]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector", + "source_url", + "input_format", + "content_base64", + "external_id", + "expected_sha256" + ], + "title": "ImportCommitInput" + }, + "ImportLinkInput": { + "properties": { + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "meeting_id" + ], + "title": "ImportLinkInput" + }, + "ImportLinkSearch": { + "properties": { + "target_query": { + "type": "string", + "maxLength": 255, + "title": "Target Query", + "default": "" + }, + "meeting_query": { + "type": "string", + "maxLength": 255, + "title": "Meeting Query", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ImportLinkSearch" + }, + "ImportPreviewInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" + }, + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" + }, + "content_base64": { + "type": "string", + "maxLength": 22369624, + "minLength": 1, + "title": "Content Base64" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector", + "source_url", + "input_format", + "content_base64" + ], + "title": "ImportPreviewInput" + }, + "ImportSourceInput": { + "properties": { + "connector": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Connector" + }, + "source_url": { + "type": "string", + "maxLength": 2048, + "minLength": 1, + "title": "Source Url" + }, + "input_format": { + "type": "string", + "maxLength": 60, + "minLength": 1, + "title": "Input Format" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "connector", + "source_url", + "input_format" + ], + "title": "ImportSourceInput" + }, "InclusionStatus": { "type": "string", "enum": [ @@ -21301,6 +23943,56 @@ ], "title": "NoticeDocumentInput" }, + "NoticeDraft": { + "properties": { + "title": { + "type": "string", + "maxLength": 500, + "minLength": 1, + "title": "Title" + }, + "body": { + "type": "string", + "maxLength": 100000, + "minLength": 1, + "title": "Body" + }, + "notice_type": { + "type": "string", + "maxLength": 160, + "minLength": 1, + "title": "Notice Type" + }, + "statutory_basis": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Statutory Basis" + }, + "event_date": { + "type": "string", + "format": "date", + "title": "Event Date" + }, + "lead_days": { + "type": "integer", + "maximum": 365.0, + "minimum": 0.0, + "title": "Lead Days" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "body", + "notice_type", + "statutory_basis", + "event_date", + "lead_days" + ], + "title": "NoticeDraft" + }, "NoticeInput": { "properties": { "notice_type": { @@ -22039,7 +24731,7 @@ "mode" ], "title": "PortalModeResponse", - "description": "T5D \u2014 schema for ``GET /config/portal-mode``.\n\nExposed to the frontend on boot so it can branch routing without a\nuser-identity lookup. The payload is intentionally the single field\nbelow \u2014 no staff config, no user state, no schema version." + "description": "T5D — schema for ``GET /config/portal-mode``.\n\nExposed to the frontend on boot so it can branch routing without a\nuser-identity lookup. The payload is intentionally the single field\nbelow — no staff config, no user state, no schema version." }, "PrepareArtifact": { "properties": { @@ -22059,6 +24751,49 @@ ], "title": "PrepareArtifact" }, + "Proof": { + "properties": { + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" + }, + "filename": { + "type": "string", + "maxLength": 150, + "minLength": 1, + "title": "Filename" + }, + "content_base64": { + "type": "string", + "maxLength": 7000000, + "minLength": 1, + "title": "Content Base64" + }, + "location": { + "type": "string", + "maxLength": 2000, + "minLength": 1, + "title": "Location" + }, + "published_at": { + "type": "string", + "maxLength": 80, + "minLength": 1, + "title": "Published At" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sequence", + "filename", + "content_base64", + "location", + "published_at" + ], + "title": "Proof" + }, "Proposal": { "properties": { "id": { @@ -22131,6 +24866,42 @@ ], "title": "Proposal" }, + "ProposalInput": { + "properties": { + "vendor_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Vendor Name" + }, + "summary": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "Summary" + }, + "staff_score": { + "type": "integer", + "maximum": 100.0, + "minimum": 0.0, + "title": "Staff Score" + }, + "staff_exceptions": { + "type": "string", + "maxLength": 8000, + "title": "Staff Exceptions", + "default": "" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "vendor_name", + "summary", + "staff_score" + ], + "title": "ProposalInput" + }, "PublicExplore": { "properties": { "goal": { @@ -22581,6 +25352,27 @@ ], "title": "RecordsDocumentView" }, + "RecordsImportDocument": { + "properties": { + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "document_index": { + "type": "integer", + "minimum": 0.0, + "title": "Document Index" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "request_id", + "document_index" + ], + "title": "RecordsImportDocument" + }, "RecordsOperationRead": { "properties": { "action": { @@ -23763,37 +26555,7 @@ } }, "type": "object", - "title": "ResponseLetterUpdate" - }, - "Review": { - "properties": { - "answer": { - "type": "string", - "maxLength": 10000, - "title": "Answer", - "default": "" - }, - "notes": { - "type": "string", - "maxLength": 10000, - "title": "Notes", - "default": "" - }, - "queue_status": { - "type": "string", - "enum": [ - "open", - "in_review", - "resolved", - "closed" - ], - "title": "Queue Status", - "default": "resolved" - } - }, - "additionalProperties": false, - "type": "object", - "title": "Review" + "title": "ResponseLetterUpdate" }, "ReviewInput": { "properties": { @@ -23825,6 +26587,25 @@ "type": "object", "title": "ReviewInput" }, + "Revision": { + "properties": { + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" + }, + "document": { + "$ref": "#/components/schemas/NoticeDraft" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sequence", + "document" + ], + "title": "Revision" + }, "RewriteInput": { "properties": { "action": { @@ -23920,6 +26701,36 @@ ], "title": "RewriteResult" }, + "RfpInput": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "procurement_type": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Procurement Type" + }, + "city_need": { + "type": "string", + "maxLength": 8000, + "minLength": 1, + "title": "City Need" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "procurement_type", + "city_need" + ], + "title": "RfpInput" + }, "Rule": { "properties": { "jurisdiction": { @@ -24571,6 +27382,65 @@ ], "title": "SearchSessionRead" }, + "SeatInput": { + "properties": { + "board_id": { + "type": "string", + "format": "uuid", + "title": "Board Id" + }, + "seat_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Seat Name" + }, + "member_name": { + "anyOf": [ + { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Member Name" + }, + "term_start": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Term Start" + }, + "term_end": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Term End" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "board_id", + "seat_name" + ], + "title": "SeatInput" + }, "SectionCreate": { "properties": { "section_id": { @@ -24771,27 +27641,6 @@ "title": "SectionVersionCreate", "description": "Request body for adding an immutable section version." }, - "Selection": { - "properties": { - "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": [ - "recording_id", - "expected_sha256" - ], - "title": "Selection" - }, "SentenceInput": { "properties": { "text": { @@ -24875,7 +27724,7 @@ "api_key" ], "title": "ServiceAccountCreated", - "description": "Returned only on creation \u2014 includes the plaintext API key (shown once)." + "description": "Returned only on creation — includes the plaintext API key (shown once)." }, "ServiceAccountRead": { "properties": { @@ -24944,6 +27793,69 @@ "type": "object", "title": "ServiceAccountUpdate" }, + "SignedAgreement": { + "properties": { + "title": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Title" + }, + "vendor_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Vendor Name" + }, + "owner": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Owner" + }, + "start_date": { + "type": "string", + "format": "date", + "title": "Start Date" + }, + "expiration_date": { + "type": "string", + "format": "date", + "title": "Expiration Date" + }, + "renewal_due": { + "type": "string", + "format": "date", + "title": "Renewal Due" + }, + "document_name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Document Name" + }, + "document_content": { + "type": "string", + "maxLength": 8388608, + "format": "base64", + "contentMediaType": "application/octet-stream", + "title": "Document Content" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title", + "vendor_name", + "owner", + "start_date", + "expiration_date", + "renewal_due", + "document_name", + "document_content" + ], + "title": "SignedAgreement" + }, "Snapshot": { "properties": { "expected_revision": { @@ -26142,6 +29054,21 @@ ], "title": "ValidationError" }, + "Version": { + "properties": { + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sequence" + ], + "title": "Version" + }, "VoteCorrection": { "properties": { "vote": { @@ -26266,6 +29193,27 @@ ], "title": "SourceLink" }, + "townlight_records__desktop_bridge__station__Selection": { + "properties": { + "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": [ + "recording_id", + "expected_sha256" + ], + "title": "Selection" + }, "townlight_runtime__inspections_bridge__Search": { "properties": { "provider": { @@ -26288,6 +29236,28 @@ ], "title": "Search" }, + "townlight_runtime__notice_bridge__Review": { + "properties": { + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" + }, + "note": { + "type": "string", + "maxLength": 5000, + "minLength": 1, + "title": "Note" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "sequence", + "note" + ], + "title": "Review" + }, "townlight_runtime__permitting_bridge__Import": { "properties": { "bundle": { @@ -26393,6 +29363,95 @@ "query" ], "title": "Search" + }, + "townlight_runtime__portal_publication__Selection": { + "properties": { + "action": { + "type": "string", + "enum": [ + "publish", + "withdraw" + ], + "title": "Action" + }, + "approve_publication": { + "type": "boolean", + "title": "Approve Publication" + }, + "archive_id": { + "type": "string", + "format": "uuid", + "title": "Archive Id" + }, + "meeting_id": { + "type": "string", + "format": "uuid", + "title": "Meeting Id" + }, + "recording_id": { + "type": "string", + "format": "uuid", + "title": "Recording Id" + }, + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "release_copy_id": { + "type": "string", + "format": "uuid", + "title": "Release Copy Id" + }, + "expected_release_sha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "title": "Expected Release Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "action", + "approve_publication", + "archive_id", + "meeting_id", + "recording_id", + "request_id", + "release_copy_id", + "expected_release_sha256" + ], + "title": "Selection" + }, + "townlight_runtime__zoning_bridge__Review": { + "properties": { + "answer": { + "type": "string", + "maxLength": 10000, + "title": "Answer", + "default": "" + }, + "notes": { + "type": "string", + "maxLength": 10000, + "title": "Notes", + "default": "" + }, + "queue_status": { + "type": "string", + "enum": [ + "open", + "in_review", + "resolved", + "closed" + ], + "title": "Queue Status", + "default": "resolved" + } + }, + "additionalProperties": false, + "type": "object", + "title": "Review" } }, "securitySchemes": { @@ -26406,5 +29465,7 @@ } } } - } -} \ No newline at end of file + }, + "x-townlight-source-commit": "0afd59de52cb7ecb317188a89bcd1fec8c578a24", + "x-townlight-health-version-discrepancy": "Distribution Runtime 0.3.1 and Meetings 1.0.6; health strings Runtime 0.3.0 and Meetings 1.0.5 in the accepted MSI." +} diff --git a/docs/beta-1/reference/index.html b/docs/beta-1/reference/index.html index 1e485ae..65535a3 100644 --- a/docs/beta-1/reference/index.html +++ b/docs/beta-1/reference/index.html @@ -1 +1 @@ -Townlight candidate technical reference
Townlight

Windows beta technical reference

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1. 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 +Townlight candidate technical reference
Townlight

Windows beta technical reference

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

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
Townlight BoardsAPI referenceStaff guide
Townlight ContractsAPI referenceStaff guide
Townlight ProcurementAPI referenceStaff guide

The corresponding source archive and its repository pins identify the released Windows build. The source inventory for this release lists the files in the pinned build sources. 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.

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

\ No newline at end of file diff --git a/docs/beta-1/reference/mcp.html b/docs/beta-1/reference/mcp.html index a41be0e..576bc89 100644 --- a/docs/beta-1/reference/mcp.html +++ b/docs/beta-1/reference/mcp.html @@ -1,14 +1,14 @@ MCP and Transcription Source Reference | Townlight Beta 1
townlightTownlight Beta 1
-

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

Townlight Beta 1

MCP +header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
TownlightTownlight Beta 1
+

Historical MCP reference for Windows 1.6.0.1. For Windows 1.8.1.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 44f620e..3057efe 100644 --- a/docs/beta-1/reference/native.html +++ b/docs/beta-1/reference/native.html @@ -1,14 +1,14 @@ Native IPC Contracts | Townlight Beta 1
townlightTownlight Beta 1
-

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

Townlight Beta 1

Native +header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
TownlightTownlight Beta 1
+

Historical Native commands reference for Windows 1.6.0.1. For Windows 1.8.1.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 -}
+}

Windows staff workspaces

municipal_staff_request invokes the local /desktop/v1/municipal-staff/ routes for Boards, Contracts, and Procurement with the signed-in staff proof. Boards uses the Meetings permission. The award and draft-contract operations require the local administrator. See the workflow guide and exact native operation mapping.

\ No newline at end of file diff --git a/docs/beta-1/reference/portal-verification.html b/docs/beta-1/reference/portal-verification.html index ccea3c4..c174706 100644 --- a/docs/beta-1/reference/portal-verification.html +++ b/docs/beta-1/reference/portal-verification.html @@ -1,14 +1,14 @@ Townlight Portal Verification | Townlight Beta 1
townlightTownlight Beta 1
+header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
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

+evidence.

\ No newline at end of file diff --git a/docs/beta-1/reference/runtime-payload-lock.json b/docs/beta-1/reference/runtime-payload-lock.json index 7b1ff22..ae6cd7d 100644 --- a/docs/beta-1/reference/runtime-payload-lock.json +++ b/docs/beta-1/reference/runtime-payload-lock.json @@ -2,162 +2,17 @@ "schema_version": 1, "profile": "windows-local-1.0", "product_profile": "inspections-preview", - "private_candidate": { - "kind": "private-working-tree-candidate", - "publication_allowed": false, - "wheels": [ - { - "name": "townlight_inspections-0.3.0+dev.1-py3-none-any.whl", - "sha256": "cf48a2a7efd4ee5f4fe1d2ee91314733be259af7c3dcd3cddeffba1247c2558d" - }, - { - "name": "townlight_permitting-0.3.0+dev.1-py3-none-any.whl", - "sha256": "306d09973488d9c3343ee291a9b6a1a11c95fafb2dc25cbddd6eb6736b4be903" - }, - { - "name": "townlight_planning-0.4.0.dev1-py3-none-any.whl", - "sha256": "4090e4c9fa80a976f0838ab8c98deefb2bd278598ca79bec634bb71bbbfb66f4" - }, - { - "name": "townlight_records-1.8.0.dev1-py3-none-any.whl", - "sha256": "6015e6905d9bd6f817fe7e31a3e7a66d9fda332648e7590e757432c86df44e93" - }, - { - "name": "townlight_runtime-0.1.0-py3-none-any.whl", - "sha256": "9e069be6f1683871c262ce3010c84157f9f4a1f797b9c967bbb772286e6c7c1e" - }, - { - "name": "townlight_zoning-0.2.2-py3-none-any.whl", - "sha256": "e6c3af637ce7e00d1e7cbaaf5fe2259d243eb003fb1540903e5c3f6f6ec865f4" - }, - { - "name": "townlight_station-0.3.0-py3-none-any.whl", - "sha256": "13350c0e7f86658989d9fc5005cc80de4e6727a090a68feedf8f5fcb61c43435" - }, - { - "name": "pywin32-312-cp313-cp313-win_amd64.whl", - "sha256": "c53e878d15a1c44788082bfe712a905433473aa38f86375b7cf8b45e3acbaaf9" - } - ], - "core_wheel_sha256": "f905d4f40477d8299b8d72161e94263eeb54f561f6647bc5b6b040ef539c14e6", - "station_pinned_files_verified": 730, - "native_signing": { - "workflow_run": "40839675353", - "intake_sha256": "19f81d989ebfb9d722396b625a9f8537c8d56ccf6ad7457c2064d4c2e7d3f20d", - "receipt_sha256": "b0a3aeefa5c8e351d9cdd4cdec34acf4d4198f973b4660904101a9eda410c527", - "verified_unique_files": 636 - }, - "pywin32_signing": { - "workflow_run": "40904472171", - "intake_sha256": "060a7d983d14b9e9f3b6f469cc46ab25e7d50c5f0256d240288bdc7a715895c0", - "receipt_sha256": "f66f423c3bf72e25b1547580ccfe958e0712ccaab1ec859e2f27a2eb66af4c7c", - "verified_unique_files": 57 - }, - "beta_corrections": { - "scope": "B1-B5 only", - "publication_allowed": false, - "wheels": [ - { - "name": "townlight_access-0.4.0-py3-none-any.whl", - "sha256": "62a8518c418e9cd0c96a5901a0ce715e81b4769ca7d1e356cccc005e3ded92cb" - }, - { - "name": "townlight_meetings-1.0.4-py3-none-any.whl", - "sha256": "9fc95292ab3e6d798c1c3832e5179ccdddcb79b910b184d05894ce0ff62cbca5" - }, - { - "name": "townlight_code-1.0.8-py3-none-any.whl", - "sha256": "fa2af4d1a456f2ed4377b422030de3f93ed0bd393bbe2ec5c334217ef56f287a" - }, - { - "name": "townlight_inspections-0.3.0+dev.1-py3-none-any.whl", - "sha256": "c5fc1cbea4b2a98c5ab2b5b967b7c6f51f54e6a2c962e0f1da104905cd022d6d" - }, - { - "name": "townlight_notice-0.2.0-py3-none-any.whl", - "sha256": "7406bad6529f29c839d14998c5fed0519b60873cec7116fe260d1cbb2210d412" - }, - { - "name": "townlight_permitting-0.3.0+dev.1-py3-none-any.whl", - "sha256": "3c629ed12b5195d937ccff5b72fe02c6f0993a129e208de9599bdbd45d44a994" - }, - { - "name": "townlight_planning-0.4.0.dev1-py3-none-any.whl", - "sha256": "bdcb7b695bb0df442c6efae1b89218174583f73ecadd0a816914934dd951cbb0" - }, - { - "name": "townlight_runtime-0.1.0-py3-none-any.whl", - "sha256": "4b917583fa236a080fb6789a2d69b14805d5398bba6fa6456fc15960b8748907" - }, - { - "name": "townlight_zoning-0.2.2-py3-none-any.whl", - "sha256": "4b08068ce55d5c85ab712778fd425d68af31bcc449b014e67b6c84b01a0403e8" - }, - { - "name": "townlight_inspection_transcriber-0.1.19-py3-none-any.whl", - "sha256": "eaca37bea7bfb758cb43cdc2fe4e156f2ff1fa89b5e9def867a7c0dd526a07cd" - } - ], - "binary_signing": { - "intake_sha256": "8d06c2b7a97fc38622c52c3b609b308980323b1328a650285a50e9455bade101", - "workflow_run": "40949427399", - "files": [ - { - "name": "154ccbc850cba4468634a7481e0f8d30c709a0f0b45a91a4306e9f5c97e3c2e1.exe", - "sha256": "4e4cb4994ac2e67b89e341f6bba5f937c500b010ef0c09168badeab93f2233fc", - "bytes": 16227600, - "status": "Valid", - "publisher": "CN=Scott Converse, O=Scott Converse, L=Longmont, S=co, C=US", - "timestamp": "CN=Microsoft Public RSA Time Stamping Authority, OU=nShield TSS ESN:A500-05E0-D947, OU=Microsoft America Operations, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" - }, - { - "name": "e8863ca0c06a47d406777077f1ba728b58e57d77fedff252dbe6827d588acc8c.exe", - "sha256": "298d76c6ae944611369b3f04e5873b03f69f0d1d8d62c1363a535331d5efc76a", - "bytes": 1578768, - "status": "Valid", - "publisher": "CN=Scott Converse, O=Scott Converse, L=Longmont, S=co, C=US", - "timestamp": "CN=Microsoft Public RSA Time Stamping Authority, OU=nShield TSS ESN:A500-05E0-D947, OU=Microsoft America Operations, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" - } - ] - }, - "helper_signing": { - "files": [ - { - "name": "84a563e2201677958fff8d0dde7236ad2a464cdc9e09e3353e3bb2227d63eb19.exe", - "sha256": "63cad4d60c36f8f80133e6218040c452a1c3eac8a7e3508d16b9c16eedbfb28d", - "bytes": 123992, - "status": "Valid", - "publisher": "CN=Scott Converse, O=Scott Converse, L=Longmont, S=co, C=US", - "timestamp": "CN=Microsoft Public RSA Time Stamping Authority, OU=nShield TSS ESN:7A00-05E0-D947, OU=Microsoft America Operations, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" - }, - { - "name": "640f8583b4650062a10854178f0861f670e93882046586ec1fcb7232866365fd.exe", - "sha256": "0b157cc96ad4552c7701bb4bcf620b5a3f9f6923cf4782997ff3234899716a4c", - "bytes": 123984, - "status": "Valid", - "publisher": "CN=Scott Converse, O=Scott Converse, L=Longmont, S=co, C=US", - "timestamp": "CN=Microsoft Public RSA Time Stamping Authority, OU=nShield TSS ESN:7D00-05E0-D947, OU=Microsoft America Operations, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" - } - ], - "intake_sha256": "2ecb2df54e4e0c24c35ebb53834e643c1e327192e7b55399b912a137143dcab5", - "workflow_run": "40952467161" - } - } - }, "payloads": [ { "id": "postgres-17-pgvector", + "label": "Portable PostgreSQL 17 with pgvector", "source_dir": "postgres", + "status": "present", "required_files": [ { - "path": "bin/initdb.exe", - "size_bytes": 260368, - "sha256": "7d1a5d5972b93e8c9d7c1f16f545fa6c352cd86de249a71933657a3fbdabd0fe" - }, - { - "path": "bin/msvcp140.dll", - "size_bytes": 643512, - "sha256": "7c26614e1d733892c2deac7e245ce115504b1d80592dd0a01b08e3e5a55f89ca" + "path": "bin/pg_ctl.exe", + "size_bytes": 147728, + "sha256": "6650f51db462669dcad93437399d00c02f6e8c9f0044ef88f45eb982f77d5006" }, { "path": "bin/pg_controldata.exe", @@ -165,15 +20,20 @@ "sha256": "b2f67d86eb198cb81d83f65e255aedf3f2486281fb98efdfb872c7969237dbdf" }, { - "path": "bin/pg_ctl.exe", - "size_bytes": 147728, - "sha256": "6650f51db462669dcad93437399d00c02f6e8c9f0044ef88f45eb982f77d5006" + "path": "bin/initdb.exe", + "size_bytes": 260368, + "sha256": "7d1a5d5972b93e8c9d7c1f16f545fa6c352cd86de249a71933657a3fbdabd0fe" }, { "path": "bin/postgres.exe", "size_bytes": 9934096, "sha256": "f3a31d1132b219c1f61a1fedbc10b1f765b2c0a7e0d53b69f5d4c8834b4b902a" }, + { + "path": "bin/zlib1.dll", + "size_bytes": 153360, + "sha256": "69a28bf8937890e33bc6f3641893be2e6920bfd170380593a64e9ad59822f2c6" + }, { "path": "bin/vcruntime140.dll", "size_bytes": 178616, @@ -185,14 +45,14 @@ "sha256": "a7146c08f89fe5b04541ab507cdb59ff7b44534d4ba3c668a426c6450a03434e" }, { - "path": "bin/zlib1.dll", - "size_bytes": 153360, - "sha256": "69a28bf8937890e33bc6f3641893be2e6920bfd170380593a64e9ad59822f2c6" + "path": "bin/msvcp140.dll", + "size_bytes": 643512, + "sha256": "7c26614e1d733892c2deac7e245ce115504b1d80592dd0a01b08e3e5a55f89ca" }, { - "path": "lib/postgis-3.dll", - "size_bytes": 1793808, - "sha256": "70aa933675ad1e28d45938f32b8a46e1b9cb881f0aac894bd4af26b250851763" + "path": "share/extension/vector.control", + "size_bytes": 149, + "sha256": "52c583fb0c22c616b21762c7b9d3079c02655b78b96d5689cd1e64449b9a575e" }, { "path": "lib/vector.dll", @@ -205,296 +65,263 @@ "sha256": "2802c2bb571cf648daafb834a452a7dc884ef359116a1b17ab4c4acd6155e699" }, { - "path": "share/extension/vector.control", - "size_bytes": 149, - "sha256": "52c583fb0c22c616b21762c7b9d3079c02655b78b96d5689cd1e64449b9a575e" + "path": "lib/postgis-3.dll", + "size_bytes": 1793808, + "sha256": "70aa933675ad1e28d45938f32b8a46e1b9cb881f0aac894bd4af26b250851763" } ] }, { "id": "cpython-services", + "label": "Bundled CPython city services", "source_dir": "python", + "status": "present", "required_files": [ { - "path": "Lib/site-packages/app/auth/native_identity.py", - "size_bytes": 2123, - "sha256": "3d2536b13f38c52d93c4ab54887bf232a3b9181fe1b485165e1fd6a81fe687d0" + "path": "python.exe", + "size_bytes": 105816, + "sha256": "5341746f92483a93e44c313de830f2fba2956f0759094404a16b2fed06c9a2ed" }, { - "path": "Lib/site-packages/app/desktop_bridge/router.py", - "size_bytes": 32876, - "sha256": "7c02e0a222c36aecb84b105a918309a811f40249c3f55756d87cfa2646c4ef1b" + "path": "Lib/site-packages/townlight_core/__init__.py", + "size_bytes": 10845, + "sha256": "271ec6a8d23264747891f8909e8ed1986cb8b2d56098bcaf59e3550b1978e9c4" }, { - "path": "Lib/site-packages/app/main.py", - "size_bytes": 11141, - "sha256": "abb959c23054e8fdd12fb4918ea6c1149ef3cc7b1fee268697baf36f07af9fc2" + "path": "Lib/site-packages/townlight_core/migrations/alembic.ini", + "size_bytes": 87, + "sha256": "9f91262372d5cf06551f80272b10a44c197be3ef3e7dcda228271d6346c4eee6" }, { - "path": "Lib/site-packages/app/requests/artifacts.py", - "size_bytes": 11715, - "sha256": "e557ecc8cfd265bfcb76b4b06de38fcaf6eb75ed3dbba6d21fe65f481bbbf8a1" + "path": "Lib/site-packages/townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py", + "size_bytes": 1909, + "sha256": "bc3d01f5e198904380fcc835b108a098ef9ba26f507c7d575219772adf5ab76f" }, { - "path": "Lib/site-packages/app/requests/meeting_sources.py", - "size_bytes": 2509, - "sha256": "5694a2e0b345cf684261ef54cc205e5ec1aaeb0125c2c77c0c4a1cf2899feb79" + "path": "Lib/site-packages/townlight_records/main.py", + "size_bytes": 11505, + "sha256": "9daff4d0c0375eefedc6f111e83215c206d0379115eae306b80ad4862db08c3f" }, { - "path": "Lib/site-packages/app/requests/planning_sources.py", - "size_bytes": 1849, - "sha256": "b62831d83e129a974bec04ee10fd71cfd15c8940f5c5c4dd11794b8f51cbd8d8" + "path": "Lib/site-packages/townlight_notice/main.py", + "size_bytes": 23999, + "sha256": "5074a5d9d80332f672401cfa37035d13ec4e5b9707b155ea154d1a689404c920" }, { "path": "Lib/site-packages/townlight_access/main.py", - "size_bytes": 17450, - "sha256": "379d3c880dd949db3325fa055b8822cf5f59a20b8d7c4da3a84a8f12989134ab" + "size_bytes": 18671, + "sha256": "0eb87c6acb2c97e6c43f928a457bb226a826d807a8bc3c5afc347bf88c8daf8e" }, { - "path": "Lib/site-packages/townlight_meetings/desktop_delivery.py", - "size_bytes": 5096, - "sha256": "cbb7f44aee90b9ea16c60c1f64efffa8bb7204765d49a5ce80fe52e2670d384e" - }, - { - "path": "Lib/site-packages/townlight_meetings/main.py", - "size_bytes": 147419, - "sha256": "d224d17b9869739b6faaddcd7213e202f8b710f72cda402479c0c6a84e737285" - }, - { - "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0017_meeting_authority.py", - "size_bytes": 2306, - "sha256": "73c6266df0dd33b74223133a2a00d045112a1996ffc38025d3aa8ba7831f1082" - }, - { - "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0018_agenda_authority.py", - "size_bytes": 1675, - "sha256": "7dc3993bf51db8239270fd53a651b98ebbff0dbfce56ccbb73414ac9bbac2464" - }, - { - "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0019_minutes_decisions.py", - "size_bytes": 541, - "sha256": "5f088e0026bef9f492cac6a4c4a6c16ee81409d6447b1ab1ee19c037cd56d9cc" - }, - { - "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0020_delivery_history.py", - "size_bytes": 762, - "sha256": "92a6779b59cb3228b3bbd963a9c4cef921163cbd07473381f015dbf474ba4005" + "path": "Lib/site-packages/townlight_runtime/__init__.py", + "size_bytes": 118, + "sha256": "fc9d25b5ab8993eaaf8476bd2aa51513d83aa63151868100a8f40c15f4819fb6" }, { - "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0021_sources_archive.py", - "size_bytes": 892, - "sha256": "3220a0e7992d865b5a1f5a9bb71cb85722336f276fc974c13939d81fbfc1b29c" + "path": "Lib/site-packages/townlight_runtime/services.py", + "size_bytes": 24155, + "sha256": "2830069a2c2136c21a0acc9c488c599f72976579a8ab3e1f00b6e194c71032d7" }, { - "path": "Lib/site-packages/townlight_meetings/records_sources.py", - "size_bytes": 1843, - "sha256": "843b4808e4a335ab05a7801a33a3a5750dc49ce84d7e71961841e91e7532598f" + "path": "Lib/site-packages/townlight_runtime/migrate.py", + "size_bytes": 6334, + "sha256": "a7a90f0ead03886210f2a9d58f5967fa38f0ebc3780caa572dd17d978571087e" }, { - "path": "Lib/site-packages/townlight_meetings/transcripts.py", - "size_bytes": 3334, - "sha256": "33d5b6f97ce58b6f645e0c236a53a855c358d01db06ee048ec9c90100474bc98" + "path": "Lib/site-packages/townlight_runtime/records_cutover.py", + "size_bytes": 4650, + "sha256": "e0c2f9b4ef95e913c8c096bf5bc472bde66ff1eab1d1775026e8923f900675e0" }, { - "path": "Lib/site-packages/townlight_code/main.py", - "size_bytes": 84536, - "sha256": "930e05298b82f10ec0338040770d8af83aa56a9d43016908931ab8f796e63f48" + "path": "Lib/site-packages/townlight_runtime/records_import.py", + "size_bytes": 8613, + "sha256": "7baa9f06e3d046711b4111bb2ba28e89adcaed156bd896ec3caeab03feb2622e" }, { - "path": "Lib/site-packages/townlight_core/__init__.py", - "size_bytes": 10775, - "sha256": "22823aa2e5f34ff62c57276cc877fc52fb6c654877b5e3756d6dccdb40f7dc15" + "path": "Lib/site-packages/townlight_runtime/records_import_store.py", + "size_bytes": 16872, + "sha256": "e5f116e7620d86cca0b46f37561dd7b1f714c83178be681f51bd6a9db942edcd" }, { - "path": "Lib/site-packages/townlight_core/migrations/alembic.ini", - "size_bytes": 82, - "sha256": "d519dafe29ef2eb3cd77de8f8fd769746a45275439a6b3c5f5e34d990cc61092" + "path": "Lib/site-packages/townlight_runtime/records_import_access.py", + "size_bytes": 3191, + "sha256": "51ccf503c5901e60d836a657972539a880e723285482821d418065053addf8fa" }, { - "path": "Lib/site-packages/townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py", - "size_bytes": 1832, - "sha256": "51276a0dc2737fd1fc2615f26d66d942c1df3be2ef40f1513436cd4579b1ecf0" + "path": "Lib/site-packages/townlight_runtime/native_accounts.py", + "size_bytes": 4090, + "sha256": "497fb326fccb61dec69b58daf35a382ab832adeed190e65d2a7f87098fb3c6e7" }, { - "path": "Lib/site-packages/townlight_inspections/migrations/versions/townlight_inspections_0001_connected.py", - "size_bytes": 1305, - "sha256": "0e71ed311993f45634eb42ba22f5c2b2c4a3854639b221857af76f826d1b68de" + "path": "Lib/site-packages/townlight_runtime/records_snapshot.py", + "size_bytes": 7630, + "sha256": "fdb4098bdfaa24f81118a7e41bce803c8414569644d47d5907d0daf68f994d32" }, { - "path": "Lib/site-packages/townlight_inspections/workflow_store.py", - "size_bytes": 17443, - "sha256": "df4ff48879d5f8fe31d71a410a99ed8c359676ab05a267db65e1468cb4764146" + "path": "Lib/site-packages/townlight_runtime/records_demo.py", + "size_bytes": 7341, + "sha256": "fe5d902ba81e6c55bcce095ce7eb13071254c028c2dd730393a7cce10c6a7263" }, { - "path": "Lib/site-packages/townlight_notice/main.py", - "size_bytes": 23033, - "sha256": "3aec4b0007a662276afbb8527fab22fe796e4d64c3568fe688ac97dc63bc69bc" + "path": "Lib/site-packages/townlight_runtime/fixtures/redstone-valley-records-demo-v1.json", + "size_bytes": 6629, + "sha256": "859a65633f6f4575bb53f5db61a11b0a092cc1f9b145b828e70729cfd28e6a34" }, { - "path": "Lib/site-packages/townlight_permitting/migrations/versions/townlight_permitting_0001_connected.py", - "size_bytes": 1272, - "sha256": "e3fc90959836887334b429888407537140fa2d119c202886b63c538feb4e9360" + "path": "Lib/site-packages/townlight_records/auth/native_identity.py", + "size_bytes": 2151, + "sha256": "bfef8b1b166fee96fc3274d77f27f9a03c441b3ceab9a0a54a09fa7f3ae5fb99" }, { - "path": "Lib/site-packages/townlight_permitting/workflow_store.py", - "size_bytes": 15222, - "sha256": "c3415dd94aaed609a593d28b60d0719f2dc1a504a5f15391d9708714038ea259" + "path": "Lib/site-packages/townlight_records/desktop_bridge/router.py", + "size_bytes": 33322, + "sha256": "a7bac9443fe9cc93ac0949902f01aed1ba501bda1494535e90ddd660c7537494" }, { - "path": "Lib/site-packages/townlight_planning/migrations/__init__.py", - "size_bytes": 2111, - "sha256": "daf5e64cefda400a5db1023d952e41bef6f7954db19406d63ea84770c82dccd9" + "path": "Lib/site-packages/townlight_records/requests/artifacts.py", + "size_bytes": 12085, + "sha256": "01f049db7a2e4bcfdfb969cef1fe7c52fff2110ce0745e5ec370029dc4d955dd" }, { - "path": "Lib/site-packages/townlight_planning/migrations/versions/townlight_planning_0002_workflows.py", - "size_bytes": 1023, - "sha256": "7c6fcdfe4a1fa33c9289cef975a25f4b0f6746471c380226c14520f8a5f09dbf" + "path": "Lib/site-packages/townlight_runtime/townlight_records_alembic/alembic/versions/027_import_artifact_order.py", + "size_bytes": 446, + "sha256": "38dba1eb3f6fa1a2444e716deb630cc83dcdff4bc1129ee62d2bdaba3116d042" }, { - "path": "Lib/site-packages/townlight_planning/migrations/versions/townlight_planning_0004_neighborhoods.py", - "size_bytes": 806, - "sha256": "006f8f8f9859da76189efee9035d1f89c65e0b27172b5df9e316e1aa173434f8" + "path": "Lib/site-packages/townlight_runtime/townlight_records_alembic/alembic.ini", + "size_bytes": 560, + "sha256": "b40ffe9d0492f76d67e378b1b6a8cda387b08287528f28f0901dde9c383c6a26" }, { - "path": "Lib/site-packages/townlight_planning/source_bundle.py", - "size_bytes": 6466, - "sha256": "f6547516067e27697dfcd6ba80de6e2ca03d1473370209aa354a5bf95b7db98a" + "path": "Lib/site-packages/townlight_runtime/townlight_records_alembic/alembic/env.py", + "size_bytes": 2922, + "sha256": "8928b9156c23c2d63337d21c908784f87077cb515c758d3ccf0d6f88ac07ce45" }, { - "path": "Lib/site-packages/townlight_planning/workflow_store.py", - "size_bytes": 16971, - "sha256": "4d4fec6d6c876997726ff1d8f2ff39302f44228fae748edc013739267d210741" + "path": "Lib/site-packages/townlight_zoning/geo_import.py", + "size_bytes": 13686, + "sha256": "8926ce327572fe40e18e513c04928920a5d14306df6b003fd3e0a466914a5a26" }, { - "path": "Lib/site-packages/townlight_runtime/__init__.py", - "size_bytes": 118, - "sha256": "b68059cf70d9999804385a093caa3d7520c96d92f705ba9ee05fbc7d2c2b1f1d" + "path": "Lib/site-packages/townlight_zoning/connected_sources.py", + "size_bytes": 11235, + "sha256": "8bf1acad90f7f66e637a45727fc751a5d74f2c98f893c43f91a41914f8735883" }, { - "path": "Lib/site-packages/townlight_runtime/townlight_records_alembic/alembic.ini", - "size_bytes": 524, - "sha256": "60e69c28e3c87e101995977223073125b196202555e1fc18902feed2afdc7e7e" + "path": "Lib/site-packages/townlight_zoning/migrations/versions/townlight_zoning_0006_cited_questions.py", + "size_bytes": 2398, + "sha256": "5195cf011c8c384b5c0a3b7cf7abc1b3414f59dc8e92a37c5248c6f8dfada527" }, { - "path": "Lib/site-packages/townlight_runtime/townlight_records_alembic/alembic/env.py", - "size_bytes": 2784, - "sha256": "72f25d2ff59a9fdc6b5282e9d995c8c475146068c2e37b334236c690748ba637" + "path": "Lib/site-packages/townlight_runtime/zoning_bridge.py", + "size_bytes": 15192, + "sha256": "9bb3476d8f8365285cd486b86bdc27b0e28d34519610fdc379d2c58d42d2de54" }, { - "path": "Lib/site-packages/townlight_runtime/townlight_records_alembic/alembic/versions/027_import_artifact_order.py", - "size_bytes": 430, - "sha256": "9ef98e386a1dc848a1fab6893b009198d70556020482df207618519a3301faf8" + "path": "Lib/site-packages/townlight_runtime/zoning_records.py", + "size_bytes": 1700, + "sha256": "c4cb908e45e90baeaedff9fd4c668ca65229e129bc298b4d893d515046e73449" }, { - "path": "Lib/site-packages/townlight_runtime/fixtures/redstone-valley-records-demo-v1.json", - "size_bytes": 6140, - "sha256": "2039eca2587b4ace6937ca73e21d0a936835420f8534292247458a1a67516553" + "path": "Lib/site-packages/townlight_meetings/main.py", + "size_bytes": 148590, + "sha256": "411f2e69ac62e75e1b680ed7fd2954b159f6d0db1919da6ccceae9b646fdcb09" }, { - "path": "Lib/site-packages/townlight_runtime/inspections_bridge.py", - "size_bytes": 9755, - "sha256": "b7429c3ab988005a198795d6f1dfc3f785c7f96f61410903f8cb0ad38c6f512c" + "path": "Lib/site-packages/townlight_code/main.py", + "size_bytes": 88337, + "sha256": "08a9c16106b52ee8a5aeeee6ad00e1721c59e2c27c40d7e83b96b89256a15e3b" }, { - "path": "Lib/site-packages/townlight_runtime/meetings_bridge.py", - "size_bytes": 28863, - "sha256": "37ea43e633b55e9428e928143e5da0d41a7a5906673b8cc54b40fa4d1748fa52" + "path": "Lib/site-packages/townlight_planning/workflow_store.py", + "size_bytes": 17298, + "sha256": "abf17394c1d03528208f26343afece0dd928e96920e9ecc7c46885d0f1543aef" }, { - "path": "Lib/site-packages/townlight_runtime/migrate.py", - "size_bytes": 5667, - "sha256": "cf632a6c00a1c6e3bdea08edf841510a194665c0ce97705dbc4e16f964bb6145" + "path": "Lib/site-packages/townlight_planning/source_bundle.py", + "size_bytes": 6466, + "sha256": "f6547516067e27697dfcd6ba80de6e2ca03d1473370209aa354a5bf95b7db98a" }, { - "path": "Lib/site-packages/townlight_runtime/native_accounts.py", - "size_bytes": 4077, - "sha256": "e54d1dcfbbf5aecb2c61d7235884e787de05b8f48547f9c68348ba45a8ff9039" + "path": "Lib/site-packages/townlight_planning/migrations/__init__.py", + "size_bytes": 2183, + "sha256": "d633520d0fcec8ca93f8f5dc22e206cc65ea5c646a8a61e89eb6614d51008986" }, { - "path": "Lib/site-packages/townlight_runtime/permitting_bridge.py", - "size_bytes": 8765, - "sha256": "786abd0dfc18ed0ce7ada70fcd120f96795d8e1ee46f38ca0770a8217b4d6e1d" + "path": "Lib/site-packages/townlight_planning/migrations/versions/townlight_planning_0002_workflows.py", + "size_bytes": 1093, + "sha256": "eba85cad351b499cd7456e68305309d92cb4c3087e355417df5259458d9c3f4f" }, { "path": "Lib/site-packages/townlight_runtime/planning_bridge.py", - "size_bytes": 14108, - "sha256": "74a855b995b7f323873b9c788cd15bd4b0ebe3fc1c53879596e1b5043c2825bb" + "size_bytes": 14570, + "sha256": "9722286324a54d1dd831ae2f978c8337450b98bd90dee74fe15ff8cbd771992c" }, { "path": "Lib/site-packages/townlight_runtime/planning_connections.py", - "size_bytes": 2406, - "sha256": "9991e58a4b168fbbdf5f00334e8515061a09ab06ce593a7625ae007e2fd840f9" + "size_bytes": 2494, + "sha256": "116b2e0cf1d1acaba1d5135f746a91e283cbd5fb238631379a4672496d96ae77" }, { - "path": "Lib/site-packages/townlight_runtime/records_cutover.py", - "size_bytes": 4627, - "sha256": "62b93909757ce822fc1f235b6c602d081a669d68e20bca63719b7c773940abde" + "path": "Lib/site-packages/townlight_records/requests/planning_sources.py", + "size_bytes": 1877, + "sha256": "34f8e3c602ac055998d2284a1aa137acf2c095bd601be1912a8cae58431b244d" }, { - "path": "Lib/site-packages/townlight_runtime/records_demo.py", - "size_bytes": 7278, - "sha256": "c1c4ef3dd1ffbca62ffaa84cef21a66ecfa57b9f0909a75c5e34bde068b2d4c5" + "path": "planning-candidate-provenance.json", + "size_bytes": 7297, + "sha256": "5f5505165c9b4851d7a0cd45bd8880fae0a5bb00082952388923f7c8649f2826" }, { - "path": "Lib/site-packages/townlight_runtime/records_import.py", - "size_bytes": 8585, - "sha256": "ba8a017e2e83f7b08707b1c1dfe701fb9540d130aebf5aacd29e2c9699ddc8b3" + "path": "Lib/site-packages/townlight_planning/migrations/versions/townlight_planning_0004_neighborhoods.py", + "size_bytes": 853, + "sha256": "5db83c05d550ab4f9f0a414c6f139fa454bdc03ae1c7963e55290ecbc8fd644a" }, { - "path": "Lib/site-packages/townlight_runtime/records_import_access.py", - "size_bytes": 3194, - "sha256": "c8d4052358b5679e64f1fd97097d5d6498b9fbcb4a71a4af3b688a766d5f3fb2" + "path": "Lib/site-packages/townlight_permitting/workflow_store.py", + "size_bytes": 15521, + "sha256": "451c6ee455cf85d1b5a18a1e54ac02653b52a1d2e479adbe9213f086104ddd94" }, { - "path": "Lib/site-packages/townlight_runtime/records_import_store.py", - "size_bytes": 16716, - "sha256": "fe1acc8792fb8a2992d554568705663d2440d044616511891b98fff0e5eb35f7" + "path": "Lib/site-packages/townlight_permitting/migrations/versions/townlight_permitting_0001_connected.py", + "size_bytes": 1343, + "sha256": "8ca41fd995d6c4b4ed938d6aa5b13467df6db04224344544a0ad38d40d420765" }, { - "path": "Lib/site-packages/townlight_runtime/records_snapshot.py", - "size_bytes": 7066, - "sha256": "800377214a5e0b52cd4f402aae015f9eb832d7d29a003cd4cc3b84316cd4a735" + "path": "Lib/site-packages/townlight_runtime/permitting_bridge.py", + "size_bytes": 9103, + "sha256": "3505589503441a72fe6c6094b6cd6d31a111ce633f912e85ccd72edd08cf2535" }, { - "path": "Lib/site-packages/townlight_runtime/zoning_bridge.py", - "size_bytes": 14635, - "sha256": "eb80d79ffc4fc736789aab4f3d3b75a4d9d01101d6414a69a29053c7d5f90505" + "path": "permitting-candidate-provenance.json", + "size_bytes": 7299, + "sha256": "db50d81d87cfb31e70917a6f47fbb79d10b626157cdf4347886a9f44e1544fdf" }, { - "path": "Lib/site-packages/townlight_runtime/zoning_records.py", - "size_bytes": 1694, - "sha256": "045718aaa5f1f42876dbb493e4649e721a94187375d96bc8d7a34512e9ce9806" + "path": "inspections-candidate-provenance.json", + "size_bytes": 7300, + "sha256": "e20cdd562b68804de02840b5574c86b777abf7f58b30f30ed5f31961051fa2ed" }, { - "path": "Lib/site-packages/townlight_zoning/connected_sources.py", - "size_bytes": 10879, - "sha256": "68ad55c71b897eca689a6d028f4aee115dc5ca4b5ef005613385f9588387715b" + "path": "Lib/site-packages/townlight_inspections/workflow_store.py", + "size_bytes": 17794, + "sha256": "1ebe80dee56578f11dd5aeac643a0b899325a2bc250af399600979075fa9911d" }, { - "path": "Lib/site-packages/townlight_zoning/geo_import.py", - "size_bytes": 13239, - "sha256": "e49824301593f8c06dd6bc64832542721d7b1763d745deb7ba531f7b894cc4a0" + "path": "Lib/site-packages/townlight_inspections/migrations/versions/townlight_inspections_0001_connected.py", + "size_bytes": 1350, + "sha256": "1f8aaf5660480513bf538ee1b4145e287f4fd29f4495ce3fdf6f0c13ee030494" }, { - "path": "Lib/site-packages/townlight_zoning/migrations/versions/townlight_zoning_0006_cited_questions.py", - "size_bytes": 2262, - "sha256": "65b8c591b5adf3f0022720a2c4e780c818f0f4b5b51db83b81cab78edb2a1f9d" + "path": "Lib/site-packages/townlight_runtime/inspections_bridge.py", + "size_bytes": 10132, + "sha256": "6c840905c53d00a5d7ab5f39b8ca276924098ff11929913fe9b02bba457bf553" }, { "path": "Lib/site-packages/textflowkit/core/whistle.py", "size_bytes": 61157, "sha256": "5ea2fb20699ee46e941e783d67448db310bc01a561edfbaf95dc95d9e4396199" }, - { - "path": "inspections-candidate-provenance.json", - "size_bytes": 1334, - "sha256": "f48a4a44c6afb37ddc1ef3f920fb1f2dadaebe6ac149317679f0a3b6c96f92a5" - }, - { - "path": "inspections/reuse-manifest.json", - "size_bytes": 956, - "sha256": "5f1e2c95b0e77c5c9be4f9e50177e5062567c996aa56a4b54feb2969a11cb20a" - }, { "path": "inspections/whistle/whistle.cact", "size_bytes": 16919407, @@ -506,25 +333,17 @@ "sha256": "298d76c6ae944611369b3f04e5873b03f69f0d1d8d62c1363a535331d5efc76a" }, { - "path": "permitting-candidate-provenance.json", - "size_bytes": 1334, - "sha256": "f48a4a44c6afb37ddc1ef3f920fb1f2dadaebe6ac149317679f0a3b6c96f92a5" - }, - { - "path": "planning-candidate-provenance.json", - "size_bytes": 1334, - "sha256": "f48a4a44c6afb37ddc1ef3f920fb1f2dadaebe6ac149317679f0a3b6c96f92a5" - }, - { - "path": "python.exe", - "size_bytes": 105816, - "sha256": "5341746f92483a93e44c313de830f2fba2956f0759094404a16b2fed06c9a2ed" + "path": "inspections/reuse-manifest.json", + "size_bytes": 956, + "sha256": "5f1e2c95b0e77c5c9be4f9e50177e5062567c996aa56a4b54feb2969a11cb20a" } ] }, { "id": "ollama-runtime", + "label": "Native Ollama model runtime", "source_dir": "ollama", + "status": "present", "required_files": [ { "path": "ollama.exe", @@ -532,6 +351,31 @@ "sha256": "e44b55b3f10310663ac058d82d0ee18eb2bee6b20ccd0e8d992b48095961d225" } ] + }, + { + "id": "station-media", + "label": "Townlight Station media tools", + "source_dir": "station", + "status": "present", + "required_files": [ + { + "path": "bin/ffmpeg.exe", + "size_bytes": 222245136, + "sha256": "dae849370e32a8ede00d7d2afb9c58144430291860874603f5a20782f037bcb5" + }, + { + "path": "bin/ffprobe.exe", + "size_bytes": 222041872, + "sha256": "ac2c6e94ed1164fae6bc4046f7d4bf2a5185d9828a17c31710e0b1c38ad2d38e" + }, + { + "path": "bin/FFMPEG-LICENSE.txt", + "size_bytes": 35147, + "sha256": "8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903" + } + ] } - ] -} \ No newline at end of file + ], + "accepted_native_base_sha256": "173c032b874e2cf4091cd79213f53c0663d272070fc11712701892d490e09883", + "umbrella_source_commit": "0afd59de52cb7ecb317188a89bcd1fec8c578a24" +} diff --git a/docs/beta-1/reference/source-inventory.json b/docs/beta-1/reference/source-inventory.json index 940fde2..41f38ca 100644 --- a/docs/beta-1/reference/source-inventory.json +++ b/docs/beta-1/reference/source-inventory.json @@ -1,34 +1,34 @@ { - "source_companion_sha256": null, - "source_companion_pending": true, - "basis": "Actual current candidate source bytes. Source AST declarations do not establish router mounting, authorization, installed behavior or delivery. Use the composed OpenAPI reference and exact candidate acceptance separately.", + "source_companion_sha256": "8a52c5560b9b632b45892a06f17a7fe83f49f330a55b4d64ab3a19ce29d1a633", + "source_companion_pending": false, + "basis": "Exact Windows 1.8.1.1 corresponding-source archives. Declarations are source references. The release acceptance records installed behavior.", "products": { "core": { "repository": "townlight/core", - "repository_head": "ac2ead46938208820cb0bcae511475abef290da3", - "working_tree_modified": true, + "repository_head": "3021821bf9a92c790a399ad12aed821d65b09105", + "working_tree_modified": false, "principal_import": "townlight_core", "source": [ { "source": "townlight_core/__init__.py", - "sha256": "271ec6a8d23264747891f8909e8ed1986cb8b2d56098bcaf59e3550b1978e9c4", - "bytes": 10845, + "sha256": "ad59c3087795970e90ae7b80df9e3a582a8e3be2a2e192f92b66380384c4712f", + "bytes": 10446, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/audit/__init__.py", - "sha256": "4e1568afe62b114bdaa5bc329ce9eeb0f2a050304b2087d25dd4ea862e7a44b0", - "bytes": 807, + "sha256": "9066c9b752564f42427bb925f2ec72e92007f389fbec24b3bde90655cfb3c9d9", + "bytes": 772, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/audit/primitives.py", - "sha256": "b2c07101e233c2fddf03c0395f84ee8975e6a83aa2e66a51980a926b7f5474fc", - "bytes": 9770, + "sha256": "293ba8cf2d89165bf50d1fb019c05a4a1e5a1ca22c3703be25f6c96014491d3a", + "bytes": 9463, "routes": [], "models": [ { @@ -196,16 +196,16 @@ }, { "source": "townlight_core/auth/__init__.py", - "sha256": "04eb39badadea67810426e791606cafdbd7dfe05491baabc56feaab7d4e660bd", - "bytes": 2711, + "sha256": "3fe965551a68fa3d4359268c0f5cf92bff51784cac0f79d169fe97b9e2129f67", + "bytes": 2626, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/auth/bearer.py", - "sha256": "28a8ef40450dd3a0b5424916f8d50f08945c7b961170702971ad8686c928ec59", - "bytes": 6057, + "sha256": "6515b07ecf4be9fc344ab05eeef891b165f3e0310387dfa3a59fc2531c5dacb9", + "bytes": 5885, "routes": [], "models": [ { @@ -245,8 +245,8 @@ }, { "source": "townlight_core/auth/department_scope.py", - "sha256": "78e0840399fbd1b447436e231cc0fee52e77a2271b32f383cbbe9035d9fe23ce", - "bytes": 27460, + "sha256": "75b5ad73eecf7974e84deb50180680db0da51dfd7a18c74b929f42e7a40a3b64", + "bytes": 26750, "routes": [], "models": [ { @@ -409,16 +409,16 @@ }, { "source": "townlight_core/auth/staff_key.py", - "sha256": "70975c90b8629762c541c50ed63d5ebb230101569caaa7f27741040a92102624", - "bytes": 2495, + "sha256": "f26995045addadc9a1e498d1ba98135d55e6a12958c4160258426a7315c41900", + "bytes": 2421, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/auth/suite_session.py", - "sha256": "7276e30b9d2d6ff7c5cf247c7b3f0ad25c532341ea400387a355c6c7d89f028a", - "bytes": 10405, + "sha256": "7ed1725cf0364eab9f7132d0d31580576a7ce26bfcd1c0a136017c9932a64c66", + "bytes": 10120, "routes": [], "models": [ { @@ -448,8 +448,8 @@ }, { "source": "townlight_core/auth/trusted_headers.py", - "sha256": "e5fb52bfe52188a62f71cc5aca5facccac58c3981802a56a29939edc1804514b", - "bytes": 8041, + "sha256": "f7afd04ccd5eb889efe679891dd53325673010de0767f1cb60e9705d92906b9d", + "bytes": 7816, "routes": [], "models": [ { @@ -484,8 +484,8 @@ }, { "source": "townlight_core/catalog/__init__.py", - "sha256": "d6348d181abc14c16a11b1e2b63074d2a34efb49416ec3d6fc223af2de21525b", - "bytes": 7654, + "sha256": "d1b8417f9a586ecd2b4ca4e0c93b13ccfae8bb20fd330410c62be25afcf997a8", + "bytes": 7466, "routes": [], "models": [ { @@ -570,16 +570,16 @@ }, { "source": "townlight_core/city_profile/__init__.py", - "sha256": "65b6e3fafad6ab9355db419530d2d5398d9529db37eb761468f4a7a14e569b6b", - "bytes": 385, + "sha256": "c22e26dac2fcb454cbf91bcbf23311fdef9bf854fbb2bba2d76149945986bd72", + "bytes": 367, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/city_profile/models.py", - "sha256": "efddf634764a89de9eef92c50018e78358ab2536be43cd8b50758603d903c4ab", - "bytes": 4868, + "sha256": "e34b6bbc69f44656ad22217de2b911b5c437fb226b594439f935705c95a47ed6", + "bytes": 4728, "routes": [], "models": [ { @@ -708,16 +708,16 @@ }, { "source": "townlight_core/connectors/__init__.py", - "sha256": "4c6cf98564b9c46440fdf01d6895165ad39566e3270da02adbf088fd8f242a7f", - "bytes": 1732, + "sha256": "03e922533272d8a825c498f8e9b0af70a9aff22851e3d994f977abfe13c574a6", + "bytes": 1665, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/connectors/delta.py", - "sha256": "58de5706cd1e50043ffccc6bae552c094dab2b156235bf5959f3af2a28fa7741", - "bytes": 3211, + "sha256": "d99e5624e0eebcc434146909d65040eba0023cc84b2d5d03ce1de2b36c70e52f", + "bytes": 3118, "routes": [], "models": [ { @@ -767,8 +767,8 @@ }, { "source": "townlight_core/connectors/imports.py", - "sha256": "d8471df1e6c8ca2ae5f63a8e70419e83129e24fc8ee885a2803c0d023c57fe0e", - "bytes": 7068, + "sha256": "1ed6dafe0072eb57327e7d61b12df801f79bfb9ea7ea1738548afb5a002e0606", + "bytes": 6854, "routes": [], "models": [ { @@ -854,8 +854,8 @@ }, { "source": "townlight_core/connectors/manifest.py", - "sha256": "2d7ee3abedf89af90ee2f3c474925d11b93aa3117370aeee4ee5f783dad347a4", - "bytes": 8356, + "sha256": "88ef1b278d04f65e783934574d6decc4255efc952105984216851176b3a9b77f", + "bytes": 8122, "routes": [], "models": [ { @@ -974,8 +974,8 @@ }, { "source": "townlight_core/connectors/sync.py", - "sha256": "b3323199a3be7739aa2a1b6aaee9efca861a86ac7e3764b04637c13e5128172e", - "bytes": 13744, + "sha256": "0f7b716f63e251f2135e77eb5ca37640bb7a99fa9791376b3d959bc3036690a9", + "bytes": 13362, "routes": [], "models": [ { @@ -1235,16 +1235,16 @@ }, { "source": "townlight_core/db/__init__.py", - "sha256": "e42367febc6c5201dd39755c988c9e2c4cc3c3f3d8fe2d9a61bff7af63c651b2", - "bytes": 596, + "sha256": "4fd99e56b50ad2c0e4e456bd992d11f0269827a61a477b0f98ac223e828daa6b", + "bytes": 578, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/exemptions/__init__.py", - "sha256": "edac488a794152402c2b523d5f846096a15d964906a0bbd61346e9e0d5d5ec94", - "bytes": 5566, + "sha256": "b82a7def5ba21e2f06caafbd3f012509f01d9f18bf78e6354229e67e9b6c5292", + "bytes": 5421, "routes": [], "models": [ { @@ -1326,8 +1326,8 @@ }, { "source": "townlight_core/exemptions/history.py", - "sha256": "f58d7c1072189fa1260d54a2dba026b09de1b046b24bdfaebe9ccab55d1bdc74", - "bytes": 16427, + "sha256": "baf92ac4ed5ea97b2fdcf103c46d50fbaf6e6bd906e41e7b7a41dec4af56fd66", + "bytes": 16018, "routes": [], "models": [ { @@ -1493,8 +1493,8 @@ }, { "source": "townlight_core/exemptions/patterns.py", - "sha256": "b8c4ea484f1fe521295d29eebcc36703c4560d274b36c88f5af28f5abded98af", - "bytes": 5982, + "sha256": "3fe03301b2e01620cab3af063eaf43bd9d0511ce1d5443eeea3f4b18240903bf", + "bytes": 5778, "routes": [], "models": [ { @@ -1571,16 +1571,16 @@ }, { "source": "townlight_core/exports/__init__.py", - "sha256": "0b855da9162dda8954a082a7fd90efcf118b89b4a2019c2f9f497e1db0696f89", - "bytes": 346, + "sha256": "88c58189efbf0c3c8afb5f3ab71aeed962f404deec09b588ef87f360c3addb9a", + "bytes": 329, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/exports/bundle.py", - "sha256": "86ce615b7a1a6a73134f88fb82712738610bde6da23d4a3fa7ba3d66e0408af0", - "bytes": 7190, + "sha256": "f5f668c6702070a6cc1c26ecc9a48acc944bfcb690ec603929ad274c60ef96d8", + "bytes": 6981, "routes": [], "models": [ { @@ -1627,16 +1627,16 @@ }, { "source": "townlight_core/ingest/__init__.py", - "sha256": "a73d8e5e2d5e8c85774c139d72886a8b3cf37d84a2f3108522e6cbaaa95e0b83", - "bytes": 1342, + "sha256": "accb87f042208746afc7654de736ed49c44cc3f69182cb9f8851c919ee8e7ea1", + "bytes": 1288, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/chunker.py", - "sha256": "8d3fa815c5ad9f920447467dfe0d08729a0a48d053f0fcc6d78877b97936c55d", - "bytes": 2303, + "sha256": "cf9515ec9aecfa7a5b4bbe077c99711ecce651c6c155a4bef07475e404a96c83", + "bytes": 2248, "routes": [], "models": [ { @@ -1671,8 +1671,8 @@ }, { "source": "townlight_core/ingest/contracts.py", - "sha256": "68e2ea96be6e81be5ed543c7bf3eafe80a7cdf02d78be6d9e50f7e519d73266a", - "bytes": 2977, + "sha256": "7536789de18c66e150ad16986c44a794c6ad3353c5dd9e1b29b10f24fa5afaca", + "bytes": 2870, "routes": [], "models": [ { @@ -1847,24 +1847,24 @@ }, { "source": "townlight_core/ingest/embedder.py", - "sha256": "ae0eceb9f2c7345d849556d9dbb52349fa50676b970012a91eeda4e090f56cd4", - "bytes": 1653, + "sha256": "08734f87ee4601942b39e2217a8fab62d32f727d38618b48cc351aefd5bed6c2", + "bytes": 1598, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/llm_extractor.py", - "sha256": "4a4d4d1464e32f8b9abe77c67472c75e59352b78265ac33112611dd940b3b445", - "bytes": 3128, + "sha256": "d7ebb8ab6a73452627de5c07c2439b049f076e3f243700332936dd3705a68274", + "bytes": 3050, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/models.py", - "sha256": "08076031a8f61e62813665fa544e71a8957a9f79ef34a8316e983ba15855c288", - "bytes": 6450, + "sha256": "af1d94aa309a3492aee274d6c60448577c4fe4e558f25e64df5b476952ecb948", + "bytes": 6313, "routes": [], "models": [ { @@ -2154,16 +2154,16 @@ }, { "source": "townlight_core/ingest/parsers/__init__.py", - "sha256": "143dc760e3328838da545d9bcbd2e02a30e9761e1c906eed79713ca521e06692", - "bytes": 1072, + "sha256": "aa0f36c3f9fa9aec14e7b202f1cf5d712f9ed3f302b4a34b69f0db6beba1ceb3", + "bytes": 1049, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/parsers/base.py", - "sha256": "95e1302e3e2dfabc8cf91d4086706d06e35474e68e4ed3e35a9f08185764fe1f", - "bytes": 878, + "sha256": "d2618295496026752492dcbab6230d8973ed51f4a91984f7150e1bb064c36423", + "bytes": 846, "routes": [], "models": [ { @@ -2229,64 +2229,64 @@ }, { "source": "townlight_core/ingest/parsers/csv_parser.py", - "sha256": "73e60408c70bb358deb0d6a00a2af942539743128b1c3e5e545f95ad6b27b463", - "bytes": 799, + "sha256": "b33f9bff0e3da84f0f1227a73843767f74313d119d4c244ab3c8f34cf8d9ab2b", + "bytes": 779, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/parsers/docx.py", - "sha256": "a101377c0cc7585f8bc91ad2f2f0e8790468e93ca663a29875d0cf605f5add56", - "bytes": 3349, + "sha256": "0cc97157858cc1401a2a1e2d85d289b0a6456f86d742ef52bfd6f54e6ea28f6a", + "bytes": 3267, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/parsers/email.py", - "sha256": "067103e5dea87b75d4f9eb23ecb9313d59f343fc777d41d3d201ab6c3a32897c", - "bytes": 1267, + "sha256": "bddfa5a126b4a43c06cf03169febdf00dcf7a775da4c125cc62e834fb930ee01", + "bytes": 1240, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/parsers/html.py", - "sha256": "800f7e82730c897eedb9b815140b2c90ff606bc31a1c57d82b55c69295ed7c76", - "bytes": 804, + "sha256": "6fc1c805b8bc3db25160576e3e4b363f94ec097659d33b5d887e2d699d03a0c9", + "bytes": 785, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/parsers/pdf.py", - "sha256": "77a84cd4080a5d75505f074ed5ccafc619c3a5b7e788f77b254f30da29be095e", - "bytes": 888, + "sha256": "9d377f468ec5b1215aa73fb91f4ff0bf6eff69462e5ad9ca0d9ce93686af79d3", + "bytes": 869, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/parsers/text.py", - "sha256": "40ac3d40fb1cbddc34ab5d03347f1c0836992516895df34ca5bfa4a51022d903", - "bytes": 578, + "sha256": "c3bd7b93368e6690566423facd00b15cfde9d1a80c11f764fac2ec198386a8e7", + "bytes": 565, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/parsers/xlsx.py", - "sha256": "4bca7a22946eea259a61a5d97040b290e82271d1ad2964fcf65988cef0643e94", - "bytes": 3230, + "sha256": "e9f92b458273b0a4af0a16f2637d6ac27d12cf0676e51919d54e96ef4fe382e4", + "bytes": 3155, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/ingest/pipeline.py", - "sha256": "6cda90ee5128384ca716760865ed28d76f2b46ce141c7df9395b311e5d8d4459", - "bytes": 13615, + "sha256": "1bcdb23078d930e0a1dd31f5db8db0c1a0b354b6cb8efeff19438a9b3c83a45c", + "bytes": 13246, "routes": [], "models": [ { @@ -2308,16 +2308,16 @@ }, { "source": "townlight_core/llm/__init__.py", - "sha256": "ed910741b77a88421ad13583f6d0858361b016e28dfc8d2350bfee5f058836ab", - "bytes": 3865, + "sha256": "788467dac7a133f50c391d46b55fd4887a30bc347efab76cc0c6513fb62b7d68", + "bytes": 3724, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/context.py", - "sha256": "d032bc3bf9b0150528ebee667b4cb684bfd739223d30c569e4eb2894829857d8", - "bytes": 8808, + "sha256": "b1cdb4ff6002e6377a0fdb7099d8d6a8b21e8671ed04d488cb47b834e687731a", + "bytes": 8568, "routes": [], "models": [ { @@ -2384,40 +2384,40 @@ }, { "source": "townlight_core/llm/factory.py", - "sha256": "e2358941f74a34a659e8f79f42f897309be4ce99c6882d8318cec87ce1a23bb5", - "bytes": 2948, + "sha256": "5da9858a5ff0dd76238ee702c75306f7c9adbb3b7d0a0e25f5ab6d0572f85f47", + "bytes": 2874, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/providers/__init__.py", - "sha256": "6590c160c8baefb7049826b23d187d46b66eb657afb645ca0a4c8d43d840805f", - "bytes": 1316, + "sha256": "d2eedb400bb7c5d3d821436072f772074d4d9ff04dd0d8fcdd9bc684642e5bbb", + "bytes": 1275, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/providers/anthropic.py", - "sha256": "b60ffd6acc8eb71a9ea53a101124bbc97adcfed14b59bc74361a5a10b22aa5a4", - "bytes": 5338, + "sha256": "a09d1e6fcbd905e14f5f0f39164fc4251e68f80f06366be9b479266230a0075b", + "bytes": 5199, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/providers/base.py", - "sha256": "57f4cc31b824641b6533353a08069ad8efe164e2f2795dced911f1a489a6e12a", - "bytes": 3845, + "sha256": "9b542fc9fde2c4bb466923b5adabf25f7cbf5c0db86e91c17633da36bccf6e93", + "bytes": 3744, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/providers/config.py", - "sha256": "b82987ff817044c3f3493fb9e97d5e0ce49c5dee138545264119596ced9358f5", - "bytes": 1836, + "sha256": "43cec5bd33de6fbfac7d2ab7bbe8d178253c287bba51913c42dd76db4dfd6d1a", + "bytes": 1788, "routes": [], "models": [ { @@ -2502,40 +2502,40 @@ }, { "source": "townlight_core/llm/providers/ollama.py", - "sha256": "c7514fc0f714f520b90e0b93300fa4ba292f84bd770a8bdede416921f2bb9054", - "bytes": 4789, + "sha256": "b58d41df99eb42cbacd0d5aaac843470760dc58421dc88fd02c2cb1c5637647b", + "bytes": 4653, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/providers/openai.py", - "sha256": "b7d86e8967dbb9733ddbadb62622d22b969dcae3891eb4f08ef41a25a0630295", - "bytes": 4684, + "sha256": "9e4b3dec2ab24670a47db80396b2a5205dd17c7220de2b097f362f832549e3ca", + "bytes": 4545, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/providers/registry.py", - "sha256": "9fce82b519c2e327fff38f3a4cd4c0638b941f5b08ea7c9ff8c44f65c8143fb3", - "bytes": 3234, + "sha256": "e2ad4540cd1ce2a46217f9830a41d3e3605d411b9644f87aab15aab2329bffc9", + "bytes": 3145, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/registry/__init__.py", - "sha256": "37336ea704f8a53133a5b0a08eb78e63ebbbba00f63193cec7f492b5f7e69100", - "bytes": 1711, + "sha256": "786f93f287f5f594eb199bc286703b96bc30bebb70014df478fbed5965d592ed", + "bytes": 1667, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/registry/models.py", - "sha256": "0aceeca8a9a101bd0cf8a0362043eae7c5500f8f9d9f71fc8bf4d3f409165545", - "bytes": 2328, + "sha256": "ef8cb0045ffeda6b5565c898d7020ed38728f3dd23da1cee4462f7dfda94a3b0", + "bytes": 2267, "routes": [], "models": [ { @@ -2607,8 +2607,8 @@ }, { "source": "townlight_core/llm/registry/router.py", - "sha256": "29c58ae8b9c85648deb54b557a5f2f78a2d92157e5d624dffbb3c9a1c0d7bd2c", - "bytes": 3424, + "sha256": "694b51a8feace1df37c945f9a3c22c4de45e5b140d39e75dd416e75b11fa3c4e", + "bytes": 3324, "routes": [ { "method": "GET", @@ -2646,8 +2646,8 @@ }, { "source": "townlight_core/llm/registry/schemas.py", - "sha256": "fe336b9719d82b236e6afc353671eb8eb3e6ed13343a3c941a80b4473582683d", - "bytes": 2133, + "sha256": "324d0b48abc8d3d0b7a66f9763145a29fed4e81a6b8a59f865b63fb1ab980bfe", + "bytes": 2062, "routes": [], "models": [ { @@ -2827,32 +2827,32 @@ }, { "source": "townlight_core/llm/registry/service.py", - "sha256": "06d9babf0786d2d06069d98f9f2bbf51b881b1349c418ba2b1282644c098f3b7", - "bytes": 2811, + "sha256": "33edc3a65c1f09deb91672e09af22efe63dedced0882ac63470674041a7621ff", + "bytes": 2731, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/structured.py", - "sha256": "a8e3558896c8fdf339548a2d6d7e68bfafb88c1fb0913f3870fe7abd8a7cd17d", - "bytes": 5876, + "sha256": "53daa2005ecb5f82b99b23c60253b052e8e1bcf1ba7b2362b6b458b17eae5052", + "bytes": 5700, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/templates/__init__.py", - "sha256": "47c5b3b7fefe918ccd77b9d0c1b524db6ba8750240ccd5b74d6e45f0cdce841f", - "bytes": 1742, + "sha256": "5a8331e82bda683ccf7cef6da661b729592eb2b2d45c541093f94592f30c7cf6", + "bytes": 1696, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/templates/engine.py", - "sha256": "d3b2d8618b20092302dd5fd4d10c3cb6ceb6f3b3c11aeaf1aa8c17568b1d71a0", - "bytes": 3187, + "sha256": "4dffea844e91f5327fcbe58b9a48df708e8b0f518cec415d93d962a7d271d21f", + "bytes": 3095, "routes": [], "models": [ { @@ -2892,16 +2892,16 @@ }, { "source": "townlight_core/llm/templates/exceptions.py", - "sha256": "5b40a69202c7dfb3292563716ecfda9b0255694795ff88308c57303fd8cccd73", - "bytes": 2331, + "sha256": "9926f9fd776e94102d9388f9ea2a0634a5e822b09d8837ab4dbc7fff9224a9bb", + "bytes": 2270, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/templates/models.py", - "sha256": "6c460d2cd19320d4b905020c644001bcf5ab117dce2e1bfae18642018d5307be", - "bytes": 3958, + "sha256": "605df066268bff4e912c8fc44b3f478b51a263bc5842b0bd57e9f824849233ab", + "bytes": 3856, "routes": [], "models": [ { @@ -2983,24 +2983,24 @@ }, { "source": "townlight_core/llm/templates/overrides.py", - "sha256": "d5a896fb685ccae553bc2471512f597a054023b9f360bfe416dcc5227837d644", - "bytes": 2545, + "sha256": "c4684b799cf8e37da0dec9c6a0c9d4ae29c9b8134bf3d900685546ab8bfc3ab3", + "bytes": 2487, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/templates/resolver.py", - "sha256": "44c1555f884f9bf8605671ea4cc18c431aa317bf1ddc91100e845a76572f9603", - "bytes": 4157, + "sha256": "f896b7223adf8246215ed7a5173d597b54408e4478b2c0a4354823e6ceea4f37", + "bytes": 4050, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/llm/templates/schemas.py", - "sha256": "931cbb7e2c3a714e7c76239c18e7be8db1a97e520cb143e24ce15d799921f15b", - "bytes": 1769, + "sha256": "f52631453f8fd7ff4207550929001481e23aed782cf9fae5bb3c1e93a1bd6683", + "bytes": 1702, "routes": [], "models": [ { @@ -3205,8 +3205,8 @@ }, { "source": "townlight_core/migrations/__init__.py", - "sha256": "9a745f1756a2685c4d7fa974007c53f419502c238ed3956f97e844e343965c0f", - "bytes": 240, + "sha256": "d418ce1423a3471a5138adbb46dac9c7b8725de5c47fc1179c7c5bb0037c42de", + "bytes": 239, "routes": [], "models": [], "configuration": [] @@ -3221,8 +3221,8 @@ }, { "source": "townlight_core/migrations/env.py", - "sha256": "7ee4f5d2b7bb757689ed8466e665dff961ccb23d0541dd31dca730c806c3ed73", - "bytes": 3012, + "sha256": "6de5a36d48c51f353eca0db49504997b28a619f718985081b135c9fcd97dd9c3", + "bytes": 2924, "routes": [], "models": [], "configuration": [ @@ -3238,16 +3238,16 @@ }, { "source": "townlight_core/migrations/guards.py", - "sha256": "ad6b3855ae5805aa44d4fd06239047228f0642fb1fc6b504ea47d447aea01608", - "bytes": 7852, + "sha256": "ca86d3c6ba993985641ded758a046144e706d32dcc3087de5a74c4a8ec84d673", + "bytes": 7638, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/runner.py", - "sha256": "20c85f60b4a55c9b01d334718794dd3de67cb81c13a341f3f6ed1a76f9a4f31f", - "bytes": 3669, + "sha256": "6d8924437f8d0471324fed045275db61c3632b97b2e7f7c79afb76d66b6c81cd", + "bytes": 3584, "routes": [], "models": [], "configuration": [ @@ -3259,104 +3259,104 @@ }, { "source": "townlight_core/migrations/versions/__init__.py", - "sha256": "68926a3b7368abcbb421c607eb819cf0d9fefaa908c52e8d52c58700aebf7c47", - "bytes": 307, + "sha256": "e18db719152c033fa6fb7a400286e7ba56744cb79b94d56bd800b855da5cc7de", + "bytes": 300, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0001_baseline_v1.py", - "sha256": "c2c15340fb08bab1113b277fde04a872bbf8acef3876aa8ca4f640ad320e6980", - "bytes": 24152, + "sha256": "f9b09fa9ad3a065c63d25ab42b5e85284398a4fce5532994ed7542b15c53c037", + "bytes": 23564, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0002_llm.py", - "sha256": "d75548bca06143171c3704405c2671ae5191dc2b5fb85b7239b8a605dc321227", - "bytes": 6312, + "sha256": "428b2c25a4c5907b36e2b9474ddc60af9b8c972f3558b4cccc02dab65c41e682", + "bytes": 6163, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py", - "sha256": "bc3d01f5e198904380fcc835b108a098ef9ba26f507c7d575219772adf5ab76f", - "bytes": 1909, + "sha256": "9d897f858df69832c76fba9b04631e88ab3517719adf7d3eb09c82ee6b0ed713", + "bytes": 1865, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0004_catalog.py", - "sha256": "8066969475b40be59d11ad9ad724402f3206456a82e440fc12b5f9bd4d3c8026", - "bytes": 748, + "sha256": "6cf81f847403f0c69ec997f0ef6db72bbd595814feb94ece474311e3859463e1", + "bytes": 724, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0005_job_leases.py", - "sha256": "608b6d0e9bb2c17223b1708f655fe14596a32f0b68e2be86db044fade590cd8d", - "bytes": 899, + "sha256": "8391c03b7da819ed946f4052b94ebaacd1252be6daf0bf913bf29622968182bb", + "bytes": 873, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0006_rule_history.py", - "sha256": "c81a1f1c696696702aa1ae895ee6fc7cd2c9010766abf054491e8acc4f2e6302", - "bytes": 4206, + "sha256": "c67b2351f437f669077f60dd423ae4f640382b82793de80ee591f8584902ba3f", + "bytes": 4112, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0007_module_inventory.py", - "sha256": "d8e4a304527de33536f5362a8eaaabd48992940265a6d72db6d666507433925b", - "bytes": 3596, + "sha256": "318c3f0a813fcd9975464e9de1e61570327882590861a5eedaad9b92ded21f8a", + "bytes": 3521, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0008_department_authority.py", - "sha256": "96db7cdaa3c3465ba9f2e3ebe4996f3b9c9238e33f7ce85826dca3280b32901e", - "bytes": 3783, + "sha256": "944f07a92b4227ea899b4af31e2b3f8e80263f10d4f9d20b58ea585d6fb9e1f2", + "bytes": 3706, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/migrations/versions/townlight_core_0009_job_artifacts.py", - "sha256": "5c02e20fe7b91bd1f27d83191d337326db16a1b528c8b167094f5407f531e55a", - "bytes": 3392, + "sha256": "86800ea9c1e0fbb879792196298fecaeb43ac47fea009fc7e497bba6bc033510", + "bytes": 3321, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/models/__init__.py", - "sha256": "06147bb3a8ca75998557a755cd5966b4b617a9aab53426743f8ed915688f1d81", - "bytes": 363, + "sha256": "ce808bc12f197913b9f451e3711d6384f16a89cfa86ccde3c38c709a1102e3ba", + "bytes": 350, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/notifications/__init__.py", - "sha256": "a6b1d14746e7609f8b2512b2ef6ccf9c2cc94df1044a7b66d66a39c30636b824", - "bytes": 483, + "sha256": "45d9b39c1676a60d5907962feb97257a4575fb5417e303c06232705ac815b176", + "bytes": 464, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/notifications/notice.py", - "sha256": "e6ad671cb058c276424a25ad0ded51b5525e1e2bd06fb7010e2c0049a8217de7", - "bytes": 5268, + "sha256": "78c2542686403c647859b27f5a7bf7ff832cd29ca3ff4086b32c6e5fc098247b", + "bytes": 5110, "routes": [], "models": [ { @@ -3480,16 +3480,16 @@ }, { "source": "townlight_core/onboarding/__init__.py", - "sha256": "571ae2118d589efff98a29f0617b81fbf57ffa564944081ba090cd26aebd5f64", - "bytes": 544, + "sha256": "e010bff8659f1bd4426b4ca718315739d3730923747c0be8d265de326594722c", + "bytes": 523, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/onboarding/profile.py", - "sha256": "b67bc5f483f07cc7966e6db37bfbd5aa4950f7f9ee530bc7fef27ed792885bd1", - "bytes": 5271, + "sha256": "76f82f3b710700d4d3913a1ec5575c15499e46c11b4bb9ddffa2455710b93a93", + "bytes": 5102, "routes": [], "models": [ { @@ -3551,16 +3551,16 @@ }, { "source": "townlight_core/platform/__init__.py", - "sha256": "8566d9cb030f415cc760ff53c2d2a86065ba24fb0098a1cf232fafba3a452ec2", - "bytes": 3698, + "sha256": "0786408e9e38da0c9eb1853452b66b786502fa74ddd33296334d6cad446431c4", + "bytes": 3556, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/platform/backup.py", - "sha256": "3c2580aaf0bad4989fd048927ba4eb669b85fa6fccc5119d656c054a8bfd1bfe", - "bytes": 6873, + "sha256": "1978677b99bf4ce54b2a0d545125a444ceae54b12bbe44ceb0843fa4f32d5feb", + "bytes": 6664, "routes": [], "models": [ { @@ -3723,8 +3723,8 @@ }, { "source": "townlight_core/platform/health.py", - "sha256": "e63da46e405d5505dfde8b29723687698e0f84b7f692f42bdf5ba5468ceb0858", - "bytes": 3592, + "sha256": "026ee54ff4de454f3755d42bdb4dde2408f09a2178098090a98a6d501b2eeaee", + "bytes": 3488, "routes": [], "models": [ { @@ -3825,8 +3825,8 @@ }, { "source": "townlight_core/platform/inventory.py", - "sha256": "843f4399d19f328d98c6988bcc82f42a945ebd53df6833941aac501123dc7f70", - "bytes": 21323, + "sha256": "1ef0141de1a6b31e639125c13303bde1a3a6688196d0f6a1ca0360cff930fd22", + "bytes": 20769, "routes": [], "models": [ { @@ -3955,8 +3955,8 @@ }, { "source": "townlight_core/platform/modules.py", - "sha256": "7857122ac3cc026595b8f326a8b232fd8c23b9735b49df7c776f1a34f2b0ac15", - "bytes": 15072, + "sha256": "34f7bf14ad7bb588197c63dd6abcd463fc9921a0840a6c33877a9d62c9de3bed", + "bytes": 14671, "routes": [], "models": [ { @@ -4462,8 +4462,8 @@ }, { "source": "townlight_core/platform/runtime.py", - "sha256": "5328e622bd17db907c66fb424fc8a5d924be0704fc99eff3a8f0dc42f855061e", - "bytes": 1989, + "sha256": "dfc79f2557243b99bcdb1416d8d7938f7d589d2b7b2594f7d15e5757a23de326", + "bytes": 1926, "routes": [], "models": [ { @@ -4569,8 +4569,8 @@ }, { "source": "townlight_core/platform/task_queue.py", - "sha256": "7d5108826b83b154d96412c12e3e52ac70c32412208923e8fef00ef3de8864d6", - "bytes": 12258, + "sha256": "4065fc3931a90735b399e8c4a7779cb9c71e5fab6c0f7c950f7a6413d24e80c7", + "bytes": 11915, "routes": [], "models": [ { @@ -4657,8 +4657,8 @@ }, { "source": "townlight_core/platform/tasks.py", - "sha256": "29f5509deecd7e196d9c43a964e34641c53bd4fa502491e680620a83f9b9622c", - "bytes": 5754, + "sha256": "c149d44366e24904aa5d1dbd5fdb61de45657579d481f9eb7b931bac86946975", + "bytes": 5584, "routes": [], "models": [ { @@ -4817,16 +4817,16 @@ }, { "source": "townlight_core/provenance/__init__.py", - "sha256": "a54d29222c9fc54bd9dc6dfd237a73003a31bd6508fbb315eff200d316685607", - "bytes": 385, + "sha256": "0f703072d5ba898b13a2683285eb8d57e66815356391103f27d63237467d0ab8", + "bytes": 366, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/provenance/contracts.py", - "sha256": "cb75de8d4de91b9b2ab0e1c94f6cd6fd04ca8266b56c24c4603507fb9e7c73fc", - "bytes": 3912, + "sha256": "56dfe26f57056ae1ea85fb8eb808a5259700609483d8e14e67625e123040d57c", + "bytes": 3781, "routes": [], "models": [ { @@ -5025,8 +5025,8 @@ }, { "source": "townlight_core/release_provenance.py", - "sha256": "5b73394b358fed482549e0f544988d85f8acd5b6510609332d3b61fca34cfa28", - "bytes": 22694, + "sha256": "eab7f9365e0babc1421904a48804ff9a8f1b406bd39895d0d2aa49a85c88d763", + "bytes": 22087, "routes": [], "models": [], "configuration": [ @@ -5042,32 +5042,32 @@ }, { "source": "townlight_core/scaffold/__init__.py", - "sha256": "a7cfa7320296bee9a99761fb5c5735ce578914e451b6b54b249ebfb8734f52f1", - "bytes": 1592, + "sha256": "0c19f77332d8ec6f59227940774e35560018d09caca31e98965b40b15f77d440", + "bytes": 1541, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/scaffold/__main__.py", - "sha256": "5735e7445cf005e809f9cdfca7485796481f20b40d6ac62978df53cac985a09b", - "bytes": 332, + "sha256": "217c8d0ee8ccae42e34ef730a7a72244f46152ab3e1f2cfff6bbf3264f09f3bd", + "bytes": 323, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/scaffold/cli.py", - "sha256": "0e45c64c04a1a86871d41f7acc2c5c62357e1db8248120afc877c46a5fd9d7eb", - "bytes": 5592, + "sha256": "2076b10487df8b8e1e7fcd328d270c3fa2738ea74ded40ea522378594be192a8", + "bytes": 5434, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/scaffold/project.py", - "sha256": "ec9ec04b46d6d26f1764e487d52fcb01fc66ea8b05553c771a289b8c183c8b41", - "bytes": 23120, + "sha256": "48e2e8cef00b1e6ed3277f076b7664f4a6c92f58eb9f1c32e103a78b69dd00bf", + "bytes": 22440, "routes": [], "models": [ { @@ -5146,8 +5146,8 @@ }, { "source": "townlight_core/scaffold/spec.py", - "sha256": "7f7f2e4b1bed9e331b002ef9c560a25cc4f4d2e81922204455fecb9f490831e8", - "bytes": 5927, + "sha256": "fa199a8865c9326c3efe3c3cc8f3e555962404184cdd3e4591181329dc694673", + "bytes": 5759, "routes": [], "models": [ { @@ -5216,72 +5216,72 @@ }, { "source": "townlight_core/scheduling/__init__.py", - "sha256": "2bde5b7b97b7e42e6828d6f898908c43fa81f0e138c12fe98e389839a1b81f84", - "bytes": 340, + "sha256": "de20c0bf1fd71c389a74aecf4de9cf707fdd31d1faf48ca7b06c3461dd16cdfe", + "bytes": 325, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/scheduling/cron.py", - "sha256": "6e385d99111b7809af36ce9846902068545757f66425e72e924e1088b53277cc", - "bytes": 2668, + "sha256": "a7c5688dc5a3e5c410466cc92a7d884a88a50fe92974d0a7642b0fbe954f0b08", + "bytes": 2588, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/search/__init__.py", - "sha256": "13d8bec659e5056118385219d8741e0e25d77ef57409de94eedbadf4b1fc7dc2", - "bytes": 4610, + "sha256": "2450f3768c47b0e2869ca1056b188d41b9ba58f88a0865cad5ad854f03801908", + "bytes": 4478, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/security/__init__.py", - "sha256": "c89bf972b45da10e18076bb17fa8b9cf8ae0b9bf76475f90e136baa8d832bb42", - "bytes": 1715, + "sha256": "e82d160b08a83b983e08bbb81a6fa82bc5d4127508a8aba8e5d97a3aa7524e20", + "bytes": 1652, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/security/at_rest.py", - "sha256": "87bb3aef0e3fbba957364037e1c4fd96f972fc758b30e0684c6c9915ed2089e0", - "bytes": 2966, + "sha256": "eb339fa93cff4af29df7f01b3f5552fff56c6bdc676fef6cb9aad8356a610d3e", + "bytes": 2881, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/security/config_validation.py", - "sha256": "7043de1ab5799079e7521603510206945c91a0ddb3fdd16464b3e4190010d110", - "bytes": 5008, + "sha256": "e4064bf0394ffc7cdc0aafccfc689a2a17667cfd31d8455dc6f8a623d963af45", + "bytes": 4855, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/security/host_validation.py", - "sha256": "dc3ee223e1875baabed6202ecf673f91b837c7b5ec51f751efe594d76ad0addb", - "bytes": 5292, + "sha256": "3e62ec5540713eea903409c88c4e2255b0dd8d54a9d5d23fc69ad15e03c15045", + "bytes": 5140, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/tasks/__init__.py", - "sha256": "fa149df79666a714bc9fa46bbd275f89b5eeca1b6244d4e0415989ce3c38d85a", - "bytes": 873, + "sha256": "0d310246c0d03a4b9b06cd85d1a82a27f5e533863a95e9ffa0952c5befcc5f5f", + "bytes": 837, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/tasks/artifacts.py", - "sha256": "4827aa4c8778f0612e5deba771be06bdb404ea19149166ff8ab2f7c7c56c229d", - "bytes": 16399, + "sha256": "8d84597f36b6977a3f282f5f5617f789ced6eba25774fc03465362baca5363d3", + "bytes": 15986, "routes": [], "models": [ { @@ -5471,24 +5471,24 @@ }, { "source": "townlight_core/tasks/leased.py", - "sha256": "1a2d44107db916e54fe2bf05d6909d356603393d9686b4e28ba763702c3671a0", - "bytes": 3267, + "sha256": "ed34636caee4a608fa37ee6d3289937c2e4ac049fcf5346c14c49ca381b050ba", + "bytes": 3181, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/tasks/registry.py", - "sha256": "71ce9c95a7f30cd97f045ddbeb6a7d36472b82a50c0ba07782b6ec9b465264c8", - "bytes": 776, + "sha256": "3f73c907f438f7cf6463400bbe058094006772e40df53d0fd3d474e1b60d55e5", + "bytes": 748, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/tasks/worker.py", - "sha256": "2f4bf95de44b0f1f90f21a0b773748bc8f80838498d5f25c05d63ce9d34df841", - "bytes": 3095, + "sha256": "64e9f55b4d8ed860c0de2e3de955bb2fb5cb99b47bf10531c77beed2fa297916", + "bytes": 3015, "routes": [], "models": [], "configuration": [ @@ -5504,16 +5504,16 @@ }, { "source": "townlight_core/testing/__init__.py", - "sha256": "6033e371f9adb5bb4107ec14c541768a7b6acfab5d9d1b184fd490461c9b87df", - "bytes": 2115, + "sha256": "539e3ddec61b642a0200599cfd9b000ab20e5c568e3224be57faffa35baee0e2", + "bytes": 2046, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/testing/mock_city.py", - "sha256": "0268eb2457e22ab2c99f4a0b5c2f3dc34aef0102cf7d0f10019b1db9c2918961", - "bytes": 51471, + "sha256": "18a409f6e763da52512a377344814e2cc061f9e83e83336241980424d0d7cf62", + "bytes": 50183, "routes": [], "models": [ { @@ -5895,16 +5895,16 @@ }, { "source": "townlight_core/verification/__init__.py", - "sha256": "c70e114fe70b60ccc09ee541df728316be966ca7660be3275ce66086e737f233", - "bytes": 441, + "sha256": "4c5d99a2e41070abd687f11f3a523b0606b1334b7902a4d28d478dbd2db4fb0c", + "bytes": 426, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_core/verification/browser_evidence.py", - "sha256": "1edca65a6a73ca5b42a3eddc9db530e5d78b2bd7eec54e867c4e2dfe061a3c0b", - "bytes": 3230, + "sha256": "493219d45f5c50d5c514a4ea9534ccfab35979d0c58a577a2e9afd01328c7fe1", + "bytes": 3140, "routes": [], "models": [ { @@ -5941,30 +5941,30 @@ }, "records": { "repository": "townlight/sunshine", - "repository_head": "156ef1ba2d06c77eb1820fa7efdbcb94a2c92fa8", - "working_tree_modified": true, + "repository_head": "e1b712091c38fadeb00c19233d7f2bf1280fc248", + "working_tree_modified": false, "principal_import": "townlight_records", "source": [ { "source": "backend/townlight_records/__init__.py", - "sha256": "ff95c656e3245c0b6c3400fb8c22ab8d06559682f96d4f456deabc81cf970cb3", - "bytes": 31, + "sha256": "4dd8e18bbc6b91a24c6ee7db7397435eb4ab13184548bbf59979338e3e7fce92", + "bytes": 30, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/admin/__init__.py", - "sha256": "41dd8646dfff4f77df72dd38cfbb57cd88c037c7d45192dbc1fdfe537d35e6ca", - "bytes": 97, + "sha256": "b48ba84129727626e71cabd41b469ebccbf254a279c2c0a99bde9f9bc2f62340", + "bytes": 94, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/admin/router.py", - "sha256": "7c20b2df8ab59a3b35d77ff6734689873c5ba6d2f9a3c3a733a0ae9088147ace", - "bytes": 18069, + "sha256": "aaee0bdb822cfc061bf97182f1d41e7d8e37e192f6920303ec8495c2a565fc9c", + "bytes": 17549, "routes": [ { "method": "GET", @@ -6273,8 +6273,8 @@ }, { "source": "backend/townlight_records/analytics/router.py", - "sha256": "00ee39251e533e36b4a1575742f01c926962684da22e2d4ee38e6f7df0547ddb", - "bytes": 4668, + "sha256": "bdbc9a42a6ef2e3e86ce4fd2b2852dd3d2e9c259284147565410a69b0f1ff23a", + "bytes": 4549, "routes": [ { "method": "GET", @@ -6288,32 +6288,32 @@ }, { "source": "backend/townlight_records/audit/__init__.py", - "sha256": "3ddf6263d5c1e6ad92aa12edcbbcc2ad66b106927c173af9de08f84cb7629456", - "bytes": 289, + "sha256": "778dfaf55389462ba8fdf73fbc559f2824d5c3879b3ca60bd518bc79d2ef256a", + "bytes": 284, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/audit/logger.py", - "sha256": "07d4df47196956592865809f7958e43e93df35965b925be6c5aaa111070d266c", - "bytes": 4371, + "sha256": "c6abd7740c684f44107fb5bd7571bc74988055492349567f23b6933e531812f5", + "bytes": 4237, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/audit/middleware.py", - "sha256": "c72be74ac13fa28d39c6bc7bf8800b6135ac5f6ebc573842d5bb1ba8e84532a5", - "bytes": 3722, + "sha256": "0dd636f544153661a6c4a49a142d1819c072bcb652d4497e6b71112eb0cdf1ce", + "bytes": 3625, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/audit/router.py", - "sha256": "51e6968c08755248e2455679fefc95ad7598ead1257b4a4599c51386c510e9d8", - "bytes": 4296, + "sha256": "99809d1d44183c278f42833bbc67cf6aef1d17491cad5e1ac30d63ce9a2fb062", + "bytes": 4183, "routes": [ { "method": "GET", @@ -6339,40 +6339,40 @@ }, { "source": "backend/townlight_records/auth/__init__.py", - "sha256": "a6c03f9992f7fce6cb888319b1b8c35f44b7a23a0d35e3551fc4e509d55993e9", - "bytes": 338, + "sha256": "e72565303dd6272555b1bf7443bcf7e9748c8244ea9d12bca099b0960b9ecf61", + "bytes": 327, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/auth/backend.py", - "sha256": "6142da3d361c4b887b3d5b0c302d000ab191825b0210f19ad1adc8f4cc5bd698", - "bytes": 484, + "sha256": "9d4d377149179e092f1680935e3bd89013ada3a2ac5b34170e62c7251eeb0a3f", + "bytes": 468, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/auth/department_authority.py", - "sha256": "29f23607e37228874cb979cc77d6876cb12c729edd83e9bbf5d493a2aad22e2a", - "bytes": 5708, + "sha256": "eebd0d4a2ae373397b0f57c64d493e819b1c384745d8b69c38ffee27567a8bf9", + "bytes": 5568, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/auth/dependencies.py", - "sha256": "8f1383e2a53f5b4c8f1953b16afc2c3ee7265e5b019e59eb66982781fd997168", - "bytes": 9676, + "sha256": "11b34337c1eaa72d19aef80df3fd0c43f6967765acc2477be3e84bd391adf934", + "bytes": 9436, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/auth/desktop_session.py", - "sha256": "7e0afb097a616c6a7cd2d849cf19c5492f03eaced768cf22c62c8a09224a1deb", - "bytes": 5466, + "sha256": "f44bc0ec3cd57ddab8f60d9890e7513d975e4bf19df2848abf4d36fed1b04a0f", + "bytes": 5346, "routes": [], "models": [ { @@ -6407,32 +6407,32 @@ }, { "source": "backend/townlight_records/auth/manager.py", - "sha256": "084693e045ce0b372cdc9d8f8876b5157bd986efd2441960fe99587b9ae7c322", - "bytes": 1806, + "sha256": "9b620e7fb299b77376ed8fba604c8832622cf9f50abba3d4df04e535c7b6efdc", + "bytes": 1755, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/auth/native_identity.py", - "sha256": "7af0c7ab99fa521182e45a4751226f287f82a561d3f8c75fc946341aa3bd3a78", - "bytes": 2187, + "sha256": "bfef8b1b166fee96fc3274d77f27f9a03c441b3ceab9a0a54a09fa7f3ae5fb99", + "bytes": 2151, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/auth/router.py", - "sha256": "85f0c1ed229ffecbfb44f0e431e208e5c9dfa6d93e506ee1c6ce38aaed5766f6", - "bytes": 1256, + "sha256": "7fdeb581a73c089ef105409fb81071a4812d8cef9f1c8ab04af508b0932429bb", + "bytes": 1236, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/auth/suite_session.py", - "sha256": "619bcec9da9202cb710ec2ee2390931dcf059230cf77dbafd7a56eadf2d4d902", - "bytes": 9870, + "sha256": "35878a40c258cf35fcb7f0c72220cae9b19696fffb897311b0ed461d08866f9e", + "bytes": 9619, "routes": [], "models": [ { @@ -6514,16 +6514,16 @@ }, { "source": "backend/townlight_records/catalog/loader.py", - "sha256": "8f4dd60317e034e7bea3b2099a0bcefa31b1bfe4227abd7e338da39cf843bcd0", - "bytes": 740, + "sha256": "693691a738481639d7a5b04277380e8c4577c11348e1af74ca9bee5bc10bc617", + "bytes": 723, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/catalog/router.py", - "sha256": "4c70d6a6ab91e2f3d0fef8c7106dbb37d9aa5097645143efcdbfc7eb60509678", - "bytes": 1719, + "sha256": "37967e44514a8b44488abab6dffec84c093a002122b064fdb5e9565bfa4c8532", + "bytes": 1689, "routes": [ { "method": "GET", @@ -6563,8 +6563,8 @@ }, { "source": "backend/townlight_records/city_profile/router.py", - "sha256": "6c52879ffdaa3cc1064a4c4706e65fd102a9eee574a27eac7a69f6d0566d2bb7", - "bytes": 3731, + "sha256": "9d342437e619a9f0d4a68a43f78e26fe3600039e10e737a6b713d6fafdf2720e", + "bytes": 3629, "routes": [ { "method": "GET", @@ -6590,8 +6590,8 @@ }, { "source": "backend/townlight_records/config.py", - "sha256": "4f64a49ba5c4a4ebe87ac89ab65875121e416fcc21e76c8ed675bba0e7c0fc87", - "bytes": 5871, + "sha256": "85a45bbcfdd11a4b2c406a1f4297495b2e594e8ba758b5334aa0c1421171428c", + "bytes": 5720, "routes": [], "models": [ { @@ -6733,88 +6733,88 @@ }, { "source": "backend/townlight_records/connectors/__init__.py", - "sha256": "9b4171a560153689a6f3035e04488a64a7d2d3737f4c9b022861d63f4fb6c9a9", - "bytes": 1007, + "sha256": "f48605ce4df0c36108b3535baed864c459c1ad1adbd64999ce6891951e7f2cd7", + "bytes": 978, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/connectors/base.py", - "sha256": "6c3572d2dc3b25f164128d7afb03e61404c6ec9c9d48fabb58cf0e5379775dcf", - "bytes": 2311, + "sha256": "ed086fb5badf04037dde09743e26fe2d84baa11c73e7e9e7cab0ff827558d16b", + "bytes": 2229, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/connectors/file_system.py", - "sha256": "91ce9a5a885b84047004370fe100708865149330ae16da0fc3d55751126fe834", - "bytes": 5185, + "sha256": "3dd7e23ba4ffd44e1c5bd7fd673eb5a7de7e4dcfe69699962a16b86dd07da8e0", + "bytes": 5034, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/connectors/imap_email.py", - "sha256": "6f0f3d997589d65c4b49d8841607c746387e9e446a632a048d757e648e7119cc", - "bytes": 12290, + "sha256": "35b00b0830b65fe30ddb7de12033113d66b3017c2a6076d87181520de14454d5", + "bytes": 11967, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/connectors/manual_drop.py", - "sha256": "9634d200ed3675eb33c9ccdf47aec5f1f77cc190b9e3d19e84ec11973abb26b8", - "bytes": 7967, + "sha256": "4d6f9de6ea42312430c35837e2bccd79fad424ca005d9fb0d4694b9cbcedf308", + "bytes": 7743, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/connectors/odbc.py", - "sha256": "aa146a1e79f99bb5e34c95c17cd6388807c5a4237efd2b4454ac6e8e8308e3de", - "bytes": 9537, + "sha256": "d8bf52b4e95a1b8d8afa9e01e7204d1181a696e77a982d5abca05596c52db6d6", + "bytes": 9272, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/connectors/rest_api.py", - "sha256": "316af4c35a98267c84c35969afb51804cb19251a9c8b7505211840929e39114f", - "bytes": 13235, + "sha256": "8dabc4e6183aec36b577aecdcc38360db14f92ff231124b6e69e9d27655a33af", + "bytes": 12889, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/connectors/retry.py", - "sha256": "41d845b0020b8df86c6838368b01830821c468cb5ecd631dca562074067c4806", - "bytes": 1298, + "sha256": "18d7898c9ca453e6252ece561c066f4e78dcdc29c5593fb109c0b2c17b2840e5", + "bytes": 1248, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/database.py", - "sha256": "a82e34395f940bf9d9ccf476b6585a220e23028d15050bbbeb12340b168a2793", - "bytes": 992, + "sha256": "76eb8e6b44205583d894f55298ac6326cb73c2c760b63816ced9ab050d7dc74f", + "bytes": 968, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/datasources/__init__.py", - "sha256": "e2821093f99faacc298a371e1a5269722f13ffee98c8112f9090ca2690ed39c4", - "bytes": 113, + "sha256": "a668ff03f31a0898f099bc0b03a6f5d64eed2bc088786db331080d3d93b759a2", + "bytes": 111, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/datasources/router.py", - "sha256": "63ac5050984e6b35efef6374050b294a9b2fcbb64fd4ad2302eda33062af66b5", - "bytes": 17257, + "sha256": "f4e7fa1448f43d44df03c525cbd6580fc857e64f0effbb0bd078a050c6c553db", + "bytes": 16879, "routes": [ { "method": "POST", @@ -6959,8 +6959,8 @@ }, { "source": "backend/townlight_records/datasources/sync_failures_router.py", - "sha256": "49a80a2a4516476d7b7996076667f5eaac93e2ec7739a0567d529471f20b607d", - "bytes": 5440, + "sha256": "0676115237b186ac1800c0cc75ea361c3fda52f81af48f3936dafd1112d39305", + "bytes": 5291, "routes": [ { "method": "GET", @@ -7018,8 +7018,8 @@ }, { "source": "backend/townlight_records/departments/router.py", - "sha256": "ae8357aa76ef96d76d42a176fd862fa854cdf01897a05517147386678e9a024b", - "bytes": 4453, + "sha256": "0ef7da6319abe8c19552e79004503e7a68f07e6d8755dddc0c54168f0665cd9d", + "bytes": 4328, "routes": [ { "method": "POST", @@ -7065,24 +7065,24 @@ }, { "source": "backend/townlight_records/desktop_bridge/projection.py", - "sha256": "b75009be22c4cbfa916303d711c5300e132121b36fba3775564f9b1c8893eaa4", - "bytes": 10584, + "sha256": "bceb8a702b1a42f00792fcc3f5c525a52e3bc5de55d7dc793bd0ba05cf1436e0", + "bytes": 10436, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/desktop_bridge/records.py", - "sha256": "428bb99456414f4d7a4c806aeb2e360a7c48450b41b8af4bc24a35574f370c15", - "bytes": 3548, + "sha256": "589903889eda8fd0081d30185c3e8428b9d2ac1daf25a3278432d4265053e6df", + "bytes": 3493, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/desktop_bridge/router.py", - "sha256": "1b1cb6afce568f1ab81c991396ac27684eb06b11b1a0ab37192a8c9382c533fb", - "bytes": 33950, + "sha256": "a7bac9443fe9cc93ac0949902f01aed1ba501bda1494535e90ddd660c7537494", + "bytes": 33322, "routes": [ { "method": "GET", @@ -7335,8 +7335,8 @@ }, { "source": "backend/townlight_records/desktop_bridge/schemas.py", - "sha256": "d7bbbba21363b6b997d92011653010ae9a63c2be0c81844d7527068ac3435237", - "bytes": 13499, + "sha256": "f200aa93d3ee20fe866ccae7c2827500b2dfc24b6f1763994a4feefa430b9194", + "bytes": 13013, "routes": [], "models": [ { @@ -9053,8 +9053,8 @@ }, { "source": "backend/townlight_records/desktop_bridge/station.py", - "sha256": "4cdb8465053f61d2e63477a028b880d3524e4e37da0d99781ca88d616cc0b1b1", - "bytes": 9588, + "sha256": "b623472558d71bad1d09770a0aec3e193189afc00834db7c2f5132166966160b", + "bytes": 9420, "routes": [ { "method": "GET", @@ -9099,16 +9099,16 @@ }, { "source": "backend/townlight_records/documents/__init__.py", - "sha256": "74e2f6fddd8fadac3833b72a02396e5cb3c4d3d91211437e23005ecd24de61f0", - "bytes": 107, + "sha256": "d965567fa1db555b3a30c8df7d2255f40bf8d7c8470e4df0448bdbd294307e9e", + "bytes": 105, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/documents/router.py", - "sha256": "ade31f62c2483692bde64f5d009ba855d91fec8d34fbb5da9846d9689cd2d312", - "bytes": 3661, + "sha256": "ec6ea14b7e94c3f9ee1fb037599d89d79d3b07f32ac6f513afe50f23ea29dc10", + "bytes": 3594, "routes": [ { "method": "GET", @@ -9142,32 +9142,32 @@ }, { "source": "backend/townlight_records/exemptions/engine.py", - "sha256": "30b4bf307d9572b2c56492d6e3485dc8db083df47f20ef66d738cd3d01394e3b", - "bytes": 3197, + "sha256": "3ff3aff822f3599cc47835facecb6350516aa8c477f450fbf2cc14f6b09e943c", + "bytes": 3108, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/exemptions/llm_reviewer.py", - "sha256": "7af32fc1ed813d1ca2781261840b2004a5f7b641313fe93690e41ac7415a3cda", - "bytes": 2412, + "sha256": "fda45ffdf9e2e5311ba861e8deaa06f05683e1f749ded217992781f4d046321e", + "bytes": 2341, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/exemptions/patterns.py", - "sha256": "5f5ac114245cf4654be3361430d04f868be5ece128e07f15899d25c40eec3cb3", - "bytes": 600, + "sha256": "30629dcb185a31b4a2154f76e9d999f57c90454987ca678878214e2bcdc09686", + "bytes": 585, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/exemptions/router.py", - "sha256": "dc0cb9be6e398cba564196759232160ac1ccdb487163c0802e5eadf3201bd67d", - "bytes": 23419, + "sha256": "4d4c309b0f8114e8e7d2422a49d89851952038f39b12dc8c15ad61b340a31494", + "bytes": 22784, "routes": [ { "method": "POST", @@ -9333,72 +9333,72 @@ }, { "source": "backend/townlight_records/ingestion/__init__.py", - "sha256": "9c3fae7acafa2a6bf5606c309e174f71843ecd5ab7664fff292c26f821a73ff9", - "bytes": 279, + "sha256": "0ab29f8f57f94a3cde414589de02d132aa5bc22f6ccfb2c2e8b0deeaf45c6786", + "bytes": 273, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/ingestion/cron_utils.py", - "sha256": "88fbff0706981ef7cf13a653e5e4589062f2f24e043a570f3c6edf37fabcbfcf", - "bytes": 342, + "sha256": "3a1bcfd1160d91a65a0d698f0ed564b0e7fde945f6ce7acc5c80b5444afa8108", + "bytes": 327, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/ingestion/scheduler.py", - "sha256": "3520c77698a46e84c731f486f0173c4158405f5bce73ce8f58c2ae6d759783d0", - "bytes": 9379, + "sha256": "2785ffd3ce61598552484a23096ab5799962fc4fab73741f417b06687ab63d5d", + "bytes": 9148, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/ingestion/sync_runner.py", - "sha256": "7c987cafa060cfc2b1071c5a9ba2bc27fe3b567be8a03280490de0ca3c02228c", - "bytes": 10324, + "sha256": "398486fc22c6f2046c192b84fc431d77fd465948470813476e891d0ef4e662f2", + "bytes": 10064, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/ingestion/tasks.py", - "sha256": "14e604c42d3c04490750b8fe2b2e3947328683af8de7dc7e7cfdbbbcd547e5d4", - "bytes": 9094, + "sha256": "47241e214493285b27110b630f8d935001272c5d014814a974b04b9affab482e", + "bytes": 8847, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/llm/__init__.py", - "sha256": "3fd0a698f594b821b7cc3fbb267513521ec3dfcc026ec89add8a6d5072aea8d3", - "bytes": 3626, + "sha256": "d5c2bf96068a2fb2fa7a51de5167527946d31416eaaffc6e58ad2576160ccadf", + "bytes": 3497, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/llm/client.py", - "sha256": "99a211bbbb594681364b9941ca9adb2fc54ceaaaf3f210f63a62d1108187378e", - "bytes": 4660, + "sha256": "1bbd60c382a294fa397056ee8eba1c721d22c4920d8965ab75c3d7ba4552843a", + "bytes": 4531, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/llm/context_manager.py", - "sha256": "0353251e35fe1ffc3ce372db9086effca688e684a39fd04b7a33a3ecb459d058", - "bytes": 2705, + "sha256": "9c29dc5bf3252fde1db3ca89eaac950a9b4bb7490d8ec7fd0b5b043d89fb2c70", + "bytes": 2630, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/main.py", - "sha256": "ab9eaeb2e79b64a37f8ff54315fe53a08c7be8be29ad1398b535a184688600d3", - "bytes": 11777, + "sha256": "9daff4d0c0375eefedc6f111e83215c206d0379115eae306b80ad4862db08c3f", + "bytes": 11505, "routes": [ { "method": "GET", @@ -9433,16 +9433,16 @@ }, { "source": "backend/townlight_records/models/__init__.py", - "sha256": "14747da85c6ac8c0648b8bae81ba4369d13875757a40e721fb5215a3fa9b6027", - "bytes": 2908, + "sha256": "b94c6596e474b57202a3ba34b397618fd778de0f7e9c1251fca05c5a1d763c5c", + "bytes": 2860, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/models/audit.py", - "sha256": "9e489ecadf8d3c4635f177350a7d4a7407542b92fea08360fb811c9616d5b663", - "bytes": 1260, + "sha256": "e6d8d76b08b0c140baa900fc9dcec7f5e0aebf49b511ab95f6d2527568ce293b", + "bytes": 1229, "routes": [], "models": [ { @@ -9509,8 +9509,8 @@ }, { "source": "backend/townlight_records/models/city_profile.py", - "sha256": "a5a82b73398205fd303c2430fa31b9f5f67b21bc47f47f3a710618cbe6735b27", - "bytes": 1760, + "sha256": "fef3815f77f37e99ba8282ece446ef7d690193a04ad7be84dd3c0e4f94b1944b", + "bytes": 1724, "routes": [], "models": [ { @@ -9597,8 +9597,8 @@ }, { "source": "backend/townlight_records/models/connectors.py", - "sha256": "d5529083fbe39c77830dcda2cdcdeda0bb655cf447d6a4df9c8dd457a0b4fd26", - "bytes": 2136, + "sha256": "037abcd7b13f0bf04e6a31d4f847cf26c55e18ffef450ddc01232f73b8adba45", + "bytes": 2092, "routes": [], "models": [ { @@ -9744,8 +9744,8 @@ }, { "source": "backend/townlight_records/models/departments.py", - "sha256": "38c905bcca9df892e9d0aeb1e1e7d89789a49449a741a3df071679d7c5b18ff6", - "bytes": 638, + "sha256": "18893948e4a728e1c52c215566cac575b23a830e087a4727a0a649823fbd40b0", + "bytes": 621, "routes": [], "models": [ { @@ -9787,8 +9787,8 @@ }, { "source": "backend/townlight_records/models/document.py", - "sha256": "5c3594b8d9b9e6a7124e9dd4cc7c03f5786110608acf6945680efbf49c6e829a", - "bytes": 7997, + "sha256": "49d34006fc4f30fc665813fc9fddde6f36dfe6ff4f283652f9abe4f0c429c795", + "bytes": 7841, "routes": [], "models": [ { @@ -10078,8 +10078,8 @@ }, { "source": "backend/townlight_records/models/exemption.py", - "sha256": "754ec1c88d23535bb2ed6538d3d42e3062fc9e81d69e2b63edebaf3debad3c5c", - "bytes": 3812, + "sha256": "7de68704ece7bfa6789d10d300bc91a7f31abd159773b3498227979191e5423a", + "bytes": 3735, "routes": [], "models": [ { @@ -10279,8 +10279,8 @@ }, { "source": "backend/townlight_records/models/fees.py", - "sha256": "25eeff4b1e8180fdf218dc3382fefea2b141f851c2b9fdd84f01157079c795c2", - "bytes": 3103, + "sha256": "e0bd413f6c8b56edc7f499258adea768773c1602eb2c3eb9e26534df4937058e", + "bytes": 3033, "routes": [], "models": [ { @@ -10465,8 +10465,8 @@ }, { "source": "backend/townlight_records/models/notifications.py", - "sha256": "12ca15c1d16e951ad550f8a2f57e196ea122e65f80e6ffa51622e4aec25910f1", - "bytes": 2140, + "sha256": "48f28a201b6210f89c9f267746134c173bdb782857b28179fd2370430c11816f", + "bytes": 2093, "routes": [], "models": [ { @@ -10602,8 +10602,8 @@ }, { "source": "backend/townlight_records/models/records_artifacts.py", - "sha256": "b1a5d007e9631a552859eae35eee34680a7366be8c2b96cca1e78c2c163feed8", - "bytes": 2142, + "sha256": "f849121ff76c6ff91c633b44601e31c61cdd60256fbb1a68b75b7f66d42cec29", + "bytes": 2103, "routes": [], "models": [ { @@ -10754,8 +10754,8 @@ }, { "source": "backend/townlight_records/models/records_evidence.py", - "sha256": "19b70c91e104240516583c37143e7926d66d891214e321eb57b9831a8a92435b", - "bytes": 2430, + "sha256": "3a46d35439e13ed254bd2b0fb2ccfc0feaccf76406ca23ec07b34f3b3e9830cd", + "bytes": 2376, "routes": [], "models": [ { @@ -10881,8 +10881,8 @@ }, { "source": "backend/townlight_records/models/records_files.py", - "sha256": "f09db07cce4a4bc8223c9e6dbedcf7dd5c6fc6a0aefe4b9db6468ece30310253", - "bytes": 2003, + "sha256": "992bb6ef2e90fb92c86d76d6482429b8a53e82fe9e4354015988b7046824b656", + "bytes": 1961, "routes": [], "models": [ { @@ -11023,8 +11023,8 @@ }, { "source": "backend/townlight_records/models/request.py", - "sha256": "928047bcbe719cbe6e007b7bd77c30325b467a3bc5d46aec367dac0b40b41653", - "bytes": 5826, + "sha256": "bd7a7bd4ac5609a296743286b5f8c66a452bdda5d14e1d8ffb548964d000e553", + "bytes": 5722, "routes": [], "models": [ { @@ -11309,8 +11309,8 @@ }, { "source": "backend/townlight_records/models/request_workflow.py", - "sha256": "77d4ac696507834c2e2bbc73c025a48988af29189930072c7d3a4240574df6f4", - "bytes": 4059, + "sha256": "d4f6e94c62dc8854d689ced4eaa567222bc6a15281d62fa762e02c3e3d05ed09", + "bytes": 3965, "routes": [], "models": [ { @@ -11549,8 +11549,8 @@ }, { "source": "backend/townlight_records/models/search.py", - "sha256": "64caa51b723290050a78027fd5de3667d214cc24dce5f3dc250f9a3ce4588bf6", - "bytes": 2764, + "sha256": "f7e13dfc5a1597cfca4c36ac4ead7d61a96dbc28549c71e8b17ab9de32a1a388", + "bytes": 2709, "routes": [], "models": [ { @@ -11715,8 +11715,8 @@ }, { "source": "backend/townlight_records/models/service_account.py", - "sha256": "a6a9b3d1735156d13603ed3128723a1fb5985795ab6e0919c450a4e63824c3b1", - "bytes": 1074, + "sha256": "399cacf49219e3bd5831fb80c3bf341d145a022c993210e608aab58f19c84f99", + "bytes": 1045, "routes": [], "models": [ { @@ -11768,8 +11768,8 @@ }, { "source": "backend/townlight_records/models/sync_failure.py", - "sha256": "c5feb986cc08f3fe85f780170741213efc12740cf561f174a003cf9a5eb3cbc2", - "bytes": 3057, + "sha256": "86d66445999e5e014597025fae4cbb8e2e0ae7b2465c8875460ca2d796f31d08", + "bytes": 2991, "routes": [], "models": [ { @@ -11962,8 +11962,8 @@ }, { "source": "backend/townlight_records/notifications/router.py", - "sha256": "adf8fb319f45c2c1bf6b9580ed3b918ca8a74f56dfd1d36d621b2de2ae4d57ea", - "bytes": 4369, + "sha256": "130b3bbed48942a299b63a545614c430196adce2cb92cb9bd04c2f592f695350", + "bytes": 4241, "routes": [ { "method": "GET", @@ -11995,40 +11995,40 @@ }, { "source": "backend/townlight_records/notifications/service.py", - "sha256": "6c7e33ddb59503ebcd530df56efee8d26a31b4b3c1a95c0c238eff10423102e4", - "bytes": 3160, + "sha256": "b37376802cbcd52fbe0df5795c0ac4ecb87ea16188376d4dd91ce298954d643a", + "bytes": 3063, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/notifications/smtp_delivery.py", - "sha256": "084b7b456f9f665b67f55d3789e0427b2750c7f3b343de1be718acc0e79f4f6b", - "bytes": 3599, + "sha256": "2a0944ca9e3764a9d0d960dab11cd00350baae72a10c773d76d5da161abe14ea", + "bytes": 3486, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/notifications/sync_notifications.py", - "sha256": "6bbd902f3bd5344014e3a641d082e87ed59a316f6d8c26f7981dcb7abf2ee8b0", - "bytes": 4457, + "sha256": "bc0f850a3a4917d31ca6206afaefed8fd01f027463d9b5e897e24a455907c74e", + "bytes": 4352, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/onboarding/__init__.py", - "sha256": "fd55411077ca22c07b7f527df218bc85624000d5c3699cfa8fe341a86b125ea4", - "bytes": 112, + "sha256": "b78ac1f75fa52dbb3917bd974de34251d0bb789a0e4ab49cb3b86281a9dc5e7f", + "bytes": 109, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/onboarding/router.py", - "sha256": "dedc72d16f1d1ceab430a8249bca91aca9b72bed92a63e0da4d76a48c2def1a6", - "bytes": 7179, + "sha256": "055b0297f1b271f3f4f74cde815a2810bdea0b659a331940c36b9acff6d3ea5d", + "bytes": 6994, "routes": [ { "method": "POST", @@ -12106,16 +12106,16 @@ }, { "source": "backend/townlight_records/public/__init__.py", - "sha256": "07555697e80697fc9c90de3b9cff2b5c07dfe57210ce0aa82570f34003f11292", - "bytes": 632, + "sha256": "f6ab4195b2ee18c82217b243977f509511f96446d7045e511f3e0bc02bfc7855", + "bytes": 617, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/public/router.py", - "sha256": "127bd6046eada11ea0195f6f9c7489a16343ff55a417b8d8ecf84e511028d46f", - "bytes": 6923, + "sha256": "d35e0140761eb251c4628404be96d88f8e973d92d5eb9b9cd2a813ec8b33de0d", + "bytes": 6746, "routes": [ { "method": "POST", @@ -12178,64 +12178,64 @@ }, { "source": "backend/townlight_records/requests/__init__.py", - "sha256": "474d14c31d2bb164d90cd89a4982df6987e0c15fb8ed8f663cf112fb03332b8f", - "bytes": 104, + "sha256": "9a54bd87df3f95dc7f9076d04eae7fa1ceb1c5a6b948f876d6d45a5dd632d5c3", + "bytes": 102, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/requests/artifacts.py", - "sha256": "86793936796cb95d48b7775d2f942cca7e5cca77dde0c8d022221b41b6cf4e22", - "bytes": 12278, + "sha256": "01f049db7a2e4bcfdfb969cef1fe7c52fff2110ce0745e5ec370029dc4d955dd", + "bytes": 12085, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/requests/deadline_check.py", - "sha256": "6244989403cc69f8cc89686d5e8664e3c580fced03ca793704a2397e8987d332", - "bytes": 5055, + "sha256": "cffacba43397c71c37f23861e94e3f119e0ce20739c3a452fe7a1e62e21a0a0c", + "bytes": 4913, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/requests/files.py", - "sha256": "af54c3d331dc1dedeece351d2cd07ece06c1c6e1295bbb42315eaf4503752da5", - "bytes": 7540, + "sha256": "2b614d73d95412e4c6c2efcaeb47329dd31f94b04e622d724f040b02206e7d5b", + "bytes": 7413, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/requests/meeting_sources.py", - "sha256": "8b1122476099897bd85c0a345a2fe8ff21e1d60962c0b9fd0899956359fa76ea", - "bytes": 2609, + "sha256": "a7fb91ccf70b14d4f44d3d8fbf3c424472b3c9b7dfce40baa5fda0021262392a", + "bytes": 2565, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/requests/native_public.py", - "sha256": "926db3331f9606977db57b36301521dd462cc5e6a5436425979734678e77ede7", - "bytes": 6497, + "sha256": "f91dff13cf10e83ead20fff71350b88b9d1ffd5685addf95b39d7e60b9ecc1b2", + "bytes": 6398, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/requests/planning_sources.py", - "sha256": "4ba709347e0a34b24664d7890aaed2d6de8800d73520eba65a139700749f8dcb", - "bytes": 1920, + "sha256": "34f8e3c602ac055998d2284a1aa137acf2c095bd601be1912a8cae58431b244d", + "bytes": 1877, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/requests/router.py", - "sha256": "ada18d3fcc66780a458764bf34c50d546748accd9791bd83edb5b95e4299968f", - "bytes": 48717, + "sha256": "3e3e19e8745ada0d7f12b30cf4647b68f03c3c4d339adc7f9e7a09bfee503978", + "bytes": 47422, "routes": [ { "method": "POST", @@ -12528,8 +12528,8 @@ }, { "source": "backend/townlight_records/requests/service.py", - "sha256": "2e3d98c29dad218f7a32a1eecf013170071413a246d21180426f0fdb2a6e275c", - "bytes": 5015, + "sha256": "19f551f1e6a1d59dffa73882f27d969ebcfa332f0facbc27eb0f52ec379e057e", + "bytes": 4901, "routes": [], "models": [ { @@ -12589,8 +12589,8 @@ }, { "source": "backend/townlight_records/requests/workflow.py", - "sha256": "fbffbf4434cdeecd92d3828fa92690360f01fb809f1f7aec501d42aef56d161a", - "bytes": 18267, + "sha256": "a24b778478842a46c92881520b5f89915e5e4d7b378c4e5a62205d79ddefdf15", + "bytes": 17923, "routes": [], "models": [ { @@ -13023,16 +13023,16 @@ }, { "source": "backend/townlight_records/schemas/connectors/__init__.py", - "sha256": "726eb96cca0ac51b015962c6574003a61edc9d81ad95c486d2f102749aeba0e1", - "bytes": 388, + "sha256": "e810b66c8e6864e36ffd67ee3aad8ebd317f3e582bcb7324054a474877ad9cfc", + "bytes": 376, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/schemas/connectors/odbc.py", - "sha256": "7f90488d1774fdb632ed8a70cf34567966b823dded7e4ed49b71c66cd7cff2cf", - "bytes": 2296, + "sha256": "c7de3396be203d6662021594e8832a83238b971517a6799858d6abb96ea5d5f0", + "bytes": 2234, "routes": [], "models": [ { @@ -13089,8 +13089,8 @@ }, { "source": "backend/townlight_records/schemas/connectors/rest_api.py", - "sha256": "26bc9b8c7f3cd8d4bfdd99114486bc7b0aa926f42af3aba73754e4b8d21d3db7", - "bytes": 2769, + "sha256": "3a4a44256c947f9cfd5e855734b974e06ea233e63bd75eb471b7a2bf95c4f66b", + "bytes": 2701, "routes": [], "models": [ { @@ -13338,8 +13338,8 @@ }, { "source": "backend/townlight_records/schemas/document.py", - "sha256": "372c267701130f9e9a3e73833b81514f2d8753abcfe91f5f546ce919534b180c", - "bytes": 3191, + "sha256": "8315a2db8c80ed3e88eabbf3f20aa812dc2a718062649f17883a8a019ebea95d", + "bytes": 3086, "routes": [], "models": [ { @@ -13680,8 +13680,8 @@ }, { "source": "backend/townlight_records/schemas/exemption.py", - "sha256": "ecdb2535bcbd322b3e356d21207c59f461b83dbfc7e1bb5e13e30322698f24a4", - "bytes": 2352, + "sha256": "080f62d0983e9b963642825f103763546539e376103ea2a76d97403af1852d1e", + "bytes": 2250, "routes": [], "models": [ { @@ -14374,8 +14374,8 @@ }, { "source": "backend/townlight_records/schemas/request.py", - "sha256": "d98eea27470287dc25498bce26cd6e2594b812585113428b8647d8f5ce1e0980", - "bytes": 4229, + "sha256": "9401f0d615ec19ad924a4462fd585a307a082b50cb5d3603243055ca9475432e", + "bytes": 4071, "routes": [], "models": [ { @@ -15202,8 +15202,8 @@ }, { "source": "backend/townlight_records/schemas/service_account.py", - "sha256": "0fe0918fc3daa11c37d371119d8a875c6d9061f82f005517efade03b19ec4210", - "bytes": 721, + "sha256": "5152440ecb59e762b01aa250e39c51da4dcc13609d043d5252a87fc5bcc6812d", + "bytes": 689, "routes": [], "models": [ { @@ -15434,8 +15434,8 @@ }, { "source": "backend/townlight_records/schemas/user.py", - "sha256": "313f8c6927c142239ccfd22d5960378a77bb973a84e7c936052d4a77ae3507b5", - "bytes": 3200, + "sha256": "49b00d3f0c0892a19ff6c0f0aeb5ccb75454b8790e94e01baa87028a5d1c8bc1", + "bytes": 3115, "routes": [], "models": [ { @@ -15566,8 +15566,8 @@ }, { "source": "backend/townlight_records/search/engine.py", - "sha256": "64f383a27cdafc56c200a352fa29dc9548fda0bbf61e1a45a67fb80f649d48ec", - "bytes": 5570, + "sha256": "3424069afa3f6e9549ef32117572c962fa7a2125e5114e1bb86d52863f5afd9a", + "bytes": 5416, "routes": [], "models": [ { @@ -15627,8 +15627,8 @@ }, { "source": "backend/townlight_records/search/router.py", - "sha256": "52942b33b4869a3c22ed9417723e1854a69161bf4dbaa4deeeaaad16cdd4eb65", - "bytes": 10957, + "sha256": "cdd634148a3d7107639165d662064f8b7d792d6b90f50a303eb559054a93b0ba", + "bytes": 10639, "routes": [ { "method": "POST", @@ -15666,8 +15666,8 @@ }, { "source": "backend/townlight_records/search/synthesizer.py", - "sha256": "a29ee927d6f8edf0cab05acd4d3dd523455e2eabd6f500af164d31e0372f73f8", - "bytes": 1908, + "sha256": "1662b1fd650a38977cc6f615a4ced812c9ce35014d8e97ddd047b2bb475ffe1d", + "bytes": 1857, "routes": [], "models": [], "configuration": [] @@ -15682,48 +15682,48 @@ }, { "source": "backend/townlight_records/security/at_rest.py", - "sha256": "63ecb19f92893043fd7ee5619a8ef86a8f37642cd009f4660288e9ef4f2852dd", - "bytes": 1021, + "sha256": "46d8d6c6d0f845b5c9f81822c0a005c91be7e5bbcf2f0822d7977504b2650674", + "bytes": 984, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/security/host_validator.py", - "sha256": "dd87585491ae8c118c2cd80127a297bc28e60e9015fd573251af393566b1320e", - "bytes": 710, + "sha256": "3cc56d3da514a77e5d58a0aadda73c8bc4fd1e3d4b3d8e90535415d19673c023", + "bytes": 685, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/seed/__init__.py", - "sha256": "bcc25a55282ceffdac66ff70179d6a3dd07cb4333c89d568f98cc2204321e1b0", - "bytes": 317, + "sha256": "07f09ddf8340426b50a62079ba3f4c3a5c39e0f7d7ecd7eea2b58869dbe894ae", + "bytes": 308, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/seed/first_boot.py", - "sha256": "40b50e2e4b7f6d90f4ca2ad8fc753e4e2cf32a72b74580136ee570a5d19369ac", - "bytes": 9964, + "sha256": "603e0ba6e45fd8d9ca61626bedc95a873fa7877b0ee5d927496bc8477f158d40", + "bytes": 9708, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/service_accounts/__init__.py", - "sha256": "2fa2428653459da5eb92239760502d74190c9183dcade5b408ec89f25bdcc040", - "bytes": 130, + "sha256": "0841a6b6c6baa3e4ca3f6068afbba63cbd13d47e302f503a9469bf0d87e75cd7", + "bytes": 127, "routes": [], "models": [], "configuration": [] }, { "source": "backend/townlight_records/service_accounts/router.py", - "sha256": "a23f0364a75cfe413b75afc99825023a5e04649bc59f0be8c722da33da7046a3", - "bytes": 3582, + "sha256": "6e557d97718517372c1753e17950a07b48a616d4b6809a802e23bd80fc605a58", + "bytes": 3471, "routes": [ { "method": "POST", @@ -15749,8 +15749,8 @@ }, { "source": "backend/townlight_records/worker.py", - "sha256": "f87595f97cbc50b71ec7f8bbef0733410688b739f5e3fe842212ac9ea4fd4053", - "bytes": 700, + "sha256": "1ed31b7d7550573a0eacd1ba8c1545fdc73bc255231ac708ec30bd0066f0d9fe", + "bytes": 671, "routes": [], "models": [], "configuration": [] @@ -15759,8 +15759,8 @@ }, "meetings": { "repository": "townlight/meetings", - "repository_head": "581ca739e03e7a4d1161cd8c5edf1d36115f9ee6", - "working_tree_modified": true, + "repository_head": "77ae8781f4a414f6f85c35a7e4394e29b0e0f21d", + "working_tree_modified": false, "principal_import": "townlight_meetings", "source": [ { @@ -15869,8 +15869,8 @@ }, { "source": "townlight_meetings/agenda_lifecycle.py", - "sha256": "aae33ddd60b2d18abfdc7cb83ab5eef396b68c882676da3e2fe0eb74d41f23a2", - "bytes": 16632, + "sha256": "eb796e25f98035207c8936277914ebcfbf4f34fdcbbc0a56d3ff0ecb83108160", + "bytes": 17059, "routes": [], "models": [ { @@ -15880,30 +15880,30 @@ { "name": "allowed", "type": "bool", - "line": 40 + "line": 42 }, { "name": "http_status", "type": "int", - "line": 41 + "line": 43 }, { "name": "message", "type": "str", - "line": 42 + "line": 44 }, { "name": "fix", "type": "str", - "line": 43 + "line": 45 }, { "name": "audit_entry", "type": "dict[str, object]", - "line": 44 + "line": 46 } ], - "line": 39 + "line": 41 }, { "name": "AgendaItemRecord", @@ -15912,35 +15912,35 @@ { "name": "id", "type": "str", - "line": 49 + "line": 51 }, { "name": "title", "type": "str", - "line": 50 + "line": 52 }, { "name": "department_name", "type": "str", - "line": 51 + "line": 53 }, { "name": "status", "type": "str", - "line": 52 + "line": 54 }, { "name": "audit_entries", "type": "list[dict[str, object]]", - "line": 53 + "line": 55 }, { "name": "meeting_id", "type": "str | None", - "line": 54 + "line": 56 } ], - "line": 48 + "line": 50 } ], "configuration": [] @@ -16143,6 +16143,14 @@ "models": [], "configuration": [] }, + { + "source": "townlight_meetings/imported_meetings.py", + "sha256": "03c051947b67f3479326b660ee56dd9c762f6f5b3307fa0c22afa3a2e1c94390", + "bytes": 5817, + "routes": [], + "models": [], + "configuration": [] + }, { "source": "townlight_meetings/integration_contracts.py", "sha256": "1d674363f0d07151c19594f8f2fbaa25997a35cad27749508b744238a5e838dc", @@ -17878,8 +17886,8 @@ }, { "source": "townlight_meetings/meeting_lifecycle.py", - "sha256": "8e85facc34e20861bf12bf4787094963057f731d908ba68c8369c347edcaee14", - "bytes": 22805, + "sha256": "2dd5b10a82ff2a51f7d8aa77b615a6ad54dcfe1f4321e08f6df20af1b7611ed0", + "bytes": 23039, "routes": [], "models": [ { @@ -17889,30 +17897,30 @@ { "name": "allowed", "type": "bool", - "line": 75 + "line": 77 }, { "name": "http_status", "type": "int", - "line": 76 + "line": 78 }, { "name": "message", "type": "str", - "line": 77 + "line": 79 }, { "name": "fix", "type": "str", - "line": 78 + "line": 80 }, { "name": "audit_entry", "type": "dict[str, object]", - "line": 79 + "line": 81 } ], - "line": 74 + "line": 76 }, { "name": "MeetingRecord", @@ -17921,45 +17929,45 @@ { "name": "id", "type": "str", - "line": 84 + "line": 86 }, { "name": "title", "type": "str", - "line": 85 + "line": 87 }, { "name": "meeting_type", "type": "str", - "line": 86 + "line": 88 }, { "name": "scheduled_start", "type": "datetime | None", - "line": 87 + "line": 89 }, { "name": "meeting_body_id", "type": "str | None", - "line": 88 + "line": 90 }, { "name": "location", "type": "str | None", - "line": 89 + "line": 91 }, { "name": "status", "type": "str", - "line": 90 + "line": 92 }, { "name": "audit_entries", "type": "list[dict[str, object]]", - "line": 91 + "line": 93 } ], - "line": 83 + "line": 85 } ], "configuration": [] @@ -18177,6 +18185,14 @@ "models": [], "configuration": [] }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0022_external_imports.py", + "sha256": "9543eaeb9f06c4c11f145c20a5136f4fd2f1a38e9a84a55d6fdbf5eb87cde6fe", + "bytes": 1756, + "routes": [], + "models": [], + "configuration": [] + }, { "source": "townlight_meetings/minutes.py", "sha256": "2054ae33051ea48015f65b0c3caee89c3c12d43dcd8536c372cccbf6cf281e24", @@ -19765,22 +19781,22 @@ }, "code": { "repository": "townlight/ordinances", - "repository_head": "53f0314e91d6c41ba073a4f764e95d438038767d", - "working_tree_modified": true, + "repository_head": "22d00f560cc45088a5b24a3f997787ee9c7a5e31", + "working_tree_modified": false, "principal_import": "townlight_code", "source": [ { "source": "townlight_code/__init__.py", - "sha256": "2c43921d2ff34bdcf86cfcbb9eae6733fbb701514ad741e877a0218ca7b8acca", - "bytes": 128, + "sha256": "da8630d6352e6b96a848e8f4878e4f1de0bca10849997f8fbc8a5a05ccfcedeb", + "bytes": 123, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/ai_answer.py", - "sha256": "25e5053a66a4cc9b6bdd943b8d94c67cee2d62fdbcf9033428b4a9bb07dd2043", - "bytes": 3927, + "sha256": "39643fb015bc039bf1d9237940d870e8d4eb5efd2b7ae521f6487079cdc2aa84", + "bytes": 3823, "routes": [], "models": [ { @@ -19832,8 +19848,8 @@ }, { "source": "townlight_code/citation_contract.py", - "sha256": "988fbe7893bf0ec957b2a5f04d8871b2ae9c6c1244e3a2b4a68b491fed942f98", - "bytes": 2453, + "sha256": "0548ba6c018f0104a2cd7868f834e06fa1e355f483ebcdf18c707463e4748ab5", + "bytes": 2383, "routes": [], "models": [ { @@ -19863,8 +19879,8 @@ }, { "source": "townlight_code/codifier_sync.py", - "sha256": "afc3b1ce364a0a77d70d554d29dc3a79e637f82a278ebb8c261082163ad8834e", - "bytes": 24683, + "sha256": "68b373faf51b31fabe5b74fa70d014c5b07e2ef604a3188bed6c19cbfa1eff4a", + "bytes": 24076, "routes": [], "models": [ { @@ -20023,9 +20039,9 @@ "configuration": [] }, { - "source": "townlight_code/frontend_dist/assets/index-aK7NGgo8.js", - "sha256": "2780361ddd2b444b2da05ca9e33be44f7645e83d21f1d28b20e4644229deefae", - "bytes": 198313, + "source": "townlight_code/frontend_dist/assets/index-C7DZW53C.js", + "sha256": "2a400633a89687d9cb75af9e73389fc1b8790b5c9adff5609b54c3c76f20b1f9", + "bytes": 198304, "routes": [], "models": [], "configuration": [] @@ -20040,16 +20056,16 @@ }, { "source": "townlight_code/frontend_dist/index.html", - "sha256": "43202d3699bc76ea94416777ff6f34654f179da57d4e03b5120390239a9578c4", - "bytes": 450, + "sha256": "1f5c7a490f1d057e10e1ba3a3e3349db9e89a3448dadfa6cc8a6be9003047040", + "bytes": 437, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/import_connectors.py", - "sha256": "77ca2b4da579a284ad3212126498fce7df28636e6b5df2648b0a364baa702024", - "bytes": 19826, + "sha256": "b1426b6f33322eda115f4521e30e366fd47271354a8fbc9e2c3b38f5442cc959", + "bytes": 19325, "routes": [], "models": [ { @@ -20119,8 +20135,8 @@ }, { "source": "townlight_code/main.py", - "sha256": "08a9c16106b52ee8a5aeeee6ad00e1721c59e2c27c40d7e83b96b89256a15e3b", - "bytes": 88337, + "sha256": "cd10ec6e6e88d261a3622250c91fb5a28a0643c3c23695cb0aa495b464eaffce", + "bytes": 86188, "routes": [ { "method": "GET", @@ -21171,24 +21187,24 @@ }, { "source": "townlight_code/migrations/__init__.py", - "sha256": "df7969bd664b7d37c15448defbfc1facdeabac4576ebe265dbeb6e4a20bf17b8", - "bytes": 48, + "sha256": "97e4c6f878a88412955103d962c87a132a91591e98608bfda75da2438991825d", + "bytes": 47, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/alembic.ini", - "sha256": "bd5b1e30a38e20eeef817cd43e76fe592f9c13874624b2421a83d52a78e02440", - "bytes": 761, + "sha256": "7e72430d1cba3a660a851cea05dd166b6a525646b016ff16a4533d0afdeeaa84", + "bytes": 722, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/env.py", - "sha256": "a6be395a9afcff83bf1b2334cf1f3744409e12c15f226027249df1a0f713366c", - "bytes": 2408, + "sha256": "85fb6139e9448f0222d42dd986eb2c578952b2393d863cd8f498c7e4c168b303", + "bytes": 2322, "routes": [], "models": [], "configuration": [ @@ -21200,120 +21216,120 @@ }, { "source": "townlight_code/migrations/guards.py", - "sha256": "db594a5a1532e7edc1b68d7c056e5b105e4be028e034ffecc3ba62f8e088124f", - "bytes": 618, + "sha256": "8f5ec1e9e91419ef8ade9cc9aa0a9e038aee33c40db51839063ea11d485c493e", + "bytes": 597, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/__init__.py", - "sha256": "c86c118637e0149a6a9613dc4d6b106a0777add135b92a628ca3a481bceaad1e", - "bytes": 47, + "sha256": "85b958de0aaad7da3406dc5db953e9bc9f05b037c9ef7f48b6a04dd80464693b", + "bytes": 46, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0001_schema.py", - "sha256": "fbaae32609abcfe3b8ac6fe4135f98007fd30c0ed87343acdae133d0de3d17fa", - "bytes": 7349, + "sha256": "34b7966a36f3c9c2487e71bb594a1cc9c2ab7b55873eb220e06cd312f22f80fb", + "bytes": 7298, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0002_source_registry_records.py", - "sha256": "3f4ea306bed500f106e2fb3e3c72a699a9fb4834d0467e4670ae54bfcd806749", - "bytes": 1710, + "sha256": "3c1eb1f99710f99049aeeb0ea99c5609dd1452173f6d2cd5865e802f690663b6", + "bytes": 1668, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0003_popular_question_records.py", - "sha256": "d63be371906b6dbf380391f32892b0c52d9099de8de426a50be6cec0597eca40", - "bytes": 1766, + "sha256": "3b222fcee8ed6e90fe97ed14317663f6e4aad4ba22cbbe0de97386a2e8d42cce", + "bytes": 1720, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0004_section_lifecycle_records.py", - "sha256": "7930b4b319f4328d518c9500b35cb065aea8fe6b0c15eae9fdaf2844f125c0f0", - "bytes": 3664, + "sha256": "0eb1c1e649414ef6c0294cadb3bda1bd88a5aa5d84c9311cda1f80ee26f32e95", + "bytes": 3583, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0005_staff_summary_records.py", - "sha256": "cfa383851d01d6a8c9a19175c36ab1754af06d8ef9151029d7f7b8a1905dab9d", - "bytes": 3264, + "sha256": "410e91ddb59becd677c5c8f3f5399ce18d4de0cc1db774f4d5cea87d8335a581", + "bytes": 3186, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0006_ordinance_handoff_records.py", - "sha256": "82d7888ed0048e5e4b2c79ec4eab96ba223527bc1c5bf264525292fce658ef20", - "bytes": 2283, + "sha256": "1e1716fbf3b3ded908a570ad7b86ddd7336d46bf5a7dd142079f97329f2b5c88", + "bytes": 2228, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0007_import_job_records.py", - "sha256": "0aadb2d3d74e0f8c166e140fa9ded8b549af7bfc00354ac57bf7645e5e5142d1", - "bytes": 1429, + "sha256": "b91ec22e243a6e91cb3c11f840cc30a8d494dba6ae064e56492845260f9a1d98", + "bytes": 1388, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0008_codifier_sync.py", - "sha256": "c0bcc3e99b24e7e4ce2f4a24c8ee2e556b5d7fa77ba55c3627b42b6b7efc368f", - "bytes": 3028, + "sha256": "9e8e8ab239716197c44cf10c95e32e12fe85f0378795fed9e20a0f41f1d0686c", + "bytes": 2963, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0009_operational_state.py", - "sha256": "fd06ecb49b1f75ab7dbddfc2b29cf3a4730f259c4c2d08a35ef42fcc7d65ef5b", - "bytes": 1708, + "sha256": "677f8c6eb734ea631a1f1600bd828ce97e7ca6c9a8d8ccde6970732c078b90fc", + "bytes": 1666, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0010_handoff_resolution.py", - "sha256": "154c2f55ce0b8a5b5d6a301e3ba476f52d0cd6f9757a2821912b4d1c26f5cabf", - "bytes": 1404, + "sha256": "9d7e8aa70c41fc0ce81fbc6f5a55e312d8f849d52990b73b3615aea0109c339e", + "bytes": 1363, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0011_semantic_search.py", - "sha256": "dbf61708c6b5ae68dcc085b528b56fb37be906936d225dcce5f12d359ee2a80c", - "bytes": 1696, + "sha256": "35e450646087a13d52b0352f76988c045c8e4dd6a1225960e92fc0d44263dc6f", + "bytes": 1649, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/migrations/versions/townlight_code_0012_drop_local_search.py", - "sha256": "2665db8af43b4ada8a889cf2745f1e2cd59d69a32e29070650019b035119e290", - "bytes": 641, + "sha256": "c21622f8f55f17712369f721d443694c4f78badbb6a18765a9f82fa6ec61dc41", + "bytes": 615, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/mock_city_environment.py", - "sha256": "13ccb031171bc7bfb0dfea4e66dcf3617559be54eaa4c93c9883bef6050ba5c2", - "bytes": 14208, + "sha256": "96355663485c419d211ce2a51cd272fa7e46f563bb8594da54d530d9c5550b3f", + "bytes": 13868, "routes": [], "models": [ { @@ -21425,24 +21441,24 @@ }, { "source": "townlight_code/models.py", - "sha256": "4e3ae05293b927f6b1ce149abf707af12abb5a4181ddfcc77b85f37e5b5da03f", - "bytes": 7837, + "sha256": "74af3c4b689aeb80bc1fe29d4eb9ce27aa83379498d0fb4b6bf4c4716e5fe20a", + "bytes": 7634, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/operational_readiness.py", - "sha256": "359353d77cf6742700c48f8533149390a9a84daf2a068f71259fb0445d0e4510", - "bytes": 7124, + "sha256": "0e58b5f078c3a6b488e2c52704390dfe925eece65a1f2ac38de14f45b8db5daa", + "bytes": 6934, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/operational_state.py", - "sha256": "cdb7bd2baa6731dafafbf91f054f28cb763fbfd0a65f80905da44e4da66c6c94", - "bytes": 11156, + "sha256": "2388fd085328dd80689590e13e0bc28cdfd22add11b76ad5fe85520fecda8f69", + "bytes": 10852, "routes": [], "models": [ { @@ -21537,8 +21553,8 @@ }, { "source": "townlight_code/ordinance_handoff.py", - "sha256": "3b6c0315d2398e4a967d5c5cbfda07759949495eee24157ed4995a61ca41fe75", - "bytes": 21987, + "sha256": "5bf3f70b066f54b84265fb50ff5b80f5e1185ee1673dfbbe93e669341f519f6a", + "bytes": 21464, "routes": [], "models": [ { @@ -21675,8 +21691,8 @@ }, { "source": "townlight_code/plain_language.py", - "sha256": "c333624bd8677938ed7817055a4f96d46169c147425a05b2972ea696862ee45e", - "bytes": 14321, + "sha256": "30d24e5fef12822ebb55a0679d598a9b19c5b377dc7f6a0d336a9b2f011f899b", + "bytes": 13933, "routes": [], "models": [ { @@ -21778,8 +21794,8 @@ }, { "source": "townlight_code/public_discovery.py", - "sha256": "656e72f672dc2839d58cc4a26252169ba712265533f60ef7b35e11fc6f6c4a94", - "bytes": 10332, + "sha256": "8e596699a51eb0240d756a02955262daee6a2b05f0d2040b225f7f7d3ede612e", + "bytes": 10079, "routes": [], "models": [ { @@ -21859,24 +21875,24 @@ }, { "source": "townlight_code/public_exports.py", - "sha256": "9a8a8a7f9db81da204be0d48a0aa9c50df56363d2d3ff37388460b81a447d372", - "bytes": 6800, + "sha256": "ab1814a57651b726e2d633e6f985ef27640dba1d88ff3c03dd2c7996bbf07e22", + "bytes": 6615, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/public_lookup.py", - "sha256": "15d1d309c6034daade696531c73d5d5d3fbcf48cf459097646b2892422dc38c9", - "bytes": 23186, + "sha256": "2613ea08adb636c254c598839f0313125017dd0d839c6cc684b720b896c89381", + "bytes": 22593, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/qa_harness.py", - "sha256": "db2f1e72367a5c7bd64bff9540bc7c65c6447624e06afc52479da2fc49fde34a", - "bytes": 5986, + "sha256": "22de58c6c28fbdede556bf24064a93c61cac7d131bc67171f47894979de8d6da", + "bytes": 5810, "routes": [], "models": [ { @@ -21906,8 +21922,8 @@ }, { "source": "townlight_code/real_municipal_fixtures.py", - "sha256": "e8e7814607ede1b28e0df15341aa44cbc7dad32a07122e4a08205f7db9dacc46", - "bytes": 10397, + "sha256": "7173b8bce50f5edd0d3cde0aa8d59c38d1fafd2043ca107f1cd3e168ab715798", + "bytes": 10135, "routes": [], "models": [ { @@ -21967,8 +21983,8 @@ }, { "source": "townlight_code/section_lifecycle.py", - "sha256": "51fd91c02b020575641fcfbc1e2529aaedaad796559742b1aad956a3d7fd1b11", - "bytes": 42407, + "sha256": "f60f8588ac994b83b9d870e2a1903c7ac96d4491c4d075f552562bb67a1d11d4", + "bytes": 41377, "routes": [], "models": [ { @@ -22189,8 +22205,8 @@ }, { "source": "townlight_code/semantic_search.py", - "sha256": "21c05a1238ee9b84e68289c4b7f91e631e4c0a66d30de537b589bce1029fa9f7", - "bytes": 3889, + "sha256": "e2d05c838e14b8c8e402911ba0fd117f2b1cd588ae55cb4193662efafcf84d80", + "bytes": 3785, "routes": [], "models": [ { @@ -22272,8 +22288,8 @@ }, { "source": "townlight_code/shared_ingestion.py", - "sha256": "1d16228fdafa8c533a52e528fa9e99e71c9a009099d99e8e6291baa72b14eb5e", - "bytes": 28230, + "sha256": "90ae17af1e68ebe6b478117ff48bbd48d80a64444d6543a1f50cf481dd7d0c43", + "bytes": 27477, "routes": [], "models": [ { @@ -22319,8 +22335,8 @@ }, { "source": "townlight_code/source_registry.py", - "sha256": "4a9b4df376bb2a8456676f95de554ee7508b58892fda9e0342c27186a4740a76", - "bytes": 20364, + "sha256": "dc38ee229c49a9c20dde85032415fb936640f2c04716cf95b5a945251a68e0eb", + "bytes": 19852, "routes": [], "models": [ { @@ -22420,40 +22436,40 @@ }, { "source": "townlight_code/staff_code.py", - "sha256": "5e182127807244627eee862325e0d8f8bf971487727fd7c82d3a7a96cf35a4de", - "bytes": 11716, + "sha256": "b65592bc97f469d45b7eb552885d3973274683d11b3bebde037e76363c6d49c8", + "bytes": 11381, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/staff_imports.py", - "sha256": "25d0008a594aa2292eea2f3a02a5b8e0d0cc46ff5ba5b3cfbda02c99ee308823", - "bytes": 12231, + "sha256": "9047dd8cb8ca38db3275fffd4c7f3f39b316e793f9364da1e44ba01c945cfd11", + "bytes": 11878, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/staff_sources.py", - "sha256": "2e726e0776a086d4395657fa6d76e3254322faf9329b015c023dafeb3146041e", - "bytes": 10334, + "sha256": "0b51db653c7b4ddd13a0874a023f0fcb9914635659ad35146c0f524e5fe899d5", + "bytes": 10033, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/staff_sync.py", - "sha256": "8b8eabf1485a67e877348050645be5d7751d4a0567f3ca3fe404334f230e0b3e", - "bytes": 12704, + "sha256": "6bee5eeb1ea30e959438ccc29a0ed7fd8fa24c86a0cae18dece95fe7ffdcbdd1", + "bytes": 12364, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_code/staff_workbench.py", - "sha256": "542b379f07c9a0ab41f5b002b7eb78b5a193d8c75d011b11bbf683b66b08e60d", - "bytes": 9134, + "sha256": "3b36a390b8b765090f4b4a713f1af82d28462427d20d81fff7930c3a97cfcdc7", + "bytes": 8872, "routes": [], "models": [ { @@ -22540,8 +22556,8 @@ }, { "source": "townlight_code/suite_session_auth.py", - "sha256": "91ee6d997570b8c1e27f3aa2507b1ec005cf2a1bd3e51536fe622d3c03e5a12c", - "bytes": 9854, + "sha256": "e017ae1e25f05cad026d2ab50bd43e1a4f64a02cbf9b027f6f99dec2f4d3691f", + "bytes": 9591, "routes": [], "models": [ { @@ -22573,46 +22589,46 @@ }, "zoning": { "repository": "townlight/zone", - "repository_head": "4d2a77a653e42a17aaea8d83d0b196ba83413c57", - "working_tree_modified": true, + "repository_head": "fb352955720db2e6e21caca816a8eb609a49f768", + "working_tree_modified": false, "principal_import": "townlight_zoning", "source": [ { "source": "townlight_zoning/__init__.py", - "sha256": "c92eb3c3aa9d0fd13b8904cbdc0d75828d3eb4a0cbeaba1165140254ce0889a7", - "bytes": 58, + "sha256": "b73954ba9754bfac2d85f198567731a62ebd80ed0a03fa9d3ab4600100364970", + "bytes": 55, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/cited_questions.py", - "sha256": "a243c3887ee4358698008f4753a4877d17c4179ef7f59672ef06429013ea2537", - "bytes": 12311, + "sha256": "423451e4a73aa1ddcca677b178ef1f26cbf605611ff85d15ceaea372db5dbf76", + "bytes": 12015, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/cited_rules.py", - "sha256": "ed8c7210d9f0fd320713f32e9c06a9ea03c94252ddcced19d4c60edf98c549ff", - "bytes": 8521, + "sha256": "7de34ea5fcc76467a7db4700cb66f1aabfdd49a7d2202e5e9ff9e4b385bf8f44", + "bytes": 8310, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/connected_sources.py", - "sha256": "8bf1acad90f7f66e637a45727fc751a5d74f2c98f893c43f91a41914f8735883", - "bytes": 11235, + "sha256": "a17d5e0563b770b684331d0f89076a1ca6d85fcd13989c3244bfae4d16be2f65", + "bytes": 10921, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/discretionary.py", - "sha256": "cd7afa08af24988604e6e3daa7c2db3f6d9103b64d64cc55716725f9ef50afd6", - "bytes": 10195, + "sha256": "e6410efa9e1f7efe1ec49c221d245f60c47def1faf264f4ae1ac5d571f5c610a", + "bytes": 9981, "routes": [], "models": [ { @@ -22761,8 +22777,8 @@ }, { "source": "townlight_zoning/geo_import.py", - "sha256": "8926ce327572fe40e18e513c04928920a5d14306df6b003fd3e0a466914a5a26", - "bytes": 13686, + "sha256": "9c01bd1d76f48933efdbe9684a0eaed0623a5080a1d7eaff45fc726870062c02", + "bytes": 13349, "routes": [], "models": [], "configuration": [] @@ -22785,8 +22801,8 @@ }, { "source": "townlight_zoning/integration_mocks.py", - "sha256": "a31da986c6165cf5528bf2065ac856d25fdf3576c11e6fed4cf4656dca683bed", - "bytes": 14445, + "sha256": "9d827e7c2f8baa19104f015ebf07b851a92fcefcb03843188eb4fd96ed06300d", + "bytes": 14130, "routes": [], "models": [ { @@ -22870,8 +22886,8 @@ }, { "source": "townlight_zoning/main.py", - "sha256": "90e869902f36672be17516e85aca88a348e37d2942243deb415cb5f6018f7183", - "bytes": 27978, + "sha256": "7975397e3db1531709160982671d6ba9888f247b53c1fc9b9efae57a52402f15", + "bytes": 27247, "routes": [ { "method": "GET", @@ -23284,8 +23300,8 @@ }, { "source": "townlight_zoning/migrations/__init__.py", - "sha256": "5b0db2ee33fc0c4091e615e58fc97420e861a39c50b7a37a090ba8e117c9869e", - "bytes": 43, + "sha256": "0c8c8014cd453fc079968444a7bce43b412e297abc95837e4509e2e6ec48bced", + "bytes": 42, "routes": [], "models": [], "configuration": [] @@ -23300,8 +23316,8 @@ }, { "source": "townlight_zoning/migrations/env.py", - "sha256": "5d437b18f5267667c260fe384f6617648d57d940e2d3a91de05b79aa87598e21", - "bytes": 2206, + "sha256": "87873c274a5c8642714da60445d069a57426cbc6ad87eaa5a61e09258584b8ec", + "bytes": 2127, "routes": [], "models": [], "configuration": [ @@ -23313,72 +23329,72 @@ }, { "source": "townlight_zoning/migrations/guards.py", - "sha256": "6dff39d29a7936155d1bd5e3ff9b84e09548beeff7a031cdf1172a6855128398", - "bytes": 543, + "sha256": "3414c2e2eac17d1b0d7cf1c60e616402f546a5e160d0b65636f540b075c407ab", + "bytes": 523, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/migrations/versions/__init__.py", - "sha256": "6529bd8ce272c2c512ceda3ababea3a9d17dc04e8842f3a7f991657e1c7a8d72", - "bytes": 44, + "sha256": "8c86e3b78a2882de3831625e070d8b6b18a7951ca9484a2a2e59a3f78c4a3e15", + "bytes": 43, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/migrations/versions/townlight_zoning_0001_schema.py", - "sha256": "c0a1010064afac0904ec92314f0c03c6820a360e75f36df523962226008fd2bf", - "bytes": 5813, + "sha256": "3336cb502a7881be08fa6d7178ed13a3310795fe688c0a113957358bb84f09ed", + "bytes": 5752, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/migrations/versions/townlight_zoning_0002_parcel_rule_lookup_records.py", - "sha256": "1a69bdf0eee9bd044ca970eb5ea23eb72abb778dbf313c9c53cb00ca57f374ab", - "bytes": 2733, + "sha256": "e324e24f60be7a5261a096df1662db88c71d2d922d7590a79266053155ad6a47", + "bytes": 2669, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/migrations/versions/townlight_zoning_0003_question_ledger.py", - "sha256": "5161cc3504e7be2f7b59c893d7d94f2fc42ab141b501b01c745c86833d9cc943", - "bytes": 1372, + "sha256": "fe6306f8b8272267bd388c6fbde8434a206df3a832d7e20712f6df60b6d6e516", + "bytes": 1336, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/migrations/versions/townlight_zoning_0004_staff_workflows.py", - "sha256": "a6101844d74baca978f82703ceedcaa817452cb2bcabe20cb6863fdd8d8714ef", - "bytes": 3447, + "sha256": "4963a4f14f04aeea360c98255bf68a53c26ff17f380a9e996877c831e06a6acc", + "bytes": 3375, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/migrations/versions/townlight_zoning_0005_geo_import.py", - "sha256": "e0a14dadd86311b9af7e66c34c33d94ea9b3a2489c59c3b188b870e77ba48c6f", - "bytes": 3920, + "sha256": "9d42bd2bd3a9d81121f49a66a12d93d5aab9bdf257c3229d2cdd9b1cc392120c", + "bytes": 3796, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/migrations/versions/townlight_zoning_0006_cited_questions.py", - "sha256": "5195cf011c8c384b5c0a3b7cf7abc1b3414f59dc8e92a37c5248c6f8dfada527", - "bytes": 2398, + "sha256": "4c8b47cfa2cc6d922441ed890f81b425b6de2d11eaf187c119b1d3d93a96cf2a", + "bytes": 2333, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/models.py", - "sha256": "bdbc7553151a8bd14d24bd9f50a929087a08fa9ce8a17cd8398cd665753aee93", - "bytes": 6251, + "sha256": "b2035f735973276ae4a59589f265ee6577a52712308ebb9997e612ca1d3f64b8", + "bytes": 6115, "routes": [], "models": [ { @@ -23825,8 +23841,8 @@ }, { "source": "townlight_zoning/parcel_lookup.py", - "sha256": "45703bbce2f91f8c6f2b86b3571314d6bafeaf58ba6965b6a7e9c7e3b01b925f", - "bytes": 6367, + "sha256": "cdda2c097574d5c94f57f1620e79b2763c2ad245e1dd3553b68606f54d1d1f0b", + "bytes": 6203, "routes": [], "models": [ { @@ -23898,16 +23914,16 @@ }, { "source": "townlight_zoning/public_ui.py", - "sha256": "494537866bf7b7198eef0cefa59d83c8ad6608ccc44b1c521a4b1a58a041a58c", - "bytes": 12835, + "sha256": "f57d9bcc12b9db0aa45fed200eacc102530a0465ed76ae3fb6c6563350e3fc32", + "bytes": 12465, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/qa.py", - "sha256": "adad43278cb57b3c83032117d46df2b48b919354cb92083162389993cfb29f85", - "bytes": 4699, + "sha256": "217162484600fa90fd8076868bc49b7582ab49bd7e7de709c627bf5aec15716f", + "bytes": 4560, "routes": [], "models": [ { @@ -23957,8 +23973,8 @@ }, { "source": "townlight_zoning/question_ledger.py", - "sha256": "7895c6ba5ec3eb4fba1666cf42ba131a389570c308237b01a91473b937c761b6", - "bytes": 4945, + "sha256": "81d8c28dc096bea7ba4fb95c01a46a49e9d3a2b3d35addf8b043ffbed0b65ac4", + "bytes": 4814, "routes": [], "models": [ { @@ -24028,8 +24044,8 @@ }, { "source": "townlight_zoning/rule_lookup.py", - "sha256": "b69c6e8a89cf2586b05984ccb6079164c75fa460c053fca546c3e771ea8c75f5", - "bytes": 9642, + "sha256": "e312b54e1554bbd770e1161896aadcf1aedcc8c5de7eb5f7626ed77390830025", + "bytes": 9396, "routes": [], "models": [ { @@ -24176,16 +24192,16 @@ }, { "source": "townlight_zoning/staff_ui.py", - "sha256": "0b9f26845887662a88e643224360e3c89b11d0fbe88dcca0e865c57fecb623ee", - "bytes": 8358, + "sha256": "1ef8b0ca6671f799352cfab5e2cabc2647e53f6f403fc1d3a53351f681a93772", + "bytes": 8094, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_zoning/staff_workflows.py", - "sha256": "620797c1132212795b703d5a452553be1d0b4f2ae73082e9b26c52615a95b498", - "bytes": 24606, + "sha256": "5e3f528ab0fe49434680adb7b74dd59040e5365a79bdec0cc9e5a4ac6d9f7d80", + "bytes": 23953, "routes": [], "models": [ { @@ -24539,14 +24555,14 @@ }, "planning": { "repository": "townlight/plan", - "repository_head": "8dc9e455a5f4bb916b66d65da820914cfab42af1", - "working_tree_modified": true, + "repository_head": "7de514f1afd720f93bd70a4866c3389ef621dc49", + "working_tree_modified": false, "principal_import": "townlight_planning", "source": [ { "source": "townlight_planning/__init__.py", - "sha256": "e435f903a2e808bb3d38271366e0a2bad2d7333e20d4cb69839f5a4891fe8af6", - "bytes": 65, + "sha256": "ba3da0ea98e3ad47dfbf04390d03d4a2454d0d59c68fc2d33960aebd36013590", + "bytes": 62, "routes": [], "models": [], "configuration": [] @@ -24561,8 +24577,8 @@ }, { "source": "townlight_planning/consistency.py", - "sha256": "6bfcecb82ae9ebdceb7760c10eb9ae00b5d6895474cb4dc636b8bc0e448e4aaf", - "bytes": 1759, + "sha256": "68a93982d140ea423f4914c6020f15a1f264ee932055aa587414d2a88e63d6d1", + "bytes": 1716, "routes": [], "models": [ { @@ -24602,8 +24618,8 @@ }, { "source": "townlight_planning/integration_mocks.py", - "sha256": "f70c0cc39c08cd7e5044c67e39e735fea4857313a6f8eae9f8d1cf838523215f", - "bytes": 5350, + "sha256": "e6f43dc1f30a6055aace7309768eedb53a42b50af1d554da9ba6203f7a295de8", + "bytes": 5221, "routes": [], "models": [ { @@ -24665,8 +24681,8 @@ }, { "source": "townlight_planning/main.py", - "sha256": "f1132f0cd9b3b169a835565f146a8575b918687ff95650ba87ac917daa462c6d", - "bytes": 25178, + "sha256": "90b0a60906de7ec0b5756306d417793b9a7702a36efc8f0de473729207bb0728", + "bytes": 24599, "routes": [ { "method": "GET", @@ -25046,16 +25062,16 @@ }, { "source": "townlight_planning/migrations/__init__.py", - "sha256": "d633520d0fcec8ca93f8f5dc22e206cc65ea5c646a8a61e89eb6614d51008986", - "bytes": 2183, + "sha256": "19963dd089e57018085ab6efa9c8f68277f9d9a84dde41c3180237bcf4b300ac", + "bytes": 2134, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/migrations/__main__.py", - "sha256": "dc61223a3923f9e2b085e0dab9e033dcf799f99b08f4c808638824e0d303d13b", - "bytes": 647, + "sha256": "d6b329518e3ccc012f33dd5dfc17aaa545a0a14096ad697126a54d69257c28a2", + "bytes": 626, "routes": [], "models": [], "configuration": [ @@ -25067,48 +25083,48 @@ }, { "source": "townlight_planning/migrations/env.py", - "sha256": "c1dcc827b65af850e94f41ac02aec0528ad0abaf5b0d6a22e5773df2ceadaafc", - "bytes": 442, + "sha256": "e312d01dae0f5794ad0d79aa95be0053cda1891c5b77780815178761be094559", + "bytes": 430, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/migrations/versions/townlight_planning_0001_sources.py", - "sha256": "0552047ca4ca0eee1eaf5878f3f8f759e188da8d371a377efc93df9867ac2601", - "bytes": 1608, + "sha256": "6600b9a57a96f7167a0b903dfa0fda6de7ff3b8c9bc3c0c9e423313477ba2a0e", + "bytes": 1569, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/migrations/versions/townlight_planning_0002_workflows.py", - "sha256": "eba85cad351b499cd7456e68305309d92cb4c3087e355417df5259458d9c3f4f", - "bytes": 1093, + "sha256": "5e8f8634a59b30c1aa428e0391406035ac6f8784892c54c87dc1bdf766a21f62", + "bytes": 1068, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/migrations/versions/townlight_planning_0003_municipal.py", - "sha256": "c66314f036cb2c96263eafece836760e1fb0c31b96578238c5c900cdd5477417", - "bytes": 1200, + "sha256": "e8bf8e776a790a4690eb6095ac3ab7b812aed57f6fcd65a8278c7a2041bd4123", + "bytes": 1167, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/migrations/versions/townlight_planning_0004_neighborhoods.py", - "sha256": "5db83c05d550ab4f9f0a414c6f139fa454bdc03ae1c7963e55290ecbc8fd644a", - "bytes": 853, + "sha256": "1c466f2b928c0d9205eb878fdca3ba8576a010a4c835587d7577a9fbb66324ad", + "bytes": 833, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/municipal.py", - "sha256": "97e153119e296d9529f3c6b4e51d40be446fb3fed12a41c301b0fc3aa70b4e10", - "bytes": 12736, + "sha256": "4ace05891718c9e7da9f9583fdd9a2591217709804aedaf1a75163a7050250e2", + "bytes": 12451, "routes": [], "models": [ { @@ -25287,8 +25303,8 @@ }, { "source": "townlight_planning/municipal_api.py", - "sha256": "8b6b99a44b2a2b186f1e2c6c0c09a4815c8aa7184f60993aab6e45ffbc2fa5bd", - "bytes": 2323, + "sha256": "1d59ac4bb2221e963b535786bd338d50a9667b1825185a746a28e10bf905d3e3", + "bytes": 2256, "routes": [ { "method": "POST", @@ -25338,8 +25354,8 @@ }, { "source": "townlight_planning/persistence.py", - "sha256": "3a19584080cbb99c2a3bccd9673fe57d0abf20ecae8ad541cabccb42bccc9465", - "bytes": 10309, + "sha256": "4a9cb577534d562472da7d5513ba88db9ab9a1b3aeab7b95cc573b9a7e58cbf5", + "bytes": 10057, "routes": [], "models": [ { @@ -25404,8 +25420,8 @@ }, { "source": "townlight_planning/plan_workflows.py", - "sha256": "d303125e8b39b632081b320ca96869c729c3941fd29d1e34d8daae3e35038414", - "bytes": 7954, + "sha256": "2b5b5df21958e5f7652d68bd1a5ca7c6c2ca9ab25109f4374af9f50a039cd645", + "bytes": 7722, "routes": [], "models": [ { @@ -25612,16 +25628,16 @@ }, { "source": "townlight_planning/policy_service.py", - "sha256": "27fa2483c62a98d4bb4b80a8b88598e7366c9a8ad421701e594e0f71d7f1ddc4", - "bytes": 5990, + "sha256": "92862b2b4b684aa4b20ea25ad6a3d6f572874763361bca7a465bb499efdbc553", + "bytes": 5887, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/public_explore.py", - "sha256": "2ff3160485f6a947db8e6cf38f56b7e0259c0f5492b714aed40dafd974351dd3", - "bytes": 7151, + "sha256": "378b59dd3d626181ab28bfa4f69dc66bbdcd4daec825cc6f78771f69ead40cb8", + "bytes": 6993, "routes": [], "models": [ { @@ -25691,8 +25707,8 @@ }, { "source": "townlight_planning/public_explore_ui.py", - "sha256": "609356af82f905829d271060c9150ddb4f5576b201ae7d91a9a6027252406869", - "bytes": 9868, + "sha256": "41e0957865d092d95a231653d0a3f208b00779c46a367f721019516498259e56", + "bytes": 9692, "routes": [], "models": [], "configuration": [] @@ -25707,8 +25723,8 @@ }, { "source": "townlight_planning/records_export.py", - "sha256": "f846832525f23c4183db12742de37c3ce68fe4c57219762e2a5ac81947965d1c", - "bytes": 1294, + "sha256": "6547fecffc619834d612d9b4a787844a475b800de4cd14378c1cb31d35834b8f", + "bytes": 1257, "routes": [], "models": [ { @@ -25748,8 +25764,8 @@ }, { "source": "townlight_planning/source_api.py", - "sha256": "42ff7e02374c4624112c104bcb8a246b62f3fbc68110b008e5a1fbfa66295207", - "bytes": 3468, + "sha256": "b4dc38aa0bb4cceea595af93a69654743c9d37be9c04f1796ab950a921d9c167", + "bytes": 3385, "routes": [ { "method": "POST", @@ -26036,24 +26052,24 @@ }, { "source": "townlight_planning/source_schema.py", - "sha256": "24e5350df4f9e1439327a8e72097dc50b7e4a35b1fe8f87d9db0ab4d92114b52", - "bytes": 4535, + "sha256": "9ad17acf24d3561f8c2134ceaf8a900ca934b53bb689769d7daae4fdf8364b65", + "bytes": 4443, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/source_store.py", - "sha256": "7d04677e0c94acd7831d5bfad930c7e8d1583fb1ed9ca6e654da9df4fded76bb", - "bytes": 14109, + "sha256": "989fe47145b0737eb6fdecf17ae4a5ff8763855563c8413e16dae5b8c2560343", + "bytes": 13864, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/staff_analysis.py", - "sha256": "2cb81dca0930e2289daa9fa8550b7ee8518d114efc4c3be89ea8b954eb3cec1d", - "bytes": 1369, + "sha256": "9b13b3c3e06bcf5fb44355e5641f0fff6792906de9cad6bd31b9481c728dfb6e", + "bytes": 1332, "routes": [], "models": [ { @@ -26098,8 +26114,8 @@ }, { "source": "townlight_planning/workflow_api.py", - "sha256": "4aaf78976e900770cb6d1d1e7bdb8fdf489646a541ad460b8261786751a265e3", - "bytes": 5797, + "sha256": "54cf8a83bcbe022fec087c4e69c5427828b20d7e9a197b293a5918615a5fa7b8", + "bytes": 5666, "routes": [ { "method": "POST", @@ -26231,8 +26247,8 @@ }, { "source": "townlight_planning/workflow_models.py", - "sha256": "26e6d23b365d440c827351d639fbe825ca28f0d76c98da5f64e34a464d856ffe", - "bytes": 2748, + "sha256": "515d4e3522d7188bfefc64522a4adfea6cffd10ea5b0a06f031c502ea21c1163", + "bytes": 2691, "routes": [], "models": [ { @@ -26396,16 +26412,16 @@ }, { "source": "townlight_planning/workflow_schema.py", - "sha256": "4976be5b782694c5b5ab126bc47d3fff1cd96fdec4b04a6fa9b01871e23ef98b", - "bytes": 2272, + "sha256": "7e2c75b2b9a1d6d1a6c8fe484d7c2719c3936b7c42a4dbf62cf508cf3b9cbe48", + "bytes": 2235, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_planning/workflow_store.py", - "sha256": "abf17394c1d03528208f26343afece0dd928e96920e9ecc7c46885d0f1543aef", - "bytes": 17298, + "sha256": "dc43cdab971861259f9ad39870db1663ee27bcff299abc9bdce86a90f5e97ee0", + "bytes": 17021, "routes": [], "models": [], "configuration": [] @@ -26414,14 +26430,14 @@ }, "permitting": { "repository": "townlight/permit", - "repository_head": "7d3f0cf0aff294c2a2372ae393d340f4e4ce1bc8", - "working_tree_modified": true, + "repository_head": "224116d9c714f613646f2b6ce2cbb687cb5e0040", + "working_tree_modified": false, "principal_import": "townlight_permitting", "source": [ { "source": "townlight_permitting/__init__.py", - "sha256": "bedf11d628d9eb33c3d6724f11c532296889b719a6b5fe71c23b4eec6c7e55d8", - "bytes": 68, + "sha256": "abe36ff29c316ee014f8d310d748cbd641446547f782d3729e680535e952888e", + "bytes": 65, "routes": [], "models": [], "configuration": [] @@ -26436,8 +26452,8 @@ }, { "source": "townlight_permitting/intake_review.py", - "sha256": "50aff3cf1b85c1789bf989edeaba444e124e42c49449c845fe0cd66053d9738c", - "bytes": 1626, + "sha256": "a055dfd0e2d1cd0c75552102e780b108e81b8998f2b31a6b345e6b879f15546b", + "bytes": 1583, "routes": [], "models": [ { @@ -26477,8 +26493,8 @@ }, { "source": "townlight_permitting/integration_mocks.py", - "sha256": "dbdd49fba6836940936e5112076582a43d94bcff8c9c87faa2f80a49e4e5736c", - "bytes": 2023, + "sha256": "b6644cefdef03e4fc6bd9b7066a5ea68caf8a369eba98871cc0e8980e4ef316e", + "bytes": 1976, "routes": [], "models": [ { @@ -26518,8 +26534,8 @@ }, { "source": "townlight_permitting/main.py", - "sha256": "6c554e6d74ff5be743db71541d4b05f0c7118f65cb442ec0b784eaa131f99cd7", - "bytes": 24021, + "sha256": "9629959737fc027dd80df9e5f89fc16c2d630b11fa7415ef01d0b9056556a50b", + "bytes": 23410, "routes": [ { "method": "GET", @@ -26853,32 +26869,32 @@ }, { "source": "townlight_permitting/migrations/__init__.py", - "sha256": "ef1b983ce930e61e3f65c585e38d76dc54005d07ad81dcc67bd0bffc842b66af", - "bytes": 1872, + "sha256": "0a2f295030057892b382b1210accbbeb5edd69e3619e80245c7cac55aef157c6", + "bytes": 1829, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_permitting/migrations/env.py", - "sha256": "b802c986b358b031ff58863a84322c332fcef243d7376fa60e44bcc9563bff88", - "bytes": 439, + "sha256": "38c7d8fc0fc901214fd83db1170ccecefb7593a035882cc11f0c1733234454a0", + "bytes": 430, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_permitting/migrations/versions/townlight_permitting_0001_connected.py", - "sha256": "8ca41fd995d6c4b4ed938d6aa5b13467df6db04224344544a0ad38d40d420765", - "bytes": 1343, + "sha256": "2cf2b0ddc7ccb4610a63693777165a41b038f0122df1fb4e6b85f5d231d6aca0", + "bytes": 1317, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_permitting/pathway.py", - "sha256": "52b79c81f8cf016145a074f877171896a99268b31917314e221b2ca395698e75", - "bytes": 14992, + "sha256": "8906cccf2e7d80f4954c4bffaca8a2b23ad3fa0f7d7b94bd87c58c1dfbb3cd4c", + "bytes": 14662, "routes": [], "models": [ { @@ -27041,8 +27057,8 @@ }, { "source": "townlight_permitting/persistence.py", - "sha256": "71b13022235e2f7a248c0638f3f2909e292b3519812dbbf33ac75bf7d78bf315", - "bytes": 14453, + "sha256": "e1f30ef90f90b8dda04580e8d8b783ab19de0e42e26327a437b828294fbbbe1b", + "bytes": 14090, "routes": [], "models": [ { @@ -27196,16 +27212,16 @@ }, { "source": "townlight_permitting/public_ui.py", - "sha256": "e0e1e6056acb09ce92cde228bcf91711ce57b9b93b374acff51d462227c9f3c8", - "bytes": 11183, + "sha256": "dd30b922c5468891b820c6df5a6b353392a1318b57e58d0df96096770196bdeb", + "bytes": 10954, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_permitting/records_export.py", - "sha256": "990c764b82130895bea153363e48e65a812a06d8589a8e5376f3709b4d84aecd", - "bytes": 1335, + "sha256": "870d1ba89a416bdecfb634ec009f825b654ffbc7108de21adc0a2e4090596148", + "bytes": 1298, "routes": [], "models": [ { @@ -27296,16 +27312,16 @@ }, { "source": "townlight_permitting/sources.py", - "sha256": "b49dd295c25b33f48a9756c86d6063137e35d76fdc8c4ff0f29ed8e22c4207df", - "bytes": 4372, + "sha256": "b51f584b858d26ad0234b1b4ed0f335189e271fc041dcddb11755d3979eb744e", + "bytes": 4271, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_permitting/submittal_outline.py", - "sha256": "14f980ef5a70f3bc712f582a1c27b1b596e8d35e86f28b2aeb110460e4859eff", - "bytes": 1365, + "sha256": "228921b251fb031a78cf236426047b95d498019ed6726db93f9c46bbafa6d005", + "bytes": 1329, "routes": [], "models": [ { @@ -27618,16 +27634,16 @@ }, { "source": "townlight_permitting/workflow_schema.py", - "sha256": "6797fd13cbe6ba85884fc522c05e56aefe0fea3796d5a269d5be8824da3809c5", - "bytes": 2263, + "sha256": "f1319b7a5e23676d49a29c37310b6d92144f19ef7c457b8649ec781555ce5d61", + "bytes": 2224, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_permitting/workflow_store.py", - "sha256": "451c6ee455cf85d1b5a18a1e54ac02653b52a1d2e479adbe9213f086104ddd94", - "bytes": 15521, + "sha256": "671a27bcea49a246db63232e987a3f9457073ad42067cad1c11f243b24536556", + "bytes": 15263, "routes": [], "models": [], "configuration": [] @@ -27636,14 +27652,14 @@ }, "inspections": { "repository": "townlight/inspect", - "repository_head": "e058106d36b9164b702acac878fb00c3e533e4a6", - "working_tree_modified": true, + "repository_head": "a6861f262328e7645557ad2a2600db4a12a5046c", + "working_tree_modified": false, "principal_import": "townlight_inspections", "source": [ { "source": "townlight_inspections/__init__.py", - "sha256": "f1a274959add447eba3a43e59f72d62e4abbe6189a62c723c7ce2d127baa2096", - "bytes": 69, + "sha256": "5d4d9efed52f55404b1c3e1e45931d09a80f2e844c7d49588eb7742c6b31ae18", + "bytes": 66, "routes": [], "models": [], "configuration": [] @@ -27667,8 +27683,8 @@ }, { "source": "townlight_inspections/adapters.py", - "sha256": "6ac1d1b2d1a57c63c1c03af1e23bfa9540136bb1b8b2fba9eda3f27e42ecfd9e", - "bytes": 5419, + "sha256": "71a0b63eb2872aa35d70d43ce76865c7a8af7ad27ef3b93c5d8511b584eb82e6", + "bytes": 5299, "routes": [], "models": [], "configuration": [] @@ -27729,8 +27745,8 @@ }, { "source": "townlight_inspections/integration_mocks.py", - "sha256": "a22c28a8d47e6357b3c4b526b1d4690e8b98cc9d9115c93c74656734a58901ce", - "bytes": 2337, + "sha256": "1ea619e54ad40f4c33df7c94e2941dfc79218bbbc507029b2e056706f224456e", + "bytes": 2285, "routes": [], "models": [ { @@ -27770,8 +27786,8 @@ }, { "source": "townlight_inspections/main.py", - "sha256": "d6f4908f4898ef87372b61527536fa73542630d4c96b5fad5cdf9e626698db65", - "bytes": 19966, + "sha256": "b83628e1d0475c771d4ea496b725b7f708e1602befe0b856492606a91060ed59", + "bytes": 19424, "routes": [ { "method": "GET", @@ -28210,8 +28226,8 @@ }, { "source": "townlight_inspections/media_analysis.py", - "sha256": "b976ff774c8bb158346a34cd1976dc2d6b553bdef7c0f435808c133c6d062dd1", - "bytes": 14084, + "sha256": "f46897d1f72dee1695b593e80ef8aee3b72a6100330e0ca2c2631a9d6a2eec93", + "bytes": 13781, "routes": [], "models": [ { @@ -28336,32 +28352,32 @@ }, { "source": "townlight_inspections/migrations/__init__.py", - "sha256": "80c59209c59d5bc08d3c46e01a38ec9afef712d6e660c9d3842684be9c7bacf9", - "bytes": 1879, + "sha256": "82a2ef04d0114a4081d55b0427b15d1a8a5e3ab802ac3a5f6f635d4183045b31", + "bytes": 1836, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_inspections/migrations/env.py", - "sha256": "a3a7ca12e132a15db797733d493de4b07f6596cf3e92127b12102c3b0c7ae1ec", - "bytes": 442, + "sha256": "f88ab57cf0c0211530dc54b87ef2efa46b1e70e20ed55f872cc8ac9d2cbd2e51", + "bytes": 433, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_inspections/migrations/versions/townlight_inspections_0001_connected.py", - "sha256": "1f8aaf5660480513bf538ee1b4145e287f4fd29f4495ce3fdf6f0c13ee030494", - "bytes": 1350, + "sha256": "6f6f0843d131cd4c4f7ed8a2ea28a60715cb800430fcba81369d4cd85a7e6748", + "bytes": 1324, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_inspections/notice_draft.py", - "sha256": "30a230f05dc3b31aad29dc1389ec713af4ee89ca306a8b30ed39cf60d4db6417", - "bytes": 1831, + "sha256": "d8de416a4bec28397bae610ed6709913493c1a418d1c5ab114cc53c76d25fef8", + "bytes": 1781, "routes": [], "models": [ { @@ -28406,8 +28422,8 @@ }, { "source": "townlight_inspections/persistence.py", - "sha256": "0145cd2f96215ca17f9d6bbb5f1249777e9f9e87ab23863792be4deb4b05458a", - "bytes": 14471, + "sha256": "b0a4f7800ebaa08f30c60c1b2cdfd0b11bad0e844cd8556d686d803ea5cfa6da", + "bytes": 14116, "routes": [], "models": [ { @@ -28610,8 +28626,8 @@ }, { "source": "townlight_inspections/report_draft.py", - "sha256": "9de0986afe2e0aee2e39e913af1ea6dd7b8f37c91f0b26d4294566fbc0f0a03c", - "bytes": 2420, + "sha256": "09923f130480118bb1c7aee2c0d3d6555a7f2b6cdcc748c8af8929f4cda54ee7", + "bytes": 2359, "routes": [], "models": [ { @@ -28661,8 +28677,8 @@ }, { "source": "townlight_inspections/transcription.py", - "sha256": "632f91d1c28aa4ed00c383cec0fd903cbaba42734b99f08fd67d4f384a263ab1", - "bytes": 6488, + "sha256": "7d88917e2b21909fbfb5bf8c7efcbcd5de9ad5bf6d4e444e71ead9172bae41b1", + "bytes": 6346, "routes": [], "models": [], "configuration": [ @@ -28941,16 +28957,16 @@ }, { "source": "townlight_inspections/workflow_schema.py", - "sha256": "1d7b0976826350a2e34671ea569918471848639ea09a571d5b775e9646b9db2a", - "bytes": 2264, + "sha256": "feada83045c6077a0f8d7af67d0159872773c075a618f0d461b64c71af85229e", + "bytes": 2225, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_inspections/workflow_store.py", - "sha256": "1ebe80dee56578f11dd5aeac643a0b899325a2bc250af399600979075fa9911d", - "bytes": 17794, + "sha256": "eddf9bee645c8a8cf873cf40fc77caa9c7629d8ee4ee0612e1c53541aff06316", + "bytes": 17493, "routes": [], "models": [], "configuration": [] @@ -28959,22 +28975,22 @@ }, "access": { "repository": "townlight/access", - "repository_head": "a70b56263aa0eef26d4021a5e47b5fb0a7ba7e97", - "working_tree_modified": true, + "repository_head": "f377a9a6e2a14d890333a20eab9277d644a9aaeb", + "working_tree_modified": false, "principal_import": "townlight_access", "source": [ { "source": "townlight_access/__init__.py", - "sha256": "f49d540adddb1dde0dbc6b109c82349cdd0b1af029bb06a6b41c28e799bff0f5", - "bytes": 58, + "sha256": "5727d5f009ce2bf94c4707a716dc202d835d9172aa60b2e93195ece8f9e75153", + "bytes": 55, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_access/access_review.py", - "sha256": "511b887896e468aa0954e1a8763d0445d4ba4ea10f2fcf99a462dc725e98746e", - "bytes": 13859, + "sha256": "16546ed770f8a59a87092299b5b31851580e64df375680b0549e1ddf4f8a8222", + "bytes": 13501, "routes": [], "models": [ { @@ -29125,16 +29141,16 @@ }, { "source": "townlight_access/db_admin.py", - "sha256": "c9b86df06388061de0646c9c7bc1c6964cdf075113a04fdda3b6a4103aa988c0", - "bytes": 1099, + "sha256": "fd93116252a0cd375c2cde34da875841269676bf367d15b70dcced801645ff85", + "bytes": 1063, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_access/exports.py", - "sha256": "f6496dc04cae8445a25c779d1556a8026f27dd304d7b1c22325e143faedb48ab", - "bytes": 1793, + "sha256": "17a3ef62a287ee40e99b2b3df86f927af37d83e082de4859f4edfe23fe0cd7a5", + "bytes": 1747, "routes": [], "models": [ { @@ -29179,8 +29195,8 @@ }, { "source": "townlight_access/main.py", - "sha256": "0eb87c6acb2c97e6c43f928a457bb226a826d807a8bc3c5afc347bf88c8daf8e", - "bytes": 18671, + "sha256": "d74349fbbfd7df528e9088b297ea40d1a36912b19afb93498a5e6e91320f4b33", + "bytes": 18170, "routes": [ { "method": "GET", @@ -29482,8 +29498,8 @@ }, { "source": "townlight_access/multilingual.py", - "sha256": "49903d5b7cddc2453fe99989e519306d4ac1796e8a45713cae0651c00aae9be6", - "bytes": 1630, + "sha256": "14aa727215804408dbf68706ec3a0ba264b21f95adcc893750498902004ca50b", + "bytes": 1582, "routes": [], "models": [ { @@ -29538,8 +29554,8 @@ }, { "source": "townlight_access/plain_language.py", - "sha256": "7677832cee72ad515490486489749b41f0a209fc66a75fb76e7a7190bf69ca26", - "bytes": 1420, + "sha256": "7ab0bace9af100da700f3b11e1420d2b5eccf948476936df69b9a887f0ab48c4", + "bytes": 1372, "routes": [], "models": [ { @@ -29584,24 +29600,24 @@ }, { "source": "townlight_access/public_ui.py", - "sha256": "78168321622a780a4d373b35432668daad0d5f6a0a3f011c8e41862c9998068e", - "bytes": 20623, + "sha256": "e954aa6756cc7b0ff052c8d04ac8d006e3409250889982b08c202d067a121864", + "bytes": 20239, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_access/record_artifact.py", - "sha256": "57d8966dbdbd0764b323355fdca5ef6ff52f7ca86594f22926b2ffa96f4b8d29", - "bytes": 985, + "sha256": "cc705af7c295db81e09fa42661b3581772637743ef4c76a2cd8da8b5a6058c05", + "bytes": 962, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_access/workflows.py", - "sha256": "87d7787f658c9cb43ff2bee670ad78e532d836944ba4d26bdbc15b5b9c66f860", - "bytes": 5913, + "sha256": "005037e4404f45f17ce3791b32f1225ed06da7e3a66330cdb52a27bac6449bcc", + "bytes": 5755, "routes": [], "models": [ { @@ -29734,22 +29750,22 @@ }, "notice": { "repository": "townlight/notice", - "repository_head": "6c7bc4435cdd700fd4673486d3c7b3794d5def82", - "working_tree_modified": true, + "repository_head": "4edf01296b0ad56a331e7fdd9b7c2d19c20b8e48", + "working_tree_modified": false, "principal_import": "townlight_notice", "source": [ { "source": "townlight_notice/__init__.py", - "sha256": "cdce8d39689ef3269af032210d1990198318fdbe04f6eb0a739241f347102890", - "bytes": 64, + "sha256": "c3b1d95e120e52fe88ca66b570a92fac2a7f5d07ff5b2e5a678e7019a3694acc", + "bytes": 55, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_notice/accessibility_review.py", - "sha256": "a2f9463a4362b03ef0b2a41d00c0991a0e99346d2cf8b64c6909bf06328fb23f", - "bytes": 3448, + "sha256": "cbce1a26671652112e9dcceed80326fce4c1f04fe2073a096713bb9770b50160", + "bytes": 3362, "routes": [], "models": [ { @@ -29809,8 +29825,8 @@ }, { "source": "townlight_notice/archive_packet.py", - "sha256": "05db28385a7e2854cfeb96148751f119586e888e2ce0460f3686ed651f16ae32", - "bytes": 3101, + "sha256": "a38e9231ec8eb3e321f4609ad832371e05728817754f7459e92bb441a4fa4e25", + "bytes": 3017, "routes": [], "models": [ { @@ -29875,8 +29891,8 @@ }, { "source": "townlight_notice/channel_plan.py", - "sha256": "acdce60fa24fcfbd903100e02df1d730ed9b913013a52f8287839272bf58a643", - "bytes": 1182, + "sha256": "764b954c3ada33a24d1a91f461dc9d7d1290aa00f7ad4855051888d245df3477", + "bytes": 1145, "routes": [], "models": [ { @@ -29916,8 +29932,8 @@ }, { "source": "townlight_notice/deadline_tracker.py", - "sha256": "7dd15044ff4cf2597be1b0eebd525ea641328388d7f79ff2ad42d7f1063b6c8d", - "bytes": 1106, + "sha256": "5ae7fcc1dff0db535cd3c79bd2e6741aeec608f191e8d1bc4dec10777eea500c", + "bytes": 1072, "routes": [], "models": [ { @@ -29957,8 +29973,8 @@ }, { "source": "townlight_notice/main.py", - "sha256": "5074a5d9d80332f672401cfa37035d13ec4e5b9707b155ea154d1a689404c920", - "bytes": 23999, + "sha256": "a058e6ff635023fff9579dc7c91e5ce83e1b89951fdd4dc32e13a35314659350", + "bytes": 23396, "routes": [ { "method": "GET", @@ -30521,8 +30537,8 @@ }, { "source": "townlight_notice/notice_registry.py", - "sha256": "8a5195d4c87f4bb76e1b499bf7cc188ded3bf62d8d9c54113a9d86b04cba1418", - "bytes": 1258, + "sha256": "fc26767f54323985060a5f93f1d7ff26a84dfbd5f44ef1042ae076a650621780", + "bytes": 1221, "routes": [], "models": [ { @@ -30562,8 +30578,8 @@ }, { "source": "townlight_notice/notice_templates.py", - "sha256": "fcd44c4e05afcd8ed6dd5c3913a8d522bf6c0bd5b7d291f2937842a5b49fd6ac", - "bytes": 2176, + "sha256": "41afe8ecdc8389913ae2e33f8229b6167577c6125ccbdf2a99e703081bf0abb4", + "bytes": 2113, "routes": [], "models": [ { @@ -30618,8 +30634,8 @@ }, { "source": "townlight_notice/persistence.py", - "sha256": "bfc2871328900220b9dad1a01d07aeae6f0f7e7b1ab25e66a2908b5766f9d2d6", - "bytes": 11387, + "sha256": "f9e6933606a40b0444eb228abb58d2f9a06a197eb541d8bb0f542a42588eb361", + "bytes": 11071, "routes": [], "models": [ { @@ -30793,16 +30809,16 @@ }, { "source": "townlight_notice/public_ui.py", - "sha256": "d3c07a7bd9c4bbef24d49107824941812ee5d04bce9ee53a2c83a63e541aa32e", - "bytes": 6462, + "sha256": "3c1df208ed21056e7a7e50c2bd2e66db2bd813596bb08a30e8c1dbbbe1030d4b", + "bytes": 6382, "routes": [], "models": [], "configuration": [] }, { "source": "townlight_notice/publication_check.py", - "sha256": "e19f0d812ddd348aca7f30e9bcf28cd6d15dc5552a1e79a04f0d35f5f04997ac", - "bytes": 1107, + "sha256": "9084f26f0611193031cbc87f898895df0d1f6a37f8a5d0180bc558716868fe5e", + "bytes": 1076, "routes": [], "models": [ { @@ -30837,8 +30853,8 @@ }, { "source": "townlight_notice/publication_proof.py", - "sha256": "807dd53445c1fdfa6e0c6bc5988ad4be5c255abfefd5acefaf60dc13a3fc350f", - "bytes": 2390, + "sha256": "aebc287edeaebe61106c16b53f0faa149f9e2bae56f1e96a49675120113d4cc8", + "bytes": 2324, "routes": [], "models": [ { @@ -30918,8 +30934,8 @@ }, { "source": "townlight_notice/records_export.py", - "sha256": "faa93c41f8f38bc89b4924e328a7ae354b45ad1478236bd02e924dd4bd8c8f6c", - "bytes": 1290, + "sha256": "fe6ae2a8e48e5a84f71f77d5efc9469d7775eaeebabc086e2c3aca2b3466a54c", + "bytes": 1255, "routes": [], "models": [ { @@ -30959,8 +30975,8 @@ }, { "source": "townlight_notice/statutory_rules.py", - "sha256": "0f56cf2c90af07981225565e44ecfc6e7e5468440f4141cc8ee1448703b8fe0a", - "bytes": 6430, + "sha256": "6b7cb6910a5f9fa83aa178e5c01970044ce6fb17aba43c0436f9dc5b202e14be", + "bytes": 6259, "routes": [], "models": [ { @@ -31087,8 +31103,8 @@ }, { "source": "townlight_notice/subscriber_delivery.py", - "sha256": "2defdbcd6c807b2f4c9171afe21559d5b566acaef5376aecb1a5e7faeeb58f94", - "bytes": 3445, + "sha256": "84e16c756859db4955cc29c58b407ed9d1195a21ce1652cfb749315dcbb534ff", + "bytes": 3352, "routes": [], "models": [ { @@ -31200,8 +31216,8 @@ }, { "source": "townlight_notice/workflow.py", - "sha256": "b88b0fe7488519206ed84a22e69d5577c5746dece7d47e7d91b673abc4d1b8e1", - "bytes": 14094, + "sha256": "7fe40349a8cbb82839ee28d1d2952e3d2790eb4da7e48b53f1b10f11bfe41837", + "bytes": 13840, "routes": [], "models": [ { @@ -31250,8 +31266,8 @@ }, "station": { "repository": "townlight/station", - "repository_head": "4b5afac07dda1c7f725993d06860a820959d7e06", - "working_tree_modified": true, + "repository_head": "5e65aa40795933ce2f39b195f869dacb9d4aa6a8", + "working_tree_modified": false, "principal_import": "townlight_station", "source": [ { @@ -31280,62 +31296,62 @@ }, { "source": "beta-1/townlight_station/api.py", - "sha256": "fa99dd6f913fb5020ce4790db6043bd080424bcd99f2e8d97e576daa96432a36", - "bytes": 14339, + "sha256": "8df6352adb3b94d717fb024c1ce120faf2bcd478405bdaa518e8a7ff5b0c6c39", + "bytes": 14612, "routes": [ { "method": "GET", "declared_path": "/health", "function": "health", - "line": 80 + "line": 81 }, { "method": "GET", "declared_path": "/v1/identity", "function": "identity", - "line": 85 + "line": 86 }, { "method": "POST", "declared_path": "/v1/recordings", "function": "capture", - "line": 90 + "line": 91 }, { "method": "GET", "declared_path": "/v1/recordings/{identity}", "function": "get_record", - "line": 192 + "line": 196 }, { "method": "GET", "declared_path": "/v1/recordings/{identity}/content", "function": "content", - "line": 196 + "line": 200 }, { "method": "POST", "declared_path": "/v1/recordings/{identity}/retry", "function": "retry", - "line": 207 + "line": 211 }, { "method": "GET", "declared_path": "/v1/live-sources", "function": "live_sources", - "line": 220 + "line": 224 }, { "method": "GET", "declared_path": "/v1/recordings", "function": "list_records", - "line": 225 + "line": 229 }, { "method": "POST", "declared_path": "/v1/recordings/{identity}/stop", "function": "stop_live", - "line": 231 + "line": 235 } ], "models": [ @@ -31348,40 +31364,40 @@ { "name": "meeting_id", "type": "UUID", - "line": 36 + "line": 37 }, { "name": "agenda_ids", "type": "list[UUID]", - "line": 37 + "line": 38 }, { "name": "source_file", "type": "str | None", - "line": 38 + "line": 39 }, { "name": "live_source_id", "type": "str | None", - "line": 39 + "line": 40 }, { "name": "civiccast_feed_id", "type": "str | None", - "line": 40 + "line": 41 }, { "name": "captions_file", "type": "str | None", - "line": 41 + "line": 42 }, { "name": "idempotency_key", "type": "str", - "line": 42 + "line": 43 } ], - "line": 34 + "line": 35 } ], "configuration": [] @@ -31546,6 +31562,14 @@ "models": [], "configuration": [] }, + { + "source": "beta-1/townlight_station/imported_recording.py", + "sha256": "ebabc4d21a00c203f187c8a6e6844426695faed876481c52c81ecb2f1f7e4b1a", + "bytes": 3610, + "routes": [], + "models": [], + "configuration": [] + }, { "source": "beta-1/townlight_station/live.py", "sha256": "5f32afd8d2b5e74296a083436b367fec3940da6ae33123fc17842bf0c6c05cce", @@ -31767,62 +31791,74 @@ }, { "source": "beta-1/townlight_station/operator.py", - "sha256": "6471894a1240b611a2bf006867ce79848630f6dc69270e29e54b71dbb26f3837", - "bytes": 6737, + "sha256": "9b88822016886adc86c6a4ec30620d4312b05871a4d5757379365e656053ac67", + "bytes": 7912, "routes": [ { "method": "POST", "declared_path": "/v1/operator-ticket", "function": "issue", - "line": 51 + "line": 57 }, { "method": "POST", "declared_path": "/operator/session", "function": "exchange", - "line": 60 + "line": 66 }, { "method": "POST", "declared_path": "/operator/logout", "function": "logout", - "line": 75 + "line": 81 }, { "method": "GET", "declared_path": "/operator/catalog", "function": "catalog", - "line": 82 + "line": 88 }, { "method": "GET", "declared_path": "/operator/meeting/{identity}", "function": "meeting", - "line": 102 + "line": 108 + }, + { + "method": "GET", + "declared_path": "/operator/meeting/{identity}/imported-recordings", + "function": "imported_recordings", + "line": 112 + }, + { + "method": "POST", + "declared_path": "/operator/meeting/{identity}/imported-recordings", + "function": "stage_imported_recording", + "line": 121 }, { "method": "POST", "declared_path": "/operator/handoff", "function": "handoff", - "line": 106 + "line": 129 }, { "method": "GET", "declared_path": "/", "function": "page", - "line": 124 + "line": 147 }, { "method": "GET", "declared_path": "/operator.js", "function": "script", - "line": 128 + "line": 151 }, { "method": "GET", "declared_path": "/operator.css", "function": "style", - "line": 132 + "line": 155 } ], "models": [ @@ -31835,10 +31871,10 @@ { "name": "ticket", "type": "str", - "line": 15 + "line": 16 } ], - "line": 13 + "line": 14 }, { "name": "Handoff", @@ -31849,20 +31885,34 @@ { "name": "request_id", "type": "UUID", - "line": 20 + "line": 21 }, { "name": "recording_id", "type": "UUID", - "line": 21 + "line": 22 }, { "name": "expected_sha256", "type": "str", - "line": 22 + "line": 23 } ], - "line": 18 + "line": 19 + }, + { + "name": "ImportedRecording", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "index", + "type": "int", + "line": 28 + } + ], + "line": 26 } ], "configuration": [] @@ -31901,8 +31951,8 @@ }, { "source": "beta-1/townlight_station/ui/operator.js", - "sha256": "0e55284e2359e62006879948dd6e0f90fc4d6f1095230cafd58e5af3651ae2e7", - "bytes": 202782, + "sha256": "06d6c6265783512f1819046708c69cba1d76df0ecec3f2a4a8a3b5ffdc77fe61", + "bytes": 203991, "routes": [], "models": [], "configuration": [] @@ -31935,13 +31985,13 @@ }, "runtime": { "repository": "townlight/townlight", - "repository_head": "1bad62a1107e9f50bee17ea01ee5cc2e3d0a8bea", - "working_tree_modified": true, + "repository_head": "0afd59de52cb7ecb317188a89bcd1fec8c578a24", + "working_tree_modified": false, "principal_import": "townlight_runtime", "source": [ { "source": "desktop/runtime/python-services/townlight_runtime/__init__.py", - "sha256": "db3facb7198193860bfabca8f0942a86c69e0739b28475fc6ab43d82ba7515dd", + "sha256": "fc9d25b5ab8993eaaf8476bd2aa51513d83aa63151868100a8f40c15f4819fb6", "bytes": 118, "routes": [], "models": [], @@ -32553,38 +32603,62 @@ }, { "source": "desktop/runtime/python-services/townlight_runtime/code_public.py", - "sha256": "8c28292fed544f4db88541054f02d60d707130c11c70a1f10b42916302a02433", - "bytes": 4822, + "sha256": "ed4bc98730848f3bf8e78e36dc97e3c4003ff7304c3e2668c374aae6b13bc5b8", + "bytes": 5720, "routes": [ + { + "method": "GET", + "declared_path": "/public-data/search", + "function": "search_data", + "line": 66 + }, + { + "method": "GET", + "declared_path": "/public-data/section", + "function": "section_data", + "line": 71 + }, + { + "method": "GET", + "declared_path": "/public-data/export", + "function": "export_data", + "line": 76 + }, + { + "method": "GET", + "declared_path": "/public-data/answer", + "function": "answer_data", + "line": 84 + }, { "method": "GET", "declared_path": "", "function": "home", - "line": 66 + "line": 91 }, { "method": "GET", "declared_path": "/search", "function": "search", - "line": 71 + "line": 96 }, { "method": "GET", "declared_path": "/answer", "function": "answer", - "line": 80 + "line": 105 }, { "method": "GET", "declared_path": "/sections/{section_ref}", "function": "detail", - "line": 91 + "line": 116 }, { "method": "GET", "declared_path": "/sections/{section_ref}/export", "function": "export", - "line": 109 + "line": 134 } ], "models": [], @@ -32600,8 +32674,8 @@ }, { "source": "desktop/runtime/python-services/townlight_runtime/database_identity.py", - "sha256": "7aaf74fe0ab5b5e13c5527f1069e5ad15a4b66c13df98c327969b3bad2c3bd7d", - "bytes": 1624, + "sha256": "c693e46285326892cb08ff16b331cfa62febfdceac5535cbe07f397252839a24", + "bytes": 1652, "routes": [], "models": [], "configuration": [] @@ -32850,172 +32924,262 @@ ], "configuration": [] }, + { + "source": "desktop/runtime/python-services/townlight_runtime/meeting_import_fetch.py", + "sha256": "c56a56e1a156deaaad5e6f75496727e53d40f0488e69b298874f658627f511d1", + "bytes": 5987, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/meeting_import_links.py", + "sha256": "a84789caab54170907bfd13c758a166c152c371e4d75ea6cea9083ce23f213ef", + "bytes": 5268, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/meeting_imports.py", + "sha256": "b3f73c63c8e27a19912c648561ca0c1a8b125174d93a5e21848ee9e173c35c91", + "bytes": 70859, + "routes": [], + "models": [], + "configuration": [] + }, { "source": "desktop/runtime/python-services/townlight_runtime/meetings_bridge.py", - "sha256": "c188c7f52163681ffbd3dcee61da2f7cba24df6839adb421be804087dca4ff4c", - "bytes": 29127, + "sha256": "d6d9e4894667ed61ed196396b845cdbee2d40a6b5d27e62f446d9e837285cbb2", + "bytes": 40433, "routes": [ + { + "method": "POST", + "declared_path": "/imports/preview", + "function": "preview_meeting_import", + "line": 121 + }, + { + "method": "GET", + "declared_path": "/imports/sources", + "function": "meeting_import_sources", + "line": 126 + }, + { + "method": "POST", + "declared_path": "/imports/fetch", + "function": "fetch_meeting_import", + "line": 131 + }, + { + "method": "POST", + "declared_path": "/imports/commit", + "function": "commit_meeting_import", + "line": 164 + }, + { + "method": "GET", + "declared_path": "/imports/{meeting_id}", + "function": "get_meeting_import", + "line": 186 + }, + { + "method": "POST", + "declared_path": "/imports/links/{destination}", + "function": "import_link_choices", + "line": 218 + }, + { + "method": "GET", + "declared_path": "/imports/links/{destination}/{target_id}", + "function": "list_import_links", + "line": 228 + }, + { + "method": "POST", + "declared_path": "/imports/links/{destination}/{target_id}", + "function": "create_import_link", + "line": 238 + }, + { + "method": "POST", + "declared_path": "/imports/{meeting_id}/records", + "function": "attach_import_document", + "line": 272 + }, { "method": "POST", "declared_path": "/meetings/{meeting_id}/stages", "function": "record_meeting_stage", - "line": 106 + "line": 329 }, { "method": "POST", "declared_path": "/meetings", "function": "create_meeting", - "line": 128 + "line": 351 }, { "method": "GET", "declared_path": "/meetings/{meeting_id}", "function": "get_meeting", - "line": 136 + "line": 359 }, { "method": "POST", "declared_path": "/agenda-items", "function": "create_agenda_item", - "line": 141 + "line": 364 }, { "method": "GET", "declared_path": "/agenda-items/{item_id}", "function": "get_agenda_item", - "line": 148 + "line": 371 }, { "method": "POST", "declared_path": "/agenda-items/{item_id}/reviews", "function": "record_agenda_review", - "line": 164 + "line": 387 }, { "method": "POST", "declared_path": "/agenda-items/{item_id}/meeting", "function": "assign_agenda", - "line": 170 + "line": 393 }, { "method": "GET", "declared_path": "/notices/{notice_id}/template", "function": "notice_template", - "line": 249 + "line": 472 }, { "method": "POST", "declared_path": "/notices/{notice_id}/document", "function": "notice_document", - "line": 264 + "line": 487 }, { "method": "POST", "declared_path": "/meetings/{meeting_id}/notice-checks", "function": "check_notice", - "line": 278 + "line": 501 }, { "method": "POST", "declared_path": "/notices/{notice_id}/proof", "function": "record_notice_proof", - "line": 295 + "line": 518 }, { "method": "POST", "declared_path": "/meetings/{meeting_id}/transcripts", "function": "capture_transcript", - "line": 332 + "line": 555 }, { "method": "POST", "declared_path": "/meetings/{meeting_id}/action-items", "function": "capture_action_item", - "line": 344 + "line": 567 }, { "method": "POST", "declared_path": "/meetings/{meeting_id}/archive", "function": "archive_meeting", - "line": 356 + "line": 579 + }, + { + "method": "GET", + "declared_path": "/data/index", + "function": "public_archive_data", + "line": 622 + }, + { + "method": "GET", + "declared_path": "/data/{record_id}", + "function": "public_archive_record_data", + "line": 628 }, { "method": "GET", "declared_path": "", "function": "public_archive_index", - "line": 399 + "line": 633 }, { "method": "GET", "declared_path": "/{record_id}", "function": "public_archive_detail", - "line": 407 + "line": 641 }, { "method": "GET", "declared_path": "/{record_id}/{kind}.txt", "function": "public_archive_download", - "line": 417 + "line": 651 }, { "method": "POST", "declared_path": "/meetings/{meeting_id}/packet-snapshots", "function": "capture_packet", - "line": 441 + "line": 675 }, { "method": "POST", "declared_path": "/packets/{packet_id}/deliver", "function": "export_packet", - "line": 462 + "line": 696 }, { "method": "POST", "declared_path": "/minutes/{draft_id}/decisions", "function": "decide_minutes", - "line": 475 + "line": 709 }, { "method": "POST", "declared_path": "/meetings/{meeting_id}/motions", "function": "capture_motion", - "line": 498 + "line": 732 }, { "method": "POST", "declared_path": "/motions/{motion_id}/corrections", "function": "correct_motion", - "line": 505 + "line": 739 }, { "method": "POST", "declared_path": "/motions/{motion_id}/votes", "function": "capture_vote", - "line": 511 + "line": 745 }, { "method": "POST", "declared_path": "/votes/{vote_id}/corrections", "function": "correct_vote", - "line": 517 + "line": 751 }, { "method": "POST", "declared_path": "/meetings/{meeting_id}/minutes/drafts", "function": "create_minutes", - "line": 523 + "line": 757 }, { "method": "GET", "declared_path": "/meetings/{meeting_id}/proceedings", "function": "proceedings", - "line": 532 + "line": 766 }, { "method": "GET", "declared_path": "/station/catalog", "function": "station_catalog", - "line": 552 + "line": 786 } ], "models": [ @@ -33028,25 +33192,25 @@ { "name": "title", "type": "str", - "line": 85 + "line": 97 }, { "name": "scheduled_start", "type": "AwareDatetime", - "line": 86 + "line": 98 }, { "name": "location", "type": "str", - "line": 87 + "line": 99 }, { "name": "meeting_type", "type": "Literal['regular', 'special', 'emergency', 'closed_session', 'executive']", - "line": 88 + "line": 100 } ], - "line": 83 + "line": 95 }, { "name": "AgendaInput", @@ -33057,15 +33221,124 @@ { "name": "title", "type": "str", - "line": 93 + "line": 105 }, { "name": "department_name", "type": "str", - "line": 94 + "line": 106 } ], - "line": 91 + "line": 103 + }, + { + "name": "ImportSourceInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "connector", + "type": "str", + "line": 111 + }, + { + "name": "source_url", + "type": "str", + "line": 112 + }, + { + "name": "input_format", + "type": "str", + "line": 113 + } + ], + "line": 109 + }, + { + "name": "ImportPreviewInput", + "bases": [ + "ImportSourceInput" + ], + "fields": [ + { + "name": "content_base64", + "type": "str", + "line": 117 + } + ], + "line": 116 + }, + { + "name": "ImportCommitInput", + "bases": [ + "ImportPreviewInput" + ], + "fields": [ + { + "name": "external_id", + "type": "str", + "line": 159 + }, + { + "name": "expected_sha256", + "type": "str", + "line": 160 + } + ], + "line": 158 + }, + { + "name": "RecordsImportDocument", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "request_id", + "type": "UUID", + "line": 203 + }, + { + "name": "document_index", + "type": "int", + "line": 204 + } + ], + "line": 201 + }, + { + "name": "ImportLinkInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "meeting_id", + "type": "UUID", + "line": 209 + } + ], + "line": 207 + }, + { + "name": "ImportLinkSearch", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "target_query", + "type": "str", + "line": 213 + }, + { + "name": "meeting_query", + "type": "str", + "line": 214 + } + ], + "line": 211 }, { "name": "MeetingStageInput", @@ -33076,15 +33349,15 @@ { "name": "to_status", "type": "Literal['SCHEDULED', 'NOTICED', 'PACKET_POSTED', 'IN_PROGRESS', 'RECESSED', 'ADJOURNED', 'TRANSCRIPT_READY', 'MINUTES_DRAFTED', 'MINUTES_POSTED', 'MINUTES_ADOPTED', 'MINUTES_SIGNED', 'ARCHIVED', 'CANCELLED']", - "line": 99 + "line": 322 }, { "name": "statutory_basis", "type": "str | None", - "line": 102 + "line": 325 } ], - "line": 97 + "line": 320 }, { "name": "AgendaReviewInput", @@ -33095,10 +33368,10 @@ { "name": "to_status", "type": "Literal['DRAFTED', 'SUBMITTED', 'DEPT_APPROVED', 'LEGAL_REVIEWED', 'CLERK_ACCEPTED', 'ON_AGENDA', 'IN_PACKET', 'POSTED', 'HEARD', 'DISPOSED', 'ARCHIVED']", - "line": 154 + "line": 377 } ], - "line": 152 + "line": 375 }, { "name": "AgendaAssignment", @@ -33109,10 +33382,10 @@ { "name": "meeting_id", "type": "UUID", - "line": 160 + "line": 383 } ], - "line": 158 + "line": 381 }, { "name": "MotionInput", @@ -33123,15 +33396,15 @@ { "name": "text", "type": "str", - "line": 180 + "line": 403 }, { "name": "seconded_by", "type": "str | None", - "line": 181 + "line": 404 } ], - "line": 178 + "line": 401 }, { "name": "MotionCorrection", @@ -33142,15 +33415,15 @@ { "name": "text", "type": "str", - "line": 186 + "line": 409 }, { "name": "reason", "type": "str", - "line": 187 + "line": 410 } ], - "line": 184 + "line": 407 }, { "name": "VoteInput", @@ -33161,15 +33434,15 @@ { "name": "voter_name", "type": "str", - "line": 192 + "line": 415 }, { "name": "vote", "type": "str", - "line": 193 + "line": 416 } ], - "line": 190 + "line": 413 }, { "name": "VoteCorrection", @@ -33180,15 +33453,15 @@ { "name": "vote", "type": "str", - "line": 198 + "line": 421 }, { "name": "reason", "type": "str", - "line": 199 + "line": 422 } ], - "line": 196 + "line": 419 }, { "name": "SourceInput", @@ -33199,20 +33472,20 @@ { "name": "source_id", "type": "str", - "line": 204 + "line": 427 }, { "name": "label", "type": "str", - "line": 205 + "line": 428 }, { "name": "text", "type": "str", - "line": 206 + "line": 429 } ], - "line": 202 + "line": 425 }, { "name": "SentenceInput", @@ -33223,15 +33496,15 @@ { "name": "text", "type": "str", - "line": 211 + "line": 434 }, { "name": "citations", "type": "list[str]", - "line": 212 + "line": 435 } ], - "line": 209 + "line": 432 }, { "name": "DraftInput", @@ -33242,15 +33515,15 @@ { "name": "source_materials", "type": "list[SourceInput]", - "line": 217 + "line": 440 }, { "name": "sentences", "type": "list[SentenceInput]", - "line": 218 + "line": 441 } ], - "line": 215 + "line": 438 }, { "name": "MinutesDecision", @@ -33261,15 +33534,15 @@ { "name": "action", "type": "Literal['post', 'adopt', 'sign']", - "line": 223 + "line": 446 }, { "name": "note", "type": "str", - "line": 224 + "line": 447 } ], - "line": 221 + "line": 444 }, { "name": "NoticeInput", @@ -33280,30 +33553,30 @@ { "name": "notice_type", "type": "Literal['regular', 'special', 'emergency', 'closed_session', 'executive']", - "line": 229 + "line": 452 }, { "name": "posted_at", "type": "AwareDatetime", - "line": 230 + "line": 453 }, { "name": "minimum_notice_hours", "type": "int", - "line": 231 + "line": 454 }, { "name": "statutory_basis", "type": "str | None", - "line": 232 + "line": 455 }, { "name": "approved_by", "type": "str | None", - "line": 233 + "line": 456 } ], - "line": 227 + "line": 450 }, { "name": "NoticeProofInput", @@ -33314,20 +33587,20 @@ { "name": "location", "type": "str", - "line": 238 + "line": 461 }, { "name": "note", "type": "str", - "line": 239 + "line": 462 }, { "name": "document_delivery_id", "type": "str | None", - "line": 240 + "line": 463 } ], - "line": 236 + "line": 459 }, { "name": "NoticeDocumentInput", @@ -33338,10 +33611,10 @@ { "name": "text", "type": "str", - "line": 245 + "line": 468 } ], - "line": 243 + "line": 466 }, { "name": "PacketInput", @@ -33352,15 +33625,15 @@ { "name": "agenda_item_ids", "type": "list[UUID]", - "line": 305 + "line": 528 }, { "name": "source_files", "type": "list['ManagedSource']", - "line": 306 + "line": 529 } ], - "line": 303 + "line": 526 }, { "name": "TranscriptInput", @@ -33371,20 +33644,20 @@ { "name": "source_label", "type": "str", - "line": 311 + "line": 534 }, { "name": "transcript_text", "type": "str", - "line": 312 + "line": 535 }, { "name": "correction_of_id", "type": "UUID | None", - "line": 313 + "line": 536 } ], - "line": 309 + "line": 532 }, { "name": "ActionItemInput", @@ -33395,20 +33668,20 @@ { "name": "description", "type": "str", - "line": 318 + "line": 541 }, { "name": "assigned_to", "type": "str | None", - "line": 319 + "line": 542 }, { "name": "source_motion_id", "type": "UUID | None", - "line": 320 + "line": 543 } ], - "line": 316 + "line": 539 }, { "name": "ArchiveInput", @@ -33419,25 +33692,25 @@ { "name": "visibility", "type": "Literal['public', 'closed_session']", - "line": 325 + "line": 548 }, { "name": "packet_id", "type": "UUID | None", - "line": 326 + "line": 549 }, { "name": "minutes_id", "type": "UUID | None", - "line": 327 + "line": 550 }, { "name": "plain_language_summary", "type": "str", - "line": 328 + "line": 551 } ], - "line": 323 + "line": 546 }, { "name": "ManagedSource", @@ -33448,47 +33721,47 @@ { "name": "original_path", "type": "str", - "line": 426 + "line": 660 }, { "name": "stored_path", "type": "str", - "line": 427 + "line": 661 }, { "name": "file_name", "type": "str", - "line": 428 + "line": 662 }, { "name": "sha256", "type": "str", - "line": 429 + "line": 663 }, { "name": "size_bytes", "type": "int", - "line": 430 + "line": 664 } ], - "line": 424 + "line": 658 } ], "configuration": [ { "environment": "DATABASE_URL", - "line": 38 + "line": 48 }, { "environment": "TOWNLIGHT_PROFILE_ROOT", - "line": 434 + "line": 668 } ] }, { "source": "desktop/runtime/python-services/townlight_runtime/migrate.py", - "sha256": "072bcee7c652a1858a69cac4056fd7a6ecd0d19e59ca7affa536fb32d39ea081", - "bytes": 6108, + "sha256": "a7a90f0ead03886210f2a9d58f5967fa38f0ebc3780caa572dd17d978571087e", + "bytes": 6334, "routes": [], "models": [], "configuration": [ @@ -33498,6 +33771,93 @@ } ] }, + { + "source": "desktop/runtime/python-services/townlight_runtime/municipal_staff.py", + "sha256": "a70b18a727d62f59a3666f7cea68a3b71f34e066222f685e48e36ec7550519aa", + "bytes": 13612, + "routes": [ + { + "method": "GET", + "declared_path": "/boards", + "function": "list_boards", + "line": 88 + }, + { + "method": "POST", + "declared_path": "/boards", + "function": "create_board", + "line": 99 + }, + { + "method": "POST", + "declared_path": "/boards/seat", + "function": "save_seat", + "line": 112 + }, + { + "method": "POST", + "declared_path": "/boards/attendance", + "function": "save_attendance", + "line": 128 + }, + { + "method": "GET", + "declared_path": "/contracts", + "function": "list_contracts", + "line": 146 + }, + { + "method": "POST", + "declared_path": "/contracts", + "function": "register_contract", + "line": 151 + }, + { + "method": "POST", + "declared_path": "/contracts/{identity}/signed", + "function": "record_signed", + "line": 160 + }, + { + "method": "GET", + "declared_path": "/contracts/{identity}/document", + "function": "retrieve_contract", + "line": 175 + }, + { + "method": "GET", + "declared_path": "/procurement", + "function": "list_procurement", + "line": 183 + }, + { + "method": "POST", + "declared_path": "/procurement", + "function": "save_rfp", + "line": 196 + }, + { + "method": "POST", + "declared_path": "/procurement/{identity}/proposal", + "function": "save_proposal", + "line": 215 + }, + { + "method": "POST", + "declared_path": "/procurement/{identity}/award", + "function": "record_award", + "line": 226 + }, + { + "method": "POST", + "declared_path": "/procurement/{identity}/contract", + "function": "create_draft_contract", + "line": 240 + } + ], + "models": [], + "configuration": [] + }, { "source": "desktop/runtime/python-services/townlight_runtime/native_accounts.py", "sha256": "497fb326fccb61dec69b58daf35a382ab832adeed190e65d2a7f87098fb3c6e7", @@ -34137,6 +34497,82 @@ "models": [], "configuration": [] }, + { + "source": "desktop/runtime/python-services/townlight_runtime/portal_publication.py", + "sha256": "21aa6ae10a6ca00bce3afb905855083e7bf2fc7d37e9f2b49e6b2466cda94fed", + "bytes": 12282, + "routes": [ + { + "method": "GET", + "declared_path": "/selections", + "function": "selections", + "line": 38 + }, + { + "method": "POST", + "declared_path": "/bundle", + "function": "bundle", + "line": 164 + } + ], + "models": [ + { + "name": "Selection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "action", + "type": "Literal['publish', 'withdraw']", + "line": 85 + }, + { + "name": "approve_publication", + "type": "StrictBool", + "line": 86 + }, + { + "name": "archive_id", + "type": "UUID", + "line": 87 + }, + { + "name": "meeting_id", + "type": "UUID", + "line": 88 + }, + { + "name": "recording_id", + "type": "UUID", + "line": 89 + }, + { + "name": "request_id", + "type": "UUID", + "line": 90 + }, + { + "name": "release_copy_id", + "type": "UUID", + "line": 91 + }, + { + "name": "expected_release_sha256", + "type": "str", + "line": 92 + } + ], + "line": 83 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_PORTAL_MAX_BYTES", + "line": 78 + } + ] + }, { "source": "desktop/runtime/python-services/townlight_runtime/records_cutover.py", "sha256": "e0c2f9b4ef95e913c8c096bf5bc472bde66ff1eab1d1775026e8923f900675e0", @@ -34360,20 +34796,20 @@ }, { "source": "desktop/runtime/python-services/townlight_runtime/records_snapshot.py", - "sha256": "aa5bb7ee752f961c1cda5f5ebd1001d0fe603bdf3fa39857a7f28363ef8bb87d", - "bytes": 7220, + "sha256": "fdb4098bdfaa24f81118a7e41bce803c8414569644d47d5907d0daf68f994d32", + "bytes": 7630, "routes": [ { "method": "GET", "declared_path": "/state", "function": "suite_state", - "line": 67 + "line": 72 }, { "method": "POST", "declared_path": "/search", "function": "search", - "line": 85 + "line": 90 } ], "models": [ @@ -34386,107 +34822,107 @@ { "name": "query", "type": "str", - "line": 73 + "line": 78 } ], - "line": 71 + "line": 76 } ], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/services.py", - "sha256": "c2839cde26f3bd8937d492c33129b6709898c3213a8f57416710c2e8253e10bf", - "bytes": 23688, + "sha256": "2830069a2c2136c21a0acc9c488c599f72976579a8ab3e1f00b6e194c71032d7", + "bytes": 24155, "routes": [ { "method": "GET", "declared_path": "/health", "function": "runtime_health", - "line": 443 + "line": 450 }, { "method": "GET", "declared_path": "/modules", "function": "runtime_health", - "line": 443 + "line": 450 }, { "method": "GET", "declared_path": "/ready", "function": "domain_ready", - "line": 448 + "line": 455 } ], "models": [], "configuration": [ { "environment": "TOWNLIGHT_PROFILE_ROOT", - "line": 56 + "line": 59 }, { "environment": "TOWNLIGHT_DATA_DIR", - "line": 61 + "line": 64 }, { "environment": "LOCALAPPDATA", - "line": 64 + "line": 67 }, { "environment": "JWT_SECRET_FILE", - "line": 92 + "line": 95 }, { "environment": "FIRST_ADMIN_PASSWORD_FILE", - "line": 93 + "line": 96 }, { "environment": "ENCRYPTION_KEY", - "line": 94 + "line": 97 }, { "environment": "PORTAL_MODE", - "line": 99 + "line": 102 }, { "environment": "OLLAMA_BASE_URL", - "line": 100 + "line": 103 }, { "environment": "TOWNLIGHT_MEETINGS_OLLAMA_BASE_URL", - "line": 101 + "line": 104 }, { "environment": "TOWNLIGHT_CORE_LLM_PROVIDER", - "line": 102 + "line": 105 }, { "environment": "DATABASE_URL", - "line": 103 + "line": 106 }, { "environment": "DATABASE_URL", - "line": 148 + "line": 151 }, { "environment": "TOWNLIGHT_RUNTIME_HOST", - "line": 483 + "line": 490 }, { "environment": "TESTING", - "line": 113 + "line": 116 }, { "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", - "line": 242 + "line": 245 }, { "environment": "DATABASE_URL", - "line": 302 + "line": 305 }, { "environment": "TOWNLIGHT_RUNTIME_PORT", - "line": 486 + "line": 493 } ] }, @@ -34507,6 +34943,14 @@ } ] }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic.ini", + "sha256": "b40ffe9d0492f76d67e378b1b6a8cda387b08287528f28f0901dde9c383c6a26", + "bytes": 560, + "routes": [], + "models": [], + "configuration": [] + }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/env.py", "sha256": "8928b9156c23c2d63337d21c908784f87077cb515c758d3ccf0d6f88ac07ce45", @@ -34549,8 +34993,8 @@ }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/005_requests.py", - "sha256": "0a55883877cd95959d495b8865efec727f18b8bbb86bf8269a938d876e575e55", - "bytes": 3782, + "sha256": "6aea501c32aed0ad4468f7583611cf994914492c1e558780b1f210132e1c8b07", + "bytes": 3852, "routes": [], "models": [], "configuration": [] @@ -34565,24 +35009,24 @@ }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/008_extend_request_status_enum.py", - "sha256": "b98949215e447bbef20643a34445f21018e9c1719c78634dca1485740911c3f4", - "bytes": 1156, + "sha256": "4a72bcf44ad3140911a0272a8e9c49359bce1a94f4d18c6bce8a5ae8560ba833", + "bytes": 1186, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/009_fee_waivers.py", - "sha256": "3374202e15d16b5e1f64679bd6720c27ed2ebe63993c045bf75e6cc68b8fadb8", - "bytes": 1446, + "sha256": "de432a70b587dc28d188679f3642a01fa5a35848f4dc2637b0ad2e5c7cc2a3ac", + "bytes": 1482, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/010_remove_sent_status.py", - "sha256": "45aca2a0b308c0b3e519f087711e6229ff92edc5bedf538e8572c433245336c7", - "bytes": 4012, + "sha256": "42f9c5f1bf749e2c34d887d4a2a70b5404f1436e02cd663d4f046e0d20cd8bd2", + "bytes": 4109, "routes": [], "models": [], "configuration": [] @@ -34669,56 +35113,56 @@ }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/021_first_admin_password_rotation.py", - "sha256": "365d7fdfe5d733077649d00fe6983fdefd0dc2d9fc078b9cea0753d0d5f734e7", - "bytes": 796, + "sha256": "2a6321745dc34b651c2dd046f5397e48df27dd5a61098f4fc388b7f42eeb9fb4", + "bytes": 829, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/022_native_records_mapping.py", - "sha256": "1ae8180ca83c5863c1718274e5435fe1419ec48a4737ccf2434f531a4f2fd7b8", - "bytes": 4271, + "sha256": "fa2d6925e0a955356f71721aef61ccfb8f852a31462f6d54ff1503eb6ceddb92", + "bytes": 4347, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/023_native_records_lifecycle.py", - "sha256": "00633480cbda11121fc6f98aa10b978ca24213a3626ddd4106c1aa5f660e599e", - "bytes": 6067, + "sha256": "fc1b05b5a308aaa60d098e0343283f208590eb097850920422a0e1fc3b9ad96d", + "bytes": 6160, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/024_records_file_evidence.py", - "sha256": "09c48872ab8e378d709542e20f8495cb1857146b78238e73de570a21151f2fcf", - "bytes": 2553, + "sha256": "921fbd10598946aa5c697b0f10c84f54e3d95167eeda12133848c7d037dc1c44", + "bytes": 2598, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/025_records_artifacts.py", - "sha256": "b4f4c62211d57b123978fe78ae3dc0c7503110ccae9422776e1bd6d13d003b8a", - "bytes": 2526, + "sha256": "43b52fbd757e174cc813fbb9b50f387171c68048da7bcb4838f2c1aace3b0228", + "bytes": 2571, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/026_native_public_actor.py", - "sha256": "3958251d4c9710ffc20572ee7dcc0fe2dbc169e6f56bd1461d6c1239c2ac231c", - "bytes": 631, + "sha256": "a41751bfd9d991f166c042f2632670963a68a6ecab643406574a5ffb03ca0123", + "bytes": 649, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/027_import_artifact_order.py", - "sha256": "9ef98e386a1dc848a1fab6893b009198d70556020482df207618519a3301faf8", - "bytes": 430, + "sha256": "38dba1eb3f6fa1a2444e716deb630cc83dcdff4bc1129ee62d2bdaba3116d042", + "bytes": 446, "routes": [], "models": [], "configuration": [] @@ -34731,14 +35175,6 @@ "models": [], "configuration": [] }, - { - "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic.ini", - "sha256": "60e69c28e3c87e101995977223073125b196202555e1fc18902feed2afdc7e7e", - "bytes": 524, - "routes": [], - "models": [], - "configuration": [] - }, { "source": "desktop/runtime/python-services/townlight_runtime/zoning_bridge.py", "sha256": "9bb3476d8f8365285cd486b86bdc27b0e28d34519610fdc379d2c58d42d2de54", @@ -35141,24 +35577,24 @@ }, { "source": "desktop/src-tauri/src/domain_client.rs", - "sha256": "95e608acfac2f5621205314a61a317f50437f53b1bbee9cdd2e59431ee893a2c", - "bytes": 41159, + "sha256": "2730a1f7b703472058d9a0beed2be640aeb8f0ccb6433947c05c12744d7ca78a", + "bytes": 45633, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src-tauri/src/domain_files.rs", - "sha256": "85e715da4f8b0762bd2496755c76cbc1b7bc3e81f7d23995cf3ecc16b55a5095", - "bytes": 13384, + "sha256": "2ad354834ca1f6681d7bb128511c8e1f19ab205fcb86bd77e7230f6a3b38785f", + "bytes": 13394, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src-tauri/src/first_run.rs", - "sha256": "45e42d7fae458cf4546bedb6b55d5e25cdc617ebda8fc612cef9e0838124b00f", - "bytes": 56023, + "sha256": "406848985ec243c49c9d23d5572ffbcdb69dfa531f6dd44f814b3bb364a96d0e", + "bytes": 55973, "routes": [], "models": [], "configuration": [] @@ -35189,32 +35625,40 @@ }, { "source": "desktop/src-tauri/src/main.rs", - "sha256": "a0b4dd53a0b7c2c4a4e10ae19d236c5bafadc5c3d01065ed89a6fdbfbac31378", - "bytes": 80956, + "sha256": "43be9346f7f64f40a2fa9bfb18fc7d15f9bdf3d437e1d80c542665e2b1d70b03", + "bytes": 84133, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src-tauri/src/model.rs", - "sha256": "dbec92b4eb25790ac05c55cde83458819559d5918c97dee0c57258b0cdb36d4c", - "bytes": 100505, + "sha256": "600fc3b38376c7720ec2a438da40a37d4071d8e332edc8c3209e9c7479d60616", + "bytes": 100523, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src-tauri/src/module_registry.rs", - "sha256": "d7afcece112c88cd421932c4502446280dffbbf732ee99b06951a2054edf050a", - "bytes": 61224, + "sha256": "9e67b854db41ea33c5d6f2ccb9d3a611cc054a4800b5a14c73a33aca4957ec82", + "bytes": 67204, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/municipal_staff.rs", + "sha256": "4e212b5aef44a22518f3cb6339bc8f93305ecd8fb57d00f9394998686f074121", + "bytes": 3719, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src-tauri/src/notice_client.rs", - "sha256": "6ae504993b9f503b05dbc4acbbedf58a52895c19f9c16298723de094a17d4ae3", - "bytes": 2591, + "sha256": "733c79e76e2a9eb1065c248926d54c4b44b25f850de698c0f56943f322343b77", + "bytes": 3080, "routes": [], "models": [], "configuration": [] @@ -35245,8 +35689,16 @@ }, { "source": "desktop/src-tauri/src/profile_identity.rs", - "sha256": "04f49fc1fcf51adadf958a100204db63c8527034fbb679df15a589794c01fb3a", - "bytes": 2536, + "sha256": "95dce3f213dabe76c2137c6e2433b7accf4fa7d3b423bd7655f33b00a3a63294", + "bytes": 2639, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/published_client.rs", + "sha256": "6ad357e8caec31c95a5636af70832c0c0e334bb1ed47d064c2e9ee6be359c2d2", + "bytes": 4352, "routes": [], "models": [], "configuration": [] @@ -35261,8 +35713,8 @@ }, { "source": "desktop/src-tauri/src/supervisor.rs", - "sha256": "9266597ef98e59e965241df5b9e48face47c1f2483af634733c67a3de352616a", - "bytes": 212785, + "sha256": "ef449704cb76a44de1eee2e26b8cfc840d1c286f7b109a75ebe8812085ea3fc6", + "bytes": 224477, "routes": [], "models": [], "configuration": [] @@ -35301,40 +35753,56 @@ }, { "source": "desktop/src/inspections/view.js", - "sha256": "7f3bb66fbaf5f78705c729e2db82dafd77b6c0ea6a2accd2aed57ad057d980bf", - "bytes": 17631, + "sha256": "e39bc42d5fee6be4653483f7477f23ceda27d9b6e4501d4c9272bebeca79055e", + "bytes": 17743, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src/main.js", - "sha256": "1c3cd828e8c142fbcb0242a172c967dcbc56dacec400c8063a339238bfae5c02", - "bytes": 356383, + "sha256": "11f4f61bf9bef7ec0249d15acdc5a9e9d494fc1eab1afc00d1f4ce314ad7dbf5", + "bytes": 362150, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src/meetings/client.ts", - "sha256": "ba12839650f17a66d5eff5782c0e5feb1a9ad7abfbe1442958b86d9f7813e1cc", - "bytes": 6896, + "sha256": "4a8ec25c9baa81c54db15b41c4f3493393ec2e4cf04af947e9cc7ce02bdd40bf", + "bytes": 9452, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/meetings/import-links.js", + "sha256": "ce29f4aec5624b33ed9d8b7e271efeb070865d4fd2c4c9317383501cb69b9a51", + "bytes": 4241, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src/meetings/view.js", - "sha256": "3d12d5fde231bd777eb3717aac068a8397afe4b2182debff3711592c9881ac24", - "bytes": 17252, + "sha256": "36fbcbc8632608ba0318b075f0ef4f9d7a16393bd68b89608891b1de35344968", + "bytes": 25982, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/municipal/view.js", + "sha256": "f3d39e8391a00b698b4a62fa76e7ececdfdbda13cb42836c421ae1acf39344da", + "bytes": 13749, "routes": [], "models": [], "configuration": [] }, { "source": "desktop/src/notice/view.js", - "sha256": "05fdae1f9647ea84ef1afee51dda4aad72fdf2765dd32dab8e987c043b14cbf1", - "bytes": 9626, + "sha256": "80dd3abbbd96a40c6b62c3bc2bf00eb73a6dc1c0ccf62329bcd036b464e7d47c", + "bytes": 10113, "routes": [], "models": [], "configuration": [] @@ -35379,6 +35847,14 @@ "models": [], "configuration": [] }, + { + "source": "desktop/src/published/view.js", + "sha256": "31252e030cf41a2371f02a06b3d1f060bec20f7b2e2754470127e27a0cd9ad08", + "bytes": 4204, + "routes": [], + "models": [], + "configuration": [] + }, { "source": "desktop/src/records/access-client.ts", "sha256": "6c284a448745a2f3872b2a36dbe1ccd30d0426212362f8c944a923061656b5a7", @@ -35429,8 +35905,8 @@ }, { "source": "desktop/src/records/view.js", - "sha256": "78b60d7322fffa44e77e9431ed194fae3470fc0210f81801aa2961c186b73db1", - "bytes": 26073, + "sha256": "0608696960cd1cd53e36451a8444a71bb9c9791f1364791a63e3ce42af73ce90", + "bytes": 26054, "routes": [], "models": [], "configuration": [] @@ -35468,6 +35944,1975 @@ "configuration": [] } ] + }, + "boards": { + "repository": "townlight/boards", + "repository_head": "d14340b713c880908cc27e383a59271ed0471ac0", + "working_tree_modified": false, + "principal_import": "townlight_boards", + "source": [ + { + "source": "townlight_boards/__init__.py", + "sha256": "440ba578a47b1c9fa1fcac47824b885c27e2667fc50b4c1fc129703016b06d6a", + "bytes": 59, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_boards/attendance_tracker.py", + "sha256": "6c8b978c398f7577c95884fc948dae4ed7b8da8e6db6f7db6071b9bf212e0b42", + "bytes": 1228, + "routes": [], + "models": [ + { + "name": "AttendanceSummary", + "bases": [], + "fields": [ + { + "name": "member_name", + "type": "str", + "line": 12 + }, + { + "name": "attendance_status", + "type": "str", + "line": 13 + }, + { + "name": "review_notes", + "type": "tuple[str, ...]", + "line": 14 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 15 + }, + { + "name": "disclaimer", + "type": "str", + "line": 16 + } + ], + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_boards/board_registry.py", + "sha256": "4a105019c690fe8212fbfd2ef62a0da38371c9421865cae342c9ff1fab34c687", + "bytes": 1249, + "routes": [], + "models": [ + { + "name": "BoardRoster", + "bases": [], + "fields": [ + { + "name": "board_id", + "type": "str", + "line": 17 + }, + { + "name": "board_name", + "type": "str", + "line": 18 + }, + { + "name": "liaison", + "type": "str", + "line": 19 + }, + { + "name": "roster_notes", + "type": "tuple[str, ...]", + "line": 20 + }, + { + "name": "disclaimer", + "type": "str", + "line": 21 + } + ], + "line": 16 + } + ], + "configuration": [] + }, + { + "source": "townlight_boards/main.py", + "sha256": "6fbc305a8d6d3b38d97cbd352535a01b6f40cbe9eec64a08b353d1ca9417737e", + "bytes": 8193, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 60 + }, + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 79 + }, + { + "method": "GET", + "declared_path": "/townlight_boards", + "function": "public_townlight_boards_page", + "line": 91 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_boards/registry", + "function": "board_registry", + "line": 98 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_boards/registry/{board_id}", + "function": "get_board_registry", + "line": 108 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_boards/terms", + "function": "term_plan", + "line": 130 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_boards/vacancies", + "function": "vacancy_checklist", + "line": 138 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_boards/attendance", + "function": "attendance_summary", + "line": 146 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_boards/attendance/{attendance_id}", + "function": "get_attendance_review", + "line": 166 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_boards/export", + "function": "records_export", + "line": 188 + } + ], + "models": [ + { + "name": "BoardRegistryRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "board_id", + "type": "str", + "line": 32 + }, + { + "name": "board_name", + "type": "str", + "line": 33 + }, + { + "name": "liaison", + "type": "str", + "line": 34 + } + ], + "line": 31 + }, + { + "name": "TermRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "member_name", + "type": "str", + "line": 38 + }, + { + "name": "term_end", + "type": "date", + "line": 39 + } + ], + "line": 37 + }, + { + "name": "VacancyRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "board_name", + "type": "str", + "line": 43 + }, + { + "name": "vacancy_reason", + "type": "str", + "line": 44 + } + ], + "line": 42 + }, + { + "name": "AttendanceRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "member_name", + "type": "str", + "line": 48 + }, + { + "name": "meetings_attended", + "type": "int", + "line": 49 + }, + { + "name": "meetings_held", + "type": "int", + "line": 50 + } + ], + "line": 47 + }, + { + "name": "RecordsExportRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "board_id", + "type": "str", + "line": 54 + }, + { + "name": "title", + "type": "str", + "line": 55 + }, + { + "name": "format", + "type": "str", + "line": 56 + } + ], + "line": 53 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_BOARDS_ROSTER_DB_URL", + "line": 197 + } + ] + }, + { + "source": "townlight_boards/notice_export.py", + "sha256": "8a933b60b61ac5db5f1615ffbce614619a97f887b4b79c8a2d85446ea83124b5", + "bytes": 1220, + "routes": [], + "models": [ + { + "name": "BoardRecordsExport", + "bases": [], + "fields": [ + { + "name": "board_id", + "type": "str", + "line": 12 + }, + { + "name": "title", + "type": "str", + "line": 13 + }, + { + "name": "checklist", + "type": "tuple[str, ...]", + "line": 14 + }, + { + "name": "retention_note", + "type": "str", + "line": 15 + }, + { + "name": "disclaimer", + "type": "str", + "line": 16 + } + ], + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_boards/persistence.py", + "sha256": "9ea50efc00cdf8e05158663138bc3ad362e1776482b13ff0640c02be0f45de6d", + "bytes": 8063, + "routes": [], + "models": [ + { + "name": "StoredAttendanceReview", + "bases": [], + "fields": [ + { + "name": "attendance_id", + "type": "str", + "line": 47 + }, + { + "name": "member_name", + "type": "str", + "line": 48 + }, + { + "name": "meetings_attended", + "type": "int", + "line": 49 + }, + { + "name": "meetings_held", + "type": "int", + "line": 50 + }, + { + "name": "attendance_status", + "type": "str", + "line": 51 + }, + { + "name": "review_notes", + "type": "tuple[str, ...]", + "line": 52 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 53 + }, + { + "name": "disclaimer", + "type": "str", + "line": 54 + }, + { + "name": "created_at", + "type": "datetime", + "line": 55 + } + ], + "line": 46 + } + ], + "configuration": [] + }, + { + "source": "townlight_boards/public_ui.py", + "sha256": "feb2530b3667adbf60086b2d2c652dc970406017333255a5c2807479d24cb160", + "bytes": 5515, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_boards/staff_workflow.py", + "sha256": "57586a9590578e610becda0337a2b00c92f022f8567dea1dc0ac543a193debbf", + "bytes": 2587, + "routes": [], + "models": [ + { + "name": "BoardInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "board_name", + "type": "ShortText", + "line": 38 + }, + { + "name": "liaison", + "type": "ShortText", + "line": 39 + } + ], + "line": 35 + }, + { + "name": "SeatInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "board_id", + "type": "UUID", + "line": 45 + }, + { + "name": "seat_name", + "type": "ShortText", + "line": 46 + }, + { + "name": "member_name", + "type": "ShortText | None", + "line": 47 + }, + { + "name": "term_start", + "type": "date | None", + "line": 48 + }, + { + "name": "term_end", + "type": "date | None", + "line": 49 + } + ], + "line": 42 + }, + { + "name": "AttendanceInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "seat_id", + "type": "UUID", + "line": 64 + }, + { + "name": "meeting_id", + "type": "UUID", + "line": 65 + }, + { + "name": "present", + "type": "bool", + "line": 66 + } + ], + "line": 61 + } + ], + "configuration": [] + }, + { + "source": "townlight_boards/term_tracker.py", + "sha256": "58876b08322356db72d6d3e8e81e2047b27115a54038c61a9e34aae024a1e5a1", + "bytes": 1157, + "routes": [], + "models": [ + { + "name": "TermReviewPlan", + "bases": [], + "fields": [ + { + "name": "member_name", + "type": "str", + "line": 13 + }, + { + "name": "term_end", + "type": "date", + "line": 14 + }, + { + "name": "reminders", + "type": "tuple[str, ...]", + "line": 15 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 16 + }, + { + "name": "disclaimer", + "type": "str", + "line": 17 + } + ], + "line": 12 + } + ], + "configuration": [] + }, + { + "source": "townlight_boards/vacancy_tracker.py", + "sha256": "a89da9382e2fe7874c66866b8bd27c7d38485475e2bf3845ef4c8febaf646fd1", + "bytes": 1125, + "routes": [], + "models": [ + { + "name": "VacancyChecklist", + "bases": [], + "fields": [ + { + "name": "board_name", + "type": "str", + "line": 12 + }, + { + "name": "vacancy_reason", + "type": "str", + "line": 13 + }, + { + "name": "checklist", + "type": "tuple[str, ...]", + "line": 14 + }, + { + "name": "public_notice_required", + "type": "bool", + "line": 15 + }, + { + "name": "disclaimer", + "type": "str", + "line": 16 + } + ], + "line": 11 + } + ], + "configuration": [] + } + ] + }, + "contracts": { + "repository": "townlight/contracts", + "repository_head": "873de5bbff0f596b2c7cf20da4c68e94c3c3934c", + "working_tree_modified": false, + "principal_import": "townlight_contracts", + "source": [ + { + "source": "townlight_contracts/__init__.py", + "sha256": "47e1fe7a017a468c960391130c34ca9538c49966411c3c44d50db7e7ab64b79d", + "bytes": 61, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_contracts/clause_lookup.py", + "sha256": "2dc4c91ad5aff85708ef2fa52329190dbd9e4858152d87467b46a21dbfe83e62", + "bytes": 1268, + "routes": [], + "models": [ + { + "name": "ClauseLookup", + "bases": [], + "fields": [ + { + "name": "query", + "type": "str", + "line": 12 + }, + { + "name": "matched_topics", + "type": "tuple[str, ...]", + "line": 13 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 14 + }, + { + "name": "disclaimer", + "type": "str", + "line": 15 + } + ], + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_contracts/contract_registry.py", + "sha256": "c4c8bfe817af0718d724984b53e25c9c83e699a9e3e5f3b4241dd230e8d4bd44", + "bytes": 1616, + "routes": [], + "models": [ + { + "name": "ContractRecord", + "bases": [], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 17 + }, + { + "name": "vendor_name", + "type": "str", + "line": 18 + }, + { + "name": "contract_type", + "type": "str", + "line": 19 + }, + { + "name": "registry_notes", + "type": "tuple[str, ...]", + "line": 20 + }, + { + "name": "disclaimer", + "type": "str", + "line": 21 + } + ], + "line": 16 + } + ], + "configuration": [] + }, + { + "source": "townlight_contracts/expiration_tracker.py", + "sha256": "5ec2d0c757a0676c2cbff8d23c7d42e82867b688b73e854e40173ff88878c799", + "bytes": 1153, + "routes": [], + "models": [ + { + "name": "ExpirationPlan", + "bases": [], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 11 + }, + { + "name": "expiration_date", + "type": "date", + "line": 12 + }, + { + "name": "reminders", + "type": "tuple[str, ...]", + "line": 13 + }, + { + "name": "staff_note", + "type": "str", + "line": 14 + } + ], + "line": 10 + } + ], + "configuration": [] + }, + { + "source": "townlight_contracts/main.py", + "sha256": "b4d8761a480d53a05b246dea363c681d57d2d564ec7330d341771a40e67c6b23", + "bytes": 8506, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 60 + }, + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 80 + }, + { + "method": "GET", + "declared_path": "/townlight_contracts", + "function": "public_townlight_contracts_page", + "line": 92 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_contracts/registry", + "function": "contract_registry", + "line": 99 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_contracts/registry/{contract_id}", + "function": "get_contract_registry", + "line": 109 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_contracts/clauses/lookup", + "function": "clause_lookup", + "line": 131 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_contracts/expirations", + "function": "expiration_plan", + "line": 139 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_contracts/renewals/summary", + "function": "renewal_summary", + "line": 147 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_contracts/renewals/{contract_id}", + "function": "get_renewal_summary", + "line": 165 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_contracts/export", + "function": "records_export", + "line": 187 + } + ], + "models": [ + { + "name": "ContractRegistryRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 32 + }, + { + "name": "vendor_name", + "type": "str", + "line": 33 + }, + { + "name": "contract_type", + "type": "str", + "line": 34 + } + ], + "line": 31 + }, + { + "name": "ClauseLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "query", + "type": "str", + "line": 38 + }, + { + "name": "contract_text", + "type": "str", + "line": 39 + } + ], + "line": 37 + }, + { + "name": "ExpirationRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 43 + }, + { + "name": "expiration_date", + "type": "date", + "line": 44 + } + ], + "line": 42 + }, + { + "name": "RenewalRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 48 + }, + { + "name": "renewal_terms", + "type": "str", + "line": 49 + }, + { + "name": "department_notes", + "type": "str", + "line": 50 + } + ], + "line": 47 + }, + { + "name": "RecordsExportRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 54 + }, + { + "name": "title", + "type": "str", + "line": 55 + }, + { + "name": "format", + "type": "str", + "line": 56 + } + ], + "line": 53 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_CONTRACTS_REGISTRY_DB_URL", + "line": 196 + } + ] + }, + { + "source": "townlight_contracts/persistence.py", + "sha256": "37eccd89e8008e3d39cb6199b92a50b17e8bce760678794e10d24e2f3d7a0cf9", + "bytes": 7590, + "routes": [], + "models": [ + { + "name": "StoredRenewalSummary", + "bases": [], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 44 + }, + { + "name": "renewal_terms", + "type": "str", + "line": 45 + }, + { + "name": "department_notes", + "type": "str", + "line": 46 + }, + { + "name": "renewal_status", + "type": "str", + "line": 47 + }, + { + "name": "visibility_items", + "type": "tuple[str, ...]", + "line": 48 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 49 + }, + { + "name": "created_at", + "type": "datetime", + "line": 50 + } + ], + "line": 43 + } + ], + "configuration": [] + }, + { + "source": "townlight_contracts/public_ui.py", + "sha256": "f7766c4b71b23b835171b980a93f104b4a6a25e5845bc2a0a0cabaea3b8b1ee4", + "bytes": 5634, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_contracts/records_export.py", + "sha256": "93e3abb766d86a1f5b9d24bac424cc787721c7e61809630496bd477886d2c689", + "bytes": 1200, + "routes": [], + "models": [ + { + "name": "ContractRecordsExport", + "bases": [], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 10 + }, + { + "name": "title", + "type": "str", + "line": 11 + }, + { + "name": "format", + "type": "str", + "line": 12 + }, + { + "name": "checklist", + "type": "tuple[str, ...]", + "line": 13 + }, + { + "name": "retention_note", + "type": "str", + "line": 14 + } + ], + "line": 9 + } + ], + "configuration": [] + }, + { + "source": "townlight_contracts/renewal_visibility.py", + "sha256": "2524eb08f82f14907d0b787f435a398998e60797e8d279dfea2811cb4405325d", + "bytes": 1273, + "routes": [], + "models": [ + { + "name": "RenewalSummary", + "bases": [], + "fields": [ + { + "name": "contract_id", + "type": "str", + "line": 10 + }, + { + "name": "renewal_status", + "type": "str", + "line": 11 + }, + { + "name": "visibility_items", + "type": "tuple[str, ...]", + "line": 12 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 13 + } + ], + "line": 9 + } + ], + "configuration": [] + }, + { + "source": "townlight_contracts/staff_workflow.py", + "sha256": "535a085381b591c2e56a65e3871b084aba62c8e83162c576f2517ba6d799a063", + "bytes": 2329, + "routes": [], + "models": [ + { + "name": "SignedAgreement", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "ShortText", + "line": 39 + }, + { + "name": "vendor_name", + "type": "ShortText", + "line": 40 + }, + { + "name": "owner", + "type": "ShortText", + "line": 41 + }, + { + "name": "start_date", + "type": "date", + "line": 42 + }, + { + "name": "expiration_date", + "type": "date", + "line": 43 + }, + { + "name": "renewal_due", + "type": "date", + "line": 44 + }, + { + "name": "document_name", + "type": "ShortText", + "line": 45 + }, + { + "name": "document_content", + "type": "Base64Bytes", + "line": 46 + } + ], + "line": 36 + } + ], + "configuration": [] + } + ] + }, + "procurement": { + "repository": "townlight/procure", + "repository_head": "f10cd99f65f5f867d331af3bd6e60742bca61268", + "working_tree_modified": false, + "principal_import": "townlight_procurement", + "source": [ + { + "source": "townlight_procurement/__init__.py", + "sha256": "69fbaa7fba22edfb86fb9c4f795a158e416d3b6d1d684b3b5b4c44943ea91382", + "bytes": 62, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_procurement/award_packet.py", + "sha256": "e4d578ca7b4b2d76e6997645bdbfedbb2feb60d1ff9af519b7708be62a51fd2a", + "bytes": 1243, + "routes": [], + "models": [ + { + "name": "AwardPacketChecklist", + "bases": [], + "fields": [ + { + "name": "solicitation_id", + "type": "str", + "line": 10 + }, + { + "name": "title", + "type": "str", + "line": 11 + }, + { + "name": "format", + "type": "str", + "line": 12 + }, + { + "name": "checklist", + "type": "tuple[str, ...]", + "line": 13 + }, + { + "name": "retention_note", + "type": "str", + "line": 14 + } + ], + "line": 9 + } + ], + "configuration": [] + }, + { + "source": "townlight_procurement/exception_extract.py", + "sha256": "baa3ccc285cfd06c4a47e224173d36156d19053cc3ec7adb973b0d23980a1310", + "bytes": 1400, + "routes": [], + "models": [ + { + "name": "ProposalExceptions", + "bases": [], + "fields": [ + { + "name": "vendor_name", + "type": "str", + "line": 12 + }, + { + "name": "flags", + "type": "tuple[str, ...]", + "line": 13 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 14 + }, + { + "name": "disclaimer", + "type": "str", + "line": 15 + } + ], + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_procurement/integration_mocks.py", + "sha256": "f862f93a12dd4b024736f83b376b74d8e5eeedb29bcde18d8c3d998995692a72", + "bytes": 2515, + "routes": [], + "models": [ + { + "name": "IntegrationMockResult", + "bases": [], + "fields": [ + { + "name": "scenario", + "type": "str", + "line": 11 + }, + { + "name": "status", + "type": "str", + "line": 12 + }, + { + "name": "review_required", + "type": "bool", + "line": 13 + }, + { + "name": "findings", + "type": "tuple[str, ...]", + "line": 14 + }, + { + "name": "boundary", + "type": "str", + "line": 15 + } + ], + "line": 10 + } + ], + "configuration": [] + }, + { + "source": "townlight_procurement/main.py", + "sha256": "166295030ca233856d99d776fb71499294389d10918c44154a9c7a1f68f8e811", + "bytes": 16816, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 102 + }, + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 123 + }, + { + "method": "GET", + "declared_path": "/townlight_procurement", + "function": "public_townlight_procurement_page", + "line": 135 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_procurement/rfps/draft", + "function": "rfp_draft", + "line": 142 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_procurement/rfps/draft/{draft_id}", + "function": "get_rfp_draft", + "line": 168 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_procurement/proposals/compare", + "function": "proposal_compare", + "line": 190 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_procurement/proposals/exceptions", + "function": "proposal_exceptions", + "line": 199 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_procurement/scoring/summary", + "function": "scoring_summary", + "line": 208 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_procurement/award-packet", + "function": "award_packet", + "line": 217 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_procurement/award-packet/{packet_id}", + "function": "get_award_packet", + "line": 243 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_procurement/context/procurement-review", + "function": "procurement_review_context", + "line": 265 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_procurement/integrations/mock/procurement-context", + "function": "integration_mock_procurement_context", + "line": 296 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_procurement/staff/reviews", + "function": "create_staff_review", + "line": 308 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_procurement/staff/reviews", + "function": "list_staff_reviews", + "line": 323 + }, + { + "method": "PATCH", + "declared_path": "/api/v1/townlight_procurement/staff/reviews/{review_id}", + "function": "update_staff_review", + "line": 338 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_procurement/staff/reviews/summary", + "function": "staff_review_summary", + "line": 368 + } + ], + "models": [ + { + "name": "RfpDraftRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "procurement_title", + "type": "str", + "line": 40 + }, + { + "name": "procurement_type", + "type": "str", + "line": 41 + }, + { + "name": "city_need", + "type": "str", + "line": 42 + } + ], + "line": 39 + }, + { + "name": "ProposalCompareRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "solicitation_title", + "type": "str", + "line": 46 + }, + { + "name": "proposal_summaries", + "type": "list[str]", + "line": 47 + } + ], + "line": 45 + }, + { + "name": "ExceptionExtractRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "vendor_name", + "type": "str", + "line": 51 + }, + { + "name": "proposal_text", + "type": "str", + "line": 52 + } + ], + "line": 50 + }, + { + "name": "ScoringSummaryRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "solicitation_title", + "type": "str", + "line": 56 + }, + { + "name": "criteria", + "type": "list[str]", + "line": 57 + } + ], + "line": 55 + }, + { + "name": "AwardPacketRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "solicitation_id", + "type": "str", + "line": 61 + }, + { + "name": "title", + "type": "str", + "line": 62 + }, + { + "name": "format", + "type": "str", + "line": 63 + } + ], + "line": 60 + }, + { + "name": "ProcurementContextRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "solicitation_id", + "type": "str", + "line": 67 + }, + { + "name": "procurement_title", + "type": "str", + "line": 68 + }, + { + "name": "solicitation_context_id", + "type": "str", + "line": 69 + }, + { + "name": "clerk_context_id", + "type": "str", + "line": 70 + }, + { + "name": "contract_context_id", + "type": "str", + "line": 71 + }, + { + "name": "source_date_status", + "type": "str", + "line": 72 + } + ], + "line": 66 + }, + { + "name": "IntegrationMockRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "scenario", + "type": "str", + "line": 76 + }, + { + "name": "role", + "type": "str", + "line": 77 + }, + { + "name": "solicitation_context_id", + "type": "str", + "line": 78 + }, + { + "name": "clerk_context_id", + "type": "str", + "line": 79 + }, + { + "name": "contract_context_id", + "type": "str", + "line": 80 + }, + { + "name": "official_vendor_evaluation", + "type": "bool", + "line": 81 + }, + { + "name": "award_decision", + "type": "bool", + "line": 82 + }, + { + "name": "procurement_submitted", + "type": "bool", + "line": 83 + }, + { + "name": "legal_advice", + "type": "bool", + "line": 84 + }, + { + "name": "vendor_portal_source", + "type": "str", + "line": 85 + }, + { + "name": "source_date_status", + "type": "str", + "line": 86 + } + ], + "line": 75 + }, + { + "name": "StaffReviewCreateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "procurement_title", + "type": "str", + "line": 90 + }, + { + "name": "reason", + "type": "str", + "line": 91 + }, + { + "name": "solicitation_id", + "type": "str | None", + "line": 92 + } + ], + "line": 89 + }, + { + "name": "StaffReviewUpdateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "status", + "type": "str", + "line": 96 + }, + { + "name": "assigned_to", + "type": "str | None", + "line": 97 + }, + { + "name": "resolution", + "type": "str | None", + "line": 98 + } + ], + "line": 95 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_PROCUREMENT_WORKPAPER_DB_URL", + "line": 376 + } + ] + }, + { + "source": "townlight_procurement/persistence.py", + "sha256": "b5ddb4a30b45345522043a6470a69022cb2d465fd2b4cc1b6afd8543f5c3b884", + "bytes": 11469, + "routes": [], + "models": [ + { + "name": "StoredRfpDraft", + "bases": [], + "fields": [ + { + "name": "draft_id", + "type": "str", + "line": 66 + }, + { + "name": "procurement_title", + "type": "str", + "line": 67 + }, + { + "name": "procurement_type", + "type": "str", + "line": 68 + }, + { + "name": "recommended_owner", + "type": "str", + "line": 69 + }, + { + "name": "sections", + "type": "list[str]", + "line": 70 + }, + { + "name": "disclaimer", + "type": "str", + "line": 71 + }, + { + "name": "created_at", + "type": "datetime", + "line": 72 + } + ], + "line": 65 + }, + { + "name": "StoredAwardPacket", + "bases": [], + "fields": [ + { + "name": "packet_id", + "type": "str", + "line": 77 + }, + { + "name": "solicitation_id", + "type": "str", + "line": 78 + }, + { + "name": "title", + "type": "str", + "line": 79 + }, + { + "name": "format", + "type": "str", + "line": 80 + }, + { + "name": "checklist", + "type": "list[str]", + "line": 81 + }, + { + "name": "retention_note", + "type": "str", + "line": 82 + }, + { + "name": "created_at", + "type": "datetime", + "line": 83 + } + ], + "line": 76 + }, + { + "name": "StaffReviewQueueItem", + "bases": [], + "fields": [ + { + "name": "review_id", + "type": "str", + "line": 88 + }, + { + "name": "solicitation_id", + "type": "str | None", + "line": 89 + }, + { + "name": "procurement_title", + "type": "str", + "line": 90 + }, + { + "name": "status", + "type": "str", + "line": 91 + }, + { + "name": "reason", + "type": "str", + "line": 92 + }, + { + "name": "assigned_to", + "type": "str | None", + "line": 93 + }, + { + "name": "resolution", + "type": "str | None", + "line": 94 + }, + { + "name": "created_by", + "type": "str", + "line": 95 + }, + { + "name": "created_at", + "type": "datetime", + "line": 96 + }, + { + "name": "updated_at", + "type": "datetime", + "line": 97 + }, + { + "name": "visibility", + "type": "str", + "line": 98 + } + ], + "line": 87 + }, + { + "name": "StaffReviewSummary", + "bases": [], + "fields": [ + { + "name": "total_items", + "type": "int", + "line": 103 + }, + { + "name": "by_status", + "type": "dict[str, int]", + "line": 104 + }, + { + "name": "open_items", + "type": "int", + "line": 105 + }, + { + "name": "generated_at", + "type": "datetime", + "line": 106 + }, + { + "name": "visibility", + "type": "str", + "line": 107 + } + ], + "line": 102 + } + ], + "configuration": [] + }, + { + "source": "townlight_procurement/proposal_compare.py", + "sha256": "92b77f3d39db229c63460b2609f9527173fc32e686fa692f0183f85abe7e908c", + "bytes": 1206, + "routes": [], + "models": [ + { + "name": "ProposalComparison", + "bases": [], + "fields": [ + { + "name": "solicitation_title", + "type": "str", + "line": 12 + }, + { + "name": "proposal_count", + "type": "int", + "line": 13 + }, + { + "name": "comparison_rows", + "type": "tuple[str, ...]", + "line": 14 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 15 + }, + { + "name": "disclaimer", + "type": "str", + "line": 16 + } + ], + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_procurement/public_ui.py", + "sha256": "44ffb29e12b2d675ccfb5b561b6e8442bb3b5a349dbb611f93ae775c7ffdb7da", + "bytes": 5801, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_procurement/rfp_draft.py", + "sha256": "3fc94ad07accbd5439f196f8701359f9d4a711fba37fedf70e97ba458ed799eb", + "bytes": 1860, + "routes": [], + "models": [ + { + "name": "RfpOutline", + "bases": [], + "fields": [ + { + "name": "procurement_title", + "type": "str", + "line": 17 + }, + { + "name": "procurement_type", + "type": "str", + "line": 18 + }, + { + "name": "recommended_owner", + "type": "str", + "line": 19 + }, + { + "name": "sections", + "type": "tuple[str, ...]", + "line": 20 + }, + { + "name": "disclaimer", + "type": "str", + "line": 21 + } + ], + "line": 16 + } + ], + "configuration": [] + }, + { + "source": "townlight_procurement/scoring_summary.py", + "sha256": "1fffda896306b9795a45375e76572704b2adc0a76bf7e98ca7add60651926372", + "bytes": 1243, + "routes": [], + "models": [ + { + "name": "ScoringSummary", + "bases": [], + "fields": [ + { + "name": "solicitation_title", + "type": "str", + "line": 10 + }, + { + "name": "criteria", + "type": "tuple[str, ...]", + "line": 11 + }, + { + "name": "summary_sections", + "type": "tuple[str, ...]", + "line": 12 + }, + { + "name": "staff_note", + "type": "str", + "line": 13 + } + ], + "line": 9 + } + ], + "configuration": [] + }, + { + "source": "townlight_procurement/staff_workflow.py", + "sha256": "497c96d96d82363d685e80d3080789bdd6a70e34bce4bf97e51e0745a9e0cdcc", + "bytes": 2269, + "routes": [], + "models": [ + { + "name": "RfpInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "ShortText", + "line": 40 + }, + { + "name": "procurement_type", + "type": "ShortText", + "line": 41 + }, + { + "name": "city_need", + "type": "Annotated[str, Field(min_length=1, max_length=8000)]", + "line": 42 + } + ], + "line": 37 + }, + { + "name": "ProposalInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "vendor_name", + "type": "ShortText", + "line": 48 + }, + { + "name": "summary", + "type": "Annotated[str, Field(min_length=1, max_length=8000)]", + "line": 49 + }, + { + "name": "staff_score", + "type": "Annotated[int, Field(ge=0, le=100, strict=True)]", + "line": 50 + }, + { + "name": "staff_exceptions", + "type": "Notes", + "line": 51 + } + ], + "line": 45 + }, + { + "name": "AwardInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "proposal_id", + "type": "UUID", + "line": 57 + }, + { + "name": "decision_reference", + "type": "ShortText", + "line": 58 + }, + { + "name": "decision_note", + "type": "Annotated[str, Field(min_length=1, max_length=8000)]", + "line": 59 + } + ], + "line": 54 + } + ], + "configuration": [] + } + ] } } } diff --git a/docs/beta-1/reference/windows-1.8.1.1-source-pins.json b/docs/beta-1/reference/windows-1.8.1.1-source-pins.json new file mode 100644 index 0000000..9f374c9 --- /dev/null +++ b/docs/beta-1/reference/windows-1.8.1.1-source-pins.json @@ -0,0 +1,107 @@ +{ + "core": { + "repository": "townlight/core", + "commit": "3021821bf9a92c790a399ad12aed821d65b09105", + "archive": "core.zip", + "sha256": "d9dc9c1138a47012dae445cb3b14f627674f918d8fd38a3618baa7f3be2f59df", + "bytes": 24352951 + }, + "sunshine": { + "repository": "townlight/sunshine", + "commit": "e1b712091c38fadeb00c19233d7f2bf1280fc248", + "archive": "sunshine.zip", + "sha256": "aeec27081bde9b458a50fcfde7e76c4c8a25740b28d540d1e43902ce98b1b272", + "bytes": 26157795 + }, + "meetings": { + "repository": "townlight/meetings", + "commit": "77ae8781f4a414f6f85c35a7e4394e29b0e0f21d", + "archive": "meetings.zip", + "sha256": "5980c4e4bf91ff252310c1ecba21d46960965028b78424332dc45ca2973edde0", + "bytes": 142802945 + }, + "ordinances": { + "repository": "townlight/ordinances", + "commit": "22d00f560cc45088a5b24a3f997787ee9c7a5e31", + "archive": "ordinances.zip", + "sha256": "2a08040e3112338c8e217b215ee0d2b1ccd60b22e75bf1d4187aa060c2e20d2e", + "bytes": 62013181 + }, + "zone": { + "repository": "townlight/zone", + "commit": "fb352955720db2e6e21caca816a8eb609a49f768", + "archive": "zone.zip", + "sha256": "81edbe00cade83c617609374d12ad43f1ac7c3ed2ac2240a04d6f49cd55bec98", + "bytes": 12322937 + }, + "plan": { + "repository": "townlight/plan", + "commit": "7de514f1afd720f93bd70a4866c3389ef621dc49", + "archive": "plan.zip", + "sha256": "bf3248dbf6de00e36f16010ec5d0956e6525f784f03dd475cedf8c89c1d17b7e", + "bytes": 12209129 + }, + "notice": { + "repository": "townlight/notice", + "commit": "4edf01296b0ad56a331e7fdd9b7c2d19c20b8e48", + "archive": "notice.zip", + "sha256": "e92b9d371722ddc2b4362c4abb3a5892da8f755f559da1fd2a02edc64a97fb4b", + "bytes": 2867717 + }, + "access": { + "repository": "townlight/access", + "commit": "f377a9a6e2a14d890333a20eab9277d644a9aaeb", + "archive": "access.zip", + "sha256": "fe43140af35f2e27c3bcd850f2476d55c9ce5386e7ddec24e0f31b8a0a8d3a21", + "bytes": 1980387 + }, + "permit": { + "repository": "townlight/permit", + "commit": "224116d9c714f613646f2b6ce2cbb687cb5e0040", + "archive": "permit.zip", + "sha256": "6e92dfe626b77097f596b5aca3e0e10b24e66e9a559e29c544a75aa2e144606b", + "bytes": 9539129 + }, + "inspect": { + "repository": "townlight/inspect", + "commit": "a6861f262328e7645557ad2a2600db4a12a5046c", + "archive": "inspect.zip", + "sha256": "dd79ab5d9ad3251d24f1671ba369b90263c6960edc3b01341bfdf3a1b9e7bf96", + "bytes": 13303207 + }, + "station": { + "repository": "townlight/station", + "commit": "5e65aa40795933ce2f39b195f869dacb9d4aa6a8", + "archive": "station.zip", + "sha256": "67c8353e3b0683521ad2cdc053f3534bca5fa685569a918a74aa6e67d257fecc", + "bytes": 12544888 + }, + "boards": { + "repository": "townlight/boards", + "commit": "d14340b713c880908cc27e383a59271ed0471ac0", + "archive": "boards.zip", + "sha256": "945c434dc822b7b4edd5edfeb493cd1ed301f1c6b3c52d55c6150ce1187515c0", + "bytes": 3127281 + }, + "contracts": { + "repository": "townlight/contracts", + "commit": "873de5bbff0f596b2c7cf20da4c68e94c3c3934c", + "archive": "contracts.zip", + "sha256": "05a74174c4bd9fccef9cd1d369b057ec7d48db696c06ed6d2078ffa179d8a404", + "bytes": 2943449 + }, + "procure": { + "repository": "townlight/procure", + "commit": "f10cd99f65f5f867d331af3bd6e60742bca61268", + "archive": "procure.zip", + "sha256": "8dc516bb6c1000e2519b6be9109163d8726fff1e0989333a937bcb1d5dafe358", + "bytes": 4473280 + }, + "townlight": { + "repository": "townlight/townlight", + "commit": "0afd59de52cb7ecb317188a89bcd1fec8c578a24", + "archive": "townlight.zip", + "sha256": "a27b25591a08b08e914c912f911a9063ef9ade6a0f4043085e21620f80c34d5d", + "bytes": 144420872 + } +} diff --git a/docs/beta-1/terms.html b/docs/beta-1/terms.html index d7d13ad..6e6aa96 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}} -header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
TownlightTownlight Beta 1
+header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto}
TownlightTownlight Beta 1
Townlight Beta 1

Terms of Service and -License

Staff guide and technical reference

Public Windows beta 1.8.0.1
Windows x64 beta 1.8.0.1

+text.

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

\ No newline at end of file diff --git a/docs/beta-1/versions.html b/docs/beta-1/versions.html index a79c562..865c979 100644 --- a/docs/beta-1/versions.html +++ b/docs/beta-1/versions.html @@ -1,21 +1,21 @@ Component versions | Townlight candidate +header .brand{display:inline-flex;align-items:center;max-width:100%;flex-shrink:0}header .brand img{display:block;width:217px;max-width:100%;height:auto} -
Townlight +
Townlight
-

Windows x64 Beta 1 · MSI 1.8.0.1

-

The signed Windows x64 beta 1.8.0.1 adds the three staff workspaces and automatically refreshes the bundled runtime when upgrading from 1.7.2.1.

+

Windows x64 Beta 1 · MSI 1.8.1.1

+

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. Acceptance and limits.

Component versions

-

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

+

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

@@ -47,7 +47,7 @@

Component versions

- + @@ -87,20 +87,19 @@

Component versions

- - - - - - + + + + +
Townlight Meetings townlight-meetings1.0.51.0.6
Townlight Code
Townlight Station townlight-station0.3.0
Runtimetownlight-runtime0.2.10.3.1
Boards & Commissionstownlight-boards0.2.0
Contractstownlight-contracts0.2.0
Procurementtownlight-procurement0.3.0
Local runtimetownlight-runtime0.3.1
-

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

+

Desktop source version 1.8.1-1. Windows MSI version 1.8.1.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.

Station remains the existing Beta 1 Python service. Its separate Rust development line and standalone CivicCast are outside this migration.

-
Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
\ No newline at end of file +

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

\ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 554b723..b4c290d 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-onlyBeta evaluation · Windows fresh install and tested 1.7.2.1 upgrade
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 describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

+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 and shared-import acceptance
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 describes the fresh Windows install, staff workflow, and 1.7.2.1 upgrade checks. See its scope for coverage of other workflows and equipment.

Read the exact acceptance and limits →

Ready to evaluate?

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

Shared meeting imports · Windows 1.8.1.1

Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module.

All 31 sources, formats, operator steps and integration contracts · Installed acceptance and limits.

Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service.

The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged.

diff --git a/docs/meeting-imports.md b/docs/meeting-imports.md new file mode 100644 index 0000000..88c494c --- /dev/null +++ b/docs/meeting-imports.md @@ -0,0 +1,128 @@ +# Shared meeting imports + +Use **Meetings → Import meeting records** in Windows 1.8.1.1. Select a +source and format, enter the original public URL, then choose **Preview import**. +For a saved response, select the file before previewing. Choose a meeting and +use **Save selected meeting**. Townlight records the source URL, format, stable +source ID and capture hash with the canonical meeting. Reopening the same +capture returns the existing meeting. A changed capture for that identity is +reported for staff review. + +The source and format selector lists the supported reader pairs below. A +public URL must serve the chosen format directly. Use a saved public response +for POST-only listings, portals that require a browser session and sources +whose page does not return the required response. The importer reads what a +municipality publishes in that response. Fields and attachments vary by +municipality and by meeting. + +| Source | Input to preview | +|---|---| +| Legistar | Core-format JSON export | +| PrimeGov | Core-format JSON export or public portal meeting list JSON | +| Granicus | Core-format JSON export or public ViewPublisher HTML | +| NovusAGENDA | Core-format JSON export | +| CivicPlus Agenda and Meeting Management Select | Public Events JSON | +| CivicPlus Agenda Center | Public listing HTML | +| Municode Meetings | Public meetings HTML | +| BoardBook | Public organization HTML | +| eSCRIBE | Public calendar JSON | +| Simbli | Public meeting listing HTML | +| iCompass CivicWeb | Public meeting-type listing HTML | +| iQM2 | Public meeting list HTML | +| Granicus Swagit | Public video archive HTML | +| SuiteOne Media | Public meeting archive HTML | +| Granicus Peak | Public agenda center ViewPublisher HTML | +| Utah Public Notice Website | Public notice detail HTML | +| Destiny AgendaQuick | Public meeting list HTML | +| Town Hall Streams | Public archive HTML | +| TelVue | Public playlist HTML | +| CHAMP | Public event JSON | +| Hyland OnBase | Public Agenda Online HTML | +| Laserfiche WebLink | Saved public dated document folder HTML | +| TownCloud | Saved public agenda table JSON or public agenda detail HTML | +| Digital Towpath | Public meeting detail HTML | +| ClerkBase | Public meeting document HTML | +| Municipality-published calendar | Public iCalendar feed | +| Wistia | Public media JSON | +| Boardable | Public Site meeting detail HTML | +| gWorks FrontDesk | Public city meetings JSON | +| Diligent BoardDocs | Unencrypted printed agenda PDF with numbered items | +| Tyler Meeting Manager | Saved public calendar JSON. Meeting information and item titles when present. | + +## Staff handoffs + +- **Core and Meetings.** Core's existing vendor formats share the same preview + and save path as the public readers. The saved meeting and any structured + agenda items open in the regular Meetings workflow. +- **Records.** In Meetings, load imported documents by meeting ID, choose a + PDF and enter the destination Records request ID. The attachment retains + the citation and file hash. An HTML viewer or a dead document link may need + staff to obtain the PDF separately. +- **Notice and Access.** Use **Review imported text** to start a Notice draft + or accessibility review with the source citation. Use each workspace's + normal review and save actions. +- **Station.** In the configured Station operator page, select the saved + meeting and stage a direct MP4. Use the private capture workflow to queue + processing. Player-only references are visible without a staging action. +- **Code.** Use the existing ordinance proposal and adoption workflow with + the canonical imported meeting and agenda IDs. +- **Boards, Contracts, Procurement, Zoning, Planning, Permitting and + Inspections.** In the destination workspace use **Imported meeting + evidence**. Select an existing staff record and the saved meeting, then + save the citation. The destination's existing role and workflow apply. + +## Shared interface + +The installed Townlight Python runtime exposes a read-only CLI. CivicCast and +other local clients can consume its normalized JSON and apply their own access +and persistence rules. + +```powershell +python -m townlight_runtime.meeting_imports champ PUBLIC_EVENT_URL saved-event.json --format champ-event-json +``` + +Use `--fetch` in place of the saved file to read a supported public response. + +## Interfaces and other products + +The version-1 normalized JSON contract is shared by the Python function +`townlight_runtime.meeting_imports.preview_export(connector, source_url, content, input_format=...)` +and the CLI above. A saved response can also be read from stdin using `-`. +Inputs are limited to 16 MiB. Preview is read-only; the consuming application +owns persistence, staff authorization and its own data. + +The installed native HTTP bridge exposes `GET /desktop/v1/meetings/imports/sources`, +`POST /desktop/v1/meetings/imports/preview`, `POST /desktop/v1/meetings/imports/fetch`, +`POST /desktop/v1/meetings/imports/commit`, and meeting/link/document handoff +operations in the [native API schema](https://townlight.github.io/api/suite-openapi.json). +Use the existing `X-Townlight-Session` authentication, mapped staff roles and +configured local PostgreSQL service. This is a native application interface; +there is no independent anonymous importer HTTP service or importer MCP server. + +**CivicCast:** opt in through its Townlight shared importer source setting and +`TOWNLIGHT_IMPORT_PYTHON` (the absolute Python executable), `TOWNLIGHT_IMPORT_CONNECTOR`, +`TOWNLIGHT_IMPORT_FORMAT`, `TOWNLIGHT_IMPORT_URL` and optional `TOWNLIGHT_IMPORT_CAPTURE`. +The adapter saves normalized items through the existing AgendaStore. Structured +agenda availability depends on the source response; a video listing can contain +meeting metadata without agenda items. Existing sources remain the default. + +**CivicCast Brief:** its existing PrimeGov and Granicus discovery routes can opt +into the shared reader using `TOWNLIGHT_IMPORT_PYTHON`. Brief does not expose all +31 sources as a new selection menu. Its existing caption/media workflow remains +the consuming path. See each project's shared-import client documentation. + +**TownReporter, Describer Workbench and Textflowkit:** no shared-import adapter +was added to these products. TownReporter retains its own PrimeGov path. +Describer Workbench and Textflowkit expose their existing transcription APIs/MCP +interfaces, which do not constitute meeting-import integration. The shared engine +ships inside Townlight Runtime; a standalone library is outside this release. + +## Windows acceptance and limits + +Windows 1.8.1.1 adds shared meeting imports for 31 source families, with 34 supported source/format pairs. Installed Windows Sandbox checks exercised preview, save and durable readback using public captures and fixtures, plus the documented Townlight handoffs. These checks do not establish automatic discovery on every live portal or a complete retest of every module. + +Windows 1.8.1.1 has fresh-install acceptance. An in-place upgrade to 1.8.1.1 was not exercised. The previous Windows 1.8.0.1 release tested upgrade from 1.7.2.1; that result applies to 1.8.0.1. Before an existing-city evaluation, back up city data and settings, close Townlight, keep the existing %LOCALAPPDATA%\CivicSuite profile, and use the same Windows account. Keep the prior installer and a restore path. Station continues to use its separately configured service. + +The accepted MSI contains Townlight Runtime 0.3.1 and Meetings 1.0.6 distributions. Its health version strings still report Runtime 0.3.0 and Meetings 1.0.5. Default-branch source corrects those display strings; the signed MSI and its exact build source remain unchanged. + +[Exact Windows 1.8.1.1 acceptance and limits](https://github.com/townlight/townlight/releases/download/townlight-windows-v1.8.1.1/ACCEPTANCE-Windows-1.8.1.1.md).