diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 52f1254..82379a2 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,6 +1,6 @@ --- name: Bug report -about: Report a defect in civiccore +about: Report a defect in townlight_core title: "[bug] " labels: ["bug"] --- @@ -19,7 +19,7 @@ labels: ["bug"] **Environment** -- civiccore version (`python -c "import civiccore; print(civiccore.__version__)"`): +- townlight_core version (`python -c "import townlight_core; print(townlight_core.__version__)"`): - Python version: - Consuming application (records-ai, custom, evaluation): - Postgres version (if migration-related): diff --git a/.github/ISSUE_TEMPLATE/documentation.md b/.github/ISSUE_TEMPLATE/documentation.md index 0c5206e..dc303ea 100644 --- a/.github/ISSUE_TEMPLATE/documentation.md +++ b/.github/ISSUE_TEMPLATE/documentation.md @@ -16,4 +16,4 @@ labels: ["documentation"] **Audience this affects** - [ ] Module developer / IT integrator - [ ] Consuming application (records-ai, future modules) -- [ ] Evaluator (deciding whether to use civiccore) +- [ ] Evaluator (deciding whether to use townlight_core) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index d416e40..144a8ac 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest an enhancement to civiccore +about: Suggest an enhancement to townlight_core title: "[feat] " labels: ["enhancement"] --- @@ -14,6 +14,6 @@ labels: ["enhancement"] **Alternatives considered** **Scope check** - + **Additional context** diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ff14729..5aa7e84 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -14,13 +14,13 @@ ## Test plan - [ ] `python -m pytest -q` passes -- [ ] `python -m ruff check civiccore tests` passes +- [ ] `python -m ruff check townlight_core tests` passes - [ ] If touching migrations: idempotency tests pass and Gate 1/2/3 logic still holds for downstream consumers -- [ ] If touching public API in `civiccore.llm`: smoke test verifies symbols still importable +- [ ] If touching public API in `townlight_core.llm`: smoke test verifies symbols still importable ## Checklist - [ ] CHANGELOG.md updated under `[Unreleased]` -- [ ] If version bumped: pyproject.toml, civiccore/__init__.py, scripts/verify-release.sh fresh-venv asserts all aligned +- [ ] If version bumped: pyproject.toml, townlight_core/__init__.py, scripts/verify-release.sh fresh-venv asserts all aligned - [ ] No secrets committed - [ ] Linked issue: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5485ed..0f6e796 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: civiccore CI +name: townlight_core CI on: pull_request: @@ -65,7 +65,7 @@ jobs: - name: Pre-pull pgvector image run: docker pull pgvector/pgvector:pg17 - - name: Install civiccore (editable, dev extras) + - name: Install townlight_core (editable, dev extras) run: | pip install --upgrade pip pip install -e .[dev] @@ -146,5 +146,5 @@ jobs: - name: Accessibility gate (no browser surface) run: | - echo "CivicCore exposes shared backend contracts and has no operator-facing browser surface in this repo." - echo "Per-PR axe gates run in CivicRecords AI, CivicClerk, CivicCode, and the CivicSuite launcher." + echo "TownlightCore exposes shared backend contracts and has no operator-facing browser surface in this repo." + echo "Per-PR axe gates run in TownlightRecords, TownlightMeetings, TownlightCode, and the Townlight launcher." diff --git a/.github/workflows/cleanroom.yml b/.github/workflows/cleanroom.yml index 7bfa077..df0bfdb 100644 --- a/.github/workflows/cleanroom.yml +++ b/.github/workflows/cleanroom.yml @@ -1,4 +1,4 @@ -name: civiccore cleanroom +name: townlight_core cleanroom on: pull_request: @@ -7,8 +7,8 @@ on: - ".github/workflows/cleanroom.yml" - "cleanroom/**" - "scripts/cleanroom/**" - - "scripts/run-civiccore-cleanroom.sh" - - "civiccore/release_provenance.py" + - "scripts/run-townlight_core-cleanroom.sh" + - "townlight_core/release_provenance.py" - "tests/fixtures/release_provenance/**" - "tests/test_cleanroom_harness.py" - "docs/ops/cleanroom-harness.md" @@ -36,10 +36,10 @@ jobs: fetch-depth: 0 - name: Verify Docker is available run: docker version - - name: Run CivicCore cleanroom harness - run: bash scripts/run-civiccore-cleanroom.sh "$TARGET_COMMIT" "docs/evidence/co6-ci-${TARGET_COMMIT}" + - name: Run TownlightCore cleanroom harness + run: bash scripts/run-townlight_core-cleanroom.sh "$TARGET_COMMIT" "docs/evidence/co6-ci-${TARGET_COMMIT}" - name: Upload cleanroom evidence uses: actions/upload-artifact@v7 with: - name: civiccore-co6-cleanroom-${{ env.TARGET_COMMIT }} + name: townlight_core-co6-cleanroom-${{ env.TARGET_COMMIT }} path: docs/evidence/co6-ci-${{ env.TARGET_COMMIT }}/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 941b3d0..d55bd30 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,13 +4,13 @@ on: push: tags: - "v*" - - "civiccore-*-freeze" + - "townlight_core-*-freeze" workflow_dispatch: inputs: release_tag: description: "Published release tag to rehearse from cold caches" required: true - default: "v1.2.1" + default: "v1.3.0.dev2" permissions: contents: write @@ -33,7 +33,7 @@ jobs: with: python-version: "3.13" - - name: Cleanroom cache strip (scoped, CivicSuite-only) + - name: Cleanroom cache strip (scoped, Townlight-only) shell: bash run: | python - <<'PY' @@ -44,10 +44,10 @@ jobs: for rel in (".npm", ".cache/pip"): shutil.rmtree(os.path.join(runner_temp, rel), ignore_errors=True) PY - docker builder prune --all --force --filter "label=civicsuite-cleanroom=1" || true - docker network ls --filter "label=civicsuite-cleanroom=1" -q \ + docker builder prune --all --force --filter "label=townlight-cleanroom=1" || true + docker network ls --filter "label=townlight-cleanroom=1" -q \ | xargs -r docker network rm || true - docker volume ls --filter "label=civicsuite-cleanroom=1" -q \ + docker volume ls --filter "label=townlight-cleanroom=1" -q \ | xargs -r docker volume rm || true - name: Install published wheel from release URL @@ -55,22 +55,22 @@ jobs: run: | TAG="${{ inputs.release_tag }}" VERSION="${TAG#v}" - WHEEL_URL="https://github.com/CivicSuite/civiccore/releases/download/${TAG}/civiccore-${VERSION}-py3-none-any.whl" + WHEEL_URL="https://github.com/Townlight/townlight_core/releases/download/${TAG}/townlight_core-${VERSION}-py3-none-any.whl" echo "Cleanroom wheel URL: ${WHEEL_URL}" python -m venv .cleanroom-venv . .cleanroom-venv/bin/activate python -m pip install --upgrade pip python -m pip install --no-cache-dir --force-reinstall "${WHEEL_URL}" TESTING=1 python - < release-notes.md < .env </ --workflow=release.yml --limit 5 gh run list -R / --workflow=ci.yml --limit 5 ``` -A workflow with 0s-duration failures in 5+ recent runs is a known-broken workflow. Audit finding TEST-022 from `audit-civicsuite-2026-05-09` documented exactly this pattern. If you see it, the workflow YAML is broken; combine with Check 1. +A workflow with 0s-duration failures in 5+ recent runs is a known-broken workflow. Audit finding TEST-022 from `audit-townlight-2026-05-09` documented exactly this pattern. If you see it, the workflow YAML is broken; combine with Check 1. ### Check 3 - Scripts referenced by workflows exist and execute @@ -60,11 +60,11 @@ rm -rf .venv-* node_modules/.cache 2>/dev/null bash scripts/verify-release.sh ``` -Local persisted state hides bugs. The civicrecords-ai email-validator bug only fired on fresh pgdata; local Docker volumes kept passing because the admin user existed from prior runs. **Always wipe before pre-flight.** +Local persisted state hides bugs. The townlight_records email-validator bug only fired on fresh pgdata; local Docker volumes kept passing because the admin user existed from prior runs. **Always wipe before pre-flight.** ### Check 5 - Cross-platform reality check -If the release workflow has a Windows job that runs Linux-only commands (or vice versa), flag it as Bug-Class-B (Windows/Linux mismatch) without trying to run it on the wrong platform. The fix pattern from civicrecords-ai PR #71 (split Linux verify + Windows installer) is the template. +If the release workflow has a Windows job that runs Linux-only commands (or vice versa), flag it as Bug-Class-B (Windows/Linux mismatch) without trying to run it on the wrong platform. The fix pattern from townlight_records PR #71 (split Linux verify + Windows installer) is the template. Common patterns to flag: - `runs-on: windows-latest` with `docker compose up` on Linux images @@ -77,11 +77,11 @@ Run a deliberate-failure scenario locally: stop a dependent service, then run th If the script doesn't dump container logs / env shape / dependency state on failure, that's a diagnostic gap. Add it as part of the Phase 0 bundled fix. -The civicrecords-ai diagnostic dump PR #72 is the template - when compose health-check fails, dump `docker compose logs api postgres redis ollama` + redacted .env + `docker compose ps` before declaring fail. +The townlight_records diagnostic dump PR #72 is the template - when compose health-check fails, dump `docker compose logs api postgres redis ollama` + redacted .env + `docker compose ps` before declaring fail. ### Check 7 - Audit punchlist correlation -Read `audit-civicsuite-2026-05-09/sprint-punchlist.md` (or equivalent audit doc for the current project). Cross-reference every finding tagged for this module's release infrastructure. If audit findings exist for this module that overlap with checks 1-6, name them in the Phase 0 report. The audit knew about these bugs - don't rediscover them. +Read `audit-townlight-2026-05-09/sprint-punchlist.md` (or equivalent audit doc for the current project). Cross-reference every finding tagged for this module's release infrastructure. If audit findings exist for this module that overlap with checks 1-6, name them in the Phase 0 report. The audit knew about these bugs - don't rediscover them. ## Bundled fix PR @@ -92,7 +92,7 @@ Every bug found by checks 1-6 goes into ONE pull request: - Each commit in the PR addresses ONE bug class with a focused message - CI on the PR must pass -DO NOT open multiple PRs for related infrastructure fixes. The civicrecords-ai sweep used 4 PRs for what should have been 1 - that's the anti-pattern this role exists to prevent. +DO NOT open multiple PRs for related infrastructure fixes. The townlight_records sweep used 4 PRs for what should have been 1 - that's the anti-pattern this role exists to prevent. ## When to skip a module entirely diff --git a/.pipelines/self-classification-rules.md b/.pipelines/self-classification-rules.md index 6c67880..7a17934 100644 --- a/.pipelines/self-classification-rules.md +++ b/.pipelines/self-classification-rules.md @@ -1,6 +1,6 @@ # Self-classification rules - pre-authorized for agents -These are the rules the executor role applies to every grep hit, every test failure, every workflow alert, and every "should I halt or fix forward?" judgment call. They're pre-authorized so the agent doesn't halt-and-ask on routine cases. The civicrecords-ai sweep wasted ~25% of its time on halt-and-ask cycles that should have been mechanical decisions. +These are the rules the executor role applies to every grep hit, every test failure, every workflow alert, and every "should I halt or fix forward?" judgment call. They're pre-authorized so the agent doesn't halt-and-ask on routine cases. The townlight_records sweep wasted ~25% of its time on halt-and-ask cycles that should have been mechanical decisions. ## Grep-hit classification (during edit phases) @@ -12,7 +12,7 @@ Every line returned by a release-sweep grep gets exactly ONE classification: - `.github/workflows/*.yml` lines that pip-install a versioned URL - `README.md`, `USER-MANUAL.md`, install-instruction snippets describing current state - Test files asserting current pin URL or current version constant -- Test fixture dicts like `{"civiccore": "1.0.0"}` (update value to new version) +- Test fixture dicts like `{"townlight_core": "1.0.0"}` (update value to new version) - Compatibility matrix entries describing current pin - Source files with `EXPECTED__VERSION = "X.Y.Z"` constants @@ -34,7 +34,7 @@ A grep hit is SHAPE-GUARD when ALL of these hold: - Updating X to the new version would pass trivially with no real coverage Examples: -- `assert "civiccore==1.0.0" not in dependencies` - asserts no `==` pinning, version-independent +- `assert "townlight_core==1.0.0" not in dependencies` - asserts no `==` pinning, version-independent - `assert "1.0.0.dev0" not in text` - asserts no stale dev marker, version-unrelated ### OWN-MODULE-VERSION - SKIP (do not edit during a dependency-bump sweep) @@ -72,7 +72,7 @@ The fix-forward bound is: changes must touch only `.github/workflows/`, `scripts ### CONTRACT-CHANGE - HALT AND REPORT - Any source code change required -- Any test asserting on dependency-removed behavior (e.g., civicclerk tests asserting on civiccore-removed `token_roles` field) - the auditor must approve the test update before the agent applies it +- Any test asserting on dependency-removed behavior (e.g., townlight_meetings tests asserting on townlight_core-removed `token_roles` field) - the auditor must approve the test update before the agent applies it - Any cross-module dependency conflict - Any failure whose root cause requires a design decision @@ -93,7 +93,7 @@ When fix-forward catches multiple MECHANICAL-CI-BUG issues in a single workflow - Bundle them into ONE commit on a single fix-forward branch - Branch name format: `fix/--` (e.g. `fix/release-yml-preflight-2026-05-11`) - One PR per fix-forward bundle, not one PR per bug -- The civicrecords-ai sweep opened 4 PRs (#70/#71/#72/#73) for what should have been 1 bundled PR. This is the explicit anti-pattern. +- The townlight_records sweep opened 4 PRs (#70/#71/#72/#73) for what should have been 1 bundled PR. This is the explicit anti-pattern. ## Tag-move budget @@ -104,7 +104,7 @@ A ` v` tag may be moved at most ONCE per release sprint, and only A second tag move is a signal that Phase 2 local rehearsal didn't catch what it should have. After the second move, halt and reassess Phase 2 instrumentation rather than continuing to chase remote bugs with more tag pushes. -CivicSuite v1.5.0 moved 4 times during recovery. The new pipeline targets ZERO moves per sprint; 1 move is acceptable for genuine environmental surprise. +Townlight v1.5.0 moved 4 times during recovery. The new pipeline targets ZERO moves per sprint; 1 move is acceptable for genuine environmental surprise. ## What this preserves vs. what changes diff --git a/AGENTS.md b/AGENTS.md index 254dded..855c84c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,14 +1,29 @@ # AGENTS.md -This project uses Agent Pipeline for Codex. +Scott's bounded completion contract governs this work. Legacy pipeline profiles +apply only when explicitly invoked; they do not authorize delegation, extra +features or repeated gates. Preserve repository-required CI and data safeguards. ## Project Orientation -- Purpose: TODO -- Primary users: TODO -- Stack: TODO -- Test command: TODO -- Lint/static command: TODO +- Purpose: Townlight's shared identity, provenance, ingestion, catalog, + exemption, scaffold, migration, task and recovery contracts. +- Primary users: owning Townlight products and platform administrators. +- Stack: Python 3.11+, FastAPI, SQLAlchemy, Alembic and PostgreSQL/pgvector. +- Distribution/import: `townlight-core` / `townlight_core`, version `1.3.0.dev2`. +- Test command: `python -m pytest tests/`; PostgreSQL tests require the declared + disposable Docker database. Report skips and installed acceptance separately. +- Lint/static command: `python -m ruff check .`; release command: + `bash scripts/verify-release.sh`. + +Catalog, exemption and scaffold contracts are implemented in this candidate. +The CO-7 placeholder ADRs describe their historical freeze, not current absence. +Keep original ADRs, signed releases and receipts unchanged. Fresh initialization +uses new identifiers; do not migrate an existing legacy database or profile. +The sole approved old active identifier is the Windows profile path +`%LOCALAPPDATA%\CivicSuite`. It does not authorize old package or product names. +No import shim is provided. Candidate source tests are not signed Windows +installed acceptance or authorization to publish. ## Order Of Operations @@ -47,4 +62,6 @@ This project uses Agent Pipeline for Codex. ## Custom Project Rules -TODO: add project-specific conventions, branch policy, documentation requirements, UI/QA gates, security constraints, and release rules. +Use one candidate and exact source/dependency pins. Preserve owning-product +authorization and data boundaries; shared contracts do not grant cross-product +authority. Reuse unaffected evidence with its original candidate identity. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 51df921..ceabd58 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ - + # Contributing to Townlight Core @@ -14,7 +14,7 @@ Townlight Core is at v0.1 (Phase 0 — package skeleton). Functional code lands in Phase 1 and beyond per the Townlight Core Extraction Spec section 12. If you want to contribute today, the most useful work is: -- Reviewing the Extraction Spec (in CivicSuite/civicsuite) and filing +- Reviewing the Extraction Spec (in Townlight/townlight) and filing issues against ambiguous wording. - Building a Phase 1 prototype against the auth + audit subsystem contracts in Appendix A of the spec. @@ -66,7 +66,7 @@ nowhere. Requirements: -- Python `>=3.11` (Townlight Core widens past civicrecords-ai's 3.12 floor +- Python `>=3.11` (Townlight Core widens past townlight_records's 3.12 floor because it is a shared library). - Git. - A POSIX-ish shell or PowerShell. The package itself is OS-agnostic. @@ -74,8 +74,8 @@ Requirements: Clone and install in editable mode with the dev extras: ```bash -git clone https://github.com/CivicSuite/civiccore.git -cd civiccore +git clone https://github.com/Townlight/townlight_core.git +cd townlight_core python -m venv .venv # macOS / Linux: source .venv/bin/activate @@ -103,7 +103,7 @@ python scripts/verify/verify_no_telemetry.py # planned ## Code standards - Match existing patterns. Where a pattern is missing, follow the - conventions in `civicrecords-ai/backend/app/` — Townlight Core is being + conventions in `townlight_records/backend/app/` — Townlight Core is being extracted from that codebase and consistency makes the migration reviewable. - Type hints on every public function. `mypy` strictness ratchets up @@ -137,7 +137,7 @@ listed in Appendix A is stable across the v0.x series: When you bump the version, update it in every location in the same commit (currently: `pyproject.toml` `[project].version` and -`civiccore/__init__.py` `__version__`). +`townlight_core/__init__.py` `__version__`). ## Security advisories diff --git a/README.md b/README.md index f542c70..2ad3dc2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ -> **Townlight Beta 1 public release:** [signed Windows installer, exact owned source, documentation and acceptance](https://github.com/townlight/townlight/releases/tag/townlight-beta-1). [Online manuals](https://townlight.github.io/manuals/core.html). The retained manual edition describes the accepted candidate before publication; publication changes distribution only. Component versions and signed bytes are unchanged. +> **Prepared naming, Access and Notice candidate — 2 November 2026.** Build, signing, installed acceptance and publication remain pending. Earlier signed releases and receipts apply only to their identified artifacts. # Townlight Core -**Townlight Beta 1** · Existing component versions retained · AGPL-3.0-only +**Townlight Beta 1** · Naming candidate; component versions advanced · AGPL-3.0-only Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product. ## Start here -Staff should use the operating manual. Administrators should read first-run, configuration and recovery before changing a deployment. Developers should read the exact API/schema reference and matching source companion. This edition accompanies Townlight Beta 1; use the release link above for the signed candidate and exact source/documentation archives. +Staff should use the operating manual. Administrators should read first-run, configuration and recovery before changing a deployment. Developers should read the exact API/schema reference and matching source companion. This edition describes the prepared source candidate; obtain its installer only after signing and installed acceptance identify the exact artifact. - [Operating manual](docs/beta-1/manuals/core.html) · [Printable PDF](docs/beta-1/pdf/Townlight-Core-Manual-Beta-1.pdf) · [Editable Word manual](docs/beta-1/docx/Townlight-Core-Manual-Beta-1.docx) - [API and data dictionary](docs/beta-1/api/core.html) · [OpenAPI JSON](docs/beta-1/api/core-openapi.json) @@ -18,17 +18,15 @@ Staff should use the operating manual. Administrators should read first-run, con | Identity | Value | | --- | --- | -| Public documentation identity | Townlight Beta 1 | -| Installer version | 1.6.0.1 | -| Product component | civiccore 1.3.0.dev1 | -| Native desktop source version | 1.6.0-1 | -| Candidate MSI SHA256 | `98bcdef11ebdf5c767f620c904ff49f85115fde3b5c23f62703b111e645aaf86` | -| Corresponding-source SHA256 | `84a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06b` | -| Current owned software license | AGPL-3.0-only | -| Supported acceptance profile | Windows x64 fresh install; inspections-preview; separate Station configuration | +| Documentation | Townlight Beta 1 naming, Access and Notice candidate | +| Intended installer version | 1.7.0.1; build and acceptance pending | +| Native desktop source version | 1.7.0-1 | +| Product component | townlight-core 1.3.0.dev2 | +| Principal import package | townlight_core | +| Candidate hashes | Pending build, signing and installed acceptance | +| License | AGPL-3.0-only | - -“Townlight Beta 1” identifies this coordinated beta delivery. It does not renumber the installer, native binary, Python packages or historical receipts. Component versions may differ. This documentation is a later companion to unchanged signed bytes, not a rebuilt installer. Historical release pages and manuals describe their own versions and are not the download instructions for this private candidate. +Use a fresh profile and empty database. Existing unmarked city data is refused before initialization; no in-place upgrade is supported. Preserve the existing `%LOCALAPPDATA%\CivicSuite` profile, data and recovery material. Historical releases retain their original identities. ## What staff can do @@ -67,7 +65,7 @@ Versioned saves use expected prior revision identifiers where defined. Reopen an ### Capacity and platform statements -This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. 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. +This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The new installer size remains pending its build; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. The exact [runtime payload lock](docs/beta-1/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](docs/beta-1/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. @@ -77,14 +75,14 @@ The exact [runtime payload lock](docs/beta-1/reference/runtime-payload-lock.json | Input | Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. | | Retained records | Named local accounts; native sessions; source and department authority; task receipts; profile configuration; coherent backup manifests; catalog, exemption and scaffold contracts. | | Output | Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. | -| Connections | All products use selected Core contracts. Core does not create unrestricted access between products. Notice and Access are supporting components, rather than additional products in this nine-product beta. | +| Connections | All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals; installed acceptance remains pending. | ## Setup and operation 1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. -2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. This candidate has fresh-install acceptance; historical in-place upgrades are unverified. -3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for all eight desktop products. A narrower default selection will not expose all workspaces. +2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. Installed acceptance for this source candidate remains pending; no in-place legacy upgrade is supported. +3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. 4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. 5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. 6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. @@ -93,9 +91,9 @@ The exact [runtime payload lock](docs/beta-1/reference/runtime-payload-lock.json ## Configuration ### Native deployment configuration -Use Setup, Settings and System Health for supported staff operation. Administrators provision folders, backup storage, named accounts and the city profile. Select `inspections-preview` for the full eight-workspace desktop. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. +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`, `CIVICSUITE_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. +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. @@ -180,15 +178,34 @@ Shared catalog, exemption and module-generator code exists in this private candi ## Development and repository map +### Fresh source checkout and exact local wheel + +This renamed candidate is not yet published on a package index. From this +exact candidate checkout, build its wheel before installing consumers. Use a +separate empty development environment, never an existing municipal profile: + +```powershell +py -3.13 -m venv .venv +.\.venv\Scripts\python.exe -m pip install --upgrade pip build +.\.venv\Scripts\python.exe -m build --wheel --outdir ..\candidate-wheels +.\.venv\Scripts\python.exe -m pip install ..\candidate-wheels\townlight_core-1.3.0.dev2-py3-none-any.whl +.\.venv\Scripts\python.exe -c "import townlight_core; assert townlight_core.__version__ == '1.3.0.dev2'" +``` + +Consumers install this exact Core wheel first, then their matching local +candidate wheel. The corresponding-source manifest identifies the source +commit; a moving default branch is not a reproducible candidate pin. Package +installation does not initialize a database or establish installed acceptance. + Use the corresponding source for the candidate rather than assuming the public default branch matches it. The source companion contains `installed-owned-source`, product build inputs, desktop Rust/browser sources, locks and `BUILD.md`. It excludes credentials and third-party binary/model payloads. Use the recorded runtime lock when reproducing packaging. Relevant source contracts: -- `civiccore/auth` -- `civiccore/catalog` -- `civiccore/exemptions` -- `civiccore/scaffold` -- `civicsuite_runtime/services.py` +- `townlight_core/auth` +- `townlight_core/catalog` +- `townlight_core/exemptions` +- `townlight_core/scaffold` +- `townlight_runtime/services.py` - `desktop/src-tauri/src/supervisor.rs` The desktop package defines `npm run build`, `npm test`, `npm run test:browser` and its Tauri command. Python products retain their own `pyproject.toml`, tests and migrations; use the matching checkout’s declared dependencies and test configuration. Do not run a sample server against a production profile. This documentation build validates documentation only and reuses the separately identified installed acceptance; it does not claim a new complete application CI run. diff --git a/README.txt b/README.txt index f542c70..a46edae 100644 --- a/README.txt +++ b/README.txt @@ -1,212 +1,221 @@ -> **Townlight Beta 1 public release:** [signed Windows installer, exact owned source, documentation and acceptance](https://github.com/townlight/townlight/releases/tag/townlight-beta-1). [Online manuals](https://townlight.github.io/manuals/core.html). The retained manual edition describes the accepted candidate before publication; publication changes distribution only. Component versions and signed bytes are unchanged. + Prepared naming, Access and Notice candidate — 2 November 2026. Build, signing, installed acceptance and publication remain pending. Earlier signed releases and receipts apply only to their identified artifacts. -# Townlight Core +Townlight Core -**Townlight Beta 1** · Existing component versions retained · AGPL-3.0-only +Townlight Beta 1 · Naming candidate; component versions advanced · AGPL-3.0-only Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product. -## Start here +Start here -Staff should use the operating manual. Administrators should read first-run, configuration and recovery before changing a deployment. Developers should read the exact API/schema reference and matching source companion. This edition accompanies Townlight Beta 1; use the release link above for the signed candidate and exact source/documentation archives. +Staff should use the operating manual. Administrators should read first-run, configuration and recovery before changing a deployment. Developers should read the exact API/schema reference and matching source companion. This edition describes the prepared source candidate; obtain its installer only after signing and installed acceptance identify the exact artifact. -- [Operating manual](docs/beta-1/manuals/core.html) · [Printable PDF](docs/beta-1/pdf/Townlight-Core-Manual-Beta-1.pdf) · [Editable Word manual](docs/beta-1/docx/Townlight-Core-Manual-Beta-1.docx) -- [API and data dictionary](docs/beta-1/api/core.html) · [OpenAPI JSON](docs/beta-1/api/core-openapi.json) -- [Product and suite directory](docs/beta-1/index.html) · [Terms and full license](docs/beta-1/terms.html) +- Operating manual · Printable PDF · Editable Word manual +- API and data dictionary · OpenAPI JSON +- Product and suite directory · Terms and full license -## Exact version and candidate +Exact version and candidate -| Identity | Value | -| --- | --- | -| Public documentation identity | Townlight Beta 1 | -| Installer version | 1.6.0.1 | -| Product component | civiccore 1.3.0.dev1 | -| Native desktop source version | 1.6.0-1 | -| Candidate MSI SHA256 | `98bcdef11ebdf5c767f620c904ff49f85115fde3b5c23f62703b111e645aaf86` | -| Corresponding-source SHA256 | `84a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06b` | -| Current owned software license | AGPL-3.0-only | -| Supported acceptance profile | Windows x64 fresh install; inspections-preview; separate Station configuration | + Identity Value + ------------------------------- ------------------------------------------------------ + Documentation Townlight Beta 1 naming, Access and Notice candidate + Intended installer version 1.7.0.1; build and acceptance pending + Native desktop source version 1.7.0-1 + Product component townlight-core 1.3.0.dev2 + Principal import package townlight_core + Candidate hashes Pending build, signing and installed acceptance + License AGPL-3.0-only +Use a fresh profile and empty database. Existing unmarked city data is refused before initialization; no in-place upgrade is supported. Preserve the existing %LOCALAPPDATA%\CivicSuite profile, data and recovery material. Historical releases retain their original identities. -“Townlight Beta 1” identifies this coordinated beta delivery. It does not renumber the installer, native binary, Python packages or historical receipts. Component versions may differ. This documentation is a later companion to unchanged signed bytes, not a rebuilt installer. Historical release pages and manuals describe their own versions and are not the download instructions for this private candidate. +What staff can do -## What staff can do +- Complete setup: Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed. +- Activate the runtime: Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database. +- Create staff access: Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users. +- Import through the right product: Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review. +- Make a coherent backup: Save open work. Use Backup Now; it stops writers to preserve a consistent snapshot. Retain the backup receipt, then use Start to resume services. +- Restore and verify: Use Restore Latest Backup after preserving current recovery material. A result of Restore needs service start is an intermediate state: use Start, then Check. Reopen a known saved record to confirm recovery. +- Collect diagnostics: Record the time, selected composition, version, operation and exact error. Inspect System Health and create a redacted support bundle. Do not delete a profile as the first repair step. -- **Complete setup:** Choose folders and the full product composition. Create the city profile and the first named administrator. Choose a protected backup location. Defer optional local AI if it is not needed. -- **Activate the runtime:** Run the first-run health check, wait for readiness and open Townlight. In System Health select Finish Records Migration to activate the canonical Python and PostgreSQL services. A running process alone is not a ready database. -- **Create staff access:** Use Settings to create named staff. Sign out and confirm that staff can sign in with their own account. Keep administrator privileges with people responsible for setup; ordinary staff cannot administer users. -- **Import through the right product:** Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review. -- **Make a coherent backup:** Save open work. Use Backup Now; it stops writers to preserve a consistent snapshot. Retain the backup receipt, then use Start to resume services. -- **Restore and verify:** Use Restore Latest Backup after preserving current recovery material. A result of Restore needs service start is an intermediate state: use Start, then Check. Reopen a known saved record to confirm recovery. -- **Collect diagnostics:** Record the time, selected composition, version, operation and exact error. Inspect System Health and create a redacted support bundle. Do not delete a profile as the first repair step. - -## Operating procedures and examples +Operating procedures and examples The operating manual now includes these existing procedures, with synthetic inputs, readback and limits. Follow the actual app boundary identified there; a standalone source capability is not automatically a desktop screen. -- [Shared catalog rules and scaffolding](docs/beta-1/manuals/core.html#shared-catalog-rules-and-scaffolding). -- [Catalog import and readback](docs/beta-1/manuals/core.html#catalog-import-and-readback). -- [Jurisdictional rule evaluation and review](docs/beta-1/manuals/core.html#jurisdictional-rule-evaluation-and-review). -- [Scaffold plan and generate](docs/beta-1/manuals/core.html#scaffold-plan-and-generate). +- Shared catalog rules and scaffolding. +- Catalog import and readback. +- Jurisdictional rule evaluation and review. +- Scaffold plan and generate. -## Architecture and data +Architecture and data -### Runtime and storage +Runtime and storage -The accepted package targets **Windows x64 fresh installation**. Its native shell uses **Rust 2021, Tauri 2 and Microsoft WebView2**; browser assets are JavaScript built with **Vite 8.1.6**. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled **CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic**, with **PostgreSQL 17 / PostGIS** and managed original files. The installed runtime tested here contains FastAPI 0.162.0. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. +The accepted package targets Windows x64 fresh installation. Its native shell uses Rust 2021, Tauri 2 and Microsoft WebView2; browser assets are JavaScript built with Vite 8.1.6. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic, with PostgreSQL 17 / PostGIS and managed original files. The installed runtime tested here contains FastAPI 0.162.0. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. -The native transport is fixed to loopback `127.0.0.1:15480`; PostgreSQL uses the configured local runtime port (default `15432`). Optional local model service defaults to `127.0.0.1:15434`. Those are deployment defaults, not internet endpoints. The runtime has health, module and readiness endpoints; readiness is stronger than process existence. The task queue is the existing local Core task infrastructure, not an assertion that a separate Redis service is required for this desktop composition. +The native transport is fixed to loopback 127.0.0.1:15480; PostgreSQL uses the configured local runtime port (default 15432). Optional local model service defaults to 127.0.0.1:15434. Those are deployment defaults, not internet endpoints. The runtime has health, module and readiness endpoints; readiness is stronger than process existence. The task queue is the existing local Core task infrastructure, not an assertion that a separate Redis service is required for this desktop composition. -The default native profile is `%LOCALAPPDATA%\CivicSuite`; the historical directory name remains part of compatibility. Do not rename it to Townlight. A configured `TOWNLIGHT_PROFILE_ROOT` must be absolute. Local configuration and secrets live under that profile; protected managed files and database state must be backed up coherently. Source/runtime identity is distinct from a product’s display label. +The 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 +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 +Capacity and platform statements + +This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The new installer size remains pending its build; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. -This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. 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. -The exact [runtime payload lock](docs/beta-1/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](docs/beta-1/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Data contract Description + ----------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Input Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. + Retained records Named local accounts; native sessions; source and department authority; task receipts; profile configuration; coherent backup manifests; catalog, exemption and scaffold contracts. -| Data contract | Description | -| --- | --- | -| Input | Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. | -| Retained records | Named local accounts; native sessions; source and department authority; task receipts; profile configuration; coherent backup manifests; catalog, exemption and scaffold contracts. | -| Output | Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. | -| Connections | All products use selected Core contracts. Core does not create unrestricted access between products. Notice and Access are supporting components, rather than additional products in this nine-product beta. | + Output Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. + Connections All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals; installed acceptance remains pending. + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -## Setup and operation +Setup and operation -1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. -2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. This candidate has fresh-install acceptance; historical in-place upgrades are unverified. -3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for all eight desktop products. A narrower default selection will not expose all workspaces. -4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. -5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. -6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. -7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. +1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. +2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. Installed acceptance for this source candidate remains pending; no in-place legacy upgrade is supported. +3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select Townlight Inspections candidate (inspections-preview) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. +4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. Continue without local AI is valid for the deterministic workflows. +5. Run Health Check and wait for readiness. Open Townlight. In System Health select Finish Records Migration to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. +6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. +7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. -## Configuration -### Native deployment configuration +Configuration -Use Setup, Settings and System Health for supported staff operation. Administrators provision folders, backup storage, named accounts and the city profile. Select `inspections-preview` for the full eight-workspace desktop. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. +Native deployment configuration -Technical deployments use `TOWNLIGHT_PRODUCT_PROFILE`, `TOWNLIGHT_PROFILE_ROOT`, `DATABASE_URL`, `CIVICSUITE_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. +Use Setup, Settings and System Health for supported staff operation. Administrators provision folders, backup storage, named accounts and the city profile. Select inspections-preview for the bounded desktop composition, including Access and Notice. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. + +Technical deployments use TOWNLIGHT_PRODUCT_PROFILE, TOWNLIGHT_PROFILE_ROOT, DATABASE_URL, TOWNLIGHT_RUNTIME_PORT, PORTAL_MODE and the runtime-managed secret files. Treat database URLs and native session proofs as secrets. The installed native domain runtime explicitly refuses non-loopback binding. PORTAL_MODE=private is the accepted posture; changing it does not by itself commission an internet portal, authentication provider or reverse proxy. The isolated documentation exporter sets a fictional profile and unusable synthetic database origin only to read schemas; those values are not deployment configuration. Keep deployment values in the intended process/account scope. An already-running process does not automatically inherit later environment edits. -## API usage -### Native command example +API usage + +Native command example -The following JavaScript belongs in the existing trusted Townlight frontend/development environment with `invoke` imported from `@tauri-apps/api/core`. It is not a command for an arbitrary web page or an instruction for nontechnical staff. IDs must come from records created in an isolated synthetic exercise. +The following JavaScript belongs in the existing trusted Townlight frontend/development environment with invoke imported from @tauri-apps/api/core. It is not a command for an arbitrary web page or an instruction for nontechnical staff. IDs must come from records created in an isolated synthetic exercise. -```javascript -import { invoke } from '@tauri-apps/api/core'; -const result = await invoke('get_app_state', {}); -console.log(result); -``` + import { invoke } from '@tauri-apps/api/core'; + const result = await invoke('get_app_state', {}); + console.log(result); -### Trusted local HTTP example +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. -```powershell -$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 -``` + $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 +A synthetic write with subsequent readback This example demonstrates the existing Meetings HTTP contract in an isolated exercise. It is intentionally fictional. It does not start a service. Its authentication setup is included so it can be run independently under the signed-in synthetic account. If a write times out, inspect current records before repeating it. -```powershell -$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 -``` + $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. -## MCP status +MCP status -No direct product MCP server is exposed by the accepted Townlight desktop or Station boundary. Do not configure an invented `townlight mcp` command or assume an AI client has staff permissions. The integration surfaces for this beta are native IPC, the documented HTTP APIs, source bundle imports, exact exports and the existing Station CLI. +No direct product MCP server is exposed by the accepted Townlight desktop or Station boundary. Do not configure an invented townlight mcp command or assume an AI client has staff permissions. The integration surfaces for this beta are native IPC, the documented HTTP APIs, source bundle imports, exact exports and the existing Station CLI. -The bundled transcription code includes a **TextFlowKit MCP adapter** as a separate source capability. It offers job-based `transcribe_media`, `get_transcript`, `list_jobs`, `get_job_status` and `export_transcript`, and additional tools declared in that adapter. It uses stdio first and optional Streamable HTTP, with the MCP SDK as an optional extra. It is not automatically launched, authenticated as Townlight staff or accepted as a Townlight product MCP deployment. This documentation does not add such a service. +The bundled transcription code includes a TextFlowKit MCP adapter as a separate source capability. It offers job-based transcribe_media, get_transcript, list_jobs, get_job_status and export_transcript, and additional tools declared in that adapter. It uses stdio first and optional Streamable HTTP, with the MCP SDK as an optional extra. It is not automatically launched, authenticated as Townlight staff or accepted as a Townlight product MCP deployment. This documentation does not add such a service. For a transcription client already provisioned separately, an illustrative tool call is: -```json -{"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} -``` + {"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} -Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the [MCP source reference](docs/beta-1/reference/mcp.html). Station meeting capture does not become live speech recognition because this optional donor adapter exists. +Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the MCP source reference. Station meeting capture does not become live speech recognition because this optional donor adapter exists. -## Verification and known limits +Verification and known limits -| Product | Recorded result | Precisely exercised | -| --- | --- | --- | -| Core | PASS | Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. | + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Product Recorded result Precisely exercised + ----------------------- ----------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Core PASS Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- These results come from the identified signed candidate’s fresh normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source bundles and media were synthetic. The guest install/uninstall and recovery passed, and the owned Sandbox stopped. No host installed application or standalone CivicCast was changed. This documentation task reuses those receipts; it does not claim a new software acceptance run. -The [workflow matrix](docs/beta-1/reference/workflow-matrix.json) identifies raw receipt filenames. The [evidence index](docs/beta-1/reference/sandbox-evidence-index.json) retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. +The workflow matrix identifies raw receipt filenames. The evidence index retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. The limits remain: actual city field acceptance and equipment/network commissioning; Station automatic provisioning/SCM commissioning; every UI/role combination; field recognition accuracy; and historical in-place upgrades are not certified. They are not five invented feature requirements. Fresh-install controlled beta handoff remains the accepted scope. This package makes no city-deployment, publication or general-availability claim. Shared catalog, exemption and module-generator code exists in this private candidate. It is not a centrally hosted federation service. A business product still owns its decisions, identity mapping and permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation. -## Development and repository map +Development and repository map + +Fresh source checkout and exact local wheel + +This renamed candidate is not yet published on a package index. From this exact candidate checkout, build its wheel before installing consumers. Use a separate empty development environment, never an existing municipal profile: + + py -3.13 -m venv .venv + .\.venv\Scripts\python.exe -m pip install --upgrade pip build + .\.venv\Scripts\python.exe -m build --wheel --outdir ..\candidate-wheels + .\.venv\Scripts\python.exe -m pip install ..\candidate-wheels\townlight_core-1.3.0.dev2-py3-none-any.whl + .\.venv\Scripts\python.exe -c "import townlight_core; assert townlight_core.__version__ == '1.3.0.dev2'" + +Consumers install this exact Core wheel first, then their matching local candidate wheel. The corresponding-source manifest identifies the source commit; a moving default branch is not a reproducible candidate pin. Package installation does not initialize a database or establish installed acceptance. -Use the corresponding source for the candidate rather than assuming the public default branch matches it. The source companion contains `installed-owned-source`, product build inputs, desktop Rust/browser sources, locks and `BUILD.md`. It excludes credentials and third-party binary/model payloads. Use the recorded runtime lock when reproducing packaging. +Use the corresponding source for the candidate rather than assuming the public default branch matches it. The source companion contains installed-owned-source, product build inputs, desktop Rust/browser sources, locks and BUILD.md. It excludes credentials and third-party binary/model payloads. Use the recorded runtime lock when reproducing packaging. Relevant source contracts: -- `civiccore/auth` -- `civiccore/catalog` -- `civiccore/exemptions` -- `civiccore/scaffold` -- `civicsuite_runtime/services.py` -- `desktop/src-tauri/src/supervisor.rs` +- townlight_core/auth +- townlight_core/catalog +- townlight_core/exemptions +- townlight_core/scaffold +- townlight_runtime/services.py +- desktop/src-tauri/src/supervisor.rs -The desktop package defines `npm run build`, `npm test`, `npm run test:browser` and its Tauri command. Python products retain their own `pyproject.toml`, tests and migrations; use the matching checkout’s declared dependencies and test configuration. Do not run a sample server against a production profile. This documentation build validates documentation only and reuses the separately identified installed acceptance; it does not claim a new complete application CI run. +The desktop package defines npm run build, npm test, npm run test:browser and its Tauri command. Python products retain their own pyproject.toml, tests and migrations; use the matching checkout’s declared dependencies and test configuration. Do not run a sample server against a production profile. This documentation build validates documentation only and reuses the separately identified installed acceptance; it does not claim a new complete application CI run. -## Recovery and support +Recovery and support -Save work and use Core’s canonical **Backup Now** before maintenance. That operation stops writers. Preserve the coherent profile/database/document backup and its receipt, then use **Start** to resume. A source export is not a full backup. +Save work and use Core’s canonical Backup Now before maintenance. That operation stops writers. Preserve the coherent profile/database/document backup and its receipt, then use Start to resume. A source export is not a full backup. -Use **Restore Latest Backup** through the supported controls. If the result says **Restore needs service start**, use **Start**, then **Check**, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. +Use Restore Latest Backup through the supported controls. If the result says Restore needs service start, use Start, then Check, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. Keep Station’s dedicated database and media evidence together in its own backup. Core’s native-profile backup must not be assumed to include an external Station data directory. Stop writers during a coordinated backup. Preserve failed media attempts and logs. On failure, record the time, selected composition, component/installer versions and exact message. Check System Health for stopped, starting, ready or failed dependencies. Use the existing Retry control after readiness; do not create duplicate business records to refresh a stale view. Share only a redacted diagnostic bundle. Preserve secrets, original evidence, recovery material and unrelated installations. -## License and responsible use +License and responsible use Current owned code is AGPL-3.0-only. Preserve full license, matching corresponding source, dependency notices and historical grants. Terms of use do not remove license rights. Source imports do not confer permission to publish third-party material. Review all automatic drafts and use the separate owning-product decision before official action. CivicCast remains independent. -## Earlier documentation +Earlier documentation -Previous editions are retained under `docs/history/pre-townlight-beta-1/`. They describe their original software and license grants. Use the current Townlight Beta 1 manual for this candidate. +Previous editions are retained under docs/history/pre-townlight-beta-1/. They describe their original software and license grants. Use the current Townlight Beta 1 manual for this candidate. diff --git a/SECURITY.md b/SECURITY.md index c4c52ac..c1060bf 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -21,13 +21,13 @@ Two preferred channels, in order: is the fastest path; it is private to maintainers until disclosure. 2. **Email** — if you cannot use the advisory flow, email the maintainer listed at https://github.com/townlight/core (the `Maintained by` - link in the README) with subject prefix `[civiccore-security]`. + link in the README) with subject prefix `[townlight_core-security]`. ### What to include - A description of the vulnerability and where it lives in the codebase. - A reproducer (minimal code or steps). -- The civiccore version affected. +- The townlight_core version affected. - Your assessment of impact (data exposure, privilege escalation, denial of service, etc.). - Whether you believe downstream consumers (records-ai, future modules) @@ -46,7 +46,7 @@ Two preferred channels, in order: In scope: -- Code in `civiccore/`. +- Code in `townlight_core/`. - Build / packaging configuration that ships in the release artifact. - The migration runner and any SQL it generates. - LLM provider abstraction (sanitization, prompt-injection defense, secret diff --git a/SUPPORT.md b/SUPPORT.md index 123f81e..a0a7c5d 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -1,6 +1,6 @@ # Support -civiccore is a shared platform library for the Townlight product family. Support is community-driven via GitHub. +townlight_core is a shared platform library for the Townlight product family. Support is community-driven via GitHub. ## Where to ask @@ -20,8 +20,8 @@ civiccore is a shared platform library for the Townlight product family. Support ## Audience-specific guidance -- **Module developers / IT integrators** consuming civiccore as a library: include the consuming application name, civiccore version, and Python/Postgres versions. -- **Evaluators** considering civiccore for a new module: a Discussions post under General is the right starting point. +- **Module developers / IT integrators** consuming townlight_core as a library: include the consuming application name, townlight_core version, and Python/Postgres versions. +- **Evaluators** considering townlight_core for a new module: a Discussions post under General is the right starting point. ## Response expectations diff --git a/USER-MANUAL.docx b/USER-MANUAL.docx index 0732d51..529355c 100644 Binary files a/USER-MANUAL.docx and b/USER-MANUAL.docx differ diff --git a/USER-MANUAL.md b/USER-MANUAL.md index 918a922..d309578 100644 --- a/USER-MANUAL.md +++ b/USER-MANUAL.md @@ -1,6 +1,6 @@ # Townlight Core Manual -**Townlight Beta 1** · Documentation edition 30 October 2026 +**Townlight Beta 1** · Naming candidate documentation edition 2 November 2026 ## Contents @@ -34,23 +34,22 @@ Staff should begin with First run and Daily workflow. Administrators should also | Identity | Value | | --- | --- | -| Public documentation identity | Townlight Beta 1 | -| Installer version | 1.6.0.1 | -| Product component | civiccore 1.3.0.dev1 | -| Native desktop source version | 1.6.0-1 | -| Candidate MSI SHA256 | `98bcdef11ebdf5c767f620c904ff49f85115fde3b5c23f62703b111e645aaf86` | -| Corresponding-source SHA256 | `84a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06b` | +| Documentation | Townlight Beta 1 naming, Access and Notice candidate | +| Intended installer version | 1.7.0.1; build and acceptance pending | +| Product component | townlight-core 1.3.0.dev2 | +| Principal import package | townlight_core | +| Native desktop source version | 1.7.0-1 | +| Candidate hashes | Pending candidate build, signing and installed acceptance | | Current owned software license | AGPL-3.0-only | -| Supported acceptance profile | Windows x64 fresh install; inspections-preview; separate Station configuration | +| Acceptance composition | Fresh Windows x64 profile; inspections-preview; Station configured separately | - -“Townlight Beta 1” identifies this coordinated beta delivery. It does not renumber the installer, native binary, Python packages or historical receipts. Component versions may differ. This documentation is a later companion to unchanged signed bytes, not a rebuilt installer. Historical release pages and manuals describe their own versions and are not the download instructions for this private candidate. +The naming change advances this package's version and requires a new signed installer and installed acceptance. Those steps and publication remain pending. Historical tags, receipts and archived manuals keep their original names and certify only their identified artifacts. Use an empty database and fresh profile; no in-place legacy upgrade is supported. The approved Windows profile path remains `%LOCALAPPDATA%\CivicSuite`. Preserve existing profiles, data and recovery material. ## First run 1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. -2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. This candidate has fresh-install acceptance; historical in-place upgrades are unverified. -3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for all eight desktop products. A narrower default selection will not expose all workspaces. +2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. Installed acceptance for this source candidate remains pending; no in-place legacy upgrade is supported. +3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. 4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. 5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. 6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. @@ -112,7 +111,7 @@ Drafting, review, approval, attachment, export, fulfillment and publication are ## Connected workflows -All products use selected Core contracts. Core does not create unrestricted access between products. Notice and Access are supporting components, rather than additional products in this nine-product beta. +All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals; installed acceptance remains pending. | Direction | Material | @@ -138,14 +137,14 @@ These are existing Core developer and administrator contracts. They do not add a ### Catalog import and readback 1. Review the catalog's `catalog_version`, domain names and systems. Each system supplies vendor name, protocol, data shape, record types, redaction tier 1–3 and optional discovery hints. Hints are limited to `ports`, `db_patterns` and `service_accounts`; do not put credentials in them. -2. In an authorized application transaction, call `civiccore.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. +2. In an authorized application transaction, call `townlight_core.catalog.import_catalog(session, bundle, actor_id=actual_actor_id)`. The actor is the authenticated application's identity. A changed or incomplete existing version is refused rather than overwritten. Use a newly reviewed version for changed catalog contents. 3. Read `domains(session)`, `system_catalog(session, domain)` and `connectors_for(session, domain)` before committing. Commit only the intended import; roll back on refusal. Repeating an identical complete version is a no-op. 4. Treat returned systems and connector recommendations as catalog information. Import does not discover vendor endpoints, install a connector or establish access to a city's system. The following synthetic library example belongs inside an existing authorized async transaction. `session` and `actual_actor_id` are supplied by that application; this is not a command that seeds an administrator. ```python -from civiccore.catalog import import_catalog, system_catalog +from townlight_core.catalog import import_catalog, system_catalog bundle = { "catalog_version": "synthetic-1", @@ -168,7 +167,7 @@ Select the jurisdiction and active reviewed rule versions before evaluating docu ```python from uuid import UUID -from civiccore.exemptions import Rule, evaluate, RuleEvaluationError +from townlight_core.exemptions import Rule, evaluate, RuleEvaluationError rule = Rule( id=UUID("11111111-1111-4111-8111-111111111111"), @@ -188,16 +187,16 @@ This is fictional test text, not a Colorado exemption rule. Read each result's m Run the existing CLI from a developer environment containing the matching Core package. Choose an existing empty parent workspace directory, not an installed application's directory. The module's own directory will be created underneath it. The following creates only a fictional module project; it does not register, install, migrate or run it. ```powershell -& $control -m civiccore.scaffold plan civicnotes ` +& $control -m townlight_core.scaffold plan civicnotes ` --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' -& $control -m civiccore.scaffold generate civicnotes ` +& $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`, `--civiccore-min-version`, `--permission-key`, repeated `--staff-role` and `--route-path`; inspect `--help` for the exact invocation. Keep generated access requirements and migration stubs under the new module's own review. No automatic product deployment follows generation. +Here `$control` is the Python executable in that isolated developer environment. Inspect the plan and files, then remove `--dry-run` only when that exact target is approved for generation. Existing files are refused, not silently overwritten. Exit 0 indicates success; refusal exits 2. Options include `--version`, `--townlight_core-min-version`, `--permission-key`, repeated `--staff-role` and `--route-path`; inspect `--help` for the exact invocation. Keep generated access requirements and migration stubs under the new module's own review. No automatic product deployment follows generation. -Source contracts: `civiccore/catalog/__init__.py`, `civiccore/exemptions/__init__.py`, `civiccore/scaffold/cli.py`, `project.py`, and the Records catalog facade. +Source contracts: `townlight_core/catalog/__init__.py`, `townlight_core/exemptions/__init__.py`, `townlight_core/scaffold/cli.py`, `project.py`, and the Records catalog facade. ## Technical specifications @@ -217,16 +216,16 @@ Versioned saves use expected prior revision identifiers where defined. Reopen an ### Capacity and platform statements -This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. 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. +This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The new installer size remains pending its build; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. The exact [runtime payload lock](docs/beta-1/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](docs/beta-1/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. ## 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 full eight-workspace desktop. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. +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`, `CIVICSUITE_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. +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. diff --git a/USER-MANUAL.pdf b/USER-MANUAL.pdf index 844d089..cb3ea25 100644 Binary files a/USER-MANUAL.pdf and b/USER-MANUAL.pdf differ diff --git a/USER-MANUAL.txt b/USER-MANUAL.txt index 918a922..fab95cb 100644 --- a/USER-MANUAL.txt +++ b/USER-MANUAL.txt @@ -1,106 +1,100 @@ -# Townlight Core Manual - -**Townlight Beta 1** · Documentation edition 30 October 2026 - -## Contents - -- [Using this manual](#using-this-manual) -- [Beta identity](#beta-identity) -- [First run](#first-run) -- [Daily workflow](#daily-workflow) -- [Connected workflows](#connected-workflows) -- [Architecture](#architecture) -- [Shared catalog rules and scaffolding](#shared-catalog-rules-and-scaffolding) -- [Technical specifications](#technical-specifications) -- [Configuration and administration](#configuration-and-administration) -- [API and integration examples](#api-and-integration-examples) -- [MCP and automation boundary](#mcp-and-automation-boundary) -- [Security and permissions](#security-and-permissions) -- [Backup recovery and maintenance](#backup-recovery-and-maintenance) -- [Troubleshooting](#troubleshooting) -- [Verified workflows and limits](#verified-workflows-and-limits) -- [Terms of service and license](#terms-of-service-and-license) -- [Glossary](#glossary) -- [Alphabetical subject index](#alphabetical-subject-index) -- [Source and document control](#source-and-document-control) - -## Using this manual +Townlight Core Manual + +Townlight Beta 1 · Naming candidate documentation edition 2 November 2026 + +Contents + +- Using this manual +- Beta identity +- First run +- Daily workflow +- Connected workflows +- Architecture +- Shared catalog rules and scaffolding +- Technical specifications +- Configuration and administration +- API and integration examples +- MCP and automation boundary +- Security and permissions +- Backup recovery and maintenance +- Troubleshooting +- Verified workflows and limits +- Terms of service and license +- Glossary +- Alphabetical subject index +- Source and document control + +Using this manual Townlight Core helps IT administrators and platform maintainers. Core provides the shared contracts, ingestion, identity helpers, task infrastructure and recovery foundation used by Townlight. Staff encounter these capabilities through Setup, Settings and System Health. Business decisions stay with their owning product. Staff should begin with First run and Daily workflow. Administrators should also read Architecture, Technical specifications, Configuration, Security and Recovery. Developers should use the exact API/data dictionary and examples. The table of contents and alphabetical subject index link to the relevant sections in the HTML edition; the PDF preserves headings and searchable text. An editable Word edition is included with the same documentation companion. -## Beta identity +Beta identity -| Identity | Value | -| --- | --- | -| Public documentation identity | Townlight Beta 1 | -| Installer version | 1.6.0.1 | -| Product component | civiccore 1.3.0.dev1 | -| Native desktop source version | 1.6.0-1 | -| Candidate MSI SHA256 | `98bcdef11ebdf5c767f620c904ff49f85115fde3b5c23f62703b111e645aaf86` | -| Corresponding-source SHA256 | `84a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06b` | -| Current owned software license | AGPL-3.0-only | -| Supported acceptance profile | Windows x64 fresh install; inspections-preview; separate Station configuration | + ------------------------------------------------------------------------------------------------------------------- + Identity Value + ----------------------------------- ------------------------------------------------------------------------------- + Documentation Townlight Beta 1 naming, Access and Notice candidate + Intended installer version 1.7.0.1; build and acceptance pending -“Townlight Beta 1” identifies this coordinated beta delivery. It does not renumber the installer, native binary, Python packages or historical receipts. Component versions may differ. This documentation is a later companion to unchanged signed bytes, not a rebuilt installer. Historical release pages and manuals describe their own versions and are not the download instructions for this private candidate. + Product component townlight-core 1.3.0.dev2 -## First run + Principal import package townlight_core -1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. -2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. This candidate has fresh-install acceptance; historical in-place upgrades are unverified. -3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for all eight desktop products. A narrower default selection will not expose all workspaces. -4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. -5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. -6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. -7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. + Native desktop source version 1.7.0-1 -## Daily workflow + Candidate hashes Pending candidate build, signing and installed acceptance - + Current owned software license AGPL-3.0-only -### 1. Complete setup + Acceptance composition Fresh Windows x64 profile; inspections-preview; Station configured separately + ------------------------------------------------------------------------------------------------------------------- -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. +The naming change advances this package’s version and requires a new signed installer and installed acceptance. Those steps and publication remain pending. Historical tags, receipts and archived manuals keep their original names and certify only their identified artifacts. Use an empty database and fresh profile; no in-place legacy upgrade is supported. The approved Windows profile path remains %LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data and recovery material. - +First run -### 2. Activate the runtime +1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. +2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. Installed acceptance for this source candidate remains pending; no in-place legacy upgrade is supported. +3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select Townlight Inspections candidate (inspections-preview) for the bounded desktop composition, including Access and Notice. A narrower default selection will not expose all workspaces. +4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. Continue without local AI is valid for the deterministic workflows. +5. Run Health Check and wait for readiness. Open Townlight. In System Health select Finish Records Migration to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. +6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. +7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. -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. +Daily workflow - +1. Complete setup -### 3. Create staff access +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. -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. +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. -### 4. Import through the right product +3. Create staff access -Use the source library of Code, Zoning, Planning or Permitting. Inspect provenance and permissions there. Core ingestion helpers do not bypass the owning product’s source review. +Use 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 -### 5. Make a coherent backup +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. -Save open work. Use Backup Now; it stops writers to preserve a consistent snapshot. Retain the backup receipt, then use Start to resume services. +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 +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 +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 +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. @@ -110,196 +104,184 @@ Keep originals and derivatives separate. Review the intended audience before exp 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. Notice and Access are supporting components, rather than additional products in this nine-product beta. +Connected workflows +All products use selected Core contracts. Core does not create unrestricted access between products. Access and Notice provide the bounded staff workflows documented in their current manuals; installed acceptance remains pending. -| Direction | Material | -| --- | --- | -| Input | Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. | -| Output | Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. | + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Direction Material + ----------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------- + Input Administrator setup choices, named staff accounts, source material submitted through the owning product, and protected backup storage. + Output Ready local services, permission-aware shared contracts, task results, diagnostics and coherent backup or restore receipts. + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -### Product boundary +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 +Architecture -![Townlight Core architecture and evidence flow](docs/beta-1/assets/core-architecture.svg) +[Townlight Core architecture and evidence flow] The drawing shows the principal staff/evidence path. Native commands carry trusted identity to Python business services; PostgreSQL and retained original files hold durable state. A downstream copy does not silently transfer decision authority. Station has its own configured authority/media boundary, database and mutable files. The connected-workflow text supplies the drawing’s reading order and accessibility alternative. -## Shared catalog rules and scaffolding +Shared catalog rules and scaffolding -These are existing Core developer and administrator contracts. They do not add a new Core administration screen. Staff use the owning product's normal controls; developers call the library only inside an authenticated application or an isolated synthetic test. The caller owns authorization and database commit or rollback. +These are existing Core developer and administrator contracts. They do not add a new Core administration screen. Staff use the owning product’s normal controls; developers call the library only inside an authenticated application or an isolated synthetic test. The caller owns authorization and database commit or rollback. -### Catalog import and readback +Catalog import and readback -1. Review the catalog's `catalog_version`, domain names and systems. Each system supplies vendor name, protocol, data shape, record types, redaction tier 1–3 and optional discovery hints. Hints are limited to `ports`, `db_patterns` and `service_accounts`; do not put credentials in them. -2. In an authorized application transaction, call `civiccore.catalog.import_catalog(session, bundle, actor_id=actual_actor_id)`. The actor is the authenticated application's identity. A changed or incomplete existing version is refused rather than overwritten. Use a newly reviewed version for changed catalog contents. -3. Read `domains(session)`, `system_catalog(session, domain)` and `connectors_for(session, domain)` before committing. Commit only the intended import; roll back on refusal. Repeating an identical complete version is a no-op. -4. Treat returned systems and connector recommendations as catalog information. Import does not discover vendor endpoints, install a connector or establish access to a city's system. +1. Review the catalog’s catalog_version, domain names and systems. Each system supplies vendor name, protocol, data shape, record types, redaction tier 1–3 and optional discovery hints. Hints are limited to ports, db_patterns and service_accounts; do not put credentials in them. +2. In an authorized application transaction, call townlight_core.catalog.import_catalog(session, bundle, actor_id=actual_actor_id). The actor is the authenticated application’s identity. A changed or incomplete existing version is refused rather than overwritten. Use a newly reviewed version for changed catalog contents. +3. Read domains(session), system_catalog(session, domain) and connectors_for(session, domain) before committing. Commit only the intended import; roll back on refusal. Repeating an identical complete version is a no-op. +4. Treat returned systems and connector recommendations as catalog information. Import does not discover vendor endpoints, install a connector or establish access to a city’s system. -The following synthetic library example belongs inside an existing authorized async transaction. `session` and `actual_actor_id` are supplied by that application; this is not a command that seeds an administrator. +The following synthetic library example belongs inside an existing authorized async transaction. session and actual_actor_id are supplied by that application; this is not a command that seeds an administrator. -```python -from civiccore.catalog import import_catalog, system_catalog + 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") -``` + 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. +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 +Jurisdictional rule evaluation and review -Select the jurisdiction and active reviewed rule versions before evaluating document text. Core's `Rule` carries `id`, `state_code`, `category`, `rule_type`, `definition` and integer `version`. Supported supplied rule types are `keyword` and `regex`; an unsupported rule or incomplete/timed-out scan raises `RuleEvaluationError`. An error must remain an incomplete scan, never “no exemptions found.” Core does not assume a jurisdiction or claim complete legal coverage. +Select the jurisdiction and active reviewed rule versions before evaluating document text. Core’s Rule carries id, state_code, category, rule_type, definition and integer version. Supported supplied rule types are keyword and regex; an unsupported rule or incomplete/timed-out scan raises RuleEvaluationError. An error must remain an incomplete scan, never “no exemptions found.” Core does not assume a jurisdiction or claim complete legal coverage. -```python -from uuid import UUID -from civiccore.exemptions import Rule, evaluate, RuleEvaluationError + 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. -``` + 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. +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 +Scaffold plan and generate -Run the existing CLI from a developer environment containing the matching Core package. Choose an existing empty parent workspace directory, not an installed application's directory. The module's own directory will be created underneath it. The following creates only a fictional module project; it does not register, install, migrate or run it. +Run the existing CLI from a developer environment containing the matching Core package. Choose an existing empty parent workspace directory, not an installed application’s directory. The module’s own directory will be created underneath it. The following creates only a fictional module project; it does not register, install, migrate or run it. -```powershell -& $control -m civiccore.scaffold plan civicnotes ` - --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' -& $control -m civiccore.scaffold generate civicnotes ` - --name 'Synthetic Notes' --description 'Synthetic scaffold exercise' ` - --target 'C:\TownlightSynthetic' --dry-run -``` + & $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`, `--civiccore-min-version`, `--permission-key`, repeated `--staff-role` and `--route-path`; inspect `--help` for the exact invocation. Keep generated access requirements and migration stubs under the new module's own review. No automatic product deployment follows generation. +Here $control is the Python executable in that isolated developer environment. Inspect the plan and files, then remove --dry-run only when that exact target is approved for generation. Existing files are refused, not silently overwritten. Exit 0 indicates success; refusal exits 2. Options include --version, --townlight_core-min-version, --permission-key, repeated --staff-role and --route-path; inspect --help for the exact invocation. Keep generated access requirements and migration stubs under the new module’s own review. No automatic product deployment follows generation. -Source contracts: `civiccore/catalog/__init__.py`, `civiccore/exemptions/__init__.py`, `civiccore/scaffold/cli.py`, `project.py`, and the Records catalog facade. +Source contracts: townlight_core/catalog/__init__.py, townlight_core/exemptions/__init__.py, townlight_core/scaffold/cli.py, project.py, and the Records catalog facade. +Technical specifications -## Technical specifications -### Runtime and storage +Runtime and storage -The accepted package targets **Windows x64 fresh installation**. Its native shell uses **Rust 2021, Tauri 2 and Microsoft WebView2**; browser assets are JavaScript built with **Vite 8.1.6**. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled **CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic**, with **PostgreSQL 17 / PostGIS** and managed original files. The installed runtime tested here contains FastAPI 0.162.0. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. +The accepted package targets Windows x64 fresh installation. Its native shell uses Rust 2021, Tauri 2 and Microsoft WebView2; browser assets are JavaScript built with Vite 8.1.6. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic, with PostgreSQL 17 / PostGIS and managed original files. The installed runtime tested here contains FastAPI 0.162.0. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. -The native transport is fixed to loopback `127.0.0.1:15480`; PostgreSQL uses the configured local runtime port (default `15432`). Optional local model service defaults to `127.0.0.1:15434`. Those are deployment defaults, not internet endpoints. The runtime has health, module and readiness endpoints; readiness is stronger than process existence. The task queue is the existing local Core task infrastructure, not an assertion that a separate Redis service is required for this desktop composition. +The native transport is fixed to loopback 127.0.0.1:15480; PostgreSQL uses the configured local runtime port (default 15432). Optional local model service defaults to 127.0.0.1:15434. Those are deployment defaults, not internet endpoints. The runtime has health, module and readiness endpoints; readiness is stronger than process existence. The task queue is the existing local Core task infrastructure, not an assertion that a separate Redis service is required for this desktop composition. -The default native profile is `%LOCALAPPDATA%\CivicSuite`; the historical directory name remains part of compatibility. Do not rename it to Townlight. A configured `TOWNLIGHT_PROFILE_ROOT` must be absolute. Local configuration and secrets live under that profile; protected managed files and database state must be backed up coherently. Source/runtime identity is distinct from a product’s display label. +The 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 +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 +Capacity and platform statements + +This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. The new installer size remains pending its build; allow additional disk for extracted runtime, database, originals, exports, media and backups. Select equipment/storage after sizing those actual workloads. -This beta has synthetic single-profile workflow evidence. It does not have a published benchmark for concurrent staff capacity, minimum RAM/CPU, large-source limits or a field SLA. Do not turn a developer machine’s specification into a supported minimum. 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. -The exact [runtime payload lock](docs/beta-1/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](docs/beta-1/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. +Configuration and administration -## Configuration and administration -### Native deployment configuration +Native deployment configuration -Use Setup, Settings and System Health for supported staff operation. Administrators provision folders, backup storage, named accounts and the city profile. Select `inspections-preview` for the full eight-workspace desktop. Station remains a separate service boundary. Do not use a standalone product’s demo server as a substitute for the installed workspace. +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`, `CIVICSUITE_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. +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 +API and integration examples -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. +Native command example -```javascript -import { invoke } from '@tauri-apps/api/core'; -const result = await invoke('get_app_state', {}); -console.log(result); -``` +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. -### Trusted local HTTP example + 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. -```powershell -$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 -``` + $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 +A synthetic write with subsequent readback This example demonstrates the existing Meetings HTTP contract in an isolated exercise. It is intentionally fictional. It does not start a service. Its authentication setup is included so it can be run independently under the signed-in synthetic account. If a write times out, inspect current records before repeating it. -```powershell -$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 -``` + $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 +Complete technical contract -Read the [Core API reference](docs/beta-1/api/core.html) for every documented operation, request field, constraint, response declaration and source supplement. Download the [OpenAPI JSON](docs/beta-1/api/core-openapi.json) for tools. For Station this is the suite-side schema only; its separate service contract is documented in the API supplement. The [reference directory](docs/beta-1/reference/index.html) includes configuration/source inventories, dependency declarations, native command contracts, MCP signatures and candidate evidence. +Read the Core API reference 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 +MCP and automation boundary -No direct product MCP server is exposed by the accepted Townlight desktop or Station boundary. Do not configure an invented `townlight mcp` command or assume an AI client has staff permissions. The integration surfaces for this beta are native IPC, the documented HTTP APIs, source bundle imports, exact exports and the existing Station CLI. +No direct product MCP server is exposed by the accepted Townlight desktop or Station boundary. Do not configure an invented townlight mcp command or assume an AI client has staff permissions. The integration surfaces for this beta are native IPC, the documented HTTP APIs, source bundle imports, exact exports and the existing Station CLI. -The bundled transcription code includes a **TextFlowKit MCP adapter** as a separate source capability. It offers job-based `transcribe_media`, `get_transcript`, `list_jobs`, `get_job_status` and `export_transcript`, and additional tools declared in that adapter. It uses stdio first and optional Streamable HTTP, with the MCP SDK as an optional extra. It is not automatically launched, authenticated as Townlight staff or accepted as a Townlight product MCP deployment. This documentation does not add such a service. +The bundled transcription code includes a TextFlowKit MCP adapter as a separate source capability. It offers job-based transcribe_media, get_transcript, list_jobs, get_job_status and export_transcript, and additional tools declared in that adapter. It uses stdio first and optional Streamable HTTP, with the MCP SDK as an optional extra. It is not automatically launched, authenticated as Townlight staff or accepted as a Townlight product MCP deployment. This documentation does not add such a service. For a transcription client already provisioned separately, an illustrative tool call is: -```json -{"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} -``` - -Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the [MCP source reference](docs/beta-1/reference/mcp.html). Station meeting capture does not become live speech recognition because this optional donor adapter exists. + {"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} -## Security and permissions +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. @@ -313,147 +295,181 @@ The native session is validated and mapped to a persisted SQL identity. An edita 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 +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. +Save work and use Core’s canonical Backup Now before maintenance. That operation stops writers. Preserve the coherent profile/database/document backup and its receipt, then use Start to resume. A source export is not a full backup. -Use **Restore Latest Backup** through the supported controls. If the result says **Restore needs service start**, use **Start**, then **Check**, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. +Use Restore Latest Backup through the supported controls. If the result says Restore needs service start, use Start, then Check, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. Keep Station’s dedicated database and media evidence together in its own backup. Core’s native-profile backup must not be assumed to include an external Station data directory. Stop writers during a coordinated backup. Preserve failed media attempts and logs. On failure, record the time, selected composition, component/installer versions and exact message. Check System Health for stopped, starting, ready or failed dependencies. Use the existing Retry control after readiness; do not create duplicate business records to refresh a stale view. Share only a redacted diagnostic bundle. Preserve secrets, original evidence, recovery material and unrelated installations. -## Troubleshooting +Troubleshooting + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Symptom Likely meaning Next action + ----------------------------- ------------------------------------------------------------------------ -------------------------------------------------------------------------------------------------- + Workspace absent Wrong product composition or unavailable canonical runtime. Check selected composition; activate through Finish Records Migration; wait for readiness. + + Cannot sign in / 401 Missing or expired named account session. Sign in normally; reopen a Station launch ticket if applicable. + + Permission denied / 403 Account, module, source or browser-origin permission. Ask the authorized administrator to inspect the intended permission; do not invent role headers. + + Save conflict / 409 The saved revision, expected source hash or lifecycle changed. Keep edits, reopen current state and reconcile deliberately. + + Invalid input / 422 Required field, format, geometry, source envelope or state is invalid. Read the field detail and correct the input/source; preserve originals. -| Symptom | Likely meaning | Next action | -| --- | --- | --- | -| Workspace absent | Wrong product composition or unavailable canonical runtime. | Check selected composition; activate through Finish Records Migration; wait for readiness. | -| Cannot sign in / 401 | Missing or expired named account session. | Sign in normally; reopen a Station launch ticket if applicable. | -| Permission denied / 403 | Account, module, source or browser-origin permission. | Ask the authorized administrator to inspect the intended permission; do not invent role headers. | -| Save conflict / 409 | The saved revision, expected source hash or lifecycle changed. | Keep edits, reopen current state and reconcile deliberately. | -| Invalid input / 422 | Required field, format, geometry, source envelope or state is invalid. | Read the field detail and correct the input/source; preserve originals. | -| Service unavailable / 503 | Database, schema, connected source or configuration unavailable. | Inspect System Health and the named dependency. Preserve work; retry only after readiness. | -| Export refused | Missing exact review, approval, audience or source authorization. | Read the refusal and complete the owning product’s explicit decision. | -| Restore needs service start | The snapshot was restored but services have not resumed. | Use Start, then Check and verify a saved record; do not blindly repeat restore. | + Service unavailable / 503 Database, schema, connected source or configuration unavailable. Inspect System Health and the named dependency. Preserve work; retry only after readiness. + Export refused Missing exact review, approval, audience or source authorization. Read the refusal and complete the owning product’s explicit decision. -## Verified workflows and limits + Restore needs service start The snapshot was restored but services have not resumed. Use Start, then Check and verify a saved record; do not blindly repeat restore. + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -| Product | Recorded result | Precisely exercised | -| --- | --- | --- | -| Core | PASS | Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. | +Verified workflows and limits + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Product Recorded result Precisely exercised + ----------------------- ----------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Core PASS Normal empty-profile setup; canonical activation; UI-created staff and sign-in; staff denied user administration; coherent backup, mutation, restore, Start/Check and retained/absent record readback. + + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- These results come from the identified signed candidate’s fresh normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source bundles and media were synthetic. The guest install/uninstall and recovery passed, and the owned Sandbox stopped. No host installed application or standalone CivicCast was changed. This documentation task reuses those receipts; it does not claim a new software acceptance run. -The [workflow matrix](docs/beta-1/reference/workflow-matrix.json) identifies raw receipt filenames. The [evidence index](docs/beta-1/reference/sandbox-evidence-index.json) retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. +The workflow matrix identifies raw receipt filenames. The evidence index retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. The limits remain: actual city field acceptance and equipment/network commissioning; Station automatic provisioning/SCM commissioning; every UI/role combination; field recognition accuracy; and historical in-place upgrades are not certified. They are not five invented feature requirements. Fresh-install controlled beta handoff remains the accepted scope. This package makes no city-deployment, publication or general-availability claim. -## Terms of service and license +Terms of service and license -### Scope and status +Scope and status These terms describe the Townlight Beta 1 software and this documentation package. This is a locally prepared private beta, not a hosted-service subscription, a city deployment agreement or a public release. No uptime commitment, support response time, indemnity, data-processing agreement or paid service is created by these documents. A separate signed agreement, if any, governs services it actually provides. -### Software license and rights +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. +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](https://www.gnu.org/licenses/agpl-3.0.html) and [GNU licensing FAQ](https://www.gnu.org/licenses/gpl-faq.en.html). +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 +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 +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 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 +Beta operation and recovery Use the identified candidate in its supported fresh-install scope. Preserve backups and original evidence. Test physical equipment and chosen network/service configuration before relying on them. The supplied acceptance describes selected synthetic workflows, not every screen, vendor, field condition or upgrade. Operators decide whether a particular deployment meets their own operational obligations. -### Warranty and liability +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 +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 +Ending a beta exercise and document changes When an organization ends testing, it controls retention/export and removes access according to its policy. Uninstall may retain data; back up and inspect the selected removal options. Ending an exercise does not revoke rights already granted by AGPL. Later software/documentation versions must identify their changed candidate and scope; historical receipts retain their original identities. These terms do not claim that a city has accepted a contract merely by reading a manual. -## Glossary - -| Term | Meaning | -| --- | --- | -| Approval | An explicit authorized decision on the saved text/artifact. It is separate from saving or attachment. | -| Canonical record | The owning product’s retained identity and saved version, rather than an editable copied label. | -| Composition | The selected set of desktop modules; inspections-preview exposes the eight staff products. | -| Corresponding source | The source/build material matching the delivered covered program, subject to its license. | -| Derivative / Records copy | A separately prepared document with its own intended audience and hash. | -| Hash / SHA256 | A fingerprint of exact bytes. It detects change; it does not establish legal authority. | -| Idempotency | Repeating the same identified request has the same intended effect; changing its payload can be refused. | -| IPC | The native desktop command boundary between its browser interface and Rust host. | -| MCP | Model Context Protocol; no direct Townlight product server is enabled by this beta. | -| Original | Retained source bytes. A reviewed derivative does not replace them. | -| Provenance | Source, version, date, actor and relationship information retained with evidence. | -| Revision | An immutable saved version. Later edits do not inherit an earlier review automatically. | -| Snapshot | A fixed audience-specific copy tied to a source/reviewed revision. | -| Station | Townlight’s separate media boundary using a pinned CivicCast-derived engine; standalone CivicCast remains separate. | - - -## Alphabetical subject index - -- **Accounts and authentication** — [Security and permissions](#security-and-permissions). -- **AGPL and source** — [Terms of service and license](#terms-of-service-and-license). -- **API contracts** — [API and integration examples](#api-and-integration-examples). -- **Architecture** — [Architecture](#architecture). -- **Backup** — [Backup recovery and maintenance](#backup-recovery-and-maintenance). -- **Beta version** — [Beta identity](#beta-identity). -- **Configuration** — [Configuration and administration](#configuration-and-administration). -- **Evidence and acceptance** — [Verified workflows and limits](#verified-workflows-and-limits). -- **Fees and official decisions** — [Terms of service and license](#terms-of-service-and-license). -- **First run** — [First run](#first-run). -- **Handoffs and audience** — [Connected workflows](#connected-workflows). -- **MCP** — [MCP and automation boundary](#mcp-and-automation-boundary). -- **Originals and provenance** — [Security and permissions](#security-and-permissions). -- **Recovery** — [Backup recovery and maintenance](#backup-recovery-and-maintenance). -- **Staff procedures** — [Daily workflow](#daily-workflow). -- **Station configuration** — [Configuration and administration](#configuration-and-administration). -- **Technical stack** — [Technical specifications](#technical-specifications). -- **Troubleshooting** — [Troubleshooting](#troubleshooting). - -### Operating subject links - -- **Catalog import and readback** — [Catalog import and readback](#catalog-import-and-readback). -- **Jurisdictional rule evaluation and review** — [Jurisdictional rule evaluation and review](#jurisdictional-rule-evaluation-and-review). -- **Scaffold plan and generate** — [Scaffold plan and generate](#scaffold-plan-and-generate). -- **Shared catalog rules and scaffolding** — [Shared catalog rules and scaffolding](#shared-catalog-rules-and-scaffolding). - -## Source and document control +Glossary + + --------------------------------------------------------------------------------------------------------------------------------------------------------- + Term Meaning + ----------------------------------- --------------------------------------------------------------------------------------------------------------------- + Approval An explicit authorized decision on the saved text/artifact. It is separate from saving or attachment. + + Canonical record The owning product’s retained identity and saved version, rather than an editable copied label. + + Composition The selected set of desktop modules; inspections-preview exposes the eight staff products. + + Corresponding source The source/build material matching the delivered covered program, subject to its license. + + Derivative / Records copy A separately prepared document with its own intended audience and hash. + + Hash / SHA256 A fingerprint of exact bytes. It detects change; it does not establish legal authority. + + Idempotency Repeating the same identified request has the same intended effect; changing its payload can be refused. + + IPC The native desktop command boundary between its browser interface and Rust host. + + MCP Model Context Protocol; no direct Townlight product server is enabled by this beta. + + Original Retained source bytes. A reviewed derivative does not replace them. + + Provenance Source, version, date, actor and relationship information retained with evidence. + + Revision An immutable saved version. Later edits do not inherit an earlier review automatically. + + Snapshot A fixed audience-specific copy tied to a source/reviewed revision. + + Station Townlight’s separate media boundary using a pinned CivicCast-derived engine; standalone CivicCast remains separate. + --------------------------------------------------------------------------------------------------------------------------------------------------------- + +Alphabetical subject index + +- Accounts and authentication — Security and permissions. +- AGPL and source — Terms of service and license. +- API contracts — API and integration examples. +- Architecture — Architecture. +- Backup — Backup recovery and maintenance. +- Beta version — Beta identity. +- Configuration — Configuration and administration. +- Evidence and acceptance — Verified workflows and limits. +- Fees and official decisions — Terms of service and license. +- First run — First run. +- Handoffs and audience — Connected workflows. +- MCP — MCP and automation boundary. +- Originals and provenance — Security and permissions. +- Recovery — Backup recovery and maintenance. +- Staff procedures — Daily workflow. +- Station configuration — Configuration and administration. +- Technical stack — Technical specifications. +- Troubleshooting — Troubleshooting. + +Operating subject links + +- Catalog import and readback — Catalog import and readback. +- Jurisdictional rule evaluation and review — Jurisdictional rule evaluation and review. +- Scaffold plan and generate — Scaffold plan and generate. +- Shared catalog rules and scaffolding — Shared catalog rules and scaffolding. + +Source and document control This edition is authored from the immutable corresponding-source companion, the generated installed-domain schema and the retained workflow receipts. The current software versions and signed artifacts are unchanged. Public historical pages are not synchronized or published by this local documentation task. -### Workflow subject index - -- **Activate the runtime** — [Daily workflow, step 2](#workflow-2). -- **Collect diagnostics** — [Daily workflow, step 7](#workflow-7). -- **Complete setup** — [Daily workflow, step 1](#workflow-1). -- **Create staff access** — [Daily workflow, step 3](#workflow-3). -- **Import through the right product** — [Daily workflow, step 4](#workflow-4). -- **Make a coherent backup** — [Daily workflow, step 5](#workflow-5). -- **Restore and verify** — [Daily workflow, step 6](#workflow-6). - -- [Source inventory and file hashes](docs/beta-1/reference/source-inventory.json) -- [All component metadata](docs/beta-1/reference/component-metadata.json) -- [Installed domain OpenAPI](docs/beta-1/reference/desktop-domain-openapi.json) -- [Workflow matrix](docs/beta-1/reference/workflow-matrix.json) -- [Full AGPL text](docs/beta-1/reference/AGPL-3.0.txt) +Workflow subject index + +- Activate the runtime — Daily workflow, step 2. + +- Collect diagnostics — Daily workflow, step 7. + +- Complete setup — Daily workflow, step 1. + +- Create staff access — Daily workflow, step 3. + +- Import through the right product — Daily workflow, step 4. + +- Make a coherent backup — Daily workflow, step 5. + +- Restore and verify — Daily workflow, step 6. + +- Source inventory and file hashes + +- All component metadata + +- Installed domain OpenAPI + +- Workflow matrix + +- Full AGPL text diff --git a/civiccore/db/__init__.py b/civiccore/db/__init__.py deleted file mode 100644 index e1a14c7..0000000 --- a/civiccore/db/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -Shared SQLAlchemy declarative base for all civiccore ORM models. - -All ORM models in civiccore (and downstream consumers such as civicrecords-ai) -should inherit from this ``Base`` class so that metadata is shared across the -same declarative registry. In Phase 2 Step 5, civicrecords-ai will migrate its -own models to import and inherit from this Base rather than maintaining a -separate one. -""" - -from sqlalchemy.orm import DeclarativeBase - - -class Base(DeclarativeBase): - """Shared declarative base for all civiccore ORM models.""" - - -__all__ = ["Base"] diff --git a/civiccore/migrations/__init__.py b/civiccore/migrations/__init__.py deleted file mode 100644 index 73fc7aa..0000000 --- a/civiccore/migrations/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""CivicCore: Alembic migrations for shared tables. Run by every consuming module's migration runner BEFORE that module's own migrations. See env.py for the migration-ordering contract from CivicCore Extraction Spec section 14.""" diff --git a/civiccore/migrations/alembic.ini b/civiccore/migrations/alembic.ini deleted file mode 100644 index 0656e11..0000000 --- a/civiccore/migrations/alembic.ini +++ /dev/null @@ -1,3 +0,0 @@ -[alembic] -script_location = %(here)s -version_table = alembic_version_civiccore diff --git a/civiccore/migrations/versions/civiccore_0005_job_leases.py b/civiccore/migrations/versions/civiccore_0005_job_leases.py deleted file mode 100644 index 02b43c7..0000000 --- a/civiccore/migrations/versions/civiccore_0005_job_leases.py +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-only -"""Fenced worker leases on the existing shared queue; no second job store.""" - -from alembic import op - -revision = "civiccore_0005_job_leases" -down_revision = "civiccore_0004_catalog" -branch_labels = None -depends_on = None - - -def upgrade(): - op.execute("ALTER TABLE civiccore_local_tasks ADD COLUMN IF NOT EXISTS claim_token varchar(64)") - op.execute( - "ALTER TABLE civiccore_local_tasks ADD COLUMN IF NOT EXISTS lease_expires_at timestamptz" - ) - op.execute( - "ALTER TABLE civiccore_local_tasks ADD COLUMN IF NOT EXISTS cancelled_by varchar(128)" - ) - op.execute( - "CREATE INDEX IF NOT EXISTS ix_civiccore_local_tasks_lease ON civiccore_local_tasks (status,lease_expires_at)" - ) - - -def downgrade(): - pass # Preserve jobs and cancellation history; restore a coherent backup. diff --git a/cleanroom/civiccore.Dockerfile b/cleanroom/townlight_core.Dockerfile similarity index 57% rename from cleanroom/civiccore.Dockerfile rename to cleanroom/townlight_core.Dockerfile index 43f9048..eb40e30 100644 --- a/cleanroom/civiccore.Dockerfile +++ b/cleanroom/townlight_core.Dockerfile @@ -2,17 +2,17 @@ FROM --platform=linux/amd64 python:3.13-slim-bookworm@sha256:bb73517d48bd32016e15eade0c009b2724ec3a025a9975b5cd9b251d0dcadb33 -ARG CIVICCORE_REPO_URL=https://github.com/CivicSuite/civiccore.git -ARG CIVICCORE_COMMIT +ARG TOWNLIGHT_CORE_REPO_URL=https://github.com/townlight/core.git +ARG TOWNLIGHT_CORE_COMMIT ARG COSIGN_VERSION=v3.0.6 ARG COSIGN_SHA256=c956e5dfcac53d52bcf058360d579472f0c1d2d9b69f55209e256fe7783f4c74 -LABEL org.opencontainers.image.title="CivicCore CO-6 cleanroom harness" -LABEL org.opencontainers.image.description="Pinned cleanroom image for CivicCore release and provenance verification." +LABEL org.opencontainers.image.title="Townlight Core CO-6 cleanroom harness" +LABEL org.opencontainers.image.description="Pinned cleanroom image for Townlight Core release and provenance verification." SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN test -n "${CIVICCORE_COMMIT}" +RUN test -n "${TOWNLIGHT_CORE_COMMIT}" RUN apt-get update \ && apt-get install -y --no-install-recommends \ @@ -33,26 +33,26 @@ RUN curl -fsSL \ && chmod 0755 /usr/local/bin/cosign \ && cosign version -RUN git clone --filter=blob:none "${CIVICCORE_REPO_URL}" /workspace/civiccore \ - && cd /workspace/civiccore \ - && git fetch --depth 1 origin "${CIVICCORE_COMMIT}" \ - && git checkout --detach "${CIVICCORE_COMMIT}" \ - && test "$(git rev-parse HEAD)" = "${CIVICCORE_COMMIT}" +RUN git clone --filter=blob:none "${TOWNLIGHT_CORE_REPO_URL}" /workspace/townlight_core \ + && cd /workspace/townlight_core \ + && git fetch --depth 1 origin "${TOWNLIGHT_CORE_COMMIT}" \ + && git checkout --detach "${TOWNLIGHT_CORE_COMMIT}" \ + && test "$(git rev-parse HEAD)" = "${TOWNLIGHT_CORE_COMMIT}" -WORKDIR /workspace/civiccore +WORKDIR /workspace/townlight_core RUN python -m pip install --upgrade pip \ && python -m pip install -e .[dev] -COPY scripts/cleanroom/civiccore-cleanroom-runner.sh /usr/local/bin/civiccore-cleanroom-runner -RUN chmod 0755 /usr/local/bin/civiccore-cleanroom-runner +COPY scripts/cleanroom/townlight_core-cleanroom-runner.sh /usr/local/bin/townlight_core-cleanroom-runner +RUN chmod 0755 /usr/local/bin/townlight_core-cleanroom-runner -ENV CIVICCORE_REPO_URL="${CIVICCORE_REPO_URL}" -ENV CIVICCORE_COMMIT="${CIVICCORE_COMMIT}" +ENV TOWNLIGHT_CORE_REPO_URL="${TOWNLIGHT_CORE_REPO_URL}" +ENV TOWNLIGHT_CORE_COMMIT="${TOWNLIGHT_CORE_COMMIT}" ENV CLEANROOM_BASE_IMAGE="python:3.13-slim-bookworm" ENV CLEANROOM_BASE_IMAGE_DIGEST="sha256:bb73517d48bd32016e15eade0c009b2724ec3a025a9975b5cd9b251d0dcadb33" ENV CLEANROOM_COSIGN_VERSION="${COSIGN_VERSION}" ENV CLEANROOM_COSIGN_SHA256="${COSIGN_SHA256}" -ENTRYPOINT ["civiccore-cleanroom-runner"] +ENTRYPOINT ["townlight_core-cleanroom-runner"] CMD ["online"] diff --git a/docs/SUPERVISOR.md b/docs/SUPERVISOR.md index f0be06b..74d6212 100644 --- a/docs/SUPERVISOR.md +++ b/docs/SUPERVISOR.md @@ -1,14 +1,14 @@ -# CivicCore Supervisor Card +# Townlight Core Supervisor Card One-page operating card for Scott. Keep this open when you supervise a session. Everything here is grounded in what actually exists in this repo today. Current state at the time this card was written: - Branch: `docs/phase2-closeout-standardization` (Phase 1 complete, Phase 2 closeout / standardization in flight) -- Version: `civiccore 0.2.0` (pyproject.toml + civiccore/__init__.py agree) +- Version: `townlight_core 0.2.0` (pyproject.toml + townlight_core/__init__.py agree) - Rule 11 hook wired locally in `.claude/hooks/` (untracked in git after 6fb2c6f) -- civiccore is the validation project for Hard Rule 11 (Commit-Size Acknowledgment Gate) +- townlight_core is the validation project for Hard Rule 11 (Commit-Size Acknowledgment Gate) --- @@ -16,7 +16,7 @@ Current state at the time this card was written: Skim in this order, top-down: -1. `README.md` — Status section tells you what phase CivicCore is in today. +1. `README.md` — Status section tells you what phase Townlight Core is in today. 2. `CHANGELOG.md` — look at `## [Unreleased]` to see what's accumulated since last tag. 3. `git log --oneline -10` — last 10 commits, note the current branch. 4. `docs/` — this card plus `index.html` (landing page); nothing else should live here yet. @@ -32,7 +32,7 @@ Five things, in order of how often you'll need them: 1. **Run the tests** — from repo root: `pytest` (configured in pyproject.toml `[tool.pytest.ini_options]`, `testpaths = ["tests"]`, asyncio mode auto). Current suite: `tests/test_smoke.py`, `tests/test_baseline_idempotency.py`. Any logic change must either update these or add a new test. 2. **Lint + type check** — `ruff check .` (configured, `target-version = py311`, `line-length = 100`). No mypy in pyproject today; don't let the agent pretend there is. -3. **Verify before push** — there's no `verify-release.sh` yet; `scripts/verify/` exists as a directory placeholder. When the agent says "ran verify", ask which command. Until the script is written, manual pre-push is: tests green + ruff clean + CHANGELOG updated + version consistent (pyproject.toml line 7, civiccore/__init__.py line 13). +3. **Verify before push** — there's no `verify-release.sh` yet; `scripts/verify/` exists as a directory placeholder. When the agent says "ran verify", ask which command. Until the script is written, manual pre-push is: tests green + ruff clean + CHANGELOG updated + version consistent (pyproject.toml line 7, townlight_core/__init__.py line 13). 4. **Watch Rule 11 behavior** — this project's job is to validate the gate. Every time the agent runs a `git commit` via Bash, the PreToolUse hook (`.claude/hooks/commit-size-gate.sh` → `.py`, THRESHOLD=800) fires. Expected behavior: - <800 staged lines → silent pass - ≥800 staged lines with a literal bracketed tag (`[MVP]`, `[LARGE-CHANGE]`, `[REFACTOR]`, `[INITIAL]`, `[MERGE]`, `[REVERT]`, `[SCOPE-EXPANSION: reason]`) → pass @@ -40,7 +40,7 @@ Five things, in order of how often you'll need them: - `--amend`, `-F`, editor commits → fail-open (bypass). This is intentional. - You say the literal phrase `override rule 11` → 60-second one-shot bypass. If you see a false positive (small commit blocked, or tag-present commit blocked), that's the bug you're hunting. Save the stderr output. -5. **Keep civiccore and civiccore-ui aligned** — if a schema, token, or shell component changes in `civiccore/` (models, auth, catalog) or `civiccore-ui/` (components, shell, tokens), make sure the agent touches both sides in the same commit. Extraction-in-sync was the Phase 1 contract and still applies through Phase 2 closeout. +5. **Keep townlight_core and townlight_core-ui aligned** — if a schema, token, or shell component changes in `townlight_core/` (models, auth, catalog) or `townlight_core-ui/` (components, shell, tokens), make sure the agent touches both sides in the same commit. Extraction-in-sync was the Phase 1 contract and still applies through Phase 2 closeout. --- @@ -71,13 +71,13 @@ See `coder-ui-qa-test` skill. ## 5. Good session ending — project-specific checklist -A session on civiccore is done when all of these are true: +A session on townlight_core is done when all of these are true: - `pytest` green from repo root (no skips, no xfails added). - `ruff check .` clean. -- Version matches across `pyproject.toml` (line 7) and `civiccore/__init__.py` (line 13). Bump both together or neither. +- Version matches across `pyproject.toml` (line 7) and `townlight_core/__init__.py` (line 13). Bump both together or neither. - `CHANGELOG.md` `## [Unreleased]` has an entry for every user-visible change made this session. - No false-positive Rule 11 blocks during the session. If the gate blocked a commit, one of three things is true and you can say which: (a) the commit genuinely was ≥800 lines and deserved a tag, (b) it was a known bypass surface, (c) it's a bug and you've captured stderr + the staged diff size for the post-mortem. -- If the session touched anything in both `civiccore/` and `civiccore-ui/`, the two sides agree — shared schemas, tokens, or interfaces are in sync. Extraction-in-sync remains the contract through Phase 2 closeout; drift between core and UI is a regression. +- If the session touched anything in both `townlight_core/` and `townlight_core-ui/`, the two sides agree — shared schemas, tokens, or interfaces are in sync. Extraction-in-sync remains the contract through Phase 2 closeout; drift between core and UI is a regression. - Branch is still `docs/phase2-closeout-standardization` (or a child of it) unless we explicitly cut a new one. No surprise branch moves. - No files created outside scope: no `tasks.md`, no `lessons-learned.md`, no `handoff.md`, no `tests/uat/`, no `private/`, no new hook scripts. If the agent wrote any of those, delete them before closing. diff --git a/docs/adr/index.md b/docs/adr/index.md index 9ca5c81..f5b1ed5 100644 --- a/docs/adr/index.md +++ b/docs/adr/index.md @@ -1,20 +1,27 @@ -# CivicCore Architecture Decision Records +# Townlight Core Architecture Decision Records -CivicCore ADRs record module-scoped platform decisions. Cross-module decisions -that bind more than one repository remain in the umbrella `CivicSuite` +Townlight Core ADRs record module-scoped platform decisions. Cross-module decisions +that bind more than one repository remain in the umbrella `Townlight` architecture ADR index. ## Placeholder Namespace Deferrals -These CO-7 ADRs define the placeholder namespace boundary for the freeze line: +These historical CO-7 ADRs define the placeholder namespace boundary for their +original freeze line. They retain their original text and identities. Current +catalog, exemption and scaffold implementations are described by ADR-0004 +through ADR-0010 and their owning source/tests; this index is not a current +blanket deferral. -- [ADR-0001: Defer `civiccore.catalog`](ADR-0001-defer-civiccore-catalog.md) -- [ADR-0002: Defer `civiccore.exemptions`](ADR-0002-defer-civiccore-exemptions.md) -- [ADR-0003: Defer `civiccore.scaffold`](ADR-0003-defer-civiccore-scaffold.md) +The current principal namespaces are `townlight_core.catalog`, +`townlight_core.exemptions` and `townlight_core.scaffold`. + +- [ADR-0001: Historical catalog deferral](ADR-0001-defer-civiccore-catalog.md) +- [ADR-0002: Historical exemptions deferral](ADR-0002-defer-civiccore-exemptions.md) +- [ADR-0003: Historical scaffold deferral](ADR-0003-defer-civiccore-scaffold.md) Rule: no downstream module may import, foreign-key to, document as required, or otherwise depend on a placeholder namespace until that namespace ships in a -versioned CivicCore release artifact and the downstream compatibility matrix is +versioned Townlight Core release artifact and the downstream compatibility matrix is updated to name that release. - [ADR-0004: Beta shared catalog extraction](ADR-0004-beta-shared-catalog.md) partially supersedes ADR-0001 in the private candidate; broader inventory remains open. @@ -27,6 +34,6 @@ updated to name that release. - [ADR-0008: Beta installed-module inventory and recommendations](ADR-0008-beta-module-inventory.md) partially supersedes ADR-0001/ADR-0004 for the tested persisted, scoped module inventory and its deterministic recommendations. It reuses the shipped `build_module_registry` rather than adding a resolver, records only caller-declared installs, and keeps the municipal systems catalog distinct. Per-city module commissioning, installer/umbrella registration, artifact proof and consumer wiring remain open. -- [ADR-0009: Department-scoped shared authority](ADR-0009-department-scoped-authority.md) adds the deny-by-default department/tenant authorization contract around the shipped auth, search, export and model-context helpers: a department claim is admissible only from the persisted `civiccore_department_grant_events` ledger, roles are intersected rather than unioned, revocation is an appended event, and no credential verifier, route or second permission engine is added. A Core HTTP/CLI surface, per-city department commissioning, role-to-job-function mapping and consumer wiring remain open. +- [ADR-0009: Department-scoped shared authority](ADR-0009-department-scoped-authority.md) adds the deny-by-default department/tenant authorization contract around the shipped auth, search, export and model-context helpers: a department claim is admissible only from the persisted `townlight_core_department_grant_events` ledger, roles are intersected rather than unioned, revocation is an appended event, and no credential verifier, route or second permission engine is added. A Core HTTP/CLI surface, per-city department commissioning, role-to-job-function mapping and consumer wiring remain open. -- [ADR-0010: Claim-bound acceptance of ingest and media artifacts](ADR-0010-claim-bound-artifacts.md) adds one adapter (`civiccore.tasks.artifacts`, migration `civiccore_0009_job_artifacts`) that binds a derived artifact to the producing job identity and its still-active claim, publishes it only inside a configured store root with a re-verified sha256, and records an attributed, append-only receipt. It adds no transcription, OCR, transcoding, embedding, provider call or second job engine; consumer wiring, large-original storage and retention/redaction workflows remain open. +- [ADR-0010: Claim-bound acceptance of ingest and media artifacts](ADR-0010-claim-bound-artifacts.md) adds one adapter (`townlight_core.tasks.artifacts`, migration `townlight_core_0009_job_artifacts`) that binds a derived artifact to the producing job identity and its still-active claim, publishes it only inside a configured store root with a re-verified sha256, and records an attributed, append-only receipt. It adds no transcription, OCR, transcoding, embedding, provider call or second job engine; consumer wiring, large-original storage and retention/redaction workflows remain open. diff --git a/docs/beta-1/api/access-openapi.json b/docs/beta-1/api/access-openapi.json new file mode 100644 index 0000000..a365256 --- /dev/null +++ b/docs/beta-1/api/access-openapi.json @@ -0,0 +1,11594 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/access/state": { + "get": { + "tags": [ + "native-access" + ], + "summary": "Access State", + "operationId": "access_state_desktop_v1_access_state_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/access/review-context": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Review Context", + "operationId": "review_context_desktop_v1_access_review_context_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/ReviewInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Save Review", + "operationId": "save_review_desktop_v1_access_reviews_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/SaveReview" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews/{review_id}/delete": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Delete Review", + "operationId": "delete_review_desktop_v1_access_reviews__review_id__delete_post", + "parameters": [ + { + "name": "review_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Review 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/access/tools": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Tool", + "operationId": "tool_desktop_v1_access_tools_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": { + "oneOf": [ + { + "$ref": "#/components/schemas/FormPlan" + }, + { + "$ref": "#/components/schemas/PublishingPlan" + }, + { + "$ref": "#/components/schemas/AdaPlan" + }, + { + "$ref": "#/components/schemas/TaggedPlan" + } + ], + "discriminator": { + "propertyName": "action", + "mapping": { + "form-plan": "#/components/schemas/FormPlan", + "publishing-workflow": "#/components/schemas/PublishingPlan", + "ada-title-ii": "#/components/schemas/AdaPlan", + "tagged-pdf": "#/components/schemas/TaggedPlan" + } + }, + "title": "Data" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/rewrite-context": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Rewrite Context", + "operationId": "rewrite_context_desktop_v1_access_rewrite_context_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/RewriteInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/rewrite-result": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Rewrite Result", + "operationId": "rewrite_result_desktop_v1_access_rewrite_result_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/RewriteResult" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews/{review_id}/export": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Prepare Export", + "operationId": "prepare_export_desktop_v1_access_reviews__review_id__export_post", + "parameters": [ + { + "name": "review_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Review 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/access/drafts/{draft_id}/export": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Export Draft", + "operationId": "export_draft_desktop_v1_access_drafts__draft_id__export_post", + "parameters": [ + { + "name": "draft_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Draft 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/access/exports/{artifact_id}/complete": { + "post": { + "tags": [ + "native-access" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExportReceipt" + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "access", + "identity": "Townlight Access 0.5.0", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/access.html b/docs/beta-1/api/access.html new file mode 100644 index 0000000..a6e0c5e --- /dev/null +++ b/docs/beta-1/api/access.html @@ -0,0 +1,12073 @@ +Townlight Access API reference
Townlight

Townlight Access API reference

+

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

+

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

+

HTTP operations

+
POST /desktop/v1/access/drafts/{draft_id}/export +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Export Draft",
+  "operationId": "export_draft_desktop_v1_access_drafts__draft_id__export_post",
+  "parameters": [
+    {
+      "name": "draft_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Draft 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 /desktop/v1/access/exports/{artifact_id}/complete +
{
+  "tags": [
+    "native-access"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExportReceipt"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/review-context +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Review Context",
+  "operationId": "review_context_desktop_v1_access_review_context_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/ReviewInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/reviews +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Save Review",
+  "operationId": "save_review_desktop_v1_access_reviews_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/SaveReview"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/reviews/{review_id}/delete +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Delete Review",
+  "operationId": "delete_review_desktop_v1_access_reviews__review_id__delete_post",
+  "parameters": [
+    {
+      "name": "review_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Review 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 /desktop/v1/access/reviews/{review_id}/export +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Prepare Export",
+  "operationId": "prepare_export_desktop_v1_access_reviews__review_id__export_post",
+  "parameters": [
+    {
+      "name": "review_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Review 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 /desktop/v1/access/rewrite-context +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Rewrite Context",
+  "operationId": "rewrite_context_desktop_v1_access_rewrite_context_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/RewriteInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/rewrite-result +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Rewrite Result",
+  "operationId": "rewrite_result_desktop_v1_access_rewrite_result_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/RewriteResult"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/access/state +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Access State",
+  "operationId": "access_state_desktop_v1_access_state_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 /desktop/v1/access/tools +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Tool",
+  "operationId": "tool_desktop_v1_access_tools_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": {
+          "oneOf": [
+            {
+              "$ref": "#/components/schemas/FormPlan"
+            },
+            {
+              "$ref": "#/components/schemas/PublishingPlan"
+            },
+            {
+              "$ref": "#/components/schemas/AdaPlan"
+            },
+            {
+              "$ref": "#/components/schemas/TaggedPlan"
+            }
+          ],
+          "discriminator": {
+            "propertyName": "action",
+            "mapping": {
+              "form-plan": "#/components/schemas/FormPlan",
+              "publishing-workflow": "#/components/schemas/PublishingPlan",
+              "ada-title-ii": "#/components/schemas/AdaPlan",
+              "tagged-pdf": "#/components/schemas/TaggedPlan"
+            }
+          },
+          "title": "Data"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/code-openapi.json b/docs/beta-1/api/code-openapi.json new file mode 100644 index 0000000..8565cb0 --- /dev/null +++ b/docs/beta-1/api/code-openapi.json @@ -0,0 +1,12264 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/code-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Code Sources", + "operationId": "search_code_sources_desktop_v1_code_sources_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/CodeSearch" + } + } + } + }, + "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/sources": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Sources", + "operationId": "sources_desktop_v1_code_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/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": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/code/lookup": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Lookup", + "operationId": "lookup_desktop_v1_code_lookup_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", + "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}/history": { + "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", + "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/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", + "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" + } + } + } + } + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "code", + "identity": "Townlight Code 1.0.9", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/code.html b/docs/beta-1/api/code.html new file mode 100644 index 0000000..fcab814 --- /dev/null +++ b/docs/beta-1/api/code.html @@ -0,0 +1,12739 @@ +Townlight Code API reference
Townlight

Townlight Code API reference

+

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

+

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

+

HTTP operations

+
POST /desktop/v1/code-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Code Sources",
+  "operationId": "search_code_sources_desktop_v1_code_sources_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/CodeSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/citation +
{
+  "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",
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/connections +
{
+  "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 /desktop/v1/code/connections +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/connections/{connection_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code/connections/{connection_id}/closeout +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/export +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code/imports +
{
+  "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 /desktop/v1/code/imports +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/imports/{job_id}/provenance +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/imports/{job_id}/tree +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/lookup +
{
+  "tags": [
+    "native-code"
+  ],
+  "summary": "Lookup",
+  "operationId": "lookup_desktop_v1_code_lookup_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",
+      "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 /desktop/v1/code/questions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/search +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/sections/{section_id}/history +
{
+  "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",
+      "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 /desktop/v1/code/sections/{section_id}/notes +
{
+  "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 /desktop/v1/code/sections/{section_id}/notes +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code/sections/{section_id}/summaries +
{
+  "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 /desktop/v1/code/sections/{section_id}/summaries +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/sources +
{
+  "tags": [
+    "native-code"
+  ],
+  "summary": "Sources",
+  "operationId": "sources_desktop_v1_code_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code/summaries/{summary_id}/approve +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/workspace +
{
+  "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": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/core-openapi.json b/docs/beta-1/api/core-openapi.json index ef9aa54..bc8362e 100644 --- a/docs/beta-1/api/core-openapi.json +++ b/docs/beta-1/api/core-openapi.json @@ -2,8 +2,8 @@ "openapi": "3.1.0", "info": { "title": "Townlight Records", - "description": "Townlight Beta 1 documentation view of the installed desktop domain schema. Component API version is unchanged. Exported without lifespan or database access; schema generation is not endpoint acceptance.", - "version": "1.8.0.dev1" + "description": "Prepared source schema for the actual native composition; installed acceptance remains pending. Exported without lifespan, migrations or database/network access.", + "version": "1.8.0.dev2" }, "paths": { "/config/portal-mode": { @@ -513,8 +513,8 @@ }, "/health": { "get": { - "summary": "Runtime Health", - "operationId": "runtime_health_health_get", + "summary": "Health", + "operationId": "health_health_get", "responses": { "200": { "description": "Successful Response", @@ -1166,76 +1166,10047 @@ } } } - }, - "/modules": { - "get": { - "summary": "Runtime Health", - "operationId": "runtime_health_modules_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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" } - } - } - }, - "/ready": { - "get": { - "summary": "Domain Ready", - "operationId": "domain_ready_ready_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} + }, + "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" } - } - } - } - }, - "components": { - "schemas": { - "AdaPlan": { + }, + "type": "object", + "required": [ + "version", + "database", + "ollama", + "redis", + "user_count", + "audit_log_count" + ], + "title": "SystemStatus" + }, + "TaggedPlan": { "properties": { "action": { "type": "string", - "const": "ada-title-ii", + "const": "tagged-pdf", "title": "Action" }, - "serviceArea": { - "type": "string", - "maxLength": 500, - "minLength": 1, - "title": "Servicearea" - }, - "hasCoordinatorReview": { - "type": "boolean", - "title": "Hascoordinatorreview", - "default": false + "headingLevels": { + "items": { + "type": "integer", + "maximum": 4294967295.0, + "minimum": 0.0 + }, + "type": "array", + "maxItems": 50, + "title": "Headinglevels" } }, "additionalProperties": false, "type": "object", "required": [ - "action", - "serviceArea" + "action" ], - "title": "AdaPlan" + "title": "TaggedPlan" }, - "CityProfileCreate": { + "TestConnectionRequest": { "properties": { - "city_name": { + "source_type": { "type": "string", - "title": "City Name" + "title": "Source Type" }, - "state": { + "host": { "anyOf": [ { "type": "string" @@ -1244,20 +11215,20 @@ "type": "null" } ], - "title": "State" + "title": "Host" }, - "county": { + "port": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" } ], - "title": "County" + "title": "Port" }, - "population_band": { + "path": { "anyOf": [ { "type": "string" @@ -1266,9 +11237,9 @@ "type": "null" } ], - "title": "Population Band" + "title": "Path" }, - "email_platform": { + "username": { "anyOf": [ { "type": "string" @@ -1277,72 +11248,73 @@ "type": "null" } ], - "title": "Email Platform" + "title": "Username" }, - "has_dedicated_it": { + "password": { "anyOf": [ { - "type": "boolean" + "type": "string" }, { "type": "null" } ], - "title": "Has Dedicated It" + "title": "Password" }, - "monthly_request_volume": { + "rest_api_config": { "anyOf": [ { - "type": "string" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], - "title": "Monthly Request Volume" - }, - "profile_data": { - "additionalProperties": true, - "type": "object", - "title": "Profile Data", - "default": {} + "title": "Rest Api Config" }, - "gap_map": { - "additionalProperties": true, - "type": "object", - "title": "Gap Map", - "default": {} + "odbc_config": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Odbc Config" } }, "type": "object", "required": [ - "city_name" + "source_type" ], - "title": "CityProfileCreate" + "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." }, - "CityProfileRead": { + "TestConnectionResponse": { "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" + "success": { + "type": "boolean", + "title": "Success" }, - "city_name": { + "message": { "type": "string", - "title": "City Name" + "title": "Message" }, - "state": { + "latency_ms": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" } ], - "title": "State" + "title": "Latency Ms" }, - "county": { + "status": { "anyOf": [ { "type": "string" @@ -1351,9 +11323,9 @@ "type": "null" } ], - "title": "County" + "title": "Status" }, - "population_band": { + "warning": { "anyOf": [ { "type": "string" @@ -1362,9 +11334,41 @@ "type": "null" } ], - "title": "Population Band" + "title": "Warning" }, - "email_platform": { + "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" @@ -1373,20 +11377,45 @@ "type": "null" } ], - "title": "Email Platform" + "title": "Internal Note" + } + }, + "type": "object", + "required": [ + "event_type", + "description" + ], + "title": "TimelineEventCreate" + }, + "TimelineEventRead": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" }, - "has_dedicated_it": { + "request_id": { + "type": "string", + "format": "uuid", + "title": "Request Id" + }, + "event_type": { + "type": "string", + "title": "Event Type" + }, + "actor_id": { "anyOf": [ { - "type": "boolean" + "type": "string", + "format": "uuid" }, { "type": "null" } ], - "title": "Has Dedicated It" + "title": "Actor Id" }, - "monthly_request_volume": { + "actor_role": { "anyOf": [ { "type": "string" @@ -1395,54 +11424,79 @@ "type": "null" } ], - "title": "Monthly Request Volume" + "title": "Actor Role" }, - "onboarding_status": { + "description": { "type": "string", - "title": "Onboarding Status" - }, - "profile_data": { - "additionalProperties": true, - "type": "object", - "title": "Profile Data" + "title": "Description" }, - "gap_map": { - "additionalProperties": true, - "type": "object", - "title": "Gap Map" + "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" }, - "updated_at": { + "action": { "type": "string", - "format": "date-time", - "title": "Updated At" + "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", - "city_name", - "state", - "county", - "population_band", - "email_platform", - "has_dedicated_it", - "monthly_request_volume", - "onboarding_status", - "profile_data", - "gap_map", - "created_at", - "updated_at" + "action", + "actor", + "note", + "created_at_unix_seconds" ], - "title": "CityProfileRead" + "title": "TimelineView" }, - "CityProfileUpdate": { + "TitleCreate": { "properties": { - "city_name": { + "title_id": { "anyOf": [ { "type": "string" @@ -1451,124 +11505,217 @@ "type": "null" } ], - "title": "City Name" + "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 }, - "state": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "State" + "is_verified": { + "type": "boolean", + "title": "Is Verified", + "default": false }, - "county": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "County" + "full_name": { + "type": "string", + "title": "Full Name" }, - "population_band": { + "role": { + "$ref": "#/components/schemas/UserRole" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "last_login": { "anyOf": [ { - "type": "string" + "type": "string", + "format": "date-time" }, { "type": "null" } ], - "title": "Population Band" + "title": "Last Login" }, - "email_platform": { + "must_change_password": { + "type": "boolean", + "title": "Must Change Password", + "default": false + }, + "department_id": { "anyOf": [ { - "type": "string" + "type": "string", + "format": "uuid" }, { "type": "null" } ], - "title": "Email Platform" - }, - "has_dedicated_it": { + "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": "boolean" + "type": "string" }, { "type": "null" } ], - "title": "Has Dedicated It" + "title": "Password" }, - "monthly_request_volume": { + "email": { "anyOf": [ { - "type": "string" + "type": "string", + "format": "email" }, { "type": "null" } ], - "title": "Monthly Request Volume" + "title": "Email" }, - "onboarding_status": { + "is_active": { "anyOf": [ { - "type": "string" + "type": "boolean" }, { "type": "null" } ], - "title": "Onboarding Status" + "title": "Is Active" }, - "profile_data": { + "is_superuser": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "type": "boolean" }, { "type": "null" } ], - "title": "Profile Data" + "title": "Is Superuser" }, - "gap_map": { + "is_verified": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "type": "boolean" }, { "type": "null" } ], - "title": "Gap Map" - } - }, - "type": "object", - "title": "CityProfileUpdate" - }, - "DepartmentCreate": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "code": { - "type": "string", - "title": "Code" + "title": "Is Verified" }, - "contact_email": { + "full_name": { "anyOf": [ { "type": "string" @@ -1577,32 +11724,16 @@ "type": "null" } ], - "title": "Contact Email" + "title": "Full Name" } }, "type": "object", - "required": [ - "name", - "code" - ], - "title": "DepartmentCreate" + "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}." }, - "DepartmentRead": { + "UserUpdateRequest": { "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" - }, - "name": { - "type": "string", - "title": "Name" - }, - "code": { - "type": "string", - "title": "Code" - }, - "contact_email": { + "full_name": { "anyOf": [ { "type": "string" @@ -1611,27 +11742,9 @@ "type": "null" } ], - "title": "Contact Email" + "title": "Full Name" }, - "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": { + "role": { "anyOf": [ { "type": "string" @@ -1640,345 +11753,355 @@ "type": "null" } ], - "title": "Name" + "title": "Role" }, - "code": { + "department_id": { "anyOf": [ { - "type": "string" + "type": "string", + "format": "uuid" }, { "type": "null" } ], - "title": "Code" + "title": "Department Id" }, - "contact_email": { + "is_active": { "anyOf": [ { - "type": "string" + "type": "boolean" }, { "type": "null" } ], - "title": "Contact Email" - } - }, - "type": "object", - "title": "DepartmentUpdate" - }, - "ExportReceipt": { - "properties": { - "export_path": { - "type": "string", - "maxLength": 32768, - "minLength": 1, - "title": "Export Path" + "title": "Is Active" } }, - "additionalProperties": false, "type": "object", - "required": [ - "export_path" - ], - "title": "ExportReceipt" + "title": "UserUpdateRequest" }, - "FormPlan": { + "ValidationError": { "properties": { - "action": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { "type": "string", - "const": "form-plan", - "title": "Action" + "title": "Message" }, - "formName": { + "type": { "type": "string", - "maxLength": 500, - "title": "Formname", - "default": "" + "title": "Error Type" }, - "fields": { - "items": { - "type": "string" - }, - "type": "array", - "maxItems": 50, - "title": "Fields" + "input": { + "title": "Input" + }, + "ctx": { + "type": "object", + "title": "Context" } }, - "additionalProperties": false, "type": "object", "required": [ - "action" + "loc", + "msg", + "type" ], - "title": "FormPlan" + "title": "ValidationError" }, - "HTTPValidationError": { + "Version": { "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" + "sequence": { + "type": "integer", + "minimum": 1.0, + "title": "Sequence" } }, + "additionalProperties": false, "type": "object", - "title": "HTTPValidationError" + "required": [ + "sequence" + ], + "title": "Version" }, - "PortalModeResponse": { + "VoteCorrection": { "properties": { - "mode": { + "vote": { "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." + "minLength": 1, + "title": "Vote" + }, + "reason": { + "type": "string", + "minLength": 1, + "title": "Reason" } }, + "additionalProperties": false, "type": "object", "required": [ - "mode" + "vote", + "reason" ], - "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." + "title": "VoteCorrection" }, - "PublishingPlan": { + "VoteInput": { "properties": { - "action": { - "type": "string", - "const": "publishing-workflow", - "title": "Action" - }, - "title": { + "voter_name": { "type": "string", - "maxLength": 500, - "title": "Title", - "default": "" - }, - "hasReview": { - "type": "boolean", - "title": "Hasreview", - "default": false - }, - "hasPlainLanguage": { - "type": "boolean", - "title": "Hasplainlanguage", - "default": false + "minLength": 1, + "title": "Voter Name" }, - "hasTranslationReview": { - "type": "boolean", - "title": "Hastranslationreview", - "default": false + "vote": { + "type": "string", + "minLength": 1, + "title": "Vote" } }, "additionalProperties": false, "type": "object", "required": [ - "action" + "voter_name", + "vote" ], - "title": "PublishingPlan" + "title": "VoteInput" }, - "ReviewInput": { + "_ParcelLookupIn": { "properties": { - "title": { - "type": "string", - "maxLength": 500, - "title": "Title", - "default": "" - }, - "body": { + "jurisdiction": { "type": "string", - "maxLength": 5000, - "title": "Body", - "default": "" - }, - "hasAltText": { - "type": "boolean", - "title": "Hasalttext", - "default": false + "maxLength": 255, + "minLength": 1, + "title": "Jurisdiction" }, - "language": { + "query": { "type": "string", - "maxLength": 80, - "title": "Language", - "default": "en" + "maxLength": 500, + "minLength": 1, + "title": "Query" } }, "additionalProperties": false, "type": "object", - "title": "ReviewInput" + "required": [ + "jurisdiction", + "query" + ], + "title": "_ParcelLookupIn" }, - "RewriteInput": { + "townlight_inspections__workflow_models__SourceLink": { "properties": { - "action": { + "provider": { "type": "string", - "enum": [ - "plain-language", - "language-variant" - ], - "title": "Action" + "const": "code", + "title": "Provider", + "default": "code" }, - "text": { + "source_id": { "type": "string", - "maxLength": 5000, + "maxLength": 500, "minLength": 1, - "title": "Text" + "title": "Source Id" }, - "language": { + "expected_sha256": { "type": "string", - "maxLength": 80, - "title": "Language", - "default": "" + "pattern": "^[a-f0-9]{64}$", + "title": "Expected Sha256" } }, "additionalProperties": false, "type": "object", "required": [ - "action", - "text" + "source_id", + "expected_sha256" ], - "title": "RewriteInput" + "title": "SourceLink" }, - "RewriteResult": { + "townlight_permitting__workflow_models__SourceLink": { "properties": { - "action": { + "provider": { "type": "string", "enum": [ - "plain-language", - "language-variant" + "code", + "zoning" ], - "title": "Action" + "title": "Provider" }, - "text": { + "source_id": { "type": "string", - "maxLength": 5000, + "maxLength": 500, "minLength": 1, - "title": "Text" + "title": "Source Id" }, - "language": { + "expected_sha256": { "type": "string", - "maxLength": 80, - "title": "Language", - "default": "" + "pattern": "^[a-f0-9]{64}$", + "title": "Expected Sha256" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "provider", + "source_id", + "expected_sha256" + ], + "title": "SourceLink" + }, + "townlight_runtime__inspections_bridge__Search": { + "properties": { + "provider": { + "type": "string", + "const": "code", + "title": "Provider" }, - "outcome": { + "query": { "type": "string", - "enum": [ - "generated", - "unavailable" - ], - "title": "Outcome" + "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" }, - "generated": { - "anyOf": [ - { - "type": "string", - "maxLength": 100000 - }, - { - "type": "null" - } - ], - "title": "Generated" + "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" }, - "model": { + "expected_revision": { "anyOf": [ { "type": "string", - "maxLength": 200 + "format": "uuid" }, { "type": "null" } ], - "title": "Model" + "title": "Expected Revision" } }, "additionalProperties": false, "type": "object", "required": [ - "action", - "text", - "outcome" + "bundle" ], - "title": "RewriteResult" + "title": "Import" }, - "SaveReview": { + "townlight_runtime__permitting_bridge__Search": { "properties": { - "title": { - "type": "string", - "maxLength": 500, - "title": "Title", - "default": "" - }, - "body": { + "provider": { "type": "string", - "maxLength": 5000, - "title": "Body", - "default": "" - }, - "hasAltText": { - "type": "boolean", - "title": "Hasalttext", - "default": false + "enum": [ + "code", + "zoning" + ], + "title": "Provider" }, - "language": { + "query": { "type": "string", - "maxLength": 80, - "title": "Language", - "default": "en" - }, - "ai_analysis": { - "anyOf": [ - { - "type": "string", - "maxLength": 100000 - }, - { - "type": "null" - } - ], - "title": "Ai Analysis" + "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" }, - "ai_analysis_model": { + "expected_previous_revision": { "anyOf": [ { "type": "string", - "maxLength": 200 + "maxLength": 36, + "minLength": 36 }, { "type": "null" } ], - "title": "Ai Analysis Model" - }, - "ai_outcome": { - "type": "string", - "enum": [ - "generated", - "unavailable", - "failed" - ], - "title": "Ai Outcome" + "title": "Expected Previous Revision" } }, "additionalProperties": false, "type": "object", "required": [ - "ai_outcome" + "bundle" ], - "title": "SaveReview" + "title": "Import" }, - "SearchInput": { + "townlight_runtime__planning_bridge__Search": { "properties": { "query": { "type": "string", - "maxLength": 5000, + "maxLength": 2000, "minLength": 1, "title": "Query" + }, + "plan_type": { + "anyOf": [ + { + "type": "string", + "maxLength": 40 + }, + { + "type": "null" + } + ], + "title": "Plan Type" } }, "additionalProperties": false, @@ -1986,72 +12109,37 @@ "required": [ "query" ], - "title": "SearchInput" + "title": "Search" }, - "TaggedPlan": { + "townlight_runtime__zoning_bridge__Review": { "properties": { - "action": { + "answer": { "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" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" + "maxLength": 10000, + "title": "Answer", + "default": "" }, - "msg": { + "notes": { "type": "string", - "title": "Message" + "maxLength": 10000, + "title": "Notes", + "default": "" }, - "type": { + "queue_status": { "type": "string", - "title": "Error Type" - }, - "input": { - "title": "Input" - }, - "ctx": { - "type": "object", - "title": "Context" + "enum": [ + "open", + "in_review", + "resolved", + "closed" + ], + "title": "Queue Status", + "default": "resolved" } }, + "additionalProperties": false, "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" + "title": "Review" } }, "securitySchemes": { @@ -2066,5 +12154,9 @@ } } }, - "x-townlight-boundary": "Effective outer runtime plus selected mounted inner-domain paths; outer /health wins" -} \ No newline at end of file + "x-townlight-component": { + "view": "core", + "identity": "Townlight Core 1.3.0.dev2", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/core.html b/docs/beta-1/api/core.html index c05e38e..07dc8dd 100644 --- a/docs/beta-1/api/core.html +++ b/docs/beta-1/api/core.html @@ -1,5 +1,4 @@ -Townlight -Core API Reference | Townlight Beta 1
townlightTownlight Beta 1
-
Townlight Beta 1

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

API -reference scope

-

This is the Townlight Beta 1 technical contract for -Core. The desktop-domain entries below come from the installed -candidate’s generated OpenAPI schema. Export did not start a server, -enter application lifespan, run migrations or contact a database. It is -schema evidence, not proof of every endpoint’s runtime behavior. The -acceptance section of the operating manual identifies exercised -paths.

-

The complete filtered OpenAPI JSON -preserves request bodies, parameters, response declarations, constraints -and referenced schemas. An empty response schema means that this -application did not declare a structured response model; do not infer a -stronger contract from a green HTTP status. HTTP authorization enforced -inside dependencies is still required when an automatically generated -header parameter says optional.

-

Origins and authentication

-

The canonical native domain transport uses -http://127.0.0.1:15480. The native shell supplies -X-Townlight-Session and maps it to a persisted SQL -identity; browser code must not invent an actor or role. A trusted local -integration must protect that proof as a credential and revalidate -current authority. Standalone /auth/jwt/login uses the -existing bearer-token flow; that token is not interchangeable with -native proof. Public routes have their own permission and deployment -gates. Do not bind the native domain runtime to a non-loopback -interface.

-

Station defaults to explicit loopback port 8756. Its -service revalidates Townlight authority. Its browser exchanges a one-use -60-second ticket for a 900-second HttpOnly SameSite Strict operator -cookie. Browser mutations require the exact Origin and -X-Station-UI: 1. Native session proof must not be put in a -URL or shipped to an MCP client.

-

Failure and retry contract

-

401 means missing/expired identity; 403 -means permission or origin denial; 404 means a missing or -unavailable resource; 409 commonly means revision, -source-hash, lifecycle or idempotency conflict; 422 means -invalid input; 429 means a bounded rate/capacity refusal; -503 means an unavailable dependency, configuration or -schema. Individual routes may use only a subset and source-derived -checks can add errors absent from generated response declarations. -Preserve edits, read the detail and inspect current state before -retrying a write. Neither a retry nor an idempotency key authorizes a -changed payload.

-

Effective installed -runtime contract

-

The inner domain export in -reference/desktop-domain-openapi.json has 243 paths and 245 -schemas. The installed host is a second FastAPI application: it -registers GET /health, GET /modules -and GET /ready before mounting that domain application -at /. Its /health therefore -overrides the inner app.main.health at the -installed origin. The effective composition has 245 unique URI paths. -The filtered downloads for Suite, Core and Records compose those real -outer routes over their inner-domain selection; the original inner and -outer exports remain separate evidence files.

- ---- - - - - - - - - - - - - - - - - - - - - -
Outer operationActual response and use
GET /healthRuntime status (ok or -degraded), service/version, product profile, module checks, -database check and local_only. HTTP 200 when healthy, -otherwise 503. This is not the inner app’s simple status/version -handler.
GET /modulesThe same runtime health payload and HTTP status as -/health; not a second independent readiness proof.
GET /readystatus (ready or not-ready) -and reason; HTTP 200/503 after the applicable activation, -schema and provider checks. Use this for domain readiness.
-

For example, a ready result has shape -{"status":"ready","reason":"<actual profile-specific readiness reason>"}; -an inactive domain returns -{"status":"not-ready","reason":"domain-inactive"} with 503. -These are source-derived shapes, not new execution receipts. Read the -actual reason rather than treating a listening process or -/health alone as canonical readiness.

-

The native origin remains http://127.0.0.1:15480. -Station’s separately paired suite process can use another explicitly -configured loopback port; its Station origin and the Station service’s -suite origin must agree. The Station operating guide supplies that setup -without disabling normal activation.

-

Installed desktop HTTP -operations

-

GET /config/portal-mode

-

Get the deployment’s current portal posture.

-

Operation ID: get_portal_mode_config_portal_mode_get. -Tags: public.

- - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: PortalModeResponse
-

GET /city-profile

-

Get City Profile

-

Operation ID: get_city_profile_city_profile_get. Tags: -city-profile.

- ----- - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: CityProfileRead or null
-

POST /city-profile

-

Create City Profile

-

Operation ID: create_city_profile_city_profile_post. -Tags: city-profile.

-

Request body: application/json; required. Model: -CityProfileCreate.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
201Successful Responseapplication/json: CityProfileRead
422Validation Errorapplication/json: HTTPValidationError
-

PATCH /city-profile

-

Update City Profile

-

Operation ID: update_city_profile_city_profile_patch. -Tags: city-profile.

-

Request body: application/json; required. Model: -CityProfileUpdate.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: CityProfileRead
422Validation Errorapplication/json: HTTPValidationError
-

GET /catalog/domains

-

List Domains

-

Operation ID: list_domains_catalog_domains_get. Tags: -catalog.

- - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
-

GET /catalog/systems

-

List Systems

-

Operation ID: list_systems_catalog_systems_get. Tags: -catalog.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
domainqueryno at schema levelstring or null
- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

GET /catalog/connectors

-

List Connectors

-

Operation ID: list_connectors_catalog_connectors_get. -Tags: catalog.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
domainqueryyesstring
- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST /catalog/load

-

Trigger Catalog Load

-

Operation ID: trigger_catalog_load_catalog_load_post. -Tags: catalog.

- - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
-

GET /departments/

-

List Departments

-

Operation ID: list_departments_departments__get. Tags: -departments.

- ----- - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: array of DepartmentRead
-

POST /departments/

-

Create Department

-

Operation ID: create_department_departments__post. Tags: -departments.

-

Request body: application/json; required. Model: -DepartmentCreate.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
201Successful Responseapplication/json: DepartmentRead
422Validation Errorapplication/json: HTTPValidationError
-

GET /departments/{dept_id}

-

Get Department

-

Operation ID: get_department_departments__dept_id__get. -Tags: departments.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
dept_idpathyesstring; format=uuid
- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: DepartmentRead
422Validation Errorapplication/json: HTTPValidationError
-

PATCH /departments/{dept_id}

-

Update Department

-

Operation ID: -update_department_departments__dept_id__patch. Tags: -departments.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
dept_idpathyesstring; format=uuid
-

Request body: application/json; required. Model: -DepartmentUpdate.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: DepartmentRead
422Validation Errorapplication/json: HTTPValidationError
-

DELETE /departments/{dept_id}

-

Delete Department

-

Operation ID: -delete_department_departments__dept_id__delete. Tags: -departments.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
dept_idpathyesstring; format=uuid
- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
204Successful ResponseNo content model declared
422Validation Errorapplication/json: HTTPValidationError
-

GET /health

-

Runtime Health

-

Operation ID: runtime_health_health_get. Tags: .

- - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
-

GET /desktop/v1/access/state

-

Access State

-

Operation ID: access_state_desktop_v1_access_state_get. -Tags: native-access.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
X-Townlight-Sessionheaderno at schema levelstring or null
- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST -/desktop/v1/access/review-context

-

Review Context

-

Operation ID: -review_context_desktop_v1_access_review_context_post. Tags: -native-access.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
X-Townlight-Sessionheaderno at schema levelstring or null
-

Request body: application/json; required. Model: -ReviewInput.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST -/desktop/v1/access/reviews

-

Save Review

-

Operation ID: -save_review_desktop_v1_access_reviews_post. Tags: -native-access.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
X-Townlight-Sessionheaderno at schema levelstring or null
-

Request body: application/json; required. Model: -SaveReview.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST -/desktop/v1/access/reviews/{review_id}/delete

-

Delete Review

-

Operation ID: -delete_review_desktop_v1_access_reviews__review_id__delete_post. -Tags: native-access.

- - - - - - - - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
review_idpathyesstring; format=uuid
X-Townlight-Sessionheaderno at schema levelstring or null
- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST /desktop/v1/access/tools

-

Tool

-

Operation ID: tool_desktop_v1_access_tools_post. Tags: -native-access.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
X-Townlight-Sessionheaderno at schema levelstring or null
-

Request body: application/json; required. Model: -object.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST -/desktop/v1/access/rewrite-context

-

Rewrite Context

-

Operation ID: -rewrite_context_desktop_v1_access_rewrite_context_post. -Tags: native-access.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
X-Townlight-Sessionheaderno at schema levelstring or null
-

Request body: application/json; required. Model: -RewriteInput.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST -/desktop/v1/access/rewrite-result

-

Rewrite Result

-

Operation ID: -rewrite_result_desktop_v1_access_rewrite_result_post. Tags: -native-access.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
X-Townlight-Sessionheaderno at schema levelstring or null
-

Request body: application/json; required. Model: -RewriteResult.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST -/desktop/v1/access/reviews/{review_id}/export

-

Prepare Export

-

Operation ID: -prepare_export_desktop_v1_access_reviews__review_id__export_post. -Tags: native-access.

- - - - - - - - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
review_idpathyesstring; format=uuid
X-Townlight-Sessionheaderno at schema levelstring or null
- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST -/desktop/v1/access/exports/{artifact_id}/complete

-

Complete Export

-

Operation ID: -complete_export_desktop_v1_access_exports__artifact_id__complete_post. -Tags: native-access.

- - - - - - - - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
artifact_idpathyesstring; format=uuid
X-Townlight-Sessionheaderno at schema levelstring or null
-

Request body: application/json; required. Model: -ExportReceipt.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

GET /desktop/v1/suite/state

-

Suite State

-

Operation ID: suite_state_desktop_v1_suite_state_get. -Tags: native-records-snapshot.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
X-Townlight-Sessionheaderno at schema levelstring or null
- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

POST /desktop/v1/suite/search

-

Search

-

Operation ID: search_desktop_v1_suite_search_post. Tags: -native-records-snapshot.

- - - - - - - - - - - - - - - - - -
ParameterLocationRequiredType and constraints
X-Townlight-Sessionheaderno at schema levelstring or null
-

Request body: application/json; required. Model: -SearchInput.

- - - - - - - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
422Validation Errorapplication/json: HTTPValidationError
-

GET /modules

-

Runtime Health

-

Operation ID: runtime_health_modules_get. Tags: .

- - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
-

GET /ready

-

Domain Ready

-

Operation ID: domain_ready_ready_get. Tags: .

- - - - - - - - - - - - - - - -
Declared statusDescriptionResponse model
200Successful Responseapplication/json: Unspecified JSON shape
-

Request and response data -dictionary

-

Fields below retain the actual schema requirements and constraints. -null and omitted are distinct where a model distinguishes -them. Additional-property rules apply per schema. Full discriminators, -nested definitions and defaults are retained in the JSON.

-

AdaPlan

-

Additional properties: false.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
actionyesstring; value ada-title-ii
serviceAreayesstring; minLength=1; maxLength=500
hasCoordinatorReviewnobooleandefault false.
-

CityProfileCreate

-

Additional properties: not explicitly declared.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
city_nameyesstring
statenostring or null
countynostring or null
population_bandnostring or null
email_platformnostring or null
has_dedicated_itnoboolean or null
monthly_request_volumenostring or null
profile_datanoobjectdefault {}.
gap_mapnoobjectdefault {}.
-

CityProfileRead

-

Additional properties: not explicitly declared.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
idyesstring; format=uuid
city_nameyesstring
stateyesstring or null
countyyesstring or null
population_bandyesstring or null
email_platformyesstring or null
has_dedicated_ityesboolean or null
monthly_request_volumeyesstring or null
onboarding_statusyesstring
profile_datayesobject
gap_mapyesobject
created_atyesstring; format=date-time
updated_atyesstring; format=date-time
-

CityProfileUpdate

-

Additional properties: not explicitly declared.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
city_namenostring or null
statenostring or null
countynostring or null
population_bandnostring or null
email_platformnostring or null
has_dedicated_itnoboolean or null
monthly_request_volumenostring or null
onboarding_statusnostring or null
profile_datanoobject or null
gap_mapnoobject or null
-

DepartmentCreate

-

Additional properties: not explicitly declared.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
nameyesstring
codeyesstring
contact_emailnostring or null
-

DepartmentRead

-

Additional properties: not explicitly declared.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
idyesstring; format=uuid
nameyesstring
codeyesstring
contact_emailyesstring or null
created_atyesstring; format=date-time
-

DepartmentUpdate

-

Additional properties: not explicitly declared.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
namenostring or null
codenostring or null
contact_emailnostring or null
-

ExportReceipt

-

Additional properties: false.

- - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
export_pathyesstring; minLength=1; maxLength=32768
-

FormPlan

-

Additional properties: false.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
actionyesstring; value form-plan
formNamenostring; maxLength=500default ““.
fieldsnoarray of string; maxItems=50
-

HTTPValidationError

-

Additional properties: not explicitly declared.

- - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
detailnoarray of ValidationError
-

PortalModeResponse

-

T5D — schema for GET /config/portal-mode.

-

Exposed to the frontend on boot so it can branch routing without a -user-identity lookup. The payload is intentionally the single field -below — no staff config, no user state, no schema version.

-

Additional properties: not explicitly declared.

- ------ - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
modeyesstring; values public, privateActive 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.
-

PublishingPlan

-

Additional properties: false.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
actionyesstring; value publishing-workflow
titlenostring; maxLength=500default ““.
hasReviewnobooleandefault false.
hasPlainLanguagenobooleandefault false.
hasTranslationReviewnobooleandefault false.
-

ReviewInput

-

Additional properties: false.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
titlenostring; maxLength=500default ““.
bodynostring; maxLength=5000default ““.
hasAltTextnobooleandefault false.
languagenostring; maxLength=80default “en”.
-

RewriteInput

-

Additional properties: false.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
actionyesstring; values plain-language, language-variant
textyesstring; minLength=1; maxLength=5000
languagenostring; maxLength=80default ““.
-

RewriteResult

-

Additional properties: false.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
actionyesstring; values plain-language, language-variant
textyesstring; minLength=1; maxLength=5000
languagenostring; maxLength=80default ““.
outcomeyesstring; values generated, unavailable
generatednostring; maxLength=100000 or null
modelnostring; maxLength=200 or null
-

SaveReview

-

Additional properties: false.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
titlenostring; maxLength=500default ““.
bodynostring; maxLength=5000default ““.
hasAltTextnobooleandefault false.
languagenostring; maxLength=80default “en”.
ai_analysisnostring; maxLength=100000 or null
ai_analysis_modelnostring; maxLength=200 or null
ai_outcomeyesstring; values generated, unavailable, failed
-

SearchInput

-

Additional properties: false.

- - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
queryyesstring; minLength=1; maxLength=5000
-

TaggedPlan

-

Additional properties: false.

- ------ - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
actionyesstring; value tagged-pdf
headingLevelsnoarray of integer; minimum=0.0; maximum=4294967295.0; -maxItems=50
-

ValidationError

-

Additional properties: not explicitly declared.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldRequiredType and constraintsDefault or description
locyesarray of string or integer
msgyesstring
typeyesstring
inputnoobject
ctxnoobject
-

Source route and -validation supplement

-

These declarations are extracted from the immutable candidate source. -Package standalone routes are a different deployment -surface from the mounted installed domain. They are listed to -document existing code, not to claim they all have installed or city -acceptance. A source declaration without a resolved include-router mount -is identified as such. Full signatures, direct HTTP refusals and schema -fields are retained in the source inventory.

-

router.py

-

Candidate source: -installed-owned-source/civiccore/llm/registry/router.py.

-

GET /admin/models — handler -list_models, line 46. Declared router prefix included.

-
list_models(session: AsyncSession=Depends(get_session))
-

GET /admin/models/{model_id} — handler -get_model, line 53. Declared router prefix included.

-
get_model(model_id: int, session: AsyncSession=Depends(get_session))
-

Direct handler refusals: -HTTPException(status_code=404, detail=f'Model {model_id} not found').

-

POST /admin/models — handler -create_model, line 61. Declared router prefix included.

-
create_model(payload: ModelRegistryCreate, session: AsyncSession=Depends(get_session))
-

PATCH /admin/models/{model_id} — -handler update_model, line 73. Declared router prefix -included.

-
update_model(model_id: int, payload: ModelRegistryUpdate, session: AsyncSession=Depends(get_session))
-

Direct handler refusals: -HTTPException(status_code=404, detail=f'Model {model_id} not found').

-

DELETE /admin/models/{model_id} — -handler delete_model, line 89. Declared router prefix -included.

-
delete_model(model_id: int, session: AsyncSession=Depends(get_session))
-

Direct handler refusals: -HTTPException(status_code=404, detail=f'Model {model_id} not found').

-

services.py

-

Candidate source: -installed-owned-source/civicsuite_runtime/services.py.

-

GET /health — handler -runtime_health, line 439. Declared router prefix -included.

-
runtime_health()
-

GET /modules — handler -runtime_health, line 439. Declared router prefix -included.

-
runtime_health()
-

GET /ready — handler -domain_ready, line 444. Declared router prefix -included.

-
domain_ready()
-

Alphabetical contract index

-
    -
  • AdaPlan — request/response data -dictionary.

  • -
  • CityProfileCreate — request/response data -dictionary.

  • -
  • CityProfileRead — request/response data -dictionary.

  • -
  • CityProfileUpdate — request/response data -dictionary.

  • -
  • DepartmentCreate — request/response data -dictionary.

  • -
  • DepartmentRead — request/response data -dictionary.

  • -
  • DepartmentUpdate — request/response data -dictionary.

  • -
  • ExportReceipt — request/response data -dictionary.

  • -
  • FormPlan — request/response data -dictionary.

  • -
  • HTTPValidationError — request/response data -dictionary.

  • -
  • PortalModeResponse — request/response data -dictionary.

  • -
  • PublishingPlan — request/response data -dictionary.

  • -
  • ReviewInput — request/response data -dictionary.

  • -
  • RewriteInput — request/response data -dictionary.

  • -
  • RewriteResult — request/response data -dictionary.

  • -
  • SaveReview — request/response data -dictionary.

  • -
  • SearchInput — request/response data -dictionary.

  • -
  • TaggedPlan — request/response data -dictionary.

  • -
  • ValidationError — request/response data -dictionary.

  • -
  • Authentication: Origins and authentication.

  • -
  • Conflicts and retry: Failure and retry contract.

  • -
  • Fields and validation: Request and response data -dictionary.

  • -
  • HTTP operations: Installed desktop HTTP operations.

  • -
  • Standalone boundaries: Source route and validation -supplement.

  • -
- \ No newline at end of file + +pre{white-space:pre-wrap;overflow-wrap:anywhere}summary{cursor:pointer;padding:.6rem;font-weight:600}details{margin:.5rem 0}
Townlight

Townlight Core API reference

+

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

+

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

+

HTTP operations

+
GET /catalog/connectors +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Connectors",
+  "operationId": "list_connectors_catalog_connectors_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "domain",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Domain"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /catalog/domains +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Domains",
+  "operationId": "list_domains_catalog_domains_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /catalog/load +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "Trigger Catalog Load",
+  "operationId": "trigger_catalog_load_catalog_load_post",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /catalog/systems +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Systems",
+  "operationId": "list_systems_catalog_systems_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "domain",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Domain"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Get City Profile",
+  "operationId": "get_city_profile_city_profile_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "anyOf": [
+              {
+                "$ref": "#/components/schemas/CityProfileRead"
+              },
+              {
+                "type": "null"
+              }
+            ],
+            "title": "Response Get City Profile City Profile Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Create City Profile",
+  "operationId": "create_city_profile_city_profile_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/CityProfileCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/CityProfileRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Update City Profile",
+  "operationId": "update_city_profile_city_profile_patch",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/CityProfileUpdate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/CityProfileRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /config/portal-mode +
{
+  "tags": [
+    "public"
+  ],
+  "summary": "Get the deployment's current portal posture.",
+  "operationId": "get_portal_mode_config_portal_mode_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/PortalModeResponse"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /departments/ +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "List Departments",
+  "operationId": "list_departments_departments__get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/DepartmentRead"
+            },
+            "type": "array",
+            "title": "Response List Departments Departments  Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /departments/ +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Create Department",
+  "operationId": "create_department_departments__post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DepartmentCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Get Department",
+  "operationId": "get_department_departments__dept_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Update Department",
+  "operationId": "update_department_departments__dept_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DepartmentUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Delete Department",
+  "operationId": "delete_department_departments__dept_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/exports/{artifact_id}/complete +
{
+  "tags": [
+    "native-access"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExportReceipt"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/review-context +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Review Context",
+  "operationId": "review_context_desktop_v1_access_review_context_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/ReviewInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/reviews +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Save Review",
+  "operationId": "save_review_desktop_v1_access_reviews_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/SaveReview"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/reviews/{review_id}/delete +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Delete Review",
+  "operationId": "delete_review_desktop_v1_access_reviews__review_id__delete_post",
+  "parameters": [
+    {
+      "name": "review_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Review 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 /desktop/v1/access/reviews/{review_id}/export +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Prepare Export",
+  "operationId": "prepare_export_desktop_v1_access_reviews__review_id__export_post",
+  "parameters": [
+    {
+      "name": "review_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Review 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 /desktop/v1/access/rewrite-context +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Rewrite Context",
+  "operationId": "rewrite_context_desktop_v1_access_rewrite_context_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/RewriteInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/rewrite-result +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Rewrite Result",
+  "operationId": "rewrite_result_desktop_v1_access_rewrite_result_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/RewriteResult"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/access/state +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Access State",
+  "operationId": "access_state_desktop_v1_access_state_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 /desktop/v1/access/tools +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Tool",
+  "operationId": "tool_desktop_v1_access_tools_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": {
+          "oneOf": [
+            {
+              "$ref": "#/components/schemas/FormPlan"
+            },
+            {
+              "$ref": "#/components/schemas/PublishingPlan"
+            },
+            {
+              "$ref": "#/components/schemas/AdaPlan"
+            },
+            {
+              "$ref": "#/components/schemas/TaggedPlan"
+            }
+          ],
+          "discriminator": {
+            "propertyName": "action",
+            "mapping": {
+              "form-plan": "#/components/schemas/FormPlan",
+              "publishing-workflow": "#/components/schemas/PublishingPlan",
+              "ada-title-ii": "#/components/schemas/AdaPlan",
+              "tagged-pdf": "#/components/schemas/TaggedPlan"
+            }
+          },
+          "title": "Data"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/suite/search +
{
+  "tags": [
+    "native-records-snapshot"
+  ],
+  "summary": "Search",
+  "operationId": "search_desktop_v1_suite_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/SearchInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/suite/state +
{
+  "tags": [
+    "native-records-snapshot"
+  ],
+  "summary": "Suite State",
+  "operationId": "suite_state_desktop_v1_suite_state_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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /health +
{
+  "summary": "Health",
+  "operationId": "health_health_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/inspections-openapi.json b/docs/beta-1/api/inspections-openapi.json new file mode 100644 index 0000000..41a40ef --- /dev/null +++ b/docs/beta-1/api/inspections-openapi.json @@ -0,0 +1,11811 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/inspections-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Inspections Sources", + "operationId": "search_inspections_sources_desktop_v1_inspections_sources_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/MeetingsSearch" + } + } + } + }, + "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-inspections" + ], + "summary": "Notice", + "operationId": "notice_desktop_v1_inspections_notice_draft_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/InspectionInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/cases": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "Cases", + "operationId": "cases_desktop_v1_inspections_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-inspections" + ], + "summary": "Create Case", + "operationId": "create_case_desktop_v1_inspections_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/InspectionInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/cases/{case_id}": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "Case", + "operationId": "case_desktop_v1_inspections_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/inspections/cases/{case_id}/revisions": { + "post": { + "tags": [ + "native-inspections" + ], + "summary": "Revise", + "operationId": "revise_desktop_v1_inspections_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/InspectionInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/cases/{case_id}/history": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "History", + "operationId": "history_desktop_v1_inspections_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/inspections/cases/{case_id}/packets": { + "post": { + "tags": [ + "native-inspections" + ], + "summary": "Packet", + "operationId": "packet_desktop_v1_inspections_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/inspections/packets/{packet_id}": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "Document", + "operationId": "document_desktop_v1_inspections_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/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-inspections" + ], + "summary": "Retain", + "operationId": "retain_desktop_v1_inspections_evidence_retain_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/EvidenceItems" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/media/analyse": { + "post": { + "tags": [ + "native-inspections" + ], + "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", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MediaAnalysis" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/connections/search": { + "post": { + "tags": [ + "native-inspections" + ], + "summary": "Connections", + "operationId": "connections_desktop_v1_inspections_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__inspections_bridge__Search" + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "inspections", + "identity": "Townlight Inspections 0.3.0+dev.2", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/inspections.html b/docs/beta-1/api/inspections.html new file mode 100644 index 0000000..91ede31 --- /dev/null +++ b/docs/beta-1/api/inspections.html @@ -0,0 +1,12288 @@ +Townlight Inspections API reference
Townlight

Townlight Inspections API reference

+

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

+

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

+

HTTP operations

+
POST /desktop/v1/inspections-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Inspections Sources",
+  "operationId": "search_inspections_sources_desktop_v1_inspections_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/cases +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Cases",
+  "operationId": "cases_desktop_v1_inspections_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 /desktop/v1/inspections/cases +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Create Case",
+  "operationId": "create_case_desktop_v1_inspections_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/InspectionInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/cases/{case_id} +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Case",
+  "operationId": "case_desktop_v1_inspections_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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/cases/{case_id}/history +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "History",
+  "operationId": "history_desktop_v1_inspections_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/cases/{case_id}/packets +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Packet",
+  "operationId": "packet_desktop_v1_inspections_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/cases/{case_id}/revisions +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Revise",
+  "operationId": "revise_desktop_v1_inspections_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/InspectionInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/connections/search +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Connections",
+  "operationId": "connections_desktop_v1_inspections_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__inspections_bridge__Search"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/evidence/retain +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Retain",
+  "operationId": "retain_desktop_v1_inspections_evidence_retain_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/EvidenceItems"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/evidence/supported-types +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/media/analyse +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "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",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/MediaAnalysis"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/notice-draft +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Notice",
+  "operationId": "notice_desktop_v1_inspections_notice_draft_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/InspectionInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/packets/{packet_id} +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Document",
+  "operationId": "document_desktop_v1_inspections_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/repeat-cases +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/meetings-openapi.json b/docs/beta-1/api/meetings-openapi.json new file mode 100644 index 0000000..c9ab41a --- /dev/null +++ b/docs/beta-1/api/meetings-openapi.json @@ -0,0 +1,12880 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/meetings-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Meetings Sources", + "operationId": "search_meetings_sources_desktop_v1_meetings_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/stages": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Record Meeting Stage", + "operationId": "record_meeting_stage_desktop_v1_meetings_meetings__meeting_id__stages_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/MeetingStageInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Create Meeting", + "operationId": "create_meeting_desktop_v1_meetings_meetings_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/MeetingInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "Get Meeting", + "operationId": "get_meeting_desktop_v1_meetings_meetings__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/agenda-items": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Create Agenda Item", + "operationId": "create_agenda_item_desktop_v1_meetings_agenda_items_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/AgendaInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/agenda-items/{item_id}": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "Get Agenda Item", + "operationId": "get_agenda_item_desktop_v1_meetings_agenda_items__item_id__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/meetings/agenda-items/{item_id}/reviews": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Record Agenda Review", + "operationId": "record_agenda_review_desktop_v1_meetings_agenda_items__item_id__reviews_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/AgendaReviewInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/agenda-items/{item_id}/meeting": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AgendaAssignment" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/notices/{notice_id}/template": { + "get": { + "tags": [ + "native-meetings" + ], + "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", + "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/notices/{notice_id}/document": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoticeDocumentInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/notice-checks": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoticeInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/notices/{notice_id}/proof": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Record Notice Proof", + "operationId": "record_notice_proof_desktop_v1_meetings_notices__notice_id__proof_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/NoticeProofInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/transcripts": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Capture Transcript", + "operationId": "capture_transcript_desktop_v1_meetings_meetings__meeting_id__transcripts_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/TranscriptInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/action-items": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Capture Action Item", + "operationId": "capture_action_item_desktop_v1_meetings_meetings__meeting_id__action_items_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/ActionItemInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/archive": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Archive Meeting", + "operationId": "archive_meeting_desktop_v1_meetings_meetings__meeting_id__archive_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/ArchiveInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PacketInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/packets/{packet_id}/deliver": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Export Packet", + "operationId": "export_packet_desktop_v1_meetings_packets__packet_id__deliver_post", + "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/meetings/minutes/{draft_id}/decisions": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Decide Minutes", + "operationId": "decide_minutes_desktop_v1_meetings_minutes__draft_id__decisions_post", + "parameters": [ + { + "name": "draft_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "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": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/motions": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MotionInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/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", + "parameters": [ + { + "name": "motion_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Motion 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/MotionCorrection" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/motions/{motion_id}/votes": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VoteInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/votes/{vote_id}/corrections": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VoteCorrection" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DraftInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/proceedings": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "Proceedings", + "operationId": "proceedings_desktop_v1_meetings_meetings__meeting_id__proceedings_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/station/catalog": { + "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", + "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" + } + } + } + } + } + } + }, + "/public/meetings": { + "get": { + "tags": [ + "public-meetings" + ], + "summary": "Public Archive Index", + "operationId": "public_archive_index_public_meetings_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" + } + } + } + } + } + } + }, + "/public/meetings/{record_id}": { + "get": { + "tags": [ + "public-meetings" + ], + "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": { + "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" + } + }, + { + "name": "kind", + "in": "path", + "required": true, + "schema": { + "enum": [ + "agenda", + "packet", + "minutes" + ], + "type": "string", + "title": "Kind" + } + } + ], + "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" + } + } + } + } + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "meetings", + "identity": "Townlight Meetings 1.0.5", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/meetings.html b/docs/beta-1/api/meetings.html new file mode 100644 index 0000000..a0337ea --- /dev/null +++ b/docs/beta-1/api/meetings.html @@ -0,0 +1,13338 @@ +Townlight Meetings API reference
Townlight

Townlight Meetings API reference

+

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

+

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

+

HTTP operations

+
POST /desktop/v1/meetings-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Meetings Sources",
+  "operationId": "search_meetings_sources_desktop_v1_meetings_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/agenda-items +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Create Agenda Item",
+  "operationId": "create_agenda_item_desktop_v1_meetings_agenda_items_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/AgendaInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/agenda-items/{item_id} +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Get Agenda Item",
+  "operationId": "get_agenda_item_desktop_v1_meetings_agenda_items__item_id__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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/agenda-items/{item_id}/meeting +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/AgendaAssignment"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/agenda-items/{item_id}/reviews +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Record Agenda Review",
+  "operationId": "record_agenda_review_desktop_v1_meetings_agenda_items__item_id__reviews_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/AgendaReviewInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/code-connections +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/code-connections/{connection_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/code-connections/{connection_id}/decisions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Create Meeting",
+  "operationId": "create_meeting_desktop_v1_meetings_meetings_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/MeetingInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/meetings/{meeting_id} +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Get Meeting",
+  "operationId": "get_meeting_desktop_v1_meetings_meetings__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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/action-items +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Capture Action Item",
+  "operationId": "capture_action_item_desktop_v1_meetings_meetings__meeting_id__action_items_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/ActionItemInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/archive +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Archive Meeting",
+  "operationId": "archive_meeting_desktop_v1_meetings_meetings__meeting_id__archive_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/ArchiveInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DraftInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/motions +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/MotionInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/notice-checks +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/NoticeInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/PacketInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/meetings/{meeting_id}/proceedings +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Proceedings",
+  "operationId": "proceedings_desktop_v1_meetings_meetings__meeting_id__proceedings_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/stages +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Record Meeting Stage",
+  "operationId": "record_meeting_stage_desktop_v1_meetings_meetings__meeting_id__stages_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/MeetingStageInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/transcripts +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Capture Transcript",
+  "operationId": "capture_transcript_desktop_v1_meetings_meetings__meeting_id__transcripts_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/TranscriptInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/minutes/{draft_id}/decisions +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Decide Minutes",
+  "operationId": "decide_minutes_desktop_v1_meetings_minutes__draft_id__decisions_post",
+  "parameters": [
+    {
+      "name": "draft_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "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": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/motions/{motion_id}/corrections +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/MotionCorrection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/motions/{motion_id}/votes +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/VoteInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/notices/{notice_id}/document +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/NoticeDocumentInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/notices/{notice_id}/proof +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Record Notice Proof",
+  "operationId": "record_notice_proof_desktop_v1_meetings_notices__notice_id__proof_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/NoticeProofInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/notices/{notice_id}/template +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "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 /desktop/v1/meetings/packets/{packet_id}/deliver +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Export Packet",
+  "operationId": "export_packet_desktop_v1_meetings_packets__packet_id__deliver_post",
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/station/catalog +
{
+  "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",
+      "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 /desktop/v1/meetings/votes/{vote_id}/corrections +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/VoteCorrection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /public/meetings +
{
+  "tags": [
+    "public-meetings"
+  ],
+  "summary": "Public Archive Index",
+  "operationId": "public_archive_index_public_meetings_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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /public/meetings/{record_id} +
{
+  "tags": [
+    "public-meetings"
+  ],
+  "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": {
+        "text/html": {
+          "schema": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /public/meetings/{record_id}/{kind}.txt +
{
+  "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"
+      }
+    },
+    {
+      "name": "kind",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "enum": [
+          "agenda",
+          "packet",
+          "minutes"
+        ],
+        "type": "string",
+        "title": "Kind"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/notice-openapi.json b/docs/beta-1/api/notice-openapi.json new file mode 100644 index 0000000..a0f6902 --- /dev/null +++ b/docs/beta-1/api/notice-openapi.json @@ -0,0 +1,11619 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/notice/notices": { + "get": { + "tags": [ + "native-notice" + ], + "summary": "Inventory", + "operationId": "inventory_desktop_v1_notice_notices_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": { + "tags": [ + "native-notice" + ], + "summary": "Create", + "operationId": "create_desktop_v1_notice_notices_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/NoticeDraft" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}": { + "get": { + "tags": [ + "native-notice" + ], + "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", + "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/notice/notices/{notice_id}/revisions": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Edit", + "operationId": "edit_desktop_v1_notice_notices__notice_id__revisions_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/Revision" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}/review": { + "post": { + "tags": [ + "native-notice" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/townlight_runtime__notice_bridge__Review" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}/approval": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Approve", + "operationId": "approve_desktop_v1_notice_notices__notice_id__approval_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/Version" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}/proof": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Proof", + "operationId": "proof_desktop_v1_notice_notices__notice_id__proof_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/Proof" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}/archive": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Archive", + "operationId": "archive_desktop_v1_notice_notices__notice_id__archive_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/Version" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/archives/{archive_id}": { + "get": { + "tags": [ + "native-notice" + ], + "summary": "Export", + "operationId": "export_desktop_v1_notice_archives__archive_id__get", + "parameters": [ + { + "name": "archive_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Archive 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/notice/archives/{archive_id}/records": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Handoff", + "operationId": "handoff_desktop_v1_notice_archives__archive_id__records_post", + "parameters": [ + { + "name": "archive_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Archive 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/Handoff" + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "notice", + "identity": "Townlight Notice 0.3.0", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/notice.html b/docs/beta-1/api/notice.html new file mode 100644 index 0000000..275a264 --- /dev/null +++ b/docs/beta-1/api/notice.html @@ -0,0 +1,12100 @@ +Townlight Notice API reference
Townlight

Townlight Notice API reference

+

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

+

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

+

HTTP operations

+
GET /desktop/v1/notice/archives/{archive_id} +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Export",
+  "operationId": "export_desktop_v1_notice_archives__archive_id__get",
+  "parameters": [
+    {
+      "name": "archive_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Archive 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 /desktop/v1/notice/archives/{archive_id}/records +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Handoff",
+  "operationId": "handoff_desktop_v1_notice_archives__archive_id__records_post",
+  "parameters": [
+    {
+      "name": "archive_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Archive 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/Handoff"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/notice/notices +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Inventory",
+  "operationId": "inventory_desktop_v1_notice_notices_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 /desktop/v1/notice/notices +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Create",
+  "operationId": "create_desktop_v1_notice_notices_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/NoticeDraft"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/notice/notices/{notice_id} +
{
+  "tags": [
+    "native-notice"
+  ],
+  "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",
+      "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 /desktop/v1/notice/notices/{notice_id}/approval +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Approve",
+  "operationId": "approve_desktop_v1_notice_notices__notice_id__approval_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/Version"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notice/notices/{notice_id}/archive +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Archive",
+  "operationId": "archive_desktop_v1_notice_notices__notice_id__archive_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/Version"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notice/notices/{notice_id}/proof +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Proof",
+  "operationId": "proof_desktop_v1_notice_notices__notice_id__proof_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/Proof"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notice/notices/{notice_id}/review +
{
+  "tags": [
+    "native-notice"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/townlight_runtime__notice_bridge__Review"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notice/notices/{notice_id}/revisions +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Edit",
+  "operationId": "edit_desktop_v1_notice_notices__notice_id__revisions_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/Revision"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/permitting-openapi.json b/docs/beta-1/api/permitting-openapi.json new file mode 100644 index 0000000..8a857fe --- /dev/null +++ b/docs/beta-1/api/permitting-openapi.json @@ -0,0 +1,11763 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/permitting-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Permitting Sources", + "operationId": "search_permitting_sources_desktop_v1_permitting_sources_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/MeetingsSearch" + } + } + } + }, + "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" + } + } + } + } + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "permitting", + "identity": "Townlight Permitting 0.3.0+dev.2", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/permitting.html b/docs/beta-1/api/permitting.html new file mode 100644 index 0000000..9b8dc83 --- /dev/null +++ b/docs/beta-1/api/permitting.html @@ -0,0 +1,12243 @@ +Townlight Permitting API reference
Townlight

Townlight Permitting API reference

+

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

+

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

+

HTTP operations

+
POST /desktop/v1/permitting-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Permitting Sources",
+  "operationId": "search_permitting_sources_desktop_v1_permitting_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/cases +
{
+  "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 /desktop/v1/permitting/cases +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/cases/{case_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/cases/{case_id}/history +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/cases/{case_id}/packets +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/cases/{case_id}/revisions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/connections/search +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/packets/{packet_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/pathway +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/requirements +
{
+  "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 /desktop/v1/permitting/requirements +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/requirements/{revision_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/planning-openapi.json b/docs/beta-1/api/planning-openapi.json new file mode 100644 index 0000000..952930b --- /dev/null +++ b/docs/beta-1/api/planning-openapi.json @@ -0,0 +1,12613 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/planning-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Planning Sources", + "operationId": "search_planning_sources_desktop_v1_planning_sources_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/MeetingsSearch" + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/desktop/v1/planning/sources": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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/sources/{plan_id}/history": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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/revisions/{revision_id}": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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/revisions/{revision_id}/documents/{document_id}": { + "get": { + "tags": [ + "native-planning" + ], + "summary": "Staff Original", + "operationId": "staff_original_desktop_v1_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" + } + }, + { + "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/policies/search": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Policies", + "operationId": "policies_desktop_v1_planning_policies_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__planning_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/planning/analyses": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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-planning" + ], + "summary": "Create Analysis", + "operationId": "create_analysis_desktop_v1_planning_analyses_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": "Body" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/analyses/{analysis_id}/revisions": { + "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": { + "type": "object", + "additionalProperties": true, + "title": "Body" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/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" + } + }, + { + "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/analyses/{analysis_id}/history": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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/analyses/{analysis_id}/snapshot-preview": { + "post": { + "tags": [ + "native-planning" + ], + "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", + "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", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/analyses/{analysis_id}/snapshots": { + "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" + } + }, + { + "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", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/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" + } + }, + { + "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", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectionSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/progress/targets": { + "get": { + "tags": [ + "native-planning" + ], + "summary": "Municipal Progress", + "operationId": "municipal_progress_desktop_v1_planning_progress_targets_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/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" + } + } + } + } + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "planning", + "identity": "Townlight Planning 0.4.0.dev2", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/planning.html b/docs/beta-1/api/planning.html new file mode 100644 index 0000000..39ab819 --- /dev/null +++ b/docs/beta-1/api/planning.html @@ -0,0 +1,13078 @@ +Townlight Planning API reference
Townlight

Townlight Planning API reference

+

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

+

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

+

HTTP operations

+
POST /desktop/v1/planning-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Planning Sources",
+  "operationId": "search_planning_sources_desktop_v1_planning_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/amendments +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/amendments/history +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/amendments/{item_id}/revisions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/analyses +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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 /desktop/v1/planning/analyses +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Create Analysis",
+  "operationId": "create_analysis_desktop_v1_planning_analyses_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": "Body"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/analyses/{analysis_id} +
{
+  "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"
+      }
+    },
+    {
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/analyses/{analysis_id}/history +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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 /desktop/v1/planning/analyses/{analysis_id}/revisions +
{
+  "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": {
+          "type": "object",
+          "additionalProperties": true,
+          "title": "Body"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/analyses/{analysis_id}/snapshot-preview +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/analyses/{analysis_id}/snapshots +
{
+  "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"
+      }
+    },
+    {
+      "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",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/connections/search +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Connections",
+  "operationId": "connections_desktop_v1_planning_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/ConnectionSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/imports +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/imports/preview +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/initiatives +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/initiatives/{item_id}/revisions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/municipal-work/{item_id}/history +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/policies/search +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Policies",
+  "operationId": "policies_desktop_v1_planning_policies_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__planning_bridge__Search"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/progress/targets +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Municipal Progress",
+  "operationId": "municipal_progress_desktop_v1_planning_progress_targets_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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/revisions/{revision_id} +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/revisions/{revision_id}/documents/{document_id} +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Staff Original",
+  "operationId": "staff_original_desktop_v1_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"
+      }
+    },
+    {
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/snapshots +
{
+  "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"
+      }
+    },
+    {
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/snapshots/{snapshot_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/snapshots/{snapshot_id}/access-advice +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/sources +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/sources/{plan_id}/history +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/records-openapi.json b/docs/beta-1/api/records-openapi.json new file mode 100644 index 0000000..bfe2814 --- /dev/null +++ b/docs/beta-1/api/records-openapi.json @@ -0,0 +1,19234 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/auth/jwt/login": { + "post": { + "tags": [ + "auth" + ], + "summary": "Auth:Jwt.Login", + "operationId": "auth_jwt_login_auth_jwt_login_post", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Body_auth_jwt_login_auth_jwt_login_post" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BearerResponse" + }, + "example": { + "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOTIyMWZmYzktNjQwZi00MzcyLTg2ZDMtY2U2NDJjYmE1NjAzIiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTcxNTA0MTkzfQ.M10bjOe45I5Ncu_uXvOmVV8QxnL-nZfcH96U90JaocI", + "token_type": "bearer" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "LOGIN_BAD_CREDENTIALS": { + "summary": "Bad credentials or the user is inactive.", + "value": { + "detail": "LOGIN_BAD_CREDENTIALS" + } + }, + "LOGIN_USER_NOT_VERIFIED": { + "summary": "The user is not verified.", + "value": { + "detail": "LOGIN_USER_NOT_VERIFIED" + } + } + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/auth/jwt/logout": { + "post": { + "tags": [ + "auth" + ], + "summary": "Auth:Jwt.Logout", + "operationId": "auth_jwt_logout_auth_jwt_logout_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "401": { + "description": "Missing token or inactive user." + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/users/me": { + "get": { + "tags": [ + "users" + ], + "summary": "Users:Current User", + "operationId": "users_current_user_users_me_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRead" + } + } + } + }, + "401": { + "description": "Missing token or inactive user." + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "patch": { + "tags": [ + "users" + ], + "summary": "Users:Patch Current User", + "operationId": "users_patch_current_user_users_me_patch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserSelfUpdate" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRead" + } + } + } + }, + "401": { + "description": "Missing token or inactive user." + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "UPDATE_USER_EMAIL_ALREADY_EXISTS": { + "summary": "A user with this email already exists.", + "value": { + "detail": "UPDATE_USER_EMAIL_ALREADY_EXISTS" + } + }, + "UPDATE_USER_INVALID_PASSWORD": { + "summary": "Password validation failed.", + "value": { + "detail": { + "code": "UPDATE_USER_INVALID_PASSWORD", + "reason": "Password should beat least 3 characters" + } + } + } + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/users/{id}": { + "get": { + "tags": [ + "users" + ], + "summary": "Users:User", + "operationId": "users_user_users__id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRead" + } + } + } + }, + "401": { + "description": "Missing token or inactive user." + }, + "403": { + "description": "Not a superuser." + }, + "404": { + "description": "The user does not exist." + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "users" + ], + "summary": "Users:Patch User", + "operationId": "users_patch_user_users__id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserSelfUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRead" + } + } + } + }, + "401": { + "description": "Missing token or inactive user." + }, + "403": { + "description": "Not a superuser." + }, + "404": { + "description": "The user does not exist." + }, + "400": { + "content": { + "application/json": { + "examples": { + "UPDATE_USER_EMAIL_ALREADY_EXISTS": { + "summary": "A user with this email already exists.", + "value": { + "detail": "UPDATE_USER_EMAIL_ALREADY_EXISTS" + } + }, + "UPDATE_USER_INVALID_PASSWORD": { + "summary": "Password validation failed.", + "value": { + "detail": { + "code": "UPDATE_USER_INVALID_PASSWORD", + "reason": "Password should beat least 3 characters" + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + }, + "description": "Bad Request" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "users" + ], + "summary": "Users:Delete User", + "operationId": "users_delete_user_users__id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "401": { + "description": "Missing token or inactive user." + }, + "403": { + "description": "Not a superuser." + }, + "404": { + "description": "The user does not exist." + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/config/portal-mode": { + "get": { + "tags": [ + "public" + ], + "summary": "Get the deployment's current portal posture.", + "operationId": "get_portal_mode_config_portal_mode_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PortalModeResponse" + } + } + } + } + } + } + }, + "/audit/logs": { + "get": { + "tags": [ + "audit" + ], + "summary": "List Audit Logs", + "operationId": "list_audit_logs_audit_logs_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "action", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Action" + } + }, + { + "name": "resource_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Resource Type" + } + }, + { + "name": "user_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "User Id" + } + }, + { + "name": "start_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Start Date" + } + }, + { + "name": "end_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "End Date" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 200, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AuditLogRead" + }, + "title": "Response List Audit Logs Audit Logs Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/audit/verify": { + "get": { + "tags": [ + "audit" + ], + "summary": "Verify Audit Chain", + "operationId": "verify_audit_chain_audit_verify_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuditChainVerification" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/audit/export": { + "get": { + "tags": [ + "audit" + ], + "summary": "Export Audit Logs", + "operationId": "export_audit_logs_audit_export_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "json", + "title": "Format" + } + }, + { + "name": "start_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Start Date" + } + }, + { + "name": "end_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "End Date" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/service-accounts/": { + "get": { + "tags": [ + "service-accounts" + ], + "summary": "List Service Accounts", + "operationId": "list_service_accounts_service_accounts__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ServiceAccountRead" + }, + "type": "array", + "title": "Response List Service Accounts Service Accounts Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "service-accounts" + ], + "summary": "Create Service Account", + "operationId": "create_service_account_service_accounts__post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountCreated" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/service-accounts/{account_id}": { + "patch": { + "tags": [ + "service-accounts" + ], + "summary": "Update Service Account", + "operationId": "update_service_account_service_accounts__account_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "account_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Account Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/status": { + "get": { + "tags": [ + "admin" + ], + "summary": "System Status", + "operationId": "system_status_admin_status_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemStatus" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/admin/users": { + "get": { + "tags": [ + "admin" + ], + "summary": "List Users", + "description": "List all users. Admin only.", + "operationId": "list_users_admin_users_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/UserRead" + }, + "type": "array", + "title": "Response List Users Admin Users Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "admin" + ], + "summary": "Create User", + "description": "Create a new user. Admin only.", + "operationId": "create_user_admin_users_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminUserCreateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminUserCreateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/admin/users/{user_id}": { + "patch": { + "tags": [ + "admin" + ], + "summary": "Update User", + "description": "Update user fields. Admin only.\n\nGuards against self-demotion: admins cannot change their own role.", + "operationId": "update_user_admin_users__user_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "User Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminUserCreateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/models": { + "get": { + "tags": [ + "admin" + ], + "summary": "List Models", + "operationId": "list_models_admin_models_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OllamaStatus" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/admin/models/registry": { + "get": { + "tags": [ + "admin" + ], + "summary": "List Model Registry", + "operationId": "list_model_registry_admin_models_registry_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ModelRegistryRead" + }, + "type": "array", + "title": "Response List Model Registry Admin Models Registry Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "admin" + ], + "summary": "Register Model", + "operationId": "register_model_admin_models_registry_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelRegistryCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelRegistryRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/admin/models/registry/{model_id}": { + "patch": { + "tags": [ + "admin" + ], + "summary": "Update Model Registry", + "operationId": "update_model_registry_admin_models_registry__model_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "model_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Model Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelRegistryUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelRegistryRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "admin" + ], + "summary": "Delete Model Registry", + "operationId": "delete_model_registry_admin_models_registry__model_id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "model_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Model Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/fee-schedules": { + "get": { + "tags": [ + "admin" + ], + "summary": "List Fee Schedules", + "description": "List all fee schedules. Admin only.", + "operationId": "list_fee_schedules_admin_fee_schedules_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "jurisdiction", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Jurisdiction" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeeScheduleRead" + }, + "title": "Response List Fee Schedules Admin Fee Schedules Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "admin" + ], + "summary": "Create Fee Schedule", + "description": "Create a new fee schedule. Admin only.", + "operationId": "create_fee_schedule_admin_fee_schedules_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeScheduleCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeScheduleRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/fee-schedules/{schedule_id}": { + "patch": { + "tags": [ + "admin" + ], + "summary": "Update Fee Schedule", + "description": "Update a fee schedule. Admin only.", + "operationId": "update_fee_schedule_admin_fee_schedules__schedule_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "schedule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Schedule Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeScheduleUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeScheduleRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "admin" + ], + "summary": "Delete Fee Schedule", + "description": "Delete a fee schedule. Admin only.", + "operationId": "delete_fee_schedule_admin_fee_schedules__schedule_id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "schedule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Schedule Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/coverage-gaps": { + "get": { + "tags": [ + "admin" + ], + "summary": "Get Coverage Gaps", + "description": "Identify coverage gaps across jurisdictions, departments, and exemption categories.\n\nReturns:\n- Jurisdictions (state codes) that have no exemption rules\n- Departments with no assigned staff users\n- Exemption categories without any active rules", + "operationId": "get_coverage_gaps_admin_coverage_gaps_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CoverageGapResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/datasources/": { + "get": { + "tags": [ + "datasources" + ], + "summary": "List Datasources", + "operationId": "list_datasources_datasources__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/DataSourceRead" + }, + "type": "array", + "title": "Response List Datasources Datasources Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "datasources" + ], + "summary": "Create Datasource", + "operationId": "create_datasource_datasources__post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataSourceCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataSourceAdminRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/datasources/{source_id}": { + "patch": { + "tags": [ + "datasources" + ], + "summary": "Update Datasource", + "operationId": "update_datasource_datasources__source_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataSourceUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataSourceAdminRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/ingest": { + "post": { + "tags": [ + "datasources" + ], + "summary": "Trigger Ingestion", + "operationId": "trigger_ingestion_datasources__source_id__ingest_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/upload": { + "post": { + "tags": [ + "datasources" + ], + "summary": "Upload File", + "operationId": "upload_file_datasources_upload_post", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_file_datasources_upload_post" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/datasources/documents/{document_id}/re-ingest": { + "post": { + "tags": [ + "datasources" + ], + "summary": "Re Ingest Document", + "description": "Re-ingest a failed document. Resets status to pending and queues for processing.", + "operationId": "re_ingest_document_datasources_documents__document_id__re_ingest_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Document Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/stats": { + "get": { + "tags": [ + "datasources" + ], + "summary": "Ingestion Stats", + "operationId": "ingestion_stats_datasources_stats_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IngestionStats" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/datasources/test-connection": { + "post": { + "tags": [ + "datasources" + ], + "summary": "Test Connection", + "description": "Test connectivity to a data source without persisting anything.\n\nThis endpoint validates the connection parameters and attempts a test\nconnection. Credentials are NOT persisted, NOT logged, and NOT returned.", + "operationId": "test_connection_datasources_test_connection_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestConnectionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestConnectionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/documents/": { + "get": { + "tags": [ + "documents" + ], + "summary": "List Documents", + "operationId": "list_documents_documents__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Source Id" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/IngestionStatus" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 500, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DocumentRead" + }, + "title": "Response List Documents Documents Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/documents/{document_id}": { + "get": { + "tags": [ + "documents" + ], + "summary": "Get Document", + "operationId": "get_document_documents__document_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Document Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/documents/{document_id}/chunks": { + "get": { + "tags": [ + "documents" + ], + "summary": "List Chunks", + "operationId": "list_chunks_documents__document_id__chunks_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Document Id" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 500, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DocumentChunkRead" + }, + "title": "Response List Chunks Documents Document Id Chunks Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures": { + "get": { + "tags": [ + "sync-failures" + ], + "summary": "List Sync Failures", + "operationId": "list_sync_failures_datasources__source_id__sync_failures_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Filter by status", + "title": "Status" + }, + "description": "Filter by status" + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 500, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SyncFailureRead" + }, + "title": "Response List Sync Failures Datasources Source Id Sync Failures Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures/{failure_id}/retry": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Retry Sync Failure", + "operationId": "retry_sync_failure_datasources__source_id__sync_failures__failure_id__retry_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "failure_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Failure Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures/{failure_id}/dismiss": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Dismiss Sync Failure", + "operationId": "dismiss_sync_failure_datasources__source_id__sync_failures__failure_id__dismiss_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "failure_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Failure Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures/retry-all": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Retry All Sync Failures", + "operationId": "retry_all_sync_failures_datasources__source_id__sync_failures_retry_all_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "status", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Status to reset — required", + "title": "Status" + }, + "description": "Status to reset — required" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures/dismiss-all": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Dismiss All Sync Failures", + "operationId": "dismiss_all_sync_failures_datasources__source_id__sync_failures_dismiss_all_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "status", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Status to dismiss — required", + "title": "Status" + }, + "description": "Status to dismiss — required" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/unpause": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Unpause Source", + "operationId": "unpause_source_datasources__source_id__unpause_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-run-log": { + "get": { + "tags": [ + "sync-failures" + ], + "summary": "Get Sync Run Log", + "operationId": "get_sync_run_log_datasources__source_id__sync_run_log_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 20, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SyncRunLogRead" + }, + "title": "Response Get Sync Run Log Datasources Source Id Sync Run Log Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/search/query": { + "post": { + "tags": [ + "search" + ], + "summary": "Execute Search", + "description": "Execute a hybrid search query. Optionally synthesize an LLM answer.", + "operationId": "execute_search_search_query_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/search/sessions": { + "get": { + "tags": [ + "search" + ], + "summary": "List Sessions", + "description": "List the current user's search sessions.", + "operationId": "list_sessions_search_sessions_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 20, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchSessionRead" + }, + "title": "Response List Sessions Search Sessions Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/search/sessions/{session_id}": { + "get": { + "tags": [ + "search" + ], + "summary": "Get Session", + "description": "Get a search session with its query history.", + "operationId": "get_session_search_sessions__session_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "session_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Session Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchSessionRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/search/filters": { + "get": { + "tags": [ + "search" + ], + "summary": "Get Filter Options", + "description": "Get available filter values for search.", + "operationId": "get_filter_options_search_filters_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchFilterOptions" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/search/export": { + "get": { + "tags": [ + "search" + ], + "summary": "Export Search Results", + "description": "Export search results as CSV. Runs a search and streams the results.", + "operationId": "export_search_results_search_export_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Query" + } + }, + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "csv", + "title": "Format" + } + }, + { + "name": "department_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Department Id" + } + }, + { + "name": "file_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Type" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/": { + "post": { + "tags": [ + "requests" + ], + "summary": "Create Request", + "operationId": "create_request_requests__post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "requests" + ], + "summary": "List Requests", + "operationId": "list_requests_requests__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/RequestStatus" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + { + "name": "assigned_to", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Assigned To" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RequestRead" + }, + "title": "Response List Requests Requests Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/stats": { + "get": { + "tags": [ + "requests" + ], + "summary": "Request Stats", + "operationId": "request_stats_requests_stats_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestStats" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/requests/{request_id}": { + "get": { + "tags": [ + "requests" + ], + "summary": "Get Request", + "operationId": "get_request_requests__request_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "requests" + ], + "summary": "Update Request", + "operationId": "update_request_requests__request_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/documents": { + "post": { + "tags": [ + "requests" + ], + "summary": "Attach Document", + "operationId": "attach_document_requests__request_id__documents_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestDocumentAdd" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestDocumentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "requests" + ], + "summary": "List Attached Documents", + "operationId": "list_attached_documents_requests__request_id__documents_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RequestDocumentRead" + }, + "title": "Response List Attached Documents Requests Request Id Documents Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/documents/{doc_id}": { + "delete": { + "tags": [ + "requests" + ], + "summary": "Remove Document", + "operationId": "remove_document_requests__request_id__documents__doc_id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "doc_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Doc Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/submit-review": { + "post": { + "tags": [ + "requests" + ], + "summary": "Submit For Review", + "operationId": "submit_for_review_requests__request_id__submit_review_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/ready-for-release": { + "post": { + "tags": [ + "requests" + ], + "summary": "Mark Ready For Release", + "operationId": "mark_ready_for_release_requests__request_id__ready_for_release_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/approve": { + "post": { + "tags": [ + "requests" + ], + "summary": "Approve Request", + "operationId": "approve_request_requests__request_id__approve_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/reject": { + "post": { + "tags": [ + "requests" + ], + "summary": "Reject Request", + "operationId": "reject_request_requests__request_id__reject_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "reason", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "", + "title": "Reason" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/timeline": { + "get": { + "tags": [ + "requests" + ], + "summary": "Get Timeline", + "operationId": "get_timeline_requests__request_id__timeline_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TimelineEventRead" + }, + "title": "Response Get Timeline Requests Request Id Timeline Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "requests" + ], + "summary": "Add Timeline Event", + "operationId": "add_timeline_event_requests__request_id__timeline_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimelineEventCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimelineEventRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/messages": { + "get": { + "tags": [ + "requests" + ], + "summary": "Get Messages", + "operationId": "get_messages_requests__request_id__messages_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageRead" + }, + "title": "Response Get Messages Requests Request Id Messages Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "requests" + ], + "summary": "Add Message", + "operationId": "add_message_requests__request_id__messages_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MessageCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MessageRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/fees": { + "get": { + "tags": [ + "requests" + ], + "summary": "Get Fees", + "operationId": "get_fees_requests__request_id__fees_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeeLineItemRead" + }, + "title": "Response Get Fees Requests Request Id Fees Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "requests" + ], + "summary": "Add Fee", + "operationId": "add_fee_requests__request_id__fees_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeLineItemCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeLineItemRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/estimate-fees": { + "post": { + "tags": [ + "requests" + ], + "summary": "Estimate Fees", + "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": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeEstimateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeEstimateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/fee-waiver": { + "post": { + "tags": [ + "requests" + ], + "summary": "Create Fee Waiver", + "description": "Request a fee waiver for this records request.", + "operationId": "create_fee_waiver_requests__request_id__fee_waiver_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeWaiverCreateRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeWaiverReadResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/fee-waiver/{waiver_id}": { + "patch": { + "tags": [ + "requests" + ], + "summary": "Review Fee Waiver", + "description": "Approve or deny a fee waiver. Reviewer/Admin only.", + "operationId": "review_fee_waiver_requests__request_id__fee_waiver__waiver_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "waiver_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Waiver Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeWaiverReviewRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeWaiverReadResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/response-letter": { + "post": { + "tags": [ + "requests" + ], + "summary": "Generate Response Letter", + "description": "Generate a draft response letter for a records request.\n\nAttempts LLM generation via Ollama first; falls back to a structured\ntemplate if the LLM is unavailable.", + "operationId": "generate_response_letter_requests__request_id__response_letter_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ResponseLetterCreate" + }, + { + "type": "null" + } + ], + "title": "Data" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLetterRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "requests" + ], + "summary": "Get Response Letter", + "description": "Get the latest response letter for a request.", + "operationId": "get_response_letter_requests__request_id__response_letter_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLetterRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/response-letter/{letter_id}": { + "patch": { + "tags": [ + "requests" + ], + "summary": "Update Response Letter", + "description": "Update a response letter's edited content or status.\n\nStatus changes to 'approved' require REVIEWER role.", + "operationId": "update_response_letter_requests__request_id__response_letter__letter_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "letter_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Letter Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLetterUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLetterRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/rules/": { + "post": { + "tags": [ + "exemptions" + ], + "summary": "Create Rule", + "operationId": "create_rule_exemptions_rules__post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionRuleCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionRuleRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "exemptions" + ], + "summary": "List Rules", + "operationId": "list_rules_exemptions_rules__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "state_code", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State Code" + } + }, + { + "name": "enabled", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enabled" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExemptionRuleRead" + }, + "title": "Response List Rules Exemptions Rules Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/rules/{rule_id}": { + "patch": { + "tags": [ + "exemptions" + ], + "summary": "Update Rule", + "operationId": "update_rule_exemptions_rules__rule_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "rule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Rule Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionRuleUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionRuleRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/rules/{rule_id}/history": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Get Rule History", + "description": "Get audit history for an exemption rule.", + "operationId": "get_rule_history_exemptions_rules__rule_id__history_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "rule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Rule Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/rules/{rule_id}/test": { + "post": { + "tags": [ + "exemptions" + ], + "summary": "Test Rule", + "description": "Test a rule against sample text. Returns match results.\n\nUses the `regex` library with timeout=2s to prevent ReDoS on\nadmin-entered patterns.", + "operationId": "test_rule_exemptions_rules__rule_id__test_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "rule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Rule Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleTestRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleTestResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/scan/{request_id}": { + "post": { + "tags": [ + "exemptions" + ], + "summary": "Scan For Exemptions", + "description": "Scan all documents attached to a request for exemptions.", + "operationId": "scan_for_exemptions_exemptions_scan__request_id__post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "state_code", + "in": "query", + "required": false, + "schema": { + "type": "string", + "pattern": "^[A-Z]{2}$", + "default": "CO", + "title": "State Code" + } + }, + { + "name": "use_llm", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "title": "Use Llm" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/flags/{request_id}": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "List Flags", + "operationId": "list_flags_exemptions_flags__request_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/FlagStatus" + }, + { + "type": "null" + } + ], + "title": "Status" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExemptionFlagRead" + }, + "title": "Response List Flags Exemptions Flags Request Id Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/flags/{flag_id}": { + "patch": { + "tags": [ + "exemptions" + ], + "summary": "Review Flag", + "operationId": "review_flag_exemptions_flags__flag_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "flag_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Flag Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionFlagReview" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionFlagRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/dashboard/accuracy": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Exemption Accuracy", + "description": "Acceptance/rejection rates by category, optionally filtered by department.", + "operationId": "exemption_accuracy_exemptions_dashboard_accuracy_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "department_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Department Id" + } + }, + { + "name": "date_from", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date From" + } + }, + { + "name": "date_to", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date To" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExemptionAccuracyReport" + }, + "title": "Response Exemption Accuracy Exemptions Dashboard Accuracy Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/dashboard/export": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Export Flag Data", + "description": "Export exemption flag data as JSON or CSV.", + "operationId": "export_flag_data_exemptions_dashboard_export_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "json", + "title": "Format" + } + }, + { + "name": "date_from", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date From" + } + }, + { + "name": "date_to", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date To" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/dashboard": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Exemption Dashboard", + "operationId": "exemption_dashboard_exemptions_dashboard_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionDashboard" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/exemptions/templates/": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "List Templates", + "operationId": "list_templates_exemptions_templates__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "template_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Template Type" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DisclosureTemplateRead" + }, + "title": "Response List Templates Exemptions Templates Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "exemptions" + ], + "summary": "Create Template", + "operationId": "create_template_exemptions_templates__post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/templates/{template_id}/render": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Render Template", + "description": "Render a template with city profile variables substituted.", + "operationId": "render_template_exemptions_templates__template_id__render_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "template_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Template Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateRendered" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/templates/{template_id}": { + "put": { + "tags": [ + "exemptions" + ], + "summary": "Update Template", + "operationId": "update_template_exemptions_templates__template_id__put", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "template_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Template Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/analytics/operational": { + "get": { + "tags": [ + "analytics" + ], + "summary": "Get Operational Metrics", + "operationId": "get_operational_metrics_analytics_operational_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OperationalMetrics" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/city-profile": { + "get": { + "tags": [ + "city-profile" + ], + "summary": "Get City Profile", + "operationId": "get_city_profile_city_profile_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/CityProfileRead" + }, + { + "type": "null" + } + ], + "title": "Response Get City Profile City Profile Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "city-profile" + ], + "summary": "Create City Profile", + "operationId": "create_city_profile_city_profile_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CityProfileCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CityProfileRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "patch": { + "tags": [ + "city-profile" + ], + "summary": "Update City Profile", + "operationId": "update_city_profile_city_profile_patch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CityProfileUpdate" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CityProfileRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/onboarding/interview": { + "post": { + "tags": [ + "onboarding" + ], + "summary": "Get Next Question", + "description": "Generate the next onboarding question and persist the last answer.", + "operationId": "get_next_question_onboarding_interview_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InterviewRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InterviewResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/catalog/domains": { + "get": { + "tags": [ + "catalog" + ], + "summary": "List Domains", + "operationId": "list_domains_catalog_domains_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/catalog/systems": { + "get": { + "tags": [ + "catalog" + ], + "summary": "List Systems", + "operationId": "list_systems_catalog_systems_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "domain", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Domain" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/catalog/connectors": { + "get": { + "tags": [ + "catalog" + ], + "summary": "List Connectors", + "operationId": "list_connectors_catalog_connectors_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "domain", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Domain" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/catalog/load": { + "post": { + "tags": [ + "catalog" + ], + "summary": "Trigger Catalog Load", + "operationId": "trigger_catalog_load_catalog_load_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/notifications/templates": { + "get": { + "tags": [ + "notifications" + ], + "summary": "List Templates", + "description": "List all notification templates.", + "operationId": "list_templates_notifications_templates_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/NotificationTemplateRead" + }, + "type": "array", + "title": "Response List Templates Notifications Templates Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "notifications" + ], + "summary": "Create Template", + "description": "Create a new notification template (admin only).", + "operationId": "create_template_notifications_templates_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/notifications/templates/{template_id}": { + "patch": { + "tags": [ + "notifications" + ], + "summary": "Update Template", + "description": "Update a notification template (admin only).", + "operationId": "update_template_notifications_templates__template_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "template_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Template Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/notifications/log": { + "get": { + "tags": [ + "notifications" + ], + "summary": "List Notification Log", + "description": "List recent notification log entries.", + "operationId": "list_notification_log_notifications_log_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 200, + "default": 50, + "title": "Limit" + } + }, + { + "name": "request_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationLogRead" + }, + "title": "Response List Notification Log Notifications Log Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/departments/": { + "get": { + "tags": [ + "departments" + ], + "summary": "List Departments", + "operationId": "list_departments_departments__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/DepartmentRead" + }, + "type": "array", + "title": "Response List Departments Departments Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "departments" + ], + "summary": "Create Department", + "operationId": "create_department_departments__post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/departments/{dept_id}": { + "get": { + "tags": [ + "departments" + ], + "summary": "Get Department", + "operationId": "get_department_departments__dept_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "dept_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Dept Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "departments" + ], + "summary": "Update Department", + "operationId": "update_department_departments__dept_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "dept_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Dept Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "departments" + ], + "summary": "Delete Department", + "operationId": "delete_department_departments__dept_id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "dept_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Dept Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/station/context": { + "get": { + "tags": [ + "native-desktop", + "station-integration" + ], + "summary": "Context", + "operationId": "context_desktop_v1_station_context_get", + "parameters": [ + { + "name": "capability", + "in": "query", + "required": true, + "schema": { + "enum": [ + "capture", + "read" + ], + "type": "string", + "title": "Capability" + } + }, + { + "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/requests/{request_id}/station-recordings": { + "post": { + "tags": [ + "native-desktop", + "station-integration" + ], + "summary": "Attach", + "operationId": "attach_desktop_v1_requests__request_id__station_recordings_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/Selection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/public/records-state": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Public Records State", + "operationId": "public_records_state_desktop_v1_public_records_state_get", + "parameters": [ + { + "name": "X-Townlight-Public", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Public" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsStateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/public/requests": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Public Records Intake", + "operationId": "public_records_intake_desktop_v1_public_requests_post", + "parameters": [ + { + "name": "X-Townlight-Public", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Public" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicIntake" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/public/lookup": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Public Records Lookup", + "operationId": "public_records_lookup_desktop_v1_public_lookup_post", + "parameters": [ + { + "name": "X-Townlight-Public", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Public" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicLookup" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/public/messages": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Public Records Message", + "operationId": "public_records_message_desktop_v1_public_messages_post", + "parameters": [ + { + "name": "X-Townlight-Public", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Public" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicMessage" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/permitting-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Permitting Sources", + "operationId": "search_permitting_sources_desktop_v1_permitting_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/permitting-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Permitting Source", + "operationId": "attach_permitting_source_desktop_v1_requests__request_id__permitting_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Inspections Sources", + "operationId": "search_inspections_sources_desktop_v1_inspections_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/inspections-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Inspections Source", + "operationId": "attach_inspections_source_desktop_v1_requests__request_id__inspections_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Planning Sources", + "operationId": "search_planning_sources_desktop_v1_planning_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/planning-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Planning Source", + "operationId": "attach_planning_source_desktop_v1_requests__request_id__planning_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Zoning Sources", + "operationId": "search_zoning_sources_desktop_v1_zoning_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/zoning-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Zoning Source", + "operationId": "attach_zoning_source_desktop_v1_requests__request_id__zoning_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/records-state": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Get Native Records State", + "operationId": "get_native_records_state_desktop_v1_records_state_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": { + "$ref": "#/components/schemas/RecordsStateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Meetings Sources", + "operationId": "search_meetings_sources_desktop_v1_meetings_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/meetings-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Meetings Source", + "operationId": "attach_meetings_source_desktop_v1_requests__request_id__meetings_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/code-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Code Sources", + "operationId": "search_code_sources_desktop_v1_code_sources_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/CodeSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/code-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Code Source", + "operationId": "attach_code_source_desktop_v1_requests__request_id__code_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/CodeSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notifications/{notification_id}/sent": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Mark Native Notification Sent", + "operationId": "mark_native_notification_sent_desktop_v1_notifications__notification_id__sent_post", + "parameters": [ + { + "name": "notification_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notification 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": { + "$ref": "#/components/schemas/RecordsStateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/documents": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Native Document", + "operationId": "attach_native_document_desktop_v1_requests__request_id__documents_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/AttachDocument" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/documents/{attachment_id}/release-copy": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Native Release Copy", + "operationId": "attach_native_release_copy_desktop_v1_requests__request_id__documents__attachment_id__release_copy_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "attachment_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Attachment 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/AttachReleaseCopy" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/artifacts": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Prepare Native Artifact", + "operationId": "prepare_native_artifact_desktop_v1_requests__request_id__artifacts_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/PrepareArtifact" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArtifactPlan" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/artifacts/{artifact_id}/complete": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Complete Native Artifact", + "operationId": "complete_native_artifact_desktop_v1_requests__request_id__artifacts__artifact_id__complete_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "artifact_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Artifact 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/CompleteArtifact" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Create Native Request", + "operationId": "create_native_request_desktop_v1_requests_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/StaffRecordsIntake" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NativeRequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Get Native Request", + "operationId": "get_native_request_desktop_v1_requests__request_id__get", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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": { + "$ref": "#/components/schemas/NativeRequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/view": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Get Native Request View", + "operationId": "get_native_request_view_desktop_v1_requests__request_id__view_get", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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": { + "$ref": "#/components/schemas/RecordsView" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/draft-context": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Native Draft Context", + "operationId": "native_draft_context_desktop_v1_requests__request_id__draft_context_get", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/requests/{request_id}/generated-draft": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Native Generated Draft", + "operationId": "native_generated_draft_desktop_v1_requests__request_id__generated_draft_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/GeneratedDraft" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/actions": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Native Request Operation", + "operationId": "native_request_operation_desktop_v1_requests__request_id__actions_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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": { + "oneOf": [ + { + "$ref": "#/components/schemas/AssignCommand" + }, + { + "$ref": "#/components/schemas/DeadlineCommand" + }, + { + "$ref": "#/components/schemas/CalculateDeadlineCommand" + }, + { + "$ref": "#/components/schemas/ClarificationCommand" + }, + { + "$ref": "#/components/schemas/MessageCommand" + }, + { + "$ref": "#/components/schemas/SearchNoteCommand" + }, + { + "$ref": "#/components/schemas/SearchReceiptCommand" + }, + { + "$ref": "#/components/schemas/ExemptionNoteCommand" + }, + { + "$ref": "#/components/schemas/ExemptionDecisionCommand" + }, + { + "$ref": "#/components/schemas/FeeEstimateCommand" + }, + { + "$ref": "#/components/schemas/FeeLineCommand" + }, + { + "$ref": "#/components/schemas/FeeWaiverCommand" + }, + { + "$ref": "#/components/schemas/DraftCommand" + }, + { + "$ref": "#/components/schemas/ApprovalCommand" + }, + { + "$ref": "#/components/schemas/FinishCommand" + } + ], + "discriminator": { + "propertyName": "action", + "mapping": { + "assign-records-request": "#/components/schemas/AssignCommand", + "set-records-deadline": "#/components/schemas/DeadlineCommand", + "calculate-records-deadline": "#/components/schemas/CalculateDeadlineCommand", + "request-records-clarification": "#/components/schemas/ClarificationCommand", + "add-records-message": "#/components/schemas/MessageCommand", + "record-records-search": "#/components/schemas/SearchNoteCommand", + "record-records-search-session": "#/components/schemas/SearchReceiptCommand", + "add-records-exemption-review": "#/components/schemas/ExemptionNoteCommand", + "add-records-exemption-decision": "#/components/schemas/ExemptionDecisionCommand", + "estimate-records-fee": "#/components/schemas/FeeEstimateCommand", + "add-records-fee-line": "#/components/schemas/FeeLineCommand", + "waive-records-fee": "#/components/schemas/FeeWaiverCommand", + "draft-records-response": "#/components/schemas/DraftCommand", + "approve-records-response": "#/components/schemas/ApprovalCommand", + "fulfill-records-request": "#/components/schemas/FinishCommand", + "close-records-request": "#/components/schemas/FinishCommand" + } + }, + "title": "Command" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/health": { + "get": { + "summary": "Health", + "operationId": "health_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/desktop/v1/access/state": { + "get": { + "tags": [ + "native-access" + ], + "summary": "Access State", + "operationId": "access_state_desktop_v1_access_state_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/access/review-context": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Review Context", + "operationId": "review_context_desktop_v1_access_review_context_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/ReviewInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Save Review", + "operationId": "save_review_desktop_v1_access_reviews_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/SaveReview" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews/{review_id}/delete": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Delete Review", + "operationId": "delete_review_desktop_v1_access_reviews__review_id__delete_post", + "parameters": [ + { + "name": "review_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Review 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/access/tools": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Tool", + "operationId": "tool_desktop_v1_access_tools_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": { + "oneOf": [ + { + "$ref": "#/components/schemas/FormPlan" + }, + { + "$ref": "#/components/schemas/PublishingPlan" + }, + { + "$ref": "#/components/schemas/AdaPlan" + }, + { + "$ref": "#/components/schemas/TaggedPlan" + } + ], + "discriminator": { + "propertyName": "action", + "mapping": { + "form-plan": "#/components/schemas/FormPlan", + "publishing-workflow": "#/components/schemas/PublishingPlan", + "ada-title-ii": "#/components/schemas/AdaPlan", + "tagged-pdf": "#/components/schemas/TaggedPlan" + } + }, + "title": "Data" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/rewrite-context": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Rewrite Context", + "operationId": "rewrite_context_desktop_v1_access_rewrite_context_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/RewriteInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/rewrite-result": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Rewrite Result", + "operationId": "rewrite_result_desktop_v1_access_rewrite_result_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/RewriteResult" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews/{review_id}/export": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Prepare Export", + "operationId": "prepare_export_desktop_v1_access_reviews__review_id__export_post", + "parameters": [ + { + "name": "review_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Review 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/access/exports/{artifact_id}/complete": { + "post": { + "tags": [ + "native-access" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExportReceipt" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/suite/state": { + "get": { + "tags": [ + "native-records-snapshot" + ], + "summary": "Suite State", + "operationId": "suite_state_desktop_v1_suite_state_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/suite/search": { + "post": { + "tags": [ + "native-records-snapshot" + ], + "summary": "Search", + "operationId": "search_desktop_v1_suite_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/SearchInput" + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "records", + "identity": "Townlight Records 1.8.0.dev2", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/records.html b/docs/beta-1/api/records.html new file mode 100644 index 0000000..5bba24d --- /dev/null +++ b/docs/beta-1/api/records.html @@ -0,0 +1,19623 @@ +Townlight Records API reference
Townlight

Townlight Records API reference

+

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

+

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

+

HTTP operations

+
GET /admin/coverage-gaps +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Get Coverage Gaps",
+  "description": "Identify coverage gaps across jurisdictions, departments, and exemption categories.\n\nReturns:\n- Jurisdictions (state codes) that have no exemption rules\n- Departments with no assigned staff users\n- Exemption categories without any active rules",
+  "operationId": "get_coverage_gaps_admin_coverage_gaps_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/CoverageGapResponse"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /admin/fee-schedules +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "List Fee Schedules",
+  "description": "List all fee schedules. Admin only.",
+  "operationId": "list_fee_schedules_admin_fee_schedules_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "jurisdiction",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Jurisdiction"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/FeeScheduleRead"
+            },
+            "title": "Response List Fee Schedules Admin Fee Schedules Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /admin/fee-schedules +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Create Fee Schedule",
+  "description": "Create a new fee schedule. Admin only.",
+  "operationId": "create_fee_schedule_admin_fee_schedules_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeScheduleCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeScheduleRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /admin/fee-schedules/{schedule_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Update Fee Schedule",
+  "description": "Update a fee schedule. Admin only.",
+  "operationId": "update_fee_schedule_admin_fee_schedules__schedule_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "schedule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Schedule Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeScheduleUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeScheduleRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /admin/fee-schedules/{schedule_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Delete Fee Schedule",
+  "description": "Delete a fee schedule. Admin only.",
+  "operationId": "delete_fee_schedule_admin_fee_schedules__schedule_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "schedule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Schedule Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /admin/models +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "List Models",
+  "operationId": "list_models_admin_models_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/OllamaStatus"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /admin/models/registry +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "List Model Registry",
+  "operationId": "list_model_registry_admin_models_registry_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/ModelRegistryRead"
+            },
+            "type": "array",
+            "title": "Response List Model Registry Admin Models Registry Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /admin/models/registry +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Register Model",
+  "operationId": "register_model_admin_models_registry_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ModelRegistryCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ModelRegistryRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /admin/models/registry/{model_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Update Model Registry",
+  "operationId": "update_model_registry_admin_models_registry__model_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "model_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "integer",
+        "title": "Model Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ModelRegistryUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ModelRegistryRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /admin/models/registry/{model_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Delete Model Registry",
+  "operationId": "delete_model_registry_admin_models_registry__model_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "model_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "integer",
+        "title": "Model Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /admin/status +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "System Status",
+  "operationId": "system_status_admin_status_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/SystemStatus"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /admin/users +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "List Users",
+  "description": "List all users. Admin only.",
+  "operationId": "list_users_admin_users_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/UserRead"
+            },
+            "type": "array",
+            "title": "Response List Users Admin Users Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /admin/users +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Create User",
+  "description": "Create a new user. Admin only.",
+  "operationId": "create_user_admin_users_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/AdminUserCreateRequest"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/AdminUserCreateResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /admin/users/{user_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Update User",
+  "description": "Update user fields. Admin only.\n\nGuards against self-demotion: admins cannot change their own role.",
+  "operationId": "update_user_admin_users__user_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "user_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "User Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/UserUpdateRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/AdminUserCreateResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /analytics/operational +
{
+  "tags": [
+    "analytics"
+  ],
+  "summary": "Get Operational Metrics",
+  "operationId": "get_operational_metrics_analytics_operational_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/OperationalMetrics"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /audit/export +
{
+  "tags": [
+    "audit"
+  ],
+  "summary": "Export Audit Logs",
+  "operationId": "export_audit_logs_audit_export_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "format",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "default": "json",
+        "title": "Format"
+      }
+    },
+    {
+      "name": "start_date",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Start Date"
+      }
+    },
+    {
+      "name": "end_date",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "End Date"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /audit/logs +
{
+  "tags": [
+    "audit"
+  ],
+  "summary": "List Audit Logs",
+  "operationId": "list_audit_logs_audit_logs_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "action",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Action"
+      }
+    },
+    {
+      "name": "resource_type",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Resource Type"
+      }
+    },
+    {
+      "name": "user_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "User Id"
+      }
+    },
+    {
+      "name": "start_date",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Start Date"
+      }
+    },
+    {
+      "name": "end_date",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "End Date"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 200,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/AuditLogRead"
+            },
+            "title": "Response List Audit Logs Audit Logs Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /audit/verify +
{
+  "tags": [
+    "audit"
+  ],
+  "summary": "Verify Audit Chain",
+  "operationId": "verify_audit_chain_audit_verify_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/AuditChainVerification"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /auth/jwt/login +
{
+  "tags": [
+    "auth"
+  ],
+  "summary": "Auth:Jwt.Login",
+  "operationId": "auth_jwt_login_auth_jwt_login_post",
+  "requestBody": {
+    "content": {
+      "application/x-www-form-urlencoded": {
+        "schema": {
+          "$ref": "#/components/schemas/Body_auth_jwt_login_auth_jwt_login_post"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/BearerResponse"
+          },
+          "example": {
+            "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOTIyMWZmYzktNjQwZi00MzcyLTg2ZDMtY2U2NDJjYmE1NjAzIiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTcxNTA0MTkzfQ.M10bjOe45I5Ncu_uXvOmVV8QxnL-nZfcH96U90JaocI",
+            "token_type": "bearer"
+          }
+        }
+      }
+    },
+    "400": {
+      "description": "Bad Request",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ErrorModel"
+          },
+          "examples": {
+            "LOGIN_BAD_CREDENTIALS": {
+              "summary": "Bad credentials or the user is inactive.",
+              "value": {
+                "detail": "LOGIN_BAD_CREDENTIALS"
+              }
+            },
+            "LOGIN_USER_NOT_VERIFIED": {
+              "summary": "The user is not verified.",
+              "value": {
+                "detail": "LOGIN_USER_NOT_VERIFIED"
+              }
+            }
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /auth/jwt/logout +
{
+  "tags": [
+    "auth"
+  ],
+  "summary": "Auth:Jwt.Logout",
+  "operationId": "auth_jwt_logout_auth_jwt_logout_post",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /catalog/connectors +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Connectors",
+  "operationId": "list_connectors_catalog_connectors_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "domain",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Domain"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /catalog/domains +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Domains",
+  "operationId": "list_domains_catalog_domains_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /catalog/load +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "Trigger Catalog Load",
+  "operationId": "trigger_catalog_load_catalog_load_post",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /catalog/systems +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Systems",
+  "operationId": "list_systems_catalog_systems_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "domain",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Domain"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Get City Profile",
+  "operationId": "get_city_profile_city_profile_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "anyOf": [
+              {
+                "$ref": "#/components/schemas/CityProfileRead"
+              },
+              {
+                "type": "null"
+              }
+            ],
+            "title": "Response Get City Profile City Profile Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Create City Profile",
+  "operationId": "create_city_profile_city_profile_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/CityProfileCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/CityProfileRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Update City Profile",
+  "operationId": "update_city_profile_city_profile_patch",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/CityProfileUpdate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/CityProfileRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /config/portal-mode +
{
+  "tags": [
+    "public"
+  ],
+  "summary": "Get the deployment's current portal posture.",
+  "operationId": "get_portal_mode_config_portal_mode_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/PortalModeResponse"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /datasources/ +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "List Datasources",
+  "operationId": "list_datasources_datasources__get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/DataSourceRead"
+            },
+            "type": "array",
+            "title": "Response List Datasources Datasources  Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /datasources/ +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Create Datasource",
+  "operationId": "create_datasource_datasources__post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DataSourceCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DataSourceAdminRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /datasources/documents/{document_id}/re-ingest +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Re Ingest Document",
+  "description": "Re-ingest a failed document. Resets status to pending and queues for processing.",
+  "operationId": "re_ingest_document_datasources_documents__document_id__re_ingest_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "document_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Document Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /datasources/stats +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Ingestion Stats",
+  "operationId": "ingestion_stats_datasources_stats_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/IngestionStats"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /datasources/test-connection +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Test Connection",
+  "description": "Test connectivity to a data source without persisting anything.\n\nThis endpoint validates the connection parameters and attempts a test\nconnection. Credentials are NOT persisted, NOT logged, and NOT returned.",
+  "operationId": "test_connection_datasources_test_connection_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/TestConnectionRequest"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/TestConnectionResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /datasources/upload +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Upload File",
+  "operationId": "upload_file_datasources_upload_post",
+  "requestBody": {
+    "content": {
+      "multipart/form-data": {
+        "schema": {
+          "$ref": "#/components/schemas/Body_upload_file_datasources_upload_post"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /datasources/{source_id} +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Update Datasource",
+  "operationId": "update_datasource_datasources__source_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DataSourceUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DataSourceAdminRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/ingest +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Trigger Ingestion",
+  "operationId": "trigger_ingestion_datasources__source_id__ingest_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /datasources/{source_id}/sync-failures +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "List Sync Failures",
+  "operationId": "list_sync_failures_datasources__source_id__sync_failures_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "description": "Filter by status",
+        "title": "Status"
+      },
+      "description": "Filter by status"
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 500,
+        "minimum": 1,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "minimum": 0,
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SyncFailureRead"
+            },
+            "title": "Response List Sync Failures Datasources  Source Id  Sync Failures Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/sync-failures/dismiss-all +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Dismiss All Sync Failures",
+  "operationId": "dismiss_all_sync_failures_datasources__source_id__sync_failures_dismiss_all_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "description": "Status to dismiss — required",
+        "title": "Status"
+      },
+      "description": "Status to dismiss — required"
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/sync-failures/retry-all +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Retry All Sync Failures",
+  "operationId": "retry_all_sync_failures_datasources__source_id__sync_failures_retry_all_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "description": "Status to reset — required",
+        "title": "Status"
+      },
+      "description": "Status to reset — required"
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/sync-failures/{failure_id}/dismiss +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Dismiss Sync Failure",
+  "operationId": "dismiss_sync_failure_datasources__source_id__sync_failures__failure_id__dismiss_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "failure_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Failure Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/sync-failures/{failure_id}/retry +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Retry Sync Failure",
+  "operationId": "retry_sync_failure_datasources__source_id__sync_failures__failure_id__retry_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "failure_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Failure Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /datasources/{source_id}/sync-run-log +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Get Sync Run Log",
+  "operationId": "get_sync_run_log_datasources__source_id__sync_run_log_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 100,
+        "minimum": 1,
+        "default": 20,
+        "title": "Limit"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SyncRunLogRead"
+            },
+            "title": "Response Get Sync Run Log Datasources  Source Id  Sync Run Log Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/unpause +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Unpause Source",
+  "operationId": "unpause_source_datasources__source_id__unpause_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /departments/ +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "List Departments",
+  "operationId": "list_departments_departments__get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/DepartmentRead"
+            },
+            "type": "array",
+            "title": "Response List Departments Departments  Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /departments/ +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Create Department",
+  "operationId": "create_department_departments__post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DepartmentCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Get Department",
+  "operationId": "get_department_departments__dept_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Update Department",
+  "operationId": "update_department_departments__dept_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DepartmentUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Delete Department",
+  "operationId": "delete_department_departments__dept_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/exports/{artifact_id}/complete +
{
+  "tags": [
+    "native-access"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExportReceipt"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/review-context +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Review Context",
+  "operationId": "review_context_desktop_v1_access_review_context_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/ReviewInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/reviews +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Save Review",
+  "operationId": "save_review_desktop_v1_access_reviews_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/SaveReview"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/reviews/{review_id}/delete +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Delete Review",
+  "operationId": "delete_review_desktop_v1_access_reviews__review_id__delete_post",
+  "parameters": [
+    {
+      "name": "review_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Review 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 /desktop/v1/access/reviews/{review_id}/export +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Prepare Export",
+  "operationId": "prepare_export_desktop_v1_access_reviews__review_id__export_post",
+  "parameters": [
+    {
+      "name": "review_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Review 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 /desktop/v1/access/rewrite-context +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Rewrite Context",
+  "operationId": "rewrite_context_desktop_v1_access_rewrite_context_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/RewriteInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/rewrite-result +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Rewrite Result",
+  "operationId": "rewrite_result_desktop_v1_access_rewrite_result_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/RewriteResult"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/access/state +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Access State",
+  "operationId": "access_state_desktop_v1_access_state_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 /desktop/v1/access/tools +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Tool",
+  "operationId": "tool_desktop_v1_access_tools_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": {
+          "oneOf": [
+            {
+              "$ref": "#/components/schemas/FormPlan"
+            },
+            {
+              "$ref": "#/components/schemas/PublishingPlan"
+            },
+            {
+              "$ref": "#/components/schemas/AdaPlan"
+            },
+            {
+              "$ref": "#/components/schemas/TaggedPlan"
+            }
+          ],
+          "discriminator": {
+            "propertyName": "action",
+            "mapping": {
+              "form-plan": "#/components/schemas/FormPlan",
+              "publishing-workflow": "#/components/schemas/PublishingPlan",
+              "ada-title-ii": "#/components/schemas/AdaPlan",
+              "tagged-pdf": "#/components/schemas/TaggedPlan"
+            }
+          },
+          "title": "Data"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Code Sources",
+  "operationId": "search_code_sources_desktop_v1_code_sources_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/CodeSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Inspections Sources",
+  "operationId": "search_inspections_sources_desktop_v1_inspections_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Meetings Sources",
+  "operationId": "search_meetings_sources_desktop_v1_meetings_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notifications/{notification_id}/sent +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Mark Native Notification Sent",
+  "operationId": "mark_native_notification_sent_desktop_v1_notifications__notification_id__sent_post",
+  "parameters": [
+    {
+      "name": "notification_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notification 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": {
+            "$ref": "#/components/schemas/RecordsStateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Permitting Sources",
+  "operationId": "search_permitting_sources_desktop_v1_permitting_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Planning Sources",
+  "operationId": "search_planning_sources_desktop_v1_planning_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/public/lookup +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Public Records Lookup",
+  "operationId": "public_records_lookup_desktop_v1_public_lookup_post",
+  "parameters": [
+    {
+      "name": "X-Townlight-Public",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Public"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/PublicLookup"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/public/messages +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Public Records Message",
+  "operationId": "public_records_message_desktop_v1_public_messages_post",
+  "parameters": [
+    {
+      "name": "X-Townlight-Public",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Public"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/PublicMessage"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/public/records-state +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Public Records State",
+  "operationId": "public_records_state_desktop_v1_public_records_state_get",
+  "parameters": [
+    {
+      "name": "X-Townlight-Public",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Public"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsStateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/public/requests +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Public Records Intake",
+  "operationId": "public_records_intake_desktop_v1_public_requests_post",
+  "parameters": [
+    {
+      "name": "X-Townlight-Public",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Public"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/PublicIntake"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/records-state +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Get Native Records State",
+  "operationId": "get_native_records_state_desktop_v1_records_state_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": {
+            "$ref": "#/components/schemas/RecordsStateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Create Native Request",
+  "operationId": "create_native_request_desktop_v1_requests_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/StaffRecordsIntake"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/NativeRequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/requests/{request_id} +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Get Native Request",
+  "operationId": "get_native_request_desktop_v1_requests__request_id__get",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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": {
+            "$ref": "#/components/schemas/NativeRequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/actions +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Native Request Operation",
+  "operationId": "native_request_operation_desktop_v1_requests__request_id__actions_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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": {
+          "oneOf": [
+            {
+              "$ref": "#/components/schemas/AssignCommand"
+            },
+            {
+              "$ref": "#/components/schemas/DeadlineCommand"
+            },
+            {
+              "$ref": "#/components/schemas/CalculateDeadlineCommand"
+            },
+            {
+              "$ref": "#/components/schemas/ClarificationCommand"
+            },
+            {
+              "$ref": "#/components/schemas/MessageCommand"
+            },
+            {
+              "$ref": "#/components/schemas/SearchNoteCommand"
+            },
+            {
+              "$ref": "#/components/schemas/SearchReceiptCommand"
+            },
+            {
+              "$ref": "#/components/schemas/ExemptionNoteCommand"
+            },
+            {
+              "$ref": "#/components/schemas/ExemptionDecisionCommand"
+            },
+            {
+              "$ref": "#/components/schemas/FeeEstimateCommand"
+            },
+            {
+              "$ref": "#/components/schemas/FeeLineCommand"
+            },
+            {
+              "$ref": "#/components/schemas/FeeWaiverCommand"
+            },
+            {
+              "$ref": "#/components/schemas/DraftCommand"
+            },
+            {
+              "$ref": "#/components/schemas/ApprovalCommand"
+            },
+            {
+              "$ref": "#/components/schemas/FinishCommand"
+            }
+          ],
+          "discriminator": {
+            "propertyName": "action",
+            "mapping": {
+              "assign-records-request": "#/components/schemas/AssignCommand",
+              "set-records-deadline": "#/components/schemas/DeadlineCommand",
+              "calculate-records-deadline": "#/components/schemas/CalculateDeadlineCommand",
+              "request-records-clarification": "#/components/schemas/ClarificationCommand",
+              "add-records-message": "#/components/schemas/MessageCommand",
+              "record-records-search": "#/components/schemas/SearchNoteCommand",
+              "record-records-search-session": "#/components/schemas/SearchReceiptCommand",
+              "add-records-exemption-review": "#/components/schemas/ExemptionNoteCommand",
+              "add-records-exemption-decision": "#/components/schemas/ExemptionDecisionCommand",
+              "estimate-records-fee": "#/components/schemas/FeeEstimateCommand",
+              "add-records-fee-line": "#/components/schemas/FeeLineCommand",
+              "waive-records-fee": "#/components/schemas/FeeWaiverCommand",
+              "draft-records-response": "#/components/schemas/DraftCommand",
+              "approve-records-response": "#/components/schemas/ApprovalCommand",
+              "fulfill-records-request": "#/components/schemas/FinishCommand",
+              "close-records-request": "#/components/schemas/FinishCommand"
+            }
+          },
+          "title": "Command"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/artifacts +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Prepare Native Artifact",
+  "operationId": "prepare_native_artifact_desktop_v1_requests__request_id__artifacts_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/PrepareArtifact"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ArtifactPlan"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/artifacts/{artifact_id}/complete +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Complete Native Artifact",
+  "operationId": "complete_native_artifact_desktop_v1_requests__request_id__artifacts__artifact_id__complete_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "artifact_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Artifact 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/CompleteArtifact"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/code-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Code Source",
+  "operationId": "attach_code_source_desktop_v1_requests__request_id__code_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/CodeSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/documents +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Native Document",
+  "operationId": "attach_native_document_desktop_v1_requests__request_id__documents_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/AttachDocument"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/documents/{attachment_id}/release-copy +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Native Release Copy",
+  "operationId": "attach_native_release_copy_desktop_v1_requests__request_id__documents__attachment_id__release_copy_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "attachment_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Attachment 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/AttachReleaseCopy"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/requests/{request_id}/draft-context +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Native Draft Context",
+  "operationId": "native_draft_context_desktop_v1_requests__request_id__draft_context_get",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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 /desktop/v1/requests/{request_id}/generated-draft +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Native Generated Draft",
+  "operationId": "native_generated_draft_desktop_v1_requests__request_id__generated_draft_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/GeneratedDraft"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/inspections-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Inspections Source",
+  "operationId": "attach_inspections_source_desktop_v1_requests__request_id__inspections_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/meetings-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Meetings Source",
+  "operationId": "attach_meetings_source_desktop_v1_requests__request_id__meetings_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/permitting-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Permitting Source",
+  "operationId": "attach_permitting_source_desktop_v1_requests__request_id__permitting_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/planning-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Planning Source",
+  "operationId": "attach_planning_source_desktop_v1_requests__request_id__planning_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/station-recordings +
{
+  "tags": [
+    "native-desktop",
+    "station-integration"
+  ],
+  "summary": "Attach",
+  "operationId": "attach_desktop_v1_requests__request_id__station_recordings_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/Selection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/requests/{request_id}/view +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Get Native Request View",
+  "operationId": "get_native_request_view_desktop_v1_requests__request_id__view_get",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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": {
+            "$ref": "#/components/schemas/RecordsView"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/zoning-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Zoning Source",
+  "operationId": "attach_zoning_source_desktop_v1_requests__request_id__zoning_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/station/context +
{
+  "tags": [
+    "native-desktop",
+    "station-integration"
+  ],
+  "summary": "Context",
+  "operationId": "context_desktop_v1_station_context_get",
+  "parameters": [
+    {
+      "name": "capability",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "enum": [
+          "capture",
+          "read"
+        ],
+        "type": "string",
+        "title": "Capability"
+      }
+    },
+    {
+      "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 /desktop/v1/suite/search +
{
+  "tags": [
+    "native-records-snapshot"
+  ],
+  "summary": "Search",
+  "operationId": "search_desktop_v1_suite_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/SearchInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/suite/state +
{
+  "tags": [
+    "native-records-snapshot"
+  ],
+  "summary": "Suite State",
+  "operationId": "suite_state_desktop_v1_suite_state_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 /desktop/v1/zoning-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Zoning Sources",
+  "operationId": "search_zoning_sources_desktop_v1_zoning_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /documents/ +
{
+  "tags": [
+    "documents"
+  ],
+  "summary": "List Documents",
+  "operationId": "list_documents_documents__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "$ref": "#/components/schemas/IngestionStatus"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Status"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 500,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/DocumentRead"
+            },
+            "title": "Response List Documents Documents  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /documents/{document_id} +
{
+  "tags": [
+    "documents"
+  ],
+  "summary": "Get Document",
+  "operationId": "get_document_documents__document_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "document_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Document Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DocumentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /documents/{document_id}/chunks +
{
+  "tags": [
+    "documents"
+  ],
+  "summary": "List Chunks",
+  "operationId": "list_chunks_documents__document_id__chunks_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "document_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Document Id"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 500,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/DocumentChunkRead"
+            },
+            "title": "Response List Chunks Documents  Document Id  Chunks Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/dashboard +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Exemption Dashboard",
+  "operationId": "exemption_dashboard_exemptions_dashboard_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ExemptionDashboard"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /exemptions/dashboard/accuracy +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Exemption Accuracy",
+  "description": "Acceptance/rejection rates by category, optionally filtered by department.",
+  "operationId": "exemption_accuracy_exemptions_dashboard_accuracy_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "department_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Department Id"
+      }
+    },
+    {
+      "name": "date_from",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Date From"
+      }
+    },
+    {
+      "name": "date_to",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Date To"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ExemptionAccuracyReport"
+            },
+            "title": "Response Exemption Accuracy Exemptions Dashboard Accuracy Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/dashboard/export +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Export Flag Data",
+  "description": "Export exemption flag data as JSON or CSV.",
+  "operationId": "export_flag_data_exemptions_dashboard_export_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "format",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "default": "json",
+        "title": "Format"
+      }
+    },
+    {
+      "name": "date_from",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Date From"
+      }
+    },
+    {
+      "name": "date_to",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Date To"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /exemptions/flags/{flag_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Review Flag",
+  "operationId": "review_flag_exemptions_flags__flag_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "flag_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Flag Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExemptionFlagReview"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ExemptionFlagRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/flags/{request_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "List Flags",
+  "operationId": "list_flags_exemptions_flags__request_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "$ref": "#/components/schemas/FlagStatus"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Status"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ExemptionFlagRead"
+            },
+            "title": "Response List Flags Exemptions Flags  Request Id  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /exemptions/rules/ +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Create Rule",
+  "operationId": "create_rule_exemptions_rules__post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExemptionRuleCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ExemptionRuleRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/rules/ +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "List Rules",
+  "operationId": "list_rules_exemptions_rules__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "state_code",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "State Code"
+      }
+    },
+    {
+      "name": "enabled",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "boolean"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Enabled"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ExemptionRuleRead"
+            },
+            "title": "Response List Rules Exemptions Rules  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /exemptions/rules/{rule_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Update Rule",
+  "operationId": "update_rule_exemptions_rules__rule_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "rule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Rule Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExemptionRuleUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ExemptionRuleRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/rules/{rule_id}/history +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Get Rule History",
+  "description": "Get audit history for an exemption rule.",
+  "operationId": "get_rule_history_exemptions_rules__rule_id__history_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "rule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Rule Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /exemptions/rules/{rule_id}/test +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Test Rule",
+  "description": "Test a rule against sample text. Returns match results.\n\nUses the `regex` library with timeout=2s to prevent ReDoS on\nadmin-entered patterns.",
+  "operationId": "test_rule_exemptions_rules__rule_id__test_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "rule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Rule Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/RuleTestRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RuleTestResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /exemptions/scan/{request_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Scan For Exemptions",
+  "description": "Scan all documents attached to a request for exemptions.",
+  "operationId": "scan_for_exemptions_exemptions_scan__request_id__post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "state_code",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "pattern": "^[A-Z]{2}$",
+        "default": "CO",
+        "title": "State Code"
+      }
+    },
+    {
+      "name": "use_llm",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "boolean",
+        "default": false,
+        "title": "Use Llm"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/templates/ +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "List Templates",
+  "operationId": "list_templates_exemptions_templates__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "template_type",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Template Type"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/DisclosureTemplateRead"
+            },
+            "title": "Response List Templates Exemptions Templates  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /exemptions/templates/ +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Create Template",
+  "operationId": "create_template_exemptions_templates__post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DisclosureTemplateCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DisclosureTemplateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PUT /exemptions/templates/{template_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Update Template",
+  "operationId": "update_template_exemptions_templates__template_id__put",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "template_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Template Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DisclosureTemplateUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DisclosureTemplateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/templates/{template_id}/render +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Render Template",
+  "description": "Render a template with city profile variables substituted.",
+  "operationId": "render_template_exemptions_templates__template_id__render_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "template_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Template Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DisclosureTemplateRendered"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /health +
{
+  "summary": "Health",
+  "operationId": "health_health_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  }
+}
+
GET /notifications/log +
{
+  "tags": [
+    "notifications"
+  ],
+  "summary": "List Notification Log",
+  "description": "List recent notification log entries.",
+  "operationId": "list_notification_log_notifications_log_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 200,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "request_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/NotificationLogRead"
+            },
+            "title": "Response List Notification Log Notifications Log Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /notifications/templates +
{
+  "tags": [
+    "notifications"
+  ],
+  "summary": "List Templates",
+  "description": "List all notification templates.",
+  "operationId": "list_templates_notifications_templates_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/NotificationTemplateRead"
+            },
+            "type": "array",
+            "title": "Response List Templates Notifications Templates Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /notifications/templates +
{
+  "tags": [
+    "notifications"
+  ],
+  "summary": "Create Template",
+  "description": "Create a new notification template (admin only).",
+  "operationId": "create_template_notifications_templates_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/NotificationTemplateCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/NotificationTemplateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /notifications/templates/{template_id} +
{
+  "tags": [
+    "notifications"
+  ],
+  "summary": "Update Template",
+  "description": "Update a notification template (admin only).",
+  "operationId": "update_template_notifications_templates__template_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "template_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Template Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/NotificationTemplateUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/NotificationTemplateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /onboarding/interview +
{
+  "tags": [
+    "onboarding"
+  ],
+  "summary": "Get Next Question",
+  "description": "Generate the next onboarding question and persist the last answer.",
+  "operationId": "get_next_question_onboarding_interview_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/InterviewRequest"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/InterviewResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /requests/ +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Create Request",
+  "operationId": "create_request_requests__post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/RequestCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/ +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "List Requests",
+  "operationId": "list_requests_requests__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "status",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "$ref": "#/components/schemas/RequestStatus"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Status"
+      }
+    },
+    {
+      "name": "assigned_to",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Assigned To"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/RequestRead"
+            },
+            "title": "Response List Requests Requests  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/stats +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Request Stats",
+  "operationId": "request_stats_requests_stats_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestStats"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /requests/{request_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Request",
+  "operationId": "get_request_requests__request_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /requests/{request_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Update Request",
+  "operationId": "update_request_requests__request_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/RequestUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/approve +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Approve Request",
+  "operationId": "approve_request_requests__request_id__approve_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/documents +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Attach Document",
+  "operationId": "attach_document_requests__request_id__documents_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/RequestDocumentAdd"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestDocumentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/documents +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "List Attached Documents",
+  "operationId": "list_attached_documents_requests__request_id__documents_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/RequestDocumentRead"
+            },
+            "title": "Response List Attached Documents Requests  Request Id  Documents Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /requests/{request_id}/documents/{doc_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Remove Document",
+  "operationId": "remove_document_requests__request_id__documents__doc_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "doc_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Doc Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/estimate-fees +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Estimate Fees",
+  "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": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeEstimateRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeEstimateResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/fee-waiver +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Create Fee Waiver",
+  "description": "Request a fee waiver for this records request.",
+  "operationId": "create_fee_waiver_requests__request_id__fee_waiver_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeWaiverCreateRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeWaiverReadResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /requests/{request_id}/fee-waiver/{waiver_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Review Fee Waiver",
+  "description": "Approve or deny a fee waiver. Reviewer/Admin only.",
+  "operationId": "review_fee_waiver_requests__request_id__fee_waiver__waiver_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "waiver_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Waiver Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeWaiverReviewRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeWaiverReadResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/fees +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Fees",
+  "operationId": "get_fees_requests__request_id__fees_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/FeeLineItemRead"
+            },
+            "title": "Response Get Fees Requests  Request Id  Fees Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/fees +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Add Fee",
+  "operationId": "add_fee_requests__request_id__fees_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeLineItemCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeLineItemRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/messages +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Messages",
+  "operationId": "get_messages_requests__request_id__messages_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/MessageRead"
+            },
+            "title": "Response Get Messages Requests  Request Id  Messages Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/messages +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Add Message",
+  "operationId": "add_message_requests__request_id__messages_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/MessageCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/MessageRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/ready-for-release +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Mark Ready For Release",
+  "operationId": "mark_ready_for_release_requests__request_id__ready_for_release_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/reject +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Reject Request",
+  "operationId": "reject_request_requests__request_id__reject_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "reason",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "default": "",
+        "title": "Reason"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/response-letter +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Generate Response Letter",
+  "description": "Generate a draft response letter for a records request.\n\nAttempts LLM generation via Ollama first; falls back to a structured\ntemplate if the LLM is unavailable.",
+  "operationId": "generate_response_letter_requests__request_id__response_letter_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "anyOf": [
+            {
+              "$ref": "#/components/schemas/ResponseLetterCreate"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "title": "Data"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ResponseLetterRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/response-letter +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Response Letter",
+  "description": "Get the latest response letter for a request.",
+  "operationId": "get_response_letter_requests__request_id__response_letter_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ResponseLetterRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /requests/{request_id}/response-letter/{letter_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Update Response Letter",
+  "description": "Update a response letter's edited content or status.\n\nStatus changes to 'approved' require REVIEWER role.",
+  "operationId": "update_response_letter_requests__request_id__response_letter__letter_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "letter_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Letter Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ResponseLetterUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ResponseLetterRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/submit-review +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Submit For Review",
+  "operationId": "submit_for_review_requests__request_id__submit_review_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/timeline +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Timeline",
+  "operationId": "get_timeline_requests__request_id__timeline_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/TimelineEventRead"
+            },
+            "title": "Response Get Timeline Requests  Request Id  Timeline Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/timeline +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Add Timeline Event",
+  "operationId": "add_timeline_event_requests__request_id__timeline_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/TimelineEventCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/TimelineEventRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /search/export +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "Export Search Results",
+  "description": "Export search results as CSV. Runs a search and streams the results.",
+  "operationId": "export_search_results_search_export_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "query",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Query"
+      }
+    },
+    {
+      "name": "format",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "default": "csv",
+        "title": "Format"
+      }
+    },
+    {
+      "name": "department_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Department Id"
+      }
+    },
+    {
+      "name": "file_type",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "File Type"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /search/filters +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "Get Filter Options",
+  "description": "Get available filter values for search.",
+  "operationId": "get_filter_options_search_filters_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/SearchFilterOptions"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /search/query +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "Execute Search",
+  "description": "Execute a hybrid search query. Optionally synthesize an LLM answer.",
+  "operationId": "execute_search_search_query_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/SearchRequest"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/SearchResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /search/sessions +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "List Sessions",
+  "description": "List the current user's search sessions.",
+  "operationId": "list_sessions_search_sessions_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 20,
+        "title": "Limit"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SearchSessionRead"
+            },
+            "title": "Response List Sessions Search Sessions Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /search/sessions/{session_id} +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "Get Session",
+  "description": "Get a search session with its query history.",
+  "operationId": "get_session_search_sessions__session_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "session_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Session Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/SearchSessionRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /service-accounts/ +
{
+  "tags": [
+    "service-accounts"
+  ],
+  "summary": "List Service Accounts",
+  "operationId": "list_service_accounts_service_accounts__get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/ServiceAccountRead"
+            },
+            "type": "array",
+            "title": "Response List Service Accounts Service Accounts  Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /service-accounts/ +
{
+  "tags": [
+    "service-accounts"
+  ],
+  "summary": "Create Service Account",
+  "operationId": "create_service_account_service_accounts__post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ServiceAccountCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ServiceAccountCreated"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /service-accounts/{account_id} +
{
+  "tags": [
+    "service-accounts"
+  ],
+  "summary": "Update Service Account",
+  "operationId": "update_service_account_service_accounts__account_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "account_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Account Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ServiceAccountUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ServiceAccountRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /users/me +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:Current User",
+  "operationId": "users_current_user_users_me_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/UserRead"
+          }
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /users/me +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:Patch Current User",
+  "operationId": "users_patch_current_user_users_me_patch",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/UserSelfUpdate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/UserRead"
+          }
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    },
+    "400": {
+      "description": "Bad Request",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ErrorModel"
+          },
+          "examples": {
+            "UPDATE_USER_EMAIL_ALREADY_EXISTS": {
+              "summary": "A user with this email already exists.",
+              "value": {
+                "detail": "UPDATE_USER_EMAIL_ALREADY_EXISTS"
+              }
+            },
+            "UPDATE_USER_INVALID_PASSWORD": {
+              "summary": "Password validation failed.",
+              "value": {
+                "detail": {
+                  "code": "UPDATE_USER_INVALID_PASSWORD",
+                  "reason": "Password should beat least 3 characters"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /users/{id} +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:User",
+  "operationId": "users_user_users__id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/UserRead"
+          }
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    },
+    "403": {
+      "description": "Not a superuser."
+    },
+    "404": {
+      "description": "The user does not exist."
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /users/{id} +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:Patch User",
+  "operationId": "users_patch_user_users__id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/UserSelfUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/UserRead"
+          }
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    },
+    "403": {
+      "description": "Not a superuser."
+    },
+    "404": {
+      "description": "The user does not exist."
+    },
+    "400": {
+      "content": {
+        "application/json": {
+          "examples": {
+            "UPDATE_USER_EMAIL_ALREADY_EXISTS": {
+              "summary": "A user with this email already exists.",
+              "value": {
+                "detail": "UPDATE_USER_EMAIL_ALREADY_EXISTS"
+              }
+            },
+            "UPDATE_USER_INVALID_PASSWORD": {
+              "summary": "Password validation failed.",
+              "value": {
+                "detail": {
+                  "code": "UPDATE_USER_INVALID_PASSWORD",
+                  "reason": "Password should beat least 3 characters"
+                }
+              }
+            }
+          },
+          "schema": {
+            "$ref": "#/components/schemas/ErrorModel"
+          }
+        }
+      },
+      "description": "Bad Request"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /users/{id} +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:Delete User",
+  "operationId": "users_delete_user_users__id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    },
+    "403": {
+      "description": "Not a superuser."
+    },
+    "404": {
+      "description": "The user does not exist."
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/station-openapi.json b/docs/beta-1/api/station-openapi.json new file mode 100644 index 0000000..7b72341 --- /dev/null +++ b/docs/beta-1/api/station-openapi.json @@ -0,0 +1,11180 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/station/context": { + "get": { + "tags": [ + "native-desktop", + "station-integration" + ], + "summary": "Context", + "operationId": "context_desktop_v1_station_context_get", + "parameters": [ + { + "name": "capability", + "in": "query", + "required": true, + "schema": { + "enum": [ + "capture", + "read" + ], + "type": "string", + "title": "Capability" + } + }, + { + "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/requests/{request_id}/station-recordings": { + "post": { + "tags": [ + "native-desktop", + "station-integration" + ], + "summary": "Attach", + "operationId": "attach_desktop_v1_requests__request_id__station_recordings_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/Selection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/station/catalog": { + "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", + "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" + } + } + } + } + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "station", + "identity": "Townlight Station 0.3.0", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/station.html b/docs/beta-1/api/station.html new file mode 100644 index 0000000..1d46cc3 --- /dev/null +++ b/docs/beta-1/api/station.html @@ -0,0 +1,11667 @@ +Townlight Station API reference
Townlight

Townlight Station API reference

+

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

+

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

+

HTTP operations

+
GET /desktop/v1/meetings/station/catalog +
{
+  "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",
+      "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 /desktop/v1/requests/{request_id}/station-recordings +
{
+  "tags": [
+    "native-desktop",
+    "station-integration"
+  ],
+  "summary": "Attach",
+  "operationId": "attach_desktop_v1_requests__request_id__station_recordings_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/Selection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/station/context +
{
+  "tags": [
+    "native-desktop",
+    "station-integration"
+  ],
+  "summary": "Context",
+  "operationId": "context_desktop_v1_station_context_get",
+  "parameters": [
+    {
+      "name": "capability",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "enum": [
+          "capture",
+          "read"
+        ],
+        "type": "string",
+        "title": "Capability"
+      }
+    },
+    {
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
+

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.

Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/suite-openapi.json b/docs/beta-1/api/suite-openapi.json new file mode 100644 index 0000000..b7ebbe2 --- /dev/null +++ b/docs/beta-1/api/suite-openapi.json @@ -0,0 +1,27254 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/auth/jwt/login": { + "post": { + "tags": [ + "auth" + ], + "summary": "Auth:Jwt.Login", + "operationId": "auth_jwt_login_auth_jwt_login_post", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Body_auth_jwt_login_auth_jwt_login_post" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BearerResponse" + }, + "example": { + "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOTIyMWZmYzktNjQwZi00MzcyLTg2ZDMtY2U2NDJjYmE1NjAzIiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTcxNTA0MTkzfQ.M10bjOe45I5Ncu_uXvOmVV8QxnL-nZfcH96U90JaocI", + "token_type": "bearer" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "LOGIN_BAD_CREDENTIALS": { + "summary": "Bad credentials or the user is inactive.", + "value": { + "detail": "LOGIN_BAD_CREDENTIALS" + } + }, + "LOGIN_USER_NOT_VERIFIED": { + "summary": "The user is not verified.", + "value": { + "detail": "LOGIN_USER_NOT_VERIFIED" + } + } + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/auth/jwt/logout": { + "post": { + "tags": [ + "auth" + ], + "summary": "Auth:Jwt.Logout", + "operationId": "auth_jwt_logout_auth_jwt_logout_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "401": { + "description": "Missing token or inactive user." + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/users/me": { + "get": { + "tags": [ + "users" + ], + "summary": "Users:Current User", + "operationId": "users_current_user_users_me_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRead" + } + } + } + }, + "401": { + "description": "Missing token or inactive user." + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "patch": { + "tags": [ + "users" + ], + "summary": "Users:Patch Current User", + "operationId": "users_patch_current_user_users_me_patch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserSelfUpdate" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRead" + } + } + } + }, + "401": { + "description": "Missing token or inactive user." + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorModel" + }, + "examples": { + "UPDATE_USER_EMAIL_ALREADY_EXISTS": { + "summary": "A user with this email already exists.", + "value": { + "detail": "UPDATE_USER_EMAIL_ALREADY_EXISTS" + } + }, + "UPDATE_USER_INVALID_PASSWORD": { + "summary": "Password validation failed.", + "value": { + "detail": { + "code": "UPDATE_USER_INVALID_PASSWORD", + "reason": "Password should beat least 3 characters" + } + } + } + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/users/{id}": { + "get": { + "tags": [ + "users" + ], + "summary": "Users:User", + "operationId": "users_user_users__id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRead" + } + } + } + }, + "401": { + "description": "Missing token or inactive user." + }, + "403": { + "description": "Not a superuser." + }, + "404": { + "description": "The user does not exist." + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "users" + ], + "summary": "Users:Patch User", + "operationId": "users_patch_user_users__id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserSelfUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRead" + } + } + } + }, + "401": { + "description": "Missing token or inactive user." + }, + "403": { + "description": "Not a superuser." + }, + "404": { + "description": "The user does not exist." + }, + "400": { + "content": { + "application/json": { + "examples": { + "UPDATE_USER_EMAIL_ALREADY_EXISTS": { + "summary": "A user with this email already exists.", + "value": { + "detail": "UPDATE_USER_EMAIL_ALREADY_EXISTS" + } + }, + "UPDATE_USER_INVALID_PASSWORD": { + "summary": "Password validation failed.", + "value": { + "detail": { + "code": "UPDATE_USER_INVALID_PASSWORD", + "reason": "Password should beat least 3 characters" + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/ErrorModel" + } + } + }, + "description": "Bad Request" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "users" + ], + "summary": "Users:Delete User", + "operationId": "users_delete_user_users__id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "401": { + "description": "Missing token or inactive user." + }, + "403": { + "description": "Not a superuser." + }, + "404": { + "description": "The user does not exist." + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/config/portal-mode": { + "get": { + "tags": [ + "public" + ], + "summary": "Get the deployment's current portal posture.", + "operationId": "get_portal_mode_config_portal_mode_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PortalModeResponse" + } + } + } + } + } + } + }, + "/audit/logs": { + "get": { + "tags": [ + "audit" + ], + "summary": "List Audit Logs", + "operationId": "list_audit_logs_audit_logs_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "action", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Action" + } + }, + { + "name": "resource_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Resource Type" + } + }, + { + "name": "user_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "User Id" + } + }, + { + "name": "start_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Start Date" + } + }, + { + "name": "end_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "End Date" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 200, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AuditLogRead" + }, + "title": "Response List Audit Logs Audit Logs Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/audit/verify": { + "get": { + "tags": [ + "audit" + ], + "summary": "Verify Audit Chain", + "operationId": "verify_audit_chain_audit_verify_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuditChainVerification" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/audit/export": { + "get": { + "tags": [ + "audit" + ], + "summary": "Export Audit Logs", + "operationId": "export_audit_logs_audit_export_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "json", + "title": "Format" + } + }, + { + "name": "start_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Start Date" + } + }, + { + "name": "end_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "End Date" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/service-accounts/": { + "get": { + "tags": [ + "service-accounts" + ], + "summary": "List Service Accounts", + "operationId": "list_service_accounts_service_accounts__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ServiceAccountRead" + }, + "type": "array", + "title": "Response List Service Accounts Service Accounts Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "service-accounts" + ], + "summary": "Create Service Account", + "operationId": "create_service_account_service_accounts__post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountCreated" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/service-accounts/{account_id}": { + "patch": { + "tags": [ + "service-accounts" + ], + "summary": "Update Service Account", + "operationId": "update_service_account_service_accounts__account_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "account_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Account Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/status": { + "get": { + "tags": [ + "admin" + ], + "summary": "System Status", + "operationId": "system_status_admin_status_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SystemStatus" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/admin/users": { + "get": { + "tags": [ + "admin" + ], + "summary": "List Users", + "description": "List all users. Admin only.", + "operationId": "list_users_admin_users_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/UserRead" + }, + "type": "array", + "title": "Response List Users Admin Users Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "admin" + ], + "summary": "Create User", + "description": "Create a new user. Admin only.", + "operationId": "create_user_admin_users_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminUserCreateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminUserCreateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/admin/users/{user_id}": { + "patch": { + "tags": [ + "admin" + ], + "summary": "Update User", + "description": "Update user fields. Admin only.\n\nGuards against self-demotion: admins cannot change their own role.", + "operationId": "update_user_admin_users__user_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "User Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminUserCreateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/models": { + "get": { + "tags": [ + "admin" + ], + "summary": "List Models", + "operationId": "list_models_admin_models_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OllamaStatus" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/admin/models/registry": { + "get": { + "tags": [ + "admin" + ], + "summary": "List Model Registry", + "operationId": "list_model_registry_admin_models_registry_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ModelRegistryRead" + }, + "type": "array", + "title": "Response List Model Registry Admin Models Registry Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "admin" + ], + "summary": "Register Model", + "operationId": "register_model_admin_models_registry_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelRegistryCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelRegistryRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/admin/models/registry/{model_id}": { + "patch": { + "tags": [ + "admin" + ], + "summary": "Update Model Registry", + "operationId": "update_model_registry_admin_models_registry__model_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "model_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Model Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelRegistryUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelRegistryRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "admin" + ], + "summary": "Delete Model Registry", + "operationId": "delete_model_registry_admin_models_registry__model_id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "model_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Model Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/fee-schedules": { + "get": { + "tags": [ + "admin" + ], + "summary": "List Fee Schedules", + "description": "List all fee schedules. Admin only.", + "operationId": "list_fee_schedules_admin_fee_schedules_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "jurisdiction", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Jurisdiction" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeeScheduleRead" + }, + "title": "Response List Fee Schedules Admin Fee Schedules Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "admin" + ], + "summary": "Create Fee Schedule", + "description": "Create a new fee schedule. Admin only.", + "operationId": "create_fee_schedule_admin_fee_schedules_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeScheduleCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeScheduleRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/fee-schedules/{schedule_id}": { + "patch": { + "tags": [ + "admin" + ], + "summary": "Update Fee Schedule", + "description": "Update a fee schedule. Admin only.", + "operationId": "update_fee_schedule_admin_fee_schedules__schedule_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "schedule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Schedule Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeScheduleUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeScheduleRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "admin" + ], + "summary": "Delete Fee Schedule", + "description": "Delete a fee schedule. Admin only.", + "operationId": "delete_fee_schedule_admin_fee_schedules__schedule_id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "schedule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Schedule Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/coverage-gaps": { + "get": { + "tags": [ + "admin" + ], + "summary": "Get Coverage Gaps", + "description": "Identify coverage gaps across jurisdictions, departments, and exemption categories.\n\nReturns:\n- Jurisdictions (state codes) that have no exemption rules\n- Departments with no assigned staff users\n- Exemption categories without any active rules", + "operationId": "get_coverage_gaps_admin_coverage_gaps_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CoverageGapResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/datasources/": { + "get": { + "tags": [ + "datasources" + ], + "summary": "List Datasources", + "operationId": "list_datasources_datasources__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/DataSourceRead" + }, + "type": "array", + "title": "Response List Datasources Datasources Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "datasources" + ], + "summary": "Create Datasource", + "operationId": "create_datasource_datasources__post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataSourceCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataSourceAdminRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/datasources/{source_id}": { + "patch": { + "tags": [ + "datasources" + ], + "summary": "Update Datasource", + "operationId": "update_datasource_datasources__source_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataSourceUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataSourceAdminRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/ingest": { + "post": { + "tags": [ + "datasources" + ], + "summary": "Trigger Ingestion", + "operationId": "trigger_ingestion_datasources__source_id__ingest_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/upload": { + "post": { + "tags": [ + "datasources" + ], + "summary": "Upload File", + "operationId": "upload_file_datasources_upload_post", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_file_datasources_upload_post" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/datasources/documents/{document_id}/re-ingest": { + "post": { + "tags": [ + "datasources" + ], + "summary": "Re Ingest Document", + "description": "Re-ingest a failed document. Resets status to pending and queues for processing.", + "operationId": "re_ingest_document_datasources_documents__document_id__re_ingest_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Document Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/stats": { + "get": { + "tags": [ + "datasources" + ], + "summary": "Ingestion Stats", + "operationId": "ingestion_stats_datasources_stats_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IngestionStats" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/datasources/test-connection": { + "post": { + "tags": [ + "datasources" + ], + "summary": "Test Connection", + "description": "Test connectivity to a data source without persisting anything.\n\nThis endpoint validates the connection parameters and attempts a test\nconnection. Credentials are NOT persisted, NOT logged, and NOT returned.", + "operationId": "test_connection_datasources_test_connection_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestConnectionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestConnectionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/documents/": { + "get": { + "tags": [ + "documents" + ], + "summary": "List Documents", + "operationId": "list_documents_documents__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Source Id" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/IngestionStatus" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 500, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DocumentRead" + }, + "title": "Response List Documents Documents Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/documents/{document_id}": { + "get": { + "tags": [ + "documents" + ], + "summary": "Get Document", + "operationId": "get_document_documents__document_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Document Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DocumentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/documents/{document_id}/chunks": { + "get": { + "tags": [ + "documents" + ], + "summary": "List Chunks", + "operationId": "list_chunks_documents__document_id__chunks_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "document_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Document Id" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 500, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DocumentChunkRead" + }, + "title": "Response List Chunks Documents Document Id Chunks Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures": { + "get": { + "tags": [ + "sync-failures" + ], + "summary": "List Sync Failures", + "operationId": "list_sync_failures_datasources__source_id__sync_failures_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Filter by status", + "title": "Status" + }, + "description": "Filter by status" + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 500, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SyncFailureRead" + }, + "title": "Response List Sync Failures Datasources Source Id Sync Failures Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures/{failure_id}/retry": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Retry Sync Failure", + "operationId": "retry_sync_failure_datasources__source_id__sync_failures__failure_id__retry_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "failure_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Failure Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures/{failure_id}/dismiss": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Dismiss Sync Failure", + "operationId": "dismiss_sync_failure_datasources__source_id__sync_failures__failure_id__dismiss_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "failure_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Failure Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures/retry-all": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Retry All Sync Failures", + "operationId": "retry_all_sync_failures_datasources__source_id__sync_failures_retry_all_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "status", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Status to reset — required", + "title": "Status" + }, + "description": "Status to reset — required" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-failures/dismiss-all": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Dismiss All Sync Failures", + "operationId": "dismiss_all_sync_failures_datasources__source_id__sync_failures_dismiss_all_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "status", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Status to dismiss — required", + "title": "Status" + }, + "description": "Status to dismiss — required" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/unpause": { + "post": { + "tags": [ + "sync-failures" + ], + "summary": "Unpause Source", + "operationId": "unpause_source_datasources__source_id__unpause_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/datasources/{source_id}/sync-run-log": { + "get": { + "tags": [ + "sync-failures" + ], + "summary": "Get Sync Run Log", + "operationId": "get_sync_run_log_datasources__source_id__sync_run_log_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "source_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Source Id" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 20, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SyncRunLogRead" + }, + "title": "Response Get Sync Run Log Datasources Source Id Sync Run Log Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/search/query": { + "post": { + "tags": [ + "search" + ], + "summary": "Execute Search", + "description": "Execute a hybrid search query. Optionally synthesize an LLM answer.", + "operationId": "execute_search_search_query_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/search/sessions": { + "get": { + "tags": [ + "search" + ], + "summary": "List Sessions", + "description": "List the current user's search sessions.", + "operationId": "list_sessions_search_sessions_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 20, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchSessionRead" + }, + "title": "Response List Sessions Search Sessions Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/search/sessions/{session_id}": { + "get": { + "tags": [ + "search" + ], + "summary": "Get Session", + "description": "Get a search session with its query history.", + "operationId": "get_session_search_sessions__session_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "session_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Session Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchSessionRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/search/filters": { + "get": { + "tags": [ + "search" + ], + "summary": "Get Filter Options", + "description": "Get available filter values for search.", + "operationId": "get_filter_options_search_filters_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchFilterOptions" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/search/export": { + "get": { + "tags": [ + "search" + ], + "summary": "Export Search Results", + "description": "Export search results as CSV. Runs a search and streams the results.", + "operationId": "export_search_results_search_export_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Query" + } + }, + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "csv", + "title": "Format" + } + }, + { + "name": "department_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Department Id" + } + }, + { + "name": "file_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Type" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/": { + "post": { + "tags": [ + "requests" + ], + "summary": "Create Request", + "operationId": "create_request_requests__post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "requests" + ], + "summary": "List Requests", + "operationId": "list_requests_requests__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/RequestStatus" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + { + "name": "assigned_to", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Assigned To" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RequestRead" + }, + "title": "Response List Requests Requests Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/stats": { + "get": { + "tags": [ + "requests" + ], + "summary": "Request Stats", + "operationId": "request_stats_requests_stats_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestStats" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/requests/{request_id}": { + "get": { + "tags": [ + "requests" + ], + "summary": "Get Request", + "operationId": "get_request_requests__request_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "requests" + ], + "summary": "Update Request", + "operationId": "update_request_requests__request_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/documents": { + "post": { + "tags": [ + "requests" + ], + "summary": "Attach Document", + "operationId": "attach_document_requests__request_id__documents_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestDocumentAdd" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestDocumentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "requests" + ], + "summary": "List Attached Documents", + "operationId": "list_attached_documents_requests__request_id__documents_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RequestDocumentRead" + }, + "title": "Response List Attached Documents Requests Request Id Documents Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/documents/{doc_id}": { + "delete": { + "tags": [ + "requests" + ], + "summary": "Remove Document", + "operationId": "remove_document_requests__request_id__documents__doc_id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "doc_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Doc Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/submit-review": { + "post": { + "tags": [ + "requests" + ], + "summary": "Submit For Review", + "operationId": "submit_for_review_requests__request_id__submit_review_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/ready-for-release": { + "post": { + "tags": [ + "requests" + ], + "summary": "Mark Ready For Release", + "operationId": "mark_ready_for_release_requests__request_id__ready_for_release_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/approve": { + "post": { + "tags": [ + "requests" + ], + "summary": "Approve Request", + "operationId": "approve_request_requests__request_id__approve_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/reject": { + "post": { + "tags": [ + "requests" + ], + "summary": "Reject Request", + "operationId": "reject_request_requests__request_id__reject_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "reason", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "", + "title": "Reason" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/timeline": { + "get": { + "tags": [ + "requests" + ], + "summary": "Get Timeline", + "operationId": "get_timeline_requests__request_id__timeline_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TimelineEventRead" + }, + "title": "Response Get Timeline Requests Request Id Timeline Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "requests" + ], + "summary": "Add Timeline Event", + "operationId": "add_timeline_event_requests__request_id__timeline_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimelineEventCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimelineEventRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/messages": { + "get": { + "tags": [ + "requests" + ], + "summary": "Get Messages", + "operationId": "get_messages_requests__request_id__messages_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageRead" + }, + "title": "Response Get Messages Requests Request Id Messages Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "requests" + ], + "summary": "Add Message", + "operationId": "add_message_requests__request_id__messages_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MessageCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MessageRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/fees": { + "get": { + "tags": [ + "requests" + ], + "summary": "Get Fees", + "operationId": "get_fees_requests__request_id__fees_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeeLineItemRead" + }, + "title": "Response Get Fees Requests Request Id Fees Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "requests" + ], + "summary": "Add Fee", + "operationId": "add_fee_requests__request_id__fees_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeLineItemCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeLineItemRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/estimate-fees": { + "post": { + "tags": [ + "requests" + ], + "summary": "Estimate Fees", + "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": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeEstimateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeEstimateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/fee-waiver": { + "post": { + "tags": [ + "requests" + ], + "summary": "Create Fee Waiver", + "description": "Request a fee waiver for this records request.", + "operationId": "create_fee_waiver_requests__request_id__fee_waiver_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeWaiverCreateRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeWaiverReadResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/fee-waiver/{waiver_id}": { + "patch": { + "tags": [ + "requests" + ], + "summary": "Review Fee Waiver", + "description": "Approve or deny a fee waiver. Reviewer/Admin only.", + "operationId": "review_fee_waiver_requests__request_id__fee_waiver__waiver_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "waiver_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Waiver Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeWaiverReviewRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeeWaiverReadResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/response-letter": { + "post": { + "tags": [ + "requests" + ], + "summary": "Generate Response Letter", + "description": "Generate a draft response letter for a records request.\n\nAttempts LLM generation via Ollama first; falls back to a structured\ntemplate if the LLM is unavailable.", + "operationId": "generate_response_letter_requests__request_id__response_letter_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ResponseLetterCreate" + }, + { + "type": "null" + } + ], + "title": "Data" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLetterRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "requests" + ], + "summary": "Get Response Letter", + "description": "Get the latest response letter for a request.", + "operationId": "get_response_letter_requests__request_id__response_letter_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLetterRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/requests/{request_id}/response-letter/{letter_id}": { + "patch": { + "tags": [ + "requests" + ], + "summary": "Update Response Letter", + "description": "Update a response letter's edited content or status.\n\nStatus changes to 'approved' require REVIEWER role.", + "operationId": "update_response_letter_requests__request_id__response_letter__letter_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "letter_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Letter Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLetterUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLetterRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/rules/": { + "post": { + "tags": [ + "exemptions" + ], + "summary": "Create Rule", + "operationId": "create_rule_exemptions_rules__post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionRuleCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionRuleRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "exemptions" + ], + "summary": "List Rules", + "operationId": "list_rules_exemptions_rules__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "state_code", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State Code" + } + }, + { + "name": "enabled", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enabled" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExemptionRuleRead" + }, + "title": "Response List Rules Exemptions Rules Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/rules/{rule_id}": { + "patch": { + "tags": [ + "exemptions" + ], + "summary": "Update Rule", + "operationId": "update_rule_exemptions_rules__rule_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "rule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Rule Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionRuleUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionRuleRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/rules/{rule_id}/history": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Get Rule History", + "description": "Get audit history for an exemption rule.", + "operationId": "get_rule_history_exemptions_rules__rule_id__history_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "rule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Rule Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/rules/{rule_id}/test": { + "post": { + "tags": [ + "exemptions" + ], + "summary": "Test Rule", + "description": "Test a rule against sample text. Returns match results.\n\nUses the `regex` library with timeout=2s to prevent ReDoS on\nadmin-entered patterns.", + "operationId": "test_rule_exemptions_rules__rule_id__test_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "rule_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Rule Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleTestRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RuleTestResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/scan/{request_id}": { + "post": { + "tags": [ + "exemptions" + ], + "summary": "Scan For Exemptions", + "description": "Scan all documents attached to a request for exemptions.", + "operationId": "scan_for_exemptions_exemptions_scan__request_id__post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "state_code", + "in": "query", + "required": false, + "schema": { + "type": "string", + "pattern": "^[A-Z]{2}$", + "default": "CO", + "title": "State Code" + } + }, + { + "name": "use_llm", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "title": "Use Llm" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/flags/{request_id}": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "List Flags", + "operationId": "list_flags_exemptions_flags__request_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/FlagStatus" + }, + { + "type": "null" + } + ], + "title": "Status" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExemptionFlagRead" + }, + "title": "Response List Flags Exemptions Flags Request Id Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/flags/{flag_id}": { + "patch": { + "tags": [ + "exemptions" + ], + "summary": "Review Flag", + "operationId": "review_flag_exemptions_flags__flag_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "flag_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Flag Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionFlagReview" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionFlagRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/dashboard/accuracy": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Exemption Accuracy", + "description": "Acceptance/rejection rates by category, optionally filtered by department.", + "operationId": "exemption_accuracy_exemptions_dashboard_accuracy_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "department_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Department Id" + } + }, + { + "name": "date_from", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date From" + } + }, + { + "name": "date_to", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date To" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExemptionAccuracyReport" + }, + "title": "Response Exemption Accuracy Exemptions Dashboard Accuracy Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/dashboard/export": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Export Flag Data", + "description": "Export exemption flag data as JSON or CSV.", + "operationId": "export_flag_data_exemptions_dashboard_export_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "json", + "title": "Format" + } + }, + { + "name": "date_from", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date From" + } + }, + { + "name": "date_to", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date To" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/dashboard": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Exemption Dashboard", + "operationId": "exemption_dashboard_exemptions_dashboard_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExemptionDashboard" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/exemptions/templates/": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "List Templates", + "operationId": "list_templates_exemptions_templates__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "template_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Template Type" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DisclosureTemplateRead" + }, + "title": "Response List Templates Exemptions Templates Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "exemptions" + ], + "summary": "Create Template", + "operationId": "create_template_exemptions_templates__post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/templates/{template_id}/render": { + "get": { + "tags": [ + "exemptions" + ], + "summary": "Render Template", + "description": "Render a template with city profile variables substituted.", + "operationId": "render_template_exemptions_templates__template_id__render_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "template_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Template Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateRendered" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/exemptions/templates/{template_id}": { + "put": { + "tags": [ + "exemptions" + ], + "summary": "Update Template", + "operationId": "update_template_exemptions_templates__template_id__put", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "template_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Template Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisclosureTemplateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/analytics/operational": { + "get": { + "tags": [ + "analytics" + ], + "summary": "Get Operational Metrics", + "operationId": "get_operational_metrics_analytics_operational_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OperationalMetrics" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/city-profile": { + "get": { + "tags": [ + "city-profile" + ], + "summary": "Get City Profile", + "operationId": "get_city_profile_city_profile_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/CityProfileRead" + }, + { + "type": "null" + } + ], + "title": "Response Get City Profile City Profile Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "city-profile" + ], + "summary": "Create City Profile", + "operationId": "create_city_profile_city_profile_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CityProfileCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CityProfileRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "patch": { + "tags": [ + "city-profile" + ], + "summary": "Update City Profile", + "operationId": "update_city_profile_city_profile_patch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CityProfileUpdate" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CityProfileRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/onboarding/interview": { + "post": { + "tags": [ + "onboarding" + ], + "summary": "Get Next Question", + "description": "Generate the next onboarding question and persist the last answer.", + "operationId": "get_next_question_onboarding_interview_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InterviewRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InterviewResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/catalog/domains": { + "get": { + "tags": [ + "catalog" + ], + "summary": "List Domains", + "operationId": "list_domains_catalog_domains_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/catalog/systems": { + "get": { + "tags": [ + "catalog" + ], + "summary": "List Systems", + "operationId": "list_systems_catalog_systems_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "domain", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Domain" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/catalog/connectors": { + "get": { + "tags": [ + "catalog" + ], + "summary": "List Connectors", + "operationId": "list_connectors_catalog_connectors_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "domain", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Domain" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/catalog/load": { + "post": { + "tags": [ + "catalog" + ], + "summary": "Trigger Catalog Load", + "operationId": "trigger_catalog_load_catalog_load_post", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/notifications/templates": { + "get": { + "tags": [ + "notifications" + ], + "summary": "List Templates", + "description": "List all notification templates.", + "operationId": "list_templates_notifications_templates_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/NotificationTemplateRead" + }, + "type": "array", + "title": "Response List Templates Notifications Templates Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "notifications" + ], + "summary": "Create Template", + "description": "Create a new notification template (admin only).", + "operationId": "create_template_notifications_templates_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/notifications/templates/{template_id}": { + "patch": { + "tags": [ + "notifications" + ], + "summary": "Update Template", + "description": "Update a notification template (admin only).", + "operationId": "update_template_notifications_templates__template_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "template_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Template Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationTemplateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/notifications/log": { + "get": { + "tags": [ + "notifications" + ], + "summary": "List Notification Log", + "description": "List recent notification log entries.", + "operationId": "list_notification_log_notifications_log_get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 200, + "default": 50, + "title": "Limit" + } + }, + { + "name": "request_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Request Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationLogRead" + }, + "title": "Response List Notification Log Notifications Log Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/departments/": { + "get": { + "tags": [ + "departments" + ], + "summary": "List Departments", + "operationId": "list_departments_departments__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/DepartmentRead" + }, + "type": "array", + "title": "Response List Departments Departments Get" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + }, + "post": { + "tags": [ + "departments" + ], + "summary": "Create Department", + "operationId": "create_department_departments__post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/departments/{dept_id}": { + "get": { + "tags": [ + "departments" + ], + "summary": "Get Department", + "operationId": "get_department_departments__dept_id__get", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "dept_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Dept Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "departments" + ], + "summary": "Update Department", + "operationId": "update_department_departments__dept_id__patch", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "dept_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Dept Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DepartmentRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "departments" + ], + "summary": "Delete Department", + "operationId": "delete_department_departments__dept_id__delete", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "dept_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Dept Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/station/context": { + "get": { + "tags": [ + "native-desktop", + "station-integration" + ], + "summary": "Context", + "operationId": "context_desktop_v1_station_context_get", + "parameters": [ + { + "name": "capability", + "in": "query", + "required": true, + "schema": { + "enum": [ + "capture", + "read" + ], + "type": "string", + "title": "Capability" + } + }, + { + "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/requests/{request_id}/station-recordings": { + "post": { + "tags": [ + "native-desktop", + "station-integration" + ], + "summary": "Attach", + "operationId": "attach_desktop_v1_requests__request_id__station_recordings_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/Selection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/public/records-state": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Public Records State", + "operationId": "public_records_state_desktop_v1_public_records_state_get", + "parameters": [ + { + "name": "X-Townlight-Public", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Public" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsStateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/public/requests": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Public Records Intake", + "operationId": "public_records_intake_desktop_v1_public_requests_post", + "parameters": [ + { + "name": "X-Townlight-Public", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Public" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicIntake" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/public/lookup": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Public Records Lookup", + "operationId": "public_records_lookup_desktop_v1_public_lookup_post", + "parameters": [ + { + "name": "X-Townlight-Public", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Public" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicLookup" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/public/messages": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Public Records Message", + "operationId": "public_records_message_desktop_v1_public_messages_post", + "parameters": [ + { + "name": "X-Townlight-Public", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Public" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicMessage" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/permitting-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Permitting Sources", + "operationId": "search_permitting_sources_desktop_v1_permitting_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/permitting-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Permitting Source", + "operationId": "attach_permitting_source_desktop_v1_requests__request_id__permitting_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Inspections Sources", + "operationId": "search_inspections_sources_desktop_v1_inspections_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/inspections-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Inspections Source", + "operationId": "attach_inspections_source_desktop_v1_requests__request_id__inspections_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Planning Sources", + "operationId": "search_planning_sources_desktop_v1_planning_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/planning-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Planning Source", + "operationId": "attach_planning_source_desktop_v1_requests__request_id__planning_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Zoning Sources", + "operationId": "search_zoning_sources_desktop_v1_zoning_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/zoning-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Zoning Source", + "operationId": "attach_zoning_source_desktop_v1_requests__request_id__zoning_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/records-state": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Get Native Records State", + "operationId": "get_native_records_state_desktop_v1_records_state_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": { + "$ref": "#/components/schemas/RecordsStateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Meetings Sources", + "operationId": "search_meetings_sources_desktop_v1_meetings_sources_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/MeetingsSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/meetings-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Meetings Source", + "operationId": "attach_meetings_source_desktop_v1_requests__request_id__meetings_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/MeetingsSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/code-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Code Sources", + "operationId": "search_code_sources_desktop_v1_code_sources_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/CodeSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/code-sources": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Code Source", + "operationId": "attach_code_source_desktop_v1_requests__request_id__code_sources_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/CodeSourceSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notifications/{notification_id}/sent": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Mark Native Notification Sent", + "operationId": "mark_native_notification_sent_desktop_v1_notifications__notification_id__sent_post", + "parameters": [ + { + "name": "notification_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notification 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": { + "$ref": "#/components/schemas/RecordsStateRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/documents": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Native Document", + "operationId": "attach_native_document_desktop_v1_requests__request_id__documents_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/AttachDocument" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/documents/{attachment_id}/release-copy": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Attach Native Release Copy", + "operationId": "attach_native_release_copy_desktop_v1_requests__request_id__documents__attachment_id__release_copy_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "attachment_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Attachment 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/AttachReleaseCopy" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/artifacts": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Prepare Native Artifact", + "operationId": "prepare_native_artifact_desktop_v1_requests__request_id__artifacts_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/PrepareArtifact" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArtifactPlan" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/artifacts/{artifact_id}/complete": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Complete Native Artifact", + "operationId": "complete_native_artifact_desktop_v1_requests__request_id__artifacts__artifact_id__complete_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request Id" + } + }, + { + "name": "artifact_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Artifact 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/CompleteArtifact" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Create Native Request", + "operationId": "create_native_request_desktop_v1_requests_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/StaffRecordsIntake" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NativeRequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Get Native Request", + "operationId": "get_native_request_desktop_v1_requests__request_id__get", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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": { + "$ref": "#/components/schemas/NativeRequestRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/view": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Get Native Request View", + "operationId": "get_native_request_view_desktop_v1_requests__request_id__view_get", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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": { + "$ref": "#/components/schemas/RecordsView" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/draft-context": { + "get": { + "tags": [ + "native-desktop" + ], + "summary": "Native Draft Context", + "operationId": "native_draft_context_desktop_v1_requests__request_id__draft_context_get", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/requests/{request_id}/generated-draft": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Native Generated Draft", + "operationId": "native_generated_draft_desktop_v1_requests__request_id__generated_draft_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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/GeneratedDraft" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/requests/{request_id}/actions": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Native Request Operation", + "operationId": "native_request_operation_desktop_v1_requests__request_id__actions_post", + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Request 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": { + "oneOf": [ + { + "$ref": "#/components/schemas/AssignCommand" + }, + { + "$ref": "#/components/schemas/DeadlineCommand" + }, + { + "$ref": "#/components/schemas/CalculateDeadlineCommand" + }, + { + "$ref": "#/components/schemas/ClarificationCommand" + }, + { + "$ref": "#/components/schemas/MessageCommand" + }, + { + "$ref": "#/components/schemas/SearchNoteCommand" + }, + { + "$ref": "#/components/schemas/SearchReceiptCommand" + }, + { + "$ref": "#/components/schemas/ExemptionNoteCommand" + }, + { + "$ref": "#/components/schemas/ExemptionDecisionCommand" + }, + { + "$ref": "#/components/schemas/FeeEstimateCommand" + }, + { + "$ref": "#/components/schemas/FeeLineCommand" + }, + { + "$ref": "#/components/schemas/FeeWaiverCommand" + }, + { + "$ref": "#/components/schemas/DraftCommand" + }, + { + "$ref": "#/components/schemas/ApprovalCommand" + }, + { + "$ref": "#/components/schemas/FinishCommand" + } + ], + "discriminator": { + "propertyName": "action", + "mapping": { + "assign-records-request": "#/components/schemas/AssignCommand", + "set-records-deadline": "#/components/schemas/DeadlineCommand", + "calculate-records-deadline": "#/components/schemas/CalculateDeadlineCommand", + "request-records-clarification": "#/components/schemas/ClarificationCommand", + "add-records-message": "#/components/schemas/MessageCommand", + "record-records-search": "#/components/schemas/SearchNoteCommand", + "record-records-search-session": "#/components/schemas/SearchReceiptCommand", + "add-records-exemption-review": "#/components/schemas/ExemptionNoteCommand", + "add-records-exemption-decision": "#/components/schemas/ExemptionDecisionCommand", + "estimate-records-fee": "#/components/schemas/FeeEstimateCommand", + "add-records-fee-line": "#/components/schemas/FeeLineCommand", + "waive-records-fee": "#/components/schemas/FeeWaiverCommand", + "draft-records-response": "#/components/schemas/DraftCommand", + "approve-records-response": "#/components/schemas/ApprovalCommand", + "fulfill-records-request": "#/components/schemas/FinishCommand", + "close-records-request": "#/components/schemas/FinishCommand" + } + }, + "title": "Command" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecordsOperationRead" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/health": { + "get": { + "summary": "Health", + "operationId": "health_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/desktop/v1/access/state": { + "get": { + "tags": [ + "native-access" + ], + "summary": "Access State", + "operationId": "access_state_desktop_v1_access_state_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/access/review-context": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Review Context", + "operationId": "review_context_desktop_v1_access_review_context_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/ReviewInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Save Review", + "operationId": "save_review_desktop_v1_access_reviews_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/SaveReview" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews/{review_id}/delete": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Delete Review", + "operationId": "delete_review_desktop_v1_access_reviews__review_id__delete_post", + "parameters": [ + { + "name": "review_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Review 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/access/tools": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Tool", + "operationId": "tool_desktop_v1_access_tools_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": { + "oneOf": [ + { + "$ref": "#/components/schemas/FormPlan" + }, + { + "$ref": "#/components/schemas/PublishingPlan" + }, + { + "$ref": "#/components/schemas/AdaPlan" + }, + { + "$ref": "#/components/schemas/TaggedPlan" + } + ], + "discriminator": { + "propertyName": "action", + "mapping": { + "form-plan": "#/components/schemas/FormPlan", + "publishing-workflow": "#/components/schemas/PublishingPlan", + "ada-title-ii": "#/components/schemas/AdaPlan", + "tagged-pdf": "#/components/schemas/TaggedPlan" + } + }, + "title": "Data" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/rewrite-context": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Rewrite Context", + "operationId": "rewrite_context_desktop_v1_access_rewrite_context_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/RewriteInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/rewrite-result": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Rewrite Result", + "operationId": "rewrite_result_desktop_v1_access_rewrite_result_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/RewriteResult" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/access/reviews/{review_id}/export": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Prepare Export", + "operationId": "prepare_export_desktop_v1_access_reviews__review_id__export_post", + "parameters": [ + { + "name": "review_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Review 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/access/drafts/{draft_id}/export": { + "post": { + "tags": [ + "native-access" + ], + "summary": "Export Draft", + "operationId": "export_draft_desktop_v1_access_drafts__draft_id__export_post", + "parameters": [ + { + "name": "draft_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Draft 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/access/exports/{artifact_id}/complete": { + "post": { + "tags": [ + "native-access" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExportReceipt" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices": { + "get": { + "tags": [ + "native-notice" + ], + "summary": "Inventory", + "operationId": "inventory_desktop_v1_notice_notices_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": { + "tags": [ + "native-notice" + ], + "summary": "Create", + "operationId": "create_desktop_v1_notice_notices_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/NoticeDraft" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}": { + "get": { + "tags": [ + "native-notice" + ], + "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", + "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/notice/notices/{notice_id}/revisions": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Edit", + "operationId": "edit_desktop_v1_notice_notices__notice_id__revisions_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/Revision" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}/review": { + "post": { + "tags": [ + "native-notice" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/townlight_runtime__notice_bridge__Review" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}/approval": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Approve", + "operationId": "approve_desktop_v1_notice_notices__notice_id__approval_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/Version" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}/proof": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Proof", + "operationId": "proof_desktop_v1_notice_notices__notice_id__proof_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/Proof" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/notices/{notice_id}/archive": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Archive", + "operationId": "archive_desktop_v1_notice_notices__notice_id__archive_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/Version" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/notice/archives/{archive_id}": { + "get": { + "tags": [ + "native-notice" + ], + "summary": "Export", + "operationId": "export_desktop_v1_notice_archives__archive_id__get", + "parameters": [ + { + "name": "archive_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Archive 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/notice/archives/{archive_id}/records": { + "post": { + "tags": [ + "native-notice" + ], + "summary": "Handoff", + "operationId": "handoff_desktop_v1_notice_archives__archive_id__records_post", + "parameters": [ + { + "name": "archive_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Archive 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/Handoff" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/suite/state": { + "get": { + "tags": [ + "native-records-snapshot" + ], + "summary": "Suite State", + "operationId": "suite_state_desktop_v1_suite_state_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/suite/search": { + "post": { + "tags": [ + "native-records-snapshot" + ], + "summary": "Search", + "operationId": "search_desktop_v1_suite_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/SearchInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/stages": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Record Meeting Stage", + "operationId": "record_meeting_stage_desktop_v1_meetings_meetings__meeting_id__stages_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/MeetingStageInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Create Meeting", + "operationId": "create_meeting_desktop_v1_meetings_meetings_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/MeetingInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "Get Meeting", + "operationId": "get_meeting_desktop_v1_meetings_meetings__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/agenda-items": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Create Agenda Item", + "operationId": "create_agenda_item_desktop_v1_meetings_agenda_items_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/AgendaInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/agenda-items/{item_id}": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "Get Agenda Item", + "operationId": "get_agenda_item_desktop_v1_meetings_agenda_items__item_id__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/meetings/agenda-items/{item_id}/reviews": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Record Agenda Review", + "operationId": "record_agenda_review_desktop_v1_meetings_agenda_items__item_id__reviews_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/AgendaReviewInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/agenda-items/{item_id}/meeting": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AgendaAssignment" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/notices/{notice_id}/template": { + "get": { + "tags": [ + "native-meetings" + ], + "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", + "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/notices/{notice_id}/document": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoticeDocumentInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/notice-checks": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoticeInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/notices/{notice_id}/proof": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Record Notice Proof", + "operationId": "record_notice_proof_desktop_v1_meetings_notices__notice_id__proof_post", + "parameters": [ + { + "name": "notice_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Notice 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/NoticeProofInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/transcripts": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Capture Transcript", + "operationId": "capture_transcript_desktop_v1_meetings_meetings__meeting_id__transcripts_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/TranscriptInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/action-items": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Capture Action Item", + "operationId": "capture_action_item_desktop_v1_meetings_meetings__meeting_id__action_items_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/ActionItemInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/archive": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Archive Meeting", + "operationId": "archive_meeting_desktop_v1_meetings_meetings__meeting_id__archive_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/ArchiveInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PacketInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/packets/{packet_id}/deliver": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Export Packet", + "operationId": "export_packet_desktop_v1_meetings_packets__packet_id__deliver_post", + "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/meetings/minutes/{draft_id}/decisions": { + "post": { + "tags": [ + "native-meetings" + ], + "summary": "Decide Minutes", + "operationId": "decide_minutes_desktop_v1_meetings_minutes__draft_id__decisions_post", + "parameters": [ + { + "name": "draft_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "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": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/motions": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MotionInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/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", + "parameters": [ + { + "name": "motion_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Motion 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/MotionCorrection" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/motions/{motion_id}/votes": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VoteInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/votes/{vote_id}/corrections": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VoteCorrection" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts": { + "post": { + "tags": [ + "native-meetings" + ], + "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", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DraftInput" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/meetings/meetings/{meeting_id}/proceedings": { + "get": { + "tags": [ + "native-meetings" + ], + "summary": "Proceedings", + "operationId": "proceedings_desktop_v1_meetings_meetings__meeting_id__proceedings_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/station/catalog": { + "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", + "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" + } + } + } + } + } + } + }, + "/public/meetings": { + "get": { + "tags": [ + "public-meetings" + ], + "summary": "Public Archive Index", + "operationId": "public_archive_index_public_meetings_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" + } + } + } + } + } + } + }, + "/public/meetings/{record_id}": { + "get": { + "tags": [ + "public-meetings" + ], + "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": { + "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" + } + }, + { + "name": "kind", + "in": "path", + "required": true, + "schema": { + "enum": [ + "agenda", + "packet", + "minutes" + ], + "type": "string", + "title": "Kind" + } + } + ], + "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/sources": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Sources", + "operationId": "sources_desktop_v1_code_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/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": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/code/lookup": { + "get": { + "tags": [ + "native-code" + ], + "summary": "Lookup", + "operationId": "lookup_desktop_v1_code_lookup_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", + "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}/history": { + "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", + "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/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", + "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": { + "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": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/outlines": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Create Outline", + "operationId": "create_outline_desktop_v1_zoning_outlines_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/Outline" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/code-context": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Create Code Context", + "operationId": "create_code_context_desktop_v1_zoning_code_context_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/CodeContext" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/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", + "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/StandardsExplanation" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/townlight_zoning/questions": { + "post": { + "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" + } + } + } + } + } + } + }, + "/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" + } + } + }, + "required": true + }, + "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" + } + } + } + } + } + } + }, + "/desktop/v1/planning/sources": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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/sources/{plan_id}/history": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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/revisions/{revision_id}": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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/revisions/{revision_id}/documents/{document_id}": { + "get": { + "tags": [ + "native-planning" + ], + "summary": "Staff Original", + "operationId": "staff_original_desktop_v1_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" + } + }, + { + "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/policies/search": { + "post": { + "tags": [ + "native-planning" + ], + "summary": "Policies", + "operationId": "policies_desktop_v1_planning_policies_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__planning_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/planning/analyses": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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-planning" + ], + "summary": "Create Analysis", + "operationId": "create_analysis_desktop_v1_planning_analyses_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": "Body" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/analyses/{analysis_id}/revisions": { + "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": { + "type": "object", + "additionalProperties": true, + "title": "Body" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/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" + } + }, + { + "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/analyses/{analysis_id}/history": { + "get": { + "tags": [ + "native-planning" + ], + "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", + "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/analyses/{analysis_id}/snapshot-preview": { + "post": { + "tags": [ + "native-planning" + ], + "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", + "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", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/analyses/{analysis_id}/snapshots": { + "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" + } + }, + { + "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", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/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" + } + }, + { + "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", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectionSearch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/planning/progress/targets": { + "get": { + "tags": [ + "native-planning" + ], + "summary": "Municipal Progress", + "operationId": "municipal_progress_desktop_v1_planning_progress_targets_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/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-inspections" + ], + "summary": "Notice", + "operationId": "notice_desktop_v1_inspections_notice_draft_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/InspectionInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/cases": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "Cases", + "operationId": "cases_desktop_v1_inspections_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-inspections" + ], + "summary": "Create Case", + "operationId": "create_case_desktop_v1_inspections_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/InspectionInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/cases/{case_id}": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "Case", + "operationId": "case_desktop_v1_inspections_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/inspections/cases/{case_id}/revisions": { + "post": { + "tags": [ + "native-inspections" + ], + "summary": "Revise", + "operationId": "revise_desktop_v1_inspections_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/InspectionInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/cases/{case_id}/history": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "History", + "operationId": "history_desktop_v1_inspections_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/inspections/cases/{case_id}/packets": { + "post": { + "tags": [ + "native-inspections" + ], + "summary": "Packet", + "operationId": "packet_desktop_v1_inspections_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/inspections/packets/{packet_id}": { + "get": { + "tags": [ + "native-inspections" + ], + "summary": "Document", + "operationId": "document_desktop_v1_inspections_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/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-inspections" + ], + "summary": "Retain", + "operationId": "retain_desktop_v1_inspections_evidence_retain_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/EvidenceItems" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/media/analyse": { + "post": { + "tags": [ + "native-inspections" + ], + "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", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Townlight-Session" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MediaAnalysis" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/inspections/connections/search": { + "post": { + "tags": [ + "native-inspections" + ], + "summary": "Connections", + "operationId": "connections_desktop_v1_inspections_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__inspections_bridge__Search" + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "suite", + "identity": "Desktop source 1.7.0-1; townlight-runtime 0.2.0", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/suite.html b/docs/beta-1/api/suite.html new file mode 100644 index 0000000..7afab04 --- /dev/null +++ b/docs/beta-1/api/suite.html @@ -0,0 +1,27524 @@ +Townlight Suite API reference
Townlight

Townlight Suite API reference

+

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

+

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

+

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

+

Machine-readable OpenAPI schema · Operating manual and limits

+

HTTP operations

+
GET /admin/coverage-gaps +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Get Coverage Gaps",
+  "description": "Identify coverage gaps across jurisdictions, departments, and exemption categories.\n\nReturns:\n- Jurisdictions (state codes) that have no exemption rules\n- Departments with no assigned staff users\n- Exemption categories without any active rules",
+  "operationId": "get_coverage_gaps_admin_coverage_gaps_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/CoverageGapResponse"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /admin/fee-schedules +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "List Fee Schedules",
+  "description": "List all fee schedules. Admin only.",
+  "operationId": "list_fee_schedules_admin_fee_schedules_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "jurisdiction",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Jurisdiction"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/FeeScheduleRead"
+            },
+            "title": "Response List Fee Schedules Admin Fee Schedules Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /admin/fee-schedules +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Create Fee Schedule",
+  "description": "Create a new fee schedule. Admin only.",
+  "operationId": "create_fee_schedule_admin_fee_schedules_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeScheduleCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeScheduleRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /admin/fee-schedules/{schedule_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Update Fee Schedule",
+  "description": "Update a fee schedule. Admin only.",
+  "operationId": "update_fee_schedule_admin_fee_schedules__schedule_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "schedule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Schedule Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeScheduleUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeScheduleRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /admin/fee-schedules/{schedule_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Delete Fee Schedule",
+  "description": "Delete a fee schedule. Admin only.",
+  "operationId": "delete_fee_schedule_admin_fee_schedules__schedule_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "schedule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Schedule Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /admin/models +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "List Models",
+  "operationId": "list_models_admin_models_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/OllamaStatus"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /admin/models/registry +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "List Model Registry",
+  "operationId": "list_model_registry_admin_models_registry_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/ModelRegistryRead"
+            },
+            "type": "array",
+            "title": "Response List Model Registry Admin Models Registry Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /admin/models/registry +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Register Model",
+  "operationId": "register_model_admin_models_registry_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ModelRegistryCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ModelRegistryRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /admin/models/registry/{model_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Update Model Registry",
+  "operationId": "update_model_registry_admin_models_registry__model_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "model_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "integer",
+        "title": "Model Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ModelRegistryUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ModelRegistryRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /admin/models/registry/{model_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Delete Model Registry",
+  "operationId": "delete_model_registry_admin_models_registry__model_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "model_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "integer",
+        "title": "Model Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /admin/status +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "System Status",
+  "operationId": "system_status_admin_status_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/SystemStatus"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /admin/users +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "List Users",
+  "description": "List all users. Admin only.",
+  "operationId": "list_users_admin_users_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/UserRead"
+            },
+            "type": "array",
+            "title": "Response List Users Admin Users Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /admin/users +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Create User",
+  "description": "Create a new user. Admin only.",
+  "operationId": "create_user_admin_users_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/AdminUserCreateRequest"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/AdminUserCreateResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /admin/users/{user_id} +
{
+  "tags": [
+    "admin"
+  ],
+  "summary": "Update User",
+  "description": "Update user fields. Admin only.\n\nGuards against self-demotion: admins cannot change their own role.",
+  "operationId": "update_user_admin_users__user_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "user_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "User Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/UserUpdateRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/AdminUserCreateResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /analytics/operational +
{
+  "tags": [
+    "analytics"
+  ],
+  "summary": "Get Operational Metrics",
+  "operationId": "get_operational_metrics_analytics_operational_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/OperationalMetrics"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /audit/export +
{
+  "tags": [
+    "audit"
+  ],
+  "summary": "Export Audit Logs",
+  "operationId": "export_audit_logs_audit_export_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "format",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "default": "json",
+        "title": "Format"
+      }
+    },
+    {
+      "name": "start_date",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Start Date"
+      }
+    },
+    {
+      "name": "end_date",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "End Date"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /audit/logs +
{
+  "tags": [
+    "audit"
+  ],
+  "summary": "List Audit Logs",
+  "operationId": "list_audit_logs_audit_logs_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "action",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Action"
+      }
+    },
+    {
+      "name": "resource_type",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Resource Type"
+      }
+    },
+    {
+      "name": "user_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "User Id"
+      }
+    },
+    {
+      "name": "start_date",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Start Date"
+      }
+    },
+    {
+      "name": "end_date",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "End Date"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 200,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/AuditLogRead"
+            },
+            "title": "Response List Audit Logs Audit Logs Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /audit/verify +
{
+  "tags": [
+    "audit"
+  ],
+  "summary": "Verify Audit Chain",
+  "operationId": "verify_audit_chain_audit_verify_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/AuditChainVerification"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /auth/jwt/login +
{
+  "tags": [
+    "auth"
+  ],
+  "summary": "Auth:Jwt.Login",
+  "operationId": "auth_jwt_login_auth_jwt_login_post",
+  "requestBody": {
+    "content": {
+      "application/x-www-form-urlencoded": {
+        "schema": {
+          "$ref": "#/components/schemas/Body_auth_jwt_login_auth_jwt_login_post"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/BearerResponse"
+          },
+          "example": {
+            "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOTIyMWZmYzktNjQwZi00MzcyLTg2ZDMtY2U2NDJjYmE1NjAzIiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTcxNTA0MTkzfQ.M10bjOe45I5Ncu_uXvOmVV8QxnL-nZfcH96U90JaocI",
+            "token_type": "bearer"
+          }
+        }
+      }
+    },
+    "400": {
+      "description": "Bad Request",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ErrorModel"
+          },
+          "examples": {
+            "LOGIN_BAD_CREDENTIALS": {
+              "summary": "Bad credentials or the user is inactive.",
+              "value": {
+                "detail": "LOGIN_BAD_CREDENTIALS"
+              }
+            },
+            "LOGIN_USER_NOT_VERIFIED": {
+              "summary": "The user is not verified.",
+              "value": {
+                "detail": "LOGIN_USER_NOT_VERIFIED"
+              }
+            }
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /auth/jwt/logout +
{
+  "tags": [
+    "auth"
+  ],
+  "summary": "Auth:Jwt.Logout",
+  "operationId": "auth_jwt_logout_auth_jwt_logout_post",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /catalog/connectors +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Connectors",
+  "operationId": "list_connectors_catalog_connectors_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "domain",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Domain"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /catalog/domains +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Domains",
+  "operationId": "list_domains_catalog_domains_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /catalog/load +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "Trigger Catalog Load",
+  "operationId": "trigger_catalog_load_catalog_load_post",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /catalog/systems +
{
+  "tags": [
+    "catalog"
+  ],
+  "summary": "List Systems",
+  "operationId": "list_systems_catalog_systems_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "domain",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Domain"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Get City Profile",
+  "operationId": "get_city_profile_city_profile_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "anyOf": [
+              {
+                "$ref": "#/components/schemas/CityProfileRead"
+              },
+              {
+                "type": "null"
+              }
+            ],
+            "title": "Response Get City Profile City Profile Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Create City Profile",
+  "operationId": "create_city_profile_city_profile_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/CityProfileCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/CityProfileRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /city-profile +
{
+  "tags": [
+    "city-profile"
+  ],
+  "summary": "Update City Profile",
+  "operationId": "update_city_profile_city_profile_patch",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/CityProfileUpdate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/CityProfileRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /config/portal-mode +
{
+  "tags": [
+    "public"
+  ],
+  "summary": "Get the deployment's current portal posture.",
+  "operationId": "get_portal_mode_config_portal_mode_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/PortalModeResponse"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /datasources/ +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "List Datasources",
+  "operationId": "list_datasources_datasources__get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/DataSourceRead"
+            },
+            "type": "array",
+            "title": "Response List Datasources Datasources  Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /datasources/ +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Create Datasource",
+  "operationId": "create_datasource_datasources__post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DataSourceCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DataSourceAdminRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /datasources/documents/{document_id}/re-ingest +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Re Ingest Document",
+  "description": "Re-ingest a failed document. Resets status to pending and queues for processing.",
+  "operationId": "re_ingest_document_datasources_documents__document_id__re_ingest_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "document_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Document Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /datasources/stats +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Ingestion Stats",
+  "operationId": "ingestion_stats_datasources_stats_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/IngestionStats"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /datasources/test-connection +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Test Connection",
+  "description": "Test connectivity to a data source without persisting anything.\n\nThis endpoint validates the connection parameters and attempts a test\nconnection. Credentials are NOT persisted, NOT logged, and NOT returned.",
+  "operationId": "test_connection_datasources_test_connection_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/TestConnectionRequest"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/TestConnectionResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /datasources/upload +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Upload File",
+  "operationId": "upload_file_datasources_upload_post",
+  "requestBody": {
+    "content": {
+      "multipart/form-data": {
+        "schema": {
+          "$ref": "#/components/schemas/Body_upload_file_datasources_upload_post"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /datasources/{source_id} +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Update Datasource",
+  "operationId": "update_datasource_datasources__source_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DataSourceUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DataSourceAdminRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/ingest +
{
+  "tags": [
+    "datasources"
+  ],
+  "summary": "Trigger Ingestion",
+  "operationId": "trigger_ingestion_datasources__source_id__ingest_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /datasources/{source_id}/sync-failures +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "List Sync Failures",
+  "operationId": "list_sync_failures_datasources__source_id__sync_failures_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "description": "Filter by status",
+        "title": "Status"
+      },
+      "description": "Filter by status"
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 500,
+        "minimum": 1,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "minimum": 0,
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SyncFailureRead"
+            },
+            "title": "Response List Sync Failures Datasources  Source Id  Sync Failures Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/sync-failures/dismiss-all +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Dismiss All Sync Failures",
+  "operationId": "dismiss_all_sync_failures_datasources__source_id__sync_failures_dismiss_all_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "description": "Status to dismiss — required",
+        "title": "Status"
+      },
+      "description": "Status to dismiss — required"
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/sync-failures/retry-all +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Retry All Sync Failures",
+  "operationId": "retry_all_sync_failures_datasources__source_id__sync_failures_retry_all_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "description": "Status to reset — required",
+        "title": "Status"
+      },
+      "description": "Status to reset — required"
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/sync-failures/{failure_id}/dismiss +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Dismiss Sync Failure",
+  "operationId": "dismiss_sync_failure_datasources__source_id__sync_failures__failure_id__dismiss_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "failure_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Failure Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/sync-failures/{failure_id}/retry +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Retry Sync Failure",
+  "operationId": "retry_sync_failure_datasources__source_id__sync_failures__failure_id__retry_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "failure_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Failure Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /datasources/{source_id}/sync-run-log +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Get Sync Run Log",
+  "operationId": "get_sync_run_log_datasources__source_id__sync_run_log_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 100,
+        "minimum": 1,
+        "default": 20,
+        "title": "Limit"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SyncRunLogRead"
+            },
+            "title": "Response Get Sync Run Log Datasources  Source Id  Sync Run Log Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /datasources/{source_id}/unpause +
{
+  "tags": [
+    "sync-failures"
+  ],
+  "summary": "Unpause Source",
+  "operationId": "unpause_source_datasources__source_id__unpause_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Source Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /departments/ +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "List Departments",
+  "operationId": "list_departments_departments__get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/DepartmentRead"
+            },
+            "type": "array",
+            "title": "Response List Departments Departments  Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /departments/ +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Create Department",
+  "operationId": "create_department_departments__post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DepartmentCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Get Department",
+  "operationId": "get_department_departments__dept_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Update Department",
+  "operationId": "update_department_departments__dept_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DepartmentUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DepartmentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /departments/{dept_id} +
{
+  "tags": [
+    "departments"
+  ],
+  "summary": "Delete Department",
+  "operationId": "delete_department_departments__dept_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "dept_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Dept Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/drafts/{draft_id}/export +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Export Draft",
+  "operationId": "export_draft_desktop_v1_access_drafts__draft_id__export_post",
+  "parameters": [
+    {
+      "name": "draft_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Draft 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 /desktop/v1/access/exports/{artifact_id}/complete +
{
+  "tags": [
+    "native-access"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExportReceipt"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/review-context +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Review Context",
+  "operationId": "review_context_desktop_v1_access_review_context_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/ReviewInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/reviews +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Save Review",
+  "operationId": "save_review_desktop_v1_access_reviews_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/SaveReview"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/reviews/{review_id}/delete +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Delete Review",
+  "operationId": "delete_review_desktop_v1_access_reviews__review_id__delete_post",
+  "parameters": [
+    {
+      "name": "review_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Review 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 /desktop/v1/access/reviews/{review_id}/export +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Prepare Export",
+  "operationId": "prepare_export_desktop_v1_access_reviews__review_id__export_post",
+  "parameters": [
+    {
+      "name": "review_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Review 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 /desktop/v1/access/rewrite-context +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Rewrite Context",
+  "operationId": "rewrite_context_desktop_v1_access_rewrite_context_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/RewriteInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/access/rewrite-result +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Rewrite Result",
+  "operationId": "rewrite_result_desktop_v1_access_rewrite_result_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/RewriteResult"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/access/state +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Access State",
+  "operationId": "access_state_desktop_v1_access_state_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 /desktop/v1/access/tools +
{
+  "tags": [
+    "native-access"
+  ],
+  "summary": "Tool",
+  "operationId": "tool_desktop_v1_access_tools_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": {
+          "oneOf": [
+            {
+              "$ref": "#/components/schemas/FormPlan"
+            },
+            {
+              "$ref": "#/components/schemas/PublishingPlan"
+            },
+            {
+              "$ref": "#/components/schemas/AdaPlan"
+            },
+            {
+              "$ref": "#/components/schemas/TaggedPlan"
+            }
+          ],
+          "discriminator": {
+            "propertyName": "action",
+            "mapping": {
+              "form-plan": "#/components/schemas/FormPlan",
+              "publishing-workflow": "#/components/schemas/PublishingPlan",
+              "ada-title-ii": "#/components/schemas/AdaPlan",
+              "tagged-pdf": "#/components/schemas/TaggedPlan"
+            }
+          },
+          "title": "Data"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Code Sources",
+  "operationId": "search_code_sources_desktop_v1_code_sources_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/CodeSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/citation +
{
+  "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",
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/connections +
{
+  "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 /desktop/v1/code/connections +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/connections/{connection_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code/connections/{connection_id}/closeout +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/export +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code/imports +
{
+  "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 /desktop/v1/code/imports +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/imports/{job_id}/provenance +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/imports/{job_id}/tree +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/lookup +
{
+  "tags": [
+    "native-code"
+  ],
+  "summary": "Lookup",
+  "operationId": "lookup_desktop_v1_code_lookup_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",
+      "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 /desktop/v1/code/questions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/search +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/sections/{section_id}/history +
{
+  "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",
+      "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 /desktop/v1/code/sections/{section_id}/notes +
{
+  "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 /desktop/v1/code/sections/{section_id}/notes +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code/sections/{section_id}/summaries +
{
+  "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 /desktop/v1/code/sections/{section_id}/summaries +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/sources +
{
+  "tags": [
+    "native-code"
+  ],
+  "summary": "Sources",
+  "operationId": "sources_desktop_v1_code_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/code/summaries/{summary_id}/approve +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/code/workspace +
{
+  "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": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Inspections Sources",
+  "operationId": "search_inspections_sources_desktop_v1_inspections_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/cases +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Cases",
+  "operationId": "cases_desktop_v1_inspections_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 /desktop/v1/inspections/cases +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Create Case",
+  "operationId": "create_case_desktop_v1_inspections_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/InspectionInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/cases/{case_id} +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Case",
+  "operationId": "case_desktop_v1_inspections_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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/cases/{case_id}/history +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "History",
+  "operationId": "history_desktop_v1_inspections_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/cases/{case_id}/packets +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Packet",
+  "operationId": "packet_desktop_v1_inspections_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/cases/{case_id}/revisions +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Revise",
+  "operationId": "revise_desktop_v1_inspections_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/InspectionInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/connections/search +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Connections",
+  "operationId": "connections_desktop_v1_inspections_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__inspections_bridge__Search"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/evidence/retain +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Retain",
+  "operationId": "retain_desktop_v1_inspections_evidence_retain_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/EvidenceItems"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/evidence/supported-types +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/media/analyse +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "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",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/MediaAnalysis"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/notice-draft +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Notice",
+  "operationId": "notice_desktop_v1_inspections_notice_draft_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/InspectionInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/inspections/packets/{packet_id} +
{
+  "tags": [
+    "native-inspections"
+  ],
+  "summary": "Document",
+  "operationId": "document_desktop_v1_inspections_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/inspections/repeat-cases +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Meetings Sources",
+  "operationId": "search_meetings_sources_desktop_v1_meetings_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/agenda-items +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Create Agenda Item",
+  "operationId": "create_agenda_item_desktop_v1_meetings_agenda_items_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/AgendaInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/agenda-items/{item_id} +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Get Agenda Item",
+  "operationId": "get_agenda_item_desktop_v1_meetings_agenda_items__item_id__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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/agenda-items/{item_id}/meeting +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/AgendaAssignment"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/agenda-items/{item_id}/reviews +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Record Agenda Review",
+  "operationId": "record_agenda_review_desktop_v1_meetings_agenda_items__item_id__reviews_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/AgendaReviewInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/code-connections +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/code-connections/{connection_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/code-connections/{connection_id}/decisions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Create Meeting",
+  "operationId": "create_meeting_desktop_v1_meetings_meetings_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/MeetingInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/meetings/{meeting_id} +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Get Meeting",
+  "operationId": "get_meeting_desktop_v1_meetings_meetings__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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/action-items +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Capture Action Item",
+  "operationId": "capture_action_item_desktop_v1_meetings_meetings__meeting_id__action_items_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/ActionItemInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/archive +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Archive Meeting",
+  "operationId": "archive_meeting_desktop_v1_meetings_meetings__meeting_id__archive_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/ArchiveInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DraftInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/motions +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/MotionInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/notice-checks +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/NoticeInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/PacketInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/meetings/{meeting_id}/proceedings +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Proceedings",
+  "operationId": "proceedings_desktop_v1_meetings_meetings__meeting_id__proceedings_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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/stages +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Record Meeting Stage",
+  "operationId": "record_meeting_stage_desktop_v1_meetings_meetings__meeting_id__stages_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/MeetingStageInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/meetings/{meeting_id}/transcripts +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Capture Transcript",
+  "operationId": "capture_transcript_desktop_v1_meetings_meetings__meeting_id__transcripts_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/TranscriptInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/minutes/{draft_id}/decisions +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Decide Minutes",
+  "operationId": "decide_minutes_desktop_v1_meetings_minutes__draft_id__decisions_post",
+  "parameters": [
+    {
+      "name": "draft_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "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": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/motions/{motion_id}/corrections +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/MotionCorrection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/motions/{motion_id}/votes +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/VoteInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/notices/{notice_id}/document +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/NoticeDocumentInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/meetings/notices/{notice_id}/proof +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Record Notice Proof",
+  "operationId": "record_notice_proof_desktop_v1_meetings_notices__notice_id__proof_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/NoticeProofInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/notices/{notice_id}/template +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "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 /desktop/v1/meetings/packets/{packet_id}/deliver +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "summary": "Export Packet",
+  "operationId": "export_packet_desktop_v1_meetings_packets__packet_id__deliver_post",
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/meetings/station/catalog +
{
+  "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",
+      "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 /desktop/v1/meetings/votes/{vote_id}/corrections +
{
+  "tags": [
+    "native-meetings"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/VoteCorrection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/notice/archives/{archive_id} +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Export",
+  "operationId": "export_desktop_v1_notice_archives__archive_id__get",
+  "parameters": [
+    {
+      "name": "archive_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Archive 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 /desktop/v1/notice/archives/{archive_id}/records +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Handoff",
+  "operationId": "handoff_desktop_v1_notice_archives__archive_id__records_post",
+  "parameters": [
+    {
+      "name": "archive_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Archive 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/Handoff"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/notice/notices +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Inventory",
+  "operationId": "inventory_desktop_v1_notice_notices_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 /desktop/v1/notice/notices +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Create",
+  "operationId": "create_desktop_v1_notice_notices_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/NoticeDraft"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/notice/notices/{notice_id} +
{
+  "tags": [
+    "native-notice"
+  ],
+  "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",
+      "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 /desktop/v1/notice/notices/{notice_id}/approval +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Approve",
+  "operationId": "approve_desktop_v1_notice_notices__notice_id__approval_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/Version"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notice/notices/{notice_id}/archive +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Archive",
+  "operationId": "archive_desktop_v1_notice_notices__notice_id__archive_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/Version"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notice/notices/{notice_id}/proof +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Proof",
+  "operationId": "proof_desktop_v1_notice_notices__notice_id__proof_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/Proof"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notice/notices/{notice_id}/review +
{
+  "tags": [
+    "native-notice"
+  ],
+  "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",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Session"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/townlight_runtime__notice_bridge__Review"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notice/notices/{notice_id}/revisions +
{
+  "tags": [
+    "native-notice"
+  ],
+  "summary": "Edit",
+  "operationId": "edit_desktop_v1_notice_notices__notice_id__revisions_post",
+  "parameters": [
+    {
+      "name": "notice_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notice 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/Revision"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/notifications/{notification_id}/sent +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Mark Native Notification Sent",
+  "operationId": "mark_native_notification_sent_desktop_v1_notifications__notification_id__sent_post",
+  "parameters": [
+    {
+      "name": "notification_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Notification 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": {
+            "$ref": "#/components/schemas/RecordsStateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Permitting Sources",
+  "operationId": "search_permitting_sources_desktop_v1_permitting_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/cases +
{
+  "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 /desktop/v1/permitting/cases +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/cases/{case_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/cases/{case_id}/history +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/cases/{case_id}/packets +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/cases/{case_id}/revisions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/connections/search +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/packets/{packet_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/pathway +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/permitting/requirements +
{
+  "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 /desktop/v1/permitting/requirements +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/permitting/requirements/{revision_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Planning Sources",
+  "operationId": "search_planning_sources_desktop_v1_planning_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/amendments +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/amendments/history +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/amendments/{item_id}/revisions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/analyses +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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 /desktop/v1/planning/analyses +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Create Analysis",
+  "operationId": "create_analysis_desktop_v1_planning_analyses_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": "Body"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/analyses/{analysis_id} +
{
+  "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"
+      }
+    },
+    {
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/analyses/{analysis_id}/history +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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 /desktop/v1/planning/analyses/{analysis_id}/revisions +
{
+  "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": {
+          "type": "object",
+          "additionalProperties": true,
+          "title": "Body"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/analyses/{analysis_id}/snapshot-preview +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/analyses/{analysis_id}/snapshots +
{
+  "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"
+      }
+    },
+    {
+      "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",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/connections/search +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Connections",
+  "operationId": "connections_desktop_v1_planning_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/ConnectionSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/imports +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/imports/preview +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/initiatives +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/initiatives/{item_id}/revisions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/municipal-work/{item_id}/history +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/policies/search +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Policies",
+  "operationId": "policies_desktop_v1_planning_policies_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__planning_bridge__Search"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/progress/targets +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Municipal Progress",
+  "operationId": "municipal_progress_desktop_v1_planning_progress_targets_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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/revisions/{revision_id} +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/revisions/{revision_id}/documents/{document_id} +
{
+  "tags": [
+    "native-planning"
+  ],
+  "summary": "Staff Original",
+  "operationId": "staff_original_desktop_v1_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"
+      }
+    },
+    {
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/snapshots +
{
+  "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"
+      }
+    },
+    {
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/snapshots/{snapshot_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/planning/snapshots/{snapshot_id}/access-advice +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/sources +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/planning/sources/{plan_id}/history +
{
+  "tags": [
+    "native-planning"
+  ],
+  "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",
+      "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 /desktop/v1/public/lookup +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Public Records Lookup",
+  "operationId": "public_records_lookup_desktop_v1_public_lookup_post",
+  "parameters": [
+    {
+      "name": "X-Townlight-Public",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Public"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/PublicLookup"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/public/messages +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Public Records Message",
+  "operationId": "public_records_message_desktop_v1_public_messages_post",
+  "parameters": [
+    {
+      "name": "X-Townlight-Public",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Public"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/PublicMessage"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/public/records-state +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Public Records State",
+  "operationId": "public_records_state_desktop_v1_public_records_state_get",
+  "parameters": [
+    {
+      "name": "X-Townlight-Public",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Public"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsStateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/public/requests +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Public Records Intake",
+  "operationId": "public_records_intake_desktop_v1_public_requests_post",
+  "parameters": [
+    {
+      "name": "X-Townlight-Public",
+      "in": "header",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "X-Townlight-Public"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/PublicIntake"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/records-state +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Get Native Records State",
+  "operationId": "get_native_records_state_desktop_v1_records_state_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": {
+            "$ref": "#/components/schemas/RecordsStateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Create Native Request",
+  "operationId": "create_native_request_desktop_v1_requests_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/StaffRecordsIntake"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/NativeRequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/requests/{request_id} +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Get Native Request",
+  "operationId": "get_native_request_desktop_v1_requests__request_id__get",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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": {
+            "$ref": "#/components/schemas/NativeRequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/actions +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Native Request Operation",
+  "operationId": "native_request_operation_desktop_v1_requests__request_id__actions_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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": {
+          "oneOf": [
+            {
+              "$ref": "#/components/schemas/AssignCommand"
+            },
+            {
+              "$ref": "#/components/schemas/DeadlineCommand"
+            },
+            {
+              "$ref": "#/components/schemas/CalculateDeadlineCommand"
+            },
+            {
+              "$ref": "#/components/schemas/ClarificationCommand"
+            },
+            {
+              "$ref": "#/components/schemas/MessageCommand"
+            },
+            {
+              "$ref": "#/components/schemas/SearchNoteCommand"
+            },
+            {
+              "$ref": "#/components/schemas/SearchReceiptCommand"
+            },
+            {
+              "$ref": "#/components/schemas/ExemptionNoteCommand"
+            },
+            {
+              "$ref": "#/components/schemas/ExemptionDecisionCommand"
+            },
+            {
+              "$ref": "#/components/schemas/FeeEstimateCommand"
+            },
+            {
+              "$ref": "#/components/schemas/FeeLineCommand"
+            },
+            {
+              "$ref": "#/components/schemas/FeeWaiverCommand"
+            },
+            {
+              "$ref": "#/components/schemas/DraftCommand"
+            },
+            {
+              "$ref": "#/components/schemas/ApprovalCommand"
+            },
+            {
+              "$ref": "#/components/schemas/FinishCommand"
+            }
+          ],
+          "discriminator": {
+            "propertyName": "action",
+            "mapping": {
+              "assign-records-request": "#/components/schemas/AssignCommand",
+              "set-records-deadline": "#/components/schemas/DeadlineCommand",
+              "calculate-records-deadline": "#/components/schemas/CalculateDeadlineCommand",
+              "request-records-clarification": "#/components/schemas/ClarificationCommand",
+              "add-records-message": "#/components/schemas/MessageCommand",
+              "record-records-search": "#/components/schemas/SearchNoteCommand",
+              "record-records-search-session": "#/components/schemas/SearchReceiptCommand",
+              "add-records-exemption-review": "#/components/schemas/ExemptionNoteCommand",
+              "add-records-exemption-decision": "#/components/schemas/ExemptionDecisionCommand",
+              "estimate-records-fee": "#/components/schemas/FeeEstimateCommand",
+              "add-records-fee-line": "#/components/schemas/FeeLineCommand",
+              "waive-records-fee": "#/components/schemas/FeeWaiverCommand",
+              "draft-records-response": "#/components/schemas/DraftCommand",
+              "approve-records-response": "#/components/schemas/ApprovalCommand",
+              "fulfill-records-request": "#/components/schemas/FinishCommand",
+              "close-records-request": "#/components/schemas/FinishCommand"
+            }
+          },
+          "title": "Command"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/artifacts +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Prepare Native Artifact",
+  "operationId": "prepare_native_artifact_desktop_v1_requests__request_id__artifacts_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/PrepareArtifact"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ArtifactPlan"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/artifacts/{artifact_id}/complete +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Complete Native Artifact",
+  "operationId": "complete_native_artifact_desktop_v1_requests__request_id__artifacts__artifact_id__complete_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "artifact_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Artifact 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/CompleteArtifact"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/code-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Code Source",
+  "operationId": "attach_code_source_desktop_v1_requests__request_id__code_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/CodeSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/documents +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Native Document",
+  "operationId": "attach_native_document_desktop_v1_requests__request_id__documents_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/AttachDocument"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/documents/{attachment_id}/release-copy +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Native Release Copy",
+  "operationId": "attach_native_release_copy_desktop_v1_requests__request_id__documents__attachment_id__release_copy_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "attachment_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Attachment 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/AttachReleaseCopy"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/requests/{request_id}/draft-context +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Native Draft Context",
+  "operationId": "native_draft_context_desktop_v1_requests__request_id__draft_context_get",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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 /desktop/v1/requests/{request_id}/generated-draft +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Native Generated Draft",
+  "operationId": "native_generated_draft_desktop_v1_requests__request_id__generated_draft_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/GeneratedDraft"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/inspections-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Inspections Source",
+  "operationId": "attach_inspections_source_desktop_v1_requests__request_id__inspections_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/meetings-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Meetings Source",
+  "operationId": "attach_meetings_source_desktop_v1_requests__request_id__meetings_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/permitting-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Permitting Source",
+  "operationId": "attach_permitting_source_desktop_v1_requests__request_id__permitting_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/planning-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Planning Source",
+  "operationId": "attach_planning_source_desktop_v1_requests__request_id__planning_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/station-recordings +
{
+  "tags": [
+    "native-desktop",
+    "station-integration"
+  ],
+  "summary": "Attach",
+  "operationId": "attach_desktop_v1_requests__request_id__station_recordings_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/Selection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/requests/{request_id}/view +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Get Native Request View",
+  "operationId": "get_native_request_view_desktop_v1_requests__request_id__view_get",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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": {
+            "$ref": "#/components/schemas/RecordsView"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/requests/{request_id}/zoning-sources +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Attach Zoning Source",
+  "operationId": "attach_zoning_source_desktop_v1_requests__request_id__zoning_sources_post",
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request 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/MeetingsSourceSelection"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RecordsOperationRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/station/context +
{
+  "tags": [
+    "native-desktop",
+    "station-integration"
+  ],
+  "summary": "Context",
+  "operationId": "context_desktop_v1_station_context_get",
+  "parameters": [
+    {
+      "name": "capability",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "enum": [
+          "capture",
+          "read"
+        ],
+        "type": "string",
+        "title": "Capability"
+      }
+    },
+    {
+      "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 /desktop/v1/suite/search +
{
+  "tags": [
+    "native-records-snapshot"
+  ],
+  "summary": "Search",
+  "operationId": "search_desktop_v1_suite_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/SearchInput"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/suite/state +
{
+  "tags": [
+    "native-records-snapshot"
+  ],
+  "summary": "Suite State",
+  "operationId": "suite_state_desktop_v1_suite_state_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 /desktop/v1/zoning-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Zoning Sources",
+  "operationId": "search_zoning_sources_desktop_v1_zoning_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/code-context +
{
+  "tags": [
+    "native-zoning"
+  ],
+  "summary": "Create Code Context",
+  "operationId": "create_code_context_desktop_v1_zoning_code_context_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/CodeContext"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/imports +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/meetings/search +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/outlines +
{
+  "tags": [
+    "native-zoning"
+  ],
+  "summary": "Create Outline",
+  "operationId": "create_outline_desktop_v1_zoning_outlines_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/Outline"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/parcels/lookup +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/questions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/zoning/questions/{question_id}/history +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/questions/{question_id}/meetings +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/questions/{question_id}/reviews +
{
+  "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": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/questions/{question_id}/snapshots +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/rules +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/standards/process-explanation +
{
+  "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",
+  "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/StandardsExplanation"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/zoning/workspace +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /documents/ +
{
+  "tags": [
+    "documents"
+  ],
+  "summary": "List Documents",
+  "operationId": "list_documents_documents__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "source_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Source Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "$ref": "#/components/schemas/IngestionStatus"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Status"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 500,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/DocumentRead"
+            },
+            "title": "Response List Documents Documents  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /documents/{document_id} +
{
+  "tags": [
+    "documents"
+  ],
+  "summary": "Get Document",
+  "operationId": "get_document_documents__document_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "document_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Document Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DocumentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /documents/{document_id}/chunks +
{
+  "tags": [
+    "documents"
+  ],
+  "summary": "List Chunks",
+  "operationId": "list_chunks_documents__document_id__chunks_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "document_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Document Id"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 500,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/DocumentChunkRead"
+            },
+            "title": "Response List Chunks Documents  Document Id  Chunks Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/dashboard +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Exemption Dashboard",
+  "operationId": "exemption_dashboard_exemptions_dashboard_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ExemptionDashboard"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /exemptions/dashboard/accuracy +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Exemption Accuracy",
+  "description": "Acceptance/rejection rates by category, optionally filtered by department.",
+  "operationId": "exemption_accuracy_exemptions_dashboard_accuracy_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "department_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Department Id"
+      }
+    },
+    {
+      "name": "date_from",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Date From"
+      }
+    },
+    {
+      "name": "date_to",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Date To"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ExemptionAccuracyReport"
+            },
+            "title": "Response Exemption Accuracy Exemptions Dashboard Accuracy Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/dashboard/export +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Export Flag Data",
+  "description": "Export exemption flag data as JSON or CSV.",
+  "operationId": "export_flag_data_exemptions_dashboard_export_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "format",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "default": "json",
+        "title": "Format"
+      }
+    },
+    {
+      "name": "date_from",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Date From"
+      }
+    },
+    {
+      "name": "date_to",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "date-time"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Date To"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /exemptions/flags/{flag_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Review Flag",
+  "operationId": "review_flag_exemptions_flags__flag_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "flag_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Flag Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExemptionFlagReview"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ExemptionFlagRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/flags/{request_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "List Flags",
+  "operationId": "list_flags_exemptions_flags__request_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "status",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "$ref": "#/components/schemas/FlagStatus"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Status"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ExemptionFlagRead"
+            },
+            "title": "Response List Flags Exemptions Flags  Request Id  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /exemptions/rules/ +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Create Rule",
+  "operationId": "create_rule_exemptions_rules__post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExemptionRuleCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ExemptionRuleRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/rules/ +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "List Rules",
+  "operationId": "list_rules_exemptions_rules__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "state_code",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "State Code"
+      }
+    },
+    {
+      "name": "enabled",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "boolean"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Enabled"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ExemptionRuleRead"
+            },
+            "title": "Response List Rules Exemptions Rules  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /exemptions/rules/{rule_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Update Rule",
+  "operationId": "update_rule_exemptions_rules__rule_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "rule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Rule Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ExemptionRuleUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ExemptionRuleRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/rules/{rule_id}/history +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Get Rule History",
+  "description": "Get audit history for an exemption rule.",
+  "operationId": "get_rule_history_exemptions_rules__rule_id__history_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "rule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Rule Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /exemptions/rules/{rule_id}/test +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Test Rule",
+  "description": "Test a rule against sample text. Returns match results.\n\nUses the `regex` library with timeout=2s to prevent ReDoS on\nadmin-entered patterns.",
+  "operationId": "test_rule_exemptions_rules__rule_id__test_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "rule_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Rule Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/RuleTestRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RuleTestResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /exemptions/scan/{request_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Scan For Exemptions",
+  "description": "Scan all documents attached to a request for exemptions.",
+  "operationId": "scan_for_exemptions_exemptions_scan__request_id__post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "state_code",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "pattern": "^[A-Z]{2}$",
+        "default": "CO",
+        "title": "State Code"
+      }
+    },
+    {
+      "name": "use_llm",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "boolean",
+        "default": false,
+        "title": "Use Llm"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/templates/ +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "List Templates",
+  "operationId": "list_templates_exemptions_templates__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "template_type",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Template Type"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/DisclosureTemplateRead"
+            },
+            "title": "Response List Templates Exemptions Templates  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /exemptions/templates/ +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Create Template",
+  "operationId": "create_template_exemptions_templates__post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DisclosureTemplateCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DisclosureTemplateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PUT /exemptions/templates/{template_id} +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Update Template",
+  "operationId": "update_template_exemptions_templates__template_id__put",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "template_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Template Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/DisclosureTemplateUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DisclosureTemplateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /exemptions/templates/{template_id}/render +
{
+  "tags": [
+    "exemptions"
+  ],
+  "summary": "Render Template",
+  "description": "Render a template with city profile variables substituted.",
+  "operationId": "render_template_exemptions_templates__template_id__render_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "template_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Template Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/DisclosureTemplateRendered"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /health +
{
+  "summary": "Health",
+  "operationId": "health_health_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    }
+  }
+}
+
GET /notifications/log +
{
+  "tags": [
+    "notifications"
+  ],
+  "summary": "List Notification Log",
+  "description": "List recent notification log entries.",
+  "operationId": "list_notification_log_notifications_log_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "maximum": 200,
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "request_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/NotificationLogRead"
+            },
+            "title": "Response List Notification Log Notifications Log Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /notifications/templates +
{
+  "tags": [
+    "notifications"
+  ],
+  "summary": "List Templates",
+  "description": "List all notification templates.",
+  "operationId": "list_templates_notifications_templates_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/NotificationTemplateRead"
+            },
+            "type": "array",
+            "title": "Response List Templates Notifications Templates Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /notifications/templates +
{
+  "tags": [
+    "notifications"
+  ],
+  "summary": "Create Template",
+  "description": "Create a new notification template (admin only).",
+  "operationId": "create_template_notifications_templates_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/NotificationTemplateCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/NotificationTemplateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /notifications/templates/{template_id} +
{
+  "tags": [
+    "notifications"
+  ],
+  "summary": "Update Template",
+  "description": "Update a notification template (admin only).",
+  "operationId": "update_template_notifications_templates__template_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "template_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Template Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/NotificationTemplateUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/NotificationTemplateRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /onboarding/interview +
{
+  "tags": [
+    "onboarding"
+  ],
+  "summary": "Get Next Question",
+  "description": "Generate the next onboarding question and persist the last answer.",
+  "operationId": "get_next_question_onboarding_interview_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/InterviewRequest"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/InterviewResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /public/meetings +
{
+  "tags": [
+    "public-meetings"
+  ],
+  "summary": "Public Archive Index",
+  "operationId": "public_archive_index_public_meetings_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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /public/meetings/{record_id} +
{
+  "tags": [
+    "public-meetings"
+  ],
+  "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": {
+        "text/html": {
+          "schema": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /public/meetings/{record_id}/{kind}.txt +
{
+  "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"
+      }
+    },
+    {
+      "name": "kind",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "enum": [
+          "agenda",
+          "packet",
+          "minutes"
+        ],
+        "type": "string",
+        "title": "Kind"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/ +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Create Request",
+  "operationId": "create_request_requests__post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/RequestCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/ +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "List Requests",
+  "operationId": "list_requests_requests__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "status",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "$ref": "#/components/schemas/RequestStatus"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Status"
+      }
+    },
+    {
+      "name": "assigned_to",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string",
+            "format": "uuid"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Assigned To"
+      }
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 50,
+        "title": "Limit"
+      }
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 0,
+        "title": "Offset"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/RequestRead"
+            },
+            "title": "Response List Requests Requests  Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/stats +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Request Stats",
+  "operationId": "request_stats_requests_stats_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestStats"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /requests/{request_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Request",
+  "operationId": "get_request_requests__request_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /requests/{request_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Update Request",
+  "operationId": "update_request_requests__request_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/RequestUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/approve +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Approve Request",
+  "operationId": "approve_request_requests__request_id__approve_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/documents +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Attach Document",
+  "operationId": "attach_document_requests__request_id__documents_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/RequestDocumentAdd"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestDocumentRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/documents +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "List Attached Documents",
+  "operationId": "list_attached_documents_requests__request_id__documents_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/RequestDocumentRead"
+            },
+            "title": "Response List Attached Documents Requests  Request Id  Documents Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /requests/{request_id}/documents/{doc_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Remove Document",
+  "operationId": "remove_document_requests__request_id__documents__doc_id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "doc_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Doc Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/estimate-fees +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Estimate Fees",
+  "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": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeEstimateRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeEstimateResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/fee-waiver +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Create Fee Waiver",
+  "description": "Request a fee waiver for this records request.",
+  "operationId": "create_fee_waiver_requests__request_id__fee_waiver_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeWaiverCreateRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeWaiverReadResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /requests/{request_id}/fee-waiver/{waiver_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Review Fee Waiver",
+  "description": "Approve or deny a fee waiver. Reviewer/Admin only.",
+  "operationId": "review_fee_waiver_requests__request_id__fee_waiver__waiver_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "waiver_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Waiver Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeWaiverReviewRequest"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeWaiverReadResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/fees +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Fees",
+  "operationId": "get_fees_requests__request_id__fees_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/FeeLineItemRead"
+            },
+            "title": "Response Get Fees Requests  Request Id  Fees Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/fees +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Add Fee",
+  "operationId": "add_fee_requests__request_id__fees_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/FeeLineItemCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/FeeLineItemRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/messages +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Messages",
+  "operationId": "get_messages_requests__request_id__messages_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/MessageRead"
+            },
+            "title": "Response Get Messages Requests  Request Id  Messages Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/messages +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Add Message",
+  "operationId": "add_message_requests__request_id__messages_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/MessageCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/MessageRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/ready-for-release +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Mark Ready For Release",
+  "operationId": "mark_ready_for_release_requests__request_id__ready_for_release_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/reject +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Reject Request",
+  "operationId": "reject_request_requests__request_id__reject_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "reason",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "default": "",
+        "title": "Reason"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/response-letter +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Generate Response Letter",
+  "description": "Generate a draft response letter for a records request.\n\nAttempts LLM generation via Ollama first; falls back to a structured\ntemplate if the LLM is unavailable.",
+  "operationId": "generate_response_letter_requests__request_id__response_letter_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "anyOf": [
+            {
+              "$ref": "#/components/schemas/ResponseLetterCreate"
+            },
+            {
+              "type": "null"
+            }
+          ],
+          "title": "Data"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ResponseLetterRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/response-letter +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Response Letter",
+  "description": "Get the latest response letter for a request.",
+  "operationId": "get_response_letter_requests__request_id__response_letter_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ResponseLetterRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /requests/{request_id}/response-letter/{letter_id} +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Update Response Letter",
+  "description": "Update a response letter's edited content or status.\n\nStatus changes to 'approved' require REVIEWER role.",
+  "operationId": "update_response_letter_requests__request_id__response_letter__letter_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    },
+    {
+      "name": "letter_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Letter Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ResponseLetterUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ResponseLetterRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/submit-review +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Submit For Review",
+  "operationId": "submit_for_review_requests__request_id__submit_review_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/RequestRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /requests/{request_id}/timeline +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Get Timeline",
+  "operationId": "get_timeline_requests__request_id__timeline_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/TimelineEventRead"
+            },
+            "title": "Response Get Timeline Requests  Request Id  Timeline Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /requests/{request_id}/timeline +
{
+  "tags": [
+    "requests"
+  ],
+  "summary": "Add Timeline Event",
+  "operationId": "add_timeline_event_requests__request_id__timeline_post",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "request_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Request Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/TimelineEventCreate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/TimelineEventRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /search/export +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "Export Search Results",
+  "description": "Export search results as CSV. Runs a search and streams the results.",
+  "operationId": "export_search_results_search_export_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "query",
+      "in": "query",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Query"
+      }
+    },
+    {
+      "name": "format",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "string",
+        "default": "csv",
+        "title": "Format"
+      }
+    },
+    {
+      "name": "department_id",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "Department Id"
+      }
+    },
+    {
+      "name": "file_type",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "anyOf": [
+          {
+            "type": "string"
+          },
+          {
+            "type": "null"
+          }
+        ],
+        "title": "File Type"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /search/filters +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "Get Filter Options",
+  "description": "Get available filter values for search.",
+  "operationId": "get_filter_options_search_filters_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/SearchFilterOptions"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /search/query +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "Execute Search",
+  "description": "Execute a hybrid search query. Optionally synthesize an LLM answer.",
+  "operationId": "execute_search_search_query_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/SearchRequest"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/SearchResponse"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /search/sessions +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "List Sessions",
+  "description": "List the current user's search sessions.",
+  "operationId": "list_sessions_search_sessions_get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "limit",
+      "in": "query",
+      "required": false,
+      "schema": {
+        "type": "integer",
+        "default": 20,
+        "title": "Limit"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SearchSessionRead"
+            },
+            "title": "Response List Sessions Search Sessions Get"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /search/sessions/{session_id} +
{
+  "tags": [
+    "search"
+  ],
+  "summary": "Get Session",
+  "description": "Get a search session with its query history.",
+  "operationId": "get_session_search_sessions__session_id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "session_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Session Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/SearchSessionRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /service-accounts/ +
{
+  "tags": [
+    "service-accounts"
+  ],
+  "summary": "List Service Accounts",
+  "operationId": "list_service_accounts_service_accounts__get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "items": {
+              "$ref": "#/components/schemas/ServiceAccountRead"
+            },
+            "type": "array",
+            "title": "Response List Service Accounts Service Accounts  Get"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
POST /service-accounts/ +
{
+  "tags": [
+    "service-accounts"
+  ],
+  "summary": "Create Service Account",
+  "operationId": "create_service_account_service_accounts__post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ServiceAccountCreate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "201": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ServiceAccountCreated"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /service-accounts/{account_id} +
{
+  "tags": [
+    "service-accounts"
+  ],
+  "summary": "Update Service Account",
+  "operationId": "update_service_account_service_accounts__account_id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "account_id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "format": "uuid",
+        "title": "Account Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/ServiceAccountUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ServiceAccountRead"
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /townlight_code +
{
+  "summary": "Home",
+  "operationId": "home_townlight_code_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "text/html": {
+          "schema": {
+            "type": "string"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /townlight_code/answer +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /townlight_code/search +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /townlight_code/sections/{section_ref} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /townlight_code/sections/{section_ref}/export +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /townlight_planning/plan-explore +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /townlight_planning/policies/search +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /townlight_planning/revisions/{revision_id}/documents/{document_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /townlight_planning/snapshots +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /townlight_planning/snapshots/{snapshot_id} +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /townlight_zoning/parcels/lookup +
{
+  "summary": "Public Parcel Lookup",
+  "operationId": "public_parcel_lookup_townlight_zoning_parcels_lookup_post",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/_ParcelLookupIn"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /townlight_zoning/questions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /users/me +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:Current User",
+  "operationId": "users_current_user_users_me_get",
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/UserRead"
+          }
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
PATCH /users/me +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:Patch Current User",
+  "operationId": "users_patch_current_user_users_me_patch",
+  "requestBody": {
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/UserSelfUpdate"
+        }
+      }
+    },
+    "required": true
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/UserRead"
+          }
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    },
+    "400": {
+      "description": "Bad Request",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/ErrorModel"
+          },
+          "examples": {
+            "UPDATE_USER_EMAIL_ALREADY_EXISTS": {
+              "summary": "A user with this email already exists.",
+              "value": {
+                "detail": "UPDATE_USER_EMAIL_ALREADY_EXISTS"
+              }
+            },
+            "UPDATE_USER_INVALID_PASSWORD": {
+              "summary": "Password validation failed.",
+              "value": {
+                "detail": {
+                  "code": "UPDATE_USER_INVALID_PASSWORD",
+                  "reason": "Password should beat least 3 characters"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  },
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ]
+}
+
GET /users/{id} +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:User",
+  "operationId": "users_user_users__id__get",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Id"
+      }
+    }
+  ],
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/UserRead"
+          }
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    },
+    "403": {
+      "description": "Not a superuser."
+    },
+    "404": {
+      "description": "The user does not exist."
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
PATCH /users/{id} +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:Patch User",
+  "operationId": "users_patch_user_users__id__patch",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Id"
+      }
+    }
+  ],
+  "requestBody": {
+    "required": true,
+    "content": {
+      "application/json": {
+        "schema": {
+          "$ref": "#/components/schemas/UserSelfUpdate"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/UserRead"
+          }
+        }
+      }
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    },
+    "403": {
+      "description": "Not a superuser."
+    },
+    "404": {
+      "description": "The user does not exist."
+    },
+    "400": {
+      "content": {
+        "application/json": {
+          "examples": {
+            "UPDATE_USER_EMAIL_ALREADY_EXISTS": {
+              "summary": "A user with this email already exists.",
+              "value": {
+                "detail": "UPDATE_USER_EMAIL_ALREADY_EXISTS"
+              }
+            },
+            "UPDATE_USER_INVALID_PASSWORD": {
+              "summary": "Password validation failed.",
+              "value": {
+                "detail": {
+                  "code": "UPDATE_USER_INVALID_PASSWORD",
+                  "reason": "Password should beat least 3 characters"
+                }
+              }
+            }
+          },
+          "schema": {
+            "$ref": "#/components/schemas/ErrorModel"
+          }
+        }
+      },
+      "description": "Bad Request"
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
DELETE /users/{id} +
{
+  "tags": [
+    "users"
+  ],
+  "summary": "Users:Delete User",
+  "operationId": "users_delete_user_users__id__delete",
+  "security": [
+    {
+      "OAuth2PasswordBearer": []
+    }
+  ],
+  "parameters": [
+    {
+      "name": "id",
+      "in": "path",
+      "required": true,
+      "schema": {
+        "type": "string",
+        "title": "Id"
+      }
+    }
+  ],
+  "responses": {
+    "204": {
+      "description": "Successful Response"
+    },
+    "401": {
+      "description": "Missing token or inactive user."
+    },
+    "403": {
+      "description": "Not a superuser."
+    },
+    "404": {
+      "description": "The user does not exist."
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ No newline at end of file diff --git a/docs/beta-1/api/zoning-openapi.json b/docs/beta-1/api/zoning-openapi.json new file mode 100644 index 0000000..7e374ad --- /dev/null +++ b/docs/beta-1/api/zoning-openapi.json @@ -0,0 +1,11822 @@ +{ + "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.", + "version": "1.8.0.dev2" + }, + "paths": { + "/desktop/v1/zoning-sources/search": { + "post": { + "tags": [ + "native-desktop" + ], + "summary": "Search Zoning Sources", + "operationId": "search_zoning_sources_desktop_v1_zoning_sources_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/MeetingsSearch" + } + } + } + }, + "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/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": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/outlines": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Create Outline", + "operationId": "create_outline_desktop_v1_zoning_outlines_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/Outline" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/desktop/v1/zoning/code-context": { + "post": { + "tags": [ + "native-zoning" + ], + "summary": "Create Code Context", + "operationId": "create_code_context_desktop_v1_zoning_code_context_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/CodeContext" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/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", + "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/StandardsExplanation" + } + } + } + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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." + }, + "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": { + "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" + }, + "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_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__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-component": { + "view": "zoning", + "identity": "Townlight Zoning 0.2.3", + "evidence": "source-schema-only" + } +} diff --git a/docs/beta-1/api/zoning.html b/docs/beta-1/api/zoning.html new file mode 100644 index 0000000..e5ee5ce --- /dev/null +++ b/docs/beta-1/api/zoning.html @@ -0,0 +1,12297 @@ +Townlight Zoning API reference
Townlight

Townlight Zoning API reference

+

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

+

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

+

HTTP operations

+
POST /desktop/v1/zoning-sources/search +
{
+  "tags": [
+    "native-desktop"
+  ],
+  "summary": "Search Zoning Sources",
+  "operationId": "search_zoning_sources_desktop_v1_zoning_sources_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/MeetingsSearch"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/code-context +
{
+  "tags": [
+    "native-zoning"
+  ],
+  "summary": "Create Code Context",
+  "operationId": "create_code_context_desktop_v1_zoning_code_context_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/CodeContext"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/imports +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/meetings/search +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/outlines +
{
+  "tags": [
+    "native-zoning"
+  ],
+  "summary": "Create Outline",
+  "operationId": "create_outline_desktop_v1_zoning_outlines_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/Outline"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/parcels/lookup +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/questions +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/zoning/questions/{question_id}/history +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/questions/{question_id}/meetings +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/questions/{question_id}/reviews +
{
+  "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": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/questions/{question_id}/snapshots +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/rules +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+
POST /desktop/v1/zoning/standards/process-explanation +
{
+  "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",
+  "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/StandardsExplanation"
+        }
+      }
+    }
+  },
+  "responses": {
+    "200": {
+      "description": "Successful Response",
+      "content": {
+        "application/json": {
+          "schema": {}
+        }
+      }
+    },
+    "422": {
+      "description": "Validation Error",
+      "content": {
+        "application/json": {
+          "schema": {
+            "$ref": "#/components/schemas/HTTPValidationError"
+          }
+        }
+      }
+    }
+  }
+}
+
GET /desktop/v1/zoning/workspace +
{
+  "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"
+          }
+        }
+      }
+    }
+  }
+}
+

Request and response data dictionary

+

Each schema includes the actual required fields, types, constraints and descriptions. References resolve against the machine-readable document.

+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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"
+}
+
+
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."
+}
+
+
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": {
+      "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"
+}
+
+
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_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__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"
+}
+
Townlight · AGPL-3.0-only · Source schema evidence only
\ 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 new file mode 100644 index 0000000..2edaf64 Binary files /dev/null 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 new file mode 100644 index 0000000..54b01ed Binary files /dev/null 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 1d8bb2a..529355c 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 new file mode 100644 index 0000000..a801881 Binary files /dev/null and b/docs/beta-1/docx/Townlight-Inspections-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Meetings-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Meetings-Manual-Beta-1.docx new file mode 100644 index 0000000..7182d23 Binary files /dev/null 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 new file mode 100644 index 0000000..3c63383 Binary files /dev/null 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 new file mode 100644 index 0000000..390e03b Binary files /dev/null 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 new file mode 100644 index 0000000..6754f2d Binary files /dev/null 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 new file mode 100644 index 0000000..7802795 Binary files /dev/null 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 new file mode 100644 index 0000000..bb4e7a9 Binary files /dev/null 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 new file mode 100644 index 0000000..cda568e Binary files /dev/null and b/docs/beta-1/docx/Townlight-Suite-Manual-Beta-1.docx differ diff --git a/docs/beta-1/docx/Townlight-Zoning-Manual-Beta-1.docx b/docs/beta-1/docx/Townlight-Zoning-Manual-Beta-1.docx new file mode 100644 index 0000000..8e7b61c Binary files /dev/null and b/docs/beta-1/docx/Townlight-Zoning-Manual-Beta-1.docx differ diff --git a/docs/beta-1/history/station/pre-naming-2026-11/USER-MANUAL.html b/docs/beta-1/history/station/pre-naming-2026-11/USER-MANUAL.html new file mode 100644 index 0000000..7fc10be --- /dev/null +++ b/docs/beta-1/history/station/pre-naming-2026-11/USER-MANUAL.html @@ -0,0 +1,1601 @@ +Townlight Station +Manual | Townlight Beta 1
townlightTownlight Beta 1
+
Townlight Beta 1

Townlight +Station +Manual

Staff guide and technical reference

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

+

Townlight Beta 1 — Station delivery update, 31 October +2026. Signed +Windows installer, source, documentation and acceptance. This +edition documents the Sandbox-tested Station delivery additions. +Existing component versions are retained. Earlier baseline results +remain identified as historical evidence; the new acceptance report +identifies the new installer.

+
+

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
Public documentation identityTownlight Beta 1
Installer version1.6.0.1
Product componenttownlight-station 0.3.0
Native desktop source version1.6.0-1
Candidate artifact identityStation delivery update; use the release SHA256SUMS.txt
Corresponding sourceUpdated Station delivery candidate source companion
Current owned software licenseAGPL-3.0-only
Supported acceptance profileWindows x64 fresh install; inspections-preview; separate Station +configuration
+

“Townlight Beta 1” identifies this coordinated beta delivery. It does +not renumber the installer, native binary, Python packages or historical +receipts. Component versions may differ. This edition accompanies the +newly packaged and signed MSI containing the Station delivery additions. +The native desktop and other native payload files retain their accepted +signed bytes. Historical release pages and manuals describe their own +versions and are not the download instructions for this Station delivery +candidate.

+

First run

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

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

+

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

+

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

+

Data and consistency

+

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:CIVICSUITE_DATA_DIR = Join-Path $profilePath 'Data'
+$env:CIVICSUITE_FILE_STORAGE_DIR = Join-Path $profilePath 'Data\files'
+$env:DATABASE_URL = "postgresql+asyncpg://civicsuite:${encodedNative}@127.0.0.1:15432/civicsuite"
+$env:TOWNLIGHT_PRODUCT_PROFILE = 'inspections-preview'
+$env:PORTAL_MODE = 'private'
+$env:CIVICSUITE_RUNTIME_HOST = '127.0.0.1'
+$env:CIVICSUITE_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='civicsuite',
+                        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','civicsuite_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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

+

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

+

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

+

Troubleshooting

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

+ +++++ + + + + + + + + + + + + + + +
ProductRecorded resultPrecisely exercised
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 following baseline results come from the previously accepted +signed candidate’s fresh normal-profile Sandbox exercise: real native +IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source +bundles and media were synthetic. The guest install/uninstall and +recovery passed, and the owned Sandbox stopped. No host installed +application or standalone CivicCast was changed. Those baseline receipts +are retained for unchanged workflows. The accompanying ACCEPTANCE.md +records the separate installed verification and exact identity of this +new Station delivery candidate.

+

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

+

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

+

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

+

Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

+

Warranty and liability

+

The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

+

Support and incident +reporting

+

Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

+

Ending a beta +exercise and document changes

+

When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

+

Glossary

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

+

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.
  • +
+ \ No newline at end of file diff --git a/docs/beta-1/history/station/pre-naming-2026-11/USER-MANUAL.md b/docs/beta-1/history/station/pre-naming-2026-11/USER-MANUAL.md new file mode 100644 index 0000000..59f2947 --- /dev/null +++ b/docs/beta-1/history/station/pre-naming-2026-11/USER-MANUAL.md @@ -0,0 +1,848 @@ +> **Private Station delivery beta candidate — 30 October 2026.** This documentation includes completed-recording YouTube uploads and a live Station-to-CivicCast feed. It accompanies the new private candidate, not the previously published installer. Existing versions are retained. Consult the accompanying candidate checksums and acceptance receipts; earlier published-candidate results below remain historical evidence. No public release or city deployment is implied. + +## 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 + +| Identity | Value | +| --- | --- | +| Public documentation identity | Townlight Beta 1 | +| Installer version | 1.6.0.1 | +| Product component | townlight-station 0.3.0 | +| Native desktop source version | 1.6.0-1 | +| Candidate artifact identity | Private Station delivery candidate; use accompanying SHA256SUMS | +| Corresponding source | Updated private candidate source companion | +| Current owned software license | AGPL-3.0-only | +| Supported acceptance profile | Windows x64 fresh install; inspections-preview; separate Station configuration | + + +“Townlight Beta 1” identifies this coordinated beta delivery. It does not renumber the installer, native binary, Python packages or historical receipts. Component versions may differ. This edition accompanies a newly packaged and signed private MSI containing the Station delivery additions. The native desktop and other native payload files retain their accepted signed bytes. Historical release pages and manuals describe their own versions and are not the download instructions for this private candidate. + +## First run + +1. Obtain the identified signed private candidate and its corresponding-source companion from the beta coordinator. The landing pages in this documentation are not an installer download service. +2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles and recovery material. This candidate has fresh-install acceptance; historical in-place upgrades are unverified. +3. Launch Townlight under the intended named Windows account. Choose the storage folders. Select **Townlight Inspections candidate** (`inspections-preview`) for all eight desktop products. A narrower default selection will not expose all workspaces. +4. Enter the city profile, time zone and contacts. Create the first named local administrator, sign in and choose protected backup storage. **Continue without local AI** is valid for the deterministic workflows. +5. Run Health Check and wait for readiness. Open Townlight. In System Health select **Finish Records Migration** to activate the canonical Python/PostgreSQL runtime. Do not fabricate migration receipts or seed accounts. +6. Create named staff through Settings. Import authorized sources using each product’s source library. All examples in this package are synthetic; they are not municipal authority. +7. Provision Station separately if it is part of the beta exercise. Selecting the desktop composition does not start or configure Station. Configure vision explicitly only if automatic photo drafting is selected. + +## Daily workflow + +### 1. Prepare meeting context {#workflow-1} + +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 {#workflow-2} + +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 {#workflow-3} + +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 {#workflow-4} + +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 {#workflow-5} + +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 {#workflow-6} + +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 {#workflow-7} + +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 {#workflow-8} + +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. + + +| Direction | Material | +| --- | --- | +| Input | A 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. | +| Output | Completed 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: + +```json +{"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: + +```json +{"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 targets **Windows x64 fresh installation**. Its native shell uses **Rust 2021, Tauri 2 and Microsoft WebView2**; browser assets are JavaScript built with **Vite 8.1.6**. This describes the native desktop frontend; Station has a separate React operator, specified below or in its product manual. Canonical business workflows use bundled **CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and Alembic**, with **PostgreSQL 17 / PostGIS** and managed original files. The installed runtime tested here contains FastAPI 0.162.0. Package minimum Python requirements can differ from the bundled executable; the metadata reference preserves both. No stack rewrite is implied by the beta label. + +The native transport is fixed to loopback `127.0.0.1:15480`; PostgreSQL uses the configured local runtime port (default `15432`). Optional local model service defaults to `127.0.0.1:15434`. Those are deployment defaults, not internet endpoints. The runtime has health, module and readiness endpoints; readiness is stronger than process existence. The task queue is the existing local Core task infrastructure, not an assertion that a separate Redis service is required for this desktop composition. + +The default native profile is `%LOCALAPPDATA%\CivicSuite`; the historical directory name remains part of compatibility. Do not rename it to Townlight. A configured `TOWNLIGHT_PROFILE_ROOT` must be absolute. Local configuration and secrets live under that profile; protected managed files and database state must be backed up coherently. Source/runtime identity is distinct from a product’s display label. + +### Data and consistency + +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](docs/beta-1/reference/runtime-payload-lock.json) records pinned files, sizes and hashes. The [component metadata](docs/beta-1/reference/component-metadata.json) records shipped dependency declarations. These references are more precise than a manually copied dependency list. Third-party and historical license notices must accompany their matching payloads. + +### 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. + +```powershell +$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. + +```powershell +$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:CIVICSUITE_DATA_DIR = Join-Path $profilePath 'Data' +$env:CIVICSUITE_FILE_STORAGE_DIR = Join-Path $profilePath 'Data\files' +$env:DATABASE_URL = "postgresql+asyncpg://civicsuite:${encodedNative}@127.0.0.1:15432/civicsuite" +$env:TOWNLIGHT_PRODUCT_PROFILE = 'inspections-preview' +$env:PORTAL_MODE = 'private' +$env:CIVICSUITE_RUNTIME_HOST = '127.0.0.1' +$env:CIVICSUITE_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. + +```powershell +@' +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='civicsuite', + 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. + +```powershell +$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','civicsuite_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. + +```json +[{"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: + +```powershell +& $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: + +```powershell +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. + +```javascript +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. + +```powershell +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. + +```powershell +$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. + +```json +{ + "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: + +```json +{ + "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](docs/beta-1/api/station.html) for every documented operation, request field, constraint, response declaration and source supplement. Download the [OpenAPI JSON](docs/beta-1/api/station-openapi.json) for tools. For Station this is the suite-side schema only; its separate service contract is documented in the API supplement. The [reference directory](docs/beta-1/reference/index.html) includes configuration/source inventories, dependency declarations, native command contracts, MCP signatures and candidate evidence. + +## 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: + +```json +{"name":"get_job_status","arguments":{"job_id":"synthetic-existing-job-id"}} +``` + +Use a job ID returned by that transcription service. This example does not create a Townlight record or bypass its review/Records handoff. The exact optional adapter tool signatures are supplied in the [MCP source reference](docs/beta-1/reference/mcp.html). Station meeting capture does not become live speech recognition because this optional donor adapter exists. + +## Security and permissions + + +Use your own named account and save before leaving a screen. A saved draft is durable; unsaved form text may not be. If a write has an unknown result, reopen its record before repeating it. + +Read source jurisdiction, dates, citation, version and visibility. A copied source hash identifies exact bytes, not their legal applicability. If a source changes or permission is removed, resolve the source problem rather than substituting stale cached content. + +Keep originals and derivatives separate. Review the intended audience before export. A public summary excludes private fields only through the applicable copy contract and your review. A renamed private packet is still private content. + +Drafting, review, approval, attachment, export, fulfillment and publication are separate operations. A Townlight workpaper does not itself adopt law, issue a permit, impose a fine or release a records response. The responsible staff member records the applicable decision. + +The native session is validated and mapped to a persisted SQL identity. An editable actor/reviewer label is not authentication. Product/module permissions and source visibility apply at the server boundary. Revoked/unavailable authority fails closed for new Station operations; a previous permission result is not a perpetual authorization. + +Use protected local folders, account permissions and credential storage. Never include the native session file, database passwords, provider keys or unredacted support bundles in a public issue or generated public documentation. A local public view is not automatically a secured internet deployment. Keep network exposure and real equipment acceptance specific to the chosen beta site. + +## Backup recovery and maintenance + +Save work and use Core’s canonical **Backup Now** before maintenance. That operation stops writers. Preserve the coherent profile/database/document backup and its receipt, then use **Start** to resume. A source export is not a full backup. + +Use **Restore Latest Backup** through the supported controls. If the result says **Restore needs service start**, use **Start**, then **Check**, and reopen a known record. Do not repeat restore merely because services need to start. The fresh-profile acceptance verified that a fulfilled request survived restore and a post-backup marker did not. + +Keep Station’s dedicated database and media evidence together in its own backup. Core’s native-profile backup must not be assumed to include an external Station data directory. Stop writers during a coordinated backup. Preserve failed media attempts and logs. + +On failure, record the time, selected composition, component/installer versions and exact message. Check System Health for stopped, starting, ready or failed dependencies. Use the existing Retry control after readiness; do not create duplicate business records to refresh a stale view. Share only a redacted diagnostic bundle. Preserve secrets, original evidence, recovery material and unrelated installations. + +## Troubleshooting + +| Symptom | Likely meaning | Next action | +| --- | --- | --- | +| Workspace absent | Wrong product composition or unavailable canonical runtime. | Check selected composition; activate through Finish Records Migration; wait for readiness. | +| Cannot sign in / 401 | Missing or expired named account session. | Sign in normally; reopen a Station launch ticket if applicable. | +| Permission denied / 403 | Account, module, source or browser-origin permission. | Ask the authorized administrator to inspect the intended permission; do not invent role headers. | +| Save conflict / 409 | The saved revision, expected source hash or lifecycle changed. | Keep edits, reopen current state and reconcile deliberately. | +| Invalid input / 422 | Required field, format, geometry, source envelope or state is invalid. | Read the field detail and correct the input/source; preserve originals. | +| Service unavailable / 503 | Database, schema, connected source or configuration unavailable. | Inspect System Health and the named dependency. Preserve work; retry only after readiness. | +| Export refused | Missing exact review, approval, audience or source authorization. | Read the refusal and complete the owning product’s explicit decision. | +| Restore needs service start | The snapshot was restored but services have not resumed. | Use Start, then Check and verify a saved record; do not blindly repeat restore. | +| Ticket expired or used | A launch is one-use and expires after 60 seconds. | Reopen from the signed-in native session; do not replay the old URL. | +| Recording interrupted | Input/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 downloadable | It 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 + +| Product | Recorded result | Precisely exercised | +| --- | --- | --- | +| Station | PASS | Actual 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 following baseline results come from the previously accepted signed candidate’s fresh normal-profile Sandbox exercise: real native IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source bundles and media were synthetic. The guest install/uninstall and recovery passed, and the owned Sandbox stopped. No host installed application or standalone CivicCast was changed. Those baseline receipts are retained for unchanged workflows. The accompanying ACCEPTANCE.md records the separate installed verification and exact identity of this new Station delivery candidate. + +The [workflow matrix](docs/beta-1/reference/workflow-matrix.json) identifies raw receipt filenames. The [evidence index](docs/beta-1/reference/sandbox-evidence-index.json) retains their original hashes; raw receipts remain in the private beta handoff rather than being silently republished with the documentation site. + +The limits remain: actual city field acceptance and equipment/network commissioning; Station automatic provisioning/SCM commissioning; every UI/role combination; field recognition accuracy; and historical in-place upgrades are not certified. They are not five invented feature requirements. Fresh-install controlled beta handoff remains the accepted scope. This package makes no city-deployment, publication or general-availability claim. + +## Terms of service and license + +### Scope and status + +These terms describe the Townlight Beta 1 software and this documentation package. This is a locally prepared private beta, not a hosted-service subscription, a city deployment agreement or a public release. No uptime commitment, support response time, indemnity, data-processing agreement or paid service is created by these documents. A separate signed agreement, if any, governs services it actually provides. + +### 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](https://www.gnu.org/licenses/agpl-3.0.html) and [GNU licensing FAQ](https://www.gnu.org/licenses/gpl-faq.en.html). + +### Data ownership and access + +Importing a document does not transfer its ownership or grant permission to publish it. The operating organization controls its accounts, access decisions, lawful source use, retention and review/release policy. Keep resident information, credentials, private notes and restricted evidence in their authorized locations. Documentation examples contain fictional data. No real city account, credential or record is required to exercise these examples in an isolated test environment. + +### Local operation and external processors + +The accepted beta workflow is local and uses named staff accounts. Station has separate storage and credentials. Configure backup destinations and optional model/network providers deliberately. A configured external provider may receive submitted prompts, images or audio according to that configuration and provider’s terms; this documentation does not promise that every optional configuration is offline. An email outbox or local public view does not establish external delivery or an internet deployment. This static documentation site has no analytics, account collection or remote font dependency. + +### Staff decisions and source applicability + +Staff verify the jurisdiction, source currency, permissions, citations and proposed audience. Model output and generated guidance require review. No draft is automatically an official legal interpretation, zoning determination, permit approval, fee assessment, enforcement notice or records-release decision. Official permit fee authority remains with the adopted source and responsible organization; imported amounts do not become a new authoritative calculation. + +### Beta operation and recovery + +Use the identified candidate in its supported fresh-install scope. Preserve backups and original evidence. Test physical equipment and chosen network/service configuration before relying on them. The supplied acceptance describes selected synthetic workflows, not every screen, vendor, field condition or upgrade. Operators decide whether a particular deployment meets their own operational obligations. + +### Warranty and liability + +The covered software’s warranty and liability conditions are those in sections 15–17 of the supplied AGPL and any applicable separate written undertaking. This documentation creates no additional warranty or limitation beyond those terms. Third-party software is subject to its retained license notices. Nothing here removes rights that applicable law makes nonwaivable. + +### Support and incident reporting + +Use the project’s existing SUPPORT and SECURITY guidance for its matching repository. Report reproducible behavior with the version, operation and redacted logs. Do not put credentials, resident records or unredacted evidence in a public issue. Coordinate sensitive reports through the channel designated in SECURITY. No new support address or service commitment is invented here. + +### Ending a beta exercise and document changes + +When an organization ends testing, it controls retention/export and removes access according to its policy. Uninstall may retain data; back up and inspect the selected removal options. Ending an exercise does not revoke rights already granted by AGPL. Later software/documentation versions must identify their changed candidate and scope; historical receipts retain their original identities. These terms do not claim that a city has accepted a contract merely by reading a manual. + +## Glossary + +| Term | Meaning | +| --- | --- | +| Approval | An explicit authorized decision on the saved text/artifact. It is separate from saving or attachment. | +| Canonical record | The owning product’s retained identity and saved version, rather than an editable copied label. | +| Composition | The selected set of desktop modules; inspections-preview exposes the eight staff products. | +| Corresponding source | The source/build material matching the delivered covered program, subject to its license. | +| Derivative / Records copy | A separately prepared document with its own intended audience and hash. | +| Hash / SHA256 | A fingerprint of exact bytes. It detects change; it does not establish legal authority. | +| Idempotency | Repeating the same identified request has the same intended effect; changing its payload can be refused. | +| IPC | The native desktop command boundary between its browser interface and Rust host. | +| MCP | Model Context Protocol; no direct Townlight product server is enabled by this beta. | +| Original | Retained source bytes. A reviewed derivative does not replace them. | +| Provenance | Source, version, date, actor and relationship information retained with evidence. | +| Revision | An immutable saved version. Later edits do not inherit an earlier review automatically. | +| Snapshot | A fixed audience-specific copy tied to a source/reviewed revision. | +| Station | Townlight’s separate media boundary using a pinned CivicCast-derived engine; standalone CivicCast remains separate. | + + +## Alphabetical subject index + +- **Accounts and authentication** — [Security and permissions](#security-and-permissions). +- **AGPL and source** — [Terms of service and license](#terms-of-service-and-license). +- **API contracts** — [API and integration examples](#api-and-integration-examples). +- **Architecture** — [Architecture](#architecture). +- **Backup** — [Backup recovery and maintenance](#backup-recovery-and-maintenance). +- **Beta version** — [Beta identity](#beta-identity). +- **Configuration** — [Configuration and administration](#configuration-and-administration). +- **Evidence and acceptance** — [Verified workflows and limits](#verified-workflows-and-limits). +- **Fees and official decisions** — [Terms of service and license](#terms-of-service-and-license). +- **First run** — [First run](#first-run). +- **Handoffs and audience** — [Connected workflows](#connected-workflows). +- **MCP** — [MCP and automation boundary](#mcp-and-automation-boundary). +- **Originals and provenance** — [Security and permissions](#security-and-permissions). +- **Recovery** — [Backup recovery and maintenance](#backup-recovery-and-maintenance). +- **Staff procedures** — [Daily workflow](#daily-workflow). +- **Station configuration** — [Configuration and administration](#configuration-and-administration). +- **Technical stack** — [Technical specifications](#technical-specifications). +- **Troubleshooting** — [Troubleshooting](#troubleshooting). + +### Operating subject links + +- **Apply the caption profile** — [Apply the caption profile](#apply-the-caption-profile). +- **Approve and publish local playback** — [Approve and publish local playback](#approve-and-publish-local-playback). +- **Bounds and shutdown** — [Bounds and shutdown](#bounds-and-shutdown). +- **Check playout and commit deliberately** — [Check playout and commit deliberately](#check-playout-and-commit-deliberately). +- **Configure a live input and open the operator** — [Configure a live input and open the operator](#configure-a-live-input-and-open-the-operator). +- **Prepare the normally activated synthetic profile** — [Prepare the normally activated synthetic profile](#prepare-the-normally-activated-synthetic-profile). +- **Provision the Station database once** — [Provision the Station database once](#provision-the-station-database-once). +- **Recover without replaying unknown work** — [Recover without replaying unknown work](#recover-without-replaying-unknown-work). +- **Schedule a recording and interpret its state** — [Schedule a recording and interpret its state](#schedule-a-recording-and-interpret-its-state). +- **Scheduling playout and recovery** — [Scheduling playout and recovery](#scheduling-playout-and-recovery). +- **Start and check the paired processes** — [Start and check the paired processes](#start-and-check-the-paired-processes). +- **Store the independent test configuration** — [Store the independent test configuration](#store-the-independent-test-configuration). +- **Take a live override and return** — [Take a live override and return](#take-a-live-override-and-return). + +## 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. Public historical pages remain unchanged. + +### Workflow subject index + +- **Capture and stop** — [Daily workflow, step 4](#workflow-4). +- **Choose the input** — [Daily workflow, step 3](#workflow-3). +- **Close and recover** — [Daily workflow, step 8](#workflow-8). +- **Hand off to Records** — [Daily workflow, step 6](#workflow-6). +- **Open the operator** — [Daily workflow, step 2](#workflow-2). +- **Prepare meeting context** — [Daily workflow, step 1](#workflow-1). +- **Review recording evidence** — [Daily workflow, step 5](#workflow-5). +- **Use playout deliberately** — [Daily workflow, step 7](#workflow-7). + +- [Source inventory and file hashes](docs/beta-1/reference/source-inventory.json) +- [All component metadata](docs/beta-1/reference/component-metadata.json) +- [Installed domain OpenAPI](docs/beta-1/reference/desktop-domain-openapi.json) +- [Workflow matrix](docs/beta-1/reference/workflow-matrix.json) +- [Full AGPL text](docs/beta-1/reference/AGPL-3.0.txt) + + +## 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: + +```json +[ + { + "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://: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: + +```powershell +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 route | Purpose | +| --- | --- | +| GET `/v1/civiccast-feeds` | Capture-authorized list of configured IDs and labels; no transport credentials | +| POST `/v1/recordings` | Existing capture contract plus optional `civiccast_feed_id`, allowed only with `live_source_id` | +| POST `/v1/recordings/{recording_id}/youtube` | Queue one explicit completed-recording upload | +| GET `/v1/youtube-uploads` | Read-authorized latest 100 durable upload receipts | +| POST `/v1/youtube-uploads/{upload_id}/retry` | Capture-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): + +```json +{ + "meeting_id": "11111111-1111-4111-8111-111111111111", + "agenda_ids": [], + "live_source_id": "chamber", + "civiccast_feed_id": "peg", + "idempotency_key": "council-live-2026-10-30" +} +``` + +```json +{ + "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: + +```powershell +$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](#completed-recordings-on-youtube-and-live-civiccast-coverage) +- YouTube: explicit completed recording upload; visibility; receipt and reconciliation. +- Schema4: durable upload intent; existing evidence retained. diff --git a/docs/beta-1/index.html b/docs/beta-1/index.html index 9f44791..faa792b 100644 --- a/docs/beta-1/index.html +++ b/docs/beta-1/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.

civiccore 1.3.0.dev1AGPL-3.0-onlyPrivate beta · Windows fresh-install scope
For IT administrators and platform maintainers

What the workflow delivers

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

Connected evidence

All products use selected Core contracts. Core does not create unrestricted access between products. Notice and Access are supporting components, rather than additional products in this nine-product beta.

Know the beta boundary

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

Architecture

Where the evidence goes

Townlight Core architecture and evidence flow

All products use selected Core contracts. Core does not create unrestricted access between products. Notice and Access are supporting components, rather than additional products in this nine-product beta.

Evidence rather than promises

Selected staff workflows passed.

The signed private candidate passed normal first-run and selected synthetic workflows in a fresh Windows Sandbox profile. This is not a claim that every screen, vendor, upgrade or city equipment configuration has been certified.

Read the exact acceptance and limits →

Ready to evaluate?

Begin with the manual and the identified private candidate from the beta coordinator. Configure the chosen test site and have its staff review source applicability and run the existing workflows.

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

Municipal work with a clear record.

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

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

The kept products and their connected workflows.

Designed around the record

Prepare, review, hand off.

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

A practical beta deployment

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

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

Architecture

The suite and its boundaries

Townlight architecture and evidence flow

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

Evidence rather than promises

Candidate installed acceptance remains pending.

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

Read the exact acceptance and limits →

Ready to evaluate?

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

Station delivery update

Live cable coverage and recorded video delivery

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

Setup, staff steps and API examples

\ No newline at end of file diff --git a/docs/beta-1/manuals/access.html b/docs/beta-1/manuals/access.html new file mode 100644 index 0000000..bdfd729 --- /dev/null +++ b/docs/beta-1/manuals/access.html @@ -0,0 +1,528 @@ + + +Townlight Access Manual | Townlight candidate + +
Townlight +
+

Naming, Access and Notice source candidate · 2 November 2026

+

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

+ + +

+

Townlight Access User Manual

+

Windows staff workflow — +0.5.0 candidate

+

This candidate is prepared; exact signed-installer acceptance is +pending. It supports a fresh profile only. Keep the previous release +with any existing unmarked profile. The compatibility profile directory +remains %LOCALAPPDATA%\CivicSuite; the new program refuses +to adopt existing unmarked city data.

+
    +
  1. Sign in with an account allowed to use Access and enable the Access +capability. Open Accessibility and enter the actual source title, text, +language and image-description information.
  2. +
  3. Save the review. Reopen it to inspect the source, deterministic +findings and any saved local-model advice, model identity and outcome. +Advice is not a certified accessibility finding or approval.
  4. +
  5. For plain-language or translation work, enter the actual source and +request a draft. The Windows path uses the suite’s configured local +model. Saved drafts retain source/output, language, model/outcome, staff +actor/time and the requirement for qualified human review. An +unavailable-model sample is labeled as a sample; it is not a translation +of the input.
  6. +
  7. Reopen saved drafts from Access, including after restarting the app. +Select Export record on the desired review or draft. The desktop writes +a Markdown record and verifies its content hash and companion manifest +before reporting completion. The fenced JSON is the complete record, +including source, output/advice and relevant provenance; ordinary HTML +rendering is unnecessary to read it.
  8. +
  9. To hand the record to Records, open the intended Records request, +attach the actual exported Markdown file using Records’ native file +picker, and read it back from that request. A successful Access export +alone does not attach evidence to a request or authorize disclosure. +Records permissions and review/release rules still apply.
  10. +
+

The complete review export includes reviewed source, findings, saved +advice/model/outcome where available, actor/time, relevant audit history +and advisory limits. Draft exports include the retained source/output +pair and review status. Back up the complete profile using System Health +and restore only a matching new-format backup. Preservation of these +additions on the actual installed candidate remains part of +acceptance.

+

No automated result certifies ADA compliance, creates an +accessible/tagged PDF, approves publication or replaces a qualified +translator or ADA coordinator.

+

Standalone support service

+

The separately run FastAPI service provides deterministic checks and +planning helpers. Its Spanish and Vietnamese responses are fixed +samples, not translations of the supplied source. Its +deterministic jargon substitutions are separate from the Windows model +workflow. A shared write token proves possession of that token; it does +not establish an individual staff identity. Standalone audit records use +shared-token-staff for that reason.

+

Standalone saved-review exports now return a complete Markdown +artifact with source, findings and relevant audit provenance, plus its +SHA-256. The staff page offers that actual artifact for download. Other +form, tagged-PDF, ADA and publishing helpers remain checklists. The +standalone service does not acquire Windows draft persistence or native +individual-account identity merely because it shares this package.

+

Version 0.5.0 · prepared candidate; installed acceptance +pending Townlight Access is the accessibility, plain-language, +multilingual, and ADA Title II review-support module for Townlight.

+

This manual has two parts. Read the one that fits your role:

+ +
+

Part 1 — For Civic Staff

+

+

What Townlight Access is for

+

Townlight Access helps your office put out public notices, forms, and +documents that everyone can read — and keep a clean +record proving you checked. It is a staff tool that gives advice and +does the busywork; you and your ADA coordinator always make the +final call.

+

What you can do with it

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
You want to…Townlight Access gives you…
Know if a notice is hard to readA check that flags missing titles, images without descriptions, and +dense wording — each with a specific fix
Cut the jargonA plain-language rewrite (e.g. “remit payment prior to the deadline” +→ “pay before the deadline”)
Reach non-English readersWindows local-model drafts for qualified review; fixed standalone +samples do not translate input
Publish an accessible form or PDFA checklist of what an accessible form or tagged PDF needs
Handle an ADA Title II reviewA step-by-step review-support checklist
Answer a records requestA saved, exportable record of every review, with provenance +(individual staff identity in Windows; shared-token identity in the +standalone service)
+

How you’ll use it day to day

+

There are two places to work, and the difference matters:

+
    +
  • The public checker is for trying things out — it +forgets everything when you leave.
  • +
  • The staff workspace is for keeping a permanent, +official record you can produce later.
  • +
+

Your IT team will give you the link to each.

+
    +
  1. Open the public checker. Paste in a draft notice +and run the check. You’ll get a list of plain-language fixes — nothing +is saved, so it’s a safe place to experiment.
  2. +
  3. When you’re ready to keep a review on the record, open the +staff workspace and enter the staff password your IT +team gave you (a one-time setup). Save the review — it goes into your +Townlight records with a time-stamp of who saved it and when.
  4. +
  5. From the staff workspace, export a records-ready +package for any saved review — ready to hand to a +public-records request.
  6. +
+

+

What Townlight Access will +not do

+

Townlight Access is a tool for your staff, not a rubber +stamp. It does not:

+
    +
  • give legal advice,
  • +
  • certify ADA compliance,
  • +
  • issue official translations, or
  • +
  • publish anything on its own.
  • +
+

A qualified human — your staff, an ADA coordinator, a translator, +legal counsel — always reviews and approves before anything goes public. +Translations it drafts are starting points for a human +translator, never the final word.

+

Where it stands today

+

This is v0.5.0, an early release we’re being upfront +about. It’s solid enough to evaluate and pilot, but it is not a +finished 1.0 and not a compliance guarantee. (An earlier +v1.0.0 was published by mistake; we pulled it back to an +honest sub-1.0 label rather than overstate where the product is.)

+
+

Part 2 — For IT & Technical +Staff

+

Overview

+

Townlight Access is a deterministic FastAPI service, +written in Python and pinned to the published Townlight Core +1.3.0.dev2 release wheel. It performs rule-based accessibility +checks — no LLM/model calls, no network calls — so +output is reproducible and the service is cheap to run. It ships as one +module inside Townlight Windows Local, a Tauri/WebView2 +desktop application, and is also runnable standalone for +development.

+

Deployment architecture

+

In Townlight Windows Local, a Tauri supervisor +starts a bundled Python host (running Townlight Access alongside peer +modules) and a bundled PostgreSQL instance on +127.0.0.1:15432. The supervisor injects a +DATABASE_URL into each module service; Townlight Access +stores its data in a dedicated townlight_access schema in +that shared cluster. The supervisor’s backup copies the entire data +directory (including the Postgres cluster), so Townlight Access data is +captured with it.

+
flowchart TB
+  Resident["Resident<br/>(browser)"] -->|"public, read-only"| Pub["/townlight_access"]
+  Staff["City staff<br/>(browser)"] -->|"WebView2 UI"| StaffUI["/townlight_access/staff"]
+
+  subgraph Sup["Tauri supervisor — local machine only"]
+    CA["Townlight Access<br/>(FastAPI)"]
+    Peers["Peer modules<br/>Townlight Meetings · Townlight Code · Townlight Notice · …"]
+    PG[("Bundled PostgreSQL<br/>127.0.0.1:15432")]
+  end
+
+  Pub --> CA
+  StaffUI --> CA
+  CA -->|"DATABASE_URL → townlight_access schema"| PG
+  Peers --> PG
+  CA -->|"depends on"| Core["Townlight Core 1.3.0.dev2"]
+  CA -. "records-export hand-off" .-> Records["Townlight Records"]
+  Sup -. "wholesale backup of Data/ (incl. Data/postgres)" .-> Backup[("Backup folder")]
+

Request & trust model

+

There are two surfaces with deliberately different trust levels:

+
    +
  • Public (/townlight_access → +POST /api/v1/townlight_access/analyze): stateless. Anyone +can analyze content; nothing is persisted and no token is +required.
  • +
  • Staff (/townlight_access/staff → +POST .../review, +POST .../reviews/{id}/records-export): persistent. Every +write requires the trusted-write token.
  • +
+
sequenceDiagram
+  participant R as Resident (public)
+  participant S as City staff
+  participant CA as Townlight Access
+  participant DB as PostgreSQL (townlight_access schema)
+
+  R->>CA: POST /analyze (no token)
+  CA-->>R: findings + fixes (nothing saved)
+
+  S->>CA: POST /review + X-Townlight-Access-Write-Token
+  Note over CA: constant-time token check<br/>403 if invalid · 503 if unconfigured
+  CA->>DB: insert review + audit row (one transaction)
+  CA-->>S: saved review_id + findings
+
+  S->>CA: POST /reviews/{id}/records-export + token
+  CA->>DB: write audit_events row
+  CA-->>S: records-ready export
+

Persistence & configuration

+

Townlight Access resolves its review store in this order:

+
    +
  1. TOWNLIGHT_ACCESS_REVIEW_DB_URL — explicit override (a +dev SQLite path or a pre-built Postgres URL).
  2. +
  3. DATABASE_URL — the supervisor-injected async URL +(postgresql+asyncpg://…:15432/…), converted to a +synchronous psycopg2 URL. This is the default under the desktop +runtime.
  4. +
  5. SQLite dev fallback — +data/townlight_access-reviews.db under +TOWNLIGHT_ACCESS_DATA_DIR (default: ./data), +used only when neither variable is set.
  6. +
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + +
VariablePurpose
DATABASE_URLShared Townlight Core PostgreSQL (set by the supervisor) — the +production default
TOWNLIGHT_ACCESS_REVIEW_DB_URLExplicit SQLAlchemy URL override
TOWNLIGHT_ACCESS_DATA_DIRDirectory for the SQLite dev fallback
TOWNLIGHT_ACCESS_TRUSTED_WRITE_TOKENRequired server secret for persistent writes
+

townlight_access-db-status (console script) preflights a +database with an explicit URL.

+

Data model

+

Three tables live in the townlight_access schema +(translated to the default schema on SQLite). Schema setup is +non-destructive (CREATE SCHEMA IF NOT EXISTS + +metadata.create_all); the applied migration id is +townlight_access-windows-local-state-v1.

+
erDiagram
+  accessibility_review_records {
+    string   review_id PK
+    string   title
+    text     body
+    bool     has_alt_text
+    string   language
+    string   status
+    json     findings
+    text     disclaimer
+    datetime created_at
+  }
+  audit_events {
+    string   event_id PK
+    string   action
+    string   subject_id "soft ref → review_id"
+    string   actor
+    datetime created_at
+  }
+  schema_migrations {
+    string   schema_version PK
+    datetime applied_at
+  }
+

HTTP API

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method & pathAuthPersists?Purpose
GET /—noModule status and boundaries
GET /health—noPackage + Townlight Core version
GET /ready, +GET /api/v1/townlight_access/readiness—noPersistence readiness gate
GET /townlight_access—noPublic accessibility checker (UI)
GET /townlight_access/staff—noStaff workspace (UI; never embeds the token)
POST /api/v1/townlight_access/analyze—noStateless accessibility analysis
POST /api/v1/townlight_access/reviewtokenyesSave a review record (+ audit)
GET /api/v1/townlight_access/reviews—noList saved reviews
GET /api/v1/townlight_access/reviews/{id}—noRetrieve a saved review
POST /api/v1/townlight_access/reviews/{id}/records-exporttokenyes (audit)Records-ready export (+ audit)
GET /api/v1/townlight_access/integration-contracts—noPublished integration contracts
POST /api/v1/townlight_access/plain-language—noDeterministic plain-language rewrite
POST /api/v1/townlight_access/language-variant—noMultilingual draft variant (human-review flagged)
POST /api/v1/townlight_access/forms—noAccessible form publication checks
POST /api/v1/townlight_access/publishing-workflow—noStaff publication workflow steps/blockers
POST /api/v1/townlight_access/ada-title-ii—noADA Title II review-support checklist
POST /api/v1/townlight_access/tagged-pdf—noTagged-PDF heading expectations
POST /api/v1/townlight_access/export—noRecords-ready export checklist (stateless)
+

Token-guarded writes require the +X-Townlight-Access-Write-Token header matching +TOWNLIGHT_ACCESS_TRUSTED_WRITE_TOKEN (compared in constant +time). Missing/invalid → 403; guard not configured → +503 (fails closed). The server token is never embedded in +served HTML — the staff page provides a field where an operator pastes +it; it is kept only in the browser session.

+

Security

+
    +
  • Authentication boundary: persistence-write routes +require the trusted-write token; read and stateless-analysis routes are +open. The desktop supervisor binds the service to the local +machine.
  • +
  • Audit trail: every persistent write/export writes +an audit_events row (action, subject, actor, timestamp). +review.create is committed atomically with the review +record.
  • +
  • Determinism: no model/LLM calls and no outbound +network calls; checks are pure functions.
  • +
  • Backups: review and audit data live in the shared +Postgres cluster, captured by the supervisor’s wholesale +Data/ backup. Durability is covered by the test suite (a +Postgres reconnect round-trip for the default store; a SQLite file +backup/restore round-trip for the dev fallback).
  • +
+

Operations

+

Readiness: poll GET /ready (or +/api/v1/townlight_access/readiness) — ready +when the schema can be created and verified.

+

Local verification (mirrors CI; the release gate requires a real +PostgreSQL):

+
python -m pip install https://github.com/townlight/core/releases/download/v1.2.0/townlight_core-1.2.0-py3-none-any.whl
+python -m pip install -e ".[dev]"
+# Release gate (requires Postgres):
+export TOWNLIGHT_ACCESS_POSTGRES_TEST_URL="postgresql+psycopg2://USER:PW@HOST:PORT/DB"
+bash scripts/verify-release.sh
+

Integration

+

Townlight Access depends on Townlight Core; +Townlight Core does not depend on Townlight Access. It publishes +integration contracts at +/api/v1/townlight_access/integration-contracts, hands +records exports to Townlight Records, and provides +accessibility support to downstream publishers (zone, plan, permit, +inspect, grants, procure).

+

Release status

+

v0.5.0 is an early release. Probe gaps #1–#4 (clean +install, staff/public authz, audit logging, backup/restore durability) +are closed with evidence (see PROBE-PROGRESS.md). City-core +membership (desktop registry record + 6-module profile) and a clean-VM +accessibility acceptance pass are later phases. The earlier +v1.0.0 tag was published in error and is retained only as +historical evidence.

+
Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
\ No newline at end of file diff --git a/docs/beta-1/manuals/code.html b/docs/beta-1/manuals/code.html new file mode 100644 index 0000000..d806f1b --- /dev/null +++ b/docs/beta-1/manuals/code.html @@ -0,0 +1,1003 @@ + + +Townlight Code Manual | Townlight candidate + +
Townlight +
+

Naming, Access and Notice source candidate · 2 November 2026

+

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

+ + +

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
Intended installer version1.7.0.1; build and acceptance pending
Product componenttownlight-code 1.0.9
Principal import packagetownlight_code
Native desktop source version1.7.0-1
Candidate hashesPending candidate build, signing and installed acceptance
Current owned software licenseAGPL-3.0-only
Acceptance compositionFresh Windows x64 profile; inspections-preview; Station configured +separately
+

The naming change advances this package’s version and requires a new +signed installer and installed acceptance. Those steps and publication +remain pending. Historical tags, receipts and archived manuals keep +their original names and certify only their identified artifacts. Use an +empty database and fresh profile; no in-place legacy upgrade is +supported. The approved Windows profile path remains +%LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data +and recovery material.

+

First run

+
    +
  1. Obtain the identified signed private candidate and its +corresponding-source companion from the beta coordinator. The landing +pages in this documentation are not an installer download service.
  2. +
  3. On the intended fresh Windows test installation, verify the MSI hash +and publisher signature before installing. Preserve unrelated profiles +and recovery material. Installed acceptance for this source candidate +remains pending; no in-place legacy upgrade is supported.
  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 targets Windows x64 fresh +installation. Its native shell uses Rust 2021, Tauri 2 +and Microsoft WebView2; browser assets are JavaScript built +with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled +CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and +Alembic, with PostgreSQL 17 / PostGIS and +managed original files. The installed runtime tested here contains +FastAPI 0.162.0. Package minimum Python requirements can differ from the +bundled executable; the metadata reference preserves both. No stack +rewrite is implied by the beta label.

+

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

+

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

+

Data and consistency

+

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 new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

+

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

+

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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

+

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

+

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

+

Troubleshooting

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

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

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

+

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

+

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

+

Terms of service and license

+

Scope and status

+

These terms describe the Townlight Beta 1 software and this +documentation package. This is a locally prepared private beta, not a +hosted-service subscription, a city deployment agreement or a public +release. No uptime commitment, support response time, indemnity, +data-processing agreement or paid service is created by these documents. +A separate signed agreement, if any, governs services it actually +provides.

+

Software license and rights

+

Current Townlight-owned distributions identified in this candidate +use AGPL-3.0-only. The full license is supplied with +this documentation and with the source companion. The license governs +rights to run, copy, modify and convey the covered software; these +operational terms do not add restrictions to those rights. Historical +grants and dependency licenses retain their own terms. CivicCast remains +a separate product and is not relicensed by this documentation work.

+

When conveying covered software, retain applicable notices and +provide the corresponding source and installation/build information +required by the license. For a modified version supporting remote +network interaction, follow section 13’s source-offer requirement. The +companion archive identifies the source for this candidate; a link to a +different public branch is not a substitute for the matching source. +Read the supplied license for the complete conditions. See the GNU license +reference and GNU licensing +FAQ.

+

Data ownership and access

+

Importing a document does not transfer its ownership or grant +permission to publish it. The operating organization controls its +accounts, access decisions, lawful source use, retention and +review/release policy. Keep resident information, credentials, private +notes and restricted evidence in their authorized locations. +Documentation examples contain fictional data. No real city account, +credential or record is required to exercise these examples in an +isolated test environment.

+

Local operation and +external processors

+

The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency.

+

Staff decisions and +source applicability

+

Staff verify the jurisdiction, source currency, permissions, +citations and proposed audience. Model output and generated guidance +require review. No draft is automatically an official legal +interpretation, zoning determination, permit approval, fee assessment, +enforcement notice or records-release decision. Official permit fee +authority remains with the adopted source and responsible organization; +imported amounts do not become a new authoritative calculation.

+

Beta operation and recovery

+

Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

+

Warranty and liability

+

The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

+

Support and incident +reporting

+

Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

+

Ending a beta +exercise and document changes

+

When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

+

Glossary

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

+ +
Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
\ No newline at end of file diff --git a/docs/beta-1/manuals/core.html b/docs/beta-1/manuals/core.html index 9c9bde7..0c54b0e 100644 --- a/docs/beta-1/manuals/core.html +++ b/docs/beta-1/manuals/core.html @@ -1,5 +1,6 @@ -Townlight -Core Manual | Townlight Beta 1
townlightTownlight Beta 1
-
Townlight Beta 1

Townlight -Core -Manual

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

Using -this manual

+ + + +

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 @@ -82,46 +132,48 @@

Beta identity

-Public documentation identity -Townlight Beta 1 +Documentation +Townlight Beta 1 naming, Access and Notice candidate -Installer version -1.6.0.1 +Intended installer version +1.7.0.1; build and acceptance pending Product component -civiccore 1.3.0.dev1 +townlight-core 1.3.0.dev2 -Native desktop source version -1.6.0-1 +Principal import package +townlight_core -Candidate MSI SHA256 -98bcdef11ebdf5c767f620c904ff49f85115fde3b5c23f62703b111e645aaf86 +Native desktop source version +1.7.0-1 -Corresponding-source SHA256 -84a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06b +Candidate hashes +Pending candidate build, signing and installed acceptance Current owned software license AGPL-3.0-only -Supported acceptance profile -Windows x64 fresh install; inspections-preview; separate Station -configuration +Acceptance composition +Fresh Windows x64 profile; inspections-preview; Station configured +separately -

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

+

The naming change advances this package’s version and requires a new +signed installer and installed acceptance. Those steps and publication +remain pending. Historical tags, receipts and archived manuals keep +their original names and certify only their identified artifacts. Use an +empty database and fresh profile; no in-place legacy upgrade is +supported. The approved Windows profile path remains +%LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data +and recovery material.

First run

  1. Obtain the identified signed private candidate and its @@ -129,13 +181,13 @@

    First run

    pages in this documentation are not an installer download service.
  2. On the intended fresh Windows test installation, verify the MSI hash and publisher signature before installing. Preserve unrelated profiles -and recovery material. This candidate has fresh-install acceptance; -historical in-place upgrades are unverified.
  3. +and recovery material. Installed acceptance for this source candidate +remains pending; no in-place legacy upgrade is supported.
  4. Launch Townlight under the intended named Windows account. Choose the storage folders. Select Townlight Inspections -candidate (inspections-preview) for all eight -desktop products. A narrower default selection will not expose all -workspaces.
  5. +candidate (inspections-preview) for the bounded +desktop composition, including Access and Notice. A narrower default +selection will not expose all workspaces.
  6. 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 @@ -153,33 +205,41 @@

    First run

    selected.

Daily workflow

-

1. Complete setup

+

+

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

+

+

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

+

+

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

+

+

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

+

+

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

+

+

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

+

+

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.

@@ -202,9 +262,9 @@

Working safely

decision.

Connected workflows

All products use selected Core contracts. Core does not create -unrestricted access between products. Notice and Access are supporting -components, rather than additional products in this nine-product -beta.

+unrestricted access between products. Access and Notice provide the +bounded staff workflows documented in their current manuals; installed +acceptance remains pending.

@@ -236,7 +296,12 @@

Product boundary

permission checks. Historical placeholder ADRs are retained as history, rather than descriptions of the current implementation.

Architecture

-

Townlight Core architecture and evidence flow

+
+ + +

The drawing shows the principal staff/evidence path. Native commands carry trusted identity to Python business services; PostgreSQL and retained original files hold durable state. A downstream copy does not @@ -259,7 +324,7 @@

Catalog import and readback

limited to ports, db_patterns and service_accounts; do not put credentials in them.
  • In an authorized application transaction, call -civiccore.catalog.import_catalog(session, bundle, actor_id=actual_actor_id). +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.
  • @@ -277,7 +342,7 @@

    Catalog import and readback

    actual_actor_id are supplied by that application; this is not a command that seeds an administrator.

    from civiccore.catalog import import_catalog, system_catalog
    +class="sourceCode python">from townlight_core.catalog import import_catalog, system_catalog
     
     bundle = {
         "catalog_version": "synthetic-1",
    @@ -313,7 +378,7 @@ 

    Jurisdictional rule does not assume a jurisdiction or claim complete legal coverage.

    from uuid import UUID
    -from civiccore.exemptions import Rule, evaluate, RuleEvaluationError
    +from townlight_core.exemptions import Rule, evaluate, RuleEvaluationError
     
     rule = Rule(
         id=UUID("11111111-1111-4111-8111-111111111111"),
    @@ -339,9 +404,9 @@ 

    Scaffold plan and generate

    fictional module project; it does not register, install, migrate or run it.

    & $control -m civiccore.scaffold plan civicnotes `
    +class="sourceCode powershell">& $control -m townlight_core.scaffold plan civicnotes `
       --name 'Synthetic Notes' --description 'Synthetic scaffold exercise'
    -& $control -m civiccore.scaffold generate civicnotes `
    +& $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 @@ -349,16 +414,16 @@

    Scaffold plan and generate

    --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, --civiccore-min-version, +--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: civiccore/catalog/__init__.py, -civiccore/exemptions/__init__.py, -civiccore/scaffold/cli.py, project.py, and the -Records catalog facade.

    +

    Source contracts: townlight_core/catalog/__init__.py, +townlight_core/exemptions/__init__.py, +townlight_core/scaffold/cli.py, project.py, +and the Records catalog facade.

    Technical specifications

    Runtime and storage

    The accepted package targets Windows x64 fresh @@ -403,15 +468,16 @@

    Capacity and platform

    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 +machine’s specification into a supported minimum. The new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

    +

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

    Configuration and administration

    @@ -419,13 +485,13 @@

    Native deployment configuration

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

    +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, -CIVICSUITE_RUNTIME_PORT, PORTAL_MODE and the +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 @@ -491,12 +557,12 @@

    A synthetic write 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 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.

    @@ -523,9 +589,9 @@

    MCP and automation boundary

    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.

    +href="../reference/mcp.html">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 @@ -677,12 +743,12 @@

    Verified workflows and owned Sandbox stopped. No host installed application or standalone CivicCast was changed. This documentation task reuses those receipts; it does not claim a new software acceptance run.

    -

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

    +

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

    The limits remain: actual city field acceptance and equipment/network commissioning; Station automatic provisioning/SCM commissioning; every UI/role combination; field recognition accuracy; and historical in-place @@ -946,14 +1012,16 @@

    Workflow subject index

    href="#workflow-5">Daily workflow, step 5.

  • Restore and verify — Daily workflow, step 6.

  • -
  • Source inventory and -file hashes

  • -
  • All component -metadata

  • -
  • Installed +

  • Source +inventory and file hashes

  • +
  • All +component metadata

  • +
  • Installed domain OpenAPI

  • Workflow matrix

  • -
  • Full AGPL text

  • -

    - \ No newline at end of file +
  • Full AGPL +text

  • + +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/inspections.html b/docs/beta-1/manuals/inspections.html new file mode 100644 index 0000000..b2a81e5 --- /dev/null +++ b/docs/beta-1/manuals/inspections.html @@ -0,0 +1,1046 @@ + + +Townlight Inspections Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    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
    Intended installer version1.7.0.1; build and acceptance pending
    Product componenttownlight-inspections 0.3.0+dev.2
    Principal import packagetownlight_inspections
    Native desktop source version1.7.0-1
    Candidate hashesPending candidate build, signing and installed acceptance
    Current owned software licenseAGPL-3.0-only
    Acceptance compositionFresh Windows x64 profile; inspections-preview; Station configured +separately
    +

    The naming change advances this package’s version and requires a new +signed installer and installed acceptance. Those steps and publication +remain pending. Historical tags, receipts and archived manuals keep +their original names and certify only their identified artifacts. Use an +empty database and fresh profile; no in-place legacy upgrade is +supported. The approved Windows profile path remains +%LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data +and recovery material.

    +

    First run

    +
      +
    1. Obtain the identified signed private candidate and its +corresponding-source companion from the beta coordinator. The landing +pages in this documentation are not an installer download service.
    2. +
    3. On the intended fresh Windows test installation, verify the MSI hash +and publisher signature before installing. Preserve unrelated profiles +and recovery material. Installed acceptance for this source candidate +remains pending; no in-place legacy upgrade is supported.
    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 targets Windows x64 fresh +installation. Its native shell uses Rust 2021, Tauri 2 +and Microsoft WebView2; browser assets are JavaScript built +with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled +CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and +Alembic, with PostgreSQL 17 / PostGIS and +managed original files. The installed runtime tested here contains +FastAPI 0.162.0. Package minimum Python requirements can differ from the +bundled executable; the metadata reference preserves both. No stack +rewrite is implied by the beta label.

    +

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

    +

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

    +

    Data and consistency

    +

    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 new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

    +

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

    +

    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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

    +

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

    +

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

    +

    Troubleshooting

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

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

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

    +

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

    +

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

    +

    Terms of service and license

    +

    Scope and status

    +

    These terms describe the Townlight Beta 1 software and this +documentation package. This is a locally prepared private beta, not a +hosted-service subscription, a city deployment agreement or a public +release. No uptime commitment, support response time, indemnity, +data-processing agreement or paid service is created by these documents. +A separate signed agreement, if any, governs services it actually +provides.

    +

    Software license and rights

    +

    Current Townlight-owned distributions identified in this candidate +use AGPL-3.0-only. The full license is supplied with +this documentation and with the source companion. The license governs +rights to run, copy, modify and convey the covered software; these +operational terms do not add restrictions to those rights. Historical +grants and dependency licenses retain their own terms. CivicCast remains +a separate product and is not relicensed by this documentation work.

    +

    When conveying covered software, retain applicable notices and +provide the corresponding source and installation/build information +required by the license. For a modified version supporting remote +network interaction, follow section 13’s source-offer requirement. The +companion archive identifies the source for this candidate; a link to a +different public branch is not a substitute for the matching source. +Read the supplied license for the complete conditions. See the GNU license +reference and GNU licensing +FAQ.

    +

    Data ownership and access

    +

    Importing a document does not transfer its ownership or grant +permission to publish it. The operating organization controls its +accounts, access decisions, lawful source use, retention and +review/release policy. Keep resident information, credentials, private +notes and restricted evidence in their authorized locations. +Documentation examples contain fictional data. No real city account, +credential or record is required to exercise these examples in an +isolated test environment.

    +

    Local operation and +external processors

    +

    The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency.

    +

    Staff decisions and +source applicability

    +

    Staff verify the jurisdiction, source currency, permissions, +citations and proposed audience. Model output and generated guidance +require review. No draft is automatically an official legal +interpretation, zoning determination, permit approval, fee assessment, +enforcement notice or records-release decision. Official permit fee +authority remains with the adopted source and responsible organization; +imported amounts do not become a new authoritative calculation.

    +

    Beta operation and recovery

    +

    Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

    +

    Warranty and liability

    +

    The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

    +

    Support and incident +reporting

    +

    Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

    +

    Ending a beta +exercise and document changes

    +

    When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

    +

    Glossary

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

    + +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/meetings.html b/docs/beta-1/manuals/meetings.html new file mode 100644 index 0000000..7b64a59 --- /dev/null +++ b/docs/beta-1/manuals/meetings.html @@ -0,0 +1,969 @@ + + +Townlight Meetings Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    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
    Intended installer version1.7.0.1; build and acceptance pending
    Product componenttownlight-meetings 1.0.5
    Principal import packagetownlight_meetings
    Native desktop source version1.7.0-1
    Candidate MSI SHA256Pending build, signing and installed acceptance
    Corresponding-source SHA256Pending candidate source assembly
    Current owned software licenseAGPL-3.0-only
    Supported acceptance profileWindows x64 fresh install; inspections-preview; separate Station +configuration
    +

    This source candidate renames the distribution, principal import +package and active schema to Townlight identities and advances Meetings +to 1.0.5. Build, signing, installed acceptance and publication remain +pending. Historical tags and receipts keep their original identities and +certify only their identified bytes. Use a fresh profile and empty +database; this candidate provides no in-place legacy upgrade. The +approved profile path remains %LOCALAPPDATA%\CivicSuite. +Preserve existing profiles, data and backups.

    +

    First run

    +
      +
    1. Obtain the identified signed private candidate and its +corresponding-source companion from the beta coordinator. The landing +pages in this documentation are not an installer download service.
    2. +
    3. On the intended fresh Windows test installation, verify the +identified candidate MSI hash and publisher signature before installing. +Preserve unrelated profiles and recovery material. Installed acceptance +for this source candidate remains pending.
    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 targets Windows x64 fresh +installation. Its native shell uses Rust 2021, Tauri 2 +and Microsoft WebView2; browser assets are JavaScript built +with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled +CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and +Alembic, with PostgreSQL 17 / PostGIS and +managed original files. The installed runtime tested here contains +FastAPI 0.162.0. Package minimum Python requirements can differ from the +bundled executable; the metadata reference preserves both. No stack +rewrite is implied by the beta label.

    +

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

    +

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

    +

    Data and consistency

    +

    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 new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

    +

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

    +

    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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

    +

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

    +

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

    +

    Troubleshooting

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

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

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

    +

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

    +

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

    +

    Terms of service and license

    +

    Scope and status

    +

    These terms describe the Townlight Beta 1 software and this +documentation package. This is a locally prepared private beta, not a +hosted-service subscription, a city deployment agreement or a public +release. No uptime commitment, support response time, indemnity, +data-processing agreement or paid service is created by these documents. +A separate signed agreement, if any, governs services it actually +provides.

    +

    Software license and rights

    +

    Current Townlight-owned distributions identified in this candidate +use AGPL-3.0-only. The full license is supplied with +this documentation and with the source companion. The license governs +rights to run, copy, modify and convey the covered software; these +operational terms do not add restrictions to those rights. Historical +grants and dependency licenses retain their own terms. CivicCast remains +a separate product and is not relicensed by this documentation work.

    +

    When conveying covered software, retain applicable notices and +provide the corresponding source and installation/build information +required by the license. For a modified version supporting remote +network interaction, follow section 13’s source-offer requirement. The +companion archive identifies the source for this candidate; a link to a +different public branch is not a substitute for the matching source. +Read the supplied license for the complete conditions. See the GNU license +reference and GNU licensing +FAQ.

    +

    Data ownership and access

    +

    Importing a document does not transfer its ownership or grant +permission to publish it. The operating organization controls its +accounts, access decisions, lawful source use, retention and +review/release policy. Keep resident information, credentials, private +notes and restricted evidence in their authorized locations. +Documentation examples contain fictional data. No real city account, +credential or record is required to exercise these examples in an +isolated test environment.

    +

    Local operation and +external processors

    +

    The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency.

    +

    Staff decisions and +source applicability

    +

    Staff verify the jurisdiction, source currency, permissions, +citations and proposed audience. Model output and generated guidance +require review. No draft is automatically an official legal +interpretation, zoning determination, permit approval, fee assessment, +enforcement notice or records-release decision. Official permit fee +authority remains with the adopted source and responsible organization; +imported amounts do not become a new authoritative calculation.

    +

    Beta operation and recovery

    +

    Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

    +

    Warranty and liability

    +

    The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

    +

    Support and incident +reporting

    +

    Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

    +

    Ending a beta +exercise and document changes

    +

    When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

    +

    Glossary

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

    + +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/notice.html b/docs/beta-1/manuals/notice.html new file mode 100644 index 0000000..376638c --- /dev/null +++ b/docs/beta-1/manuals/notice.html @@ -0,0 +1,198 @@ + + +Townlight Notice Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    +

    Townlight Notice User Manual

    +

    Windows staff workflow — +0.3.0 candidate

    +

    This candidate is prepared; exact signed-installer acceptance is +pending. It supports a fresh profile, not an in-place upgrade of an +unmarked legacy database. The existing compatibility profile path is +retained and existing data is refused before initialization.

    +
      +
    1. Sign in with an account allowed to use Notice and open Public +Notices. Create a draft with title, actual notice text, type, event +date, staff-selected calendar lead days and staff-verified statutory +basis. Save it. Its deadline workpaper uses the shared Core reminder +helper; it does not establish legal sufficiency.
    2. +
    3. Select the saved notice, read the deadline workpaper and source, +enter review notes, then record staff review. Approve that saved +revision only after the responsible staff member has checked the law, +timing, content and channels. Mechanical rule success never removes the +staff-review requirement.
    4. +
    5. Perform official publication outside Townlight. Retain the actual +proof file (up to 5 MB each and 10 MB total for the current approved +content), posting location and actual posting date/time including time +zone. A filename, target system name or checklist alone is not posting +proof.
    6. +
    7. Create the archive after approval and proof. The archive contains +the actual notice, retained proof bytes, review/approval history and a +per-file SHA-256/size manifest. Write and verify the ZIP export to +preserve a usable file. ZIP entry timestamps are fixed for deterministic +packaging; the record contains the recorded posting and audit +times.
    8. +
    9. For a Records handoff, enter the intended Records request UUID and +select Attach archive to Records. This requires Records authority as +well as Notice authority. Townlight retains an exact managed copy, +verifies its hash, attaches it through the canonical Records writer and +reports the request/archive identity and hash. Repeating the same +handoff does not create a duplicate attachment. Open the request in +Records and read back the attached archive. Disclosure still requires +Records review/release authority.
    10. +
    +

    Saved notices and history can be reopened from Public Notices. A +content edit clears the prior review, approval and current proof +selection; historical events/proof/archives remain retained. A stale +open revision is rejected so staff must refresh and review the saved +content. Missing review, approval or actual proof blocks the +corresponding step. Back up/restore the matching complete new-format +profile through System Health; installed restart/recovery acceptance +remains required for this candidate.

    +

    This replaces the disconnected standalone Public Notices controls. +The separate Meetings notice/template/proof workflow remains available +for meeting-specific records; it does not silently approve a different +Notice draft. Staff remain responsible for legal sufficiency, official +publication and the official record. No subscriber message or official +notice is sent automatically.

    +

    Standalone package boundary

    +

    The standalone FastAPI routes below remain registry/deadline/proof +workpapers and deterministic planning helpers. The Windows authenticated +lifecycle above is provided by the suite runtime using Notice’s durable +workflow store; it is not a claim that every standalone helper performs +an archive or Records transfer. Fixed rule packs are review aids and are +not administered jurisdiction/effective-date legal rules. +Subscriber/channel/accessibility/export helpers retain their documented +planning boundaries.

    +

    For Non-Technical Users

    +

    Townlight Notice helps city staff organize public hearing notices, +legal notices, bid notices, vacancy notices, publication deadlines, +channel planning notes, accessibility and language-readiness checks, +proof requirements, subscriber delivery plans, archive/handoff packets, +and export manifests. It can create a sample notice registry stub, build +publication deadline reminders, check a draft packet against +deterministic staff-review rules, create a staff-editable notice +template, retrieve saved registry/deadline/publication-proof workpapers +when IT enables persistence, assemble publication-readiness checklists, +summarize channel planning, build +accessibility/plain-language/translation readiness packets, build +subscriber delivery plans, assemble archive/handoff packets, and +assemble a notice/records export checklist.

    +

    Release state: 0.3.0 is the prepared naming/lifecycle candidate, +paired with Townlight Core 1.3.0.dev2. No new standalone release or +installed acceptance is claimed here.

    +

    For IT and Technical Staff

    +

    Townlight Notice is a FastAPI Python package pinned to the +townlight-core 1.3.0.dev2 release wheel. The current +runtime exposes:

    +

    Set TOWNLIGHT_NOTICE_WORKPAPER_DB_URL to enable +SQLAlchemy-backed notice registry, deadline-plan, and publication-proof +records. Leave it unset for deterministic stateless operation: registry +and deadline POST requests return transient payloads, persisted GET +routes return actionable 503 responses, and publication-proof storage is +unavailable. When persistence is enabled, set +TOWNLIGHT_NOTICE_TRUSTED_WRITE_TOKEN and send the matching +X-Townlight-Notice-Write-Token header for durable write +routes.

    +
      +
    • GET /
    • +
    • GET /health
    • +
    • GET /townlight_notice
    • +
    • GET /docs
    • +
    • GET /openapi.json
    • +
    • POST /api/v1/townlight_notice/registry
    • +
    • GET /api/v1/townlight_notice/registry/{record_id}
    • +
    • POST /api/v1/townlight_notice/deadlines
    • +
    • GET /api/v1/townlight_notice/deadlines/{plan_id}
    • +
    • POST /api/v1/townlight_notice/rule-check
    • +
    • POST /api/v1/townlight_notice/templates
    • +
    • POST /api/v1/townlight_notice/publication-proof
    • +
    • GET /api/v1/townlight_notice/publication-proof/{proof_id}
    • +
    • POST /api/v1/townlight_notice/publication-check
    • +
    • POST /api/v1/townlight_notice/accessibility-review
    • +
    • POST /api/v1/townlight_notice/channels
    • +
    • POST /api/v1/townlight_notice/subscribers/plan
    • +
    • POST /api/v1/townlight_notice/archive-packet
    • +
    • POST /api/v1/townlight_notice/export
    • +
    +

    +

    Start and Smoke-Check +Townlight Notice

    +

    A fresh user can reach the core stateless API and public sample UI +without a database, model server, account, or API key. Start the ASGI +app target townlight_notice.main:app, then confirm +/health reports Townlight Notice 0.3.0 and +Townlight Core 1.2.0.

    +

    Minimal smoke-check workflow:

    +
      +
    1. Create a transient registry stub with +/api/v1/townlight_notice/registry.
    2. +
    3. Open /docs or /openapi.json to inspect +accepted fields, then create a deterministic rule check with +/api/v1/townlight_notice/rule-check. Unsupported notice +types return supported choices instead of silently falling back to a +generic rule.
    4. +
    5. Open /townlight_notice and confirm it is a static +public sample with boundary copy.
    6. +
    7. If durable workpapers are enabled, confirm the trusted write token +is configured before testing persistence-backed writes.
    8. +
    +

    Run:

    +
    python -m pip install -e ".[dev]"
    +python -m pytest -q
    +bash scripts/verify-release.sh
    +

    Architecture

    +
    flowchart LR
    +  Staff["Clerk / communications / purchasing staff"] --> Townlight Notice["Townlight Notice"]
    +  Townlight Notice --> Townlight Core["Townlight Core 1.3.0.dev2"]
    +  Townlight Notice -. future handoff .-> Townlight Meetings["Townlight Meetings v0.1.0"]
    +  Townlight Notice -. future handoff .-> CivicProcure["CivicProcure v0.1.1"]
    +  Townlight Notice --> Export["Notice and records export checklist"]
    +

    Townlight Notice depends on Townlight Core. Townlight Core does not +depend on Townlight Notice. Townlight Notice v0.3.0 uses the shared +Townlight Core notice deadline helper plus deterministic sample notice +data, staff-review rule packs, notice templates, accessibility and +language-readiness packets, subscriber delivery plans, archive/handoff +packets, and optional publication-proof workpapers only; live +agenda/procurement handoffs, legal sufficiency decisions, legal advice, +official notice publication, publication-system write-back, and +production notice-system integrations are future work.

    +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/permitting.html b/docs/beta-1/manuals/permitting.html new file mode 100644 index 0000000..cbcf4b7 --- /dev/null +++ b/docs/beta-1/manuals/permitting.html @@ -0,0 +1,981 @@ + + +Townlight Permitting Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    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
    Intended installer version1.7.0.1; build and acceptance pending
    Product componenttownlight-permitting 0.3.0+dev.2
    Principal import packagetownlight_permitting
    Native desktop source version1.7.0-1
    Candidate hashesPending candidate build, signing and installed acceptance
    Current owned software licenseAGPL-3.0-only
    Acceptance compositionFresh Windows x64 profile; inspections-preview; Station configured +separately
    +

    The naming change advances this package’s version and requires a new +signed installer and installed acceptance. Those steps and publication +remain pending. Historical tags, receipts and archived manuals keep +their original names and certify only their identified artifacts. Use an +empty database and fresh profile; no in-place legacy upgrade is +supported. The approved Windows profile path remains +%LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data +and recovery material.

    +

    First run

    +
      +
    1. Obtain the identified signed private candidate and its +corresponding-source companion from the beta coordinator. The landing +pages in this documentation are not an installer download service.
    2. +
    3. On the intended fresh Windows test installation, verify the MSI hash +and publisher signature before installing. Preserve unrelated profiles +and recovery material. Installed acceptance for this source candidate +remains pending; no in-place legacy upgrade is supported.
    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 targets Windows x64 fresh +installation. Its native shell uses Rust 2021, Tauri 2 +and Microsoft WebView2; browser assets are JavaScript built +with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled +CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and +Alembic, with PostgreSQL 17 / PostGIS and +managed original files. The installed runtime tested here contains +FastAPI 0.162.0. Package minimum Python requirements can differ from the +bundled executable; the metadata reference preserves both. No stack +rewrite is implied by the beta label.

    +

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

    +

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

    +

    Data and consistency

    +

    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 new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

    +

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

    +

    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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

    +

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

    +

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

    +

    Troubleshooting

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

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

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

    +

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

    +

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

    +

    Terms of service and license

    +

    Scope and status

    +

    These terms describe the Townlight Beta 1 software and this +documentation package. This is a locally prepared private beta, not a +hosted-service subscription, a city deployment agreement or a public +release. No uptime commitment, support response time, indemnity, +data-processing agreement or paid service is created by these documents. +A separate signed agreement, if any, governs services it actually +provides.

    +

    Software license and rights

    +

    Current Townlight-owned distributions identified in this candidate +use AGPL-3.0-only. The full license is supplied with +this documentation and with the source companion. The license governs +rights to run, copy, modify and convey the covered software; these +operational terms do not add restrictions to those rights. Historical +grants and dependency licenses retain their own terms. CivicCast remains +a separate product and is not relicensed by this documentation work.

    +

    When conveying covered software, retain applicable notices and +provide the corresponding source and installation/build information +required by the license. For a modified version supporting remote +network interaction, follow section 13’s source-offer requirement. The +companion archive identifies the source for this candidate; a link to a +different public branch is not a substitute for the matching source. +Read the supplied license for the complete conditions. See the GNU license +reference and GNU licensing +FAQ.

    +

    Data ownership and access

    +

    Importing a document does not transfer its ownership or grant +permission to publish it. The operating organization controls its +accounts, access decisions, lawful source use, retention and +review/release policy. Keep resident information, credentials, private +notes and restricted evidence in their authorized locations. +Documentation examples contain fictional data. No real city account, +credential or record is required to exercise these examples in an +isolated test environment.

    +

    Local operation and +external processors

    +

    The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency.

    +

    Staff decisions and +source applicability

    +

    Staff verify the jurisdiction, source currency, permissions, +citations and proposed audience. Model output and generated guidance +require review. No draft is automatically an official legal +interpretation, zoning determination, permit approval, fee assessment, +enforcement notice or records-release decision. Official permit fee +authority remains with the adopted source and responsible organization; +imported amounts do not become a new authoritative calculation.

    +

    Beta operation and recovery

    +

    Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

    +

    Warranty and liability

    +

    The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

    +

    Support and incident +reporting

    +

    Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

    +

    Ending a beta +exercise and document changes

    +

    When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

    +

    Glossary

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

    + +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/planning.html b/docs/beta-1/manuals/planning.html new file mode 100644 index 0000000..d6066c9 --- /dev/null +++ b/docs/beta-1/manuals/planning.html @@ -0,0 +1,1013 @@ + + +Townlight Planning Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    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
    Intended installer version1.7.0.1; build and acceptance pending
    Product componenttownlight-planning 0.4.0.dev2
    Principal import packagetownlight_planning
    Native desktop source version1.7.0-1
    Candidate hashesPending candidate build, signing and installed acceptance
    Current owned software licenseAGPL-3.0-only
    Acceptance compositionFresh Windows x64 profile; inspections-preview; Station configured +separately
    +

    The naming change advances this package’s version and requires a new +signed installer and installed acceptance. Those steps and publication +remain pending. Historical tags, receipts and archived manuals keep +their original names and certify only their identified artifacts. Use an +empty database and fresh profile; no in-place legacy upgrade is +supported. The approved Windows profile path remains +%LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data +and recovery material.

    +

    First run

    +
      +
    1. Obtain the identified signed private candidate and its +corresponding-source companion from the beta coordinator. The landing +pages in this documentation are not an installer download service.
    2. +
    3. On the intended fresh Windows test installation, verify the MSI hash +and publisher signature before installing. Preserve unrelated profiles +and recovery material. Installed acceptance for this source candidate +remains pending; no in-place legacy upgrade is supported.
    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 targets Windows x64 fresh +installation. Its native shell uses Rust 2021, Tauri 2 +and Microsoft WebView2; browser assets are JavaScript built +with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled +CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and +Alembic, with PostgreSQL 17 / PostGIS and +managed original files. The installed runtime tested here contains +FastAPI 0.162.0. Package minimum Python requirements can differ from the +bundled executable; the metadata reference preserves both. No stack +rewrite is implied by the beta label.

    +

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

    +

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

    +

    Data and consistency

    +

    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 new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

    +

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

    +

    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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

    +

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

    +

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

    +

    Troubleshooting

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

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

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

    +

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

    +

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

    +

    Terms of service and license

    +

    Scope and status

    +

    These terms describe the Townlight Beta 1 software and this +documentation package. This is a locally prepared private beta, not a +hosted-service subscription, a city deployment agreement or a public +release. No uptime commitment, support response time, indemnity, +data-processing agreement or paid service is created by these documents. +A separate signed agreement, if any, governs services it actually +provides.

    +

    Software license and rights

    +

    Current Townlight-owned distributions identified in this candidate +use AGPL-3.0-only. The full license is supplied with +this documentation and with the source companion. The license governs +rights to run, copy, modify and convey the covered software; these +operational terms do not add restrictions to those rights. Historical +grants and dependency licenses retain their own terms. CivicCast remains +a separate product and is not relicensed by this documentation work.

    +

    When conveying covered software, retain applicable notices and +provide the corresponding source and installation/build information +required by the license. For a modified version supporting remote +network interaction, follow section 13’s source-offer requirement. The +companion archive identifies the source for this candidate; a link to a +different public branch is not a substitute for the matching source. +Read the supplied license for the complete conditions. See the GNU license +reference and GNU licensing +FAQ.

    +

    Data ownership and access

    +

    Importing a document does not transfer its ownership or grant +permission to publish it. The operating organization controls its +accounts, access decisions, lawful source use, retention and +review/release policy. Keep resident information, credentials, private +notes and restricted evidence in their authorized locations. +Documentation examples contain fictional data. No real city account, +credential or record is required to exercise these examples in an +isolated test environment.

    +

    Local operation and +external processors

    +

    The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency.

    +

    Staff decisions and +source applicability

    +

    Staff verify the jurisdiction, source currency, permissions, +citations and proposed audience. Model output and generated guidance +require review. No draft is automatically an official legal +interpretation, zoning determination, permit approval, fee assessment, +enforcement notice or records-release decision. Official permit fee +authority remains with the adopted source and responsible organization; +imported amounts do not become a new authoritative calculation.

    +

    Beta operation and recovery

    +

    Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

    +

    Warranty and liability

    +

    The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

    +

    Support and incident +reporting

    +

    Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

    +

    Ending a beta +exercise and document changes

    +

    When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

    +

    Glossary

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

    + +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/records.html b/docs/beta-1/manuals/records.html new file mode 100644 index 0000000..31905a3 --- /dev/null +++ b/docs/beta-1/manuals/records.html @@ -0,0 +1,1027 @@ + + +Townlight Records Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    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
    Intended installer version1.7.0.1; build and acceptance pending
    Product componenttownlight-records 1.8.0.dev2
    Principal import packagetownlight_records
    Native desktop source version1.7.0-1
    Candidate hashesPending candidate build, signing and installed acceptance
    Current owned software licenseAGPL-3.0-only
    Acceptance compositionFresh Windows x64 profile; inspections-preview; Station configured +separately
    +

    The naming change advances this package’s version and requires a new +signed installer and installed acceptance. Those steps and publication +remain pending. Historical tags, receipts and archived manuals keep +their original names and certify only their identified artifacts. Use an +empty database and fresh profile; no in-place legacy upgrade is +supported. The approved Windows profile path remains +%LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data +and recovery material.

    +

    First run

    +
      +
    1. Obtain the identified signed private candidate and its +corresponding-source companion from the beta coordinator. The landing +pages in this documentation are not an installer download service.
    2. +
    3. On the intended fresh Windows test installation, verify the MSI hash +and publisher signature before installing. Preserve unrelated profiles +and recovery material. Installed acceptance for this source candidate +remains pending; no in-place legacy upgrade is supported.
    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 targets Windows x64 fresh +installation. Its native shell uses Rust 2021, Tauri 2 +and Microsoft WebView2; browser assets are JavaScript built +with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled +CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and +Alembic, with PostgreSQL 17 / PostGIS and +managed original files. The installed runtime tested here contains +FastAPI 0.162.0. Package minimum Python requirements can differ from the +bundled executable; the metadata reference preserves both. No stack +rewrite is implied by the beta label.

    +

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

    +

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

    +

    Data and consistency

    +

    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 new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

    +

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

    +

    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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

    +

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

    +

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

    +

    Troubleshooting

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

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

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

    +

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

    +

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

    +

    Terms of service and license

    +

    Scope and status

    +

    These terms describe the Townlight Beta 1 software and this +documentation package. This is a locally prepared private beta, not a +hosted-service subscription, a city deployment agreement or a public +release. No uptime commitment, support response time, indemnity, +data-processing agreement or paid service is created by these documents. +A separate signed agreement, if any, governs services it actually +provides.

    +

    Software license and rights

    +

    Current Townlight-owned distributions identified in this candidate +use AGPL-3.0-only. The full license is supplied with +this documentation and with the source companion. The license governs +rights to run, copy, modify and convey the covered software; these +operational terms do not add restrictions to those rights. Historical +grants and dependency licenses retain their own terms. CivicCast remains +a separate product and is not relicensed by this documentation work.

    +

    When conveying covered software, retain applicable notices and +provide the corresponding source and installation/build information +required by the license. For a modified version supporting remote +network interaction, follow section 13’s source-offer requirement. The +companion archive identifies the source for this candidate; a link to a +different public branch is not a substitute for the matching source. +Read the supplied license for the complete conditions. See the GNU license +reference and GNU licensing +FAQ.

    +

    Data ownership and access

    +

    Importing a document does not transfer its ownership or grant +permission to publish it. The operating organization controls its +accounts, access decisions, lawful source use, retention and +review/release policy. Keep resident information, credentials, private +notes and restricted evidence in their authorized locations. +Documentation examples contain fictional data. No real city account, +credential or record is required to exercise these examples in an +isolated test environment.

    +

    Local operation and +external processors

    +

    The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency.

    +

    Staff decisions and +source applicability

    +

    Staff verify the jurisdiction, source currency, permissions, +citations and proposed audience. Model output and generated guidance +require review. No draft is automatically an official legal +interpretation, zoning determination, permit approval, fee assessment, +enforcement notice or records-release decision. Official permit fee +authority remains with the adopted source and responsible organization; +imported amounts do not become a new authoritative calculation.

    +

    Beta operation and recovery

    +

    Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

    +

    Warranty and liability

    +

    The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

    +

    Support and incident +reporting

    +

    Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

    +

    Ending a beta +exercise and document changes

    +

    When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

    +

    Glossary

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

    + +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/station.html b/docs/beta-1/manuals/station.html new file mode 100644 index 0000000..546a049 --- /dev/null +++ b/docs/beta-1/manuals/station.html @@ -0,0 +1,1588 @@ + + +Townlight Station Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    Townlight Station Manual

    +

    Prepared naming, Access and Notice candidate — 2 November 2026. +Station’s existing Beta 1 Python service remains +townlight-station 0.3.0 / townlight_station. +Its separate Rust development line and standalone CivicCast are outside +this migration. Exact signed Windows installed acceptance and +publication for the coordinated candidate remain pending.

    +

    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.7.0.1; build and installed acceptance pending
    Desktop source1.7.0-1
    Runtime distributiontownlight-runtime 0.2.0
    Station distribution/importtownlight-station 0.3.0 / townlight_station
    Acceptance compositionFresh Windows x64; inspections-preview; Station configured +separately
    Candidate hashes/signaturePending new build and signing
    Owned software licenseAGPL-3.0-only
    +

    This edition updates the paired-runtime instructions for the naming +candidate. It does not rename historical Station artifacts or claim new +Station software features. Use an empty database and fresh profile; no +in-place legacy upgrade or old import shim is supported. Preserve +existing city data and the prior release. The approved profile path +remains %LOCALAPPDATA%\CivicSuite for that path only.

    +

    First run

    +
      +
    1. When the identified new signed candidate and corresponding-source +companion are available, verify their exact release identity with the +beta coordinator. The landing pages in this documentation are not an +installer download service.
    2. +
    3. On the intended fresh Windows test installation, verify the MSI hash +and publisher signature before installing. Preserve unrelated profiles +and recovery material. Installed acceptance for this naming candidate +remains pending; no in-place legacy upgrade is supported.
    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 targets Windows x64 fresh +installation. Its native shell uses Rust 2021, Tauri 2 +and Microsoft WebView2; browser assets are JavaScript built +with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled +CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and +Alembic, with PostgreSQL 17 / PostGIS and +managed original files. The installed runtime tested here contains +FastAPI 0.162.0. Package minimum Python requirements can differ from the +bundled executable; the metadata reference preserves both. No stack +rewrite is implied by the beta label.

    +

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

    +

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

    +

    Data and consistency

    +

    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 original accepted Station manual and its workflow claims are +preserved byte +for byte. Those results identify earlier artifacts; they are not +installed signoff for this naming candidate. The current package retains +the same Beta Python service and pinned CivicCast donor. Source presence +and a successful wheel import do not establish the required Windows +Meetings → Station → Records handoff.

    +

    The new candidate must verify actual saved meeting/agenda context, +authorized Station capture and stop, completed media/hash readback, +private Records handoff, idempotency, authorization/logout, persistence +and the agreed recovery path. Its ACCEPTANCE.md must distinguish new +proof from justified reused evidence. This source documentation does not +certify a signed MSI, live YouTube upload, physical PEG broadcast, city +deployment or long-duration commissioning.

    +

    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 is a locally prepared private beta, not a +hosted-service subscription, a city deployment agreement or a public +release. No uptime commitment, support response time, indemnity, +data-processing agreement or paid service is created by these documents. +A separate signed agreement, if any, governs services it actually +provides.

    +

    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 bounded beta workflow uses named staff accounts; current +installed acceptance is pending. Station has separate storage and +credentials. Configure backup destinations and optional model/network +providers deliberately. A configured external provider may receive +submitted prompts, images or audio according to that configuration and +provider’s terms; this documentation does not promise that every +optional configuration is offline. An email outbox or local public view +does not establish external delivery or an internet deployment. This +static documentation site has no analytics, account collection or remote +font dependency.

    +

    Staff decisions and +source applicability

    +

    Staff verify the jurisdiction, source currency, permissions, +citations and proposed audience. Model output and generated guidance +require review. No draft is automatically an official legal +interpretation, zoning determination, permit approval, fee assessment, +enforcement notice or records-release decision. Official permit fee +authority remains with the adopted source and responsible organization; +imported amounts do not become a new authoritative calculation.

    +

    Beta operation and recovery

    +

    Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

    +

    Warranty and liability

    +

    The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

    +

    Support and incident +reporting

    +

    Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

    +

    Ending a beta +exercise and document changes

    +

    When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

    +

    Glossary

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    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 carries forward the accepted Station operating +procedures and updates paired-runtime names from the current naming +source candidate. Historical evidence remains in the original manual. +Candidate source commits, MSI signature/hash and exact installed +acceptance must be finalized separately; no current signing receipt or +installed-domain proof is implied by rendering this manual.

    +

    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.
    • +
    +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/suite.html b/docs/beta-1/manuals/suite.html new file mode 100644 index 0000000..e51eec9 --- /dev/null +++ b/docs/beta-1/manuals/suite.html @@ -0,0 +1,1130 @@ + + +Townlight Suite Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    Townlight Suite Manual

    +
    +

    Naming, Access and Notice candidate — 2 November +2026. These instructions describe the prepared 1.7.0-1 source +candidate. Build, signing, Windows installed acceptance and publication +remain pending. The earlier Station delivery release and its original +receipts remain historical evidence for their exact artifacts.

    +
    +

    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
    Intended installer version1.7.0.1; build and acceptance pending
    Native desktop source version1.7.0-1
    Candidate artifact identityNot yet built; use candidate-specific ACCEPTANCE.md and +SHA256SUMS.txt when issued
    Corresponding sourceCoordinated naming, Access and Notice source candidate
    Current owned software licenseAGPL-3.0-only
    Supported acceptance profileWindows x64 fresh install; inspections-preview; separate Station +configuration
    +

    The changed packages and native application advance their own +versions. This candidate requires a new signed installer and new +installed acceptance; earlier receipts do not certify it. Historical +tags, receipts and archived manuals retain their original identities. +Use a fresh profile and empty database. This candidate refuses legacy +initialization; it does not provide an in-place upgrade. The Windows +profile path remains %LOCALAPPDATA%\CivicSuite under +Scott’s explicit exception. Preserve existing profiles and backups.

    +

    Component versions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDistributionCandidate version
    Coretownlight-core1.3.0.dev2
    Recordstownlight-records1.8.0.dev2
    Meetingstownlight-meetings1.0.5
    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.0
    Accesstownlight-access0.5.0
    Noticetownlight-notice0.3.0
    Local runtimetownlight-runtime0.2.0
    +

    First run

    +
      +
    1. Obtain the identified naming/Access/Notice candidate MSI, matching +source/documentation and candidate-specific checksums after they are +issued. The prior Station delivery download is an earlier artifact.
    2. +
    3. Use a fresh Windows test installation and verify the candidate’s MSI +hash and publisher signature before installing. Preserve unrelated +profiles and recovery material. Windows installed acceptance for this +source candidate remains pending.
    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

    +

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

    +

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

    +

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

    +

    Data and consistency

    +

    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 new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

    +

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

    +

    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 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 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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

    +

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

    +

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

    +

    Troubleshooting

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

    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    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 following baseline results come from the previously accepted +signed candidate’s fresh normal-profile Sandbox exercise: real native +IPC/HTTP/PostgreSQL and selected headless controls. All accounts, source +bundles and media were synthetic. The guest install/uninstall and +recovery passed, and the owned Sandbox stopped. No host installed +application or standalone CivicCast was changed. Those baseline receipts +are retained for unchanged workflows. The accompanying ACCEPTANCE.md +records the separate installed verification and exact identity of this +new Station delivery candidate.

    +

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

    +

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

    +

    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

    +

    Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

    +

    Warranty and liability

    +

    The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

    +

    Support and incident +reporting

    +

    Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

    +

    Ending a beta +exercise and document changes

    +

    When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

    +

    Glossary

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    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.
    • +
    +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ No newline at end of file diff --git a/docs/beta-1/manuals/zoning.html b/docs/beta-1/manuals/zoning.html new file mode 100644 index 0000000..9234293 --- /dev/null +++ b/docs/beta-1/manuals/zoning.html @@ -0,0 +1,1002 @@ + + +Townlight Zoning Manual | Townlight candidate + +
    Townlight +
    +

    Naming, Access and Notice source candidate · 2 November 2026

    +

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

    + + +

    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
    Intended installer version1.7.0.1; build and acceptance pending
    Product componenttownlight-zoning 0.2.3
    Principal import packagetownlight_zoning
    Native desktop source version1.7.0-1
    Candidate hashesPending candidate build, signing and installed acceptance
    Current owned software licenseAGPL-3.0-only
    Acceptance compositionFresh Windows x64 profile; inspections-preview; Station configured +separately
    +

    The naming change advances this package’s version and requires a new +signed installer and installed acceptance. Those steps and publication +remain pending. Historical tags, receipts and archived manuals keep +their original names and certify only their identified artifacts. Use an +empty database and fresh profile; no in-place legacy upgrade is +supported. The approved Windows profile path remains +%LOCALAPPDATA%\CivicSuite. Preserve existing profiles, data +and recovery material.

    +

    First run

    +
      +
    1. Obtain the identified signed private candidate and its +corresponding-source companion from the beta coordinator. The landing +pages in this documentation are not an installer download service.
    2. +
    3. On the intended fresh Windows test installation, verify the MSI hash +and publisher signature before installing. Preserve unrelated profiles +and recovery material. Installed acceptance for this source candidate +remains pending; no in-place legacy upgrade is supported.
    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 targets Windows x64 fresh +installation. Its native shell uses Rust 2021, Tauri 2 +and Microsoft WebView2; browser assets are JavaScript built +with Vite 8.1.6. This describes the native desktop +frontend; Station has a separate React operator, specified below or in +its product manual. Canonical business workflows use bundled +CPython 3.13.5, FastAPI, Pydantic, SQLAlchemy and +Alembic, with PostgreSQL 17 / PostGIS and +managed original files. The installed runtime tested here contains +FastAPI 0.162.0. Package minimum Python requirements can differ from the +bundled executable; the metadata reference preserves both. No stack +rewrite is implied by the beta label.

    +

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

    +

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

    +

    Data and consistency

    +

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

    +

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

    +

    Capacity and platform +statements

    +

    This beta has synthetic single-profile workflow evidence. It does not +have a published benchmark for concurrent staff capacity, minimum +RAM/CPU, large-source limits or a field SLA. Do not turn a developer +machine’s specification into a supported minimum. The new installer size +remains pending its build; allow additional disk for extracted runtime, +database, originals, exports, media and backups. Select +equipment/storage after sizing those actual workloads.

    +

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

    +

    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 fresh-profile acceptance verified that a fulfilled +request survived restore and a post-backup marker did not.

    +

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

    +

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

    +

    Troubleshooting

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

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

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

    +

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

    +

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

    +

    Terms of service and license

    +

    Scope and status

    +

    These terms describe the Townlight Beta 1 software and this +documentation package. This is a locally prepared private beta, not a +hosted-service subscription, a city deployment agreement or a public +release. No uptime commitment, support response time, indemnity, +data-processing agreement or paid service is created by these documents. +A separate signed agreement, if any, governs services it actually +provides.

    +

    Software license and rights

    +

    Current Townlight-owned distributions identified in this candidate +use AGPL-3.0-only. The full license is supplied with +this documentation and with the source companion. The license governs +rights to run, copy, modify and convey the covered software; these +operational terms do not add restrictions to those rights. Historical +grants and dependency licenses retain their own terms. CivicCast remains +a separate product and is not relicensed by this documentation work.

    +

    When conveying covered software, retain applicable notices and +provide the corresponding source and installation/build information +required by the license. For a modified version supporting remote +network interaction, follow section 13’s source-offer requirement. The +companion archive identifies the source for this candidate; a link to a +different public branch is not a substitute for the matching source. +Read the supplied license for the complete conditions. See the GNU license +reference and GNU licensing +FAQ.

    +

    Data ownership and access

    +

    Importing a document does not transfer its ownership or grant +permission to publish it. The operating organization controls its +accounts, access decisions, lawful source use, retention and +review/release policy. Keep resident information, credentials, private +notes and restricted evidence in their authorized locations. +Documentation examples contain fictional data. No real city account, +credential or record is required to exercise these examples in an +isolated test environment.

    +

    Local operation and +external processors

    +

    The accepted beta workflow is local and uses named staff accounts. +Station has separate storage and credentials. Configure backup +destinations and optional model/network providers deliberately. A +configured external provider may receive submitted prompts, images or +audio according to that configuration and provider’s terms; this +documentation does not promise that every optional configuration is +offline. An email outbox or local public view does not establish +external delivery or an internet deployment. This static documentation +site has no analytics, account collection or remote font dependency.

    +

    Staff decisions and +source applicability

    +

    Staff verify the jurisdiction, source currency, permissions, +citations and proposed audience. Model output and generated guidance +require review. No draft is automatically an official legal +interpretation, zoning determination, permit approval, fee assessment, +enforcement notice or records-release decision. Official permit fee +authority remains with the adopted source and responsible organization; +imported amounts do not become a new authoritative calculation.

    +

    Beta operation and recovery

    +

    Use the identified candidate in its supported fresh-install scope. +Preserve backups and original evidence. Test physical equipment and +chosen network/service configuration before relying on them. The +supplied acceptance describes selected synthetic workflows, not every +screen, vendor, field condition or upgrade. Operators decide whether a +particular deployment meets their own operational obligations.

    +

    Warranty and liability

    +

    The covered software’s warranty and liability conditions are those in +sections 15–17 of the supplied AGPL and any applicable separate written +undertaking. This documentation creates no additional warranty or +limitation beyond those terms. Third-party software is subject to its +retained license notices. Nothing here removes rights that applicable +law makes nonwaivable.

    +

    Support and incident +reporting

    +

    Use the project’s existing SUPPORT and SECURITY guidance for its +matching repository. Report reproducible behavior with the version, +operation and redacted logs. Do not put credentials, resident records or +unredacted evidence in a public issue. Coordinate sensitive reports +through the channel designated in SECURITY. No new support address or +service commitment is invented here.

    +

    Ending a beta +exercise and document changes

    +

    When an organization ends testing, it controls retention/export and +removes access according to its policy. Uninstall may retain data; back +up and inspect the selected removal options. Ending an exercise does not +revoke rights already granted by AGPL. Later software/documentation +versions must identify their changed candidate and scope; historical +receipts retain their original identities. These terms do not claim that +a city has accepted a contract merely by reading a manual.

    +

    Glossary

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

    + +
    Townlight · AGPL-3.0-only · Candidate evidence applies only to its identified artifacts.
    \ 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 new file mode 100644 index 0000000..33bcd16 Binary files /dev/null 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 new file mode 100644 index 0000000..fea714a Binary files /dev/null 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 a0c6709..cb3ea25 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 new file mode 100644 index 0000000..7499ce6 Binary files /dev/null and b/docs/beta-1/pdf/Townlight-Inspections-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 new file mode 100644 index 0000000..6edec5f Binary files /dev/null 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 new file mode 100644 index 0000000..a481c71 Binary files /dev/null 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 new file mode 100644 index 0000000..703dd9a Binary files /dev/null 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 new file mode 100644 index 0000000..99af0d7 Binary files /dev/null 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 new file mode 100644 index 0000000..6be87db Binary files /dev/null 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 new file mode 100644 index 0000000..ec10ff1 Binary files /dev/null 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 new file mode 100644 index 0000000..791cf6d Binary files /dev/null and b/docs/beta-1/pdf/Townlight-Suite-Manual-Beta-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 new file mode 100644 index 0000000..976f000 Binary files /dev/null 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 new file mode 100644 index 0000000..fed0faf --- /dev/null +++ b/docs/beta-1/products/access/index.html @@ -0,0 +1 @@ +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 scope

    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/code/index.html b/docs/beta-1/products/code/index.html new file mode 100644 index 0000000..b3a960e --- /dev/null +++ b/docs/beta-1/products/code/index.html @@ -0,0 +1 @@ +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 scope
    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/core/index.html b/docs/beta-1/products/core/index.html new file mode 100644 index 0000000..7411da9 --- /dev/null +++ b/docs/beta-1/products/core/index.html @@ -0,0 +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 scope
    For IT administrators and platform maintainers

    What the workflow delivers

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

    Connected evidence

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

    Know the beta boundary

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

    Architecture

    Where the evidence goes

    Townlight Core architecture and evidence flow

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

    Evidence rather than promises

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/inspections/index.html b/docs/beta-1/products/inspections/index.html new file mode 100644 index 0000000..3081289 --- /dev/null +++ b/docs/beta-1/products/inspections/index.html @@ -0,0 +1 @@ +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 scope
    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/meetings/index.html b/docs/beta-1/products/meetings/index.html new file mode 100644 index 0000000..1c9ca0d --- /dev/null +++ b/docs/beta-1/products/meetings/index.html @@ -0,0 +1 @@ +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 scope
    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/notice/index.html b/docs/beta-1/products/notice/index.html new file mode 100644 index 0000000..92c163d --- /dev/null +++ b/docs/beta-1/products/notice/index.html @@ -0,0 +1 @@ +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 scope

    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/permitting/index.html b/docs/beta-1/products/permitting/index.html new file mode 100644 index 0000000..a540d6a --- /dev/null +++ b/docs/beta-1/products/permitting/index.html @@ -0,0 +1 @@ +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 scope
    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/planning/index.html b/docs/beta-1/products/planning/index.html new file mode 100644 index 0000000..a5ee7a7 --- /dev/null +++ b/docs/beta-1/products/planning/index.html @@ -0,0 +1 @@ +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 scope
    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/records/index.html b/docs/beta-1/products/records/index.html new file mode 100644 index 0000000..9e50ffd --- /dev/null +++ b/docs/beta-1/products/records/index.html @@ -0,0 +1 @@ +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 scope
    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/products/station/index.html b/docs/beta-1/products/station/index.html new file mode 100644 index 0000000..2cb7f05 --- /dev/null +++ b/docs/beta-1/products/station/index.html @@ -0,0 +1 @@ +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 scope
    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

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    Station delivery update

    Live cable coverage and recorded video delivery

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

    Setup, staff steps and API examples

    \ No newline at end of file diff --git a/docs/beta-1/products/zoning/index.html b/docs/beta-1/products/zoning/index.html new file mode 100644 index 0000000..f21707e --- /dev/null +++ b/docs/beta-1/products/zoning/index.html @@ -0,0 +1 @@ +Townlight Zoning | Townlight Beta 1
    townlightTownlight Beta 1
    Townlight Zoning · Townlight Beta 1

    Bring parcel context and cited rules into one review.

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

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

    What the workflow delivers

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

    Connected evidence

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

    Know the beta boundary

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

    Architecture

    Where the evidence goes

    Townlight Zoning architecture and evidence flow

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

    Evidence rather than promises

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/beta-1/readmes/core.html b/docs/beta-1/readmes/core.html index 533343d..3c30056 100644 --- a/docs/beta-1/readmes/core.html +++ b/docs/beta-1/readmes/core.html @@ -84,7 +84,7 @@

    Exact version and candidate

    Product component -civiccore 1.3.0.dev1 +townlight_core 1.3.0.dev1 Native desktop source version @@ -295,7 +295,7 @@

    Native deployment installed workspace.

    Technical deployments use TOWNLIGHT_PRODUCT_PROFILE, TOWNLIGHT_PROFILE_ROOT, DATABASE_URL, -CIVICSUITE_RUNTIME_PORT, PORTAL_MODE and the +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 @@ -325,7 +325,7 @@

    Trusted local HTTP example

    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'
    +class="sourceCode powershell">$profilePath = Join-Path $env:LOCALAPPDATA 'Townlight'
     $sessionPath = Join-Path $profilePath 'config\local-session.json'
     $session = Get-Content -LiteralPath $sessionPath -Raw | ConvertFrom-Json
     $headers = @{ 'X-Townlight-Session' = $session.session_hash }
    @@ -339,7 +339,7 @@ 

    A synthetic write independently under the signed-in synthetic account. If a write times out, inspect current records before repeating it.

    $profilePath = Join-Path $env:LOCALAPPDATA 'CivicSuite'
    +class="sourceCode powershell">$profilePath = Join-Path $env:LOCALAPPDATA 'Townlight'
     $sessionPath = Join-Path $profilePath 'config/local-session.json'
     $session = Get-Content -LiteralPath $sessionPath -Raw | ConvertFrom-Json
     $headers = @{ 'X-Townlight-Session' = $session.session_hash }
    @@ -446,11 +446,11 @@ 

    Development and repository runtime lock when reproducing packaging.

    Relevant source contracts:

      -
    • civiccore/auth
    • -
    • civiccore/catalog
    • -
    • civiccore/exemptions
    • -
    • civiccore/scaffold
    • -
    • civicsuite_runtime/services.py
    • +
    • townlight_core/auth
    • +
    • townlight_core/catalog
    • +
    • townlight_core/exemptions
    • +
    • townlight_core/scaffold
    • +
    • townlight_runtime/services.py
    • desktop/src-tauri/src/supervisor.rs

    The desktop package defines npm run build, diff --git a/docs/beta-1/reference/component-metadata.json b/docs/beta-1/reference/component-metadata.json index e3d8ca5..6a78a48 100644 --- a/docs/beta-1/reference/component-metadata.json +++ b/docs/beta-1/reference/component-metadata.json @@ -1,7 +1,7 @@ { - "civicaccess-0.4.0.dist-info": { + "townlight_access-0.4.0.dist-info": { "Name": [ - "civicaccess" + "townlight_access" ], "Version": [ "0.4.0" @@ -10,7 +10,7 @@ ">=3.11" ], "Requires-Dist": [ - "civiccore @ https://github.com/townlight/core/releases/download/v1.2.0/civiccore-1.2.0-py3-none-any.whl#sha256=a94ce958e36fb03c8d961e4db4672ce5bcfa25765c57d75886e999cf15703ec7", + "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.0/townlight_core-1.2.0-py3-none-any.whl#sha256=a94ce958e36fb03c8d961e4db4672ce5bcfa25765c57d75886e999cf15703ec7", "fastapi<1.0.0,>=0.115.0", "psycopg2-binary<3.0.0,>=2.9.0", "sqlalchemy<3.0.0,>=2.0.0", @@ -25,9 +25,9 @@ "AGPL-3.0-only" ] }, - "civicclerk-1.0.4.dist-info": { + "townlight_meetings-1.0.4.dist-info": { "Name": [ - "civicclerk" + "townlight_meetings" ], "Version": [ "1.0.4" @@ -37,7 +37,7 @@ ], "Requires-Dist": [ "celery[redis]<6.0.0,>=5.4.0", - "civiccore @ https://github.com/townlight/core/releases/download/v1.2.1/civiccore-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", + "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", "httpx<1.0.0,>=0.27.0", "psycopg2-binary<3.0.0,>=2.9.0", @@ -52,9 +52,9 @@ ], "License-Expression": [] }, - "civiccode-1.0.8.dist-info": { + "townlight_code-1.0.8.dist-info": { "Name": [ - "civiccode" + "townlight_code" ], "Version": [ "1.0.8" @@ -65,7 +65,7 @@ "Requires-Dist": [ "alembic<2.0.0,>=1.13.0", "asyncpg<1.0.0,>=0.29.0", - "civiccore @ https://github.com/townlight/core/releases/download/v1.2.1/civiccore-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", + "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", "psycopg2-binary<3.0.0,>=2.9.0", "pymupdf<2.0.0,>=1.26.0", @@ -82,9 +82,9 @@ ], "License-Expression": [] }, - "civiccore-1.3.0.dev1.dist-info": { + "townlight_core-1.3.0.dev1.dist-info": { "Name": [ - "civiccore\r" + "townlight_core\r" ], "Version": [ "1.3.0.dev1\r" @@ -135,9 +135,9 @@ "AGPL-3.0-only\r" ] }, - "civicinspect-0.3.0+dev.1.dist-info": { + "townlight_inspections-0.3.0+dev.1.dist-info": { "Name": [ - "civicinspect" + "townlight_inspections" ], "Version": [ "0.3.0+dev.1" @@ -147,7 +147,7 @@ ], "Requires-Dist": [ "alembic<2.0.0,>=1.14.0", - "civiccore @ https://github.com/townlight/core/releases/download/v1.2.1/civiccore-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", + "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", "psycopg2-binary<3.0.0,>=2.9.0", "sqlalchemy<3.0.0,>=2.0.0", @@ -163,9 +163,9 @@ ], "License-Expression": [] }, - "civicnotice-0.2.0.dist-info": { + "townlight_notice-0.2.0.dist-info": { "Name": [ - "civicnotice" + "townlight_notice" ], "Version": [ "0.2.0" @@ -174,7 +174,7 @@ ">=3.11" ], "Requires-Dist": [ - "civiccore @ https://github.com/townlight/core/releases/download/v1.2.0/civiccore-1.2.0-py3-none-any.whl#sha256=a94ce958e36fb03c8d961e4db4672ce5bcfa25765c57d75886e999cf15703ec7", + "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.0/townlight_core-1.2.0-py3-none-any.whl#sha256=a94ce958e36fb03c8d961e4db4672ce5bcfa25765c57d75886e999cf15703ec7", "fastapi<1.0.0,>=0.115.0", "sqlalchemy<3.0.0,>=2.0.0", "uvicorn[standard]<1.0.0,>=0.30.0", @@ -190,9 +190,9 @@ "AGPL-3.0-only" ] }, - "civicpermit-0.3.0+dev.1.dist-info": { + "townlight_permitting-0.3.0+dev.1.dist-info": { "Name": [ - "civicpermit" + "townlight_permitting" ], "Version": [ "0.3.0+dev.1" @@ -202,7 +202,7 @@ ], "Requires-Dist": [ "alembic<2.0.0,>=1.13.0", - "civiccore @ https://github.com/townlight/core/releases/download/v1.2.1/civiccore-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", + "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", "sqlalchemy<3.0.0,>=2.0.0", "uvicorn[standard]<1.0.0,>=0.30.0", @@ -217,9 +217,9 @@ ], "License-Expression": [] }, - "civicplan-0.4.0.dev1.dist-info": { + "townlight_planning-0.4.0.dev1.dist-info": { "Name": [ - "civicplan" + "townlight_planning" ], "Version": [ "0.4.0.dev1" @@ -228,7 +228,7 @@ ">=3.11" ], "Requires-Dist": [ - "civiccore==1.3.0.dev1", + "townlight_core==1.3.0.dev1", "fastapi<1.0.0,>=0.115.0", "psycopg2-binary<3.0.0,>=2.9.0", "sqlalchemy<3.0.0,>=2.0.0", @@ -244,9 +244,9 @@ "AGPL-3.0-only" ] }, - "civicrecords_ai-1.8.0.dev1.dist-info": { + "townlight_records-1.8.0.dev1.dist-info": { "Name": [ - "civicrecords-ai\r" + "townlight_records\r" ], "Version": [ "1.8.0.dev1\r" @@ -267,7 +267,7 @@ "python-jose[cryptography]>=3.5.0\r", "passlib[bcrypt]>=1.7.4\r", "celery>=5.6.0\r", - "civiccore==1.3.0.dev1\r", + "townlight_core==1.3.0.dev1\r", "redis<8.0.0,>=5.0.0\r", "httpx>=0.28.0\r", "pdfplumber>=0.11.0\r", @@ -290,9 +290,9 @@ "AGPL-3.0-only\r" ] }, - "civicsuite_runtime-0.1.0.dist-info": { + "townlight_runtime-0.1.0.dist-info": { "Name": [ - "civicsuite-runtime" + "townlight_runtime" ], "Version": [ "0.1.0" @@ -310,9 +310,9 @@ "AGPL-3.0-only" ] }, - "civiczone-0.2.2.dist-info": { + "townlight_zoning-0.2.2.dist-info": { "Name": [ - "civiczone" + "townlight_zoning" ], "Version": [ "0.2.2" @@ -321,7 +321,7 @@ ">=3.11" ], "Requires-Dist": [ - "civiccore @ https://github.com/townlight/core/releases/download/v1.2.1/civiccore-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", + "townlight_core @ https://github.com/townlight/core/releases/download/v1.2.1/townlight_core-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59", "fastapi<1.0.0,>=0.115.0", "uvicorn[standard]<1.0.0,>=0.30.0", "build<2.0.0,>=1.2.0; extra == 'dev'", diff --git a/docs/beta-1/reference/desktop-domain-openapi.json b/docs/beta-1/reference/desktop-domain-openapi.json index dfd2e93..bc0444d 100644 --- a/docs/beta-1/reference/desktop-domain-openapi.json +++ b/docs/beta-1/reference/desktop-domain-openapi.json @@ -11267,10 +11267,10 @@ } } }, - "/civiccode": { + "/townlight_code": { "get": { "summary": "Home", - "operationId": "home_civiccode_get", + "operationId": "home_townlight_code_get", "responses": { "200": { "description": "Successful Response", @@ -11285,10 +11285,10 @@ } } }, - "/civiccode/search": { + "/townlight_code/search": { "get": { "summary": "Search", - "operationId": "search_civiccode_search_get", + "operationId": "search_townlight_code_search_get", "parameters": [ { "name": "q", @@ -11325,10 +11325,10 @@ } } }, - "/civiccode/answer": { + "/townlight_code/answer": { "get": { "summary": "Answer", - "operationId": "answer_civiccode_answer_get", + "operationId": "answer_townlight_code_answer_get", "parameters": [ { "name": "q", @@ -11398,10 +11398,10 @@ } } }, - "/civiccode/sections/{section_ref}": { + "/townlight_code/sections/{section_ref}": { "get": { "summary": "Detail", - "operationId": "detail_civiccode_sections__section_ref__get", + "operationId": "detail_townlight_code_sections__section_ref__get", "parameters": [ { "name": "section_ref", @@ -11454,10 +11454,10 @@ } } }, - "/civiccode/sections/{section_ref}/export": { + "/townlight_code/sections/{section_ref}/export": { "get": { "summary": "Export", - "operationId": "export_civiccode_sections__section_ref__export_get", + "operationId": "export_townlight_code_sections__section_ref__export_get", "parameters": [ { "name": "section_ref", @@ -12274,10 +12274,10 @@ } } }, - "/civiczone/questions": { + "/townlight_zoning/questions": { "post": { "summary": "Public Question", - "operationId": "public_question_civiczone_questions_post", + "operationId": "public_question_townlight_zoning_questions_post", "requestBody": { "content": { "application/json": { @@ -12310,10 +12310,10 @@ } } }, - "/civiczone/parcels/lookup": { + "/townlight_zoning/parcels/lookup": { "post": { "summary": "Public Parcel Lookup", - "operationId": "public_parcel_lookup_civiczone_parcels_lookup_post", + "operationId": "public_parcel_lookup_townlight_zoning_parcels_lookup_post", "requestBody": { "content": { "application/json": { @@ -12376,7 +12376,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/civicsuite_runtime__planning_bridge__Import" + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" } } } @@ -12433,7 +12433,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/civicsuite_runtime__planning_bridge__Import" + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Import" } } } @@ -12752,7 +12752,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/civicsuite_runtime__planning_bridge__Search" + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" } } } @@ -13901,18 +13901,18 @@ } } }, - "/civicplan/policies/search": { + "/townlight_planning/policies/search": { "post": { "tags": [ "local-public-planning" ], "summary": "Public Policies", - "operationId": "public_policies_civicplan_policies_search_post", + "operationId": "public_policies_townlight_planning_policies_search_post", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/civicsuite_runtime__planning_bridge__Search" + "$ref": "#/components/schemas/townlight_runtime__planning_bridge__Search" } } }, @@ -13940,14 +13940,14 @@ } } }, - "/civicplan/plan-explore": { + "/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_civicplan_plan_explore_post", + "operationId": "public_plan_explore_townlight_planning_plan_explore_post", "requestBody": { "content": { "application/json": { @@ -13980,13 +13980,13 @@ } } }, - "/civicplan/snapshots": { + "/townlight_planning/snapshots": { "get": { "tags": [ "local-public-planning" ], "summary": "Public Snapshots", - "operationId": "public_snapshots_civicplan_snapshots_get", + "operationId": "public_snapshots_townlight_planning_snapshots_get", "parameters": [ { "name": "limit", @@ -14035,13 +14035,13 @@ } } }, - "/civicplan/snapshots/{snapshot_id}": { + "/townlight_planning/snapshots/{snapshot_id}": { "get": { "tags": [ "local-public-planning" ], "summary": "Public Document", - "operationId": "public_document_civicplan_snapshots__snapshot_id__get", + "operationId": "public_document_townlight_planning_snapshots__snapshot_id__get", "parameters": [ { "name": "snapshot_id", @@ -14076,13 +14076,13 @@ } } }, - "/civicplan/revisions/{revision_id}/documents/{document_id}": { + "/townlight_planning/revisions/{revision_id}/documents/{document_id}": { "get": { "tags": [ "local-public-planning" ], "summary": "Public Original", - "operationId": "public_original_civicplan_revisions__revision_id__documents__document_id__get", + "operationId": "public_original_townlight_planning_revisions__revision_id__documents__document_id__get", "parameters": [ { "name": "revision_id", @@ -14156,7 +14156,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/civicsuite_runtime__permitting_bridge__Import" + "$ref": "#/components/schemas/townlight_runtime__permitting_bridge__Import" } } } @@ -14804,7 +14804,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/civicsuite_runtime__permitting_bridge__Search" + "$ref": "#/components/schemas/townlight_runtime__permitting_bridge__Search" } } } @@ -15557,7 +15557,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/civicsuite_runtime__inspections_bridge__Search" + "$ref": "#/components/schemas/townlight_runtime__inspections_bridge__Search" } } } @@ -19793,7 +19793,7 @@ }, "linked_sources": { "items": { - "$ref": "#/components/schemas/civicinspect__workflow_models__SourceLink" + "$ref": "#/components/schemas/townlight_inspections__workflow_models__SourceLink" }, "type": "array", "maxItems": 30, @@ -19915,7 +19915,7 @@ }, "linked_sources": { "items": { - "$ref": "#/components/schemas/civicpermit__workflow_models__SourceLink" + "$ref": "#/components/schemas/townlight_permitting__workflow_models__SourceLink" }, "type": "array", "maxItems": 30, @@ -21905,7 +21905,7 @@ "fee_link": { "anyOf": [ { - "$ref": "#/components/schemas/civicpermit__workflow_models__SourceLink" + "$ref": "#/components/schemas/townlight_permitting__workflow_models__SourceLink" }, { "type": "null" @@ -23580,7 +23580,7 @@ "fee_link": { "anyOf": [ { - "$ref": "#/components/schemas/civicpermit__workflow_models__SourceLink" + "$ref": "#/components/schemas/townlight_permitting__workflow_models__SourceLink" }, { "type": "null" @@ -26207,7 +26207,7 @@ ], "title": "_ParcelLookupIn" }, - "civicinspect__workflow_models__SourceLink": { + "townlight_inspections__workflow_models__SourceLink": { "properties": { "provider": { "type": "string", @@ -26235,7 +26235,7 @@ ], "title": "SourceLink" }, - "civicpermit__workflow_models__SourceLink": { + "townlight_permitting__workflow_models__SourceLink": { "properties": { "provider": { "type": "string", @@ -26266,7 +26266,7 @@ ], "title": "SourceLink" }, - "civicsuite_runtime__inspections_bridge__Search": { + "townlight_runtime__inspections_bridge__Search": { "properties": { "provider": { "type": "string", @@ -26288,7 +26288,7 @@ ], "title": "Search" }, - "civicsuite_runtime__permitting_bridge__Import": { + "townlight_runtime__permitting_bridge__Import": { "properties": { "bundle": { "$ref": "#/components/schemas/RequirementBundle" @@ -26313,7 +26313,7 @@ ], "title": "Import" }, - "civicsuite_runtime__permitting_bridge__Search": { + "townlight_runtime__permitting_bridge__Search": { "properties": { "provider": { "type": "string", @@ -26338,7 +26338,7 @@ ], "title": "Search" }, - "civicsuite_runtime__planning_bridge__Import": { + "townlight_runtime__planning_bridge__Import": { "properties": { "bundle": { "additionalProperties": true, @@ -26366,7 +26366,7 @@ ], "title": "Import" }, - "civicsuite_runtime__planning_bridge__Search": { + "townlight_runtime__planning_bridge__Search": { "properties": { "query": { "type": "string", diff --git a/docs/beta-1/reference/index.html b/docs/beta-1/reference/index.html index 27ea726..49e778d 100644 --- a/docs/beta-1/reference/index.html +++ b/docs/beta-1/reference/index.html @@ -1,98 +1 @@ -Technical -Reference Directory | Townlight Beta 1

    townlightTownlight Beta 1
    -
    Townlight Beta 1

    Technical -Reference -Directory

    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

    Technical reference directory

    -

    Every entry describes Townlight Beta 1 while preserving the component -versions of the actual candidate. OpenAPI is generated from the -installed domain without running endpoints. Source supplements -distinguish standalone APIs from installed routes. Receipt -filenames/hashes identify acceptance evidence retained in the private -handoff.

    - -

    Per-product contract -directory

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ProductOperations and data dictionary
    CoreCore
    RecordsRecords (suite companion)
    MeetingsMeetings (suite companion)
    CodeCode (suite companion)
    ZoningZoning (suite companion)
    PlanningPlanning (suite companion)
    PermittingPermitting (suite companion)
    InspectionsInspections (suite companion)
    StationStation (suite companion)
    - \ No newline at end of file +Townlight candidate technical reference
    Townlight

    Current candidate technical reference

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

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

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

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

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

    Townlight · AGPL-3.0-only
    \ No newline at end of file diff --git a/docs/beta-1/reference/native.html b/docs/beta-1/reference/native.html index 6841318..5e4e403 100644 --- a/docs/beta-1/reference/native.html +++ b/docs/beta-1/reference/native.html @@ -1806,12 +1806,12 @@

    main.rs

    | "sign-minutes" | "record-closed-session" | "export-meeting-packet" - | "archive-meeting" => Some((vec!["civicclerk"], false)), - "civicnotice-calculate-deadline" - | "civicnotice-complete-checklist" - | "civicnotice-post-notice" - | "civicnotice-export-archive-packet" => Some((vec!["civicclerk", "civicnotice"], false)), - "record-adopted-legislation" => Some((vec!["civicclerk", "civiccode"], false)), + | "archive-meeting" => Some((vec!["townlight_meetings"], false)), + "townlight_notice-calculate-deadline" + | "townlight_notice-complete-checklist" + | "townlight_notice-post-notice" + | "townlight_notice-export-archive-packet" => Some((vec!["townlight_meetings", "townlight_notice"], false)), + "record-adopted-legislation" => Some((vec!["townlight_meetings", "townlight_code"], false)), "create-records-request" | "load-demo-town" | "submit-public-records-request" @@ -1838,7 +1838,7 @@

    main.rs

    | "export-records-response" | "fulfill-records-request" | "close-records-request" - | "mark-notification-sent" => Some((vec!["civicrecords-ai"], false)), + | "mark-notification-sent" => Some((vec!["townlight_records"], false)), "import-code-source" | "record-codifier-sync" | "record-codifier-sync-failure" @@ -1850,14 +1850,14 @@

    main.rs

    | "publish-code-source" | "unpublish-code-source" | "create-code-handoff" - | "answer-code-question" => Some((vec!["civiccode"], false)), + | "answer-code-question" => Some((vec!["townlight_code"], false)), "search-city-knowledge" => Some(( vec![ - "civicclerk", - "civicrecords-ai", - "civiccode", - "civicnotice", - "civicaccess", + "townlight_meetings", + "townlight_records", + "townlight_code", + "townlight_notice", + "townlight_access", ], true, )), @@ -1865,28 +1865,28 @@

    main.rs

    .and_then(|value| value.get("folder")) .and_then(Value::as_str) { - Some("meetings") => Some((vec!["civicclerk"], false)), - Some("records") => Some((vec!["civicrecords-ai"], false)), - Some("code") => Some((vec!["civiccode"], false)), - Some("notice") => Some((vec!["civicnotice"], false)), - Some("access") => Some((vec!["civicaccess"], false)), - Some("planning") => Some((vec!["civicplan"], false)), - Some("permitting") => Some((vec!["civicpermit"], false)), - Some("inspections") => Some((vec!["civicinspect"], false)), + Some("meetings") => Some((vec!["townlight_meetings"], false)), + Some("records") => Some((vec!["townlight_records"], false)), + Some("code") => Some((vec!["townlight_code"], false)), + Some("notice") => Some((vec!["townlight_notice"], false)), + Some("access") => Some((vec!["townlight_access"], false)), + Some("planning") => Some((vec!["townlight_planning"], false)), + Some("permitting") => Some((vec!["townlight_permitting"], false)), + Some("inspections") => Some((vec!["townlight_inspections"], false)), _ => Some(( - vec!["civicclerk", "civicrecords-ai", "civiccode", "civicnotice"], + vec!["townlight_meetings", "townlight_records", "townlight_code", "townlight_notice"], true, )), }, "accessibility-review" - | "civicaccess-records-export" - | "civicaccess-delete-review" - | "civicaccess-plain-language" - | "civicaccess-language-variant" - | "civicaccess-form-plan" - | "civicaccess-publishing-workflow" - | "civicaccess-ada-title-ii" - | "civicaccess-tagged-pdf" => Some((vec!["civicaccess"], false)), + | "townlight_access-records-export" + | "townlight_access-delete-review" + | "townlight_access-plain-language" + | "townlight_access-language-variant" + | "townlight_access-form-plan" + | "townlight_access-publishing-workflow" + | "townlight_access-ada-title-ii" + | "townlight_access-tagged-pdf" => Some((vec!["townlight_access"], false)), _ => None, } } @@ -1905,11 +1905,11 @@

    main.rs

    fn module_exports_folder(module_id: &str) -> Option<(&'static str, &'static str)> { match module_id { - "civicclerk" => Some(("meetings", "meeting exports")), - "civicrecords-ai" => Some(("records", "records exports")), - "civiccode" => Some(("code", "code exports")), - "civicnotice" => Some(("notice", "notice exports")), - "civicaccess" => Some(("access", "accessibility/records exports")), + "townlight_meetings" => Some(("meetings", "meeting exports")), + "townlight_records" => Some(("records", "records exports")), + "townlight_code" => Some(("code", "code exports")), + "townlight_notice" => Some(("notice", "notice exports")), + "townlight_access" => Some(("access", "accessibility/records exports")), _ => None, } } @@ -2163,7 +2163,7 @@

    main.rs

    } fn picked_file_path_for_desktop() -> Result<Option<String>, String> { - if let Ok(path) = std::env::var("CIVICSUITE_TEST_FILE_PICKER_PATH") { + if let Ok(path) = std::env::var("TOWNLIGHT_TEST_FILE_PICKER_PATH") { let trimmed = path.trim(); return Ok(if trimmed.is_empty() { None @@ -2187,7 +2187,7 @@

    main.rs

    } fn picked_folder_path_for_desktop() -> Result<Option<String>, String> { - if let Ok(path) = std::env::var("CIVICSUITE_TEST_FOLDER_PICKER_PATH") { + if let Ok(path) = std::env::var("TOWNLIGHT_TEST_FOLDER_PICKER_PATH") { let trimmed = path.trim(); return Ok(if trimmed.is_empty() { None @@ -2510,7 +2510,7 @@

    main.rs

    if !selection .enabled_module_ids .iter() - .any(|id| id == "civiczone") + .any(|id| id == "townlight_zoning") { return Err(domain_client::DomainError::denied()); } @@ -2535,7 +2535,7 @@

    main.rs

    if !selection .enabled_module_ids .iter() - .any(|id| id == "civiczone") + .any(|id| id == "townlight_zoning") { return Err(domain_client::DomainError::denied()); } @@ -2551,7 +2551,7 @@

    main.rs

    ) || !selection .enabled_module_ids .iter() - .any(|id| id == "civicplan") + .any(|id| id == "townlight_planning") { return Err(domain_client::DomainError::denied()); } @@ -2587,7 +2587,7 @@

    main.rs

    ) || !selection .enabled_module_ids .iter() - .any(|id| id == "civicpermit") + .any(|id| id == "townlight_permitting") { return Err(domain_client::DomainError::denied()); } @@ -2610,7 +2610,7 @@

    main.rs

    || !selection .enabled_module_ids .iter() - .any(|id| id == "civicinspect") + .any(|id| id == "townlight_inspections") { return Err(domain_client::DomainError::denied()); } @@ -2816,13 +2816,13 @@

    main.rs

    fn with_clean_first_run_state<T>(test: impl FnOnce(PathBuf) -> T) -> T { let _guard = first_run::test_env_lock().lock().expect("test env lock"); let root = env::temp_dir().join(format!( - "civicsuite-desktop-app-state-test-{}", + "townlight-desktop-app-state-test-{}", std::process::id() )); let _ = fs::remove_dir_all(&root); - env::set_var("CIVICSUITE_DESKTOP_STATE_DIR", &root); + env::set_var("TOWNLIGHT_DESKTOP_STATE_DIR", &root); let result = test(root.clone()); - env::remove_var("CIVICSUITE_DESKTOP_STATE_DIR"); + env::remove_var("TOWNLIGHT_DESKTOP_STATE_DIR"); let _ = fs::remove_dir_all(root); result } @@ -2887,7 +2887,7 @@

    main.rs

    fn records_beta_modules_are_reported_installed() { module_registry::validate_default_registry().expect("module registry contract validates"); let modules = module_summaries().expect("module registry parses"); - for module_id in ["civiccore", "civicrecords-ai", "civicnotice", "civicaccess"] { + for module_id in ["townlight_core", "townlight_records", "townlight_notice", "townlight_access"] { let module = modules .iter() .find(|candidate| candidate.id == module_id) @@ -2897,7 +2897,7 @@

    main.rs

    "{module_id} should be installed in records-beta" ); } - for module_id in ["civicclerk", "civiccode"] { + for module_id in ["townlight_meetings", "townlight_code"] { let module = modules .iter() .find(|candidate| candidate.id == module_id) @@ -3061,7 +3061,7 @@

    main.rs

    create_first_admin(); let signed_out_result = - module_action("disable-module".to_string(), "civiccode".to_string()); + module_action("disable-module".to_string(), "townlight_code".to_string()); assert!(signed_out_result.is_err()); assert!(signed_out_result @@ -3070,7 +3070,7 @@

    main.rs

    .contains("Sign in as the Townlight admin")); sign_in_as_first_admin(); - let disabled = module_action("disable-module".to_string(), "civiccode".to_string()) + let disabled = module_action("disable-module".to_string(), "townlight_code".to_string()) .expect("module disable allowed"); assert!(disabled.accepted); assert_eq!(disabled.status, "Module disabled"); @@ -3078,38 +3078,38 @@

    main.rs

    .selection .installed_module_ids .iter() - .any(|module_id| module_id == "civiccode")); + .any(|module_id| module_id == "townlight_code")); assert!(!disabled .selection .enabled_module_ids .iter() - .any(|module_id| module_id == "civiccode")); + .any(|module_id| module_id == "townlight_code")); assert!(disabled .modules .iter() - .any(|module| module.id == "civiccode" && module.installed && !module.enabled)); + .any(|module| module.id == "townlight_code" && module.installed && !module.enabled)); - let enabled = module_action("enable-module".to_string(), "civiccode".to_string()) + let enabled = module_action("enable-module".to_string(), "townlight_code".to_string()) .expect("module enable allowed"); assert!(enabled .selection .enabled_module_ids .iter() - .any(|module_id| module_id == "civiccode")); + .any(|module_id| module_id == "townlight_code")); - let current = module_action("update-module".to_string(), "civiccode".to_string()) + let current = module_action("update-module".to_string(), "townlight_code".to_string()) .expect("module update check allowed"); assert_eq!(current.status, "Module current"); assert!(current.message.contains("pinned version")); let opened_exports = - module_action("open-module-exports".to_string(), "civiccode".to_string()) + module_action("open-module-exports".to_string(), "townlight_code".to_string()) .expect("module exports open"); assert_eq!(opened_exports.status, "Module exports opened"); assert!(opened_exports.message.contains("code exports")); assert!(root.join("Data").join("exports").join("code").is_dir()); - let removed = module_action("remove-module".to_string(), "civiccode".to_string()) + let removed = module_action("remove-module".to_string(), "townlight_code".to_string()) .expect("module remove allowed"); assert_eq!(removed.status, "Module removed"); assert!(removed.message.contains("verified profile backup")); @@ -3118,7 +3118,7 @@

    main.rs

    .selection .installed_module_ids .iter() - .any(|module_id| module_id == "civiccode")); + .any(|module_id| module_id == "townlight_code")); let backup_count = fs::read_dir(root.join("Backups")) .expect("backup root exists") .filter(|entry| { @@ -3131,21 +3131,21 @@

    main.rs

    assert_eq!(backup_count, 1); let removed_exports = - module_action("open-module-exports".to_string(), "civiccode".to_string()); + module_action("open-module-exports".to_string(), "townlight_code".to_string()); assert!(removed_exports.is_err()); assert!(removed_exports .err() .expect("removed module export error") .contains("is not installed in this local profile")); - let installed = module_action("install-module".to_string(), "civiccode".to_string()) + let installed = module_action("install-module".to_string(), "townlight_code".to_string()) .expect("module install allowed"); assert_eq!(installed.status, "Module installed"); assert!(installed .selection .enabled_module_ids .iter() - .any(|module_id| module_id == "civiccode")); + .any(|module_id| module_id == "townlight_code")); }); } @@ -3154,20 +3154,20 @@

    main.rs

    with_clean_first_run_state(|_| { create_first_admin(); env::set_var( - "CIVICSUITE_TEST_FILE_PICKER_PATH", + "TOWNLIGHT_TEST_FILE_PICKER_PATH", r"C:\City\Records\packet.pdf", ); let signed_out = choose_file_path(); - env::remove_var("CIVICSUITE_TEST_FILE_PICKER_PATH"); + env::remove_var("TOWNLIGHT_TEST_FILE_PICKER_PATH"); assert!(signed_out.is_err()); sign_in_as_first_admin(); env::set_var( - "CIVICSUITE_TEST_FILE_PICKER_PATH", + "TOWNLIGHT_TEST_FILE_PICKER_PATH", r"C:\City\Records\packet.pdf", ); let picked = choose_file_path().expect("signed-in file picker"); - env::remove_var("CIVICSUITE_TEST_FILE_PICKER_PATH"); + env::remove_var("TOWNLIGHT_TEST_FILE_PICKER_PATH"); assert_eq!(picked.as_deref(), Some(r"C:\City\Records\packet.pdf")); }); @@ -3177,29 +3177,29 @@

    main.rs

    fn choose_folder_path_allows_first_run_then_requires_local_admin() { with_clean_first_run_state(|_| { env::set_var( - "CIVICSUITE_TEST_FOLDER_PICKER_PATH", + "TOWNLIGHT_TEST_FOLDER_PICKER_PATH", r"C:\City\TownlightData", ); let first_run_folder = choose_folder_path().expect("pre-admin folder picker"); - env::remove_var("CIVICSUITE_TEST_FOLDER_PICKER_PATH"); + env::remove_var("TOWNLIGHT_TEST_FOLDER_PICKER_PATH"); assert_eq!(first_run_folder.as_deref(), Some(r"C:\City\TownlightData")); create_first_admin(); env::set_var( - "CIVICSUITE_TEST_FOLDER_PICKER_PATH", + "TOWNLIGHT_TEST_FOLDER_PICKER_PATH", r"C:\City\TownlightBackups", ); let signed_out = choose_folder_path(); - env::remove_var("CIVICSUITE_TEST_FOLDER_PICKER_PATH"); + env::remove_var("TOWNLIGHT_TEST_FOLDER_PICKER_PATH"); assert!(signed_out.is_err()); sign_in_as_first_admin(); env::set_var( - "CIVICSUITE_TEST_FOLDER_PICKER_PATH", + "TOWNLIGHT_TEST_FOLDER_PICKER_PATH", r"C:\City\TownlightBackups", ); let picked = choose_folder_path().expect("admin folder picker"); - env::remove_var("CIVICSUITE_TEST_FOLDER_PICKER_PATH"); + env::remove_var("TOWNLIGHT_TEST_FOLDER_PICKER_PATH"); assert_eq!(picked.as_deref(), Some(r"C:\City\TownlightBackups")); }); @@ -3335,8 +3335,8 @@

    main.rs

    with_clean_first_run_state(|_| { create_first_admin(); sign_in_as_first_admin(); - module_action("disable-module".to_string(), "civiccode".to_string()) - .expect("civiccode disabled"); + module_action("disable-module".to_string(), "townlight_code".to_string()) + .expect("townlight_code disabled"); let code_payload = serde_json::json!({ "title": "Backyard Chicken Rules", @@ -3355,11 +3355,11 @@

    main.rs

    } #[test] - fn civicaccess_only_profile_can_still_reach_search_city_knowledge() { + fn townlight_access_only_profile_can_still_reach_search_city_knowledge() { with_clean_first_run_state(|_| { create_first_admin(); sign_in_as_first_admin(); - for m in ["civiccode", "civicnotice", "civicclerk", "civicrecords-ai"] { + for m in ["townlight_code", "townlight_notice", "townlight_meetings", "townlight_records"] { module_action("disable-module".to_string(), m.to_string()).unwrap(); } require_enabled_city_modules("search-city-knowledge", None) @@ -3379,7 +3379,7 @@

    main.rs

    with_clean_first_run_state(|_| { create_first_admin(); sign_in_as_first_admin(); - module_action("disable-module".to_string(), "civiccode".to_string()).unwrap(); + module_action("disable-module".to_string(), "townlight_code".to_string()).unwrap(); let mut result = CityWorkActionResult { accepted: true, action: "search-city-knowledge".into(), @@ -3388,7 +3388,7 @@

    main.rs

    next_action: String::new(), state: CityWorkState::default(), search_results: vec![workflows::SearchResult { - module_id: "civiccode".into(), + module_id: "townlight_code".into(), record_id: "synthetic".into(), title: "Synthetic".into(), snippet: String::new(), @@ -3959,7 +3959,7 @@

    planning_client.rs

    PlanExplore { payload } => (Method::POST, "/plan-explore".into(), Some(payload)), }; let prefix = if public { - "/civicplan" + "/townlight_planning" } else { "/desktop/v1/planning" }; @@ -4048,7 +4048,7 @@

    planning_client.rs

    ) .is_err()); let (_, path, _) = route(PlanningRequest::Snapshots { offset: 50 }, true).unwrap(); - assert_eq!(path, "/civicplan/snapshots?offset=50"); + assert_eq!(path, "/townlight_planning/snapshots?offset=50"); assert!(serde_json::from_value::<PlanningRequest>( serde_json::json!({"operation":"snapshot","id":"../../private"}) ) @@ -4203,7 +4203,7 @@

    zoning_client.rs

    } }; let prefix = if public { - "/civiczone" + "/townlight_zoning" } else { "/desktop/v1/zoning" }; diff --git a/docs/beta-1/reference/runtime-payload-lock.json b/docs/beta-1/reference/runtime-payload-lock.json index f19212c..7b1ff22 100644 --- a/docs/beta-1/reference/runtime-payload-lock.json +++ b/docs/beta-1/reference/runtime-payload-lock.json @@ -7,27 +7,27 @@ "publication_allowed": false, "wheels": [ { - "name": "civicinspect-0.3.0+dev.1-py3-none-any.whl", + "name": "townlight_inspections-0.3.0+dev.1-py3-none-any.whl", "sha256": "cf48a2a7efd4ee5f4fe1d2ee91314733be259af7c3dcd3cddeffba1247c2558d" }, { - "name": "civicpermit-0.3.0+dev.1-py3-none-any.whl", + "name": "townlight_permitting-0.3.0+dev.1-py3-none-any.whl", "sha256": "306d09973488d9c3343ee291a9b6a1a11c95fafb2dc25cbddd6eb6736b4be903" }, { - "name": "civicplan-0.4.0.dev1-py3-none-any.whl", + "name": "townlight_planning-0.4.0.dev1-py3-none-any.whl", "sha256": "4090e4c9fa80a976f0838ab8c98deefb2bd278598ca79bec634bb71bbbfb66f4" }, { - "name": "civicrecords_ai-1.8.0.dev1-py3-none-any.whl", + "name": "townlight_records-1.8.0.dev1-py3-none-any.whl", "sha256": "6015e6905d9bd6f817fe7e31a3e7a66d9fda332648e7590e757432c86df44e93" }, { - "name": "civicsuite_runtime-0.1.0-py3-none-any.whl", + "name": "townlight_runtime-0.1.0-py3-none-any.whl", "sha256": "9e069be6f1683871c262ce3010c84157f9f4a1f797b9c967bbb772286e6c7c1e" }, { - "name": "civiczone-0.2.2-py3-none-any.whl", + "name": "townlight_zoning-0.2.2-py3-none-any.whl", "sha256": "e6c3af637ce7e00d1e7cbaaf5fe2259d243eb003fb1540903e5c3f6f6ec865f4" }, { @@ -58,39 +58,39 @@ "publication_allowed": false, "wheels": [ { - "name": "civicaccess-0.4.0-py3-none-any.whl", + "name": "townlight_access-0.4.0-py3-none-any.whl", "sha256": "62a8518c418e9cd0c96a5901a0ce715e81b4769ca7d1e356cccc005e3ded92cb" }, { - "name": "civicclerk-1.0.4-py3-none-any.whl", + "name": "townlight_meetings-1.0.4-py3-none-any.whl", "sha256": "9fc95292ab3e6d798c1c3832e5179ccdddcb79b910b184d05894ce0ff62cbca5" }, { - "name": "civiccode-1.0.8-py3-none-any.whl", + "name": "townlight_code-1.0.8-py3-none-any.whl", "sha256": "fa2af4d1a456f2ed4377b422030de3f93ed0bd393bbe2ec5c334217ef56f287a" }, { - "name": "civicinspect-0.3.0+dev.1-py3-none-any.whl", + "name": "townlight_inspections-0.3.0+dev.1-py3-none-any.whl", "sha256": "c5fc1cbea4b2a98c5ab2b5b967b7c6f51f54e6a2c962e0f1da104905cd022d6d" }, { - "name": "civicnotice-0.2.0-py3-none-any.whl", + "name": "townlight_notice-0.2.0-py3-none-any.whl", "sha256": "7406bad6529f29c839d14998c5fed0519b60873cec7116fe260d1cbb2210d412" }, { - "name": "civicpermit-0.3.0+dev.1-py3-none-any.whl", + "name": "townlight_permitting-0.3.0+dev.1-py3-none-any.whl", "sha256": "3c629ed12b5195d937ccff5b72fe02c6f0993a129e208de9599bdbd45d44a994" }, { - "name": "civicplan-0.4.0.dev1-py3-none-any.whl", + "name": "townlight_planning-0.4.0.dev1-py3-none-any.whl", "sha256": "bdcb7b695bb0df442c6efae1b89218174583f73ecadd0a816914934dd951cbb0" }, { - "name": "civicsuite_runtime-0.1.0-py3-none-any.whl", + "name": "townlight_runtime-0.1.0-py3-none-any.whl", "sha256": "4b917583fa236a080fb6789a2d69b14805d5398bba6fa6456fc15960b8748907" }, { - "name": "civiczone-0.2.2-py3-none-any.whl", + "name": "townlight_zoning-0.2.2-py3-none-any.whl", "sha256": "4b08068ce55d5c85ab712778fd425d68af31bcc449b014e67b6c84b01a0403e8" }, { @@ -246,237 +246,237 @@ "sha256": "b62831d83e129a974bec04ee10fd71cfd15c8940f5c5c4dd11794b8f51cbd8d8" }, { - "path": "Lib/site-packages/civicaccess/main.py", + "path": "Lib/site-packages/townlight_access/main.py", "size_bytes": 17450, "sha256": "379d3c880dd949db3325fa055b8822cf5f59a20b8d7c4da3a84a8f12989134ab" }, { - "path": "Lib/site-packages/civicclerk/desktop_delivery.py", + "path": "Lib/site-packages/townlight_meetings/desktop_delivery.py", "size_bytes": 5096, "sha256": "cbb7f44aee90b9ea16c60c1f64efffa8bb7204765d49a5ce80fe52e2670d384e" }, { - "path": "Lib/site-packages/civicclerk/main.py", + "path": "Lib/site-packages/townlight_meetings/main.py", "size_bytes": 147419, "sha256": "d224d17b9869739b6faaddcd7213e202f8b710f72cda402479c0c6a84e737285" }, { - "path": "Lib/site-packages/civicclerk/migrations/versions/civicclerk_0017_meeting_authority.py", + "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0017_meeting_authority.py", "size_bytes": 2306, "sha256": "73c6266df0dd33b74223133a2a00d045112a1996ffc38025d3aa8ba7831f1082" }, { - "path": "Lib/site-packages/civicclerk/migrations/versions/civicclerk_0018_agenda_authority.py", + "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0018_agenda_authority.py", "size_bytes": 1675, "sha256": "7dc3993bf51db8239270fd53a651b98ebbff0dbfce56ccbb73414ac9bbac2464" }, { - "path": "Lib/site-packages/civicclerk/migrations/versions/civicclerk_0019_minutes_decisions.py", + "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0019_minutes_decisions.py", "size_bytes": 541, "sha256": "5f088e0026bef9f492cac6a4c4a6c16ee81409d6447b1ab1ee19c037cd56d9cc" }, { - "path": "Lib/site-packages/civicclerk/migrations/versions/civicclerk_0020_delivery_history.py", + "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0020_delivery_history.py", "size_bytes": 762, "sha256": "92a6779b59cb3228b3bbd963a9c4cef921163cbd07473381f015dbf474ba4005" }, { - "path": "Lib/site-packages/civicclerk/migrations/versions/civicclerk_0021_sources_archive.py", + "path": "Lib/site-packages/townlight_meetings/migrations/versions/townlight_meetings_0021_sources_archive.py", "size_bytes": 892, "sha256": "3220a0e7992d865b5a1f5a9bb71cb85722336f276fc974c13939d81fbfc1b29c" }, { - "path": "Lib/site-packages/civicclerk/records_sources.py", + "path": "Lib/site-packages/townlight_meetings/records_sources.py", "size_bytes": 1843, "sha256": "843b4808e4a335ab05a7801a33a3a5750dc49ce84d7e71961841e91e7532598f" }, { - "path": "Lib/site-packages/civicclerk/transcripts.py", + "path": "Lib/site-packages/townlight_meetings/transcripts.py", "size_bytes": 3334, "sha256": "33d5b6f97ce58b6f645e0c236a53a855c358d01db06ee048ec9c90100474bc98" }, { - "path": "Lib/site-packages/civiccode/main.py", + "path": "Lib/site-packages/townlight_code/main.py", "size_bytes": 84536, "sha256": "930e05298b82f10ec0338040770d8af83aa56a9d43016908931ab8f796e63f48" }, { - "path": "Lib/site-packages/civiccore/__init__.py", + "path": "Lib/site-packages/townlight_core/__init__.py", "size_bytes": 10775, "sha256": "22823aa2e5f34ff62c57276cc877fc52fb6c654877b5e3756d6dccdb40f7dc15" }, { - "path": "Lib/site-packages/civiccore/migrations/alembic.ini", + "path": "Lib/site-packages/townlight_core/migrations/alembic.ini", "size_bytes": 82, "sha256": "d519dafe29ef2eb3cd77de8f8fd769746a45275439a6b3c5f5e34d990cc61092" }, { - "path": "Lib/site-packages/civiccore/migrations/versions/civiccore_0003_local_task_queue.py", + "path": "Lib/site-packages/townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py", "size_bytes": 1832, "sha256": "51276a0dc2737fd1fc2615f26d66d942c1df3be2ef40f1513436cd4579b1ecf0" }, { - "path": "Lib/site-packages/civicinspect/migrations/versions/civicinspect_0001_connected.py", + "path": "Lib/site-packages/townlight_inspections/migrations/versions/townlight_inspections_0001_connected.py", "size_bytes": 1305, "sha256": "0e71ed311993f45634eb42ba22f5c2b2c4a3854639b221857af76f826d1b68de" }, { - "path": "Lib/site-packages/civicinspect/workflow_store.py", + "path": "Lib/site-packages/townlight_inspections/workflow_store.py", "size_bytes": 17443, "sha256": "df4ff48879d5f8fe31d71a410a99ed8c359676ab05a267db65e1468cb4764146" }, { - "path": "Lib/site-packages/civicnotice/main.py", + "path": "Lib/site-packages/townlight_notice/main.py", "size_bytes": 23033, "sha256": "3aec4b0007a662276afbb8527fab22fe796e4d64c3568fe688ac97dc63bc69bc" }, { - "path": "Lib/site-packages/civicpermit/migrations/versions/civicpermit_0001_connected.py", + "path": "Lib/site-packages/townlight_permitting/migrations/versions/townlight_permitting_0001_connected.py", "size_bytes": 1272, "sha256": "e3fc90959836887334b429888407537140fa2d119c202886b63c538feb4e9360" }, { - "path": "Lib/site-packages/civicpermit/workflow_store.py", + "path": "Lib/site-packages/townlight_permitting/workflow_store.py", "size_bytes": 15222, "sha256": "c3415dd94aaed609a593d28b60d0719f2dc1a504a5f15391d9708714038ea259" }, { - "path": "Lib/site-packages/civicplan/migrations/__init__.py", + "path": "Lib/site-packages/townlight_planning/migrations/__init__.py", "size_bytes": 2111, "sha256": "daf5e64cefda400a5db1023d952e41bef6f7954db19406d63ea84770c82dccd9" }, { - "path": "Lib/site-packages/civicplan/migrations/versions/civicplan_0002_workflows.py", + "path": "Lib/site-packages/townlight_planning/migrations/versions/townlight_planning_0002_workflows.py", "size_bytes": 1023, "sha256": "7c6fcdfe4a1fa33c9289cef975a25f4b0f6746471c380226c14520f8a5f09dbf" }, { - "path": "Lib/site-packages/civicplan/migrations/versions/civicplan_0004_neighborhoods.py", + "path": "Lib/site-packages/townlight_planning/migrations/versions/townlight_planning_0004_neighborhoods.py", "size_bytes": 806, "sha256": "006f8f8f9859da76189efee9035d1f89c65e0b27172b5df9e316e1aa173434f8" }, { - "path": "Lib/site-packages/civicplan/source_bundle.py", + "path": "Lib/site-packages/townlight_planning/source_bundle.py", "size_bytes": 6466, "sha256": "f6547516067e27697dfcd6ba80de6e2ca03d1473370209aa354a5bf95b7db98a" }, { - "path": "Lib/site-packages/civicplan/workflow_store.py", + "path": "Lib/site-packages/townlight_planning/workflow_store.py", "size_bytes": 16971, "sha256": "4d4fec6d6c876997726ff1d8f2ff39302f44228fae748edc013739267d210741" }, { - "path": "Lib/site-packages/civicsuite_runtime/__init__.py", + "path": "Lib/site-packages/townlight_runtime/__init__.py", "size_bytes": 118, "sha256": "b68059cf70d9999804385a093caa3d7520c96d92f705ba9ee05fbc7d2c2b1f1d" }, { - "path": "Lib/site-packages/civicsuite_runtime/civicrecords_alembic/alembic.ini", + "path": "Lib/site-packages/townlight_runtime/townlight_records_alembic/alembic.ini", "size_bytes": 524, "sha256": "60e69c28e3c87e101995977223073125b196202555e1fc18902feed2afdc7e7e" }, { - "path": "Lib/site-packages/civicsuite_runtime/civicrecords_alembic/alembic/env.py", + "path": "Lib/site-packages/townlight_runtime/townlight_records_alembic/alembic/env.py", "size_bytes": 2784, "sha256": "72f25d2ff59a9fdc6b5282e9d995c8c475146068c2e37b334236c690748ba637" }, { - "path": "Lib/site-packages/civicsuite_runtime/civicrecords_alembic/alembic/versions/027_import_artifact_order.py", + "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/civicsuite_runtime/fixtures/redstone-valley-records-demo-v1.json", + "path": "Lib/site-packages/townlight_runtime/fixtures/redstone-valley-records-demo-v1.json", "size_bytes": 6140, "sha256": "2039eca2587b4ace6937ca73e21d0a936835420f8534292247458a1a67516553" }, { - "path": "Lib/site-packages/civicsuite_runtime/inspections_bridge.py", + "path": "Lib/site-packages/townlight_runtime/inspections_bridge.py", "size_bytes": 9755, "sha256": "b7429c3ab988005a198795d6f1dfc3f785c7f96f61410903f8cb0ad38c6f512c" }, { - "path": "Lib/site-packages/civicsuite_runtime/meetings_bridge.py", + "path": "Lib/site-packages/townlight_runtime/meetings_bridge.py", "size_bytes": 28863, "sha256": "37ea43e633b55e9428e928143e5da0d41a7a5906673b8cc54b40fa4d1748fa52" }, { - "path": "Lib/site-packages/civicsuite_runtime/migrate.py", + "path": "Lib/site-packages/townlight_runtime/migrate.py", "size_bytes": 5667, "sha256": "cf632a6c00a1c6e3bdea08edf841510a194665c0ce97705dbc4e16f964bb6145" }, { - "path": "Lib/site-packages/civicsuite_runtime/native_accounts.py", + "path": "Lib/site-packages/townlight_runtime/native_accounts.py", "size_bytes": 4077, "sha256": "e54d1dcfbbf5aecb2c61d7235884e787de05b8f48547f9c68348ba45a8ff9039" }, { - "path": "Lib/site-packages/civicsuite_runtime/permitting_bridge.py", + "path": "Lib/site-packages/townlight_runtime/permitting_bridge.py", "size_bytes": 8765, "sha256": "786abd0dfc18ed0ce7ada70fcd120f96795d8e1ee46f38ca0770a8217b4d6e1d" }, { - "path": "Lib/site-packages/civicsuite_runtime/planning_bridge.py", + "path": "Lib/site-packages/townlight_runtime/planning_bridge.py", "size_bytes": 14108, "sha256": "74a855b995b7f323873b9c788cd15bd4b0ebe3fc1c53879596e1b5043c2825bb" }, { - "path": "Lib/site-packages/civicsuite_runtime/planning_connections.py", + "path": "Lib/site-packages/townlight_runtime/planning_connections.py", "size_bytes": 2406, "sha256": "9991e58a4b168fbbdf5f00334e8515061a09ab06ce593a7625ae007e2fd840f9" }, { - "path": "Lib/site-packages/civicsuite_runtime/records_cutover.py", + "path": "Lib/site-packages/townlight_runtime/records_cutover.py", "size_bytes": 4627, "sha256": "62b93909757ce822fc1f235b6c602d081a669d68e20bca63719b7c773940abde" }, { - "path": "Lib/site-packages/civicsuite_runtime/records_demo.py", + "path": "Lib/site-packages/townlight_runtime/records_demo.py", "size_bytes": 7278, "sha256": "c1c4ef3dd1ffbca62ffaa84cef21a66ecfa57b9f0909a75c5e34bde068b2d4c5" }, { - "path": "Lib/site-packages/civicsuite_runtime/records_import.py", + "path": "Lib/site-packages/townlight_runtime/records_import.py", "size_bytes": 8585, "sha256": "ba8a017e2e83f7b08707b1c1dfe701fb9540d130aebf5aacd29e2c9699ddc8b3" }, { - "path": "Lib/site-packages/civicsuite_runtime/records_import_access.py", + "path": "Lib/site-packages/townlight_runtime/records_import_access.py", "size_bytes": 3194, "sha256": "c8d4052358b5679e64f1fd97097d5d6498b9fbcb4a71a4af3b688a766d5f3fb2" }, { - "path": "Lib/site-packages/civicsuite_runtime/records_import_store.py", + "path": "Lib/site-packages/townlight_runtime/records_import_store.py", "size_bytes": 16716, "sha256": "fe1acc8792fb8a2992d554568705663d2440d044616511891b98fff0e5eb35f7" }, { - "path": "Lib/site-packages/civicsuite_runtime/records_snapshot.py", + "path": "Lib/site-packages/townlight_runtime/records_snapshot.py", "size_bytes": 7066, "sha256": "800377214a5e0b52cd4f402aae015f9eb832d7d29a003cd4cc3b84316cd4a735" }, { - "path": "Lib/site-packages/civicsuite_runtime/zoning_bridge.py", + "path": "Lib/site-packages/townlight_runtime/zoning_bridge.py", "size_bytes": 14635, "sha256": "eb80d79ffc4fc736789aab4f3d3b75a4d9d01101d6414a69a29053c7d5f90505" }, { - "path": "Lib/site-packages/civicsuite_runtime/zoning_records.py", + "path": "Lib/site-packages/townlight_runtime/zoning_records.py", "size_bytes": 1694, "sha256": "045718aaa5f1f42876dbb493e4649e721a94187375d96bc8d7a34512e9ce9806" }, { - "path": "Lib/site-packages/civiczone/connected_sources.py", + "path": "Lib/site-packages/townlight_zoning/connected_sources.py", "size_bytes": 10879, "sha256": "68ad55c71b897eca689a6d028f4aee115dc5ca4b5ef005613385f9588387715b" }, { - "path": "Lib/site-packages/civiczone/geo_import.py", + "path": "Lib/site-packages/townlight_zoning/geo_import.py", "size_bytes": 13239, "sha256": "e49824301593f8c06dd6bc64832542721d7b1763d745deb7ba531f7b894cc4a0" }, { - "path": "Lib/site-packages/civiczone/migrations/versions/civiczone_0006_cited_questions.py", + "path": "Lib/site-packages/townlight_zoning/migrations/versions/townlight_zoning_0006_cited_questions.py", "size_bytes": 2262, "sha256": "65b8c591b5adf3f0022720a2c4e780c818f0f4b5b51db83b81cab78edb2a1f9d" }, diff --git a/docs/beta-1/reference/source-inventory.json b/docs/beta-1/reference/source-inventory.json index 04890db..940fde2 100644 --- a/docs/beta-1/reference/source-inventory.json +++ b/docs/beta-1/reference/source-inventory.json @@ -1,27 +1,34 @@ { - "candidate_source_sha256": "84a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06b", - "basis": "Immutable corresponding source of signed candidate; AST extraction is not executed endpoint acceptance. Router mounts require runtime OpenAPI or source include_router context.", + "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.", "products": { "core": { - "package": "civiccore", + "repository": "townlight/core", + "repository_head": "ac2ead46938208820cb0bcae511475abef290da3", + "working_tree_modified": true, + "principal_import": "townlight_core", "source": [ { - "source": "installed-owned-source/civiccore/__init__.py", - "sha256": "22823aa2e5f34ff62c57276cc877fc52fb6c654877b5e3756d6dccdb40f7dc15", + "source": "townlight_core/__init__.py", + "sha256": "271ec6a8d23264747891f8909e8ed1986cb8b2d56098bcaf59e3550b1978e9c4", + "bytes": 10845, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/audit/__init__.py", - "sha256": "9066c9b752564f42427bb925f2ec72e92007f389fbec24b3bde90655cfb3c9d9", + "source": "townlight_core/audit/__init__.py", + "sha256": "4e1568afe62b114bdaa5bc329ce9eeb0f2a050304b2087d25dd4ea862e7a44b0", + "bytes": 807, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/audit/primitives.py", - "sha256": "293ba8cf2d89165bf50d1fb019c05a4a1e5a1ca22c3703be25f6c96014491d3a", + "source": "townlight_core/audit/primitives.py", + "sha256": "b2c07101e233c2fddf03c0395f84ee8975e6a83aa2e66a51980a926b7f5474fc", + "bytes": 9770, "routes": [], "models": [ { @@ -33,21 +40,20 @@ { "name": "actor_id", "type": "str", - "default": "" + "line": 60 }, { "name": "actor_type", "type": "str", - "default": "" + "line": 61 }, { "name": "display_name", "type": "str | None", - "default": "None" + "line": 62 } ], - "line": 55, - "doc": "Actor that initiated an auditable action." + "line": 55 }, { "name": "AuditSubject", @@ -58,21 +64,20 @@ { "name": "subject_id", "type": "str", - "default": "" + "line": 70 }, { "name": "subject_type", "type": "str", - "default": "" + "line": 71 }, { "name": "display_name", "type": "str | None", - "default": "None" + "line": 72 } ], - "line": 65, - "doc": "Record, document, workflow, or other entity affected by an action." + "line": 65 }, { "name": "AuditEvent", @@ -83,51 +88,50 @@ { "name": "event_id", "type": "str", - "default": "Field(default_factory=lambda: str(uuid4()))" + "line": 80 }, { "name": "actor", "type": "AuditActor", - "default": "" + "line": 81 }, { "name": "action", "type": "str", - "default": "" + "line": 82 }, { "name": "subject", "type": "AuditSubject", - "default": "" + "line": 83 }, { "name": "source_module", "type": "str", - "default": "" + "line": 84 }, { "name": "timestamp", "type": "datetime", - "default": "Field(default_factory=_utc_now)" + "line": 85 }, { "name": "metadata", "type": "dict[str, Any]", - "default": "Field(default_factory=dict)" + "line": 86 }, { "name": "previous_hash", "type": "str | None", - "default": "None" + "line": 87 }, { "name": "current_hash", "type": "str | None", - "default": "None" + "line": 88 } ], - "line": 75, - "doc": "One audit event with deterministic hash-chain fields." + "line": 75 }, { "name": "AuditHashChain", @@ -138,11 +142,10 @@ { "name": "events", "type": "list[AuditEvent]", - "default": "Field(default_factory=list)" + "line": 164 } ], - "line": 159, - "doc": "In-memory helper for building and verifying hash-chained events." + "line": 159 }, { "name": "PersistedAuditLogEntry", @@ -153,55 +156,56 @@ { "name": "previous_hash", "type": "str", - "default": "Field(default=ZERO_HASH, min_length=64, max_length=64)" + "line": 203 }, { "name": "entry_hash", "type": "str", - "default": "Field(min_length=64, max_length=64)" + "line": 204 }, { "name": "timestamp", "type": "datetime | str", - "default": "" + "line": 205 }, { "name": "actor_id", "type": "str | None", - "default": "None" + "line": 206 }, { "name": "action", "type": "str", - "default": "" + "line": 207 }, { "name": "details", "type": "dict[str, Any] | None", - "default": "None" + "line": 208 }, { "name": "entry_id", "type": "int | str | None", - "default": "None" + "line": 209 } ], - "line": 192, - "doc": "Storage-neutral view of a legacy persisted audit-log row.\n\nThis model preserves the historical Townlight Records hash formula for\ndatabase-backed ``audit_log`` rows. It intentionally lives beside, rather\nthan replacing, ``AuditEvent`` because existing deployed rows must continue\nto verify after modules move their reusable audit math into Townlight Core." + "line": 192 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/auth/__init__.py", - "sha256": "7a3f307c6fc4ac465688b2ad83b49b85d551721d248e569d0acbb8bf0db49f5a", + "source": "townlight_core/auth/__init__.py", + "sha256": "04eb39badadea67810426e791606cafdbd7dfe05491baabc56feaab7d4e660bd", + "bytes": 2711, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/auth/bearer.py", - "sha256": "6515b07ecf4be9fc344ab05eeef891b165f3e0310387dfa3a59fc2531c5dacb9", + "source": "townlight_core/auth/bearer.py", + "sha256": "28a8ef40450dd3a0b5424916f8d50f08945c7b961170702971ad8686c928ec59", + "bytes": 6057, "routes": [], "models": [ { @@ -211,38 +215,38 @@ { "name": "token_fingerprint", "type": "str | None", - "default": "" + "line": 19 }, { "name": "roles", "type": "frozenset[str]", - "default": "" + "line": 20 }, { "name": "auth_method", "type": "str", - "default": "'bearer'" + "line": 21 }, { "name": "subject", "type": "str | None", - "default": "None" + "line": 22 }, { "name": "provider", "type": "str | None", - "default": "None" + "line": 23 } ], - "line": 16, - "doc": "Represents the caller that satisfied a bearer-token role check." + "line": 16 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/auth/department_scope.py", - "sha256": "57905c13074c10acdf07f7a353634bf3e51b1f42f67cd6f7b3d8920dca91f7d1", + "source": "townlight_core/auth/department_scope.py", + "sha256": "78e0840399fbd1b447436e231cc0fee52e77a2271b32f383cbbe9035d9fe23ce", + "bytes": 27460, "routes": [], "models": [ { @@ -254,51 +258,50 @@ { "name": "scope_id", "type": "str", - "default": "Field(min_length=2, max_length=64)" + "line": 158 }, { "name": "subject", "type": "str", - "default": "Field(min_length=1, max_length=320)" + "line": 159 }, { "name": "department_id", "type": "UUID", - "default": "" + "line": 160 }, { "name": "sequence", "type": "int", - "default": "Field(ge=1)" + "line": 161 }, { "name": "action", "type": "GrantAction", - "default": "" + "line": 162 }, { "name": "roles", "type": "tuple[str, ...]", - "default": "()" + "line": 163 }, { "name": "recorded_by", "type": "str", - "default": "Field(min_length=1, max_length=128)" + "line": 164 }, { "name": "recorded_at", "type": "AwareDatetime", - "default": "" + "line": 165 }, { "name": "content_sha256", "type": "str", - "default": "Field(min_length=64, max_length=64)" + "line": 166 } ], - "line": 148, - "doc": "One persisted grant/revoke event for a subject in one scope and department.\n\nRows are append-only: a ``revoke`` event does not delete the earlier ``grant`` event, it\nsupersedes it. ``sequence`` is monotonic per ``(scope_id, subject, department_id)`` so the\nactive state is always the highest-sequence event." + "line": 148 }, { "name": "DepartmentEntitlement", @@ -307,26 +310,25 @@ { "name": "department_id", "type": "UUID", - "default": "" + "line": 213 }, { "name": "roles", "type": "frozenset[str]", - "default": "" + "line": 214 }, { "name": "granted_by", "type": "str", - "default": "" + "line": 215 }, { "name": "granted_at", "type": "datetime", - "default": "" + "line": 216 } ], - "line": 210, - "doc": "A department this subject may reach, with the roles granted there." + "line": 210 }, { "name": "DepartmentAuthority", @@ -335,56 +337,55 @@ { "name": "scope_id", "type": "str", - "default": "" + "line": 228 }, { "name": "subject", "type": "str", - "default": "" + "line": 229 }, { "name": "auth_method", "type": "str", - "default": "" + "line": 230 }, { "name": "provider", "type": "str | None", - "default": "" + "line": 231 }, { "name": "roles", "type": "frozenset[str]", - "default": "" + "line": 232 }, { "name": "entitlements", "type": "tuple[DepartmentEntitlement, ...]", - "default": "" + "line": 233 }, { "name": "resolved_at", "type": "datetime", - "default": "" + "line": 234 }, { "name": "grants_digest", "type": "str", - "default": "" + "line": 235 }, { "name": "provenance", "type": "Literal['persisted-grant']", - "default": "'persisted-grant'" + "line": 236 }, { "name": "_token", "type": "Any", - "default": "field(default=None, repr=False, compare=False)" + "line": 237 } ], - "line": 220, - "doc": "The only object Core consumers may use to scope search, exports and model context.\n\nInstances are produced by :func:`resolve_department_authority`. Direct construction raises\n:class:`AuthorityProvenanceError`, because a hand-built authority would be exactly the\n\"trust the caller's department claim\" hole this contract exists to close." + "line": 220 }, { "name": "GrantOutcome", @@ -393,30 +394,31 @@ { "name": "grant", "type": "DepartmentGrant", - "default": "" + "line": 440 }, { "name": "inserted", "type": "bool", - "default": "" + "line": 441 } ], - "line": 437, - "doc": "Result of an append attempt. ``inserted`` is False for an exact repeat." + "line": 437 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/auth/staff_key.py", - "sha256": "ef7dc371bcd7f419d6266cc61aad01884f263edbcca5db7d5ba4dc1e91d251db", + "source": "townlight_core/auth/staff_key.py", + "sha256": "70975c90b8629762c541c50ed63d5ebb230101569caaa7f27741040a92102624", + "bytes": 2495, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/auth/suite_session.py", - "sha256": "e33e13634568261accb2ba6706402de013975f3c58117b987cced3cd92c0db2e", + "source": "townlight_core/auth/suite_session.py", + "sha256": "7276e30b9d2d6ff7c5cf247c7b3f0ad25c532341ea400387a355c6c7d89f028a", + "bytes": 10405, "routes": [], "models": [ { @@ -426,28 +428,28 @@ { "name": "subject", "type": "str", - "default": "" + "line": 38 }, { "name": "roles", "type": "frozenset[str]", - "default": "" + "line": 39 }, { "name": "session_id", "type": "str", - "default": "" + "line": 40 } ], - "line": 35, - "doc": "Immutable principal decoded from a shared Townlight staff session." + "line": 35 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/auth/trusted_headers.py", - "sha256": "771e7cbf1f5d73dafad082d97ebb6e350a49b15362ce50eb36b261172e3b9c5c", + "source": "townlight_core/auth/trusted_headers.py", + "sha256": "e5fb52bfe52188a62f71cc5aca5facccac58c3981802a56a29939edc1804514b", + "bytes": 8041, "routes": [], "models": [ { @@ -457,33 +459,33 @@ { "name": "provider_name", "type": "str", - "default": "" + "line": 20 }, { "name": "principal_header_name", "type": "str", - "default": "" + "line": 21 }, { "name": "roles_header_name", "type": "str", - "default": "" + "line": 22 }, { "name": "trusted_proxy_cidrs", "type": "tuple[str, ...]", - "default": "" + "line": 23 } ], - "line": 17, - "doc": "Service-specific trusted-header auth settings loaded from env/defaults." + "line": 17 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/catalog/__init__.py", - "sha256": "e323a7808ae719b4b90530c238dc945a107ee1cf9a9050cb00d7efbf5aa1a823", + "source": "townlight_core/catalog/__init__.py", + "sha256": "d6348d181abc14c16a11b1e2b63074d2a34efb49416ec3d6fc223af2de21525b", + "bytes": 7654, "routes": [], "models": [ { @@ -495,36 +497,35 @@ { "name": "vendor_name", "type": "str", - "default": "Field(min_length=1, max_length=200)" + "line": 18 }, { "name": "access_protocol", "type": "str", - "default": "Field(min_length=1, max_length=50)" + "line": 19 }, { "name": "data_shape", "type": "str", - "default": "Field(min_length=1, max_length=50)" + "line": 20 }, { "name": "common_record_types", "type": "list[str]", - "default": "Field(max_length=100)" + "line": 21 }, { "name": "redaction_tier", "type": "int", - "default": "Field(ge=1, le=3)" + "line": 22 }, { "name": "discovery_hints", "type": "dict", - "default": "Field(default_factory=dict)" + "line": 23 } ], - "line": 16, - "doc": "" + "line": 16 }, { "name": "DomainInput", @@ -535,16 +536,15 @@ { "name": "domain", "type": "str", - "default": "Field(min_length=1, max_length=100)" + "line": 40 }, { "name": "systems", "type": "list[SystemInput]", - "default": "Field(max_length=500)" + "line": 41 } ], - "line": 38, - "doc": "" + "line": 38 }, { "name": "CatalogInput", @@ -555,30 +555,31 @@ { "name": "catalog_version", "type": "str", - "default": "Field(min_length=1, max_length=20)" + "line": 46 }, { "name": "domains", "type": "list[DomainInput]", - "default": "Field(max_length=100)" + "line": 47 } ], - "line": 44, - "doc": "" + "line": 44 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/city_profile/__init__.py", - "sha256": "c22e26dac2fcb454cbf91bcbf23311fdef9bf854fbb2bba2d76149945986bd72", + "source": "townlight_core/city_profile/__init__.py", + "sha256": "65b6e3fafad6ab9355db419530d2d5398d9529db37eb761468f4a7a14e569b6b", + "bytes": 385, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/city_profile/models.py", - "sha256": "e34b6bbc69f44656ad22217de2b911b5c437fb226b594439f935705c95a47ed6", + "source": "townlight_core/city_profile/models.py", + "sha256": "efddf634764a89de9eef92c50018e78358ab2536be43cd8b50758603d903c4ab", + "bytes": 4868, "routes": [], "models": [ { @@ -590,26 +591,25 @@ { "name": "name", "type": "str", - "default": "Field(min_length=1)" + "line": 21 }, { "name": "slug", "type": "str", - "default": "Field(min_length=1, pattern='^[a-z0-9][a-z0-9-]*$')" + "line": 22 }, { "name": "public_email", "type": "str | None", - "default": "Field(default=None, min_length=3)" + "line": 23 }, { "name": "public_phone", "type": "str | None", - "default": "Field(default=None, min_length=3)" + "line": 24 } ], - "line": 16, - "doc": "A city department surfaced during local onboarding." + "line": 16 }, { "name": "DeploymentProfile", @@ -620,16 +620,15 @@ { "name": "mode", "type": "Literal['local_demo', 'local', 'self_hosted']", - "default": "'local_demo'" + "line": 32 }, { "name": "allow_outbound_services", "type": "bool", - "default": "False" + "line": 33 } ], - "line": 27, - "doc": "Deployment posture for a profile without acting as an installer." + "line": 27 }, { "name": "ModuleEnablement", @@ -640,21 +639,20 @@ { "name": "name", "type": "str", - "default": "Field(min_length=1, pattern='^[a-z0-9][a-z0-9_-]*$')" + "line": 41 }, { "name": "enabled", "type": "bool", - "default": "True" + "line": 42 }, { "name": "settings", "type": "dict[str, Any]", - "default": "Field(default_factory=dict)" + "line": 43 } ], - "line": 36, - "doc": "Per-module enablement flags and local configuration metadata." + "line": 36 }, { "name": "CityProfile", @@ -665,60 +663,61 @@ { "name": "city_name", "type": "str", - "default": "Field(min_length=1)" + "line": 51 }, { "name": "timezone", "type": "str", - "default": "Field(min_length=1)" + "line": 52 }, { "name": "departments", "type": "list[DepartmentProfile]", - "default": "Field(default_factory=list)" + "line": 53 }, { "name": "enabled_modules", "type": "list[ModuleEnablement]", - "default": "Field(default_factory=list)" + "line": 54 }, { "name": "default_llm_provider", "type": "str", - "default": "'ollama'" + "line": 55 }, { "name": "file_drop_roots", "type": "list[Path]", - "default": "Field(default_factory=list)" + "line": 56 }, { "name": "public_contact", "type": "dict[str, str]", - "default": "Field(default_factory=dict)" + "line": 57 }, { "name": "deployment", "type": "DeploymentProfile", - "default": "Field(default_factory=DeploymentProfile)" + "line": 58 } ], - "line": 46, - "doc": "Local city profile loaded from trusted JSON/YAML configuration." + "line": 46 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/connectors/__init__.py", - "sha256": "92d5a39aa8241f8fed6405fd0a8b3068994fdeb66ea3f80975ff708dde673870", + "source": "townlight_core/connectors/__init__.py", + "sha256": "4c6cf98564b9c46440fdf01d6895165ad39566e3270da02adbf088fd8f242a7f", + "bytes": 1732, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/connectors/delta.py", - "sha256": "d99e5624e0eebcc434146909d65040eba0023cc84b2d5d03ce1de2b36c70e52f", + "source": "townlight_core/connectors/delta.py", + "sha256": "58de5706cd1e50043ffccc6bae552c094dab2b156235bf5959f3af2a28fa7741", + "bytes": 3211, "routes": [], "models": [ { @@ -728,48 +727,48 @@ { "name": "connector", "type": "str", - "default": "" + "line": 22 }, { "name": "request_url", "type": "str", - "default": "" + "line": 23 }, { "name": "delta_enabled", "type": "bool", - "default": "" + "line": 24 }, { "name": "cursor_param", "type": "str | None", - "default": "" + "line": 25 }, { "name": "cursor_value", "type": "str | None", - "default": "" + "line": 26 }, { "name": "message", "type": "str", - "default": "" + "line": 27 }, { "name": "fix", "type": "str", - "default": "" + "line": 28 } ], - "line": 19, - "doc": "Storage-neutral plan for a full or cursor-based vendor pull." + "line": 19 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/connectors/imports.py", - "sha256": "1ed6dafe0072eb57327e7d61b12df801f79bfb9ea7ea1738548afb5a002e0606", + "source": "townlight_core/connectors/imports.py", + "sha256": "d8471df1e6c8ca2ae5f63a8e70419e83129e24fc8ee885a2803c0d023c57fe0e", + "bytes": 7068, "routes": [], "models": [ { @@ -781,16 +780,15 @@ { "name": "message", "type": "str", - "default": "" + "line": 16 }, { "name": "fix", "type": "str", - "default": "" + "line": 17 } ], - "line": 13, - "doc": "Actionable validation error for local connector import payloads." + "line": 13 }, { "name": "ImportedAgendaItem", @@ -799,26 +797,25 @@ { "name": "external_item_id", "type": "str", - "default": "" + "line": 30 }, { "name": "title", "type": "str", - "default": "" + "line": 31 }, { "name": "department", "type": "str | None", - "default": "" + "line": 32 }, { "name": "connector", "type": "str", - "default": "" + "line": 33 } ], - "line": 27, - "doc": "Normalized agenda item imported from a local connector payload." + "line": 27 }, { "name": "ImportedMeeting", @@ -827,38 +824,38 @@ { "name": "connector", "type": "str", - "default": "" + "line": 52 }, { "name": "external_meeting_id", "type": "str", - "default": "" + "line": 53 }, { "name": "title", "type": "str", - "default": "" + "line": 54 }, { "name": "scheduled_start", "type": "str", - "default": "" + "line": 55 }, { "name": "agenda_items", "type": "tuple[ImportedAgendaItem, ...]", - "default": "" + "line": 56 } ], - "line": 49, - "doc": "Normalized meeting imported from a local connector payload." + "line": 49 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/connectors/manifest.py", - "sha256": "15caa167acce428facdf7683085d47dd4a01b02cc2d05df25d6aa1d157bb79bd", + "source": "townlight_core/connectors/manifest.py", + "sha256": "2d7ee3abedf89af90ee2f3c474925d11b93aa3117370aeee4ee5f783dad347a4", + "bytes": 8356, "routes": [], "models": [ { @@ -870,31 +867,30 @@ { "name": "path", "type": "str", - "default": "" + "line": 46 }, { "name": "byte_size", "type": "int", - "default": "Field(ge=0)" + "line": 47 }, { "name": "sha256", "type": "str", - "default": "" + "line": 48 }, { "name": "media_type", "type": "str | None", - "default": "None" + "line": 49 }, { "name": "description", "type": "str | None", - "default": "None" + "line": 50 } ], - "line": 43, - "doc": "A file entry recorded in an import or export manifest." + "line": 43 }, { "name": "_ManifestBase", @@ -905,46 +901,45 @@ { "name": "manifest_version", "type": "str", - "default": "'1.0'" + "line": 80 }, { "name": "module_name", "type": "str", - "default": "" + "line": 81 }, { "name": "module_version", "type": "str", - "default": "" + "line": 82 }, { - "name": "civiccore_version", + "name": "townlight_core_version", "type": "str", - "default": "" + "line": 83 }, { "name": "purpose", "type": "ManifestPurpose", - "default": "" + "line": 84 }, { "name": "source_files", "type": "list[ManifestFile]", - "default": "Field(default_factory=list)" + "line": 85 }, { "name": "generated_files", "type": "list[ManifestFile]", - "default": "Field(default_factory=list)" + "line": 86 }, { "name": "limitations", "type": "list[str]", - "default": "Field(default_factory=list)" + "line": 87 } ], - "line": 79, - "doc": "" + "line": 79 }, { "name": "ImportManifest", @@ -955,11 +950,10 @@ { "name": "purpose", "type": "ImportPurpose", - "default": "" + "line": 126 } ], - "line": 123, - "doc": "Manifest for offline file-drop, CSV, or GeoJSON imports." + "line": 123 }, { "name": "ExportManifest", @@ -970,18 +964,18 @@ { "name": "purpose", "type": "ExportPurpose", - "default": "'static_export_bundle'" + "line": 138 } ], - "line": 135, - "doc": "Manifest for an offline static export bundle." + "line": 135 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/connectors/sync.py", - "sha256": "ef8bb329bf9d385fd96c617e58a8495989dd76a5d641e0afae3fcf3cba2ca503", + "source": "townlight_core/connectors/sync.py", + "sha256": "b3323199a3be7739aa2a1b6aaee9efca861a86ac7e3764b04637c13e5128172e", + "bytes": 13744, "routes": [], "models": [ { @@ -991,31 +985,30 @@ { "name": "max_attempts", "type": "int", - "default": "3" + "line": 31 }, { "name": "base_delay_seconds", "type": "float", - "default": "1.0" + "line": 32 }, { "name": "jitter_factor", "type": "float", - "default": "0.2" + "line": 33 }, { "name": "max_backoff_seconds", "type": "float", - "default": "30.0" + "line": 34 }, { "name": "retry_after_cap_seconds", "type": "float", - "default": "600.0" + "line": 35 } ], - "line": 28, - "doc": "HTTP retry policy for live vendor connector calls." + "line": 28 }, { "name": "SyncCircuitPolicy", @@ -1024,21 +1017,20 @@ { "name": "full_failure_threshold", "type": "int", - "default": "5" + "line": 46 }, { "name": "grace_period_failure_threshold", "type": "int", - "default": "2" + "line": 47 }, { "name": "grace_period_reason", "type": "str", - "default": "'grace_period'" + "line": 48 } ], - "line": 43, - "doc": "Circuit-breaker thresholds shared by live connector consumers." + "line": 43 }, { "name": "SyncCircuitState", @@ -1047,51 +1039,50 @@ { "name": "connector", "type": "str", - "default": "" + "line": 55 }, { "name": "source_name", "type": "str", - "default": "'connector source'" + "line": 56 }, { "name": "consecutive_failure_count", "type": "int", - "default": "0" + "line": 57 }, { "name": "active_failure_count", "type": "int", - "default": "0" + "line": 58 }, { "name": "sync_paused", "type": "bool", - "default": "False" + "line": 59 }, { "name": "sync_paused_at", "type": "datetime | None", - "default": "None" + "line": 60 }, { "name": "sync_paused_reason", "type": "str | None", - "default": "None" + "line": 61 }, { "name": "last_sync_status", "type": "str | None", - "default": "None" + "line": 62 }, { "name": "last_error_at", "type": "datetime | None", - "default": "None" + "line": 63 } ], - "line": 52, - "doc": "Storage-neutral state needed to compute live-sync health." + "line": 52 }, { "name": "SyncRunResult", @@ -1100,31 +1091,30 @@ { "name": "records_discovered", "type": "int", - "default": "" + "line": 74 }, { "name": "records_succeeded", "type": "int", - "default": "" + "line": 75 }, { "name": "records_failed", "type": "int", - "default": "" + "line": 76 }, { "name": "retries_attempted", "type": "int", - "default": "0" + "line": 77 }, { "name": "error_summary", "type": "str | None", - "default": "None" + "line": 78 } ], - "line": 71, - "doc": "Normalized result summary for one connector sync run." + "line": 71 }, { "name": "SyncOperatorStatus", @@ -1133,51 +1123,50 @@ { "name": "connector", "type": "str", - "default": "" + "line": 97 }, { "name": "source_name", "type": "str", - "default": "" + "line": 98 }, { "name": "health_status", "type": "SyncHealthStatus", - "default": "" + "line": 99 }, { "name": "consecutive_failure_count", "type": "int", - "default": "" + "line": 100 }, { "name": "active_failure_count", "type": "int", - "default": "" + "line": 101 }, { "name": "sync_paused", "type": "bool", - "default": "" + "line": 102 }, { "name": "sync_paused_reason", "type": "str | None", - "default": "" + "line": 103 }, { "name": "message", "type": "str", - "default": "" + "line": 104 }, { "name": "fix", "type": "str", - "default": "" + "line": 105 } ], - "line": 94, - "doc": "Actionable health copy that can be rendered directly in module UIs." + "line": 94 }, { "name": "SyncSourceStatus", @@ -1186,75 +1175,76 @@ { "name": "connector", "type": "str", - "default": "" + "line": 125 }, { "name": "source_name", "type": "str", - "default": "" + "line": 126 }, { "name": "health_status", "type": "SyncHealthStatus", - "default": "" + "line": 127 }, { "name": "consecutive_failure_count", "type": "int", - "default": "" + "line": 128 }, { "name": "active_failure_count", "type": "int", - "default": "" + "line": 129 }, { "name": "sync_paused", "type": "bool", - "default": "" + "line": 130 }, { "name": "sync_paused_reason", "type": "str | None", - "default": "" + "line": 131 }, { "name": "last_sync_status", "type": "str | None", - "default": "" + "line": 132 }, { "name": "next_sync_at", "type": "datetime | None", - "default": "" + "line": 133 }, { "name": "message", "type": "str", - "default": "" + "line": 134 }, { "name": "fix", "type": "str", - "default": "" + "line": 135 } ], - "line": 122, - "doc": "Storage-neutral status projection for module connector source lists." + "line": 122 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/db/__init__.py", - "sha256": "19fc1241d2d81b136813d1ca7ebb47d3831a5ffccec8b548237577ddcd65aebb", + "source": "townlight_core/db/__init__.py", + "sha256": "e42367febc6c5201dd39755c988c9e2c4cc3c3f3d8fe2d9a61bff7af63c651b2", + "bytes": 596, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/exemptions/__init__.py", - "sha256": "83575c21379e697bbbc42b124c8674d8dc99020006f4806237eed0fb71083173", + "source": "townlight_core/exemptions/__init__.py", + "sha256": "edac488a794152402c2b523d5f846096a15d964906a0bbd61346e9e0d5d5ec94", + "bytes": 5566, "routes": [], "models": [ { @@ -1264,36 +1254,35 @@ { "name": "id", "type": "UUID", - "default": "" + "line": 27 }, { "name": "state_code", "type": "str", - "default": "" + "line": 28 }, { "name": "category", "type": "str", - "default": "" + "line": 29 }, { "name": "rule_type", "type": "str", - "default": "" + "line": 30 }, { "name": "definition", "type": "str", - "default": "" + "line": 31 }, { "name": "version", "type": "int", - "default": "" + "line": 32 } ], - "line": 26, - "doc": "" + "line": 26 }, { "name": "FlagResult", @@ -1302,43 +1291,43 @@ { "name": "category", "type": "str", - "default": "" + "line": 37 }, { "name": "matched_text", "type": "str", - "default": "" + "line": 38 }, { "name": "confidence", "type": "float", - "default": "" + "line": 39 }, { "name": "rule_id", "type": "UUID | None", - "default": "None" + "line": 40 }, { "name": "rule_type", "type": "str", - "default": "'regex'" + "line": 41 }, { "name": "rule_version", "type": "int | None", - "default": "None" + "line": 42 } ], - "line": 36, - "doc": "" + "line": 36 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/exemptions/history.py", - "sha256": "b6b1e5be26a6c7a16391d34b6e50e4c08eb19d5cc25788db8917b0b46044b0ea", + "source": "townlight_core/exemptions/history.py", + "sha256": "f58d7c1072189fa1260d54a2dba026b09de1b046b24bdfaebe9ccab55d1bdc74", + "bytes": 16427, "routes": [], "models": [ { @@ -1350,61 +1339,60 @@ { "name": "rule_id", "type": "UUID", - "default": "" + "line": 98 }, { "name": "state_code", "type": "str", - "default": "Field(min_length=2, max_length=2)" + "line": 99 }, { "name": "version", "type": "int", - "default": "Field(ge=1)" + "line": 100 }, { "name": "category", "type": "str", - "default": "Field(min_length=1, max_length=100)" + "line": 101 }, { "name": "rule_type", "type": "Literal['regex', 'keyword']", - "default": "" + "line": 103 }, { "name": "rule_definition", "type": "str", - "default": "Field(min_length=1, max_length=8000)" + "line": 104 }, { "name": "citation_text", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 105 }, { "name": "citation_url", "type": "str | None", - "default": "Field(default=None, max_length=2000)" + "line": 106 }, { "name": "effective_from", "type": "date | None", - "default": "None" + "line": 107 }, { "name": "retrieved_at", "type": "AwareDatetime", - "default": "" + "line": 108 }, { "name": "coverage_declaration", "type": "Literal['synthetic-fixture', 'tenant-supplied']", - "default": "" + "line": 109 } ], - "line": 93, - "doc": "One cited rule version as supplied by an authorized caller." + "line": 93 }, { "name": "RuleVersion", @@ -1413,71 +1401,70 @@ { "name": "rule_id", "type": "UUID", - "default": "" + "line": 155 }, { "name": "state_code", "type": "str", - "default": "" + "line": 156 }, { "name": "version", "type": "int", - "default": "" + "line": 157 }, { "name": "category", "type": "str", - "default": "" + "line": 158 }, { "name": "rule_type", "type": "str", - "default": "" + "line": 159 }, { "name": "rule_definition", "type": "str", - "default": "" + "line": 160 }, { "name": "citation_text", "type": "str", - "default": "" + "line": 161 }, { "name": "citation_url", "type": "str | None", - "default": "" + "line": 162 }, { "name": "effective_from", "type": "date | None", - "default": "" + "line": 163 }, { "name": "retrieved_at", "type": "object", - "default": "" + "line": 164 }, { "name": "coverage_declaration", "type": "str", - "default": "" + "line": 165 }, { "name": "content_sha256", "type": "str", - "default": "" + "line": 166 }, { "name": "recorded_by", "type": "str", - "default": "" + "line": 167 } ], - "line": 152, - "doc": "A persisted, immutable cited rule version." + "line": 152 }, { "name": "RecordOutcome", @@ -1486,28 +1473,28 @@ { "name": "rule_version", "type": "RuleVersion", - "default": "" + "line": 183 }, { "name": "inserted", "type": "bool", - "default": "" + "line": 184 }, { "name": "fingerprint", "type": "str", - "default": "" + "line": 185 } ], - "line": 182, - "doc": "" + "line": 182 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/exemptions/patterns.py", + "source": "townlight_core/exemptions/patterns.py", "sha256": "b8c4ea484f1fe521295d29eebcc36703c4560d274b36c88f5af28f5abded98af", + "bytes": 5982, "routes": [], "models": [ { @@ -1517,31 +1504,30 @@ { "name": "name", "type": "str", - "default": "" + "line": 16 }, { "name": "category", "type": "str", - "default": "" + "line": 17 }, { "name": "pattern", "type": "re.Pattern", - "default": "" + "line": 18 }, { "name": "description", "type": "str", - "default": "" + "line": 19 }, { "name": "confidence", "type": "float", - "default": "" + "line": 20 } ], - "line": 15, - "doc": "" + "line": 15 }, { "name": "PIIMatch", @@ -1550,50 +1536,51 @@ { "name": "pattern_name", "type": "str", - "default": "" + "line": 150 }, { "name": "category", "type": "str", - "default": "" + "line": 151 }, { "name": "matched_text", "type": "str", - "default": "" + "line": 152 }, { "name": "start", "type": "int", - "default": "" + "line": 153 }, { "name": "end", "type": "int", - "default": "" + "line": 154 }, { "name": "confidence", "type": "float", - "default": "" + "line": 155 } ], - "line": 149, - "doc": "" + "line": 149 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/exports/__init__.py", - "sha256": "7b46221c065defc5c31f148cdc5d2464ff6f665d786499b90a0059474fe9713c", + "source": "townlight_core/exports/__init__.py", + "sha256": "0b855da9162dda8954a082a7fd90efcf118b89b4a2019c2f9f497e1db0696f89", + "bytes": 346, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/exports/bundle.py", - "sha256": "22075c7ad189a9eb958b16a5cb4ef759213789f63e799e78b585a671a84ea5bd", + "source": "townlight_core/exports/bundle.py", + "sha256": "86ce615b7a1a6a73134f88fb82712738610bde6da23d4a3fa7ba3d66e0408af0", + "bytes": 7190, "routes": [], "models": [ { @@ -1605,50 +1592,51 @@ { "name": "module_name", "type": "str", - "default": "" + "line": 57 }, { "name": "module_version", "type": "str", - "default": "" + "line": 58 }, { - "name": "civiccore_version", + "name": "townlight_core_version", "type": "str", - "default": "CIVICCORE_VERSION" + "line": 59 }, { "name": "purpose", "type": "str", - "default": "'static_export_bundle'" + "line": 60 }, { "name": "files", "type": "list[BundleFile]", - "default": "Field(default_factory=list)" + "line": 61 }, { "name": "limitations", "type": "list[str]", - "default": "Field(default_factory=list)" + "line": 62 } ], - "line": 54, - "doc": "Description of a static export bundle that can be validated offline." + "line": 54 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/__init__.py", - "sha256": "6bef6d820315269d126b92aafa02a6d023c6c8706e378003a0cbad434318b791", + "source": "townlight_core/ingest/__init__.py", + "sha256": "a73d8e5e2d5e8c85774c139d72886a8b3cf37d84a2f3108522e6cbaaa95e0b83", + "bytes": 1342, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/chunker.py", - "sha256": "cf9515ec9aecfa7a5b4bbe077c99711ecce651c6c155a4bef07475e404a96c83", + "source": "townlight_core/ingest/chunker.py", + "sha256": "8d3fa815c5ad9f920447467dfe0d08729a0a48d053f0fcc6d78877b97936c55d", + "bytes": 2303, "routes": [], "models": [ { @@ -1658,33 +1646,33 @@ { "name": "text", "type": "str", - "default": "" + "line": 6 }, { "name": "index", "type": "int", - "default": "" + "line": 7 }, { "name": "page_number", "type": "int | None", - "default": "None" + "line": 8 }, { "name": "token_count", "type": "int", - "default": "0" + "line": 9 } ], - "line": 5, - "doc": "" + "line": 5 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/contracts.py", - "sha256": "7536789de18c66e150ad16986c44a794c6ad3353c5dd9e1b29b10f24fa5afaca", + "source": "townlight_core/ingest/contracts.py", + "sha256": "68e2ea96be6e81be5ed543c7bf3eafe80a7cdf02d78be6d9e50f7e519d73266a", + "bytes": 2977, "routes": [], "models": [ { @@ -1694,36 +1682,35 @@ { "name": "status", "type": "HealthStatus", - "default": "" + "line": 19 }, { "name": "latency_ms", "type": "int | None", - "default": "None" + "line": 20 }, { "name": "error_message", "type": "str | None", - "default": "None" + "line": 21 }, { "name": "records_available", "type": "int | None", - "default": "None" + "line": 22 }, { "name": "schema_hash", "type": "str | None", - "default": "None" + "line": 23 }, { "name": "checked_at", "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(timezone.utc))" + "line": 24 } ], - "line": 18, - "doc": "" + "line": 18 }, { "name": "DiscoveredRecord", @@ -1732,36 +1719,35 @@ { "name": "source_path", "type": "str", - "default": "" + "line": 31 }, { "name": "filename", "type": "str", - "default": "" + "line": 32 }, { "name": "file_type", "type": "str", - "default": "" + "line": 33 }, { "name": "file_size", "type": "int", - "default": "" + "line": 34 }, { "name": "last_modified", "type": "datetime | None", - "default": "None" + "line": 35 }, { "name": "metadata", "type": "dict", - "default": "field(default_factory=dict)" + "line": 36 } ], - "line": 28, - "doc": "A record discovered in a source system." + "line": 28 }, { "name": "FetchedDocument", @@ -1770,36 +1756,35 @@ { "name": "source_path", "type": "str", - "default": "" + "line": 43 }, { "name": "filename", "type": "str", - "default": "" + "line": 44 }, { "name": "file_type", "type": "str", - "default": "" + "line": 45 }, { "name": "content", "type": "bytes", - "default": "" + "line": 46 }, { "name": "file_size", "type": "int", - "default": "" + "line": 47 }, { "name": "metadata", "type": "dict", - "default": "field(default_factory=dict)" + "line": 48 } ], - "line": 40, - "doc": "A document fetched from a source system, ready for ingest." + "line": 40 }, { "name": "SourceMaterial", @@ -1808,21 +1793,20 @@ { "name": "source_id", "type": "str", - "default": "" + "line": 55 }, { "name": "label", "type": "str", - "default": "" + "line": 56 }, { "name": "text", "type": "str", - "default": "" + "line": 57 } ], - "line": 52, - "doc": "Human-readable source text that downstream workflows may cite." + "line": 52 }, { "name": "CitedSentence", @@ -1831,16 +1815,15 @@ { "name": "text", "type": "str", - "default": "" + "line": 71 }, { "name": "citations", "type": "tuple[str, ...]", - "default": "" + "line": 72 } ], - "line": 68, - "doc": "One output sentence plus the source ids it cites." + "line": 68 }, { "name": "CitationValidationError", @@ -1849,49 +1832,39 @@ { "name": "message", "type": "str", - "default": "" + "line": 83 }, { "name": "fix", "type": "str", - "default": "" + "line": 84 } ], - "line": 82, - "doc": "" + "line": 82 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/embedder.py", - "sha256": "655ae601f7901c847507e7ef4ab7cc3b77463e7ca1011831d9006b44cb3045ea", + "source": "townlight_core/ingest/embedder.py", + "sha256": "ae0eceb9f2c7345d849556d9dbb52349fa50676b970012a91eeda4e090f56cd4", + "bytes": 1653, "routes": [], "models": [], - "configuration": [ - { - "variable": "OLLAMA_BASE_URL", - "default": "'http://localhost:11434'", - "line": 13 - } - ] + "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/llm_extractor.py", - "sha256": "bfa082031b17b4a1af58472eb3faac4cd6cbc91f2d9a2f7e59763f5c92fa5680", + "source": "townlight_core/ingest/llm_extractor.py", + "sha256": "4a4d4d1464e32f8b9abe77c67472c75e59352b78265ac33112611dd940b3b445", + "bytes": 3128, "routes": [], "models": [], - "configuration": [ - { - "variable": "OLLAMA_BASE_URL", - "default": "'http://localhost:11434'", - "line": 15 - } - ] + "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/models.py", - "sha256": "a10de63e573ec5d4df5d258265f07695e6ed1805b3cf02897828dfe6008f73bd", + "source": "townlight_core/ingest/models.py", + "sha256": "08076031a8f61e62813665fa544e71a8957a9f79ef34a8316e983ba15855c288", + "bytes": 6450, "routes": [], "models": [ { @@ -1903,131 +1876,130 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 41 }, { "name": "name", "type": "Mapped[str]", - "default": "mapped_column(String(255), unique=True)" + "line": 42 }, { "name": "source_type", "type": "Mapped[SourceType]", - "default": "mapped_column(Enum(SourceType, name='source_type', create_type=False, values_callable=lambda e: [m.value for m in e]))" + "line": 43 }, { "name": "connection_config", "type": "Mapped[dict[str, Any]]", - "default": "mapped_column(JSONB, default=dict)" + "line": 46 }, { "name": "is_active", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=True)" + "line": 47 }, { "name": "created_by", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True))" + "line": 51 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 52 }, { "name": "last_ingestion_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 53 }, { "name": "discovered_source_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(nullable=True)" + "line": 55 }, { "name": "connector_template_id", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 56 }, { "name": "sync_schedule", "type": "Mapped[str | None]", - "default": "mapped_column(String(50), nullable=True)" + "line": 57 }, { "name": "schedule_enabled", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=True, server_default='true')" + "line": 58 }, { "name": "last_sync_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 59 }, { "name": "last_sync_cursor", "type": "Mapped[str | None]", - "default": "mapped_column(String, nullable=True)" + "line": 60 }, { "name": "last_sync_status", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 61 }, { "name": "consecutive_failure_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0, server_default='0')" + "line": 63 }, { "name": "last_error_message", "type": "Mapped[str | None]", - "default": "mapped_column(String(500), nullable=True)" + "line": 64 }, { "name": "last_error_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 65 }, { "name": "sync_paused", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=False, server_default='false')" + "line": 66 }, { "name": "sync_paused_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 67 }, { "name": "sync_paused_reason", "type": "Mapped[str | None]", - "default": "mapped_column(String(200), nullable=True)" + "line": 68 }, { "name": "retry_batch_size", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 69 }, { "name": "retry_time_limit_seconds", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 70 }, { "name": "health_status", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 71 }, { "name": "schema_hash", "type": "Mapped[str | None]", - "default": "mapped_column(String(64), nullable=True)" + "line": 72 } ], - "line": 36, - "doc": "Source system or corpus that owns ingested documents." + "line": 36 }, { "name": "Document", @@ -2038,101 +2010,100 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 80 }, { "name": "source_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('data_sources.id'), index=True)" + "line": 81 }, { "name": "source_path", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 82 }, { "name": "filename", "type": "Mapped[str]", - "default": "mapped_column(String(500))" + "line": 83 }, { "name": "file_type", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 84 }, { "name": "file_hash", "type": "Mapped[str]", - "default": "mapped_column(String(64), index=True)" + "line": 85 }, { "name": "file_size", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 86 }, { "name": "ingestion_status", "type": "Mapped[IngestionStatus]", - "default": "mapped_column(Enum(IngestionStatus, name='ingestion_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=IngestionStatus.PENDING)" + "line": 87 }, { "name": "ingestion_error", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 96 }, { "name": "chunk_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 97 }, { "name": "ingested_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 98 }, { "name": "metadata_", "type": "Mapped[dict[str, Any] | None]", - "default": "mapped_column('metadata', JSONB, nullable=True)" + "line": 99 }, { "name": "connector_type", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 101 }, { "name": "updated_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 102 }, { "name": "display_name", "type": "Mapped[str | None]", - "default": "mapped_column(String(500), nullable=True)" + "line": 104 }, { "name": "department_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(nullable=True)" + "line": 105 }, { "name": "redaction_status", "type": "Mapped[str]", - "default": "mapped_column(String(20), server_default='none')" + "line": 106 }, { "name": "derivative_path", "type": "Mapped[str | None]", - "default": "mapped_column(String(1000), nullable=True)" + "line": 107 }, { "name": "original_locked", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, server_default='false')" + "line": 108 } ], - "line": 75, - "doc": "One ingested file or structured record." + "line": 75 }, { "name": "DocumentChunk", @@ -2143,55 +2114,56 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 118 }, { "name": "document_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('documents.id', ondelete='CASCADE'), index=True)" + "line": 119 }, { "name": "chunk_index", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 122 }, { "name": "content_text", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 123 }, { "name": "embedding", "type": "Mapped[list[float] | None]", - "default": "mapped_column(Vector(768), nullable=True)" + "line": 124 }, { "name": "token_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 125 }, { "name": "page_number", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 126 } ], - "line": 113, - "doc": "Sentence-aware chunk text and vector embedding for one document." + "line": 113 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/__init__.py", - "sha256": "f6d7f512bae3794abd587b16845f42af7689ada1f994aca134389f922a445537", + "source": "townlight_core/ingest/parsers/__init__.py", + "sha256": "143dc760e3328838da545d9bcbd2e02a30e9761e1c906eed79713ca521e06692", + "bytes": 1072, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/base.py", - "sha256": "d2618295496026752492dcbab6230d8973ed51f4a91984f7150e1bb064c36423", + "source": "townlight_core/ingest/parsers/base.py", + "sha256": "95e1302e3e2dfabc8cf91d4086706d06e35474e68e4ed3e35a9f08185764fe1f", + "bytes": 878, "routes": [], "models": [ { @@ -2201,21 +2173,20 @@ { "name": "text", "type": "str", - "default": "" + "line": 7 }, { "name": "page_number", "type": "int | None", - "default": "None" + "line": 8 }, { "name": "metadata", "type": "dict", - "default": "field(default_factory=dict)" + "line": 9 } ], - "line": 6, - "doc": "" + "line": 6 }, { "name": "ParseResult", @@ -2224,21 +2195,20 @@ { "name": "pages", "type": "list[ParsedPage]", - "default": "" + "line": 13 }, { "name": "metadata", "type": "dict", - "default": "field(default_factory=dict)" + "line": 14 }, { "name": "file_type", "type": "str", - "default": "''" + "line": 15 } ], - "line": 12, - "doc": "" + "line": 12 }, { "name": "BaseParser", @@ -2249,67 +2219,74 @@ { "name": "supported_extensions", "type": "list[str]", - "default": "[]" + "line": 26 } ], - "line": 25, - "doc": "" + "line": 25 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/csv_parser.py", - "sha256": "7c8208fed09911e4f8153ab3c7d1fcfc281b5aec016589b697a728769bdcb41c", + "source": "townlight_core/ingest/parsers/csv_parser.py", + "sha256": "73e60408c70bb358deb0d6a00a2af942539743128b1c3e5e545f95ad6b27b463", + "bytes": 799, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/docx.py", - "sha256": "224542a9d2ebfdf9d3ef8947c7040ec683d13b507462a9c929e167c6b05529f3", + "source": "townlight_core/ingest/parsers/docx.py", + "sha256": "a101377c0cc7585f8bc91ad2f2f0e8790468e93ca663a29875d0cf605f5add56", + "bytes": 3349, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/email.py", - "sha256": "a83333d1ed5498fd56c61b47ce897b3d2c3b221070d7d13b000ea95336ea08e1", + "source": "townlight_core/ingest/parsers/email.py", + "sha256": "067103e5dea87b75d4f9eb23ecb9313d59f343fc777d41d3d201ab6c3a32897c", + "bytes": 1267, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/html.py", - "sha256": "a0383c330920702a913140377891e3eed43f029a3c756e9dceade4eb6d81b92e", + "source": "townlight_core/ingest/parsers/html.py", + "sha256": "800f7e82730c897eedb9b815140b2c90ff606bc31a1c57d82b55c69295ed7c76", + "bytes": 804, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/pdf.py", - "sha256": "fe312d998d3224a5cc10ee28c6f76f50a856075b5338370baed56d83ebbc0032", + "source": "townlight_core/ingest/parsers/pdf.py", + "sha256": "77a84cd4080a5d75505f074ed5ccafc619c3a5b7e788f77b254f30da29be095e", + "bytes": 888, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/text.py", - "sha256": "b77c107e8446d92e1fa0ce4f11ed54906e02c2bc5980c19e344c175d635c3441", + "source": "townlight_core/ingest/parsers/text.py", + "sha256": "40ac3d40fb1cbddc34ab5d03347f1c0836992516895df34ca5bfa4a51022d903", + "bytes": 578, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/parsers/xlsx.py", - "sha256": "3bd37c6f389644b630d44fe4964f5f82623469ae2855c04e81437b0fbe9f8fe0", + "source": "townlight_core/ingest/parsers/xlsx.py", + "sha256": "4bca7a22946eea259a61a5d97040b290e82271d1ad2964fcf65988cef0643e94", + "bytes": 3230, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/ingest/pipeline.py", - "sha256": "6d1cbe9794d4bf98e22ddbf18ba4bed5bb96e8a0231f87075b92eeebac4bf570", + "source": "townlight_core/ingest/pipeline.py", + "sha256": "6cda90ee5128384ca716760865ed28d76f2b46ce141c7df9395b311e5d8d4459", + "bytes": 13615, "routes": [], "models": [ { @@ -2321,25 +2298,26 @@ { "name": "supported_extensions", "type": "list[str]", - "default": "" + "line": 22 } ], - "line": 19, - "doc": "Parser-like handler contract for file suffixes." + "line": 19 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/__init__.py", - "sha256": "7f8341c07da53f39684a477f9b4fe88ce425a3dc5444f9ac6560eca9787bdac5", + "source": "townlight_core/llm/__init__.py", + "sha256": "ed910741b77a88421ad13583f6d0858361b016e28dfc8d2350bfee5f058836ab", + "bytes": 3865, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/context.py", - "sha256": "e7df765626e5ff642e0b86c36771379662ce35594b147391fef0566835762daa", + "source": "townlight_core/llm/context.py", + "sha256": "d032bc3bf9b0150528ebee667b4cb684bfd739223d30c569e4eb2894829857d8", + "bytes": 8808, "routes": [], "models": [ { @@ -2349,36 +2327,35 @@ { "name": "system_instruction", "type": "int", - "default": "500" + "line": 37 }, { "name": "request_context", "type": "int", - "default": "500" + "line": 38 }, { "name": "retrieved_chunks", "type": "int", - "default": "5000" + "line": 39 }, { "name": "exemption_rules", "type": "int", - "default": "500" + "line": 40 }, { "name": "output_reservation", "type": "int", - "default": "1500" + "line": 41 }, { "name": "safety_margin", "type": "int", - "default": "192" + "line": 42 } ], - "line": 34, - "doc": "Token budget allocation for an LLM call." + "line": 34 }, { "name": "ContextBlock", @@ -2387,56 +2364,60 @@ { "name": "role", "type": "str", - "default": "" + "line": 60 }, { "name": "content", "type": "str", - "default": "" + "line": 61 }, { "name": "estimated_tokens", "type": "int", - "default": "0" + "line": 62 } ], - "line": 57, - "doc": "A block of content with its role and estimated token count." + "line": 57 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/factory.py", - "sha256": "0497147ca6d8af7c4b233a4157089fe4911bb49d0ea214f4fce9ac4c65e48aee", + "source": "townlight_core/llm/factory.py", + "sha256": "e2358941f74a34a659e8f79f42f897309be4ce99c6882d8318cec87ce1a23bb5", + "bytes": 2948, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/providers/__init__.py", - "sha256": "4decd4720c452fa27d1b245a603d409b7dc99db1c5015dbdb3ae29d745ac61fc", + "source": "townlight_core/llm/providers/__init__.py", + "sha256": "6590c160c8baefb7049826b23d187d46b66eb657afb645ca0a4c8d43d840805f", + "bytes": 1316, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/providers/anthropic.py", - "sha256": "dba9eb64c724fe8a209dbac48743f99463f99e0c1c67b1306d9126985348b267", + "source": "townlight_core/llm/providers/anthropic.py", + "sha256": "b60ffd6acc8eb71a9ea53a101124bbc97adcfed14b59bc74361a5a10b22aa5a4", + "bytes": 5338, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/providers/base.py", - "sha256": "fe430884bcaf7678f625db6203312e1f1dcdce617db36870623e87b5ac066b32", + "source": "townlight_core/llm/providers/base.py", + "sha256": "57f4cc31b824641b6533353a08069ad8efe164e2f2795dced911f1a489a6e12a", + "bytes": 3845, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/providers/config.py", - "sha256": "db4ee77e2e0a3ac16fd71df4f0979fab89d36b2ff1985c1e2d4498299810fd3a", + "source": "townlight_core/llm/providers/config.py", + "sha256": "b82987ff817044c3f3493fb9e97d5e0ce49c5dee138545264119596ced9358f5", + "bytes": 1836, "routes": [], "models": [ { @@ -2448,26 +2429,25 @@ { "name": "base_url", "type": "str", - "default": "Field(default='http://localhost:11434')" + "line": 18 }, { "name": "default_model", "type": "str", - "default": "Field(default='gemma4:e4b')" + "line": 19 }, { "name": "default_embed_model", "type": "str", - "default": "Field(default='nomic-embed-text')" + "line": 20 }, { "name": "think", "type": "bool | str | None", - "default": "Field(default=None)" + "line": 23 } ], - "line": 12, - "doc": "Config schema for OllamaProvider.\n\nAll fields have sensible defaults \u2014 Ollama runs locally and does not\nrequire credentials." + "line": 12 }, { "name": "OpenAIConfig", @@ -2478,21 +2458,20 @@ { "name": "api_key", "type": "str", - "default": "Field(min_length=1, description='OpenAI API key')" + "line": 32 }, { "name": "default_model", "type": "str", - "default": "Field(default='gpt-4o-mini')" + "line": 33 }, { "name": "default_embed_model", "type": "str", - "default": "Field(default='text-embedding-3-small')" + "line": 34 } ], - "line": 26, - "doc": "Config schema for OpenAIProvider.\n\napi_key is required; passing it via env var is the caller's responsibility\n(e.g., `OpenAIConfig(api_key=os.environ[\"OPENAI_API_KEY\"])`)." + "line": 26 }, { "name": "AnthropicConfig", @@ -2503,56 +2482,60 @@ { "name": "api_key", "type": "str", - "default": "Field(min_length=1, description='Anthropic API key')" + "line": 43 }, { "name": "default_model", "type": "str", - "default": "Field(default='claude-haiku-4-5')" + "line": 44 }, { "name": "max_tokens", "type": "int", - "default": "Field(default=4096, gt=0)" + "line": 45 } ], - "line": 37, - "doc": "Config schema for AnthropicProvider.\n\napi_key is required. max_tokens is a sensible default (4096) and can be\nincreased for longer outputs." + "line": 37 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/providers/ollama.py", - "sha256": "bd1c78980c464dd41c7fdc24d9c362d17d20d343c9eac3c01000609bacd47e2b", + "source": "townlight_core/llm/providers/ollama.py", + "sha256": "c7514fc0f714f520b90e0b93300fa4ba292f84bd770a8bdede416921f2bb9054", + "bytes": 4789, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/providers/openai.py", - "sha256": "d54920131ea2f0f14b8eee8c970dce47bf5ee5886815626f09f765fd8d4f4a30", + "source": "townlight_core/llm/providers/openai.py", + "sha256": "b7d86e8967dbb9733ddbadb62622d22b969dcae3891eb4f08ef41a25a0630295", + "bytes": 4684, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/providers/registry.py", - "sha256": "2733af50366c7e8975c1b552fbe5302ed12d284abd59e65768ac8453d3639870", + "source": "townlight_core/llm/providers/registry.py", + "sha256": "9fce82b519c2e327fff38f3a4cd4c0638b941f5b08ea7c9ff8c44f65c8143fb3", + "bytes": 3234, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/registry/__init__.py", - "sha256": "9223edf2e5652dcee6612a2593299b12e06c6e46f24b4784d9d97bdda333a3d0", + "source": "townlight_core/llm/registry/__init__.py", + "sha256": "37336ea704f8a53133a5b0a08eb78e63ebbbba00f63193cec7f492b5f7e69100", + "bytes": 1711, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/registry/models.py", - "sha256": "f58ccb6ce42a7d344c4de7432ca3623e7865a59c91646736e1d397b565e07b0e", + "source": "townlight_core/llm/registry/models.py", + "sha256": "0aceeca8a9a101bd0cf8a0362043eae7c5500f8f9d9f71fc8bf4d3f409165545", + "bytes": 2328, "routes": [], "models": [ { @@ -2564,147 +2547,107 @@ { "name": "id", "type": "Mapped[int]", - "default": "mapped_column(Integer, primary_key=True)" + "line": 34 }, { "name": "model_name", "type": "Mapped[str]", - "default": "mapped_column(String(255), nullable=False)" + "line": 35 }, { "name": "model_version", "type": "Mapped[str | None]", - "default": "mapped_column(String(100), nullable=True)" + "line": 36 }, { "name": "parameter_count", "type": "Mapped[str | None]", - "default": "mapped_column(String(50), nullable=True)" + "line": 37 }, { "name": "license", "type": "Mapped[str | None]", - "default": "mapped_column(String(100), nullable=True)" + "line": 38 }, { "name": "model_card_url", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 39 }, { "name": "is_active", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, nullable=False, server_default='false')" + "line": 40 }, { "name": "added_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(TIMESTAMP(timezone=True), nullable=True)" + "line": 43 }, { "name": "context_window_size", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 46 }, { "name": "supports_ner", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, nullable=False, server_default='false')" + "line": 47 }, { "name": "supports_vision", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, nullable=False, server_default='false')" + "line": 50 } ], - "line": 29, - "doc": "ORM model for the model_registry table." + "line": 29 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/registry/router.py", - "sha256": "03815bc31f8b2651acee939dd370f44c91a2c92e663ebe25273986540a379b2f", + "source": "townlight_core/llm/registry/router.py", + "sha256": "29c58ae8b9c85648deb54b557a5f2f78a2d92157e5d624dffbb3c9a1c0d7bd2c", + "bytes": 3424, "routes": [ { "method": "GET", - "path": "/admin/models", - "router": "router", - "prefix_resolved": true, - "name": "list_models", - "signature": "session: AsyncSession=Depends(get_session)", - "returns": "", - "line": 46, - "doc": "", - "decorator": "router.get('', response_model=list[ModelRegistryRead])", - "errors": [] + "declared_path": "", + "function": "list_models", + "line": 46 }, { "method": "GET", - "path": "/admin/models/{model_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_model", - "signature": "model_id: int, session: AsyncSession=Depends(get_session)", - "returns": "", - "line": 53, - "doc": "", - "decorator": "router.get('/{model_id}', response_model=ModelRegistryRead)", - "errors": [ - "HTTPException(status_code=404, detail=f'Model {model_id} not found')" - ] + "declared_path": "/{model_id}", + "function": "get_model", + "line": 53 }, { "method": "POST", - "path": "/admin/models", - "router": "router", - "prefix_resolved": true, - "name": "create_model", - "signature": "payload: ModelRegistryCreate, session: AsyncSession=Depends(get_session)", - "returns": "", - "line": 61, - "doc": "", - "decorator": "router.post('', response_model=ModelRegistryRead, status_code=201)", - "errors": [] + "declared_path": "", + "function": "create_model", + "line": 61 }, { "method": "PATCH", - "path": "/admin/models/{model_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_model", - "signature": "model_id: int, payload: ModelRegistryUpdate, session: AsyncSession=Depends(get_session)", - "returns": "", - "line": 73, - "doc": "", - "decorator": "router.patch('/{model_id}', response_model=ModelRegistryRead)", - "errors": [ - "HTTPException(status_code=404, detail=f'Model {model_id} not found')" - ] + "declared_path": "/{model_id}", + "function": "update_model", + "line": 73 }, { "method": "DELETE", - "path": "/admin/models/{model_id}", - "router": "router", - "prefix_resolved": true, - "name": "delete_model", - "signature": "model_id: int, session: AsyncSession=Depends(get_session)", - "returns": "", - "line": 89, - "doc": "", - "decorator": "router.delete('/{model_id}', status_code=204)", - "errors": [ - "HTTPException(status_code=404, detail=f'Model {model_id} not found')" - ] + "declared_path": "/{model_id}", + "function": "delete_model", + "line": 89 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/registry/schemas.py", - "sha256": "324d0b48abc8d3d0b7a66f9763145a29fed4e81a6b8a59f865b63fb1ab980bfe", + "source": "townlight_core/llm/registry/schemas.py", + "sha256": "fe336b9719d82b236e6afc353671eb8eb3e6ed13343a3c941a80b4473582683d", + "bytes": 2133, "routes": [], "models": [ { @@ -2716,51 +2659,50 @@ { "name": "model_name", "type": "str", - "default": "" + "line": 21 }, { "name": "model_version", "type": "str | None", - "default": "None" + "line": 22 }, { "name": "parameter_count", "type": "str | None", - "default": "None" + "line": 23 }, { "name": "license", "type": "str | None", - "default": "None" + "line": 24 }, { "name": "model_card_url", "type": "str | None", - "default": "None" + "line": 25 }, { "name": "is_active", "type": "bool", - "default": "False" + "line": 26 }, { "name": "context_window_size", "type": "int | None", - "default": "None" + "line": 27 }, { "name": "supports_ner", "type": "bool", - "default": "False" + "line": 28 }, { "name": "supports_vision", "type": "bool", - "default": "False" + "line": 29 } ], - "line": 18, - "doc": "Schema for creating a new model_registry record (POST body)." + "line": 18 }, { "name": "ModelRegistryRead", @@ -2771,61 +2713,60 @@ { "name": "id", "type": "int", - "default": "" + "line": 40 }, { "name": "model_name", "type": "str", - "default": "" + "line": 41 }, { "name": "model_version", "type": "str | None", - "default": "None" + "line": 42 }, { "name": "parameter_count", "type": "str | None", - "default": "None" + "line": 43 }, { "name": "license", "type": "str | None", - "default": "None" + "line": 44 }, { "name": "model_card_url", "type": "str | None", - "default": "None" + "line": 45 }, { "name": "is_active", "type": "bool", - "default": "" + "line": 46 }, { "name": "added_at", "type": "datetime | None", - "default": "None" + "line": 47 }, { "name": "context_window_size", "type": "int | None", - "default": "None" + "line": 48 }, { "name": "supports_ner", "type": "bool", - "default": "" + "line": 49 }, { "name": "supports_vision", "type": "bool", - "default": "" + "line": 50 } ], - "line": 32, - "doc": "Schema for returning a model_registry record (GET response).\n\n``from_attributes=True`` allows construction directly from an ORM instance." + "line": 32 }, { "name": "ModelRegistryUpdate", @@ -2836,79 +2777,82 @@ { "name": "model_name", "type": "str | None", - "default": "None" + "line": 60 }, { "name": "model_version", "type": "str | None", - "default": "None" + "line": 61 }, { "name": "parameter_count", "type": "str | None", - "default": "None" + "line": 62 }, { "name": "license", "type": "str | None", - "default": "None" + "line": 63 }, { "name": "model_card_url", "type": "str | None", - "default": "None" + "line": 64 }, { "name": "is_active", "type": "bool | None", - "default": "None" + "line": 65 }, { "name": "context_window_size", "type": "int | None", - "default": "None" + "line": 66 }, { "name": "supports_ner", "type": "bool | None", - "default": "None" + "line": 67 }, { "name": "supports_vision", "type": "bool | None", - "default": "None" + "line": 68 } ], - "line": 53, - "doc": "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." + "line": 53 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/registry/service.py", - "sha256": "9280f0161a4db25de8182f214fa9d143ef2b1bfc3dac65b1b83b570ed12ee407", + "source": "townlight_core/llm/registry/service.py", + "sha256": "06d9babf0786d2d06069d98f9f2bbf51b881b1349c418ba2b1282644c098f3b7", + "bytes": 2811, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/structured.py", - "sha256": "9f7ad6645f2a02aa6a41207906be09a6e1adfc70a89c6eb78387e78cb807477a", + "source": "townlight_core/llm/structured.py", + "sha256": "a8e3558896c8fdf339548a2d6d7e68bfafb88c1fb0913f3870fe7abd8a7cd17d", + "bytes": 5876, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/templates/__init__.py", - "sha256": "a00806b2b0d3c3b7dd966dee85db8f2ee6178697c6f222c28abe4454518ba341", + "source": "townlight_core/llm/templates/__init__.py", + "sha256": "47c5b3b7fefe918ccd77b9d0c1b524db6ba8750240ccd5b74d6e45f0cdce841f", + "bytes": 1742, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/templates/engine.py", - "sha256": "cb4f72ba249be0264c827c4503b64dea8b61fe525ebb1a93870a9ba58b46d5df", + "source": "townlight_core/llm/templates/engine.py", + "sha256": "d3b2d8618b20092302dd5fd4d10c3cb6ceb6f3b3c11aeaf1aa8c17568b1d71a0", + "bytes": 3187, "routes": [], "models": [ { @@ -2918,45 +2862,46 @@ { "name": "system", "type": "str", - "default": "" + "line": 31 }, { "name": "user", "type": "str", - "default": "" + "line": 32 }, { "name": "template_name", "type": "str", - "default": "" + "line": 33 }, { "name": "consumer_app", "type": "str", - "default": "" + "line": 34 }, { "name": "version", "type": "int", - "default": "" + "line": 35 } ], - "line": 20, - "doc": "Result of rendering a PromptTemplate.\n\nAttributes:\n system: Rendered system_prompt string.\n user: Rendered user_prompt_template string.\n template_name: The source template's logical name.\n consumer_app: The source template's consumer_app namespace.\n version: The source template's version number." + "line": 20 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/templates/exceptions.py", - "sha256": "53bbdcfd915d751cc878edc148a39b52424b5c34a4d03ed8120d763464967a96", + "source": "townlight_core/llm/templates/exceptions.py", + "sha256": "5b40a69202c7dfb3292563716ecfda9b0255694795ff88308c57303fd8cccd73", + "bytes": 2331, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/templates/models.py", - "sha256": "c1a61785d12d40657aad28ead8f8d27c947634ab159bc48b4309788ae4ed674d", + "source": "townlight_core/llm/templates/models.py", + "sha256": "6c460d2cd19320d4b905020c644001bcf5ab117dce2e1bfae18642018d5307be", + "bytes": 3958, "routes": [], "models": [ { @@ -2968,92 +2913,94 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 51 }, { "name": "template_name", "type": "Mapped[str]", - "default": "mapped_column(String(200), nullable=False)" + "line": 56 }, { "name": "consumer_app", "type": "Mapped[str]", - "default": "mapped_column(String(100), nullable=False, server_default='civiccore')" + "line": 57 }, { "name": "is_override", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, nullable=False, server_default='false')" + "line": 60 }, { "name": "purpose", "type": "Mapped[str]", - "default": "mapped_column(String(50), nullable=False)" + "line": 63 }, { "name": "system_prompt", "type": "Mapped[str]", - "default": "mapped_column(Text, nullable=False)" + "line": 64 }, { "name": "user_prompt_template", "type": "Mapped[str]", - "default": "mapped_column(Text, nullable=False)" + "line": 65 }, { "name": "token_budget", "type": "Mapped[dict | None]", - "default": "mapped_column(JSONB, nullable=True)" + "line": 66 }, { "name": "model_id", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, ForeignKey('model_registry.id', ondelete='SET NULL'), nullable=True)" + "line": 67 }, { "name": "version", "type": "Mapped[int]", - "default": "mapped_column(Integer, nullable=False, server_default='1')" + "line": 72 }, { "name": "is_active", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, nullable=False, server_default='true')" + "line": 75 }, { "name": "created_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(PG_UUID(as_uuid=True), nullable=True)" + "line": 84 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now())" + "line": 88 } ], - "line": 37, - "doc": "ORM model for the prompt_templates table." + "line": 37 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/templates/overrides.py", - "sha256": "6a32018a76d803c74408937b75e6d3ad597f247d533e2d8092ce7bbccc0d0cd1", + "source": "townlight_core/llm/templates/overrides.py", + "sha256": "d5a896fb685ccae553bc2471512f597a054023b9f360bfe416dcc5227837d644", + "bytes": 2545, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/templates/resolver.py", - "sha256": "389bf9b01902b046f8986fc3415125c859bf8a4923e07d146d0cdd75587b9636", + "source": "townlight_core/llm/templates/resolver.py", + "sha256": "44c1555f884f9bf8605671ea4cc18c431aa317bf1ddc91100e845a76572f9603", + "bytes": 4157, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/llm/templates/schemas.py", - "sha256": "f012308c13d12ec8e338335c5ba451d73c171605697a79a8f3dba334f4af1854", + "source": "townlight_core/llm/templates/schemas.py", + "sha256": "931cbb7e2c3a714e7c76239c18e7be8db1a97e520cb143e24ce15d799921f15b", + "bytes": 1769, "routes": [], "models": [ { @@ -3065,61 +3012,60 @@ { "name": "template_name", "type": "str", - "default": "" + "line": 17 }, { "name": "purpose", "type": "str", - "default": "" + "line": 18 }, { "name": "system_prompt", "type": "str", - "default": "" + "line": 19 }, { "name": "user_prompt_template", "type": "str", - "default": "" + "line": 20 }, { "name": "consumer_app", "type": "str", - "default": "'civiccore'" + "line": 23 }, { "name": "is_override", "type": "bool", - "default": "False" + "line": 24 }, { "name": "token_budget", "type": "dict | None", - "default": "None" + "line": 25 }, { "name": "model_id", "type": "int | None", - "default": "None" + "line": 26 }, { "name": "version", "type": "int", - "default": "1" + "line": 27 }, { "name": "is_active", "type": "bool", - "default": "True" + "line": 28 }, { "name": "created_by", "type": "uuid.UUID | None", - "default": "None" + "line": 29 } ], - "line": 13, - "doc": "Fields required (or defaulted) when creating a new prompt template." + "line": 13 }, { "name": "PromptTemplateRead", @@ -3130,71 +3076,70 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 37 }, { "name": "template_name", "type": "str", - "default": "" + "line": 38 }, { "name": "consumer_app", "type": "str", - "default": "" + "line": 39 }, { "name": "is_override", "type": "bool", - "default": "" + "line": 40 }, { "name": "purpose", "type": "str", - "default": "" + "line": 41 }, { "name": "system_prompt", "type": "str", - "default": "" + "line": 42 }, { "name": "user_prompt_template", "type": "str", - "default": "" + "line": 43 }, { "name": "token_budget", "type": "dict | None", - "default": "" + "line": 44 }, { "name": "model_id", "type": "int | None", - "default": "" + "line": 45 }, { "name": "version", "type": "int", - "default": "" + "line": 46 }, { "name": "is_active", "type": "bool", - "default": "" + "line": 47 }, { "name": "created_by", "type": "uuid.UUID | None", - "default": "" + "line": 48 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 49 } ], - "line": 32, - "doc": "All columns for reading a prompt template row." + "line": 32 }, { "name": "PromptTemplateUpdate", @@ -3205,192 +3150,213 @@ { "name": "template_name", "type": "str | None", - "default": "None" + "line": 55 }, { "name": "purpose", "type": "str | None", - "default": "None" + "line": 56 }, { "name": "system_prompt", "type": "str | None", - "default": "None" + "line": 57 }, { "name": "user_prompt_template", "type": "str | None", - "default": "None" + "line": 58 }, { "name": "consumer_app", "type": "str | None", - "default": "None" + "line": 59 }, { "name": "is_override", "type": "bool | None", - "default": "None" + "line": 60 }, { "name": "token_budget", "type": "dict | None", - "default": "None" + "line": 61 }, { "name": "model_id", "type": "int | None", - "default": "None" + "line": 62 }, { "name": "version", "type": "int | None", - "default": "None" + "line": 63 }, { "name": "is_active", "type": "bool | None", - "default": "None" + "line": 64 } ], - "line": 52, - "doc": "Partial update schema for PATCH operations. All fields optional." + "line": 52 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/__init__.py", - "sha256": "6cb4358063e7a281454ae36e2aa4565e9048e00d193d1da0bab81df47a453703", + "source": "townlight_core/migrations/__init__.py", + "sha256": "9a745f1756a2685c4d7fa974007c53f419502c238ed3956f97e844e343965c0f", + "bytes": 240, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_core/migrations/alembic.ini", + "sha256": "9f91262372d5cf06551f80272b10a44c197be3ef3e7dcda228271d6346c4eee6", + "bytes": 87, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/env.py", - "sha256": "208de714d58a5b3fa8f3797c05eadba49d0b46105afeb20c50e7685e298fb4cb", + "source": "townlight_core/migrations/env.py", + "sha256": "7ee4f5d2b7bb757689ed8466e665dff961ccb23d0541dd31dca730c806c3ed73", + "bytes": 3012, "routes": [], "models": [], "configuration": [ { - "variable": "DATABASE_URL", - "default": "", + "environment": "DATABASE_URL", "line": 64 }, { - "variable": "DATABASE_URL", - "default": "", + "environment": "DATABASE_URL", "line": 27 } ] }, { - "source": "installed-owned-source/civiccore/migrations/guards.py", - "sha256": "c55de91c7189b39537aed6130a1e9f50817f819bd13aa4728ae4e8dd4c863aad", + "source": "townlight_core/migrations/guards.py", + "sha256": "ad6b3855ae5805aa44d4fd06239047228f0642fb1fc6b504ea47d447aea01608", + "bytes": 7852, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/runner.py", - "sha256": "4f3b554197baf06924cc3676d42df083f14f3a9db1456a775601d975499e354e", + "source": "townlight_core/migrations/runner.py", + "sha256": "20c85f60b4a55c9b01d334718794dd3de67cb81c13a341f3f6ed1a76f9a4f31f", + "bytes": 3669, "routes": [], "models": [], "configuration": [ { - "variable": "DATABASE_URL", - "default": "", + "environment": "DATABASE_URL", "line": 47 } ] }, { - "source": "installed-owned-source/civiccore/migrations/versions/__init__.py", - "sha256": "61c059e42b35e302a4372a1c7697ca495118b123f7303306d7c54ff15173c8c6", + "source": "townlight_core/migrations/versions/__init__.py", + "sha256": "68926a3b7368abcbb421c607eb819cf0d9fefaa908c52e8d52c58700aebf7c47", + "bytes": 307, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0001_baseline_v1.py", - "sha256": "69186f3f798a01d61638ae42993761c3038ced04e143ea8dd292ebc1fc63afb7", + "source": "townlight_core/migrations/versions/townlight_core_0001_baseline_v1.py", + "sha256": "c2c15340fb08bab1113b277fde04a872bbf8acef3876aa8ca4f640ad320e6980", + "bytes": 24152, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0002_llm.py", - "sha256": "fa273e35f651a6298842df0de87bd5548d1a83698adc27e1385ceb28449b00cd", + "source": "townlight_core/migrations/versions/townlight_core_0002_llm.py", + "sha256": "d75548bca06143171c3704405c2671ae5191dc2b5fb85b7239b8a605dc321227", + "bytes": 6312, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0003_local_task_queue.py", - "sha256": "51276a0dc2737fd1fc2615f26d66d942c1df3be2ef40f1513436cd4579b1ecf0", + "source": "townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py", + "sha256": "bc3d01f5e198904380fcc835b108a098ef9ba26f507c7d575219772adf5ab76f", + "bytes": 1909, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0004_catalog.py", - "sha256": "a9f46f8ca1bcde43a2796dd62891ad36840d1067220b16fdde8583a1f700a06d", + "source": "townlight_core/migrations/versions/townlight_core_0004_catalog.py", + "sha256": "8066969475b40be59d11ad9ad724402f3206456a82e440fc12b5f9bd4d3c8026", + "bytes": 748, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0005_job_leases.py", - "sha256": "a6651789d82cb0c39481f16855449bf09d65644c93a97bab1e33f8d7546157f7", + "source": "townlight_core/migrations/versions/townlight_core_0005_job_leases.py", + "sha256": "608b6d0e9bb2c17223b1708f655fe14596a32f0b68e2be86db044fade590cd8d", + "bytes": 899, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0006_rule_history.py", - "sha256": "ac29f724f60125de435235655a052ae3738a286467b1d6d8213a22558994a868", + "source": "townlight_core/migrations/versions/townlight_core_0006_rule_history.py", + "sha256": "c81a1f1c696696702aa1ae895ee6fc7cd2c9010766abf054491e8acc4f2e6302", + "bytes": 4206, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0007_module_inventory.py", - "sha256": "41aefee7ff2de883f92eebb7a39de2f0ed8b6bd4fecf88c6ebfd62a0b3cb7456", + "source": "townlight_core/migrations/versions/townlight_core_0007_module_inventory.py", + "sha256": "d8e4a304527de33536f5362a8eaaabd48992940265a6d72db6d666507433925b", + "bytes": 3596, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0008_department_authority.py", - "sha256": "fa7328f869594d1af2f4daceb4b362cd8ebe304b7e1ecbefaa22497d08430b4a", + "source": "townlight_core/migrations/versions/townlight_core_0008_department_authority.py", + "sha256": "96db7cdaa3c3465ba9f2e3ebe4996f3b9c9238e33f7ce85826dca3280b32901e", + "bytes": 3783, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/migrations/versions/civiccore_0009_job_artifacts.py", - "sha256": "ee8952caff749c4b9df5cbc15c379f69f7066351ea5f7690525136be1481d9d8", + "source": "townlight_core/migrations/versions/townlight_core_0009_job_artifacts.py", + "sha256": "5c02e20fe7b91bd1f27d83191d337326db16a1b528c8b167094f5407f531e55a", + "bytes": 3392, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/models/__init__.py", - "sha256": "213b3086e533a98047d460720e7a1becd7f6196f4a6db989a39253351b8894c9", + "source": "townlight_core/models/__init__.py", + "sha256": "06147bb3a8ca75998557a755cd5966b4b617a9aab53426743f8ed915688f1d81", + "bytes": 363, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/notifications/__init__.py", - "sha256": "988bcb1091aef4451a1566202a6ec50e3b8908770707b5ad45398923bdb2d6be", + "source": "townlight_core/notifications/__init__.py", + "sha256": "a6b1d14746e7609f8b2512b2ef6ccf9c2cc94df1044a7b66d66a39c30636b824", + "bytes": 483, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/notifications/notice.py", - "sha256": "78c2542686403c647859b27f5a7bf7ff832cd29ca3ff4086b32c6e5fc098247b", + "source": "townlight_core/notifications/notice.py", + "sha256": "e6ad671cb058c276424a25ad0ded51b5525e1e2bd06fb7010e2c0049a8217de7", + "bytes": 5268, "routes": [], "models": [ { @@ -3400,31 +3366,30 @@ { "name": "notice_type", "type": "str", - "default": "" + "line": 16 }, { "name": "event_date", "type": "date", - "default": "" + "line": 17 }, { "name": "publish_by", "type": "date", - "default": "" + "line": 18 }, { "name": "reminders", "type": "tuple[str, ...]", - "default": "" + "line": 19 }, { "name": "staff_review_required", "type": "bool", - "default": "" + "line": 20 } ], - "line": 13, - "doc": "Deterministic notice deadline reminders without legal determinations." + "line": 13 }, { "name": "NoticeComplianceWarning", @@ -3433,21 +3398,20 @@ { "name": "code", "type": "str", - "default": "" + "line": 27 }, { "name": "message", "type": "str", - "default": "" + "line": 28 }, { "name": "fix", "type": "str", - "default": "" + "line": 29 } ], - "line": 24, - "doc": "Actionable warning describing a notice-compliance gap." + "line": 24 }, { "name": "NoticeComplianceResult", @@ -3456,75 +3420,76 @@ { "name": "meeting_id", "type": "str", - "default": "" + "line": 39 }, { "name": "notice_type", "type": "str", - "default": "" + "line": 40 }, { "name": "scheduled_start", "type": "datetime", - "default": "" + "line": 41 }, { "name": "posted_at", "type": "datetime", - "default": "" + "line": 42 }, { "name": "minimum_notice_hours", "type": "int", - "default": "" + "line": 43 }, { "name": "deadline_at", "type": "datetime", - "default": "" + "line": 44 }, { "name": "statutory_basis", "type": "str | None", - "default": "" + "line": 45 }, { "name": "approved_by", "type": "str | None", - "default": "" + "line": 46 }, { "name": "compliant", "type": "bool", - "default": "" + "line": 47 }, { "name": "http_status", "type": "int", - "default": "" + "line": 48 }, { "name": "warnings", "type": "tuple[NoticeComplianceWarning, ...]", - "default": "" + "line": 49 } ], - "line": 36, - "doc": "Result of checking whether a meeting notice is ready to publish." + "line": 36 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/onboarding/__init__.py", - "sha256": "d4d47bddbea571ade848657d39a128849e7b02c45a2c5476bd4ee933033a5713", + "source": "townlight_core/onboarding/__init__.py", + "sha256": "571ae2118d589efff98a29f0617b81fbf57ffa564944081ba090cd26aebd5f64", + "bytes": 544, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/onboarding/profile.py", - "sha256": "76f82f3b710700d4d3913a1ec5575c15499e46c11b4bb9ddffa2455710b93a93", + "source": "townlight_core/onboarding/profile.py", + "sha256": "b67bc5f483f07cc7966e6db37bfbd5aa4950f7f9ee530bc7fef27ed792885bd1", + "bytes": 5271, "routes": [], "models": [ { @@ -3534,21 +3499,20 @@ { "name": "name", "type": "str", - "default": "" + "line": 13 }, { "name": "question", "type": "str", - "default": "" + "line": 14 }, { "name": "kind", "type": "str", - "default": "'text'" + "line": 15 } ], - "line": 10, - "doc": "A tracked onboarding field and the default prompt used to ask for it." + "line": 10 }, { "name": "OnboardingProgress", @@ -3557,45 +3521,46 @@ { "name": "next_field", "type": "str | None", - "default": "" + "line": 22 }, { "name": "next_question", "type": "str | None", - "default": "" + "line": 23 }, { "name": "completed_fields", "type": "tuple[str, ...]", - "default": "" + "line": 24 }, { "name": "skipped_fields", "type": "tuple[str, ...]", - "default": "" + "line": 25 }, { "name": "all_complete", "type": "bool", - "default": "" + "line": 26 } ], - "line": 19, - "doc": "Skip-aware progress state for an interview-style onboarding walk." + "line": 19 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/platform/__init__.py", - "sha256": "a8618133480c425c95c6ab8b773261aa430f600603941248148b402341ac9f94", + "source": "townlight_core/platform/__init__.py", + "sha256": "8566d9cb030f415cc760ff53c2d2a86065ba24fb0098a1cf232fafba3a452ec2", + "bytes": 3698, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/platform/backup.py", - "sha256": "15396fd6bdeaebbddead4a619e11090b427dfcb8744dccd582bbbaf5ca49b407", + "source": "townlight_core/platform/backup.py", + "sha256": "3c2580aaf0bad4989fd048927ba4eb669b85fa6fccc5119d656c054a8bfd1bfe", + "bytes": 6873, "routes": [], "models": [ { @@ -3607,31 +3572,30 @@ { "name": "module_id", "type": "str", - "default": "Field(pattern='^[a-z][a-z0-9-]{1,63}$')" + "line": 20 }, { "name": "relative_path", "type": "str", - "default": "Field(min_length=1)" + "line": 21 }, { "name": "size_bytes", "type": "int", - "default": "Field(ge=0)" + "line": 22 }, { "name": "sha256", "type": "str", - "default": "Field(pattern='^[a-f0-9]{64}$')" + "line": 23 }, { "name": "required", "type": "bool", - "default": "True" + "line": 24 } ], - "line": 15, - "doc": "One file captured in a local backup." + "line": 15 }, { "name": "BackupManifest", @@ -3642,41 +3606,40 @@ { "name": "schema_version", "type": "str", - "default": "'1.0'" + "line": 32 }, { "name": "backup_id", "type": "str", - "default": "Field(min_length=1)" + "line": 33 }, { "name": "city_profile_id", "type": "str", - "default": "Field(min_length=1)" + "line": 34 }, { - "name": "civiccore_version", + "name": "townlight_core_version", "type": "str", - "default": "Field(min_length=1)" + "line": 35 }, { "name": "created_at", "type": "datetime", - "default": "Field(default_factory=lambda: datetime.now(UTC))" + "line": 36 }, { "name": "modules", "type": "list[str]", - "default": "Field(default_factory=list)" + "line": 37 }, { "name": "items", "type": "list[BackupItem]", - "default": "" + "line": 38 } ], - "line": 27, - "doc": "Versioned backup manifest for a Townlight local profile." + "line": 27 }, { "name": "BackupValidationResult", @@ -3687,21 +3650,20 @@ { "name": "valid", "type": "bool", - "default": "" + "line": 46 }, { "name": "missing", "type": "list[str]", - "default": "Field(default_factory=list)" + "line": 47 }, { "name": "hash_mismatches", "type": "list[str]", - "default": "Field(default_factory=list)" + "line": 48 } ], - "line": 41, - "doc": "Result of checking a backup manifest against files on disk." + "line": 41 }, { "name": "BackupRestoreAction", @@ -3712,26 +3674,25 @@ { "name": "source_relative_path", "type": "str", - "default": "" + "line": 56 }, { "name": "target_relative_path", "type": "str", - "default": "" + "line": 57 }, { "name": "status", "type": "RestoreActionStatus", - "default": "" + "line": 58 }, { "name": "message", "type": "str", - "default": "" + "line": 59 } ], - "line": 51, - "doc": "One file restore action and its safety status." + "line": 51 }, { "name": "BackupRestorePlan", @@ -3742,28 +3703,28 @@ { "name": "ready", "type": "bool", - "default": "" + "line": 67 }, { "name": "actions", "type": "list[BackupRestoreAction]", - "default": "" + "line": 68 }, { "name": "blocked_reason", "type": "str | None", - "default": "None" + "line": 69 } ], - "line": 62, - "doc": "A non-destructive restore plan." + "line": 62 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/platform/health.py", - "sha256": "41f35066ee9a5c1ea3948605f3acf39c568a8916340598468def3502a0ec1634", + "source": "townlight_core/platform/health.py", + "sha256": "e63da46e405d5505dfde8b29723687698e0f84b7f692f42bdf5ba5468ceb0858", + "bytes": 3592, "routes": [], "models": [ { @@ -3775,46 +3736,45 @@ { "name": "component", "type": "str", - "default": "Field(min_length=1)" + "line": 24 }, { "name": "label", "type": "str", - "default": "Field(min_length=1)" + "line": 25 }, { "name": "status", "type": "PlatformHealthStatus", - "default": "" + "line": 26 }, { "name": "message", "type": "str", - "default": "Field(min_length=1)" + "line": 27 }, { "name": "next_action", "type": "str", - "default": "Field(min_length=1)" + "line": 28 }, { "name": "blocking", "type": "bool", - "default": "False" + "line": 29 }, { "name": "checked_at", "type": "datetime", - "default": "Field(default_factory=lambda: datetime.now(UTC))" + "line": 30 }, { "name": "admin_detail", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 31 } ], - "line": 19, - "doc": "One health check result suitable for staff/admin health screens." + "line": 19 }, { "name": "PlatformHealthSummary", @@ -3825,48 +3785,48 @@ { "name": "status", "type": "PlatformHealthStatus", - "default": "" + "line": 39 }, { "name": "checks", "type": "list[PlatformHealthCheck]", - "default": "" + "line": 40 }, { "name": "next_action", "type": "str", - "default": "" + "line": 41 }, { "name": "staff_message", "type": "str", - "default": "" + "line": 42 }, { "name": "admin_message", "type": "str", - "default": "" + "line": 43 }, { "name": "blocked_components", "type": "list[str]", - "default": "" + "line": 44 }, { "name": "degraded_components", "type": "list[str]", - "default": "" + "line": 45 } ], - "line": 34, - "doc": "Aggregated health status for the umbrella shell." + "line": 34 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/platform/inventory.py", - "sha256": "b6b1936c8bc2d5ba459370e9406395b3bf899a24ba439ff92ac38ae393fe7dda", + "source": "townlight_core/platform/inventory.py", + "sha256": "843f4399d19f328d98c6988bcc82f42a945ebd53df6833941aac501123dc7f70", + "bytes": 21323, "routes": [], "models": [ { @@ -3878,26 +3838,25 @@ { "name": "module_id", "type": "str", - "default": "Field(min_length=2, max_length=64)" + "line": 125 }, { "name": "version", "type": "str", - "default": "Field(min_length=1)" + "line": 126 }, { "name": "enabled", "type": "bool", - "default": "" + "line": 127 }, { "name": "manifest", "type": "ModuleManifest", - "default": "" + "line": 128 } ], - "line": 120, - "doc": "One module the scope declares it has, plus the manifest it was installed from." + "line": 120 }, { "name": "ModuleInventory", @@ -3908,31 +3867,30 @@ { "name": "scope_id", "type": "str", - "default": "Field(min_length=2, max_length=64)" + "line": 144 }, { "name": "revision", "type": "int", - "default": "Field(ge=1)" + "line": 145 }, { "name": "profile", "type": "InstallProfile", - "default": "'windows_local'" + "line": 146 }, { - "name": "civiccore_version", + "name": "townlight_core_version", "type": "str", - "default": "Field(min_length=1)" + "line": 147 }, { "name": "entries", "type": "list[ModuleInventoryEntry]", - "default": "Field(default_factory=list)" + "line": 148 } ], - "line": 139, - "doc": "A scope's declared installed/enabled module set at one revision." + "line": 139 }, { "name": "InventoryOutcome", @@ -3943,21 +3901,20 @@ { "name": "inventory", "type": "ModuleInventory", - "default": "" + "line": 209 }, { "name": "inserted", "type": "bool", - "default": "" + "line": 210 }, { "name": "fingerprint", "type": "str", - "default": "" + "line": 211 } ], - "line": 204, - "doc": "Result of one append attempt." + "line": 204 }, { "name": "ModuleRecommendation", @@ -3968,38 +3925,38 @@ { "name": "module_id", "type": "str", - "default": "Field(min_length=2, max_length=64)" + "line": 415 }, { "name": "action", "type": "RecommendationAction", - "default": "" + "line": 416 }, { "name": "basis", "type": "RecommendationBasis", - "default": "" + "line": 417 }, { "name": "reasons", "type": "list[str]", - "default": "Field(min_length=1)" + "line": 418 }, { "name": "operator_action", "type": "str", - "default": "Field(min_length=1)" + "line": 419 } ], - "line": 410, - "doc": "Advisory next step for one module. Never installation or health evidence." + "line": 410 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/platform/modules.py", - "sha256": "7d3af6bcdc8cc3af90c6c663f5e0ea4571cfe607b0c3ee76a3ce0f966cb8a0c3", + "source": "townlight_core/platform/modules.py", + "sha256": "7857122ac3cc026595b8f326a8b232fd8c23b9735b49df7c776f1a34f2b0ac15", + "bytes": 15072, "routes": [], "models": [ { @@ -4011,21 +3968,20 @@ { "name": "module_id", "type": "str", - "default": "Field(pattern=MODULE_ID_PATTERN)" + "line": 51 }, { "name": "min_version", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 52 }, { "name": "required", "type": "bool", - "default": "True" + "line": 53 } ], - "line": 46, - "doc": "Another Townlight module required by a manifest." + "line": 46 }, { "name": "ModulePermission", @@ -4036,31 +3992,30 @@ { "name": "key", "type": "str", - "default": "Field(pattern=SLUG_PATTERN)" + "line": 61 }, { "name": "label", "type": "str", - "default": "Field(min_length=1)" + "line": 62 }, { "name": "description", "type": "str", - "default": "Field(min_length=1)" + "line": 63 }, { "name": "surface", "type": "ModuleSurface", - "default": "'staff'" + "line": 64 }, { "name": "roles", "type": "list[str]", - "default": "Field(default_factory=list)" + "line": 65 } ], - "line": 56, - "doc": "Permission surfaced to the shell and module manager." + "line": 56 }, { "name": "ModuleRoute", @@ -4071,31 +4026,30 @@ { "name": "id", "type": "str", - "default": "Field(pattern=SLUG_PATTERN)" + "line": 80 }, { "name": "path", "type": "str", - "default": "Field(pattern='^/[a-z0-9/_:-]*$')" + "line": 81 }, { "name": "label", "type": "str", - "default": "Field(min_length=1)" + "line": 82 }, { "name": "surface", "type": "ModuleSurface", - "default": "'staff'" + "line": 83 }, { "name": "permission", "type": "str | None", - "default": "Field(default=None, pattern=SLUG_PATTERN)" + "line": 84 } ], - "line": 75, - "doc": "A route the desktop shell may expose for a module." + "line": 75 }, { "name": "ModuleService", @@ -4106,36 +4060,35 @@ { "name": "id", "type": "str", - "default": "Field(pattern=SLUG_PATTERN)" + "line": 92 }, { "name": "service_type", "type": "ServiceType", - "default": "" + "line": 93 }, { "name": "description", "type": "str", - "default": "Field(min_length=1)" + "line": 94 }, { "name": "required", "type": "bool", - "default": "True" + "line": 95 }, { "name": "start_order", "type": "int", - "default": "Field(default=100, ge=0)" + "line": 96 }, { "name": "health_check_id", "type": "str | None", - "default": "Field(default=None, pattern=SLUG_PATTERN)" + "line": 97 } ], - "line": 87, - "doc": "A local service, schema, or command needed by a module." + "line": 87 }, { "name": "ModuleMigration", @@ -4146,26 +4099,25 @@ { "name": "id", "type": "str", - "default": "Field(pattern=SLUG_PATTERN)" + "line": 105 }, { "name": "description", "type": "str", - "default": "Field(min_length=1)" + "line": 106 }, { "name": "owner_schema", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 107 }, { "name": "required", "type": "bool", - "default": "True" + "line": 108 } ], - "line": 100, - "doc": "A migration contract that the installer/runtime must apply or verify." + "line": 100 }, { "name": "ModuleHealthCheck", @@ -4176,36 +4128,35 @@ { "name": "id", "type": "str", - "default": "Field(pattern=SLUG_PATTERN)" + "line": 116 }, { "name": "label", "type": "str", - "default": "Field(min_length=1)" + "line": 117 }, { "name": "description", "type": "str", - "default": "Field(min_length=1)" + "line": 118 }, { "name": "blocking", "type": "bool", - "default": "True" + "line": 119 }, { "name": "surface", "type": "Literal['staff', 'admin', 'system']", - "default": "'admin'" + "line": 120 }, { "name": "repair_action", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 121 } ], - "line": 111, - "doc": "A module health check known to the umbrella health center." + "line": 111 }, { "name": "ModuleBackupHook", @@ -4216,26 +4167,25 @@ { "name": "id", "type": "str", - "default": "Field(pattern=SLUG_PATTERN)" + "line": 129 }, { "name": "label", "type": "str", - "default": "Field(min_length=1)" + "line": 130 }, { "name": "includes", "type": "list[str]", - "default": "Field(min_length=1)" + "line": 131 }, { "name": "restore_supported", "type": "bool", - "default": "True" + "line": 132 } ], - "line": 124, - "doc": "A backup/restore hook the module contributes to the shared backup plan." + "line": 124 }, { "name": "ModuleModelRequirement", @@ -4246,51 +4196,50 @@ { "name": "id", "type": "str", - "default": "Field(pattern=SLUG_PATTERN)" + "line": 140 }, { "name": "provider", "type": "Literal['ollama', 'local', 'none', 'openai', 'anthropic']", - "default": "'ollama'" + "line": 141 }, { "name": "model_name", "type": "str", - "default": "Field(min_length=1)" + "line": 142 }, { "name": "required", "type": "bool", - "default": "True" + "line": 143 }, { "name": "local_only", "type": "bool", - "default": "True" + "line": 144 }, { "name": "minimum_context_tokens", "type": "int | None", - "default": "Field(default=None, ge=1)" + "line": 145 }, { "name": "checksum_sha256", "type": "str | None", - "default": "Field(default=None, pattern='^[a-fA-F0-9]{64}$')" + "line": 146 }, { "name": "download_url", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 147 }, { "name": "license_name", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 148 } ], - "line": 135, - "doc": "A model requirement declared by a module." + "line": 135 }, { "name": "ModuleRuntimeRequirement", @@ -4301,31 +4250,30 @@ { "name": "kind", "type": "RuntimeRequirementKind", - "default": "" + "line": 156 }, { "name": "name", "type": "str", - "default": "Field(min_length=1)" + "line": 157 }, { "name": "description", "type": "str", - "default": "Field(min_length=1)" + "line": 158 }, { "name": "required", "type": "bool", - "default": "True" + "line": 159 }, { "name": "operator_visible", "type": "bool", - "default": "False" + "line": 160 } ], - "line": 151, - "doc": "Runtime capability needed by a module." + "line": 151 }, { "name": "ModuleManifest", @@ -4336,101 +4284,100 @@ { "name": "module_id", "type": "str", - "default": "Field(pattern=MODULE_ID_PATTERN)" + "line": 168 }, { "name": "name", "type": "str", - "default": "Field(min_length=1)" + "line": 169 }, { "name": "version", "type": "str", - "default": "Field(min_length=1)" + "line": 170 }, { "name": "package_name", "type": "str", - "default": "Field(min_length=1)" + "line": 171 }, { - "name": "civiccore_min_version", + "name": "townlight_core_min_version", "type": "str", - "default": "Field(min_length=1)" + "line": 172 }, { "name": "enabled_by_default", "type": "bool", - "default": "True" + "line": 173 }, { "name": "surfaces", "type": "list[ModuleSurface]", - "default": "Field(default_factory=lambda: ['staff'])" + "line": 174 }, { "name": "install_profiles", "type": "list[InstallProfile]", - "default": "Field(default_factory=lambda: ['windows_local'])" + "line": 175 }, { "name": "dependencies", "type": "list[ModuleDependency]", - "default": "Field(default_factory=list)" + "line": 176 }, { "name": "routes", "type": "list[ModuleRoute]", - "default": "Field(default_factory=list)" + "line": 177 }, { "name": "permissions", "type": "list[ModulePermission]", - "default": "Field(default_factory=list)" + "line": 178 }, { "name": "services", "type": "list[ModuleService]", - "default": "Field(default_factory=list)" + "line": 179 }, { "name": "migrations", "type": "list[ModuleMigration]", - "default": "Field(default_factory=list)" + "line": 180 }, { "name": "health_checks", "type": "list[ModuleHealthCheck]", - "default": "Field(default_factory=list)" + "line": 181 }, { "name": "backup_hooks", "type": "list[ModuleBackupHook]", - "default": "Field(default_factory=list)" + "line": 182 }, { "name": "model_requirements", "type": "list[ModuleModelRequirement]", - "default": "Field(default_factory=list)" + "line": 183 }, { "name": "runtime_requirements", "type": "list[ModuleRuntimeRequirement]", - "default": "Field(default_factory=list)" + "line": 184 }, { "name": "settings_schema_version", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 185 }, { "name": "metadata", "type": "dict[str, Any]", - "default": "Field(default_factory=dict)" + "line": 186 } ], - "line": 163, - "doc": "Complete manifest for a Townlight module package." + "line": 163 }, { "name": "ModuleRegistryEntry", @@ -4441,46 +4388,45 @@ { "name": "module_id", "type": "str", - "default": "Field(pattern=MODULE_ID_PATTERN)" + "line": 235 }, { "name": "name", "type": "str", - "default": "Field(min_length=1)" + "line": 236 }, { "name": "version", "type": "str", - "default": "Field(min_length=1)" + "line": 237 }, { "name": "enabled", "type": "bool", - "default": "" + "line": 238 }, { "name": "locked", "type": "bool", - "default": "False" + "line": 239 }, { "name": "status", "type": "ModuleRegistryStatus", - "default": "" + "line": 240 }, { "name": "reason", "type": "str | None", - "default": "None" + "line": 241 }, { "name": "manifest", "type": "ModuleManifest", - "default": "" + "line": 242 } ], - "line": 230, - "doc": "One module's resolved state in a runtime profile." + "line": 230 }, { "name": "ModuleRegistryState", @@ -4491,33 +4437,33 @@ { "name": "profile", "type": "InstallProfile", - "default": "'windows_local'" + "line": 250 }, { - "name": "civiccore_version", + "name": "townlight_core_version", "type": "str", - "default": "Field(min_length=1)" + "line": 251 }, { - "name": "civiccore_locked", + "name": "townlight_core_locked", "type": "bool", - "default": "True" + "line": 252 }, { "name": "entries", "type": "list[ModuleRegistryEntry]", - "default": "" + "line": 253 } ], - "line": 245, - "doc": "Resolved module registry for the desktop shell and installer." + "line": 245 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/platform/runtime.py", - "sha256": "8c9ba7958b8fa08e7b0378a78d3693d8a586714555e5de9420a10626283f579a", + "source": "townlight_core/platform/runtime.py", + "sha256": "5328e622bd17db907c66fb424fc8a5d924be0704fc99eff3a8f0dc42f855061e", + "bytes": 1989, "routes": [], "models": [ { @@ -4529,46 +4475,45 @@ { "name": "action", "type": "RuntimeAction", - "default": "" + "line": 33 }, { "name": "status", "type": "RuntimeActionStatus", - "default": "" + "line": 34 }, { "name": "title", "type": "str", - "default": "Field(min_length=1)" + "line": 35 }, { "name": "message", "type": "str", - "default": "Field(min_length=1)" + "line": 36 }, { "name": "next_action", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 37 }, { "name": "evidence", "type": "dict[str, str | int | bool | None]", - "default": "Field(default_factory=dict)" + "line": 38 }, { "name": "started_at", "type": "datetime", - "default": "Field(default_factory=lambda: datetime.now(UTC))" + "line": 39 }, { "name": "completed_at", "type": "datetime | None", - "default": "None" + "line": 40 } ], - "line": 28, - "doc": "Plain-English result returned by installer/runtime APIs." + "line": 28 }, { "name": "LocalRuntimeProfile", @@ -4579,53 +4524,53 @@ { "name": "profile_id", "type": "str", - "default": "Field(min_length=1)" + "line": 48 }, { "name": "city_name", "type": "str", - "default": "Field(min_length=1)" + "line": 49 }, { "name": "data_root", "type": "Path", - "default": "" + "line": 50 }, { "name": "backup_root", "type": "Path", - "default": "" + "line": 51 }, { "name": "module_registry", "type": "ModuleRegistryState", - "default": "" + "line": 52 }, { "name": "model_provider", "type": "str", - "default": "'ollama'" + "line": 53 }, { "name": "local_only", "type": "bool", - "default": "True" + "line": 54 }, { "name": "network_allowed_for", "type": "list[str]", - "default": "Field(default_factory=list)" + "line": 55 } ], - "line": 43, - "doc": "Resolved local runtime profile for one installed city." + "line": 43 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/platform/task_queue.py", - "sha256": "438c2e7364ef0232b62a4ea379b22a679c248c8c1ab9c0b3149fd87ec8e5fb46", + "source": "townlight_core/platform/task_queue.py", + "sha256": "7d5108826b83b154d96412c12e3e52ac70c32412208923e8fef00ef3de8864d6", + "bytes": 12258, "routes": [], "models": [ { @@ -4637,83 +4582,83 @@ { "name": "task_id", "type": "Mapped[str]", - "default": "mapped_column(String(128), primary_key=True)" + "line": 32 }, { "name": "module_id", "type": "Mapped[str]", - "default": "mapped_column(String(64), index=True)" + "line": 33 }, { "name": "task_type", "type": "Mapped[str]", - "default": "mapped_column(String(100), index=True)" + "line": 34 }, { "name": "status", "type": "Mapped[str]", - "default": "mapped_column(String(20), index=True, default='queued')" + "line": 35 }, { "name": "payload", "type": "Mapped[dict[str, Any]]", - "default": "mapped_column(JSONB, default=dict)" + "line": 36 }, { "name": "attempt_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 37 }, { "name": "queued_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True))" + "line": 38 }, { "name": "available_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 39 }, { "name": "last_error", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 40 }, { "name": "idempotency_key", "type": "Mapped[str | None]", - "default": "mapped_column(String(255), nullable=True, unique=True)" + "line": 41 }, { "name": "audit_subject_id", "type": "Mapped[str | None]", - "default": "mapped_column(String(255), nullable=True)" + "line": 42 }, { "name": "claim_token", "type": "Mapped[str | None]", - "default": "mapped_column(String(64), nullable=True)" + "line": 43 }, { "name": "lease_expires_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 44 }, { "name": "cancelled_by", "type": "Mapped[str | None]", - "default": "mapped_column(String(128), nullable=True)" + "line": 47 } ], - "line": 27, - "doc": "Durable local task row used by the Windows local runtime." + "line": 27 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/platform/tasks.py", - "sha256": "cbf2bf5323fb37c5ff58038d77597464b16c6637b205dcf00a03ad274d120847", + "source": "townlight_core/platform/tasks.py", + "sha256": "29f5509deecd7e196d9c43a964e34641c53bd4fa502491e680620a83f9b9622c", + "bytes": 5754, "routes": [], "models": [ { @@ -4725,21 +4670,20 @@ { "name": "max_attempts", "type": "int", - "default": "Field(default=3, ge=1)" + "line": 19 }, { "name": "base_delay_seconds", "type": "int", - "default": "Field(default=30, ge=0)" + "line": 20 }, { "name": "max_delay_seconds", "type": "int", - "default": "Field(default=3600, ge=0)" + "line": 21 } ], - "line": 14, - "doc": "Retry settings for local durable task queues." + "line": 14 }, { "name": "LocalTaskEnvelope", @@ -4750,71 +4694,70 @@ { "name": "task_id", "type": "str", - "default": "Field(min_length=1)" + "line": 29 }, { "name": "module_id", "type": "str", - "default": "Field(pattern='^[a-z][a-z0-9-]{1,63}$')" + "line": 30 }, { "name": "task_type", "type": "str", - "default": "Field(min_length=1)" + "line": 31 }, { "name": "status", "type": "TaskStatus", - "default": "'queued'" + "line": 32 }, { "name": "payload", "type": "dict[str, Any]", - "default": "Field(default_factory=dict)" + "line": 33 }, { "name": "attempt_count", "type": "int", - "default": "Field(default=0, ge=0)" + "line": 34 }, { "name": "queued_at", "type": "datetime", - "default": "Field(default_factory=lambda: datetime.now(UTC))" + "line": 35 }, { "name": "available_at", "type": "datetime | None", - "default": "None" + "line": 36 }, { "name": "last_error", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 37 }, { "name": "idempotency_key", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 38 }, { "name": "audit_subject_id", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 39 }, { "name": "claim_token", "type": "str | None", - "default": "None" + "line": 40 }, { "name": "lease_expires_at", "type": "datetime | None", - "default": "None" + "line": 41 } ], - "line": 24, - "doc": "Storage-neutral task record for module-owned persistence." + "line": 24 }, { "name": "LocalTaskResult", @@ -4825,21 +4768,20 @@ { "name": "task", "type": "LocalTaskEnvelope", - "default": "" + "line": 57 }, { "name": "message", "type": "str", - "default": "" + "line": 58 }, { "name": "retry_at", "type": "datetime | None", - "default": "None" + "line": 59 } ], - "line": 52, - "doc": "Result returned after recording a local task attempt." + "line": 52 }, { "name": "TaskQueueSummary", @@ -4850,40 +4792,41 @@ { "name": "total", "type": "int", - "default": "" + "line": 67 }, { "name": "counts", "type": "dict[str, int]", - "default": "" + "line": 68 }, { "name": "blocked", "type": "bool", - "default": "" + "line": 69 }, { "name": "message", "type": "str", - "default": "" + "line": 70 } ], - "line": 62, - "doc": "Counts and operator copy for a module task queue." + "line": 62 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/provenance/__init__.py", - "sha256": "0f703072d5ba898b13a2683285eb8d57e66815356391103f27d63237467d0ab8", + "source": "townlight_core/provenance/__init__.py", + "sha256": "a54d29222c9fc54bd9dc6dfd237a73003a31bd6508fbb315eff200d316685607", + "bytes": 385, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/provenance/contracts.py", - "sha256": "56dfe26f57056ae1ea85fb8eb808a5259700609483d8e14e67625e123040d57c", + "source": "townlight_core/provenance/contracts.py", + "sha256": "cb75de8d4de91b9b2ab0e1c94f6cd6fd04ca8266b56c24c4603507fb9e7c73fc", + "bytes": 3912, "routes": [], "models": [ { @@ -4895,41 +4838,40 @@ { "name": "label", "type": "str | None", - "default": "None" + "line": 46 }, { "name": "page", "type": "int | None", - "default": "Field(default=None, ge=1)" + "line": 47 }, { "name": "section", "type": "str | None", - "default": "None" + "line": 48 }, { "name": "line_start", "type": "int | None", - "default": "Field(default=None, ge=1)" + "line": 49 }, { "name": "line_end", "type": "int | None", - "default": "Field(default=None, ge=1)" + "line": 50 }, { "name": "parcel_id", "type": "str | None", - "default": "None" + "line": 51 }, { "name": "anchor", "type": "str | None", - "default": "None" + "line": 52 } ], - "line": 41, - "doc": "Locator that lets an export cite a precise place in a source." + "line": 41 }, { "name": "SourceReference", @@ -4940,61 +4882,60 @@ { "name": "source_id", "type": "str", - "default": "" + "line": 60 }, { "name": "kind", "type": "SourceKind", - "default": "" + "line": 61 }, { "name": "title", "type": "str", - "default": "" + "line": 62 }, { "name": "source_system", "type": "str | None", - "default": "None" + "line": 63 }, { "name": "source_path", "type": "str | None", - "default": "None" + "line": 64 }, { "name": "source_url", "type": "str | None", - "default": "None" + "line": 65 }, { "name": "captured_at", "type": "datetime", - "default": "Field(default_factory=_utc_now)" + "line": 66 }, { "name": "checksum", "type": "str | None", - "default": "None" + "line": 67 }, { "name": "retention_hint", "type": "str | None", - "default": "None" + "line": 68 }, { "name": "sensitivity_label", "type": "str | None", - "default": "None" + "line": 69 }, { "name": "citation_locator", "type": "CitationTarget | None", - "default": "Field(default=None, validation_alias=AliasChoices('citation_locator', 'citation'))" + "line": 70 } ], - "line": 55, - "doc": "Metadata for an original source used by Townlight Core." + "line": 55 }, { "name": "DocumentMetadata", @@ -5005,51 +4946,50 @@ { "name": "document_id", "type": "str", - "default": "" + "line": 86 }, { "name": "title", "type": "str", - "default": "" + "line": 87 }, { "name": "source", "type": "SourceReference", - "default": "" + "line": 88 }, { "name": "document_type", "type": "str | None", - "default": "None" + "line": 89 }, { "name": "created_at", "type": "datetime | None", - "default": "None" + "line": 90 }, { "name": "captured_at", "type": "datetime", - "default": "Field(default_factory=_utc_now)" + "line": 91 }, { "name": "checksum", "type": "str | None", - "default": "None" + "line": 92 }, { "name": "retention_hint", "type": "str | None", - "default": "None" + "line": 93 }, { "name": "sensitivity_label", "type": "str | None", - "default": "None" + "line": 94 } ], - "line": 81, - "doc": "Document-level descriptive metadata for export manifests." + "line": 81 }, { "name": "ProvenanceBundle", @@ -5060,72 +5000,74 @@ { "name": "bundle_id", "type": "str", - "default": "" + "line": 109 }, { "name": "generated_at", "type": "datetime", - "default": "Field(default_factory=_utc_now)" + "line": 110 }, { "name": "sources", "type": "list[SourceReference]", - "default": "Field(default_factory=list)" + "line": 111 }, { "name": "documents", "type": "list[DocumentMetadata]", - "default": "Field(default_factory=list)" + "line": 112 } ], - "line": 104, - "doc": "Serializable manifest of sources and documents behind an export." + "line": 104 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/release_provenance.py", - "sha256": "52df52fe6354b741a0cfb759156601fc6682aa34caed7cead9e624ac70e1faf7", + "source": "townlight_core/release_provenance.py", + "sha256": "5b73394b358fed482549e0f544988d85f8acd5b6510609332d3b61fca34cfa28", + "bytes": 22694, "routes": [], "models": [], "configuration": [ { - "variable": "GH_TOKEN", - "default": "", + "environment": "GH_TOKEN", "line": 62 }, { - "variable": "GITHUB_TOKEN", - "default": "", + "environment": "GITHUB_TOKEN", "line": 62 } ] }, { - "source": "installed-owned-source/civiccore/scaffold/__init__.py", - "sha256": "313ad60b0afe49ab6d7632c99d96a13deec90466a74e1d4d375a6c663e4a2266", + "source": "townlight_core/scaffold/__init__.py", + "sha256": "a7cfa7320296bee9a99761fb5c5735ce578914e451b6b54b249ebfb8734f52f1", + "bytes": 1592, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/scaffold/__main__.py", - "sha256": "926a8bb2eede99ffb44ac34a5ff57950df4de748280d37edb38a8cf1c8441819", + "source": "townlight_core/scaffold/__main__.py", + "sha256": "5735e7445cf005e809f9cdfca7485796481f20b40d6ac62978df53cac985a09b", + "bytes": 332, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/scaffold/cli.py", - "sha256": "a2228cce93986f97ae26cbdc5ce402ea31c5e83685b6b2cf31c1e52a4ee669d5", + "source": "townlight_core/scaffold/cli.py", + "sha256": "0e45c64c04a1a86871d41f7acc2c5c62357e1db8248120afc877c46a5fd9d7eb", + "bytes": 5592, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/scaffold/project.py", - "sha256": "343d74719e25beec71fdc0b855f4e1a38db1e338e3a4b62ef1c7b3951e070587", + "source": "townlight_core/scaffold/project.py", + "sha256": "ec9ec04b46d6d26f1764e487d52fcb01fc66ea8b05553c771a289b8c183c8b41", + "bytes": 23120, "routes": [], "models": [ { @@ -5135,21 +5077,20 @@ { "name": "relative_path", "type": "str", - "default": "" + "line": 36 }, { "name": "content", "type": "str", - "default": "" + "line": 37 }, { "name": "executable", "type": "bool", - "default": "False" + "line": 38 } ], - "line": 33, - "doc": "One file the generator will create, relative to the project root." + "line": 33 }, { "name": "ProjectPlan", @@ -5158,21 +5099,20 @@ { "name": "spec", "type": "ModuleSpec", - "default": "" + "line": 47 }, { "name": "project_root_name", "type": "str", - "default": "" + "line": 48 }, { "name": "files", "type": "tuple[PlannedFile, ...]", - "default": "field(default_factory=tuple)" + "line": 49 } ], - "line": 46, - "doc": "" + "line": 46 }, { "name": "GenerationResult", @@ -5181,33 +5121,33 @@ { "name": "spec", "type": "ModuleSpec", - "default": "" + "line": 58 }, { "name": "project_root", "type": "Path", - "default": "" + "line": 59 }, { "name": "created", "type": "tuple[str, ...]", - "default": "" + "line": 60 }, { "name": "dry_run", "type": "bool", - "default": "" + "line": 61 } ], - "line": 57, - "doc": "" + "line": 57 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/scaffold/spec.py", - "sha256": "603e6d89700bf64b4ffc285c06446b9cf9f66b318613de01ca8b5ef94cc134d2", + "source": "townlight_core/scaffold/spec.py", + "sha256": "7f7f2e4b1bed9e331b002ef9c560a25cc4f4d2e81922204455fecb9f490831e8", + "bytes": 5927, "routes": [], "models": [ { @@ -5219,46 +5159,45 @@ { "name": "module_id", "type": "str", - "default": "Field(pattern=MODULE_ID_PATTERN)" + "line": 75 }, { "name": "name", "type": "str", - "default": "Field(min_length=1, max_length=120)" + "line": 76 }, { "name": "description", "type": "str", - "default": "Field(min_length=12, max_length=500)" + "line": 77 }, { "name": "version", "type": "str", - "default": "'0.1.0'" + "line": 78 }, { - "name": "civiccore_min_version", + "name": "townlight_core_min_version", "type": "str", - "default": "'1.3.0.dev1'" + "line": 79 }, { "name": "permission_key", "type": "str | None", - "default": "Field(default=None, pattern=SLUG_PATTERN)" + "line": 80 }, { "name": "staff_roles", "type": "tuple[str, ...]", - "default": "('staff',)" + "line": 81 }, { "name": "route_path", "type": "str | None", - "default": "Field(default=None, pattern=ROUTE_PATH_PATTERN)" + "line": 82 } ], - "line": 65, - "doc": "Everything the generator needs, already validated.\n\n``module_id`` is the only identity; ``package_name``, import path, env-var\nprefix and migration revision ids are derived from it so a caller cannot\ncreate an inconsistent project." + "line": 65 }, { "name": "ScaffoldOptions", @@ -5267,74 +5206,82 @@ { "name": "dry_run", "type": "bool", - "default": "False" + "line": 168 } ], - "line": 165, - "doc": "Non-identity options, kept out of the persisted manifest." + "line": 165 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/scheduling/__init__.py", - "sha256": "f887d66fc8bf298e094c46bae19fa42b67e5d26911522913d8c5a546d606b4cc", + "source": "townlight_core/scheduling/__init__.py", + "sha256": "2bde5b7b97b7e42e6828d6f898908c43fa81f0e138c12fe98e389839a1b81f84", + "bytes": 340, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/scheduling/cron.py", - "sha256": "a7c5688dc5a3e5c410466cc92a7d884a88a50fe92974d0a7642b0fbe954f0b08", + "source": "townlight_core/scheduling/cron.py", + "sha256": "6e385d99111b7809af36ce9846902068545757f66425e72e924e1088b53277cc", + "bytes": 2668, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/search/__init__.py", - "sha256": "2450f3768c47b0e2869ca1056b188d41b9ba58f88a0865cad5ad854f03801908", + "source": "townlight_core/search/__init__.py", + "sha256": "13d8bec659e5056118385219d8741e0e25d77ef57409de94eedbadf4b1fc7dc2", + "bytes": 4610, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/security/__init__.py", - "sha256": "376e78b0875c2fd3074935b586cef2b806c371f140085ffc40eeb6aed09b9211", + "source": "townlight_core/security/__init__.py", + "sha256": "c89bf972b45da10e18076bb17fa8b9cf8ae0b9bf76475f90e136baa8d832bb42", + "bytes": 1715, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/security/at_rest.py", - "sha256": "eb339fa93cff4af29df7f01b3f5552fff56c6bdc676fef6cb9aad8356a610d3e", + "source": "townlight_core/security/at_rest.py", + "sha256": "87bb3aef0e3fbba957364037e1c4fd96f972fc758b30e0684c6c9915ed2089e0", + "bytes": 2966, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/security/config_validation.py", - "sha256": "e4064bf0394ffc7cdc0aafccfc689a2a17667cfd31d8455dc6f8a623d963af45", + "source": "townlight_core/security/config_validation.py", + "sha256": "7043de1ab5799079e7521603510206945c91a0ddb3fdd16464b3e4190010d110", + "bytes": 5008, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/security/host_validation.py", - "sha256": "3e62ec5540713eea903409c88c4e2255b0dd8d54a9d5d23fc69ad15e03c15045", + "source": "townlight_core/security/host_validation.py", + "sha256": "dc3ee223e1875baabed6202ecf673f91b837c7b5ec51f751efe594d76ad0addb", + "bytes": 5292, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/tasks/__init__.py", - "sha256": "2b30985e76210900397d5e65b5060786e8fec6478d8762690e8971a37c49d5f1", + "source": "townlight_core/tasks/__init__.py", + "sha256": "fa149df79666a714bc9fa46bbd275f89b5eeca1b6244d4e0415989ce3c38d85a", + "bytes": 873, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/tasks/artifacts.py", - "sha256": "fbb9db7c76ce4b3bd91b3412ba2cfdcc52d3c67959ef117a0a765ee9dc3d972f", + "source": "townlight_core/tasks/artifacts.py", + "sha256": "4827aa4c8778f0612e5deba771be06bdb404ea19149166ff8ab2f7c7c56c229d", + "bytes": 16399, "routes": [], "models": [ { @@ -5346,81 +5293,80 @@ { "name": "artifact_id", "type": "Mapped[str]", - "default": "mapped_column(String(64), primary_key=True)" + "line": 101 }, { "name": "task_id", "type": "Mapped[str]", - "default": "mapped_column(String(128), index=True)" + "line": 102 }, { "name": "module_id", "type": "Mapped[str]", - "default": "mapped_column(String(64))" + "line": 103 }, { "name": "task_type", "type": "Mapped[str]", - "default": "mapped_column(String(100))" + "line": 104 }, { "name": "claim_token", "type": "Mapped[str]", - "default": "mapped_column(String(64))" + "line": 105 }, { "name": "attempt_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 106 }, { "name": "artifact_name", "type": "Mapped[str]", - "default": "mapped_column(String(200))" + "line": 107 }, { "name": "relative_path", "type": "Mapped[str]", - "default": "mapped_column(String(400))" + "line": 108 }, { "name": "artifact_sha256", "type": "Mapped[str]", - "default": "mapped_column(String(64))" + "line": 109 }, { "name": "artifact_bytes", "type": "Mapped[int]", - "default": "mapped_column(BigInteger, default=0)" + "line": 110 }, { "name": "artifact_kind", "type": "Mapped[str]", - "default": "mapped_column(String(40))" + "line": 111 }, { "name": "source_sha256", "type": "Mapped[str]", - "default": "mapped_column(String(64))" + "line": 112 }, { "name": "source_label", "type": "Mapped[str]", - "default": "mapped_column(String(200))" + "line": 113 }, { "name": "recorded_by", "type": "Mapped[str]", - "default": "mapped_column(String(128))" + "line": 114 }, { "name": "recorded_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True))" + "line": 115 } ], - "line": 96, - "doc": "Append-only acceptance record for one artifact produced by one claimed job." + "line": 96 }, { "name": "ArtifactStore", @@ -5429,11 +5375,10 @@ { "name": "root", "type": "Path", - "default": "" + "line": 122 } ], - "line": 119, - "doc": "A configured artifact root. Every published path must resolve inside it." + "line": 119 }, { "name": "SourceBinding", @@ -5442,16 +5387,15 @@ { "name": "sha256", "type": "str", - "default": "" + "line": 144 }, { "name": "label", "type": "str", - "default": "" + "line": 145 } ], - "line": 141, - "doc": "The synthetic or real source a derivative was computed from." + "line": 141 }, { "name": "ArtifactProposal", @@ -5460,26 +5404,25 @@ { "name": "name", "type": "str", - "default": "" + "line": 152 }, { "name": "kind", "type": "str", - "default": "" + "line": 153 }, { "name": "content", "type": "bytes", - "default": "" + "line": 154 }, { "name": "source", "type": "SourceBinding", - "default": "" + "line": 155 } ], - "line": 149, - "doc": "Caller-supplied intent. The hash is recomputed and never taken from here." + "line": 149 }, { "name": "PreparedArtifact", @@ -5488,87 +5431,89 @@ { "name": "store", "type": "ArtifactStore", - "default": "" + "line": 162 }, { "name": "staging_path", "type": "Path", - "default": "" + "line": 163 }, { "name": "name", "type": "str", - "default": "" + "line": 164 }, { "name": "kind", "type": "str", - "default": "" + "line": 165 }, { "name": "sha256", "type": "str", - "default": "" + "line": 166 }, { "name": "size", "type": "int", - "default": "" + "line": 167 }, { "name": "source", "type": "SourceBinding", - "default": "" + "line": 168 } ], - "line": 159, - "doc": "A staged, hash-verified file that is not yet published or recorded." + "line": 159 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/tasks/leased.py", - "sha256": "eef2a9e339274c1caccde7cb3295a9d5bd88da6561090cbfc0a6bf10c8d29e1d", + "source": "townlight_core/tasks/leased.py", + "sha256": "1a2d44107db916e54fe2bf05d6909d356603393d9686b4e28ba763702c3671a0", + "bytes": 3267, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/tasks/registry.py", - "sha256": "96bf04036bdc4be3b9097d7bc85f447105fd5d82e8ef548cd3d88354f7b3fce8", + "source": "townlight_core/tasks/registry.py", + "sha256": "71ce9c95a7f30cd97f045ddbeb6a7d36472b82a50c0ba07782b6ec9b465264c8", + "bytes": 776, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/tasks/worker.py", - "sha256": "106d83f412c66d939e5d9a55276b51020c078ee89763135dc53f7c02ae20f76f", + "source": "townlight_core/tasks/worker.py", + "sha256": "2f4bf95de44b0f1f90f21a0b773748bc8f80838498d5f25c05d63ce9d34df841", + "bytes": 3095, "routes": [], "models": [], "configuration": [ { - "variable": "DATABASE_URL", - "default": "", + "environment": "DATABASE_URL", "line": 34 }, { - "variable": "CIVICCORE_TASK_HANDLER_MODULES", - "default": "", + "environment": "TOWNLIGHT_CORE_TASK_HANDLER_MODULES", "line": 37 } ] }, { - "source": "installed-owned-source/civiccore/testing/__init__.py", - "sha256": "359cfd4ae5b7324db08f496a0ee5043456f1ce60a4ae34fa75761a8790b88d50", + "source": "townlight_core/testing/__init__.py", + "sha256": "6033e371f9adb5bb4107ec14c541768a7b6acfab5d9d1b184fd490461c9b87df", + "bytes": 2115, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/testing/mock_city.py", - "sha256": "c1bac5478d09e0958115da8d4f55f4d5211ec1531062e76829381f5a6c47e389", + "source": "townlight_core/testing/mock_city.py", + "sha256": "0268eb2457e22ab2c99f4a0b5c2f3dc34aef0102cf7d0f10019b1db9c2918961", + "bytes": 51471, "routes": [], "models": [ { @@ -5578,51 +5523,50 @@ { "name": "connector", "type": "str", - "default": "" + "line": 91 }, { "name": "vendor_name", "type": "str", - "default": "" + "line": 92 }, { "name": "interface_status", "type": "str", - "default": "" + "line": 93 }, { "name": "method", "type": "str", - "default": "" + "line": 94 }, { "name": "path", "type": "str", - "default": "" + "line": 95 }, { "name": "auth_method", "type": "str", - "default": "" + "line": 96 }, { "name": "delta_query_param", "type": "str", - "default": "" + "line": 97 }, { "name": "sample_payload", "type": "dict[str, Any]", - "default": "" + "line": 98 }, { "name": "notes", "type": "str", - "default": "" + "line": 99 } ], - "line": 90, - "doc": "" + "line": 90 }, { "name": "MockCityIdpContract", @@ -5631,81 +5575,80 @@ { "name": "provider", "type": "str", - "default": "" + "line": 117 }, { "name": "interface_status", "type": "str", - "default": "" + "line": 118 }, { "name": "issuer", "type": "str", - "default": "" + "line": 119 }, { "name": "audience", "type": "str", - "default": "" + "line": 120 }, { "name": "authorization_url", "type": "str", - "default": "" + "line": 121 }, { "name": "token_url", "type": "str", - "default": "" + "line": 122 }, { "name": "jwks_path", "type": "str", - "default": "" + "line": 123 }, { "name": "role_claims", "type": "tuple[str, ...]", - "default": "" + "line": 124 }, { "name": "algorithms", "type": "tuple[str, ...]", - "default": "" + "line": 125 }, { "name": "client_id", "type": "str", - "default": "" + "line": 126 }, { "name": "redirect_uri", "type": "str", - "default": "" + "line": 127 }, { "name": "staff_subject", "type": "str", - "default": "" + "line": 128 }, { "name": "staff_email", "type": "str", - "default": "" + "line": 129 }, { "name": "staff_roles", "type": "tuple[str, ...]", - "default": "" + "line": 130 }, { "name": "notes", "type": "str", - "default": "" + "line": 131 } ], - "line": 116, - "doc": "" + "line": 116 }, { "name": "MockCityBackupRetentionContract", @@ -5714,71 +5657,70 @@ { "name": "city", "type": "str", - "default": "" + "line": 155 }, { "name": "interface_status", "type": "str", - "default": "" + "line": 156 }, { "name": "backup_scope", "type": "tuple[str, ...]", - "default": "" + "line": 157 }, { "name": "restore_proof_required", "type": "bool", - "default": "" + "line": 158 }, { "name": "manifest_required_fields", "type": "tuple[str, ...]", - "default": "" + "line": 159 }, { "name": "retention_years", "type": "int", - "default": "" + "line": 160 }, { "name": "restore_test_interval_days", "type": "int", - "default": "" + "line": 161 }, { "name": "off_host_storage", "type": "str", - "default": "" + "line": 162 }, { "name": "encryption_at_rest_required", "type": "bool", - "default": "" + "line": 163 }, { "name": "immutable_retention_required", "type": "bool", - "default": "" + "line": 164 }, { "name": "legal_hold_supported", "type": "bool", - "default": "" + "line": 165 }, { "name": "approval_artifact", "type": "str", - "default": "" + "line": 166 }, { "name": "notes", "type": "str", - "default": "" + "line": 167 } ], - "line": 154, - "doc": "" + "line": 154 }, { "name": "MockCityContractCheck", @@ -5787,36 +5729,35 @@ { "name": "connector", "type": "str", - "default": "" + "line": 189 }, { "name": "ok", "type": "bool", - "default": "" + "line": 190 }, { "name": "message", "type": "str", - "default": "" + "line": 191 }, { "name": "fix", "type": "str", - "default": "" + "line": 192 }, { "name": "normalized_external_meeting_id", "type": "str | None", - "default": "None" + "line": 193 }, { "name": "delta_request_url", "type": "str | None", - "default": "None" + "line": 194 } ], - "line": 188, - "doc": "" + "line": 188 }, { "name": "MockCityIdpCheck", @@ -5825,41 +5766,40 @@ { "name": "provider", "type": "str", - "default": "" + "line": 209 }, { "name": "ok", "type": "bool", - "default": "" + "line": 210 }, { "name": "message", "type": "str", - "default": "" + "line": 211 }, { "name": "fix", "type": "str", - "default": "" + "line": 212 }, { "name": "auth_method", "type": "str | None", - "default": "None" + "line": 213 }, { "name": "subject", "type": "str | None", - "default": "None" + "line": 214 }, { "name": "roles", "type": "tuple[str, ...]", - "default": "()" + "line": 215 } ], - "line": 208, - "doc": "" + "line": 208 }, { "name": "MockCityBackupRetentionCheck", @@ -5868,31 +5808,30 @@ { "name": "city", "type": "str", - "default": "" + "line": 231 }, { "name": "ok", "type": "bool", - "default": "" + "line": 232 }, { "name": "message", "type": "str", - "default": "" + "line": 233 }, { "name": "fix", "type": "str", - "default": "" + "line": 234 }, { "name": "checked_fields", "type": "tuple[str, ...]", - "default": "()" + "line": 235 } ], - "line": 230, - "doc": "" + "line": 230 }, { "name": "DemoTownFixtureContract", @@ -5901,70 +5840,71 @@ { "name": "schema_version", "type": "str", - "default": "" + "line": 251 }, { "name": "fixture_id", "type": "str", - "default": "" + "line": 252 }, { "name": "fixture_version", "type": "str", - "default": "" + "line": 253 }, { "name": "deterministic_seed", "type": "str", - "default": "" + "line": 254 }, { "name": "generated_at", "type": "str", - "default": "" + "line": 255 }, { "name": "municipality", "type": "dict[str, Any]", - "default": "" + "line": 256 }, { "name": "sources", "type": "tuple[dict[str, Any], ...]", - "default": "" + "line": 257 }, { "name": "records", "type": "tuple[dict[str, Any], ...]", - "default": "" + "line": 258 }, { "name": "requests", "type": "tuple[dict[str, Any], ...]", - "default": "" + "line": 259 }, { "name": "expected", "type": "dict[str, Any]", - "default": "" + "line": 260 } ], - "line": 248, - "doc": "Versioned, deterministic and independently authored municipal demo data." + "line": 248 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccore/verification/__init__.py", - "sha256": "79e2b135ad90bfad95db77a54f7d2c65d96eb13bb8ad1ed0a35e3655dc03a0e7", + "source": "townlight_core/verification/__init__.py", + "sha256": "c70e114fe70b60ccc09ee541df728316be966ca7660be3275ce66086e737f233", + "bytes": 441, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccore/verification/browser_evidence.py", - "sha256": "493219d45f5c50d5c514a4ea9534ccfab35979d0c58a577a2e9afd01328c7fe1", + "source": "townlight_core/verification/browser_evidence.py", + "sha256": "1edca65a6a73ca5b42a3eddc9db530e5d78b2bd7eec54e867c4e2dfe061a3c0b", + "bytes": 3230, "routes": [], "models": [ { @@ -5974,345 +5914,141 @@ { "name": "version", "type": "str", - "default": "" + "line": 24 }, { "name": "reviewed_at", "type": "str", - "default": "" + "line": 25 }, { "name": "page", "type": "Path", - "default": "" + "line": 26 }, { "name": "screenshots", "type": "dict[str, Path]", - "default": "" + "line": 27 } ], - "line": 23, - "doc": "" + "line": 23 } ], "configuration": [] } - ], - "bridge": [ - { - "source": "installed-owned-source/civicsuite_runtime/services.py", - "sha256": "5dfb0f58ea1f94185081426a3734905c78624d7bcd5407fd2c4e0fa1fb054a6b", - "routes": [ - { - "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "runtime_health", - "signature": "", - "returns": "", - "line": 439, - "doc": "", - "decorator": "app.get('/health')", - "errors": [] - }, - { - "method": "GET", - "path": "/modules", - "router": "app", - "prefix_resolved": true, - "name": "runtime_health", - "signature": "", - "returns": "", - "line": 439, - "doc": "", - "decorator": "app.get('/modules')", - "errors": [] - }, - { - "method": "GET", - "path": "/ready", - "router": "app", - "prefix_resolved": true, - "name": "domain_ready", - "signature": "", - "returns": "", - "line": 444, - "doc": "", - "decorator": "app.get('/ready')", - "errors": [] - } - ], - "models": [], - "configuration": [ - { - "variable": "TOWNLIGHT_PROFILE_ROOT", - "default": "", - "line": 56 - }, - { - "variable": "CIVICSUITE_DATA_DIR", - "default": "", - "line": 61 - }, - { - "variable": "LOCALAPPDATA", - "default": "", - "line": 64 - }, - { - "variable": "DATABASE_URL", - "default": "", - "line": 148 - }, - { - "variable": "CIVICSUITE_RUNTIME_HOST", - "default": "DEFAULT_HOST", - "line": 479 - }, - { - "variable": "TESTING", - "default": "", - "line": 113 - }, - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "''", - "line": 240 - }, - { - "variable": "DATABASE_URL", - "default": "", - "line": 300 - }, - { - "variable": "CIVICSUITE_RUNTIME_PORT", - "default": "str(DEFAULT_PORT)", - "line": 482 - } - ] - } ] }, "records": { - "package": "app", + "repository": "townlight/sunshine", + "repository_head": "156ef1ba2d06c77eb1820fa7efdbcb94a2c92fa8", + "working_tree_modified": true, + "principal_import": "townlight_records", "source": [ { - "source": "installed-owned-source/app/__init__.py", - "sha256": "faef907da0d1b1e4b467dc711514a24f6112ff32809ee7e7e6065c684ab7f2b9", + "source": "backend/townlight_records/__init__.py", + "sha256": "ff95c656e3245c0b6c3400fb8c22ab8d06559682f96d4f456deabc81cf970cb3", + "bytes": 31, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/admin/__init__.py", - "sha256": "5724a9ba19246885896a1603eecc360d7cb5b5cc6c745f635553158f7c46431d", + "source": "backend/townlight_records/admin/__init__.py", + "sha256": "41dd8646dfff4f77df72dd38cfbb57cd88c037c7d45192dbc1fdfe537d35e6ca", + "bytes": 97, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/admin/router.py", - "sha256": "daea85a6114138f50a2a3da4bff8736c1140174599440b07cac35aee27694b7d", + "source": "backend/townlight_records/admin/router.py", + "sha256": "7c20b2df8ab59a3b35d77ff6734689873c5ba6d2f9a3c3a733a0ae9088147ace", + "bytes": 18069, "routes": [ { "method": "GET", - "path": "/admin/status", - "router": "router", - "prefix_resolved": true, - "name": "system_status", - "signature": "request: Request, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 53, - "doc": "", - "decorator": "router.get('/status', response_model=SystemStatus)", - "errors": [] + "declared_path": "/status", + "function": "system_status", + "line": 53 }, { "method": "GET", - "path": "/admin/users", - "router": "router", - "prefix_resolved": true, - "name": "list_users", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 100, - "doc": "List all users. Admin only.", - "decorator": "router.get('/users', response_model=list[UserRead])", - "errors": [] + "declared_path": "/users", + "function": "list_users", + "line": 100 }, { "method": "POST", - "path": "/admin/users", - "router": "router", - "prefix_resolved": true, - "name": "create_user", - "signature": "body: AdminUserCreateRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 127, - "doc": "Create a new user. Admin only.", - "decorator": "router.post('/users', response_model=AdminUserCreateResponse, status_code=201)", - "errors": [ - "_HTTPException(status_code=422, detail=f'Invalid role: {body.role}')", - "_HTTPException(status_code=400, detail=str(e))" - ] + "declared_path": "/users", + "function": "create_user", + "line": 127 }, { "method": "PATCH", - "path": "/admin/users/{user_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_user", - "signature": "user_id: uuid.UUID, body: UserUpdateRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 178, - "doc": "Update user fields. Admin only.\n\nGuards against self-demotion: admins cannot change their own role.", - "decorator": "router.patch('/users/{user_id}', response_model=AdminUserCreateResponse)", - "errors": [ - "HTTPException(status_code=404, detail='User not found')", - "HTTPException(status_code=400, detail='Cannot change your own role. Another admin must do this.')", - "HTTPException(status_code=400, detail='Cannot deactivate your own account.')", - "HTTPException(status_code=422, detail=f'Invalid role: {body.role}')" - ] - }, - { - "method": "GET", - "path": "/admin/models", - "router": "router", - "prefix_resolved": true, - "name": "list_models", - "signature": "user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 239, - "doc": "", - "decorator": "router.get('/models', response_model=OllamaStatus)", - "errors": [] - }, - { - "method": "GET", - "path": "/admin/models/registry", - "router": "router", - "prefix_resolved": true, - "name": "list_model_registry", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 265, - "doc": "", - "decorator": "router.get('/models/registry', response_model=list[ModelRegistryRead])", - "errors": [] - }, - { - "method": "POST", - "path": "/admin/models/registry", - "router": "router", - "prefix_resolved": true, - "name": "register_model", - "signature": "data: ModelRegistryCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 276, - "doc": "", - "decorator": "router.post('/models/registry', response_model=ModelRegistryRead, status_code=201)", - "errors": [] + "declared_path": "/users/{user_id}", + "function": "update_user", + "line": 178 + }, + { + "method": "GET", + "declared_path": "/models", + "function": "list_models", + "line": 239 + }, + { + "method": "GET", + "declared_path": "/models/registry", + "function": "list_model_registry", + "line": 265 + }, + { + "method": "POST", + "declared_path": "/models/registry", + "function": "register_model", + "line": 276 }, { "method": "PATCH", - "path": "/admin/models/registry/{model_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_model_registry", - "signature": "model_id: int, data: ModelRegistryUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 305, - "doc": "", - "decorator": "router.patch('/models/registry/{model_id}', response_model=ModelRegistryRead)", - "errors": [ - "HTTPException(status_code=404, detail='Model not found')" - ] + "declared_path": "/models/registry/{model_id}", + "function": "update_model_registry", + "line": 305 }, { "method": "DELETE", - "path": "/admin/models/registry/{model_id}", - "router": "router", - "prefix_resolved": true, - "name": "delete_model_registry", - "signature": "model_id: int, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 330, - "doc": "", - "decorator": "router.delete('/models/registry/{model_id}', status_code=204)", - "errors": [ - "HTTPException(status_code=404, detail='Model not found')" - ] - }, - { - "method": "GET", - "path": "/admin/fee-schedules", - "router": "router", - "prefix_resolved": true, - "name": "list_fee_schedules", - "signature": "jurisdiction: str | None=None, limit: int=50, offset: int=0, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 354, - "doc": "List all fee schedules. Admin only.", - "decorator": "router.get('/fee-schedules', response_model=list[FeeScheduleRead])", - "errors": [] - }, - { - "method": "POST", - "path": "/admin/fee-schedules", - "router": "router", - "prefix_resolved": true, - "name": "create_fee_schedule", - "signature": "data: FeeScheduleCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 371, - "doc": "Create a new fee schedule. Admin only.", - "decorator": "router.post('/fee-schedules', response_model=FeeScheduleRead, status_code=201)", - "errors": [] + "declared_path": "/models/registry/{model_id}", + "function": "delete_model_registry", + "line": 330 + }, + { + "method": "GET", + "declared_path": "/fee-schedules", + "function": "list_fee_schedules", + "line": 354 + }, + { + "method": "POST", + "declared_path": "/fee-schedules", + "function": "create_fee_schedule", + "line": 371 }, { "method": "PATCH", - "path": "/admin/fee-schedules/{schedule_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_fee_schedule", - "signature": "schedule_id: uuid.UUID, data: FeeScheduleUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 398, - "doc": "Update a fee schedule. Admin only.", - "decorator": "router.patch('/fee-schedules/{schedule_id}', response_model=FeeScheduleRead)", - "errors": [ - "HTTPException(status_code=404, detail='Fee schedule not found')" - ] + "declared_path": "/fee-schedules/{schedule_id}", + "function": "update_fee_schedule", + "line": 398 }, { "method": "DELETE", - "path": "/admin/fee-schedules/{schedule_id}", - "router": "router", - "prefix_resolved": true, - "name": "delete_fee_schedule", - "signature": "schedule_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 424, - "doc": "Delete a fee schedule. Admin only.", - "decorator": "router.delete('/fee-schedules/{schedule_id}', status_code=204)", - "errors": [ - "HTTPException(status_code=404, detail='Fee schedule not found')" - ] - }, - { - "method": "GET", - "path": "/admin/coverage-gaps", - "router": "router", - "prefix_resolved": true, - "name": "get_coverage_gaps", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 454, - "doc": "Identify coverage gaps across jurisdictions, departments, and exemption categories.\n\nReturns:\n- Jurisdictions (state codes) that have no exemption rules\n- Departments with no assigned staff users\n- Exemption categories without any active rules", - "decorator": "router.get('/coverage-gaps', response_model=CoverageGapResponse)", - "errors": [] + "declared_path": "/fee-schedules/{schedule_id}", + "function": "delete_fee_schedule", + "line": 424 + }, + { + "method": "GET", + "declared_path": "/coverage-gaps", + "function": "get_coverage_gaps", + "line": 454 } ], "models": [ @@ -6325,41 +6061,40 @@ { "name": "version", "type": "str", - "default": "" + "line": 32 }, { "name": "database", "type": "str", - "default": "" + "line": 33 }, { "name": "ollama", "type": "str", - "default": "" + "line": 34 }, { "name": "redis", "type": "str", - "default": "" + "line": 35 }, { "name": "user_count", "type": "int", - "default": "" + "line": 36 }, { "name": "audit_log_count", "type": "int", - "default": "" + "line": 37 }, { "name": "suite_session", "type": "dict | None", - "default": "None" + "line": 38 } ], - "line": 31, - "doc": "" + "line": 31 }, { "name": "OllamaModelInfo", @@ -6370,21 +6105,20 @@ { "name": "name", "type": "str", - "default": "" + "line": 42 }, { "name": "size", "type": "int | None", - "default": "None" + "line": 43 }, { "name": "details", "type": "dict | None", - "default": "None" + "line": 44 } ], - "line": 41, - "doc": "" + "line": 41 }, { "name": "OllamaStatus", @@ -6395,16 +6129,15 @@ { "name": "status", "type": "str", - "default": "" + "line": 48 }, { "name": "models", "type": "list[OllamaModelInfo]", - "default": "" + "line": 49 } ], - "line": 47, - "doc": "" + "line": 47 }, { "name": "AdminUserCreateRequest", @@ -6415,26 +6148,25 @@ { "name": "email", "type": "str", - "default": "" + "line": 110 }, { "name": "password", "type": "str", - "default": "" + "line": 111 }, { "name": "full_name", "type": "str", - "default": "''" + "line": 112 }, { "name": "role", "type": "str", - "default": "'staff'" + "line": 113 } ], - "line": 109, - "doc": "" + "line": 109 }, { "name": "AdminUserCreateResponse", @@ -6445,31 +6177,30 @@ { "name": "id", "type": "str", - "default": "" + "line": 117 }, { "name": "email", "type": "str", - "default": "" + "line": 118 }, { "name": "full_name", "type": "str", - "default": "" + "line": 119 }, { "name": "role", "type": "str", - "default": "" + "line": 120 }, { "name": "is_active", "type": "bool", - "default": "" + "line": 121 } ], - "line": 116, - "doc": "" + "line": 116 }, { "name": "UserUpdateRequest", @@ -6480,26 +6211,25 @@ { "name": "full_name", "type": "str | None", - "default": "None" + "line": 171 }, { "name": "role", "type": "str | None", - "default": "None" + "line": 172 }, { "name": "department_id", "type": "uuid.UUID | None", - "default": "None" + "line": 173 }, { "name": "is_active", "type": "bool | None", - "default": "None" + "line": 174 } ], - "line": 170, - "doc": "" + "line": 170 }, { "name": "CoverageGapResponse", @@ -6510,157 +6240,139 @@ { "name": "jurisdictions_without_rules", "type": "list[str]", - "default": "" + "line": 447 }, { "name": "departments_without_staff", "type": "list[dict]", - "default": "" + "line": 448 }, { "name": "uncovered_categories", "type": "list[str]", - "default": "" + "line": 449 }, { "name": "total_gaps", "type": "int", - "default": "" + "line": 450 } ], - "line": 446, - "doc": "" + "line": 446 } ], "configuration": [] }, { - "source": "installed-owned-source/app/analytics/__init__.py", + "source": "backend/townlight_records/analytics/__init__.py", "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/analytics/router.py", - "sha256": "a82bc140c0e152301bc9583a8a291974876f068eb3a4fac1b342056ecb217316", + "source": "backend/townlight_records/analytics/router.py", + "sha256": "00ee39251e533e36b4a1575742f01c926962684da22e2d4ee38e6f7df0547ddb", + "bytes": 4668, "routes": [ { "method": "GET", - "path": "/analytics/operational", - "router": "router", - "prefix_resolved": false, - "name": "get_operational_metrics", - "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 33, - "doc": "", - "decorator": "router.get('/analytics/operational', response_model=OperationalMetrics)", - "errors": [] + "declared_path": "/analytics/operational", + "function": "get_operational_metrics", + "line": 33 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/audit/__init__.py", - "sha256": "35d25b33770f3cd458121ab4d8a6cdb87c32e7b8282bb674c8bf93bca6a5d82d", + "source": "backend/townlight_records/audit/__init__.py", + "sha256": "3ddf6263d5c1e6ad92aa12edcbbcc2ad66b106927c173af9de08f84cb7629456", + "bytes": 289, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/audit/logger.py", - "sha256": "1ad570f68753023d56827f8fa672822e50e234d32259b218682b815ee02cd0e8", + "source": "backend/townlight_records/audit/logger.py", + "sha256": "07d4df47196956592865809f7958e43e93df35965b925be6c5aaa111070d266c", + "bytes": 4371, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/audit/middleware.py", - "sha256": "c9283a66fbe43933edf30895e9b242380a99769127bd6536937dd56652e01a96", + "source": "backend/townlight_records/audit/middleware.py", + "sha256": "c72be74ac13fa28d39c6bc7bf8800b6135ac5f6ebc573842d5bb1ba8e84532a5", + "bytes": 3722, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/audit/router.py", - "sha256": "fc933066a2355e924c0f7c359d9249591c0f8024eadc455246b4b0b536f7d67f", + "source": "backend/townlight_records/audit/router.py", + "sha256": "51e6968c08755248e2455679fefc95ad7598ead1257b4a4599c51386c510e9d8", + "bytes": 4296, "routes": [ { "method": "GET", - "path": "/audit/logs", - "router": "router", - "prefix_resolved": true, - "name": "list_audit_logs", - "signature": "query: AuditLogQuery=Depends(), session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 16, - "doc": "", - "decorator": "router.get('/logs', response_model=list[AuditLogRead])", - "errors": [] + "declared_path": "/logs", + "function": "list_audit_logs", + "line": 16 }, { "method": "GET", - "path": "/audit/verify", - "router": "router", - "prefix_resolved": true, - "name": "verify_audit_chain", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 40, - "doc": "", - "decorator": "router.get('/verify', response_model=AuditChainVerification)", - "errors": [] + "declared_path": "/verify", + "function": "verify_audit_chain", + "line": 40 }, { "method": "GET", - "path": "/audit/export", - "router": "router", - "prefix_resolved": true, - "name": "export_audit_logs", - "signature": "format: str='json', start_date: str | None=None, end_date: str | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 51, - "doc": "", - "decorator": "router.get('/export')", - "errors": [] + "declared_path": "/export", + "function": "export_audit_logs", + "line": 51 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/auth/__init__.py", - "sha256": "40ae31146583108d88187effd6cdc081314021177425b6bdb1cb7b72530d5c4b", + "source": "backend/townlight_records/auth/__init__.py", + "sha256": "a6c03f9992f7fce6cb888319b1b8c35f44b7a23a0d35e3551fc4e509d55993e9", + "bytes": 338, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/auth/backend.py", - "sha256": "5a91017634252d0e8c959fa1ec1ae2163b118a4901ecc0bb1233448e8ca498bb", + "source": "backend/townlight_records/auth/backend.py", + "sha256": "6142da3d361c4b887b3d5b0c302d000ab191825b0210f19ad1adc8f4cc5bd698", + "bytes": 484, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/auth/department_authority.py", - "sha256": "f234cf04a5755dc3c0bd76230ef5145d4e7d26876c21b6776924ed95ea3e80eb", + "source": "backend/townlight_records/auth/department_authority.py", + "sha256": "29f23607e37228874cb979cc77d6876cb12c729edd83e9bbf5d493a2aad22e2a", + "bytes": 5708, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/auth/dependencies.py", - "sha256": "28390a14cf9b4550ed09772d0f8c922e4e27cfb75639dd7d853dbeea1e28433d", + "source": "backend/townlight_records/auth/dependencies.py", + "sha256": "8f1383e2a53f5b4c8f1953b16afc2c3ee7265e5b019e59eb66982781fd997168", + "bytes": 9676, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/auth/desktop_session.py", - "sha256": "ce8ff9e910ca8b7f36d8c8616a65d593d48fba3588538edfa6731ea6ada8a36b", + "source": "backend/townlight_records/auth/desktop_session.py", + "sha256": "7e0afb097a616c6a7cd2d849cf19c5492f03eaced768cf22c62c8a09224a1deb", + "bytes": 5466, "routes": [], "models": [ { @@ -6670,54 +6382,57 @@ { "name": "email", "type": "str", - "default": "" + "line": 40 }, { "name": "display_name", "type": "str", - "default": "" + "line": 41 }, { "name": "role", "type": "str", - "default": "" + "line": 42 }, { "name": "expires_at_unix_seconds", "type": "int", - "default": "" + "line": 43 } ], - "line": 39, - "doc": "" + "line": 39 } ], "configuration": [] }, { - "source": "installed-owned-source/app/auth/manager.py", - "sha256": "337f7d5b6d89973c352259c21512da56e6308a6e3e6967f035a31916b52c2bbb", + "source": "backend/townlight_records/auth/manager.py", + "sha256": "084693e045ce0b372cdc9d8f8876b5157bd986efd2441960fe99587b9ae7c322", + "bytes": 1806, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/auth/native_identity.py", - "sha256": "3d2536b13f38c52d93c4ab54887bf232a3b9181fe1b485165e1fd6a81fe687d0", + "source": "backend/townlight_records/auth/native_identity.py", + "sha256": "7af0c7ab99fa521182e45a4751226f287f82a561d3f8c75fc946341aa3bd3a78", + "bytes": 2187, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/auth/router.py", - "sha256": "9574ed42379df9ef05d9c13409c01f715538e00bb9e3c884b884cd2c1c8495fc", + "source": "backend/townlight_records/auth/router.py", + "sha256": "85f0c1ed229ffecbfb44f0e431e208e5c9dfa6d93e506ee1c6ce38aaed5766f6", + "bytes": 1256, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/auth/suite_session.py", - "sha256": "126a453ff01029cfe7abbbb5a3ecbf6c3ba562957ce929eb7854ff682576d071", + "source": "backend/townlight_records/auth/suite_session.py", + "sha256": "619bcec9da9202cb710ec2ee2390931dcf059230cf77dbafd7a56eadf2d4d902", + "bytes": 9870, "routes": [], "models": [ { @@ -6727,21 +6442,20 @@ { "name": "email", "type": "str", - "default": "" + "line": 181 }, { "name": "roles", "type": "frozenset[str]", - "default": "" + "line": 182 }, { "name": "must_change_password", "type": "bool", - "default": "False" + "line": 183 } ], - "line": 180, - "doc": "" + "line": 180 }, { "name": "SuiteSession", @@ -6750,21 +6464,20 @@ { "name": "subject", "type": "str", - "default": "" + "line": 188 }, { "name": "roles", "type": "frozenset[str]", - "default": "" + "line": 189 }, { "name": "session_id", "type": "str", - "default": "" + "line": 190 } ], - "line": 187, - "doc": "" + "line": 187 }, { "name": "Principal", @@ -6773,162 +6486,112 @@ { "name": "subject", "type": "str", - "default": "" + "line": 86 }, { "name": "roles", "type": "frozenset[str]", - "default": "" + "line": 87 }, { "name": "session_id", "type": "str", - "default": "" + "line": 88 } ], - "line": 85, - "doc": "" + "line": 85 } ], "configuration": [] }, { - "source": "installed-owned-source/app/catalog/__init__.py", + "source": "backend/townlight_records/catalog/__init__.py", "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/catalog/loader.py", - "sha256": "8ec0239d327824d28d18425904c64ef2bbfc2d04c65a4c5deb64904d5354912d", + "source": "backend/townlight_records/catalog/loader.py", + "sha256": "8f4dd60317e034e7bea3b2099a0bcefa31b1bfe4227abd7e338da39cf843bcd0", + "bytes": 740, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/catalog/router.py", - "sha256": "8720ef17e4106e738c2ed3672af4051dfe36b617a9da8eae8fa54a9c23de13d8", + "source": "backend/townlight_records/catalog/router.py", + "sha256": "4c70d6a6ab91e2f3d0fef8c7106dbb37d9aa5097645143efcdbfc7eb60509678", + "bytes": 1719, "routes": [ { "method": "GET", - "path": "/catalog/domains", - "router": "router", - "prefix_resolved": false, - "name": "list_domains", - "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 12, - "doc": "", - "decorator": "router.get('/catalog/domains')", - "errors": [] + "declared_path": "/catalog/domains", + "function": "list_domains", + "line": 12 }, { "method": "GET", - "path": "/catalog/systems", - "router": "router", - "prefix_resolved": false, - "name": "list_systems", - "signature": "domain: str | None=None, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 16, - "doc": "", - "decorator": "router.get('/catalog/systems')", - "errors": [] + "declared_path": "/catalog/systems", + "function": "list_systems", + "line": 16 }, { "method": "GET", - "path": "/catalog/connectors", - "router": "router", - "prefix_resolved": false, - "name": "list_connectors", - "signature": "domain: str, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 20, - "doc": "", - "decorator": "router.get('/catalog/connectors')", - "errors": [] + "declared_path": "/catalog/connectors", + "function": "list_connectors", + "line": 20 }, { "method": "POST", - "path": "/catalog/load", - "router": "router", - "prefix_resolved": false, - "name": "trigger_catalog_load", - "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 24, - "doc": "", - "decorator": "router.post('/catalog/load', status_code=200)", - "errors": [ - "HTTPException(409, 'Catalog missing, changed or incomplete; existing data preserved. Review a new catalog version.')" - ] + "declared_path": "/catalog/load", + "function": "trigger_catalog_load", + "line": 24 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/city_profile/__init__.py", + "source": "backend/townlight_records/city_profile/__init__.py", "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/city_profile/router.py", - "sha256": "e0b9d83c16dcb8e6ad6b2ca3bd2c4300ff0aa9ff89609a7f5bd7cc5dde835682", + "source": "backend/townlight_records/city_profile/router.py", + "sha256": "6c52879ffdaa3cc1064a4c4706e65fd102a9eee574a27eac7a69f6d0566d2bb7", + "bytes": 3731, "routes": [ { "method": "GET", - "path": "/city-profile", - "router": "router", - "prefix_resolved": false, - "name": "get_city_profile", - "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 32, - "doc": "", - "decorator": "router.get('/city-profile', response_model=CityProfileRead | None)", - "errors": [] + "declared_path": "/city-profile", + "function": "get_city_profile", + "line": 32 }, { "method": "POST", - "path": "/city-profile", - "router": "router", - "prefix_resolved": false, - "name": "create_city_profile", - "signature": "data: CityProfileCreate, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 42, - "doc": "", - "decorator": "router.post('/city-profile', response_model=CityProfileRead, status_code=201)", - "errors": [ - "HTTPException(409, 'City profile already exists. Use PATCH to update.')" - ] + "declared_path": "/city-profile", + "function": "create_city_profile", + "line": 42 }, { "method": "PATCH", - "path": "/city-profile", - "router": "router", - "prefix_resolved": false, - "name": "update_city_profile", - "signature": "data: CityProfileUpdate, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 76, - "doc": "", - "decorator": "router.patch('/city-profile', response_model=CityProfileRead)", - "errors": [ - "HTTPException(404, 'No city profile exists. Use POST to create one.')" - ] + "declared_path": "/city-profile", + "function": "update_city_profile", + "line": 76 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/config.py", - "sha256": "52725fbeb02c75717ae638e8d0cdf2d527656fb8bac5b5b5572d48d6e794a1c5", + "source": "backend/townlight_records/config.py", + "sha256": "4f64a49ba5c4a4ebe87ac89ab65875121e416fcc21e76c8ed675bba0e7c0fc87", + "bytes": 5871, "routes": [], "models": [ { @@ -6940,323 +6603,266 @@ { "name": "database_url", "type": "str", - "default": "'postgresql+asyncpg://civicrecords:civicrecords@postgres:5432/civicrecords'" + "line": 25 }, { "name": "jwt_secret", "type": "str", - "default": "'CHANGE-ME'" + "line": 26 }, { "name": "jwt_secret_file", "type": "str", - "default": "'/run/secrets/jwt_secret'" + "line": 31 }, { "name": "jwt_lifetime_seconds", "type": "int", - "default": "3600" + "line": 32 }, { "name": "first_admin_email", "type": "str", - "default": "'admin@example.gov'" + "line": 33 }, { "name": "first_admin_password", "type": "str", - "default": "'CHANGE-ME'" + "line": 34 }, { "name": "first_admin_password_file", "type": "str", - "default": "'/run/secrets/first_admin_password'" + "line": 35 }, { "name": "ollama_base_url", "type": "str", - "default": "'http://ollama:11434'" + "line": 36 }, { "name": "redis_url", "type": "str", - "default": "'redis://redis:6379/0'" + "line": 37 }, { "name": "audit_retention_days", "type": "int", - "default": "1095" + "line": 38 }, { "name": "cors_origins", "type": "list[str]", - "default": "['http://localhost:8080']" + "line": 39 }, { "name": "embedding_model", "type": "str", - "default": "'nomic-embed-text'" + "line": 40 }, { "name": "chat_model", "type": "str", - "default": "'gemma4:e4b'" + "line": 43 }, { "name": "vision_model", "type": "str", - "default": "'gemma4:e4b'" + "line": 44 }, { "name": "smtp_host", "type": "str", - "default": "''" + "line": 46 }, { "name": "smtp_port", "type": "int", - "default": "587" + "line": 47 }, { "name": "smtp_username", "type": "str", - "default": "''" + "line": 48 }, { "name": "smtp_password", "type": "str", - "default": "''" + "line": 49 }, { "name": "smtp_from_email", "type": "str", - "default": "'noreply@civicrecords.local'" + "line": 50 }, { "name": "smtp_use_tls", "type": "bool", - "default": "True" + "line": 51 }, { "name": "connector_host_allowlist", "type": "Annotated[list[str], NoDecode]", - "default": "[]" + "line": 54 }, { "name": "portal_mode", "type": "Literal['public', 'private']", - "default": "'private'" + "line": 57 }, { "name": "encryption_key", "type": "str", - "default": "'CHANGE-ME-generate-with-fernet-generate-key'" + "line": 60 }, { "name": "testing", "type": "bool", - "default": "False" + "line": 62 }, { "name": "authority_scope_id", "type": "str", - "default": "''" + "line": 68 } ], - "line": 24, - "doc": "" + "line": 24 } ], "configuration": [] }, { - "source": "installed-owned-source/app/connectors/__init__.py", - "sha256": "858f35a785e1714492e27337991099f9891ab9e0b6325427213d0458b7e7508f", + "source": "backend/townlight_records/connectors/__init__.py", + "sha256": "9b4171a560153689a6f3035e04488a64a7d2d3737f4c9b022861d63f4fb6c9a9", + "bytes": 1007, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/connectors/base.py", - "sha256": "61772e641cda2c08df5c95ce7cbefe725b550b1fd67f54cb550ea847c9927688", + "source": "backend/townlight_records/connectors/base.py", + "sha256": "6c3572d2dc3b25f164128d7afb03e61404c6ec9c9d48fabb58cf0e5379775dcf", + "bytes": 2311, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/connectors/file_system.py", - "sha256": "d61c6ed4b906cb10697949ed9810ce14853301af1706cc02ba6605fec1d385a6", + "source": "backend/townlight_records/connectors/file_system.py", + "sha256": "91ce9a5a885b84047004370fe100708865149330ae16da0fc3d55751126fe834", + "bytes": 5185, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/connectors/imap_email.py", - "sha256": "a6353f14d4f083e999e089bd8c536438a9355ac0bab5c94b03ab30f4f0ef084d", + "source": "backend/townlight_records/connectors/imap_email.py", + "sha256": "6f0f3d997589d65c4b49d8841607c746387e9e446a632a048d757e648e7119cc", + "bytes": 12290, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/connectors/manual_drop.py", - "sha256": "4130a495cb691d56d6c9cc493bf85edb520f86c89846a241ed216ca652b4d2ac", + "source": "backend/townlight_records/connectors/manual_drop.py", + "sha256": "9634d200ed3675eb33c9ccdf47aec5f1f77cc190b9e3d19e84ec11973abb26b8", + "bytes": 7967, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/connectors/odbc.py", - "sha256": "636c23aa66537775c674efe095a1c9e27dc670a6370a742e325c1ea5039243db", + "source": "backend/townlight_records/connectors/odbc.py", + "sha256": "aa146a1e79f99bb5e34c95c17cd6388807c5a4237efd2b4454ac6e8e8308e3de", + "bytes": 9537, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/connectors/rest_api.py", - "sha256": "52e26ea1923a25ed7704f090e37745be39a0fb80e38a4b5cdb315a08d16373f2", + "source": "backend/townlight_records/connectors/rest_api.py", + "sha256": "316af4c35a98267c84c35969afb51804cb19251a9c8b7505211840929e39114f", + "bytes": 13235, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/connectors/retry.py", - "sha256": "bba511cd51d7727835e24540b5c8c4660dbab43776d34cbaf2a618b207c36726", + "source": "backend/townlight_records/connectors/retry.py", + "sha256": "41d845b0020b8df86c6838368b01830821c468cb5ecd631dca562074067c4806", + "bytes": 1298, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/database.py", - "sha256": "cbf900a24999134b812e06749cd897a8f36e1885a05fb6b837363788ae2e990f", + "source": "backend/townlight_records/database.py", + "sha256": "a82e34395f940bf9d9ccf476b6585a220e23028d15050bbbeb12340b168a2793", + "bytes": 992, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/datasources/__init__.py", - "sha256": "f8a2f02b77cc7a4a879305cceee97e5ee272213e93c635792e42a1c3e5afaa75", + "source": "backend/townlight_records/datasources/__init__.py", + "sha256": "e2821093f99faacc298a371e1a5269722f13ffee98c8112f9090ca2690ed39c4", + "bytes": 113, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/datasources/router.py", - "sha256": "67dc17fea9f4259bcf8c4f376c447bdcd775ae59fd6e805a981873fe87bf36c4", + "source": "backend/townlight_records/datasources/router.py", + "sha256": "63ac5050984e6b35efef6374050b294a9b2fcbb64fd4ad2302eda33062af66b5", + "bytes": 17257, "routes": [ { "method": "POST", - "path": "/datasources/", - "router": "router", - "prefix_resolved": true, - "name": "create_datasource", - "signature": "data: DataSourceCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 70, - "doc": "", - "decorator": "router.post('/', response_model=DataSourceAdminRead, status_code=201)", - "errors": [ - "HTTPException(status_code=409, detail='Name already taken')" - ] + "declared_path": "/", + "function": "create_datasource", + "line": 70 }, { "method": "GET", - "path": "/datasources/", - "router": "router", - "prefix_resolved": true, - "name": "list_datasources", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 89, - "doc": "", - "decorator": "router.get('/', response_model=list[DataSourceRead])", - "errors": [] + "declared_path": "/", + "function": "list_datasources", + "line": 89 }, { "method": "PATCH", - "path": "/datasources/{source_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_datasource", - "signature": "source_id: uuid.UUID, data: DataSourceUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 137, - "doc": "", - "decorator": "router.patch('/{source_id}', response_model=DataSourceAdminRead)", - "errors": [ - "HTTPException(status_code=404, detail='Data source not found')" - ] - }, - { - "method": "POST", - "path": "/datasources/{source_id}/ingest", - "router": "router", - "prefix_resolved": true, - "name": "trigger_ingestion", - "signature": "source_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 156, - "doc": "", - "decorator": "router.post('/{source_id}/ingest')", - "errors": [ - "HTTPException(status_code=404, detail='Data source not found')" - ] - }, - { - "method": "POST", - "path": "/datasources/upload", - "router": "router", - "prefix_resolved": true, - "name": "upload_file", - "signature": "file: UploadFile=File(...), session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 165, - "doc": "", - "decorator": "router.post('/upload')", - "errors": [ - "HTTPException(status_code=413, detail='File too large (max 100 MB)')" - ] - }, - { - "method": "POST", - "path": "/datasources/documents/{document_id}/re-ingest", - "router": "router", - "prefix_resolved": true, - "name": "re_ingest_document", - "signature": "document_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 201, - "doc": "Re-ingest a failed document. Resets status to pending and queues for processing.", - "decorator": "router.post('/documents/{document_id}/re-ingest')", - "errors": [ - "HTTPException(status_code=404, detail='Document not found')", - "HTTPException(status_code=400, detail=f'Can only re-ingest failed documents (current: {doc.ingestion_status.value})')" - ] - }, - { - "method": "GET", - "path": "/datasources/stats", - "router": "router", - "prefix_resolved": true, - "name": "ingestion_stats", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 236, - "doc": "", - "decorator": "router.get('/stats', response_model=IngestionStats)", - "errors": [] - }, - { - "method": "POST", - "path": "/datasources/test-connection", - "router": "router", - "prefix_resolved": true, - "name": "test_connection", - "signature": "body: TestConnectionRequest, user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 277, - "doc": "Test connectivity to a data source without persisting anything.\n\nThis endpoint validates the connection parameters and attempts a test\nconnection. Credentials are NOT persisted, NOT logged, and NOT returned.", - "decorator": "router.post('/test-connection', response_model=TestConnectionResponse)", - "errors": [] + "declared_path": "/{source_id}", + "function": "update_datasource", + "line": 137 + }, + { + "method": "POST", + "declared_path": "/{source_id}/ingest", + "function": "trigger_ingestion", + "line": 156 + }, + { + "method": "POST", + "declared_path": "/upload", + "function": "upload_file", + "line": 165 + }, + { + "method": "POST", + "declared_path": "/documents/{document_id}/re-ingest", + "function": "re_ingest_document", + "line": 201 + }, + { + "method": "GET", + "declared_path": "/stats", + "function": "ingestion_stats", + "line": 236 + }, + { + "method": "POST", + "declared_path": "/test-connection", + "function": "test_connection", + "line": 277 } ], "models": [ @@ -7269,46 +6875,45 @@ { "name": "source_type", "type": "str", - "default": "" + "line": 256 }, { "name": "host", "type": "str | None", - "default": "None" + "line": 257 }, { "name": "port", "type": "int | None", - "default": "None" + "line": 258 }, { "name": "path", "type": "str | None", - "default": "None" + "line": 259 }, { "name": "username", "type": "str | None", - "default": "None" + "line": 260 }, { "name": "password", "type": "str | None", - "default": "None" + "line": 261 }, { "name": "rest_api_config", "type": "dict[str, Any] | None", - "default": "None" + "line": 263 }, { "name": "odbc_config", "type": "dict[str, Any] | None", - "default": "None" + "line": 264 } ], - "line": 250, - "doc": "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." + "line": 250 }, { "name": "TestConnectionResponse", @@ -7319,678 +6924,333 @@ { "name": "success", "type": "bool", - "default": "" + "line": 268 }, { "name": "message", "type": "str", - "default": "" + "line": 269 }, { "name": "latency_ms", "type": "int | None", - "default": "None" + "line": 270 }, { "name": "status", "type": "str | None", - "default": "None" + "line": 271 }, { "name": "warning", "type": "str | None", - "default": "None" + "line": 272 }, { "name": "differing_keys", "type": "list[str] | None", - "default": "None" + "line": 273 } ], - "line": 267, - "doc": "" + "line": 267 } ], "configuration": [] }, { - "source": "installed-owned-source/app/datasources/sync_failures_router.py", - "sha256": "6d942272770c5968245a2c2455883971eef01afd28c3fb6620efcf435ae0daa5", + "source": "backend/townlight_records/datasources/sync_failures_router.py", + "sha256": "49a80a2a4516476d7b7996076667f5eaac93e2ec7739a0567d529471f20b607d", + "bytes": 5440, "routes": [ { "method": "GET", - "path": "/datasources/{source_id}/sync-failures", - "router": "router", - "prefix_resolved": true, - "name": "list_sync_failures", - "signature": "source_id: uuid.UUID, status: Optional[str]=Query(None, description='Filter by status'), limit: int=Query(50, ge=1, le=500), offset: int=Query(0, ge=0), db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 26, - "doc": "", - "decorator": "router.get('/{source_id}/sync-failures', response_model=list[SyncFailureRead])", - "errors": [] + "declared_path": "/{source_id}/sync-failures", + "function": "list_sync_failures", + "line": 26 }, { "method": "POST", - "path": "/datasources/{source_id}/sync-failures/{failure_id}/retry", - "router": "router", - "prefix_resolved": true, - "name": "retry_sync_failure", - "signature": "source_id: uuid.UUID, failure_id: uuid.UUID, db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 43, - "doc": "", - "decorator": "router.post('/{source_id}/sync-failures/{failure_id}/retry')", - "errors": [ - "HTTPException(status_code=404, detail='Sync failure not found')" - ] + "declared_path": "/{source_id}/sync-failures/{failure_id}/retry", + "function": "retry_sync_failure", + "line": 43 }, { "method": "POST", - "path": "/datasources/{source_id}/sync-failures/{failure_id}/dismiss", - "router": "router", - "prefix_resolved": true, - "name": "dismiss_sync_failure", - "signature": "source_id: uuid.UUID, failure_id: uuid.UUID, db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 59, - "doc": "", - "decorator": "router.post('/{source_id}/sync-failures/{failure_id}/dismiss')", - "errors": [ - "HTTPException(status_code=404, detail='Sync failure not found')" - ] + "declared_path": "/{source_id}/sync-failures/{failure_id}/dismiss", + "function": "dismiss_sync_failure", + "line": 59 }, { "method": "POST", - "path": "/datasources/{source_id}/sync-failures/retry-all", - "router": "router", - "prefix_resolved": true, - "name": "retry_all_sync_failures", - "signature": "source_id: uuid.UUID, status: str=Query(..., description='Status to reset \u2014 required'), db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 76, - "doc": "", - "decorator": "router.post('/{source_id}/sync-failures/retry-all')", - "errors": [] + "declared_path": "/{source_id}/sync-failures/retry-all", + "function": "retry_all_sync_failures", + "line": 76 }, { "method": "POST", - "path": "/datasources/{source_id}/sync-failures/dismiss-all", - "router": "router", - "prefix_resolved": true, - "name": "dismiss_all_sync_failures", - "signature": "source_id: uuid.UUID, status: str=Query(..., description='Status to dismiss \u2014 required'), db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 97, - "doc": "", - "decorator": "router.post('/{source_id}/sync-failures/dismiss-all')", - "errors": [] + "declared_path": "/{source_id}/sync-failures/dismiss-all", + "function": "dismiss_all_sync_failures", + "line": 97 }, { "method": "POST", - "path": "/datasources/{source_id}/unpause", - "router": "router", - "prefix_resolved": true, - "name": "unpause_source", - "signature": "source_id: uuid.UUID, db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 120, - "doc": "", - "decorator": "router.post('/{source_id}/unpause')", - "errors": [ - "HTTPException(status_code=404, detail='Data source not found')" - ] + "declared_path": "/{source_id}/unpause", + "function": "unpause_source", + "line": 120 }, { "method": "GET", - "path": "/datasources/{source_id}/sync-run-log", - "router": "router", - "prefix_resolved": true, - "name": "get_sync_run_log", - "signature": "source_id: uuid.UUID, limit: int=Query(20, ge=1, le=100), db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 137, - "doc": "", - "decorator": "router.get('/{source_id}/sync-run-log', response_model=list[SyncRunLogRead])", - "errors": [] + "declared_path": "/{source_id}/sync-run-log", + "function": "get_sync_run_log", + "line": 137 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/departments/__init__.py", + "source": "backend/townlight_records/departments/__init__.py", "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/departments/router.py", - "sha256": "1c5f50b50572ecd7003903f2d3e9433027c86ebffe5a44d821b2e5ed05f0a39d", + "source": "backend/townlight_records/departments/router.py", + "sha256": "ae8357aa76ef96d76d42a176fd862fa854cdf01897a05517147386678e9a024b", + "bytes": 4453, "routes": [ { "method": "POST", - "path": "/departments/", - "router": "router", - "prefix_resolved": true, - "name": "create_department", - "signature": "data: DepartmentCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 18, - "doc": "", - "decorator": "router.post('/', response_model=DepartmentRead, status_code=201)", - "errors": [ - "HTTPException(status_code=409, detail='Department code already exists')" - ] - }, - { - "method": "GET", - "path": "/departments/", - "router": "router", - "prefix_resolved": true, - "name": "list_departments", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 43, - "doc": "", - "decorator": "router.get('/', response_model=list[DepartmentRead])", - "errors": [] - }, - { - "method": "GET", - "path": "/departments/{dept_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_department", - "signature": "dept_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 54, - "doc": "", - "decorator": "router.get('/{dept_id}', response_model=DepartmentRead)", - "errors": [ - "HTTPException(status_code=404, detail='Department not found')" - ] + "declared_path": "/", + "function": "create_department", + "line": 18 + }, + { + "method": "GET", + "declared_path": "/", + "function": "list_departments", + "line": 43 + }, + { + "method": "GET", + "declared_path": "/{dept_id}", + "function": "get_department", + "line": 54 }, { "method": "PATCH", - "path": "/departments/{dept_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_department", - "signature": "dept_id: uuid.UUID, data: DepartmentUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 66, - "doc": "", - "decorator": "router.patch('/{dept_id}', response_model=DepartmentRead)", - "errors": [ - "HTTPException(status_code=404, detail='Department not found')", - "HTTPException(status_code=409, detail='Department code already exists')" - ] + "declared_path": "/{dept_id}", + "function": "update_department", + "line": 66 }, { "method": "DELETE", - "path": "/departments/{dept_id}", - "router": "router", - "prefix_resolved": true, - "name": "delete_department", - "signature": "dept_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 100, - "doc": "", - "decorator": "router.delete('/{dept_id}', status_code=204)", - "errors": [ - "HTTPException(status_code=404, detail='Department not found')", - "HTTPException(status_code=409, detail=f'Cannot delete department with {user_count} assigned users')" - ] + "declared_path": "/{dept_id}", + "function": "delete_department", + "line": 100 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/desktop_bridge/__init__.py", + "source": "backend/townlight_records/desktop_bridge/__init__.py", "sha256": "707138dfa41f7f4e91957a523e3c3394ce52803778c5b278b3cc77d4a5b1c30f", + "bytes": 79, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/desktop_bridge/projection.py", - "sha256": "5267b17ae6be18258ea0e225ffb0d53c56aeaf674d9426856b8db804f801008c", + "source": "backend/townlight_records/desktop_bridge/projection.py", + "sha256": "b75009be22c4cbfa916303d711c5300e132121b36fba3775564f9b1c8893eaa4", + "bytes": 10584, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/desktop_bridge/records.py", - "sha256": "407b2ca9974caa761c00daee3b585ca915c2fe649a69a0dd58f42342b39821d1", + "source": "backend/townlight_records/desktop_bridge/records.py", + "sha256": "428bb99456414f4d7a4c806aeb2e360a7c48450b41b8af4bc24a35574f370c15", + "bytes": 3548, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/desktop_bridge/router.py", - "sha256": "7c02e0a222c36aecb84b105a918309a811f40249c3f55756d87cfa2646c4ef1b", + "source": "backend/townlight_records/desktop_bridge/router.py", + "sha256": "1b1cb6afce568f1ab81c991396ac27684eb06b11b1a0ab37192a8c9382c533fb", + "bytes": 33950, "routes": [ { "method": "GET", - "path": "/desktop/v1/public/records-state", - "router": "router", - "prefix_resolved": true, - "name": "public_records_state", - "signature": "request: Request, session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 134, - "doc": "", - "decorator": "router.get('/public/records-state', dependencies=[Depends(native_public_shell)], response_model=RecordsStateRead)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/public/requests", - "router": "router", - "prefix_resolved": true, - "name": "public_records_intake", - "signature": "data: PublicIntake, request: Request, session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 144, - "doc": "", - "decorator": "router.post('/public/requests', dependencies=[Depends(native_public_shell)])", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/public/lookup", - "router": "router", - "prefix_resolved": true, - "name": "public_records_lookup", - "signature": "data: PublicLookup, request: Request, session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 153, - "doc": "", - "decorator": "router.post('/public/lookup', dependencies=[Depends(native_public_shell)])", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/public/messages", - "router": "router", - "prefix_resolved": true, - "name": "public_records_message", - "signature": "data: PublicMessage, request: Request, session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 160, - "doc": "", - "decorator": "router.post('/public/messages', dependencies=[Depends(native_public_shell)])", - "errors": [ - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/permitting-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_permitting_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 204, - "doc": "", - "decorator": "router.post('/permitting-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/permitting-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_permitting_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 213, - "doc": "", - "decorator": "router.post('/requests/{request_id}/permitting-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Reviewed Permitting copy not found or no longer permitted.')", - "HTTPException(409, 'Permitting source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_inspections_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 239, - "doc": "", - "decorator": "router.post('/inspections-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/inspections-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_inspections_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 248, - "doc": "", - "decorator": "router.post('/requests/{request_id}/inspections-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Reviewed Inspections copy not found or no longer permitted.')", - "HTTPException(409, 'Inspections source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/planning-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_planning_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 274, - "doc": "", - "decorator": "router.post('/planning-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/planning-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_planning_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 283, - "doc": "", - "decorator": "router.post('/requests/{request_id}/planning-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Permitted Planning source not found.')", - "HTTPException(409, 'Planning source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_zoning_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 310, - "doc": "", - "decorator": "router.post('/zoning-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/zoning-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_zoning_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 319, - "doc": "", - "decorator": "router.post('/requests/{request_id}/zoning-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Permitted Zoning source not found.')", - "HTTPException(409, 'Zoning source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/records-state", - "router": "router", - "prefix_resolved": true, - "name": "get_native_records_state", - "signature": "session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 346, - "doc": "", - "decorator": "router.get('/records-state', response_model=RecordsStateRead)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_meetings_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 355, - "doc": "", - "decorator": "router.post('/meetings-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/meetings-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_meetings_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 364, - "doc": "", - "decorator": "router.post('/requests/{request_id}/meetings-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Permitted Meetings source not found.')", - "HTTPException(409, 'Meetings source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/code-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_code_sources", - "signature": "data: CodeSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 389, - "doc": "", - "decorator": "router.post('/code-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/code-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_code_source", - "signature": "request_id: uuid.UUID, data: CodeSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 398, - "doc": "", - "decorator": "router.post('/requests/{request_id}/code-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Permitted Code source not found.')", - "HTTPException(409, 'Code source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/notifications/{notification_id}/sent", - "router": "router", - "prefix_resolved": true, - "name": "mark_native_notification_sent", - "signature": "notification_id: uuid.UUID, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 423, - "doc": "", - "decorator": "router.post('/notifications/{notification_id}/sent', response_model=RecordsStateRead)", - "errors": [ - "HTTPException(404, 'Records notification not found.')", - "HTTPException(400, 'This local notification is already marked sent.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/documents", - "router": "router", - "prefix_resolved": true, - "name": "attach_native_document", - "signature": "request_id: uuid.UUID, data: AttachDocument, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 443, - "doc": "", - "decorator": "router.post('/requests/{request_id}/documents', response_model=RecordsOperationRead)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/documents/{attachment_id}/release-copy", - "router": "router", - "prefix_resolved": true, - "name": "attach_native_release_copy", - "signature": "request_id: uuid.UUID, attachment_id: uuid.UUID, data: AttachReleaseCopy, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 453, - "doc": "", - "decorator": "router.post('/requests/{request_id}/documents/{attachment_id}/release-copy', response_model=RecordsOperationRead)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/artifacts", - "router": "router", - "prefix_resolved": true, - "name": "prepare_native_artifact", - "signature": "request_id: uuid.UUID, data: PrepareArtifact, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 463, - "doc": "", - "decorator": "router.post('/requests/{request_id}/artifacts', response_model=ArtifactPlan)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/artifacts/{artifact_id}/complete", - "router": "router", - "prefix_resolved": true, - "name": "complete_native_artifact", - "signature": "request_id: uuid.UUID, artifact_id: uuid.UUID, data: CompleteArtifact, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 481, - "doc": "", - "decorator": "router.post('/requests/{request_id}/artifacts/{artifact_id}/complete', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests", - "router": "router", - "prefix_resolved": true, - "name": "create_native_request", - "signature": "data: StaffRecordsIntake, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 500, - "doc": "", - "decorator": "router.post('/requests', response_model=NativeRequestRead, status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/requests/{request_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_native_request", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 521, - "doc": "", - "decorator": "router.get('/requests/{request_id}', response_model=NativeRequestRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/requests/{request_id}/view", - "router": "router", - "prefix_resolved": true, - "name": "get_native_request_view", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 537, - "doc": "", - "decorator": "router.get('/requests/{request_id}/view', response_model=RecordsView)", - "errors": [ - "HTTPException(404, 'Records request not found.')" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/requests/{request_id}/draft-context", - "router": "router", - "prefix_resolved": true, - "name": "native_draft_context", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 549, - "doc": "", - "decorator": "router.get('/requests/{request_id}/draft-context')", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/generated-draft", - "router": "router", - "prefix_resolved": true, - "name": "native_generated_draft", - "signature": "request_id: uuid.UUID, data: GeneratedDraft, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 575, - "doc": "", - "decorator": "router.post('/requests/{request_id}/generated-draft', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(409, 'The draft changed during generation. Refresh before generating again.')", - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/actions", - "router": "router", - "prefix_resolved": true, - "name": "native_request_operation", - "signature": "request_id: uuid.UUID, command: RecordsCommand, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 605, - "doc": "", - "decorator": "router.post('/requests/{request_id}/actions', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(400, str(error))" - ] + "declared_path": "/public/records-state", + "function": "public_records_state", + "line": 135 + }, + { + "method": "POST", + "declared_path": "/public/requests", + "function": "public_records_intake", + "line": 145 + }, + { + "method": "POST", + "declared_path": "/public/lookup", + "function": "public_records_lookup", + "line": 154 + }, + { + "method": "POST", + "declared_path": "/public/messages", + "function": "public_records_message", + "line": 161 + }, + { + "method": "POST", + "declared_path": "/permitting-sources/search", + "function": "search_permitting_sources", + "line": 205 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/permitting-sources", + "function": "attach_permitting_source", + "line": 214 + }, + { + "method": "POST", + "declared_path": "/inspections-sources/search", + "function": "search_inspections_sources", + "line": 240 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/inspections-sources", + "function": "attach_inspections_source", + "line": 249 + }, + { + "method": "POST", + "declared_path": "/planning-sources/search", + "function": "search_planning_sources", + "line": 275 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/planning-sources", + "function": "attach_planning_source", + "line": 284 + }, + { + "method": "POST", + "declared_path": "/zoning-sources/search", + "function": "search_zoning_sources", + "line": 311 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/zoning-sources", + "function": "attach_zoning_source", + "line": 320 + }, + { + "method": "GET", + "declared_path": "/records-state", + "function": "get_native_records_state", + "line": 347 + }, + { + "method": "POST", + "declared_path": "/meetings-sources/search", + "function": "search_meetings_sources", + "line": 356 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/meetings-sources", + "function": "attach_meetings_source", + "line": 365 + }, + { + "method": "POST", + "declared_path": "/code-sources/search", + "function": "search_code_sources", + "line": 390 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/code-sources", + "function": "attach_code_source", + "line": 399 + }, + { + "method": "POST", + "declared_path": "/notifications/{notification_id}/sent", + "function": "mark_native_notification_sent", + "line": 424 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/documents", + "function": "attach_native_document", + "line": 444 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/documents/{attachment_id}/release-copy", + "function": "attach_native_release_copy", + "line": 454 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/artifacts", + "function": "prepare_native_artifact", + "line": 464 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/artifacts/{artifact_id}/complete", + "function": "complete_native_artifact", + "line": 482 + }, + { + "method": "POST", + "declared_path": "/requests", + "function": "create_native_request", + "line": 501 + }, + { + "method": "GET", + "declared_path": "/requests/{request_id}", + "function": "get_native_request", + "line": 522 + }, + { + "method": "GET", + "declared_path": "/requests/{request_id}/view", + "function": "get_native_request_view", + "line": 538 + }, + { + "method": "GET", + "declared_path": "/requests/{request_id}/draft-context", + "function": "native_draft_context", + "line": 550 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/generated-draft", + "function": "native_generated_draft", + "line": 576 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/actions", + "function": "native_request_operation", + "line": 606 } ], "models": [ @@ -8003,11 +7263,10 @@ { "name": "query", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 41 } ], - "line": 38, - "doc": "" + "line": 39 }, { "name": "MeetingsSourceSelection", @@ -8018,16 +7277,15 @@ { "name": "source_id", "type": "str", - "default": "Field(min_length=1, max_length=200)" + "line": 46 }, { "name": "expected_sha256", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 47 } ], - "line": 43, - "doc": "" + "line": 44 }, { "name": "CodeSearch", @@ -8038,16 +7296,15 @@ { "name": "query", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 52 }, { "name": "as_of", "type": "date | None", - "default": "None" + "line": 53 } ], - "line": 49, - "doc": "" + "line": 50 }, { "name": "CodeSourceSelection", @@ -8058,28 +7315,28 @@ { "name": "source_id", "type": "str", - "default": "Field(min_length=1, max_length=200)" + "line": 58 }, { "name": "expected_sha256", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 59 }, { "name": "as_of", "type": "date | None", - "default": "None" + "line": 60 } ], - "line": 55, - "doc": "" + "line": 56 } ], "configuration": [] }, { - "source": "installed-owned-source/app/desktop_bridge/schemas.py", - "sha256": "753dd5474d532912bc50118fe9add74613cbc3b17a062dd93681309ac590926d", + "source": "backend/townlight_records/desktop_bridge/schemas.py", + "sha256": "d7bbbba21363b6b997d92011653010ae9a63c2be0c81844d7527068ac3435237", + "bytes": 13499, "routes": [], "models": [ { @@ -8091,26 +7348,25 @@ { "name": "requester", "type": "str", - "default": "Field(min_length=1)" + "line": 14 }, { "name": "summary", "type": "str", - "default": "Field(min_length=1)" + "line": 15 }, { "name": "deadline", "type": "str", - "default": "" + "line": 16 }, { "name": "deadlineBasis", "type": "str", - "default": "''" + "line": 17 } ], - "line": 10, - "doc": "Existing native create-records-request input; no caller-supplied actor." + "line": 10 }, { "name": "NativeRequestRead", @@ -8121,36 +7377,35 @@ { "name": "desktop_id", "type": "str | None", - "default": "" + "line": 29 }, { "name": "public_tracking_number", "type": "str | None", - "default": "" + "line": 30 }, { "name": "submitted_via", "type": "str", - "default": "" + "line": 31 }, { "name": "deadline_label", "type": "str", - "default": "" + "line": 32 }, { "name": "deadline_basis", "type": "str", - "default": "" + "line": 33 }, { "name": "deadline_reviewed_at", "type": "datetime | None", - "default": "" + "line": 34 } ], - "line": 28, - "doc": "" + "line": 28 }, { "name": "AssignmentPayload", @@ -8161,11 +7416,10 @@ { "name": "assignedTo", "type": "str", - "default": "Field(min_length=1)" + "line": 42 } ], - "line": 41, - "doc": "" + "line": 41 }, { "name": "DeadlinePayload", @@ -8176,16 +7430,15 @@ { "name": "deadline", "type": "str", - "default": "" + "line": 46 }, { "name": "deadlineBasis", "type": "str", - "default": "Field(min_length=1)" + "line": 47 } ], - "line": 45, - "doc": "" + "line": 45 }, { "name": "CalculateDeadlinePayload", @@ -8196,31 +7449,30 @@ { "name": "deadlineReceivedDate", "type": "str", - "default": "" + "line": 53 }, { "name": "deadlineRuleName", "type": "str", - "default": "Field(min_length=1)" + "line": 54 }, { "name": "deadlineDayCount", "type": "str", - "default": "" + "line": 55 }, { "name": "deadlineDayType", "type": "str", - "default": "" + "line": 56 }, { "name": "deadlineBasis", "type": "str", - "default": "Field(min_length=1)" + "line": 57 } ], - "line": 52, - "doc": "" + "line": 52 }, { "name": "ClarificationPayload", @@ -8231,11 +7483,10 @@ { "name": "clarificationNote", "type": "str", - "default": "Field(min_length=1)" + "line": 78 } ], - "line": 77, - "doc": "" + "line": 77 }, { "name": "MessagePayload", @@ -8246,11 +7497,10 @@ { "name": "requestMessageBody", "type": "str", - "default": "Field(min_length=1)" + "line": 82 } ], - "line": 81, - "doc": "" + "line": 81 }, { "name": "SearchNotePayload", @@ -8261,16 +7511,15 @@ { "name": "sourceNote", "type": "str", - "default": "Field(min_length=1)" + "line": 86 }, { "name": "citation", "type": "str", - "default": "''" + "line": 87 } ], - "line": 85, - "doc": "" + "line": 85 }, { "name": "SearchReceiptPayload", @@ -8281,41 +7530,40 @@ { "name": "searchQuery", "type": "str", - "default": "Field(min_length=1)" + "line": 91 }, { "name": "searchLocations", "type": "str", - "default": "Field(min_length=1)" + "line": 92 }, { "name": "searchResultTitle", "type": "str", - "default": "Field(min_length=1)" + "line": 93 }, { "name": "searchResultCitation", "type": "str", - "default": "Field(min_length=1)" + "line": 94 }, { "name": "searchResultSummary", "type": "str", - "default": "Field(min_length=1)" + "line": 95 }, { "name": "searchResultStatus", "type": "str", - "default": "''" + "line": 96 }, { "name": "searchReviewer", "type": "str", - "default": "''" + "line": 97 } ], - "line": 90, - "doc": "" + "line": 90 }, { "name": "ExemptionNotePayload", @@ -8326,11 +7574,10 @@ { "name": "exemptionNote", "type": "str", - "default": "Field(min_length=1)" + "line": 101 } ], - "line": 100, - "doc": "" + "line": 100 }, { "name": "ExemptionDecisionPayload", @@ -8341,36 +7588,35 @@ { "name": "exemptionSource", "type": "str", - "default": "Field(min_length=1)" + "line": 105 }, { "name": "exemptionKind", "type": "str", - "default": "Field(min_length=1)" + "line": 106 }, { "name": "exemptionFinding", "type": "str", - "default": "Field(min_length=1)" + "line": 107 }, { "name": "exemptionDecision", "type": "Literal['release', 'redact', 'exempt']", - "default": "" + "line": 108 }, { "name": "exemptionBasis", "type": "str", - "default": "Field(min_length=1)" + "line": 109 }, { "name": "exemptionReviewer", "type": "str", - "default": "''" + "line": 110 } ], - "line": 104, - "doc": "" + "line": 104 }, { "name": "FeeEstimatePayload", @@ -8381,11 +7627,10 @@ { "name": "feeEstimate", "type": "str", - "default": "Field(min_length=1)" + "line": 119 } ], - "line": 118, - "doc": "" + "line": 118 }, { "name": "FeeLinePayload", @@ -8396,21 +7641,20 @@ { "name": "feeLineDescription", "type": "str", - "default": "Field(min_length=1)" + "line": 123 }, { "name": "feeScheduleBasis", "type": "str", - "default": "Field(min_length=1)" + "line": 124 }, { "name": "feeLineAmount", "type": "str", - "default": "" + "line": 125 } ], - "line": 122, - "doc": "" + "line": 122 }, { "name": "FeeWaiverPayload", @@ -8421,11 +7665,10 @@ { "name": "feeWaiverReason", "type": "str", - "default": "Field(min_length=1)" + "line": 141 } ], - "line": 140, - "doc": "" + "line": 140 }, { "name": "DraftPayload", @@ -8436,16 +7679,15 @@ { "name": "responseDraft", "type": "str", - "default": "Field(min_length=1)" + "line": 145 }, { "name": "citation", "type": "str", - "default": "''" + "line": 146 } ], - "line": 144, - "doc": "" + "line": 144 }, { "name": "ApprovalPayload", @@ -8456,11 +7698,10 @@ { "name": "approvalNote", "type": "str", - "default": "''" + "line": 150 } ], - "line": 149, - "doc": "" + "line": 149 }, { "name": "AssignCommand", @@ -8471,16 +7712,15 @@ { "name": "action", "type": "Literal['assign-records-request']", - "default": "" + "line": 154 }, { "name": "payload", "type": "AssignmentPayload", - "default": "" + "line": 155 } ], - "line": 153, - "doc": "" + "line": 153 }, { "name": "DeadlineCommand", @@ -8491,16 +7731,15 @@ { "name": "action", "type": "Literal['set-records-deadline']", - "default": "" + "line": 159 }, { "name": "payload", "type": "DeadlinePayload", - "default": "" + "line": 160 } ], - "line": 158, - "doc": "" + "line": 158 }, { "name": "CalculateDeadlineCommand", @@ -8511,16 +7750,15 @@ { "name": "action", "type": "Literal['calculate-records-deadline']", - "default": "" + "line": 164 }, { "name": "payload", "type": "CalculateDeadlinePayload", - "default": "" + "line": 165 } ], - "line": 163, - "doc": "" + "line": 163 }, { "name": "ClarificationCommand", @@ -8531,16 +7769,15 @@ { "name": "action", "type": "Literal['request-records-clarification']", - "default": "" + "line": 169 }, { "name": "payload", "type": "ClarificationPayload", - "default": "" + "line": 170 } ], - "line": 168, - "doc": "" + "line": 168 }, { "name": "MessageCommand", @@ -8551,16 +7788,15 @@ { "name": "action", "type": "Literal['add-records-message']", - "default": "" + "line": 174 }, { "name": "payload", "type": "MessagePayload", - "default": "" + "line": 175 } ], - "line": 173, - "doc": "" + "line": 173 }, { "name": "SearchNoteCommand", @@ -8571,16 +7807,15 @@ { "name": "action", "type": "Literal['record-records-search']", - "default": "" + "line": 179 }, { "name": "payload", "type": "SearchNotePayload", - "default": "" + "line": 180 } ], - "line": 178, - "doc": "" + "line": 178 }, { "name": "SearchReceiptCommand", @@ -8591,16 +7826,15 @@ { "name": "action", "type": "Literal['record-records-search-session']", - "default": "" + "line": 184 }, { "name": "payload", "type": "SearchReceiptPayload", - "default": "" + "line": 185 } ], - "line": 183, - "doc": "" + "line": 183 }, { "name": "ExemptionNoteCommand", @@ -8611,16 +7845,15 @@ { "name": "action", "type": "Literal['add-records-exemption-review']", - "default": "" + "line": 189 }, { "name": "payload", "type": "ExemptionNotePayload", - "default": "" + "line": 190 } ], - "line": 188, - "doc": "" + "line": 188 }, { "name": "ExemptionDecisionCommand", @@ -8631,16 +7864,15 @@ { "name": "action", "type": "Literal['add-records-exemption-decision']", - "default": "" + "line": 194 }, { "name": "payload", "type": "ExemptionDecisionPayload", - "default": "" + "line": 195 } ], - "line": 193, - "doc": "" + "line": 193 }, { "name": "FeeEstimateCommand", @@ -8651,16 +7883,15 @@ { "name": "action", "type": "Literal['estimate-records-fee']", - "default": "" + "line": 199 }, { "name": "payload", "type": "FeeEstimatePayload", - "default": "" + "line": 200 } ], - "line": 198, - "doc": "" + "line": 198 }, { "name": "FeeLineCommand", @@ -8671,16 +7902,15 @@ { "name": "action", "type": "Literal['add-records-fee-line']", - "default": "" + "line": 204 }, { "name": "payload", "type": "FeeLinePayload", - "default": "" + "line": 205 } ], - "line": 203, - "doc": "" + "line": 203 }, { "name": "FeeWaiverCommand", @@ -8691,16 +7921,15 @@ { "name": "action", "type": "Literal['waive-records-fee']", - "default": "" + "line": 209 }, { "name": "payload", "type": "FeeWaiverPayload", - "default": "" + "line": 210 } ], - "line": 208, - "doc": "" + "line": 208 }, { "name": "DraftCommand", @@ -8711,16 +7940,15 @@ { "name": "action", "type": "Literal['draft-records-response']", - "default": "" + "line": 214 }, { "name": "payload", "type": "DraftPayload", - "default": "" + "line": 215 } ], - "line": 213, - "doc": "" + "line": 213 }, { "name": "ApprovalCommand", @@ -8731,16 +7959,15 @@ { "name": "action", "type": "Literal['approve-records-response']", - "default": "" + "line": 219 }, { "name": "payload", "type": "ApprovalPayload", - "default": "Field(default_factory=ApprovalPayload)" + "line": 220 } ], - "line": 218, - "doc": "" + "line": 218 }, { "name": "FinishCommand", @@ -8751,16 +7978,15 @@ { "name": "action", "type": "Literal['fulfill-records-request', 'close-records-request']", - "default": "" + "line": 224 }, { "name": "payload", "type": "NativePayload", - "default": "Field(default_factory=NativePayload)" + "line": 225 } ], - "line": 223, - "doc": "" + "line": 223 }, { "name": "TimelineView", @@ -8771,31 +7997,30 @@ { "name": "id", "type": "str", - "default": "" + "line": 242 }, { "name": "action", "type": "str", - "default": "" + "line": 243 }, { "name": "actor", "type": "str", - "default": "" + "line": 244 }, { "name": "note", "type": "str", - "default": "" + "line": 245 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 246 } ], - "line": 241, - "doc": "" + "line": 241 }, { "name": "PublicStatusView", @@ -8806,31 +8031,30 @@ { "name": "id", "type": "str", - "default": "" + "line": 250 }, { "name": "label", "type": "str", - "default": "" + "line": 251 }, { "name": "summary", "type": "str", - "default": "" + "line": 252 }, { "name": "status", "type": "str", - "default": "" + "line": 253 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 254 } ], - "line": 249, - "doc": "" + "line": 249 }, { "name": "MessageView", @@ -8841,36 +8065,35 @@ { "name": "id", "type": "str", - "default": "" + "line": 258 }, { "name": "author", "type": "str", - "default": "" + "line": 259 }, { "name": "author_role", "type": "str", - "default": "" + "line": 260 }, { "name": "body", "type": "str", - "default": "" + "line": 261 }, { "name": "visibility", "type": "str", - "default": "" + "line": 262 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 263 } ], - "line": 257, - "doc": "" + "line": 257 }, { "name": "FeeLineView", @@ -8881,31 +8104,30 @@ { "name": "id", "type": "str", - "default": "" + "line": 267 }, { "name": "description", "type": "str", - "default": "" + "line": 268 }, { "name": "schedule_basis", "type": "str", - "default": "" + "line": 269 }, { "name": "amount_cents", "type": "int", - "default": "" + "line": 270 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 271 } ], - "line": 266, - "doc": "" + "line": 266 }, { "name": "ExemptionDecisionView", @@ -8916,46 +8138,45 @@ { "name": "id", "type": "str", - "default": "" + "line": 275 }, { "name": "source", "type": "str", - "default": "" + "line": 276 }, { "name": "kind", "type": "str", - "default": "" + "line": 277 }, { "name": "finding", "type": "str", - "default": "" + "line": 278 }, { "name": "decision", "type": "Literal['release', 'redact', 'exempt']", - "default": "" + "line": 279 }, { "name": "basis", "type": "str", - "default": "" + "line": 280 }, { "name": "reviewer", "type": "str", - "default": "" + "line": 281 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 282 } ], - "line": 274, - "doc": "" + "line": 274 }, { "name": "SearchResultView", @@ -8966,31 +8187,30 @@ { "name": "id", "type": "str", - "default": "" + "line": 286 }, { "name": "title", "type": "str", - "default": "" + "line": 287 }, { "name": "citation", "type": "str", - "default": "" + "line": 288 }, { "name": "summary", "type": "str", - "default": "" + "line": 289 }, { "name": "status", "type": "str", - "default": "" + "line": 290 } ], - "line": 285, - "doc": "" + "line": 285 }, { "name": "SearchReceiptView", @@ -9001,36 +8221,35 @@ { "name": "id", "type": "str", - "default": "" + "line": 294 }, { "name": "query", "type": "str", - "default": "" + "line": 295 }, { "name": "locations", "type": "str", - "default": "" + "line": 296 }, { "name": "reviewer", "type": "str", - "default": "" + "line": 297 }, { "name": "results", "type": "list[SearchResultView]", - "default": "" + "line": 298 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 299 } ], - "line": 293, - "doc": "" + "line": 293 }, { "name": "RecordsView", @@ -9041,171 +8260,170 @@ { "name": "request_id", "type": "str", - "default": "" + "line": 304 }, { "name": "id", "type": "str", - "default": "" + "line": 305 }, { "name": "public_tracking_number", "type": "str", - "default": "" + "line": 306 }, { "name": "requester", "type": "str", - "default": "" + "line": 307 }, { "name": "requester_contact", "type": "str", - "default": "" + "line": 308 }, { "name": "submitted_via", "type": "str", - "default": "" + "line": 309 }, { "name": "summary", "type": "str", - "default": "" + "line": 310 }, { "name": "deadline", "type": "str", - "default": "" + "line": 311 }, { "name": "deadline_basis", "type": "str", - "default": "" + "line": 312 }, { "name": "status", "type": "str", - "default": "" + "line": 313 }, { "name": "assigned_to", "type": "str", - "default": "" + "line": 314 }, { "name": "clarification_notes", "type": "list[str]", - "default": "" + "line": 315 }, { "name": "search_notes", "type": "list[str]", - "default": "" + "line": 316 }, { "name": "search_sessions", "type": "list[SearchReceiptView]", - "default": "" + "line": 317 }, { "name": "exemption_reviews", "type": "list[str]", - "default": "" + "line": 318 }, { "name": "exemption_decisions", "type": "list[ExemptionDecisionView]", - "default": "" + "line": 319 }, { "name": "fee_estimate", "type": "str", - "default": "" + "line": 320 }, { "name": "fee_line_items", "type": "list[FeeLineView]", - "default": "" + "line": 321 }, { "name": "fee_waiver_reason", "type": "str", - "default": "" + "line": 322 }, { "name": "citations", "type": "list[str]", - "default": "" + "line": 323 }, { "name": "response_draft", "type": "str", - "default": "" + "line": 324 }, { "name": "approval_notes", "type": "list[str]", - "default": "" + "line": 325 }, { "name": "exports", "type": "list[str]", - "default": "" + "line": 326 }, { "name": "documents", "type": "list['RecordsDocumentView']", - "default": "Field(default_factory=list)" + "line": 327 }, { "name": "release_packages", "type": "list['ReleasePackageView']", - "default": "Field(default_factory=list)" + "line": 328 }, { "name": "timeline", "type": "list[TimelineView]", - "default": "" + "line": 329 }, { "name": "public_status_events", "type": "list[PublicStatusView]", - "default": "" + "line": 330 }, { "name": "messages", "type": "list[MessageView]", - "default": "" + "line": 331 }, { "name": "deadline_reviewed_at_unix_seconds", "type": "int | None", - "default": "" + "line": 332 }, { "name": "approved_at_unix_seconds", "type": "int | None", - "default": "" + "line": 333 }, { "name": "fulfilled_at_unix_seconds", "type": "int | None", - "default": "" + "line": 334 }, { "name": "closed_at_unix_seconds", "type": "int | None", - "default": "" + "line": 335 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 336 } ], - "line": 302, - "doc": "" + "line": 302 }, { "name": "RecordsOperationRead", @@ -9216,21 +8434,20 @@ { "name": "action", "type": "str", - "default": "" + "line": 340 }, { "name": "message", "type": "str", - "default": "" + "line": 341 }, { "name": "request", "type": "RecordsView", - "default": "" + "line": 342 } ], - "line": 339, - "doc": "" + "line": 339 }, { "name": "RecordsStateRead", @@ -9241,31 +8458,30 @@ { "name": "demo_fixture", "type": "dict | None", - "default": "None" + "line": 346 }, { "name": "records_requests", "type": "list[RecordsView]", - "default": "" + "line": 347 }, { "name": "notification_events", "type": "list['NotificationView']", - "default": "Field(default_factory=list)" + "line": 348 }, { "name": "publication_events", "type": "list['PublicationView']", - "default": "Field(default_factory=list)" + "line": 349 }, { "name": "audit_entries", "type": "list['AuditView']", - "default": "Field(default_factory=list)" + "line": 350 } ], - "line": 345, - "doc": "" + "line": 345 }, { "name": "ManagedFileReceipt", @@ -9276,31 +8492,30 @@ { "name": "original_path", "type": "str", - "default": "Field(min_length=1)" + "line": 354 }, { "name": "stored_path", "type": "str", - "default": "Field(min_length=1)" + "line": 355 }, { "name": "file_name", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 356 }, { "name": "sha256", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 357 }, { "name": "size_bytes", "type": "int", - "default": "Field(ge=0, le=2147483647, strict=True)" + "line": 358 } ], - "line": 353, - "doc": "" + "line": 353 }, { "name": "AttachDocument", @@ -9311,21 +8526,20 @@ { "name": "title", "type": "str", - "default": "Field(min_length=1)" + "line": 362 }, { "name": "citation", "type": "str", - "default": "''" + "line": 363 }, { "name": "file", "type": "ManagedFileReceipt", - "default": "" + "line": 364 } ], - "line": 361, - "doc": "" + "line": 361 }, { "name": "AttachReleaseCopy", @@ -9336,26 +8550,25 @@ { "name": "status", "type": "Literal['release-ready copy', 'redacted copy']", - "default": "" + "line": 368 }, { "name": "note", "type": "str", - "default": "''" + "line": 369 }, { "name": "added_by", "type": "str", - "default": "''" + "line": 370 }, { "name": "file", "type": "ManagedFileReceipt", - "default": "" + "line": 371 } ], - "line": 367, - "doc": "" + "line": 367 }, { "name": "RecordsDocumentView", @@ -9366,106 +8579,105 @@ { "name": "id", "type": "str", - "default": "" + "line": 375 }, { "name": "attachment_id", "type": "str", - "default": "" + "line": 376 }, { "name": "title", "type": "str", - "default": "" + "line": 377 }, { "name": "original_path", "type": "str", - "default": "" + "line": 378 }, { "name": "stored_path", "type": "str", - "default": "" + "line": 379 }, { "name": "citation", "type": "str", - "default": "" + "line": 380 }, { "name": "sha256", "type": "str", - "default": "" + "line": 381 }, { "name": "size_bytes", "type": "int", - "default": "" + "line": 382 }, { "name": "status", "type": "str", - "default": "" + "line": 383 }, { "name": "added_by", "type": "str", - "default": "" + "line": 384 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 385 }, { "name": "release_original_path", "type": "str", - "default": "''" + "line": 386 }, { "name": "release_stored_path", "type": "str", - "default": "''" + "line": 387 }, { "name": "release_file_name", "type": "str", - "default": "''" + "line": 388 }, { "name": "release_sha256", "type": "str", - "default": "''" + "line": 389 }, { "name": "release_size_bytes", "type": "int", - "default": "0" + "line": 390 }, { "name": "release_status", "type": "str", - "default": "''" + "line": 391 }, { "name": "release_note", "type": "str", - "default": "''" + "line": 392 }, { "name": "release_added_by", "type": "str", - "default": "''" + "line": 393 }, { "name": "release_added_at_unix_seconds", "type": "int | None", - "default": "None" + "line": 394 } ], - "line": 374, - "doc": "" + "line": 374 }, { "name": "ReleasePackageView", @@ -9476,56 +8688,55 @@ { "name": "id", "type": "str", - "default": "" + "line": 398 }, { "name": "export_path", "type": "str", - "default": "" + "line": 399 }, { "name": "package_hash", "type": "str", - "default": "" + "line": 400 }, { "name": "document_count", "type": "int", - "default": "" + "line": 401 }, { "name": "release_artifact_count", "type": "int", - "default": "" + "line": 402 }, { "name": "search_session_count", "type": "int", - "default": "" + "line": 403 }, { "name": "release_count", "type": "int", - "default": "" + "line": 404 }, { "name": "redacted_count", "type": "int", - "default": "" + "line": 405 }, { "name": "exempt_count", "type": "int", - "default": "" + "line": 406 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 407 } ], - "line": 397, - "doc": "" + "line": 397 }, { "name": "PrepareArtifact", @@ -9536,11 +8747,10 @@ { "name": "kind", "type": "Literal['response', 'release-package']", - "default": "" + "line": 411 } ], - "line": 410, - "doc": "" + "line": 410 }, { "name": "ArtifactPlan", @@ -9551,31 +8761,30 @@ { "name": "artifact_id", "type": "str", - "default": "" + "line": 415 }, { "name": "file_name", "type": "str", - "default": "" + "line": 416 }, { "name": "content", "type": "str", - "default": "" + "line": 417 }, { "name": "sha256", "type": "str", - "default": "" + "line": 418 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 419 } ], - "line": 414, - "doc": "" + "line": 414 }, { "name": "CompleteArtifact", @@ -9586,11 +8795,10 @@ { "name": "export_path", "type": "str", - "default": "Field(min_length=1)" + "line": 423 } ], - "line": 422, - "doc": "" + "line": 422 }, { "name": "PublicIntake", @@ -9601,26 +8809,25 @@ { "name": "requester", "type": "str", - "default": "Field(min_length=1)" + "line": 427 }, { "name": "requesterContact", "type": "str", - "default": "Field(min_length=1)" + "line": 428 }, { "name": "summary", "type": "str", - "default": "Field(min_length=1)" + "line": 429 }, { "name": "deadline", "type": "str", - "default": "''" + "line": 430 } ], - "line": 426, - "doc": "" + "line": 426 }, { "name": "PublicLookup", @@ -9631,16 +8838,15 @@ { "name": "trackingNumber", "type": "str", - "default": "Field(min_length=1)" + "line": 434 }, { "name": "requesterContact", "type": "str", - "default": "Field(min_length=1)" + "line": 435 } ], - "line": 433, - "doc": "" + "line": 433 }, { "name": "PublicMessage", @@ -9651,11 +8857,10 @@ { "name": "publicRequestMessage", "type": "str", - "default": "Field(min_length=1)" + "line": 439 } ], - "line": 438, - "doc": "" + "line": 438 }, { "name": "GeneratedDraft", @@ -9666,21 +8871,20 @@ { "name": "text", "type": "str", - "default": "Field(min_length=1)" + "line": 443 }, { "name": "model", "type": "str", - "default": "Field(min_length=1)" + "line": 444 }, { "name": "previous_response_sha256", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 445 } ], - "line": 442, - "doc": "" + "line": 442 }, { "name": "NotificationView", @@ -9691,61 +8895,60 @@ { "name": "id", "type": "str", - "default": "" + "line": 449 }, { "name": "notification_id", "type": "str", - "default": "" + "line": 450 }, { "name": "module_id", "type": "str", - "default": "" + "line": 451 }, { "name": "record_id", "type": "str", - "default": "" + "line": 452 }, { "name": "audience", "type": "str", - "default": "" + "line": 453 }, { "name": "channel", "type": "str", - "default": "" + "line": 454 }, { "name": "subject", "type": "str", - "default": "" + "line": 455 }, { "name": "body", "type": "str", - "default": "" + "line": 456 }, { "name": "status", "type": "str", - "default": "" + "line": 457 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 458 }, { "name": "sent_at_unix_seconds", "type": "int | None", - "default": "" + "line": 459 } ], - "line": 448, - "doc": "" + "line": 448 }, { "name": "PublicationView", @@ -9756,51 +8959,50 @@ { "name": "id", "type": "str", - "default": "" + "line": 463 }, { "name": "source_module", "type": "str", - "default": "" + "line": 464 }, { "name": "source_record_id", "type": "str", - "default": "" + "line": 465 }, { "name": "record_type", "type": "str", - "default": "" + "line": 466 }, { "name": "public_payload", "type": "str", - "default": "" + "line": 467 }, { "name": "payload_hash", "type": "str", - "default": "" + "line": 468 }, { "name": "published_at_unix_seconds", "type": "int", - "default": "" + "line": 469 }, { "name": "retracted_at_unix_seconds", "type": "int | None", - "default": "None" + "line": 470 }, { "name": "retracted_by", "type": "str", - "default": "''" + "line": 471 } ], - "line": 462, - "doc": "" + "line": 462 }, { "name": "AuditView", @@ -9811,83 +9013,60 @@ { "name": "id", "type": "str", - "default": "" + "line": 475 }, { "name": "module_id", "type": "str", - "default": "" + "line": 476 }, { "name": "action", "type": "str", - "default": "" + "line": 477 }, { "name": "summary", "type": "str", - "default": "" + "line": 478 }, { "name": "created_at_unix_seconds", "type": "int", - "default": "" + "line": 479 }, { "name": "previous_hash", "type": "str", - "default": "" + "line": 480 }, { "name": "entry_hash", "type": "str", - "default": "" + "line": 481 } ], - "line": 474, - "doc": "" + "line": 474 } ], "configuration": [] }, { - "source": "installed-owned-source/app/desktop_bridge/station.py", - "sha256": "2f53398b6a897f804419ea5025895bb7dc468d8891dc553b20bb14cb5d0a8084", + "source": "backend/townlight_records/desktop_bridge/station.py", + "sha256": "4cdb8465053f61d2e63477a028b880d3524e4e37da0d99781ca88d616cc0b1b1", + "bytes": 9588, "routes": [ { "method": "GET", - "path": "/station/context", - "router": "router", - "prefix_resolved": false, - "name": "context", - "signature": "request: Request, capability: Literal['capture', 'read'], proof: str | None=Header(default=None, alias='X-Townlight-Session'), session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 43, - "doc": "", - "decorator": "router.get('/station/context')", - "errors": [ - "HTTPException(403, 'This staff role cannot perform this Station operation')", - "HTTPException(401, str(exc))" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/station-recordings", - "router": "router", - "prefix_resolved": false, - "name": "attach", - "signature": "request_id: UUID, data: Selection, request: Request, actor=Depends(station_actor), session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 79, - "doc": "", - "decorator": "router.post('/requests/{request_id}/station-recordings', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found')", - "HTTPException(409, str(exc))", - "HTTPException(422, 'Station evidence not attached; existing evidence preserved')", - "HTTPException(response.status_code, 'Station denied this recording')", - "HTTPException(409, 'Station recording is incomplete or changed; refresh selection')" - ] + "declared_path": "/station/context", + "function": "context", + "line": 43 + }, + { + "method": "POST", + "declared_path": "/requests/{request_id}/station-recordings", + "function": "attach", + "line": 79 } ], "models": [ @@ -9900,348 +9079,201 @@ { "name": "recording_id", "type": "UUID", - "default": "" + "line": 63 }, { "name": "expected_sha256", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 64 } ], - "line": 61, - "doc": "" + "line": 61 } ], "configuration": [ { - "variable": "TOWNLIGHT_STATION_URL", - "default": "''", + "environment": "TOWNLIGHT_STATION_URL", "line": 33 } ] }, { - "source": "installed-owned-source/app/documents/__init__.py", - "sha256": "2795a0001b651166674cb0b501f64e0030e84816d5b4335f3189529510e2b10b", + "source": "backend/townlight_records/documents/__init__.py", + "sha256": "74e2f6fddd8fadac3833b72a02396e5cb3c4d3d91211437e23005ecd24de61f0", + "bytes": 107, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/documents/router.py", - "sha256": "12c9facd2481a2294883f665516bd5e0bf3a487ee76c7eb747eb4b95aa80fefe", + "source": "backend/townlight_records/documents/router.py", + "sha256": "ade31f62c2483692bde64f5d009ba855d91fec8d34fbb5da9846d9689cd2d312", + "bytes": 3661, "routes": [ { "method": "GET", - "path": "/documents/", - "router": "router", - "prefix_resolved": true, - "name": "list_documents", - "signature": "source_id: uuid.UUID | None=None, status: IngestionStatus | None=None, limit: int=Query(default=50, le=500), offset: int=0, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 31, - "doc": "", - "decorator": "router.get('/', response_model=list[DocumentRead])", - "errors": [] + "declared_path": "/", + "function": "list_documents", + "line": 31 }, { "method": "GET", - "path": "/documents/{document_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_document", - "signature": "document_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 47, - "doc": "", - "decorator": "router.get('/{document_id}', response_model=DocumentRead)", - "errors": [ - "HTTPException(status_code=404, detail='Document not found')" - ] + "declared_path": "/{document_id}", + "function": "get_document", + "line": 47 }, { "method": "GET", - "path": "/documents/{document_id}/chunks", - "router": "router", - "prefix_resolved": true, - "name": "list_chunks", - "signature": "document_id: uuid.UUID, limit: int=Query(default=50, le=500), offset: int=0, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 57, - "doc": "", - "decorator": "router.get('/{document_id}/chunks', response_model=list[DocumentChunkRead])", - "errors": [ - "HTTPException(status_code=404, detail='Document not found')" - ] + "declared_path": "/{document_id}/chunks", + "function": "list_chunks", + "line": 57 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/exemptions/__init__.py", + "source": "backend/townlight_records/exemptions/__init__.py", "sha256": "2fd238ebecb0a427697f59094dad0d088962ebe3029a8a540d14957160714341", + "bytes": 30, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/exemptions/engine.py", - "sha256": "56001a7259c4ca1a206ee528ceced69bd2764534133db61b9fcf5d01a26a8253", + "source": "backend/townlight_records/exemptions/engine.py", + "sha256": "30b4bf307d9572b2c56492d6e3485dc8db083df47f20ef66d738cd3d01394e3b", + "bytes": 3197, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/exemptions/llm_reviewer.py", - "sha256": "ab13ae2f8dde8c66debff2f9276787887524f7bf785833fcddc569816b1be8b4", + "source": "backend/townlight_records/exemptions/llm_reviewer.py", + "sha256": "7af32fc1ed813d1ca2781261840b2004a5f7b641313fe93690e41ac7415a3cda", + "bytes": 2412, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/exemptions/patterns.py", - "sha256": "364df5cffdccda747ecbf9d69775f0cce92610c6b253b5b78b91a0ac409ef9eb", + "source": "backend/townlight_records/exemptions/patterns.py", + "sha256": "5f5ac114245cf4654be3361430d04f868be5ece128e07f15899d25c40eec3cb3", + "bytes": 600, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/exemptions/router.py", - "sha256": "4c35393f13a282194f4225b02e7b6d233b6e9b979371d6e318c7e5ed1df97dca", + "source": "backend/townlight_records/exemptions/router.py", + "sha256": "dc0cb9be6e398cba564196759232160ac1ccdb487163c0802e5eadf3201bd67d", + "bytes": 23419, "routes": [ { "method": "POST", - "path": "/exemptions/rules/", - "router": "router", - "prefix_resolved": true, - "name": "create_rule", - "signature": "data: ExemptionRuleCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 34, - "doc": "", - "decorator": "router.post('/rules/', response_model=ExemptionRuleRead, status_code=201)", - "errors": [] + "declared_path": "/rules/", + "function": "create_rule", + "line": 34 }, { "method": "GET", - "path": "/exemptions/rules/", - "router": "router", - "prefix_resolved": true, - "name": "list_rules", - "signature": "state_code: str | None=None, enabled: bool | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 61, - "doc": "", - "decorator": "router.get('/rules/', response_model=list[ExemptionRuleRead])", - "errors": [] + "declared_path": "/rules/", + "function": "list_rules", + "line": 61 }, { "method": "PATCH", - "path": "/exemptions/rules/{rule_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_rule", - "signature": "rule_id: uuid.UUID, data: ExemptionRuleUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 77, - "doc": "", - "decorator": "router.patch('/rules/{rule_id}', response_model=ExemptionRuleRead)", - "errors": [ - "HTTPException(status_code=404, detail='Rule not found')" - ] - }, - { - "method": "GET", - "path": "/exemptions/rules/{rule_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "get_rule_history", - "signature": "rule_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 109, - "doc": "Get audit history for an exemption rule.", - "decorator": "router.get('/rules/{rule_id}/history')", - "errors": [ - "HTTPException(status_code=404, detail='Rule not found')" - ] - }, - { - "method": "POST", - "path": "/exemptions/rules/{rule_id}/test", - "router": "router", - "prefix_resolved": true, - "name": "test_rule", - "signature": "rule_id: uuid.UUID, body: RuleTestRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 162, - "doc": "Test a rule against sample text. Returns match results.\n\nUses the `regex` library with timeout=2s to prevent ReDoS on\nadmin-entered patterns.", - "decorator": "router.post('/rules/{rule_id}/test', response_model=RuleTestResponse)", - "errors": [ - "HTTPException(status_code=404, detail='Rule not found')", - "HTTPException(status_code=422, detail=f'Invalid regex pattern: {e}')", - "HTTPException(status_code=408, detail='Regex execution timed out (possible catastrophic backtracking)')", - "HTTPException(status_code=400, detail='LLM-based rules cannot be tested with sample text \u2014 they require full document context.')" - ] - }, - { - "method": "POST", - "path": "/exemptions/scan/{request_id}", - "router": "router", - "prefix_resolved": true, - "name": "scan_for_exemptions", - "signature": "request_id: uuid.UUID, state_code: str=Query(default='CO', pattern='^[A-Z]{2}$'), use_llm: bool=False, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 228, - "doc": "Scan all documents attached to a request for exemptions.", - "decorator": "router.post('/scan/{request_id}')", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=422, detail=f'Scan incomplete: {exc}')" - ] - }, - { - "method": "GET", - "path": "/exemptions/flags/{request_id}", - "router": "router", - "prefix_resolved": true, - "name": "list_flags", - "signature": "request_id: uuid.UUID, status: FlagStatus | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 300, - "doc": "", - "decorator": "router.get('/flags/{request_id}', response_model=list[ExemptionFlagRead])", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] + "declared_path": "/rules/{rule_id}", + "function": "update_rule", + "line": 77 }, { - "method": "PATCH", - "path": "/exemptions/flags/{flag_id}", - "router": "router", - "prefix_resolved": true, - "name": "review_flag", - "signature": "flag_id: uuid.UUID, data: ExemptionFlagReview, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 321, - "doc": "", - "decorator": "router.patch('/flags/{flag_id}', response_model=ExemptionFlagRead)", - "errors": [ - "HTTPException(status_code=404, detail='Flag not found')", - "HTTPException(status_code=400, detail='Status must be accepted, rejected, or reviewed')" - ] - }, - { - "method": "GET", - "path": "/exemptions/dashboard/accuracy", - "router": "router", - "prefix_resolved": true, - "name": "exemption_accuracy", - "signature": "department_id: uuid.UUID | None=None, date_from: datetime | None=None, date_to: datetime | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 365, - "doc": "Acceptance/rejection rates by category, optionally filtered by department.", - "decorator": "router.get('/dashboard/accuracy', response_model=list[ExemptionAccuracyReport])", - "errors": [] - }, - { - "method": "GET", - "path": "/exemptions/dashboard/export", - "router": "router", - "prefix_resolved": true, - "name": "export_flag_data", - "signature": "format: str='json', date_from: datetime | None=None, date_to: datetime | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 423, - "doc": "Export exemption flag data as JSON or CSV.", - "decorator": "router.get('/dashboard/export')", - "errors": [] - }, - { - "method": "GET", - "path": "/exemptions/dashboard", - "router": "router", - "prefix_resolved": true, - "name": "exemption_dashboard", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 480, - "doc": "", - "decorator": "router.get('/dashboard', response_model=ExemptionDashboard)", - "errors": [] - }, - { - "method": "GET", - "path": "/exemptions/templates/", - "router": "router", - "prefix_resolved": true, - "name": "list_templates", - "signature": "template_type: str | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 519, - "doc": "", - "decorator": "router.get('/templates/', response_model=list[DisclosureTemplateRead])", - "errors": [] - }, - { - "method": "POST", - "path": "/exemptions/templates/", - "router": "router", - "prefix_resolved": true, - "name": "create_template", - "signature": "data: DisclosureTemplateCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 532, - "doc": "", - "decorator": "router.post('/templates/', response_model=DisclosureTemplateRead, status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/exemptions/templates/{template_id}/render", - "router": "router", - "prefix_resolved": true, - "name": "render_template", - "signature": "template_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 556, - "doc": "Render a template with city profile variables substituted.", - "decorator": "router.get('/templates/{template_id}/render', response_model=DisclosureTemplateRendered)", - "errors": [ - "HTTPException(status_code=404, detail='Template not found')" - ] + "method": "GET", + "declared_path": "/rules/{rule_id}/history", + "function": "get_rule_history", + "line": 109 }, { - "method": "PUT", - "path": "/exemptions/templates/{template_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_template", - "signature": "template_id: uuid.UUID, data: DisclosureTemplateUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 609, - "doc": "", - "decorator": "router.put('/templates/{template_id}', response_model=DisclosureTemplateRead)", - "errors": [ - "HTTPException(status_code=404, detail='Template not found')" - ] - } - ], - "models": [ + "method": "POST", + "declared_path": "/rules/{rule_id}/test", + "function": "test_rule", + "line": 162 + }, { - "name": "RuleTestRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "sample_text", + "method": "POST", + "declared_path": "/scan/{request_id}", + "function": "scan_for_exemptions", + "line": 228 + }, + { + "method": "GET", + "declared_path": "/flags/{request_id}", + "function": "list_flags", + "line": 300 + }, + { + "method": "PATCH", + "declared_path": "/flags/{flag_id}", + "function": "review_flag", + "line": 321 + }, + { + "method": "GET", + "declared_path": "/dashboard/accuracy", + "function": "exemption_accuracy", + "line": 365 + }, + { + "method": "GET", + "declared_path": "/dashboard/export", + "function": "export_flag_data", + "line": 423 + }, + { + "method": "GET", + "declared_path": "/dashboard", + "function": "exemption_dashboard", + "line": 480 + }, + { + "method": "GET", + "declared_path": "/templates/", + "function": "list_templates", + "line": 519 + }, + { + "method": "POST", + "declared_path": "/templates/", + "function": "create_template", + "line": 532 + }, + { + "method": "GET", + "declared_path": "/templates/{template_id}/render", + "function": "render_template", + "line": 556 + }, + { + "method": "PUT", + "declared_path": "/templates/{template_id}", + "function": "update_template", + "line": 609 + } + ], + "models": [ + { + "name": "RuleTestRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "sample_text", "type": "str", - "default": "" + "line": 145 } ], - "line": 144, - "doc": "" + "line": 144 }, { "name": "RuleTestMatch", @@ -10252,21 +9284,20 @@ { "name": "matched_text", "type": "str", - "default": "" + "line": 149 }, { "name": "start", "type": "int", - "default": "" + "line": 150 }, { "name": "end", "type": "int", - "default": "" + "line": 151 } ], - "line": 148, - "doc": "" + "line": 148 }, { "name": "RuleTestResponse", @@ -10277,115 +9308,109 @@ { "name": "rule_id", "type": "uuid.UUID", - "default": "" + "line": 155 }, { "name": "rule_type", "type": "str", - "default": "" + "line": 156 }, { "name": "matched", "type": "bool", - "default": "" + "line": 157 }, { "name": "matches", "type": "list[RuleTestMatch]", - "default": "" + "line": 158 } ], - "line": 154, - "doc": "" + "line": 154 } ], "configuration": [] }, { - "source": "installed-owned-source/app/ingestion/__init__.py", - "sha256": "b9960370edcad325db1bbc1a812416b99100a86c1db220b67a69e46f503ec5ad", + "source": "backend/townlight_records/ingestion/__init__.py", + "sha256": "9c3fae7acafa2a6bf5606c309e174f71843ecd5ab7664fff292c26f821a73ff9", + "bytes": 279, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/ingestion/cron_utils.py", - "sha256": "63ca640af21a0a25da5e49ff745ffecb800dd18f4dd9e4ba886b123855334876", + "source": "backend/townlight_records/ingestion/cron_utils.py", + "sha256": "88fbff0706981ef7cf13a653e5e4589062f2f24e043a570f3c6edf37fabcbfcf", + "bytes": 342, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/ingestion/scheduler.py", - "sha256": "cf90a00bb1eafc4e3327499461afbab3bc2202a726b5871551fc8a5c1638e734", + "source": "backend/townlight_records/ingestion/scheduler.py", + "sha256": "3520c77698a46e84c731f486f0173c4158405f5bce73ce8f58c2ae6d759783d0", + "bytes": 9379, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/ingestion/sync_runner.py", - "sha256": "0cab2a9f8b4caf7f199796d9c748fc165a04ec95f6181960ef84f74956fb9488", + "source": "backend/townlight_records/ingestion/sync_runner.py", + "sha256": "7c987cafa060cfc2b1071c5a9ba2bc27fe3b567be8a03280490de0ca3c02228c", + "bytes": 10324, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/ingestion/tasks.py", - "sha256": "fb9dabc97a0ea8d8ddbceec5a2a98ef5cdbafb92eee41ecb702b4cb7860bddd9", + "source": "backend/townlight_records/ingestion/tasks.py", + "sha256": "14e604c42d3c04490750b8fe2b2e3947328683af8de7dc7e7cfdbbbcd547e5d4", + "bytes": 9094, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/llm/__init__.py", - "sha256": "0411eee4d07aefa5002fbec9e0d426ee45fd2f9e589b56803b1668f6493d51e5", + "source": "backend/townlight_records/llm/__init__.py", + "sha256": "3fd0a698f594b821b7cc3fbb267513521ec3dfcc026ec89add8a6d5072aea8d3", + "bytes": 3626, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/llm/client.py", - "sha256": "8504ba9c8ee46c902b4a6d9004dccce92f66f20b388c8a55484bb8324169ded1", + "source": "backend/townlight_records/llm/client.py", + "sha256": "99a211bbbb594681364b9941ca9adb2fc54ceaaaf3f210f63a62d1108187378e", + "bytes": 4660, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/llm/context_manager.py", - "sha256": "aec2aac65a8e04a4a754ff44a6c4b37afdbf46a24156d5092c98f57aea436cc0", + "source": "backend/townlight_records/llm/context_manager.py", + "sha256": "0353251e35fe1ffc3ce372db9086effca688e684a39fd04b7a33a3ecb459d058", + "bytes": 2705, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/main.py", - "sha256": "abb959c23054e8fdd12fb4918ea6c1149ef3cc7b1fee268697baf36f07af9fc2", + "source": "backend/townlight_records/main.py", + "sha256": "ab9eaeb2e79b64a37f8ff54315fe53a08c7be8be29ad1398b535a184688600d3", + "bytes": 11777, "routes": [ { "method": "GET", - "path": "/config/portal-mode", - "router": "app", - "prefix_resolved": true, - "name": "get_portal_mode", - "signature": "", - "returns": "PortalModeResponse", - "line": 210, - "doc": "", - "decorator": "app.get('/config/portal-mode', tags=['public'], response_model=PortalModeResponse, summary=\"Get the deployment's current portal posture.\")", - "errors": [] + "declared_path": "/config/portal-mode", + "function": "get_portal_mode", + "line": 210 }, { "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "health", - "signature": "", - "returns": "", - "line": 266, - "doc": "", - "decorator": "app.get('/health')", - "errors": [] + "declared_path": "/health", + "function": "health", + "line": 266 } ], "models": [ @@ -10398,25 +9423,26 @@ { "name": "mode", "type": "Literal['public', 'private']", - "default": "Field(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.')" + "line": 25 } ], - "line": 17, - "doc": "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." + "line": 17 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/__init__.py", - "sha256": "85380f990a3bf800137f3e67775ba042f57a8a6b54d304845f43e1cb2a0b80c5", + "source": "backend/townlight_records/models/__init__.py", + "sha256": "14747da85c6ac8c0648b8bae81ba4369d13875757a40e721fb5215a3fa9b6027", + "bytes": 2908, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/models/audit.py", - "sha256": "df56686024ce0b50fc6ffe0fe20d4775314cd3bd60302ae85d8b9f860ca053bb", + "source": "backend/townlight_records/models/audit.py", + "sha256": "9e489ecadf8d3c4635f177350a7d4a7407542b92fea08360fb811c9616d5b663", + "bytes": 1260, "routes": [], "models": [ { @@ -10428,63 +9454,63 @@ { "name": "id", "type": "Mapped[int]", - "default": "mapped_column(primary_key=True, autoincrement=True)" + "line": 14 }, { "name": "prev_hash", "type": "Mapped[str]", - "default": "mapped_column(String(64), default='0' * 64)" + "line": 15 }, { "name": "entry_hash", "type": "Mapped[str]", - "default": "mapped_column(String(64), index=True)" + "line": 16 }, { "name": "timestamp", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now(), index=True)" + "line": 17 }, { "name": "user_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(UUID(as_uuid=True), nullable=True, index=True)" + "line": 20 }, { "name": "action", "type": "Mapped[str]", - "default": "mapped_column(String(100), index=True)" + "line": 23 }, { "name": "resource_type", "type": "Mapped[str]", - "default": "mapped_column(String(100), index=True)" + "line": 24 }, { "name": "resource_id", "type": "Mapped[str | None]", - "default": "mapped_column(String(255), nullable=True)" + "line": 25 }, { "name": "details", "type": "Mapped[dict | None]", - "default": "mapped_column(JSONB, nullable=True)" + "line": 26 }, { "name": "ai_generated", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=False)" + "line": 27 } ], - "line": 11, - "doc": "" + "line": 11 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/city_profile.py", - "sha256": "cc91186429d3a0afe01cd36ec8dd97bda3aa99e6297d25aeeae81fafcc31fe04", + "source": "backend/townlight_records/models/city_profile.py", + "sha256": "a5a82b73398205fd303c2430fa31b9f5f67b21bc47f47f3a710618cbe6735b27", + "bytes": 1760, "routes": [], "models": [ { @@ -10496,83 +9522,83 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 12 }, { "name": "city_name", "type": "Mapped[str]", - "default": "mapped_column(String(200))" + "line": 13 }, { "name": "state", "type": "Mapped[str | None]", - "default": "mapped_column(String(2))" + "line": 17 }, { "name": "county", "type": "Mapped[str | None]", - "default": "mapped_column(String(200))" + "line": 18 }, { "name": "population_band", "type": "Mapped[str | None]", - "default": "mapped_column(String(50))" + "line": 19 }, { "name": "email_platform", "type": "Mapped[str | None]", - "default": "mapped_column(String(50))" + "line": 20 }, { "name": "has_dedicated_it", "type": "Mapped[bool | None]", - "default": "mapped_column(Boolean)" + "line": 21 }, { "name": "monthly_request_volume", "type": "Mapped[str | None]", - "default": "mapped_column(String(20))" + "line": 22 }, { "name": "onboarding_status", "type": "Mapped[str]", - "default": "mapped_column(String(20), default='not_started')" + "line": 23 }, { "name": "profile_data", "type": "Mapped[dict]", - "default": "mapped_column(JSONB, default=dict)" + "line": 26 }, { "name": "gap_map", "type": "Mapped[dict]", - "default": "mapped_column(JSONB, default=dict)" + "line": 27 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 28 }, { "name": "updated_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())" + "line": 31 }, { "name": "updated_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 34 } ], - "line": 9, - "doc": "" + "line": 9 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/connectors.py", - "sha256": "bd21d54690bdd9298d218ac973f29a2f14e2a4e59898784208d8f714ed33b032", + "source": "backend/townlight_records/models/connectors.py", + "sha256": "d5529083fbe39c77830dcda2cdcdeda0bb655cf447d6a4df9c8dd457a0b4fd26", + "bytes": 2136, "routes": [], "models": [ { @@ -10584,71 +9610,70 @@ { "name": "id", "type": "Mapped[int]", - "default": "mapped_column(Integer, primary_key=True, autoincrement=True)" + "line": 11 }, { "name": "domain", "type": "Mapped[str]", - "default": "mapped_column(String(100))" + "line": 12 }, { "name": "function", "type": "Mapped[str]", - "default": "mapped_column(String(200))" + "line": 13 }, { "name": "vendor_name", "type": "Mapped[str]", - "default": "mapped_column(String(200))" + "line": 14 }, { "name": "vendor_version", "type": "Mapped[str | None]", - "default": "mapped_column(String(50))" + "line": 15 }, { "name": "access_protocol", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 16 }, { "name": "data_shape", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 17 }, { "name": "common_record_types", "type": "Mapped[dict]", - "default": "mapped_column(JSONB, default=list)" + "line": 18 }, { "name": "redaction_tier", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=1)" + "line": 19 }, { "name": "discovery_hints", "type": "Mapped[dict]", - "default": "mapped_column(JSONB, default=dict)" + "line": 20 }, { "name": "connector_template_id", "type": "Mapped[int | None]", - "default": "mapped_column(Integer)" + "line": 21 }, { "name": "catalog_version", "type": "Mapped[str]", - "default": "mapped_column(String(20))" + "line": 22 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 23 } ], - "line": 8, - "doc": "" + "line": 8 }, { "name": "ConnectorTemplate", @@ -10659,68 +9684,68 @@ { "name": "id", "type": "Mapped[int]", - "default": "mapped_column(Integer, primary_key=True, autoincrement=True)" + "line": 31 }, { "name": "vendor_name", "type": "Mapped[str]", - "default": "mapped_column(String(200))" + "line": 32 }, { "name": "protocol", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 33 }, { "name": "auth_method", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 34 }, { "name": "config_schema", "type": "Mapped[dict]", - "default": "mapped_column(JSONB, default=dict)" + "line": 36 }, { "name": "default_sync_schedule", "type": "Mapped[str | None]", - "default": "mapped_column(String(50))" + "line": 37 }, { "name": "default_rate_limit", "type": "Mapped[int | None]", - "default": "mapped_column(Integer)" + "line": 38 }, { "name": "redaction_tier", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=1)" + "line": 39 }, { "name": "setup_instructions", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 40 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 41 }, { "name": "catalog_version", "type": "Mapped[str]", - "default": "mapped_column(String(20))" + "line": 44 } ], - "line": 28, - "doc": "" + "line": 28 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/departments.py", - "sha256": "95df980295f111a89ec3197370eb7ebe5a67881871a9016ce9bee7a2741ed173", + "source": "backend/townlight_records/models/departments.py", + "sha256": "38c905bcca9df892e9d0aeb1e1e7d89789a49449a741a3df071679d7c5b18ff6", + "bytes": 638, "routes": [], "models": [ { @@ -10732,38 +9757,38 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 11 }, { "name": "name", "type": "Mapped[str]", - "default": "mapped_column(String(200))" + "line": 12 }, { "name": "code", "type": "Mapped[str]", - "default": "mapped_column(String(20), unique=True)" + "line": 13 }, { "name": "contact_email", "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" + "line": 14 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 15 } ], - "line": 8, - "doc": "" + "line": 8 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/document.py", - "sha256": "bcde5a7d50bc74ef2bb6d078e210366ca78b2c2ae9cc072ff72c6f727d9c78a7", + "source": "backend/townlight_records/models/document.py", + "sha256": "5c3594b8d9b9e6a7124e9dd4cc7c03f5786110608acf6945680efbf49c6e829a", + "bytes": 7997, "routes": [], "models": [ { @@ -10775,131 +9800,130 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 75 }, { "name": "name", "type": "Mapped[str]", - "default": "mapped_column(String(255), unique=True)" + "line": 76 }, { "name": "source_type", "type": "Mapped[SourceType]", - "default": "mapped_column(Enum(SourceType, name='source_type', create_type=False, values_callable=lambda e: [m.value for m in e]))" + "line": 77 }, { "name": "connection_config", "type": "Mapped[dict]", - "default": "mapped_column(EncryptedJSONB, default=dict)" + "line": 83 }, { "name": "is_active", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=True)" + "line": 84 }, { "name": "created_by", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + "line": 85 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 86 }, { "name": "last_ingestion_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 87 }, { "name": "discovered_source_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(nullable=True)" + "line": 90 }, { "name": "connector_template_id", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 91 }, { "name": "sync_schedule", "type": "Mapped[str | None]", - "default": "mapped_column(String(50), nullable=True)" + "line": 92 }, { "name": "schedule_enabled", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=True, server_default='true')" + "line": 93 }, { "name": "last_sync_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 94 }, { "name": "last_sync_cursor", "type": "Mapped[str | None]", - "default": "mapped_column(String, nullable=True)" + "line": 95 }, { "name": "last_sync_status", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 96 }, { "name": "consecutive_failure_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0, server_default='0')" + "line": 98 }, { "name": "last_error_message", "type": "Mapped[str | None]", - "default": "mapped_column(String(500), nullable=True)" + "line": 99 }, { "name": "last_error_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 100 }, { "name": "sync_paused", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=False, server_default='false')" + "line": 101 }, { "name": "sync_paused_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 102 }, { "name": "sync_paused_reason", "type": "Mapped[str | None]", - "default": "mapped_column(String(200), nullable=True)" + "line": 103 }, { "name": "retry_batch_size", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 104 }, { "name": "retry_time_limit_seconds", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 105 }, { "name": "health_status", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 106 }, { "name": "schema_hash", "type": "Mapped[str | None]", - "default": "mapped_column(String(64), nullable=True)" + "line": 107 } ], - "line": 72, - "doc": "" + "line": 72 }, { "name": "Document", @@ -10910,101 +9934,100 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 113 }, { "name": "source_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('data_sources.id'), index=True)" + "line": 114 }, { "name": "source_path", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 115 }, { "name": "filename", "type": "Mapped[str]", - "default": "mapped_column(String(500))" + "line": 116 }, { "name": "file_type", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 117 }, { "name": "file_hash", "type": "Mapped[str]", - "default": "mapped_column(String(64), index=True)" + "line": 118 }, { "name": "file_size", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 119 }, { "name": "ingestion_status", "type": "Mapped[IngestionStatus]", - "default": "mapped_column(Enum(IngestionStatus, name='ingestion_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=IngestionStatus.PENDING)" + "line": 120 }, { "name": "ingestion_error", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 121 }, { "name": "chunk_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 122 }, { "name": "ingested_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 123 }, { "name": "metadata_", "type": "Mapped[dict | None]", - "default": "mapped_column('metadata', JSONB, nullable=True)" + "line": 124 }, { "name": "connector_type", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 127 }, { "name": "updated_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 128 }, { "name": "display_name", "type": "Mapped[str | None]", - "default": "mapped_column(String(500), nullable=True)" + "line": 131 }, { "name": "department_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(nullable=True)" + "line": 132 }, { "name": "redaction_status", "type": "Mapped[str]", - "default": "mapped_column(String(20), server_default='none')" + "line": 133 }, { "name": "derivative_path", "type": "Mapped[str | None]", - "default": "mapped_column(String(1000), nullable=True)" + "line": 134 }, { "name": "original_locked", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, server_default='false')" + "line": 135 } ], - "line": 110, - "doc": "" + "line": 110 }, { "name": "DocumentChunk", @@ -11015,48 +10038,48 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 143 }, { "name": "document_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('documents.id', ondelete='CASCADE'), index=True)" + "line": 144 }, { "name": "chunk_index", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 145 }, { "name": "content_text", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 146 }, { "name": "embedding", "type": "Mapped[list | None]", - "default": "mapped_column(Vector(768), nullable=True)" + "line": 147 }, { "name": "token_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 148 }, { "name": "page_number", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 149 } ], - "line": 140, - "doc": "" + "line": 140 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/exemption.py", - "sha256": "19c6c9f126eb03fd77139619f1e2a6c6af89d67af7e90d2139644dc909e9f7e3", + "source": "backend/townlight_records/models/exemption.py", + "sha256": "754ec1c88d23535bb2ed6538d3d42e3062fc9e81d69e2b63edebaf3debad3c5c", + "bytes": 3812, "routes": [], "models": [ { @@ -11068,56 +10091,55 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 28 }, { "name": "state_code", "type": "Mapped[str]", - "default": "mapped_column(String(2), index=True)" + "line": 29 }, { "name": "category", "type": "Mapped[str]", - "default": "mapped_column(String(100), index=True)" + "line": 30 }, { "name": "rule_type", "type": "Mapped[RuleType]", - "default": "mapped_column(Enum(RuleType, name='rule_type', create_type=False, values_callable=lambda e: [m.value for m in e]))" + "line": 31 }, { "name": "rule_definition", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 34 }, { "name": "description", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 35 }, { "name": "enabled", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=True)" + "line": 36 }, { "name": "version", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=1)" + "line": 37 }, { "name": "created_by", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + "line": 38 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 39 } ], - "line": 25, - "doc": "" + "line": 25 }, { "name": "ExemptionFlag", @@ -11128,86 +10150,85 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 45 }, { "name": "chunk_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('document_chunks.id'), index=True)" + "line": 46 }, { "name": "rule_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('exemption_rules.id'), nullable=True, index=True)" + "line": 47 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('records_requests.id'), index=True)" + "line": 48 }, { "name": "category", "type": "Mapped[str]", - "default": "mapped_column(String(100))" + "line": 49 }, { "name": "matched_text", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 50 }, { "name": "confidence", "type": "Mapped[float]", - "default": "mapped_column(Float, default=1.0)" + "line": 51 }, { "name": "status", "type": "Mapped[FlagStatus]", - "default": "mapped_column(Enum(FlagStatus, name='flag_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=FlagStatus.FLAGGED)" + "line": 52 }, { "name": "reviewed_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=True)" + "line": 56 }, { "name": "reviewed_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 57 }, { "name": "review_reason", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 58 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 59 }, { "name": "review_note", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 62 }, { "name": "detection_tier", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 63 }, { "name": "detection_method", "type": "Mapped[str | None]", - "default": "mapped_column(String(50), nullable=True)" + "line": 64 }, { "name": "auto_detected", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, server_default='false')" + "line": 65 } ], - "line": 42, - "doc": "" + "line": 42 }, { "name": "DisclosureTemplate", @@ -11218,48 +10239,48 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 71 }, { "name": "template_type", "type": "Mapped[str]", - "default": "mapped_column(String(100))" + "line": 72 }, { "name": "state_code", "type": "Mapped[str | None]", - "default": "mapped_column(String(2), nullable=True)" + "line": 73 }, { "name": "content", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 74 }, { "name": "version", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=1)" + "line": 75 }, { "name": "updated_by", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + "line": 76 }, { "name": "updated_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 77 } ], - "line": 68, - "doc": "" + "line": 68 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/fees.py", - "sha256": "8b6cc691265769ccd53ba6376b96c584c0a9d2bb6e55fe79a276ea1265ed2a7d", + "source": "backend/townlight_records/models/fees.py", + "sha256": "25eeff4b1e8180fdf218dc3382fefea2b141f851c2b9fdd84f01157079c795c2", + "bytes": 3103, "routes": [], "models": [ { @@ -11271,46 +10292,45 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 11 }, { "name": "jurisdiction", "type": "Mapped[str]", - "default": "mapped_column(String(100))" + "line": 12 }, { "name": "fee_type", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 13 }, { "name": "amount", "type": "Mapped[float]", - "default": "mapped_column(Numeric(10, 2))" + "line": 14 }, { "name": "description", "type": "Mapped[str | None]", - "default": "mapped_column(String(500))" + "line": 15 }, { "name": "effective_date", "type": "Mapped[date]", - "default": "mapped_column(Date)" + "line": 16 }, { "name": "created_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 17 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 20 } ], - "line": 8, - "doc": "" + "line": 8 }, { "name": "FeeWaiver", @@ -11321,56 +10341,55 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 28 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'))" + "line": 29 }, { "name": "waiver_type", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 32 }, { "name": "reason", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 33 }, { "name": "status", "type": "Mapped[str]", - "default": "mapped_column(String(20), default='pending')" + "line": 34 }, { "name": "requested_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 35 }, { "name": "reviewed_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'), nullable=True)" + "line": 38 }, { "name": "review_notes", "type": "Mapped[str | None]", - "default": "mapped_column(String(2000), nullable=True)" + "line": 41 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 42 }, { "name": "reviewed_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 45 } ], - "line": 25, - "doc": "" + "line": 25 }, { "name": "FeeLineItem", @@ -11381,73 +10400,73 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 53 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'))" + "line": 54 }, { "name": "fee_schedule_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('fee_schedules.id', ondelete='SET NULL'))" + "line": 57 }, { "name": "description", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 60 }, { "name": "quantity", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=1)" + "line": 61 }, { "name": "unit_price", "type": "Mapped[float]", - "default": "mapped_column(Numeric(21, 2))" + "line": 62 }, { "name": "total", "type": "Mapped[float]", - "default": "mapped_column(Numeric(21, 2))" + "line": 63 }, { "name": "status", "type": "Mapped[str]", - "default": "mapped_column(String(20), default='estimated')" + "line": 64 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 65 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 68 }, { "name": "position", "type": "Mapped[int | None]", - "default": "mapped_column(Integer)" + "line": 69 }, { "name": "schedule_basis", "type": "Mapped[str]", - "default": "mapped_column(Text, server_default='')" + "line": 70 } ], - "line": 50, - "doc": "" + "line": 50 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/notifications.py", - "sha256": "f42e1facfadb8d4538b89f85a213142efc18e17be2bde95ac665b94d5704ad8c", + "source": "backend/townlight_records/models/notifications.py", + "sha256": "12ca15c1d16e951ad550f8a2f57e196ea122e65f80e6ffa51622e4aec25910f1", + "bytes": 2140, "routes": [], "models": [ { @@ -11459,46 +10478,45 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 11 }, { "name": "event_type", "type": "Mapped[str]", - "default": "mapped_column(String(50), unique=True)" + "line": 12 }, { "name": "channel", "type": "Mapped[str]", - "default": "mapped_column(String(20))" + "line": 13 }, { "name": "subject_template", "type": "Mapped[str]", - "default": "mapped_column(String(500))" + "line": 14 }, { "name": "body_template", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 15 }, { "name": "is_active", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=True)" + "line": 16 }, { "name": "created_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 17 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 20 } ], - "line": 8, - "doc": "" + "line": 8 }, { "name": "NotificationLog", @@ -11509,83 +10527,83 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 28 }, { "name": "template_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('notification_templates.id', ondelete='SET NULL'))" + "line": 29 }, { "name": "recipient_email", "type": "Mapped[str]", - "default": "mapped_column(String(255))" + "line": 32 }, { "name": "request_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='SET NULL'))" + "line": 33 }, { "name": "channel", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 36 }, { "name": "subject", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 37 }, { "name": "body", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 38 }, { "name": "status", "type": "Mapped[str]", - "default": "mapped_column(String(20), default='queued')" + "line": 39 }, { "name": "sent_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True))" + "line": 40 }, { "name": "error_message", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 41 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 42 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 45 }, { "name": "module_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 46 }, { "name": "audience", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 47 } ], - "line": 25, - "doc": "" + "line": 25 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/records_artifacts.py", - "sha256": "bb3c7d9b5e796686c3731db8577009d00378a14feec56f8d46360bd8660d3130", + "source": "backend/townlight_records/models/records_artifacts.py", + "sha256": "b1a5d007e9631a552859eae35eee34680a7366be8c2b96cca1e78c2c163feed8", + "bytes": 2142, "routes": [], "models": [ { @@ -11597,96 +10615,95 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 11 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id'), index=True)" + "line": 12 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 13 }, { "name": "position", "type": "Mapped[int | None]", - "default": "mapped_column(Integer)" + "line": 14 }, { "name": "kind", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 15 }, { "name": "content", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 16 }, { "name": "sha256", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 17 }, { "name": "response_sha256", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 18 }, { "name": "export_path", "type": "Mapped[str | None]", - "default": "mapped_column(Text, unique=True)" + "line": 19 }, { "name": "actor_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('users.id'))" + "line": 20 }, { "name": "document_count", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 21 }, { "name": "release_artifact_count", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 22 }, { "name": "search_session_count", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 23 }, { "name": "release_count", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 24 }, { "name": "redacted_count", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 25 }, { "name": "exempt_count", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 26 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 27 }, { "name": "completed_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True))" + "line": 28 } ], - "line": 9, - "doc": "" + "line": 9 }, { "name": "RequestPublication", @@ -11697,48 +10714,48 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 33 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id'), index=True)" + "line": 34 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 35 }, { "name": "payload", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 36 }, { "name": "payload_hash", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 37 }, { "name": "actor_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('users.id'))" + "line": 38 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 39 } ], - "line": 31, - "doc": "" + "line": 31 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/records_evidence.py", - "sha256": "acadc29d3b93a2432c2c752b05f9c61e649c7d94fe29948b8dab4c46ffd421dd", + "source": "backend/townlight_records/models/records_evidence.py", + "sha256": "19b70c91e104240516583c37143e7926d66d891214e321eb57b9831a8a92435b", + "bytes": 2430, "routes": [], "models": [ { @@ -11750,41 +10767,40 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 23 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + "line": 24 }, { "name": "kind", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 27 }, { "name": "position", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 28 }, { "name": "content", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 29 }, { "name": "actor_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 30 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 31 } ], - "line": 16, - "doc": "" + "line": 16 }, { "name": "RequestExemptionDecision", @@ -11795,78 +10811,78 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 40 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + "line": 41 }, { "name": "flag_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('exemption_flags.id'))" + "line": 44 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 45 }, { "name": "position", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 46 }, { "name": "source", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 47 }, { "name": "kind", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 48 }, { "name": "finding", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 49 }, { "name": "decision", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 50 }, { "name": "basis", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 51 }, { "name": "reviewer_label", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 52 }, { "name": "actor_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 53 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 54 } ], - "line": 34, - "doc": "" + "line": 34 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/records_files.py", - "sha256": "8bceb23febbb492b13035ea12a9219d32741d397668d920a52b31f0e323b15f7", + "source": "backend/townlight_records/models/records_files.py", + "sha256": "f09db07cce4a4bc8223c9e6dbedcf7dd5c6fc6a0aefe4b9db6468ece30310253", + "bytes": 2003, "routes": [], "models": [ { @@ -11878,51 +10894,50 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('request_documents.id'), primary_key=True)" + "line": 15 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id'), index=True)" + "line": 16 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 17 }, { "name": "position", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 18 }, { "name": "title", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 19 }, { "name": "original_path", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 20 }, { "name": "citation", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 21 }, { "name": "added_by", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 22 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 23 } ], - "line": 12, - "doc": "" + "line": 12 }, { "name": "RequestReleaseCopy", @@ -11933,83 +10948,83 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 29 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id'), index=True)" + "line": 30 }, { "name": "attachment_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('request_file_evidence.id'), index=True)" + "line": 31 }, { "name": "original_path", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 32 }, { "name": "stored_path", "type": "Mapped[str]", - "default": "mapped_column(Text, unique=True)" + "line": 33 }, { "name": "file_name", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 34 }, { "name": "sha256", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 35 }, { "name": "size_bytes", "type": "Mapped[int]", - "default": "mapped_column(BigInteger)" + "line": 36 }, { "name": "status", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 37 }, { "name": "note", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 38 }, { "name": "added_by", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 39 }, { "name": "actor_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('users.id'))" + "line": 40 }, { "name": "position", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 41 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 42 } ], - "line": 26, - "doc": "" + "line": 26 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/request.py", - "sha256": "f88185889b139ac38de9a0d77449db246b22fef58f1743d25c7d2116c718ae76", + "source": "backend/townlight_records/models/request.py", + "sha256": "928047bcbe719cbe6e007b7bd77c30325b467a3bc5d46aec367dac0b40b41653", + "bytes": 5826, "routes": [], "models": [ { @@ -12021,186 +11036,185 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 34 }, { "name": "requester_name", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 35 }, { "name": "requester_email", "type": "Mapped[str | None]", - "default": "mapped_column(String(320), nullable=True)" + "line": 36 }, { "name": "date_received", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 37 }, { "name": "statutory_deadline", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 38 }, { "name": "description", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 39 }, { "name": "status", "type": "Mapped[RequestStatus]", - "default": "mapped_column(Enum(RequestStatus, name='request_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=RequestStatus.RECEIVED)" + "line": 40 }, { "name": "assigned_to", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=True)" + "line": 44 }, { "name": "created_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + "line": 45 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 46 }, { "name": "response_draft", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 47 }, { "name": "review_notes", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 48 }, { "name": "requester_phone", "type": "Mapped[str | None]", - "default": "mapped_column(String(50), nullable=True)" + "line": 51 }, { "name": "requester_type", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 52 }, { "name": "scope_assessment", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 53 }, { "name": "department_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(nullable=True)" + "line": 54 }, { "name": "estimated_fee", "type": "Mapped[float | None]", - "default": "mapped_column(Numeric(21, 2), nullable=True)" + "line": 55 }, { "name": "fee_status", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 56 }, { "name": "fee_waiver_requested", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, server_default='false')" + "line": 57 }, { "name": "priority", "type": "Mapped[str]", - "default": "mapped_column(String(20), server_default='normal')" + "line": 58 }, { "name": "closed_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 59 }, { "name": "closure_reason", "type": "Mapped[str | None]", - "default": "mapped_column(String(500), nullable=True)" + "line": 60 }, { "name": "desktop_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text, unique=True, nullable=True)" + "line": 64 }, { "name": "public_tracking_number", "type": "Mapped[str | None]", - "default": "mapped_column(Text, unique=True, nullable=True)" + "line": 65 }, { "name": "requester_contact", "type": "Mapped[str]", - "default": "mapped_column(Text, server_default='')" + "line": 66 }, { "name": "submitted_via", "type": "Mapped[str]", - "default": "mapped_column(Text, server_default='')" + "line": 67 }, { "name": "deadline_label", "type": "Mapped[str]", - "default": "mapped_column(Text, server_default='')" + "line": 68 }, { "name": "deadline_basis", "type": "Mapped[str]", - "default": "mapped_column(Text, server_default='')" + "line": 69 }, { "name": "deadline_reviewed_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True))" + "line": 70 }, { "name": "display_status", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 71 }, { "name": "assigned_label", "type": "Mapped[str]", - "default": "mapped_column(Text, server_default='')" + "line": 72 }, { "name": "fee_estimate_text", "type": "Mapped[str]", - "default": "mapped_column(Text, server_default='')" + "line": 73 }, { "name": "fee_waiver_reason", "type": "Mapped[str]", - "default": "mapped_column(Text, server_default='')" + "line": 74 }, { "name": "approved_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True))" + "line": 75 }, { "name": "approved_response_sha256", "type": "Mapped[str | None]", - "default": "mapped_column(String(64))" + "line": 76 }, { "name": "fulfilled_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True))" + "line": 77 } ], - "line": 31, - "doc": "" + "line": 31 }, { "name": "RequestDocument", @@ -12211,46 +11225,45 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 83 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('records_requests.id'), index=True)" + "line": 84 }, { "name": "document_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('documents.id'), index=True)" + "line": 85 }, { "name": "relevance_note", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 86 }, { "name": "exemption_flags", "type": "Mapped[dict | None]", - "default": "mapped_column(JSONB, nullable=True)" + "line": 87 }, { "name": "inclusion_status", "type": "Mapped[InclusionStatus]", - "default": "mapped_column(Enum(InclusionStatus, name='inclusion_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=InclusionStatus.PENDING)" + "line": 88 }, { "name": "attached_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 92 }, { "name": "attached_by", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + "line": 93 } ], - "line": 80, - "doc": "" + "line": 80 }, { "name": "DocumentCache", @@ -12261,43 +11274,43 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 99 }, { "name": "document_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('documents.id'), index=True)" + "line": 100 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('records_requests.id'), index=True)" + "line": 101 }, { "name": "cached_file_path", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 102 }, { "name": "file_size", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 103 }, { "name": "cached_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 104 } ], - "line": 96, - "doc": "" + "line": 96 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/request_workflow.py", - "sha256": "cc297a448c7f2de9ef1e31d7d94d24494efeeac7165f1d466e94aecfb7807b64", + "source": "backend/townlight_records/models/request_workflow.py", + "sha256": "77d4ac696507834c2e2bbc73c025a48988af29189930072c7d3a4240574df6f4", + "bytes": 4059, "routes": [], "models": [ { @@ -12309,61 +11322,60 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 11 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + "line": 12 }, { "name": "event_type", "type": "Mapped[str]", - "default": "mapped_column(String(50))" + "line": 15 }, { "name": "actor_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 20 }, { "name": "actor_role", "type": "Mapped[str | None]", - "default": "mapped_column(String(50))" + "line": 23 }, { "name": "description", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 24 }, { "name": "internal_note", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 25 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 26 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 29 }, { "name": "actor_label", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 30 }, { "name": "position", "type": "Mapped[int | None]", - "default": "mapped_column(Integer)" + "line": 31 } ], - "line": 8, - "doc": "" + "line": 8 }, { "name": "RequestPublicStatus", @@ -12374,46 +11386,45 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 37 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + "line": 38 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 41 }, { "name": "label", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 42 }, { "name": "summary", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 43 }, { "name": "status", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 44 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 45 }, { "name": "position", "type": "Mapped[int | None]", - "default": "mapped_column(Integer)" + "line": 48 } ], - "line": 34, - "doc": "" + "line": 34 }, { "name": "RequestMessage", @@ -12424,56 +11435,55 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 54 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + "line": 55 }, { "name": "sender_type", "type": "Mapped[str]", - "default": "mapped_column(String(20))" + "line": 58 }, { "name": "sender_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 59 }, { "name": "message_text", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 62 }, { "name": "is_internal", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, default=False)" + "line": 63 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 64 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 67 }, { "name": "sender_label", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 68 }, { "name": "position", "type": "Mapped[int | None]", - "default": "mapped_column(Integer)" + "line": 69 } ], - "line": 51, - "doc": "" + "line": 51 }, { "name": "ResponseLetter", @@ -12484,63 +11494,63 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + "line": 75 }, { "name": "request_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + "line": 76 }, { "name": "template_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('disclosure_templates.id', ondelete='SET NULL'))" + "line": 79 }, { "name": "generated_content", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 82 }, { "name": "edited_content", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 83 }, { "name": "status", "type": "Mapped[str]", - "default": "mapped_column(String(20), default='draft')" + "line": 84 }, { "name": "generated_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 85 }, { "name": "approved_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + "line": 88 }, { "name": "sent_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True))" + "line": 91 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 92 } ], - "line": 72, - "doc": "" + "line": 72 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/search.py", - "sha256": "e1f7499d2042fcae621e817878b1cf12bd53e5b55ebbaae33d8c24e29de275c9", + "source": "backend/townlight_records/models/search.py", + "sha256": "64caa51b723290050a78027fd5de3667d214cc24dce5f3dc250f9a3ce4588bf6", + "bytes": 2764, "routes": [], "models": [ { @@ -12552,21 +11562,20 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 14 }, { "name": "user_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'), index=True)" + "line": 15 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 16 } ], - "line": 11, - "doc": "" + "line": 11 }, { "name": "SearchQuery", @@ -12577,66 +11586,65 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 22 }, { "name": "session_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('search_sessions.id'), index=True)" + "line": 23 }, { "name": "query_text", "type": "Mapped[str]", - "default": "mapped_column(Text)" + "line": 24 }, { "name": "filters", "type": "Mapped[dict | None]", - "default": "mapped_column(JSONB, nullable=True)" + "line": 25 }, { "name": "results_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 26 }, { "name": "synthesized_answer", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 27 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 28 }, { "name": "request_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('records_requests.id'), index=True)" + "line": 29 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 32 }, { "name": "position", "type": "Mapped[int | None]", - "default": "mapped_column(Integer)" + "line": 33 }, { "name": "locations", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 34 }, { "name": "reviewer_label", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 35 } ], - "line": 19, - "doc": "" + "line": 19 }, { "name": "SearchResult", @@ -12647,68 +11655,68 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 41 }, { "name": "query_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('search_queries.id'), index=True)" + "line": 42 }, { "name": "chunk_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('document_chunks.id'), index=True)" + "line": 45 }, { "name": "similarity_score", "type": "Mapped[float | None]", - "default": "mapped_column(Float)" + "line": 46 }, { "name": "rank", "type": "Mapped[int]", - "default": "mapped_column(Integer)" + "line": 47 }, { "name": "normalized_score", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 50 }, { "name": "legacy_id", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 51 }, { "name": "title", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 52 }, { "name": "citation", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 53 }, { "name": "summary", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 54 }, { "name": "review_status", "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "line": 55 } ], - "line": 38, - "doc": "" + "line": 38 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/service_account.py", - "sha256": "594cbd1dfeea0bf026341f1a427f4e96a362f75c11a7cc0df7fb7e3a8363a311", + "source": "backend/townlight_records/models/service_account.py", + "sha256": "a6a9b3d1735156d13603ed3128723a1fb5985795ab6e0919c450a4e63824c3b1", + "bytes": 1074, "routes": [], "models": [ { @@ -12720,48 +11728,48 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 14 }, { "name": "name", "type": "Mapped[str]", - "default": "mapped_column(String(255), unique=True)" + "line": 17 }, { "name": "api_key_hash", "type": "Mapped[str]", - "default": "mapped_column(String(255))" + "line": 18 }, { "name": "role", "type": "Mapped[UserRole]", - "default": "mapped_column(Enum(UserRole, name='user_role', create_type=False, values_callable=lambda e: [m.value for m in e]), default=UserRole.READ_ONLY)" + "line": 19 }, { "name": "created_by", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + "line": 23 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 26 }, { "name": "is_active", "type": "Mapped[bool]", - "default": "mapped_column(default=True)" + "line": 29 } ], - "line": 11, - "doc": "" + "line": 11 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/sync_failure.py", - "sha256": "d31b87435c855f632b9b6d746eeec477d4f3811a95017401d0b1c3db4d506eb0", + "source": "backend/townlight_records/models/sync_failure.py", + "sha256": "c5feb986cc08f3fe85f780170741213efc12740cf561f174a003cf9a5eb3cbc2", + "bytes": 3057, "routes": [], "models": [ { @@ -12773,71 +11781,70 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 18 }, { "name": "source_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('data_sources.id', ondelete='CASCADE'), nullable=False)" + "line": 19 }, { "name": "source_path", "type": "Mapped[str]", - "default": "mapped_column(Text, nullable=False)" + "line": 22 }, { "name": "error_message", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 23 }, { "name": "error_class", "type": "Mapped[str | None]", - "default": "mapped_column(String(200), nullable=True)" + "line": 24 }, { "name": "http_status_code", "type": "Mapped[int | None]", - "default": "mapped_column(Integer, nullable=True)" + "line": 25 }, { "name": "retry_count", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0, nullable=False)" + "line": 26 }, { "name": "status", "type": "Mapped[str]", - "default": "mapped_column(String(20), nullable=False, default='retrying')" + "line": 27 }, { "name": "first_failed_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())" + "line": 31 }, { "name": "last_retried_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 34 }, { "name": "resolved_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 35 }, { "name": "dismissed_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 36 }, { "name": "dismissed_by", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=True)" + "line": 37 } ], - "line": 15, - "doc": "" + "line": 15 }, { "name": "SyncRunLog", @@ -12848,58 +11855,58 @@ { "name": "id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + "line": 50 }, { "name": "source_id", "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), ForeignKey('data_sources.id', ondelete='CASCADE'), nullable=False)" + "line": 51 }, { "name": "started_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())" + "line": 54 }, { "name": "finished_at", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 57 }, { "name": "status", "type": "Mapped[str | None]", - "default": "mapped_column(String(20), nullable=True)" + "line": 58 }, { "name": "records_attempted", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 59 }, { "name": "records_succeeded", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 60 }, { "name": "records_failed", "type": "Mapped[int]", - "default": "mapped_column(Integer, default=0)" + "line": 61 }, { "name": "error_summary", "type": "Mapped[str | None]", - "default": "mapped_column(Text, nullable=True)" + "line": 62 } ], - "line": 47, - "doc": "" + "line": 47 } ], "configuration": [] }, { - "source": "installed-owned-source/app/models/user.py", + "source": "backend/townlight_records/models/user.py", "sha256": "39603bc8063007391d478b52165d2ae8d4bf0c5f1a1d7f716b78ff94754b2c82", + "bytes": 1292, "routes": [], "models": [ { @@ -12912,156 +11919,122 @@ { "name": "full_name", "type": "Mapped[str]", - "default": "mapped_column(default='')" + "line": 26 }, { "name": "role", "type": "Mapped[UserRole]", - "default": "mapped_column(Enum(UserRole, name='user_role', create_type=False, values_callable=lambda e: [m.value for m in e]), default=UserRole.STAFF)" + "line": 27 }, { "name": "created_at", "type": "Mapped[datetime]", - "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + "line": 31 }, { "name": "last_login", "type": "Mapped[datetime | None]", - "default": "mapped_column(DateTime(timezone=True), nullable=True)" + "line": 34 }, { "name": "must_change_password", "type": "Mapped[bool]", - "default": "mapped_column(Boolean, nullable=False, default=False, server_default='false')" + "line": 37 }, { "name": "department_id", "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('departments.id'), nullable=True)" + "line": 42 } ], - "line": 23, - "doc": "" + "line": 23 } ], "configuration": [] }, { - "source": "installed-owned-source/app/notifications/__init__.py", + "source": "backend/townlight_records/notifications/__init__.py", "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/notifications/router.py", - "sha256": "ac77bd461ee941a84117eb93935464dc2c908ba96c3e2c613d80bd28088d5009", + "source": "backend/townlight_records/notifications/router.py", + "sha256": "adf8fb319f45c2c1bf6b9580ed3b918ca8a74f56dfd1d36d621b2de2ae4d57ea", + "bytes": 4369, "routes": [ { "method": "GET", - "path": "/notifications/templates", - "router": "router", - "prefix_resolved": false, - "name": "list_templates", - "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 22, - "doc": "List all notification templates.", - "decorator": "router.get('/notifications/templates', response_model=list[NotificationTemplateRead])", - "errors": [] + "declared_path": "/notifications/templates", + "function": "list_templates", + "line": 22 }, { "method": "POST", - "path": "/notifications/templates", - "router": "router", - "prefix_resolved": false, - "name": "create_template", - "signature": "payload: NotificationTemplateCreate, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 38, - "doc": "Create a new notification template (admin only).", - "decorator": "router.post('/notifications/templates', response_model=NotificationTemplateRead, status_code=201)", - "errors": [ - "HTTPException(status_code=409, detail=f\"Template for event_type '{payload.event_type}' already exists\")" - ] + "declared_path": "/notifications/templates", + "function": "create_template", + "line": 38 }, { "method": "PATCH", - "path": "/notifications/templates/{template_id}", - "router": "router", - "prefix_resolved": false, - "name": "update_template", - "signature": "template_id: uuid.UUID, payload: NotificationTemplateUpdate, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 83, - "doc": "Update a notification template (admin only).", - "decorator": "router.patch('/notifications/templates/{template_id}', response_model=NotificationTemplateRead)", - "errors": [ - "HTTPException(status_code=404, detail='Template not found')", - "HTTPException(status_code=400, detail='No fields to update')" - ] + "declared_path": "/notifications/templates/{template_id}", + "function": "update_template", + "line": 83 }, { "method": "GET", - "path": "/notifications/log", - "router": "router", - "prefix_resolved": false, - "name": "list_notification_log", - "signature": "limit: int=Query(default=50, le=200), request_id: uuid.UUID | None=Query(default=None), session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 116, - "doc": "List recent notification log entries.", - "decorator": "router.get('/notifications/log', response_model=list[NotificationLogRead])", - "errors": [] + "declared_path": "/notifications/log", + "function": "list_notification_log", + "line": 116 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/notifications/service.py", - "sha256": "0672a6a7a60bc09c4b1bfe29d7046f93fef36ea48b09a2ff3b898bdf66ad0965", + "source": "backend/townlight_records/notifications/service.py", + "sha256": "6c7e33ddb59503ebcd530df56efee8d26a31b4b3c1a95c0c238eff10423102e4", + "bytes": 3160, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/notifications/smtp_delivery.py", - "sha256": "4dc26331949c01537173b6bb5c91d5f4d23419e73e46d1600fe289053904e544", + "source": "backend/townlight_records/notifications/smtp_delivery.py", + "sha256": "084b7b456f9f665b67f55d3789e0427b2750c7f3b343de1be718acc0e79f4f6b", + "bytes": 3599, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/notifications/sync_notifications.py", - "sha256": "8dee67dcfacd3182afbba6a1ed874e7029a0f2a7aef5a619fcec353dc569b778", + "source": "backend/townlight_records/notifications/sync_notifications.py", + "sha256": "6bbd902f3bd5344014e3a641d082e87ed59a316f6d8c26f7981dcb7abf2ee8b0", + "bytes": 4457, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/onboarding/__init__.py", - "sha256": "410f27365a45a5cad7e8a8b23a63e6312fcc6ba18b9f3cfb8ecf782940f7fc49", + "source": "backend/townlight_records/onboarding/__init__.py", + "sha256": "fd55411077ca22c07b7f527df218bc85624000d5c3699cfa8fe341a86b125ea4", + "bytes": 112, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/onboarding/router.py", - "sha256": "fd107d538b24379eb31a08e39927eec2486df5d383c20b6f23af9adbb3299ff4", + "source": "backend/townlight_records/onboarding/router.py", + "sha256": "dedc72d16f1d1ceab430a8249bca91aca9b72bed92a63e0da4d76a48c2def1a6", + "bytes": 7179, "routes": [ { "method": "POST", - "path": "/onboarding/interview", - "router": "router", - "prefix_resolved": true, - "name": "get_next_question", - "signature": "body: InterviewRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 113, - "doc": "Generate the next onboarding question and persist the last answer.", - "decorator": "router.post('/interview', response_model=InterviewResponse)", - "errors": [] + "declared_path": "/interview", + "function": "get_next_question", + "line": 113 } ], "models": [ @@ -13074,21 +12047,20 @@ { "name": "last_answer", "type": "str | None", - "default": "None" + "line": 64 }, { "name": "last_field", "type": "str | None", - "default": "None" + "line": 65 }, { "name": "skipped_fields", "type": "list[str] | None", - "default": "None" + "line": 70 } ], - "line": 63, - "doc": "" + "line": 63 }, { "name": "InterviewResponse", @@ -13099,63 +12071,57 @@ { "name": "question", "type": "str", - "default": "" + "line": 74 }, { "name": "target_field", "type": "str | None", - "default": "" + "line": 75 }, { "name": "all_complete", "type": "bool", - "default": "" + "line": 76 }, { "name": "completed_fields", "type": "list[str]", - "default": "" + "line": 77 }, { "name": "onboarding_status", "type": "str", - "default": "" + "line": 78 }, { "name": "skipped_fields", "type": "list[str]", - "default": "" + "line": 79 } ], - "line": 73, - "doc": "" + "line": 73 } ], "configuration": [] }, { - "source": "installed-owned-source/app/public/__init__.py", - "sha256": "9b2399a19ebba72002567e091d5d5bc56a158640e121328fa89365823d0607f9", + "source": "backend/townlight_records/public/__init__.py", + "sha256": "07555697e80697fc9c90de3b9cff2b5c07dfe57210ce0aa82570f34003f11292", + "bytes": 632, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/public/router.py", - "sha256": "1b688edd6b2ed2334bd6c113c4c30e47748ce98bc12c6c70e716f81b8acc23ea", + "source": "backend/townlight_records/public/router.py", + "sha256": "127bd6046eada11ea0195f6f9c7489a16343ff55a417b8d8ecf84e511028d46f", + "bytes": 6923, "routes": [ { "method": "POST", - "path": "/requests", - "router": "router", - "prefix_resolved": false, - "name": "submit_public_request", - "signature": "body: PublicRequestSubmitBody, user: User=Depends(_require_public_role), session: AsyncSession=Depends(get_async_session)", - "returns": "PublicRequestSubmitResponse", - "line": 115, - "doc": "Create a records request on behalf of the signed-in PUBLIC user.\n\nThe request lands in :class:`RequestStatus.RECEIVED` with\n``created_by`` = the authenticated resident's id. ``requester_name``\nand ``requester_email`` are copied from the user record so staff\nreviewers see the submitter's registered identity verbatim. An audit\nlog entry is written with ``action=\"public.requests.create\"`` for\nfull traceability.", - "decorator": "router.post('/requests', response_model=PublicRequestSubmitResponse, status_code=status.HTTP_201_CREATED, summary='Submit a records request as an authenticated resident.')", - "errors": [] + "declared_path": "/requests", + "function": "submit_public_request", + "line": 115 } ], "models": [ @@ -13168,16 +12134,15 @@ { "name": "description", "type": "str", - "default": "Field(min_length=10, max_length=10000, description='Plain-language description of the records being requested. At least 10 characters; the staff reviewer reads this verbatim.')" + "line": 56 }, { "name": "phone", "type": "str | None", - "default": "Field(default=None, max_length=50, description='Optional contact phone number.')" + "line": 64 } ], - "line": 47, - "doc": "Minimal public submission payload.\n\nThe authenticated ``UserRole.PUBLIC`` user's ``full_name`` and ``email``\nare reused for ``requester_name`` / ``requester_email`` (they already\nown that identity via self-registration). Only the free-form\ndescription and optional phone are collected here." + "line": 47 }, { "name": "PublicRequestSubmitResponse", @@ -13188,452 +12153,233 @@ { "name": "request_id", "type": "uuid.UUID", - "default": "" + "line": 80 }, { "name": "status", "type": "RequestStatus", - "default": "" + "line": 81 }, { "name": "submitted_at", "type": "datetime", - "default": "" + "line": 82 }, { "name": "message", "type": "str", - "default": "" + "line": 83 } ], - "line": 71, - "doc": "What the resident sees after submitting.\n\nThe tracking id is the database UUID of the request \u2014 the resident\ncan reference it when contacting the records office. Expanded\ntrack-my-request functionality (status page, timeline view,\ndownloads) is explicitly out of T5D scope." + "line": 71 } ], "configuration": [] }, { - "source": "installed-owned-source/app/requests/__init__.py", - "sha256": "10f4a38349943e0adc86d6b60e935616b29948f77c0a1c4ea7c3ccf94b70f2e3", + "source": "backend/townlight_records/requests/__init__.py", + "sha256": "474d14c31d2bb164d90cd89a4982df6987e0c15fb8ed8f663cf112fb03332b8f", + "bytes": 104, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/requests/artifacts.py", - "sha256": "e557ecc8cfd265bfcb76b4b06de38fcaf6eb75ed3dbba6d21fe65f481bbbf8a1", + "source": "backend/townlight_records/requests/artifacts.py", + "sha256": "86793936796cb95d48b7775d2f942cca7e5cca77dde0c8d022221b41b6cf4e22", + "bytes": 12278, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/requests/deadline_check.py", - "sha256": "d5d734204bf8ef783d8d619b07df8884ab3cf2987bffcf57daa6d55a3431eb5a", + "source": "backend/townlight_records/requests/deadline_check.py", + "sha256": "6244989403cc69f8cc89686d5e8664e3c580fced03ca793704a2397e8987d332", + "bytes": 5055, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/requests/files.py", - "sha256": "f5c2703a70c076b963f1116a0779d354479c65cb734bc921a4197c72694c8eec", + "source": "backend/townlight_records/requests/files.py", + "sha256": "af54c3d331dc1dedeece351d2cd07ece06c1c6e1295bbb42315eaf4503752da5", + "bytes": 7540, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/requests/meeting_sources.py", - "sha256": "5694a2e0b345cf684261ef54cc205e5ec1aaeb0125c2c77c0c4a1cf2899feb79", + "source": "backend/townlight_records/requests/meeting_sources.py", + "sha256": "8b1122476099897bd85c0a345a2fe8ff21e1d60962c0b9fd0899956359fa76ea", + "bytes": 2609, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/requests/native_public.py", - "sha256": "0f9995ccc14fd61e49f51474fc2fcbcc52696b9102c1bd65b227fe135ea5e6cc", + "source": "backend/townlight_records/requests/native_public.py", + "sha256": "926db3331f9606977db57b36301521dd462cc5e6a5436425979734678e77ede7", + "bytes": 6497, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/requests/planning_sources.py", - "sha256": "b62831d83e129a974bec04ee10fd71cfd15c8940f5c5c4dd11794b8f51cbd8d8", + "source": "backend/townlight_records/requests/planning_sources.py", + "sha256": "4ba709347e0a34b24664d7890aaed2d6de8800d73520eba65a139700749f8dcb", + "bytes": 1920, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/requests/router.py", - "sha256": "f29526862e9e3adae5cb288a59644fa9d10f0e62fdb0e41602286d715c529199", + "source": "backend/townlight_records/requests/router.py", + "sha256": "ada18d3fcc66780a458764bf34c50d546748accd9791bd83edb5b95e4299968f", + "bytes": 48717, "routes": [ { "method": "POST", - "path": "/requests/", - "router": "router", - "prefix_resolved": true, - "name": "create_request", - "signature": "data: RequestCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 85, - "doc": "", - "decorator": "router.post('/', response_model=RequestRead, status_code=201)", - "errors": [] + "declared_path": "/", + "function": "create_request", + "line": 85 }, { "method": "GET", - "path": "/requests/", - "router": "router", - "prefix_resolved": true, - "name": "list_requests", - "signature": "status: RequestStatus | None=None, assigned_to: uuid.UUID | None=None, limit: int=50, offset: int=0, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.LIAISON))", - "returns": "", - "line": 104, - "doc": "", - "decorator": "router.get('/', response_model=list[RequestRead])", - "errors": [] + "declared_path": "/", + "function": "list_requests", + "line": 104 }, { "method": "GET", - "path": "/requests/stats", - "router": "router", - "prefix_resolved": true, - "name": "request_stats", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.LIAISON))", - "returns": "", - "line": 136, - "doc": "", - "decorator": "router.get('/stats', response_model=RequestStats)", - "errors": [] + "declared_path": "/stats", + "function": "request_stats", + "line": 136 }, { "method": "GET", - "path": "/requests/{request_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_request", - "signature": "request_id: uuid.UUID, request: Request, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.LIAISON))", - "returns": "", - "line": 189, - "doc": "", - "decorator": "router.get('/{request_id}', response_model=RequestRead)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] + "declared_path": "/{request_id}", + "function": "get_request", + "line": 189 }, { "method": "PATCH", - "path": "/requests/{request_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_request", - "signature": "request_id: uuid.UUID, data: RequestUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 211, - "doc": "", - "decorator": "router.patch('/{request_id}', response_model=RequestRead)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=400, detail=f'Cannot transition from {req.status.value} to {data.status.value}')" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/documents", - "router": "router", - "prefix_resolved": true, - "name": "attach_document", - "signature": "request_id: uuid.UUID, data: RequestDocumentAdd, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 275, - "doc": "", - "decorator": "router.post('/{request_id}/documents', response_model=RequestDocumentRead, status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=404, detail='Document not found')", - "HTTPException(status_code=409, detail='Document already attached')" - ] - }, - { - "method": "GET", - "path": "/requests/{request_id}/documents", - "router": "router", - "prefix_resolved": true, - "name": "list_attached_documents", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 342, - "doc": "", - "decorator": "router.get('/{request_id}/documents', response_model=list[RequestDocumentRead])", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] + "declared_path": "/{request_id}", + "function": "update_request", + "line": 211 + }, + { + "method": "POST", + "declared_path": "/{request_id}/documents", + "function": "attach_document", + "line": 275 + }, + { + "method": "GET", + "declared_path": "/{request_id}/documents", + "function": "list_attached_documents", + "line": 342 }, { "method": "DELETE", - "path": "/requests/{request_id}/documents/{doc_id}", - "router": "router", - "prefix_resolved": true, - "name": "remove_document", - "signature": "request_id: uuid.UUID, doc_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 363, - "doc": "", - "decorator": "router.delete('/{request_id}/documents/{doc_id}', status_code=204)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=404, detail='Attachment not found')" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/submit-review", - "router": "router", - "prefix_resolved": true, - "name": "submit_for_review", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 395, - "doc": "", - "decorator": "router.post('/{request_id}/submit-review', response_model=RequestRead)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=400, detail=f'Cannot submit for review from status {req.status.value}')" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/ready-for-release", - "router": "router", - "prefix_resolved": true, - "name": "mark_ready_for_release", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.REVIEWER))", - "returns": "", - "line": 437, - "doc": "", - "decorator": "router.post('/{request_id}/ready-for-release', response_model=RequestRead)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=400, detail=f\"Can only mark ready for release from 'in_review' status, current: {req.status.value}\")" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/approve", - "router": "router", - "prefix_resolved": true, - "name": "approve_request", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.REVIEWER))", - "returns": "", - "line": 481, - "doc": "", - "decorator": "router.post('/{request_id}/approve', response_model=RequestRead)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=400, detail=f\"Can only approve from 'drafted' or 'ready_for_release' status, current: {req.status.value}\")" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/reject", - "router": "router", - "prefix_resolved": true, - "name": "reject_request", - "signature": "request_id: uuid.UUID, reason: str='', session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.REVIEWER))", - "returns": "", - "line": 525, - "doc": "", - "decorator": "router.post('/{request_id}/reject', response_model=RequestRead)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=400, detail=\"Can only reject from 'in_review' status\")" - ] - }, - { - "method": "GET", - "path": "/requests/{request_id}/timeline", - "router": "router", - "prefix_resolved": true, - "name": "get_timeline", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 571, - "doc": "", - "decorator": "router.get('/{request_id}/timeline', response_model=list[TimelineEventRead])", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/timeline", - "router": "router", - "prefix_resolved": true, - "name": "add_timeline_event", - "signature": "request_id: uuid.UUID, event: TimelineEventCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 590, - "doc": "", - "decorator": "router.post('/{request_id}/timeline', response_model=TimelineEventRead, status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] - }, - { - "method": "GET", - "path": "/requests/{request_id}/messages", - "router": "router", - "prefix_resolved": true, - "name": "get_messages", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 622, - "doc": "", - "decorator": "router.get('/{request_id}/messages', response_model=list[MessageRead])", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/messages", - "router": "router", - "prefix_resolved": true, - "name": "add_message", - "signature": "request_id: uuid.UUID, msg: MessageCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 641, - "doc": "", - "decorator": "router.post('/{request_id}/messages', response_model=MessageRead, status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] - }, - { - "method": "GET", - "path": "/requests/{request_id}/fees", - "router": "router", - "prefix_resolved": true, - "name": "get_fees", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 672, - "doc": "", - "decorator": "router.get('/{request_id}/fees', response_model=list[FeeLineItemRead])", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/fees", - "router": "router", - "prefix_resolved": true, - "name": "add_fee", - "signature": "request_id: uuid.UUID, fee: FeeLineItemCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 692, - "doc": "", - "decorator": "router.post('/{request_id}/fees', response_model=FeeLineItemRead, status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/estimate-fees", - "router": "router", - "prefix_resolved": true, - "name": "estimate_fees", - "signature": "request_id: uuid.UUID, body: FeeEstimateRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 748, - "doc": "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.", - "decorator": "router.post('/{request_id}/estimate-fees', response_model=FeeEstimateResponse)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=404, detail='Fee schedule not found')" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/fee-waiver", - "router": "router", - "prefix_resolved": true, - "name": "create_fee_waiver", - "signature": "request_id: uuid.UUID, body: FeeWaiverCreateRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 803, - "doc": "Request a fee waiver for this records request.", - "decorator": "router.post('/{request_id}/fee-waiver', response_model=FeeWaiverReadResponse, status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=422, detail=f'Invalid waiver_type: {body.waiver_type}')" - ] + "declared_path": "/{request_id}/documents/{doc_id}", + "function": "remove_document", + "line": 363 + }, + { + "method": "POST", + "declared_path": "/{request_id}/submit-review", + "function": "submit_for_review", + "line": 395 + }, + { + "method": "POST", + "declared_path": "/{request_id}/ready-for-release", + "function": "mark_ready_for_release", + "line": 437 + }, + { + "method": "POST", + "declared_path": "/{request_id}/approve", + "function": "approve_request", + "line": 481 + }, + { + "method": "POST", + "declared_path": "/{request_id}/reject", + "function": "reject_request", + "line": 525 + }, + { + "method": "GET", + "declared_path": "/{request_id}/timeline", + "function": "get_timeline", + "line": 571 + }, + { + "method": "POST", + "declared_path": "/{request_id}/timeline", + "function": "add_timeline_event", + "line": 590 + }, + { + "method": "GET", + "declared_path": "/{request_id}/messages", + "function": "get_messages", + "line": 622 + }, + { + "method": "POST", + "declared_path": "/{request_id}/messages", + "function": "add_message", + "line": 641 + }, + { + "method": "GET", + "declared_path": "/{request_id}/fees", + "function": "get_fees", + "line": 672 + }, + { + "method": "POST", + "declared_path": "/{request_id}/fees", + "function": "add_fee", + "line": 692 + }, + { + "method": "POST", + "declared_path": "/{request_id}/estimate-fees", + "function": "estimate_fees", + "line": 748 + }, + { + "method": "POST", + "declared_path": "/{request_id}/fee-waiver", + "function": "create_fee_waiver", + "line": 803 }, { "method": "PATCH", - "path": "/requests/{request_id}/fee-waiver/{waiver_id}", - "router": "router", - "prefix_resolved": true, - "name": "review_fee_waiver", - "signature": "request_id: uuid.UUID, waiver_id: uuid.UUID, body: FeeWaiverReviewRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.REVIEWER))", - "returns": "", - "line": 848, - "doc": "Approve or deny a fee waiver. Reviewer/Admin only.", - "decorator": "router.patch('/{request_id}/fee-waiver/{waiver_id}', response_model=FeeWaiverReadResponse)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=404, detail='Fee waiver not found')", - "HTTPException(status_code=422, detail=\"Status must be 'approved' or 'denied'\")" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/response-letter", - "router": "router", - "prefix_resolved": true, - "name": "generate_response_letter", - "signature": "request_id: uuid.UUID, data: ResponseLetterCreate | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 1138, - "doc": "Generate a draft response letter for a records request.\n\nAttempts LLM generation via Ollama first; falls back to a structured\ntemplate if the LLM is unavailable.", - "decorator": "router.post('/{request_id}/response-letter', response_model=ResponseLetterRead, status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')" - ] - }, - { - "method": "GET", - "path": "/requests/{request_id}/response-letter", - "router": "router", - "prefix_resolved": true, - "name": "get_response_letter", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 1203, - "doc": "Get the latest response letter for a request.", - "decorator": "router.get('/{request_id}/response-letter', response_model=ResponseLetterRead)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=404, detail='No response letter found for this request')" - ] + "declared_path": "/{request_id}/fee-waiver/{waiver_id}", + "function": "review_fee_waiver", + "line": 848 + }, + { + "method": "POST", + "declared_path": "/{request_id}/response-letter", + "function": "generate_response_letter", + "line": 1138 + }, + { + "method": "GET", + "declared_path": "/{request_id}/response-letter", + "function": "get_response_letter", + "line": 1203 }, { "method": "PATCH", - "path": "/requests/{request_id}/response-letter/{letter_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_response_letter", - "signature": "request_id: uuid.UUID, letter_id: uuid.UUID, data: ResponseLetterUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 1232, - "doc": "Update a response letter's edited content or status.\n\nStatus changes to 'approved' require REVIEWER role.", - "decorator": "router.patch('/{request_id}/response-letter/{letter_id}', response_model=ResponseLetterRead)", - "errors": [ - "HTTPException(status_code=404, detail='Request not found')", - "HTTPException(status_code=404, detail='Response letter not found')", - "HTTPException(status_code=400, detail='Invalid status. Must be draft, approved, or sent')", - "HTTPException(status_code=403, detail='Only reviewers or admins can approve response letters')" - ] + "declared_path": "/{request_id}/response-letter/{letter_id}", + "function": "update_response_letter", + "line": 1232 } ], "models": [ @@ -13646,16 +12392,15 @@ { "name": "page_count", "type": "int", - "default": "" + "line": 735 }, { "name": "fee_schedule_id", "type": "uuid.UUID", - "default": "" + "line": 736 } ], - "line": 734, - "doc": "" + "line": 734 }, { "name": "FeeEstimateResponse", @@ -13666,31 +12411,30 @@ { "name": "page_count", "type": "int", - "default": "" + "line": 740 }, { "name": "unit_price", "type": "float", - "default": "" + "line": 741 }, { "name": "total", "type": "float", - "default": "" + "line": 742 }, { "name": "fee_type", "type": "str", - "default": "" + "line": 743 }, { "name": "description", "type": "str", - "default": "" + "line": 744 } ], - "line": 739, - "doc": "" + "line": 739 }, { "name": "FeeWaiverCreateRequest", @@ -13701,16 +12445,15 @@ { "name": "waiver_type", "type": "str", - "default": "" + "line": 781 }, { "name": "reason", "type": "str", - "default": "" + "line": 782 } ], - "line": 780, - "doc": "" + "line": 780 }, { "name": "FeeWaiverReadResponse", @@ -13721,41 +12464,40 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 786 }, { "name": "request_id", "type": "uuid.UUID", - "default": "" + "line": 787 }, { "name": "waiver_type", "type": "str", - "default": "" + "line": 788 }, { "name": "reason", "type": "str", - "default": "" + "line": 789 }, { "name": "status", "type": "str", - "default": "" + "line": 790 }, { "name": "review_notes", "type": "str | None", - "default": "None" + "line": 791 }, { "name": "created_at", "type": "str", - "default": "" + "line": 792 } ], - "line": 785, - "doc": "" + "line": 785 }, { "name": "FeeWaiverReviewRequest", @@ -13766,29 +12508,28 @@ { "name": "status", "type": "str", - "default": "" + "line": 798 }, { "name": "review_notes", "type": "str | None", - "default": "None" + "line": 799 } ], - "line": 797, - "doc": "" + "line": 797 } ], "configuration": [ { - "variable": "LLM_MODEL", - "default": "", + "environment": "LLM_MODEL", "line": 992 } ] }, { - "source": "installed-owned-source/app/requests/service.py", - "sha256": "117aa98e60d09824799b2696dfce65d9ade7d60b58a35df3e8664add3cccca66", + "source": "backend/townlight_records/requests/service.py", + "sha256": "2e3d98c29dad218f7a32a1eecf013170071413a246d21180426f0fdb2a6e275c", + "bytes": 5015, "routes": [], "models": [ { @@ -13798,58 +12539,58 @@ { "name": "requester_name", "type": "str", - "default": "" + "line": 20 }, { "name": "description", "type": "str", - "default": "" + "line": 21 }, { "name": "requester_email", "type": "str | None", - "default": "None" + "line": 22 }, { "name": "requester_phone", "type": "str | None", - "default": "None" + "line": 23 }, { "name": "requester_type", "type": "str | None", - "default": "None" + "line": 24 }, { "name": "statutory_deadline", "type": "datetime | None", - "default": "None" + "line": 25 }, { "name": "priority", "type": "str", - "default": "'normal'" + "line": 26 }, { "name": "scope_assessment", "type": "str | None", - "default": "None" + "line": 27 }, { "name": "department_id", "type": "uuid.UUID | None", - "default": "None" + "line": 28 } ], - "line": 19, - "doc": "" + "line": 19 } ], "configuration": [] }, { - "source": "installed-owned-source/app/requests/workflow.py", - "sha256": "3d0ec7c9e4dd987beab5c1ca89f7b4c8e45f0a24075b64ce7694be50a901a72b", + "source": "backend/townlight_records/requests/workflow.py", + "sha256": "fbffbf4434cdeecd92d3828fa92690360f01fb809f1f7aec501d42aef56d161a", + "bytes": 18267, "routes": [], "models": [ { @@ -13859,30 +12600,31 @@ { "name": "user", "type": "User", - "default": "" + "line": 26 }, { "name": "role", "type": "str", - "default": "" + "line": 27 } ], - "line": 25, - "doc": "" + "line": 25 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/__init__.py", + "source": "backend/townlight_records/schemas/__init__.py", "sha256": "7cd5688441a82abcca61eda136c29d767a8043bb0a3f7d9f0696a6443f675372", + "bytes": 18, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/analytics.py", + "source": "backend/townlight_records/schemas/analytics.py", "sha256": "1b2f2d7507f1057d010c203ec7c7fa6037d7adfd1e5be4b7323402dca5693a69", + "bytes": 411, "routes": [], "models": [ { @@ -13894,63 +12636,63 @@ { "name": "average_response_time_days", "type": "float | None", - "default": "" + "line": 5 }, { "name": "median_response_time_days", "type": "float | None", - "default": "" + "line": 6 }, { "name": "requests_by_status", "type": "dict[str, int]", - "default": "" + "line": 7 }, { "name": "requests_by_department", "type": "dict[str, int]", - "default": "" + "line": 8 }, { "name": "deadline_compliance_rate", "type": "float", - "default": "" + "line": 9 }, { "name": "total_open", "type": "int", - "default": "" + "line": 10 }, { "name": "total_closed", "type": "int", - "default": "" + "line": 11 }, { "name": "total_overdue", "type": "int", - "default": "" + "line": 12 }, { "name": "clarification_frequency", "type": "float", - "default": "" + "line": 13 }, { "name": "top_request_topics", "type": "list[str]", - "default": "" + "line": 14 } ], - "line": 4, - "doc": "" + "line": 4 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/audit.py", + "source": "backend/townlight_records/schemas/audit.py", "sha256": "95b0e336b85ffdb37079359ab68aa04b9ed974e964dc9a943cbef132f99e327d", + "bytes": 767, "routes": [], "models": [ { @@ -13962,56 +12704,55 @@ { "name": "id", "type": "int", - "default": "" + "line": 8 }, { "name": "prev_hash", "type": "str", - "default": "" + "line": 9 }, { "name": "entry_hash", "type": "str", - "default": "" + "line": 10 }, { "name": "timestamp", "type": "datetime", - "default": "" + "line": 11 }, { "name": "user_id", "type": "uuid.UUID | None", - "default": "" + "line": 12 }, { "name": "action", "type": "str", - "default": "" + "line": 13 }, { "name": "resource_type", "type": "str", - "default": "" + "line": 14 }, { "name": "resource_id", "type": "str | None", - "default": "" + "line": 15 }, { "name": "details", "type": "dict | None", - "default": "" + "line": 16 }, { "name": "ai_generated", "type": "bool", - "default": "" + "line": 17 } ], - "line": 7, - "doc": "" + "line": 7 }, { "name": "AuditLogQuery", @@ -14022,41 +12763,40 @@ { "name": "action", "type": "str | None", - "default": "None" + "line": 23 }, { "name": "resource_type", "type": "str | None", - "default": "None" + "line": 24 }, { "name": "user_id", "type": "uuid.UUID | None", - "default": "None" + "line": 25 }, { "name": "start_date", "type": "datetime | None", - "default": "None" + "line": 26 }, { "name": "end_date", "type": "datetime | None", - "default": "None" + "line": 27 }, { "name": "limit", "type": "int", - "default": "Field(default=50, le=200)" + "line": 28 }, { "name": "offset", "type": "int", - "default": "0" + "line": 29 } ], - "line": 22, - "doc": "" + "line": 22 }, { "name": "AuditChainVerification", @@ -14067,28 +12807,28 @@ { "name": "is_valid", "type": "bool", - "default": "" + "line": 33 }, { "name": "entries_checked", "type": "int", - "default": "" + "line": 34 }, { "name": "error_message", "type": "str", - "default": "" + "line": 35 } ], - "line": 32, - "doc": "" + "line": 32 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/city_profile.py", + "source": "backend/townlight_records/schemas/city_profile.py", "sha256": "b3187fb30ee67b36d4eb2794c2e36b31a49f01b9ad53b0db1a0d9bf87b2c2b2d", + "bytes": 1627, "routes": [], "models": [ { @@ -14100,51 +12840,50 @@ { "name": "city_name", "type": "str", - "default": "" + "line": 8 }, { "name": "state", "type": "str | None", - "default": "None" + "line": 13 }, { "name": "county", "type": "str | None", - "default": "None" + "line": 14 }, { "name": "population_band", "type": "str | None", - "default": "None" + "line": 15 }, { "name": "email_platform", "type": "str | None", - "default": "None" + "line": 16 }, { "name": "has_dedicated_it", "type": "bool | None", - "default": "None" + "line": 17 }, { "name": "monthly_request_volume", "type": "str | None", - "default": "None" + "line": 18 }, { "name": "profile_data", "type": "dict", - "default": "{}" + "line": 19 }, { "name": "gap_map", "type": "dict", - "default": "{}" + "line": 20 } ], - "line": 7, - "doc": "" + "line": 7 }, { "name": "CityProfileRead", @@ -14155,71 +12894,70 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 25 }, { "name": "city_name", "type": "str", - "default": "" + "line": 26 }, { "name": "state", "type": "str | None", - "default": "" + "line": 29 }, { "name": "county", "type": "str | None", - "default": "" + "line": 30 }, { "name": "population_band", "type": "str | None", - "default": "" + "line": 31 }, { "name": "email_platform", "type": "str | None", - "default": "" + "line": 32 }, { "name": "has_dedicated_it", "type": "bool | None", - "default": "" + "line": 33 }, { "name": "monthly_request_volume", "type": "str | None", - "default": "" + "line": 34 }, { "name": "onboarding_status", "type": "str", - "default": "" + "line": 35 }, { "name": "profile_data", "type": "dict", - "default": "" + "line": 36 }, { "name": "gap_map", "type": "dict", - "default": "" + "line": 37 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 38 }, { "name": "updated_at", "type": "datetime", - "default": "" + "line": 39 } ], - "line": 23, - "doc": "" + "line": 23 }, { "name": "CityProfileUpdate", @@ -14230,70 +12968,71 @@ { "name": "city_name", "type": "str | None", - "default": "None" + "line": 43 }, { "name": "state", "type": "str | None", - "default": "None" + "line": 44 }, { "name": "county", "type": "str | None", - "default": "None" + "line": 45 }, { "name": "population_band", "type": "str | None", - "default": "None" + "line": 46 }, { "name": "email_platform", "type": "str | None", - "default": "None" + "line": 47 }, { "name": "has_dedicated_it", "type": "bool | None", - "default": "None" + "line": 48 }, { "name": "monthly_request_volume", "type": "str | None", - "default": "None" + "line": 49 }, { "name": "onboarding_status", "type": "str | None", - "default": "None" + "line": 50 }, { "name": "profile_data", "type": "dict | None", - "default": "None" + "line": 51 }, { "name": "gap_map", "type": "dict | None", - "default": "None" + "line": 52 } ], - "line": 42, - "doc": "" + "line": 42 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/connectors/__init__.py", - "sha256": "bc0d25288808206c0bad0ff842e9e68f6aa298f194cec977e540cc20438d79ec", + "source": "backend/townlight_records/schemas/connectors/__init__.py", + "sha256": "726eb96cca0ac51b015962c6574003a61edc9d81ad95c486d2f102749aeba0e1", + "bytes": 388, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/connectors/odbc.py", - "sha256": "d21cc39b1dc8567b6615bf14c3ff1a44c43cbedd851ce27acfe52e92015ede65", + "source": "backend/townlight_records/schemas/connectors/odbc.py", + "sha256": "7f90488d1774fdb632ed8a70cf34567966b823dded7e4ed49b71c66cd7cff2cf", + "bytes": 2296, "routes": [], "models": [ { @@ -14305,53 +13044,53 @@ { "name": "connector_type", "type": "Literal['odbc']", - "default": "'odbc'" + "line": 18 }, { "name": "connection_string", "type": "str", - "default": "" + "line": 20 }, { "name": "table_name", "type": "str", - "default": "" + "line": 21 }, { "name": "pk_column", "type": "str", - "default": "" + "line": 22 }, { "name": "modified_column", "type": "Optional[str]", - "default": "None" + "line": 23 }, { "name": "columns", "type": "Optional[list[str]]", - "default": "None" + "line": 24 }, { "name": "batch_size", "type": "int", - "default": "Field(default=500, ge=1, le=10000)" + "line": 26 }, { "name": "max_row_bytes", "type": "int", - "default": "Field(default=10485760, ge=1)" + "line": 27 } ], - "line": 17, - "doc": "" + "line": 17 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/connectors/rest_api.py", - "sha256": "a14767ee188a3ff4ca34b54f73f5c6059a146628d559de016402e3b3cf04793b", + "source": "backend/townlight_records/schemas/connectors/rest_api.py", + "sha256": "26bc9b8c7f3cd8d4bfdd99114486bc7b0aa926f42af3aba73754e4b8d21d3db7", + "bytes": 2769, "routes": [], "models": [ { @@ -14363,153 +13102,153 @@ { "name": "connector_type", "type": "Literal['rest_api']", - "default": "'rest_api'" + "line": 6 }, { "name": "base_url", "type": "AnyHttpUrl", - "default": "" + "line": 9 }, { "name": "endpoint_path", "type": "str", - "default": "Field(default='/', description='Path appended to base_url')" + "line": 10 }, { "name": "auth_method", "type": "Literal['none', 'api_key', 'bearer', 'oauth2', 'basic']", - "default": "" + "line": 13 }, { "name": "api_key", "type": "Optional[str]", - "default": "None" + "line": 14 }, { "name": "key_location", "type": "Literal['header', 'query']", - "default": "'header'" + "line": 15 }, { "name": "key_header", "type": "str", - "default": "'X-API-Key'" + "line": 16 }, { "name": "token", "type": "Optional[str]", - "default": "None" + "line": 17 }, { "name": "client_id", "type": "Optional[str]", - "default": "None" + "line": 18 }, { "name": "client_secret", "type": "Optional[str]", - "default": "None" + "line": 19 }, { "name": "token_url", "type": "Optional[AnyHttpUrl]", - "default": "None" + "line": 20 }, { "name": "username", "type": "Optional[str]", - "default": "None" + "line": 21 }, { "name": "password", "type": "Optional[str]", - "default": "None" + "line": 22 }, { "name": "pagination_style", "type": "Literal['none', 'page', 'offset', 'cursor']", - "default": "'none'" + "line": 25 }, { "name": "page_param", "type": "str", - "default": "'page'" + "line": 26 }, { "name": "offset_param", "type": "str", - "default": "'offset'" + "line": 27 }, { "name": "limit_param", "type": "str", - "default": "'limit'" + "line": 28 }, { "name": "page_size", "type": "int", - "default": "Field(default=100, ge=1, le=10000)" + "line": 29 }, { "name": "cursor_field", "type": "str", - "default": "'next'" + "line": 30 }, { "name": "response_format", "type": "Literal['json', 'xml', 'csv']", - "default": "'json'" + "line": 33 }, { "name": "results_field", "type": "Optional[str]", - "default": "None" + "line": 34 }, { "name": "data_key", "type": "Optional[str]", - "default": "None" + "line": 37 }, { "name": "id_field", "type": "str", - "default": "'id'" + "line": 38 }, { "name": "envelope_excludes", "type": "list[str]", - "default": "[]" + "line": 39 }, { "name": "since_field", "type": "Optional[str]", - "default": "None" + "line": 42 }, { "name": "since_format", "type": "str", - "default": "'%Y-%m-%dT%H:%M:%SZ'" + "line": 43 }, { "name": "max_records", "type": "int", - "default": "Field(default=10000, ge=1)" + "line": 46 }, { "name": "max_response_bytes", "type": "int", - "default": "Field(default=52428800, ge=1)" + "line": 47 } ], - "line": 5, - "doc": "" + "line": 5 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/department.py", + "source": "backend/townlight_records/schemas/department.py", "sha256": "5e45ab7a46abbb6a40e6c7d22b928aa65bdc0fabab5a424ee988fd31ec672c30", + "bytes": 486, "routes": [], "models": [ { @@ -14521,21 +13260,20 @@ { "name": "name", "type": "str", - "default": "" + "line": 7 }, { "name": "code", "type": "str", - "default": "" + "line": 8 }, { "name": "contact_email", "type": "str | None", - "default": "None" + "line": 9 } ], - "line": 6, - "doc": "" + "line": 6 }, { "name": "DepartmentRead", @@ -14546,31 +13284,30 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 13 }, { "name": "name", "type": "str", - "default": "" + "line": 14 }, { "name": "code", "type": "str", - "default": "" + "line": 15 }, { "name": "contact_email", "type": "str | None", - "default": "" + "line": 16 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 17 } ], - "line": 12, - "doc": "" + "line": 12 }, { "name": "DepartmentUpdate", @@ -14581,28 +13318,28 @@ { "name": "name", "type": "str | None", - "default": "None" + "line": 22 }, { "name": "code", "type": "str | None", - "default": "None" + "line": 23 }, { "name": "contact_email", "type": "str | None", - "default": "None" + "line": 24 } ], - "line": 21, - "doc": "" + "line": 21 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/document.py", - "sha256": "139e5160eac328e5d5499c935a2ee4bbc8a7eee5a24cfe1fc7e08b1aca0fbc8a", + "source": "backend/townlight_records/schemas/document.py", + "sha256": "372c267701130f9e9a3e73833b81514f2d8753abcfe91f5f546ce919534b180c", + "bytes": 3191, "routes": [], "models": [ { @@ -14614,31 +13351,30 @@ { "name": "name", "type": "str", - "default": "" + "line": 8 }, { "name": "source_type", "type": "SourceType", - "default": "" + "line": 9 }, { "name": "connection_config", "type": "dict", - "default": "{}" + "line": 10 }, { "name": "sync_schedule", "type": "str | None", - "default": "None" + "line": 11 }, { "name": "schedule_enabled", "type": "bool", - "default": "True" + "line": 12 } ], - "line": 7, - "doc": "" + "line": 7 }, { "name": "DataSourceRead", @@ -14649,101 +13385,100 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 25 }, { "name": "name", "type": "str", - "default": "" + "line": 26 }, { "name": "source_type", "type": "SourceType", - "default": "" + "line": 27 }, { "name": "sync_schedule", "type": "str | None", - "default": "None" + "line": 28 }, { "name": "schedule_enabled", "type": "bool", - "default": "True" + "line": 29 }, { "name": "next_sync_at", "type": "datetime | None", - "default": "None" + "line": 30 }, { "name": "is_active", "type": "bool", - "default": "" + "line": 31 }, { "name": "created_by", "type": "uuid.UUID", - "default": "" + "line": 32 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 33 }, { "name": "last_ingestion_at", "type": "datetime | None", - "default": "" + "line": 34 }, { "name": "last_sync_at", "type": "datetime | None", - "default": "None" + "line": 35 }, { "name": "last_sync_status", "type": "str | None", - "default": "None" + "line": 36 }, { "name": "last_error_message", "type": "str | None", - "default": "None" + "line": 37 }, { "name": "consecutive_failure_count", "type": "int", - "default": "0" + "line": 38 }, { "name": "sync_paused", "type": "bool", - "default": "False" + "line": 39 }, { "name": "health_status", "type": "str", - "default": "'healthy'" + "line": 40 }, { "name": "active_failure_count", "type": "int", - "default": "0" + "line": 41 }, { "name": "connector_type", "type": "str | None", - "default": "None" + "line": 42 }, { "name": "updated_at", "type": "datetime | None", - "default": "None" + "line": 43 } ], - "line": 23, - "doc": "Redacted datasource shape \u2014 safe for non-admin roles. connection_config omitted." + "line": 23 }, { "name": "DataSourceAdminRead", @@ -14754,11 +13489,10 @@ { "name": "connection_config", "type": "dict", - "default": "" + "line": 54 } ], - "line": 52, - "doc": "Full datasource shape including connection_config. Returned only by admin-gated endpoints." + "line": 52 }, { "name": "DataSourceUpdate", @@ -14769,31 +13503,30 @@ { "name": "name", "type": "str | None", - "default": "None" + "line": 58 }, { "name": "connection_config", "type": "dict | None", - "default": "None" + "line": 59 }, { "name": "sync_schedule", "type": "str | None", - "default": "None" + "line": 60 }, { "name": "schedule_enabled", "type": "bool | None", - "default": "None" + "line": 61 }, { "name": "is_active", "type": "bool | None", - "default": "None" + "line": 62 } ], - "line": 57, - "doc": "" + "line": 57 }, { "name": "DocumentRead", @@ -14804,71 +13537,70 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 74 }, { "name": "source_id", "type": "uuid.UUID", - "default": "" + "line": 75 }, { "name": "source_path", "type": "str", - "default": "" + "line": 76 }, { "name": "filename", "type": "str", - "default": "" + "line": 77 }, { "name": "file_type", "type": "str", - "default": "" + "line": 78 }, { "name": "file_hash", "type": "str", - "default": "" + "line": 79 }, { "name": "file_size", "type": "int", - "default": "" + "line": 80 }, { "name": "ingestion_status", "type": "IngestionStatus", - "default": "" + "line": 81 }, { "name": "ingestion_error", "type": "str | None", - "default": "" + "line": 82 }, { "name": "chunk_count", "type": "int", - "default": "" + "line": 83 }, { "name": "ingested_at", "type": "datetime | None", - "default": "" + "line": 84 }, { "name": "connector_type", "type": "str | None", - "default": "None" + "line": 85 }, { "name": "updated_at", "type": "datetime | None", - "default": "None" + "line": 86 } ], - "line": 73, - "doc": "" + "line": 73 }, { "name": "DocumentChunkRead", @@ -14879,36 +13611,35 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 91 }, { "name": "document_id", "type": "uuid.UUID", - "default": "" + "line": 92 }, { "name": "chunk_index", "type": "int", - "default": "" + "line": 93 }, { "name": "content_text", "type": "str", - "default": "" + "line": 94 }, { "name": "token_count", "type": "int", - "default": "" + "line": 95 }, { "name": "page_number", "type": "int | None", - "default": "" + "line": 96 } ], - "line": 90, - "doc": "" + "line": 90 }, { "name": "IngestionStats", @@ -14919,38 +13650,38 @@ { "name": "total_sources", "type": "int", - "default": "" + "line": 101 }, { "name": "active_sources", "type": "int", - "default": "" + "line": 102 }, { "name": "total_documents", "type": "int", - "default": "" + "line": 103 }, { "name": "documents_by_status", "type": "dict[str, int]", - "default": "" + "line": 104 }, { "name": "total_chunks", "type": "int", - "default": "" + "line": 105 } ], - "line": 100, - "doc": "" + "line": 100 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/exemption.py", - "sha256": "7cd5c0e1d1c2eaca8dace50b570ac06832765cbb3c3df148b84d3a12188f4664", + "source": "backend/townlight_records/schemas/exemption.py", + "sha256": "ecdb2535bcbd322b3e356d21207c59f461b83dbfc7e1bb5e13e30322698f24a4", + "bytes": 2352, "routes": [], "models": [ { @@ -14962,36 +13693,35 @@ { "name": "state_code", "type": "str", - "default": "" + "line": 9 }, { "name": "category", "type": "str", - "default": "" + "line": 10 }, { "name": "rule_type", "type": "RuleType", - "default": "" + "line": 11 }, { "name": "rule_definition", "type": "str", - "default": "" + "line": 12 }, { "name": "description", "type": "str | None", - "default": "None" + "line": 13 }, { "name": "enabled", "type": "bool", - "default": "True" + "line": 14 } ], - "line": 8, - "doc": "" + "line": 8 }, { "name": "ExemptionRuleRead", @@ -15002,56 +13732,55 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 18 }, { "name": "state_code", "type": "str", - "default": "" + "line": 19 }, { "name": "category", "type": "str", - "default": "" + "line": 20 }, { "name": "rule_type", "type": "RuleType", - "default": "" + "line": 21 }, { "name": "rule_definition", "type": "str", - "default": "" + "line": 22 }, { "name": "description", "type": "str | None", - "default": "" + "line": 23 }, { "name": "enabled", "type": "bool", - "default": "" + "line": 24 }, { "name": "version", "type": "int", - "default": "1" + "line": 25 }, { "name": "created_by", "type": "uuid.UUID", - "default": "" + "line": 26 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 27 } ], - "line": 17, - "doc": "" + "line": 17 }, { "name": "ExemptionRuleUpdate", @@ -15062,21 +13791,20 @@ { "name": "rule_definition", "type": "str | None", - "default": "None" + "line": 32 }, { "name": "description", "type": "str | None", - "default": "None" + "line": 33 }, { "name": "enabled", "type": "bool | None", - "default": "None" + "line": 34 } ], - "line": 31, - "doc": "" + "line": 31 }, { "name": "ExemptionFlagRead", @@ -15087,66 +13815,65 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 38 }, { "name": "chunk_id", "type": "uuid.UUID", - "default": "" + "line": 39 }, { "name": "rule_id", "type": "uuid.UUID | None", - "default": "" + "line": 40 }, { "name": "request_id", "type": "uuid.UUID", - "default": "" + "line": 41 }, { "name": "category", "type": "str", - "default": "" + "line": 42 }, { "name": "matched_text", "type": "str | None", - "default": "" + "line": 43 }, { "name": "confidence", "type": "float", - "default": "" + "line": 44 }, { "name": "status", "type": "FlagStatus", - "default": "" + "line": 45 }, { "name": "reviewed_by", "type": "uuid.UUID | None", - "default": "" + "line": 46 }, { "name": "reviewed_at", "type": "datetime | None", - "default": "" + "line": 47 }, { "name": "review_reason", "type": "str | None", - "default": "" + "line": 48 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 49 } ], - "line": 37, - "doc": "" + "line": 37 }, { "name": "ExemptionFlagReview", @@ -15157,16 +13884,15 @@ { "name": "status", "type": "FlagStatus", - "default": "" + "line": 54 }, { "name": "review_reason", "type": "str | None", - "default": "None" + "line": 55 } ], - "line": 53, - "doc": "" + "line": 53 }, { "name": "DisclosureTemplateCreate", @@ -15177,21 +13903,20 @@ { "name": "template_type", "type": "str", - "default": "" + "line": 59 }, { "name": "state_code", "type": "str | None", - "default": "None" + "line": 60 }, { "name": "content", "type": "str", - "default": "" + "line": 61 } ], - "line": 58, - "doc": "" + "line": 58 }, { "name": "DisclosureTemplateRead", @@ -15202,41 +13927,40 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 65 }, { "name": "template_type", "type": "str", - "default": "" + "line": 66 }, { "name": "state_code", "type": "str | None", - "default": "" + "line": 67 }, { "name": "content", "type": "str", - "default": "" + "line": 68 }, { "name": "version", "type": "int", - "default": "" + "line": 69 }, { "name": "updated_by", "type": "uuid.UUID", - "default": "" + "line": 70 }, { "name": "updated_at", "type": "datetime", - "default": "" + "line": 71 } ], - "line": 64, - "doc": "" + "line": 64 }, { "name": "ExemptionDashboard", @@ -15247,36 +13971,35 @@ { "name": "total_flags", "type": "int", - "default": "" + "line": 76 }, { "name": "by_status", "type": "dict[str, int]", - "default": "" + "line": 77 }, { "name": "by_category", "type": "dict[str, int]", - "default": "" + "line": 78 }, { "name": "acceptance_rate", "type": "float", - "default": "" + "line": 79 }, { "name": "total_rules", "type": "int", - "default": "" + "line": 80 }, { "name": "active_rules", "type": "int", - "default": "" + "line": 81 } ], - "line": 75, - "doc": "" + "line": 75 }, { "name": "ExemptionAccuracyReport", @@ -15287,36 +14010,35 @@ { "name": "category", "type": "str", - "default": "" + "line": 85 }, { "name": "total_flags", "type": "int", - "default": "" + "line": 86 }, { "name": "accepted", "type": "int", - "default": "" + "line": 87 }, { "name": "rejected", "type": "int", - "default": "" + "line": 88 }, { "name": "pending", "type": "int", - "default": "" + "line": 89 }, { "name": "acceptance_rate", "type": "float", - "default": "" + "line": 90 } ], - "line": 84, - "doc": "" + "line": 84 }, { "name": "DisclosureTemplateRendered", @@ -15327,26 +14049,25 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 94 }, { "name": "template_type", "type": "str", - "default": "" + "line": 95 }, { "name": "rendered_content", "type": "str", - "default": "" + "line": 96 }, { "name": "has_unresolved_variables", "type": "bool", - "default": "" + "line": 97 } ], - "line": 93, - "doc": "" + "line": 93 }, { "name": "DisclosureTemplateUpdate", @@ -15357,23 +14078,23 @@ { "name": "content", "type": "str | None", - "default": "None" + "line": 101 }, { "name": "state_code", "type": "str | None", - "default": "None" + "line": 102 } ], - "line": 100, - "doc": "" + "line": 100 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/fee_schedule.py", + "source": "backend/townlight_records/schemas/fee_schedule.py", "sha256": "132fca7b2f2484f924464e8c01bec43674d8a6fc579202849cf73e43630adf70", + "bytes": 700, "routes": [], "models": [ { @@ -15385,31 +14106,30 @@ { "name": "jurisdiction", "type": "str", - "default": "" + "line": 7 }, { "name": "fee_type", "type": "str", - "default": "" + "line": 8 }, { "name": "amount", "type": "float", - "default": "" + "line": 9 }, { "name": "description", "type": "str | None", - "default": "None" + "line": 10 }, { "name": "effective_date", "type": "date | None", - "default": "None" + "line": 11 } ], - "line": 6, - "doc": "" + "line": 6 }, { "name": "FeeScheduleRead", @@ -15420,46 +14140,45 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 15 }, { "name": "jurisdiction", "type": "str", - "default": "" + "line": 16 }, { "name": "fee_type", "type": "str", - "default": "" + "line": 17 }, { "name": "amount", "type": "float", - "default": "" + "line": 18 }, { "name": "description", "type": "str | None", - "default": "" + "line": 19 }, { "name": "effective_date", "type": "date | None", - "default": "" + "line": 20 }, { "name": "created_by", "type": "uuid.UUID | None", - "default": "" + "line": 21 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 22 } ], - "line": 14, - "doc": "" + "line": 14 }, { "name": "FeeScheduleUpdate", @@ -15470,33 +14189,33 @@ { "name": "fee_type", "type": "str | None", - "default": "None" + "line": 27 }, { "name": "amount", "type": "float | None", - "default": "None" + "line": 28 }, { "name": "description", "type": "str | None", - "default": "None" + "line": 29 }, { "name": "effective_date", "type": "date | None", - "default": "None" + "line": 30 } ], - "line": 26, - "doc": "" + "line": 26 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/notifications.py", + "source": "backend/townlight_records/schemas/notifications.py", "sha256": "61d74c4b0977679c0739a374997ae5d49792d47f0f469baf6c422b77fd993fa3", + "bytes": 928, "routes": [], "models": [ { @@ -15508,26 +14227,25 @@ { "name": "event_type", "type": "str", - "default": "" + "line": 8 }, { "name": "channel", "type": "str", - "default": "'email'" + "line": 9 }, { "name": "subject_template", "type": "str", - "default": "" + "line": 10 }, { "name": "body_template", "type": "str", - "default": "" + "line": 11 } ], - "line": 7, - "doc": "" + "line": 7 }, { "name": "NotificationTemplateRead", @@ -15538,41 +14256,40 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 17 }, { "name": "event_type", "type": "str", - "default": "" + "line": 18 }, { "name": "channel", "type": "str", - "default": "" + "line": 19 }, { "name": "subject_template", "type": "str", - "default": "" + "line": 20 }, { "name": "body_template", "type": "str", - "default": "" + "line": 21 }, { "name": "is_active", "type": "bool", - "default": "" + "line": 22 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 23 } ], - "line": 14, - "doc": "" + "line": 14 }, { "name": "NotificationTemplateUpdate", @@ -15583,21 +14300,20 @@ { "name": "subject_template", "type": "str | None", - "default": "None" + "line": 27 }, { "name": "body_template", "type": "str | None", - "default": "None" + "line": 28 }, { "name": "is_active", "type": "bool | None", - "default": "None" + "line": 29 } ], - "line": 26, - "doc": "" + "line": 26 }, { "name": "NotificationLogRead", @@ -15608,58 +14324,58 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 35 }, { "name": "template_id", "type": "uuid.UUID | None", - "default": "" + "line": 36 }, { "name": "recipient_email", "type": "str", - "default": "" + "line": 37 }, { "name": "request_id", "type": "uuid.UUID | None", - "default": "" + "line": 38 }, { "name": "channel", "type": "str", - "default": "" + "line": 39 }, { "name": "status", "type": "str", - "default": "" + "line": 40 }, { "name": "sent_at", "type": "datetime | None", - "default": "" + "line": 41 }, { "name": "error_message", "type": "str | None", - "default": "" + "line": 42 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 43 } ], - "line": 32, - "doc": "" + "line": 32 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/request.py", - "sha256": "7c632f8eaaa7198a74edf0860e25fcf2ef3fa8c8a5eb15fd55f633089787b8cd", + "source": "backend/townlight_records/schemas/request.py", + "sha256": "d98eea27470287dc25498bce26cd6e2594b812585113428b8647d8f5ce1e0980", + "bytes": 4229, "routes": [], "models": [ { @@ -15671,51 +14387,50 @@ { "name": "requester_name", "type": "str", - "default": "Field(..., max_length=255)" + "line": 9 }, { "name": "requester_email", "type": "str | None", - "default": "Field(None, max_length=255)" + "line": 10 }, { "name": "requester_phone", "type": "str | None", - "default": "Field(None, max_length=50)" + "line": 11 }, { "name": "requester_type", "type": "str | None", - "default": "Field(None, max_length=100)" + "line": 12 }, { "name": "description", "type": "str", - "default": "Field(..., max_length=10000)" + "line": 13 }, { "name": "statutory_deadline", "type": "datetime | None", - "default": "None" + "line": 14 }, { "name": "priority", "type": "str", - "default": "'normal'" + "line": 15 }, { "name": "scope_assessment", "type": "str | None", - "default": "Field(None, pattern='^(narrow|moderate|broad)$')" + "line": 16 }, { "name": "department_id", "type": "uuid.UUID | None", - "default": "None" + "line": 17 } ], - "line": 8, - "doc": "" + "line": 8 }, { "name": "RequestRead", @@ -15726,116 +14441,115 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 21 }, { "name": "requester_name", "type": "str", - "default": "" + "line": 22 }, { "name": "requester_email", "type": "str | None", - "default": "" + "line": 23 }, { "name": "requester_phone", "type": "str | None", - "default": "None" + "line": 24 }, { "name": "requester_type", "type": "str | None", - "default": "None" + "line": 25 }, { "name": "date_received", "type": "datetime", - "default": "" + "line": 26 }, { "name": "statutory_deadline", "type": "datetime | None", - "default": "" + "line": 27 }, { "name": "description", "type": "str", - "default": "" + "line": 28 }, { "name": "status", "type": "RequestStatus", - "default": "" + "line": 29 }, { "name": "assigned_to", "type": "uuid.UUID | None", - "default": "" + "line": 30 }, { "name": "created_by", "type": "uuid.UUID | None", - "default": "" + "line": 31 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 32 }, { "name": "response_draft", "type": "str | None", - "default": "" + "line": 33 }, { "name": "review_notes", "type": "str | None", - "default": "" + "line": 34 }, { "name": "department_id", "type": "uuid.UUID | None", - "default": "None" + "line": 35 }, { "name": "estimated_fee", "type": "float | None", - "default": "None" + "line": 36 }, { "name": "fee_status", "type": "str | None", - "default": "None" + "line": 37 }, { "name": "fee_waiver_requested", "type": "bool", - "default": "False" + "line": 38 }, { "name": "priority", "type": "str", - "default": "'normal'" + "line": 39 }, { "name": "scope_assessment", "type": "str | None", - "default": "None" + "line": 40 }, { "name": "closed_at", "type": "datetime | None", - "default": "None" + "line": 41 }, { "name": "closure_reason", "type": "str | None", - "default": "None" + "line": 42 } ], - "line": 20, - "doc": "" + "line": 20 }, { "name": "RequestUpdate", @@ -15846,36 +14560,35 @@ { "name": "description", "type": "str | None", - "default": "None" + "line": 48 }, { "name": "status", "type": "RequestStatus | None", - "default": "None" + "line": 49 }, { "name": "assigned_to", "type": "uuid.UUID | None", - "default": "None" + "line": 50 }, { "name": "response_draft", "type": "str | None", - "default": "None" + "line": 51 }, { "name": "statutory_deadline", "type": "datetime | None", - "default": "None" + "line": 52 }, { "name": "scope_assessment", "type": "str | None", - "default": "None" + "line": 53 } ], - "line": 47, - "doc": "" + "line": 47 }, { "name": "RequestDocumentAdd", @@ -15886,16 +14599,15 @@ { "name": "document_id", "type": "uuid.UUID", - "default": "" + "line": 57 }, { "name": "relevance_note", "type": "str | None", - "default": "None" + "line": 58 } ], - "line": 56, - "doc": "" + "line": 56 }, { "name": "RequestDocumentRead", @@ -15906,46 +14618,45 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 62 }, { "name": "request_id", "type": "uuid.UUID", - "default": "" + "line": 63 }, { "name": "document_id", "type": "uuid.UUID", - "default": "" + "line": 64 }, { "name": "relevance_note", "type": "str | None", - "default": "" + "line": 65 }, { "name": "exemption_flags", "type": "dict | None", - "default": "" + "line": 66 }, { "name": "inclusion_status", "type": "InclusionStatus", - "default": "" + "line": 67 }, { "name": "attached_at", "type": "datetime", - "default": "" + "line": 68 }, { "name": "attached_by", "type": "uuid.UUID", - "default": "" + "line": 69 } ], - "line": 61, - "doc": "" + "line": 61 }, { "name": "RequestStats", @@ -15956,26 +14667,25 @@ { "name": "total_requests", "type": "int", - "default": "" + "line": 75 }, { "name": "by_status", "type": "dict[str, int]", - "default": "" + "line": 76 }, { "name": "approaching_deadline", "type": "int", - "default": "" + "line": 77 }, { "name": "overdue", "type": "int", - "default": "" + "line": 78 } ], - "line": 74, - "doc": "" + "line": 74 }, { "name": "TimelineEventCreate", @@ -15986,21 +14696,20 @@ { "name": "event_type", "type": "str", - "default": "" + "line": 82 }, { "name": "description", "type": "str", - "default": "" + "line": 83 }, { "name": "internal_note", "type": "str | None", - "default": "None" + "line": 84 } ], - "line": 81, - "doc": "" + "line": 81 }, { "name": "TimelineEventRead", @@ -16011,46 +14720,45 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 89 }, { "name": "request_id", "type": "uuid.UUID", - "default": "" + "line": 90 }, { "name": "event_type", "type": "str", - "default": "" + "line": 91 }, { "name": "actor_id", "type": "uuid.UUID | None", - "default": "" + "line": 92 }, { "name": "actor_role", "type": "str | None", - "default": "" + "line": 93 }, { "name": "description", "type": "str", - "default": "" + "line": 94 }, { "name": "internal_note", "type": "str | None", - "default": "" + "line": 95 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 96 } ], - "line": 87, - "doc": "" + "line": 87 }, { "name": "MessageCreate", @@ -16061,16 +14769,15 @@ { "name": "message_text", "type": "str", - "default": "" + "line": 100 }, { "name": "is_internal", "type": "bool", - "default": "False" + "line": 101 } ], - "line": 99, - "doc": "" + "line": 99 }, { "name": "MessageRead", @@ -16081,41 +14788,40 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 106 }, { "name": "request_id", "type": "uuid.UUID", - "default": "" + "line": 107 }, { "name": "sender_type", "type": "str", - "default": "" + "line": 108 }, { "name": "sender_id", "type": "uuid.UUID | None", - "default": "" + "line": 109 }, { "name": "message_text", "type": "str", - "default": "" + "line": 110 }, { "name": "is_internal", "type": "bool", - "default": "" + "line": 111 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 112 } ], - "line": 104, - "doc": "" + "line": 104 }, { "name": "FeeLineItemCreate", @@ -16126,26 +14832,25 @@ { "name": "description", "type": "str", - "default": "" + "line": 116 }, { "name": "quantity", "type": "int", - "default": "1" + "line": 117 }, { "name": "unit_price", "type": "float", - "default": "" + "line": 118 }, { "name": "fee_schedule_id", "type": "uuid.UUID | None", - "default": "None" + "line": 119 } ], - "line": 115, - "doc": "" + "line": 115 }, { "name": "FeeLineItemRead", @@ -16156,51 +14861,50 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 124 }, { "name": "request_id", "type": "uuid.UUID", - "default": "" + "line": 125 }, { "name": "fee_schedule_id", "type": "uuid.UUID | None", - "default": "" + "line": 126 }, { "name": "description", "type": "str", - "default": "" + "line": 127 }, { "name": "quantity", "type": "int", - "default": "" + "line": 128 }, { "name": "unit_price", "type": "float", - "default": "" + "line": 129 }, { "name": "total", "type": "float", - "default": "" + "line": 130 }, { "name": "status", "type": "str", - "default": "" + "line": 131 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 132 } ], - "line": 122, - "doc": "" + "line": 122 }, { "name": "ResponseLetterCreate", @@ -16211,11 +14915,10 @@ { "name": "template_id", "type": "uuid.UUID | None", - "default": "None" + "line": 139 } ], - "line": 138, - "doc": "" + "line": 138 }, { "name": "ResponseLetterRead", @@ -16226,56 +14929,55 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 144 }, { "name": "request_id", "type": "uuid.UUID", - "default": "" + "line": 145 }, { "name": "template_id", "type": "uuid.UUID | None", - "default": "" + "line": 146 }, { "name": "generated_content", "type": "str", - "default": "" + "line": 147 }, { "name": "edited_content", "type": "str | None", - "default": "" + "line": 148 }, { "name": "status", "type": "str", - "default": "" + "line": 149 }, { "name": "generated_by", "type": "uuid.UUID | None", - "default": "" + "line": 150 }, { "name": "approved_by", "type": "uuid.UUID | None", - "default": "" + "line": 151 }, { "name": "sent_at", "type": "datetime | None", - "default": "" + "line": 152 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 153 } ], - "line": 142, - "doc": "" + "line": 142 }, { "name": "ResponseLetterUpdate", @@ -16286,23 +14988,23 @@ { "name": "edited_content", "type": "str | None", - "default": "None" + "line": 157 }, { "name": "status", "type": "str | None", - "default": "None" + "line": 158 } ], - "line": 156, - "doc": "" + "line": 156 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/search.py", + "source": "backend/townlight_records/schemas/search.py", "sha256": "13a5c1913290f2d1b4c9447c3b3d4d1046038e146c2b11a97a03e1bb895b3015", + "bytes": 1150, "routes": [], "models": [ { @@ -16314,31 +15016,30 @@ { "name": "query", "type": "str", - "default": "" + "line": 7 }, { "name": "session_id", "type": "uuid.UUID | None", - "default": "None" + "line": 8 }, { "name": "filters", "type": "dict | None", - "default": "None" + "line": 9 }, { "name": "limit", "type": "int", - "default": "Field(default=10, le=50)" + "line": 10 }, { "name": "synthesize", "type": "bool", - "default": "False" + "line": 11 } ], - "line": 6, - "doc": "" + "line": 6 }, { "name": "SearchResultItem", @@ -16349,51 +15050,50 @@ { "name": "chunk_id", "type": "uuid.UUID", - "default": "" + "line": 15 }, { "name": "document_id", "type": "uuid.UUID", - "default": "" + "line": 16 }, { "name": "filename", "type": "str", - "default": "" + "line": 17 }, { "name": "file_type", "type": "str", - "default": "" + "line": 18 }, { "name": "source_path", "type": "str", - "default": "" + "line": 19 }, { "name": "page_number", "type": "int | None", - "default": "" + "line": 20 }, { "name": "content_text", "type": "str", - "default": "" + "line": 21 }, { "name": "similarity_score", "type": "float", - "default": "" + "line": 22 }, { "name": "rank", "type": "int", - "default": "" + "line": 23 } ], - "line": 14, - "doc": "" + "line": 14 }, { "name": "SearchResponse", @@ -16404,41 +15104,40 @@ { "name": "query_id", "type": "uuid.UUID", - "default": "" + "line": 29 }, { "name": "session_id", "type": "uuid.UUID", - "default": "" + "line": 30 }, { "name": "query_text", "type": "str", - "default": "" + "line": 31 }, { "name": "results", "type": "list[SearchResultItem]", - "default": "" + "line": 32 }, { "name": "results_count", "type": "int", - "default": "" + "line": 33 }, { "name": "synthesized_answer", "type": "str | None", - "default": "None" + "line": 34 }, { "name": "ai_generated", "type": "bool", - "default": "False" + "line": 35 } ], - "line": 28, - "doc": "" + "line": 28 }, { "name": "SearchSessionRead", @@ -16449,26 +15148,25 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 39 }, { "name": "user_id", "type": "uuid.UUID", - "default": "" + "line": 40 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 41 }, { "name": "queries", "type": "list[dict]", - "default": "[]" + "line": 42 } ], - "line": 38, - "doc": "" + "line": 38 }, { "name": "SearchFilterOptions", @@ -16479,33 +15177,33 @@ { "name": "file_types", "type": "list[str]", - "default": "" + "line": 48 }, { "name": "source_names", "type": "list[str]", - "default": "" + "line": 49 }, { "name": "departments", "type": "list[dict]", - "default": "[]" + "line": 50 }, { "name": "date_range", "type": "dict | None", - "default": "None" + "line": 51 } ], - "line": 47, - "doc": "" + "line": 47 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/service_account.py", - "sha256": "998b5de7ba31a8800d2feb6379c5eaa00747bccd23c05ce99863a42b0951a37f", + "source": "backend/townlight_records/schemas/service_account.py", + "sha256": "0fe0918fc3daa11c37d371119d8a875c6d9061f82f005517efade03b19ec4210", + "bytes": 721, "routes": [], "models": [ { @@ -16517,16 +15215,15 @@ { "name": "name", "type": "str", - "default": "" + "line": 10 }, { "name": "role", "type": "UserRole", - "default": "UserRole.READ_ONLY" + "line": 11 } ], - "line": 9, - "doc": "" + "line": 9 }, { "name": "ServiceAccountRead", @@ -16537,36 +15234,35 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 15 }, { "name": "name", "type": "str", - "default": "" + "line": 16 }, { "name": "role", "type": "UserRole", - "default": "" + "line": 17 }, { "name": "created_by", "type": "uuid.UUID", - "default": "" + "line": 18 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 19 }, { "name": "is_active", "type": "bool", - "default": "" + "line": 20 } ], - "line": 14, - "doc": "" + "line": 14 }, { "name": "ServiceAccountCreated", @@ -16577,11 +15273,10 @@ { "name": "api_key", "type": "str", - "default": "" + "line": 27 } ], - "line": 25, - "doc": "Returned only on creation \u2014 includes the plaintext API key (shown once)." + "line": 25 }, { "name": "ServiceAccountUpdate", @@ -16592,23 +15287,23 @@ { "name": "role", "type": "UserRole | None", - "default": "None" + "line": 31 }, { "name": "is_active", "type": "bool | None", - "default": "None" + "line": 32 } ], - "line": 30, - "doc": "" + "line": 30 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/sync_failure.py", + "source": "backend/townlight_records/schemas/sync_failure.py", "sha256": "7d0f1052aba113868dc3439ef78b85b8d9941cf243eb7224ca12e1d9019f9971", + "bytes": 905, "routes": [], "models": [ { @@ -16620,66 +15315,65 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 9 }, { "name": "source_id", "type": "uuid.UUID", - "default": "" + "line": 10 }, { "name": "source_path", "type": "str", - "default": "" + "line": 11 }, { "name": "error_message", "type": "str | None", - "default": "" + "line": 12 }, { "name": "error_class", "type": "str | None", - "default": "" + "line": 13 }, { "name": "http_status_code", "type": "int | None", - "default": "" + "line": 14 }, { "name": "retry_count", "type": "int", - "default": "" + "line": 15 }, { "name": "status", "type": "str", - "default": "" + "line": 16 }, { "name": "first_failed_at", "type": "datetime", - "default": "" + "line": 17 }, { "name": "last_retried_at", "type": "datetime | None", - "default": "" + "line": 18 }, { "name": "dismissed_at", "type": "datetime | None", - "default": "" + "line": 19 }, { "name": "dismissed_by", "type": "uuid.UUID | None", - "default": "" + "line": 20 } ], - "line": 8, - "doc": "" + "line": 8 }, { "name": "SyncRunLogRead", @@ -16690,58 +15384,58 @@ { "name": "id", "type": "uuid.UUID", - "default": "" + "line": 25 }, { "name": "source_id", "type": "uuid.UUID", - "default": "" + "line": 26 }, { "name": "started_at", "type": "datetime", - "default": "" + "line": 27 }, { "name": "finished_at", "type": "datetime | None", - "default": "" + "line": 28 }, { "name": "status", "type": "str | None", - "default": "" + "line": 29 }, { "name": "records_attempted", "type": "int", - "default": "" + "line": 30 }, { "name": "records_succeeded", "type": "int", - "default": "" + "line": 31 }, { "name": "records_failed", "type": "int", - "default": "" + "line": 32 }, { "name": "error_summary", "type": "str | None", - "default": "" + "line": 33 } ], - "line": 24, - "doc": "" + "line": 24 } ], "configuration": [] }, { - "source": "installed-owned-source/app/schemas/user.py", - "sha256": "95cee0fce572e5c68f21453c6d2ae145f4a44a7aa9e3b7a3e1d6393eebf5bf06", + "source": "backend/townlight_records/schemas/user.py", + "sha256": "313f8c6927c142239ccfd22d5960378a77bb973a84e7c936052d4a77ae3507b5", + "bytes": 3200, "routes": [], "models": [ { @@ -16753,36 +15447,35 @@ { "name": "full_name", "type": "str", - "default": "" + "line": 11 }, { "name": "role", "type": "UserRole", - "default": "" + "line": 12 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 13 }, { "name": "last_login", "type": "datetime | None", - "default": "" + "line": 14 }, { "name": "must_change_password", "type": "bool", - "default": "False" + "line": 15 }, { "name": "department_id", "type": "uuid.UUID | None", - "default": "None" + "line": 16 } ], - "line": 10, - "doc": "" + "line": 10 }, { "name": "UserCreate", @@ -16793,16 +15486,15 @@ { "name": "full_name", "type": "str", - "default": "''" + "line": 36 }, { "name": "role", "type": "UserRole", - "default": "UserRole.PUBLIC" + "line": 37 } ], - "line": 19, - "doc": "Self-registration schema for the public ``/auth/register`` endpoint.\n\nRole is forced server-side, never honored from the request payload:\n* In ``PORTAL_MODE=public``: role \u2192 ``UserRole.PUBLIC`` (residents who\n register via the public surface get the minimal public role, never\n STAFF).\n* In ``PORTAL_MODE=private``: ``/auth/register`` is not mounted at all,\n so this schema is unreachable in private mode. The fallback value here\n matches the private-mode non-assignability posture (PUBLIC, not STAFF)\n \u2014 which also corrects a pre-existing bug where self-register was\n silently forced to STAFF regardless of caller intent.\n\nAdmin-driven user creation (including explicit STAFF/REVIEWER/LIAISON/\nREAD_ONLY assignments) goes through ``/admin/users`` via\n:class:`AdminUserCreate`." + "line": 19 }, { "name": "AdminUserCreate", @@ -16813,21 +15505,20 @@ { "name": "full_name", "type": "str", - "default": "''" + "line": 56 }, { "name": "role", "type": "UserRole", - "default": "UserRole.STAFF" + "line": 57 }, { "name": "department_id", "type": "uuid.UUID | None", - "default": "None" + "line": 58 } ], - "line": 54, - "doc": "Schema for admin-only user creation endpoint. Role IS caller-supplied." + "line": 54 }, { "name": "UserUpdate", @@ -16838,16 +15529,15 @@ { "name": "full_name", "type": "str | None", - "default": "None" + "line": 62 }, { "name": "role", "type": "UserRole | None", - "default": "None" + "line": 63 } ], - "line": 61, - "doc": "" + "line": 61 }, { "name": "UserSelfUpdate", @@ -16858,25 +15548,26 @@ { "name": "full_name", "type": "str | None", - "default": "None" + "line": 73 } ], - "line": 66, - "doc": "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}." + "line": 66 } ], "configuration": [] }, { - "source": "installed-owned-source/app/search/__init__.py", + "source": "backend/townlight_records/search/__init__.py", "sha256": "6d5a53e92963972bce100511001cfc78b65a347390a47b4273c0c62f7a88ccc9", + "bytes": 24, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/search/engine.py", - "sha256": "ff3c9ca2fba3293400ed1d5f4056e5a47a8673f443061b703abdace1e309d454", + "source": "backend/townlight_records/search/engine.py", + "sha256": "64f383a27cdafc56c200a352fa29dc9548fda0bbf61e1a45a67fb80f649d48ec", + "bytes": 5570, "routes": [], "models": [ { @@ -16886,12682 +15577,12607 @@ { "name": "chunk_id", "type": "uuid.UUID", - "default": "" + "line": 14 }, { "name": "document_id", "type": "uuid.UUID", - "default": "" + "line": 15 }, { "name": "filename", "type": "str", - "default": "" + "line": 16 }, { "name": "file_type", "type": "str", - "default": "" + "line": 17 }, { "name": "source_path", "type": "str", - "default": "" + "line": 18 }, { "name": "page_number", "type": "int | None", - "default": "" + "line": 19 }, { "name": "content_text", "type": "str", - "default": "" + "line": 20 }, { "name": "similarity_score", "type": "float", - "default": "" + "line": 21 }, { "name": "rank", "type": "int", - "default": "" + "line": 22 } ], - "line": 13, - "doc": "" + "line": 13 } ], "configuration": [] }, { - "source": "installed-owned-source/app/search/router.py", - "sha256": "904441f2323a86199c42d647e5935c4f78bbb973c5c20a9b35e1bcc929691891", + "source": "backend/townlight_records/search/router.py", + "sha256": "52942b33b4869a3c22ed9417723e1854a69161bf4dbaa4deeeaaad16cdd4eb65", + "bytes": 10957, "routes": [ { "method": "POST", - "path": "/search/query", - "router": "router", - "prefix_resolved": true, - "name": "execute_search", - "signature": "req: SearchRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.LIAISON))", - "returns": "", - "line": 28, - "doc": "Execute a hybrid search query. Optionally synthesize an LLM answer.", - "decorator": "router.post('/query', response_model=SearchResponse)", - "errors": [ - "HTTPException(status_code=404, detail='Search session not found')" - ] + "declared_path": "/query", + "function": "execute_search", + "line": 28 }, { "method": "GET", - "path": "/search/sessions", - "router": "router", - "prefix_resolved": true, - "name": "list_sessions", - "signature": "limit: int=20, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 141, - "doc": "List the current user's search sessions.", - "decorator": "router.get('/sessions', response_model=list[SearchSessionRead])", - "errors": [] + "declared_path": "/sessions", + "function": "list_sessions", + "line": 141 }, { "method": "GET", - "path": "/search/sessions/{session_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_session", - "signature": "session_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 191, - "doc": "Get a search session with its query history.", - "decorator": "router.get('/sessions/{session_id}', response_model=SearchSessionRead)", - "errors": [ - "HTTPException(status_code=404, detail='Search session not found')" - ] + "declared_path": "/sessions/{session_id}", + "function": "get_session", + "line": 191 }, { "method": "GET", - "path": "/search/filters", - "router": "router", - "prefix_resolved": true, - "name": "get_filter_options", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 226, - "doc": "Get available filter values for search.", - "decorator": "router.get('/filters', response_model=SearchFilterOptions)", - "errors": [] + "declared_path": "/filters", + "function": "get_filter_options", + "line": 226 }, { "method": "GET", - "path": "/search/export", - "router": "router", - "prefix_resolved": true, - "name": "export_search_results", - "signature": "query: str, format: str='csv', department_id: str | None=None, file_type: str | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", - "returns": "", - "line": 270, - "doc": "Export search results as CSV. Runs a search and streams the results.", - "decorator": "router.get('/export')", - "errors": [] + "declared_path": "/export", + "function": "export_search_results", + "line": 270 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/search/synthesizer.py", - "sha256": "427e73f0cf9752fb347f7769751e7e14a522fcc6bebeb1b785440ad0f5b7e254", + "source": "backend/townlight_records/search/synthesizer.py", + "sha256": "a29ee927d6f8edf0cab05acd4d3dd523455e2eabd6f500af164d31e0372f73f8", + "bytes": 1908, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/security/__init__.py", + "source": "backend/townlight_records/security/__init__.py", "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/security/at_rest.py", - "sha256": "ae75ffc5d633a6d99180bb61e0d01f2084af917565f67cfc5a5ab1d0a055b554", + "source": "backend/townlight_records/security/at_rest.py", + "sha256": "63ecb19f92893043fd7ee5619a8ef86a8f37642cd009f4660288e9ef4f2852dd", + "bytes": 1021, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/security/host_validator.py", - "sha256": "2890b06c3440118166ca36640d0d7d06b81224eb3e540e021721712fe3c967a8", + "source": "backend/townlight_records/security/host_validator.py", + "sha256": "dd87585491ae8c118c2cd80127a297bc28e60e9015fd573251af393566b1320e", + "bytes": 710, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/seed/__init__.py", - "sha256": "94373caf66af4bff649d9b77dee25b4a9f03f57ba8cc507c02f889baa1d48575", + "source": "backend/townlight_records/seed/__init__.py", + "sha256": "bcc25a55282ceffdac66ff70179d6a3dd07cb4333c89d568f98cc2204321e1b0", + "bytes": 317, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/seed/first_boot.py", - "sha256": "88b0f011853f6f60f7d488bfebe0dde96209a8d3243a08b731e4a6f682bab40b", + "source": "backend/townlight_records/seed/first_boot.py", + "sha256": "40b50e2e4b7f6d90f4ca2ad8fc753e4e2cf32a72b74580136ee570a5d19369ac", + "bytes": 9964, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/service_accounts/__init__.py", - "sha256": "724c131242497b5d06cb96ed27573bdd2de4f098babe79129e6f1e20d9a5b76b", + "source": "backend/townlight_records/service_accounts/__init__.py", + "sha256": "2fa2428653459da5eb92239760502d74190c9183dcade5b408ec89f25bdcc040", + "bytes": 130, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/service_accounts/router.py", - "sha256": "c6632fc265846154c9a537070390de2c47c3d2d92c78e6fb8fb352f32ad3bf30", + "source": "backend/townlight_records/service_accounts/router.py", + "sha256": "a23f0364a75cfe413b75afc99825023a5e04649bc59f0be8c722da33da7046a3", + "bytes": 3582, "routes": [ { "method": "POST", - "path": "/service-accounts/", - "router": "router", - "prefix_resolved": true, - "name": "create_service_account", - "signature": "data: ServiceAccountCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 29, - "doc": "", - "decorator": "router.post('/', response_model=ServiceAccountCreated, status_code=201)", - "errors": [ - "HTTPException(status_code=409, detail='Name already taken')" - ] + "declared_path": "/", + "function": "create_service_account", + "line": 29 }, { "method": "GET", - "path": "/service-accounts/", - "router": "router", - "prefix_resolved": true, - "name": "list_service_accounts", - "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 72, - "doc": "", - "decorator": "router.get('/', response_model=list[ServiceAccountRead])", - "errors": [] + "declared_path": "/", + "function": "list_service_accounts", + "line": 72 }, { "method": "PATCH", - "path": "/service-accounts/{account_id}", - "router": "router", - "prefix_resolved": true, - "name": "update_service_account", - "signature": "account_id: uuid.UUID, data: ServiceAccountUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", - "returns": "", - "line": 81, - "doc": "", - "decorator": "router.patch('/{account_id}', response_model=ServiceAccountRead)", - "errors": [ - "HTTPException(status_code=404, detail='Service account not found')" - ] + "declared_path": "/{account_id}", + "function": "update_service_account", + "line": 81 } ], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/worker.py", - "sha256": "6b33f496ba32184cc049e6cc5c6398c2e42f1b30c51bea52ae67e768da880829", + "source": "backend/townlight_records/worker.py", + "sha256": "f87595f97cbc50b71ec7f8bbef0733410688b739f5e3fe842212ac9ea4fd4053", + "bytes": 700, "routes": [], "models": [], "configuration": [] } - ], - "bridge": [ - { - "source": "installed-owned-source/app/desktop_bridge/__init__.py", - "sha256": "707138dfa41f7f4e91957a523e3c3394ce52803778c5b278b3cc77d4a5b1c30f", - "routes": [], - "models": [], - "configuration": [] - }, + ] + }, + "meetings": { + "repository": "townlight/meetings", + "repository_head": "581ca739e03e7a4d1161cd8c5edf1d36115f9ee6", + "working_tree_modified": true, + "principal_import": "townlight_meetings", + "source": [ { - "source": "installed-owned-source/app/desktop_bridge/projection.py", - "sha256": "5267b17ae6be18258ea0e225ffb0d53c56aeaf674d9426856b8db804f801008c", + "source": "townlight_meetings/__init__.py", + "sha256": "8222ea6324b101351522144baf63d9cf9359781fe8da2a5b591cc84da16846f5", + "bytes": 68, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/app/desktop_bridge/records.py", - "sha256": "407b2ca9974caa761c00daee3b585ca915c2fe649a69a0dd58f42342b39821d1", + "source": "townlight_meetings/agenda_intake.py", + "sha256": "1f7832c7036b2563762bec042f226c5e0abe69d5f02e34fd7de141813b6f85fa", + "bytes": 11673, "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/app/desktop_bridge/router.py", - "sha256": "7c02e0a222c36aecb84b105a918309a811f40249c3f55756d87cfa2646c4ef1b", - "routes": [ - { - "method": "GET", - "path": "/desktop/v1/public/records-state", - "router": "router", - "prefix_resolved": true, - "name": "public_records_state", - "signature": "request: Request, session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 134, - "doc": "", - "decorator": "router.get('/public/records-state', dependencies=[Depends(native_public_shell)], response_model=RecordsStateRead)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/public/requests", - "router": "router", - "prefix_resolved": true, - "name": "public_records_intake", - "signature": "data: PublicIntake, request: Request, session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 144, - "doc": "", - "decorator": "router.post('/public/requests', dependencies=[Depends(native_public_shell)])", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/public/lookup", - "router": "router", - "prefix_resolved": true, - "name": "public_records_lookup", - "signature": "data: PublicLookup, request: Request, session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 153, - "doc": "", - "decorator": "router.post('/public/lookup', dependencies=[Depends(native_public_shell)])", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/public/messages", - "router": "router", - "prefix_resolved": true, - "name": "public_records_message", - "signature": "data: PublicMessage, request: Request, session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 160, - "doc": "", - "decorator": "router.post('/public/messages', dependencies=[Depends(native_public_shell)])", - "errors": [ - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/permitting-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_permitting_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 204, - "doc": "", - "decorator": "router.post('/permitting-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/permitting-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_permitting_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 213, - "doc": "", - "decorator": "router.post('/requests/{request_id}/permitting-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Reviewed Permitting copy not found or no longer permitted.')", - "HTTPException(409, 'Permitting source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_inspections_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 239, - "doc": "", - "decorator": "router.post('/inspections-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/inspections-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_inspections_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 248, - "doc": "", - "decorator": "router.post('/requests/{request_id}/inspections-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Reviewed Inspections copy not found or no longer permitted.')", - "HTTPException(409, 'Inspections source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/planning-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_planning_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 274, - "doc": "", - "decorator": "router.post('/planning-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/planning-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_planning_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 283, - "doc": "", - "decorator": "router.post('/requests/{request_id}/planning-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Permitted Planning source not found.')", - "HTTPException(409, 'Planning source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_zoning_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 310, - "doc": "", - "decorator": "router.post('/zoning-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/zoning-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_zoning_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 319, - "doc": "", - "decorator": "router.post('/requests/{request_id}/zoning-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Permitted Zoning source not found.')", - "HTTPException(409, 'Zoning source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/records-state", - "router": "router", - "prefix_resolved": true, - "name": "get_native_records_state", - "signature": "session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 346, - "doc": "", - "decorator": "router.get('/records-state', response_model=RecordsStateRead)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_meetings_sources", - "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 355, - "doc": "", - "decorator": "router.post('/meetings-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/meetings-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_meetings_source", - "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 364, - "doc": "", - "decorator": "router.post('/requests/{request_id}/meetings-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Permitted Meetings source not found.')", - "HTTPException(409, 'Meetings source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/code-sources/search", - "router": "router", - "prefix_resolved": true, - "name": "search_code_sources", - "signature": "data: CodeSearch, request: Request, actor: User=Depends(native_records_user)", - "returns": "", - "line": 389, - "doc": "", - "decorator": "router.post('/code-sources/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/code-sources", - "router": "router", - "prefix_resolved": true, - "name": "attach_code_source", - "signature": "request_id: uuid.UUID, data: CodeSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 398, - "doc": "", - "decorator": "router.post('/requests/{request_id}/code-sources', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(404, 'Permitted Code source not found.')", - "HTTPException(409, 'Code source changed; search again before attaching.')", - "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/notifications/{notification_id}/sent", - "router": "router", - "prefix_resolved": true, - "name": "mark_native_notification_sent", - "signature": "notification_id: uuid.UUID, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 423, - "doc": "", - "decorator": "router.post('/notifications/{notification_id}/sent', response_model=RecordsStateRead)", - "errors": [ - "HTTPException(404, 'Records notification not found.')", - "HTTPException(400, 'This local notification is already marked sent.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/documents", - "router": "router", - "prefix_resolved": true, - "name": "attach_native_document", - "signature": "request_id: uuid.UUID, data: AttachDocument, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 443, - "doc": "", - "decorator": "router.post('/requests/{request_id}/documents', response_model=RecordsOperationRead)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/documents/{attachment_id}/release-copy", - "router": "router", - "prefix_resolved": true, - "name": "attach_native_release_copy", - "signature": "request_id: uuid.UUID, attachment_id: uuid.UUID, data: AttachReleaseCopy, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 453, - "doc": "", - "decorator": "router.post('/requests/{request_id}/documents/{attachment_id}/release-copy', response_model=RecordsOperationRead)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/artifacts", - "router": "router", - "prefix_resolved": true, - "name": "prepare_native_artifact", - "signature": "request_id: uuid.UUID, data: PrepareArtifact, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 463, - "doc": "", - "decorator": "router.post('/requests/{request_id}/artifacts', response_model=ArtifactPlan)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/artifacts/{artifact_id}/complete", - "router": "router", - "prefix_resolved": true, - "name": "complete_native_artifact", - "signature": "request_id: uuid.UUID, artifact_id: uuid.UUID, data: CompleteArtifact, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 481, - "doc": "", - "decorator": "router.post('/requests/{request_id}/artifacts/{artifact_id}/complete', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests", - "router": "router", - "prefix_resolved": true, - "name": "create_native_request", - "signature": "data: StaffRecordsIntake, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 500, - "doc": "", - "decorator": "router.post('/requests', response_model=NativeRequestRead, status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/requests/{request_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_native_request", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 521, - "doc": "", - "decorator": "router.get('/requests/{request_id}', response_model=NativeRequestRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/requests/{request_id}/view", - "router": "router", - "prefix_resolved": true, - "name": "get_native_request_view", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 537, - "doc": "", - "decorator": "router.get('/requests/{request_id}/view', response_model=RecordsView)", - "errors": [ - "HTTPException(404, 'Records request not found.')" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/requests/{request_id}/draft-context", - "router": "router", - "prefix_resolved": true, - "name": "native_draft_context", - "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 549, - "doc": "", - "decorator": "router.get('/requests/{request_id}/draft-context')", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/generated-draft", - "router": "router", - "prefix_resolved": true, - "name": "native_generated_draft", - "signature": "request_id: uuid.UUID, data: GeneratedDraft, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 575, - "doc": "", - "decorator": "router.post('/requests/{request_id}/generated-draft', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(409, 'The draft changed during generation. Refresh before generating again.')", - "HTTPException(400, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/requests/{request_id}/actions", - "router": "router", - "prefix_resolved": true, - "name": "native_request_operation", - "signature": "request_id: uuid.UUID, command: RecordsCommand, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", - "returns": "", - "line": 605, - "doc": "", - "decorator": "router.post('/requests/{request_id}/actions', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found.')", - "HTTPException(400, str(error))" - ] - } - ], "models": [ { - "name": "MeetingsSearch", - "bases": [ - "BaseModel" - ], + "name": "AgendaIntakeItem", + "bases": [], "fields": [ { - "name": "query", + "name": "id", "type": "str", - "default": "Field(min_length=1, max_length=500)" - } - ], - "line": 38, - "doc": "" - }, - { - "name": "MeetingsSourceSelection", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 54 + }, { - "name": "source_id", + "name": "title", "type": "str", - "default": "Field(min_length=1, max_length=200)" + "line": 55 }, { - "name": "expected_sha256", + "name": "department_name", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" - } - ], - "line": 43, - "doc": "" - }, - { - "name": "CodeSearch", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 56 + }, { - "name": "query", + "name": "submitted_by", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 57 }, { - "name": "as_of", - "type": "date | None", - "default": "None" - } - ], - "line": 49, - "doc": "" - }, - { - "name": "CodeSourceSelection", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "summary", + "type": "str", + "line": 58 + }, { - "name": "source_id", + "name": "status", "type": "str", - "default": "Field(min_length=1, max_length=200)" + "line": 59 }, { - "name": "expected_sha256", + "name": "readiness_status", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 60 }, { - "name": "as_of", - "type": "date | None", - "default": "None" + "name": "source_references", + "type": "list[dict]", + "line": 61 + }, + { + "name": "reviewer", + "type": "str | None", + "line": 62 + }, + { + "name": "review_notes", + "type": "str | None", + "line": 63 + }, + { + "name": "promoted_agenda_item_id", + "type": "str | None", + "line": 64 + }, + { + "name": "promoted_at", + "type": "datetime | None", + "line": 65 + }, + { + "name": "promotion_audit_hash", + "type": "str | None", + "line": 66 + }, + { + "name": "last_audit_hash", + "type": "str", + "line": 67 + }, + { + "name": "created_at", + "type": "datetime", + "line": 68 + }, + { + "name": "updated_at", + "type": "datetime", + "line": 69 } ], - "line": 55, - "doc": "" + "line": 51 } ], "configuration": [] }, { - "source": "installed-owned-source/app/desktop_bridge/schemas.py", - "sha256": "753dd5474d532912bc50118fe9add74613cbc3b17a062dd93681309ac590926d", + "source": "townlight_meetings/agenda_lifecycle.py", + "sha256": "aae33ddd60b2d18abfdc7cb83ab5eef396b68c882676da3e2fe0eb74d41f23a2", + "bytes": 16632, "routes": [], "models": [ { - "name": "StaffRecordsIntake", - "bases": [ - "BaseModel" - ], + "name": "TransitionResult", + "bases": [], "fields": [ { - "name": "requester", - "type": "str", - "default": "Field(min_length=1)" + "name": "allowed", + "type": "bool", + "line": 40 }, { - "name": "summary", - "type": "str", - "default": "Field(min_length=1)" + "name": "http_status", + "type": "int", + "line": 41 }, { - "name": "deadline", + "name": "message", "type": "str", - "default": "" + "line": 42 }, { - "name": "deadlineBasis", + "name": "fix", "type": "str", - "default": "''" + "line": 43 + }, + { + "name": "audit_entry", + "type": "dict[str, object]", + "line": 44 } ], - "line": 10, - "doc": "Existing native create-records-request input; no caller-supplied actor." + "line": 39 }, { - "name": "NativeRequestRead", - "bases": [ - "RequestRead" - ], + "name": "AgendaItemRecord", + "bases": [], "fields": [ { - "name": "desktop_id", - "type": "str | None", - "default": "" + "name": "id", + "type": "str", + "line": 49 }, { - "name": "public_tracking_number", - "type": "str | None", - "default": "" + "name": "title", + "type": "str", + "line": 50 }, { - "name": "submitted_via", + "name": "department_name", "type": "str", - "default": "" + "line": 51 }, { - "name": "deadline_label", + "name": "status", "type": "str", - "default": "" + "line": 52 }, { - "name": "deadline_basis", - "type": "str", - "default": "" + "name": "audit_entries", + "type": "list[dict[str, object]]", + "line": 53 }, { - "name": "deadline_reviewed_at", - "type": "datetime | None", - "default": "" + "name": "meeting_id", + "type": "str | None", + "line": 54 } ], - "line": 28, - "doc": "" - }, + "line": 48 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/cc7_completeness.py", + "sha256": "01318cfddf4cd5a50515e5243299625c6f88c7cfdf39c4f798fa03f68049ac49", + "bytes": 6539, + "routes": [], + "models": [ { - "name": "AssignmentPayload", - "bases": [ - "NativePayload" - ], + "name": "ApiCategory", + "bases": [], "fields": [ { - "name": "assignedTo", + "name": "id", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 41, - "doc": "" - }, - { - "name": "DeadlinePayload", - "bases": [ - "NativePayload" - ], - "fields": [ + "line": 13 + }, { - "name": "deadline", + "name": "label", "type": "str", - "default": "" + "line": 14 }, { - "name": "deadlineBasis", + "name": "paths", + "type": "tuple[str, ...]", + "line": 15 + }, + { + "name": "protected", + "type": "bool", + "line": 16 + }, + { + "name": "auth_scope", "type": "str", - "default": "Field(min_length=1)" + "line": 17 } ], - "line": 45, - "doc": "" + "line": 12 }, { - "name": "CalculateDeadlinePayload", - "bases": [ - "NativePayload" - ], + "name": "FrontendPage", + "bases": [], "fields": [ { - "name": "deadlineReceivedDate", - "type": "str", - "default": "" - }, - { - "name": "deadlineRuleName", + "name": "id", "type": "str", - "default": "Field(min_length=1)" + "line": 22 }, { - "name": "deadlineDayCount", + "name": "label", "type": "str", - "default": "" + "line": 23 }, { - "name": "deadlineDayType", + "name": "surface", "type": "str", - "default": "" + "line": 24 }, { - "name": "deadlineBasis", - "type": "str", - "default": "Field(min_length=1)" + "name": "evidence_states", + "type": "tuple[str, ...]", + "line": 25 } ], - "line": 52, - "doc": "" - }, + "line": 21 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/connector_import_sync.py", + "sha256": "97fa12b052cd8eab7e337a3ddfb945677d7c6345f2a9cd7a2152509183afc0f0", + "bytes": 4664, + "routes": [], + "models": [ { - "name": "ClarificationPayload", - "bases": [ - "NativePayload" - ], + "name": "ImportAttempt", + "bases": [], "fields": [ { - "name": "clarificationNote", + "name": "connector", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 77, - "doc": "" - }, - { - "name": "MessagePayload", - "bases": [ - "NativePayload" - ], - "fields": [ + "line": 15 + }, { - "name": "requestMessageBody", - "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 81, - "doc": "" - }, - { - "name": "SearchNotePayload", - "bases": [ - "NativePayload" - ], - "fields": [ + "name": "payload_path", + "type": "Path", + "line": 16 + }, { - "name": "sourceNote", + "name": "ok", + "type": "bool", + "line": 17 + }, + { + "name": "message", "type": "str", - "default": "Field(min_length=1)" + "line": 18 }, { - "name": "citation", + "name": "fix", "type": "str", - "default": "''" + "line": 19 + }, + { + "name": "normalized", + "type": "dict[str, Any] | None", + "line": 20 } ], - "line": 85, - "doc": "" - }, + "line": 14 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/connectors.py", + "sha256": "0e2e3b30400b2dda8d7d216a4396634efbdabbfa76f64adcda7d003beaf94af5", + "bytes": 570, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/demo_seed.py", + "sha256": "cfae73282a8bf76ee27b79693a724d383afef9617e590189b5678a92c01809a3", + "bytes": 15324, + "routes": [], + "models": [ { - "name": "SearchReceiptPayload", + "name": "DemoSeedSummary", "bases": [ - "NativePayload" + "TypedDict" ], "fields": [ { - "name": "searchQuery", + "name": "city", "type": "str", - "default": "Field(min_length=1)" + "line": 38 }, { - "name": "searchLocations", - "type": "str", - "default": "Field(min_length=1)" + "name": "meeting_body_count", + "type": "int", + "line": 39 }, { - "name": "searchResultTitle", - "type": "str", - "default": "Field(min_length=1)" + "name": "meeting_count", + "type": "int", + "line": 40 }, { - "name": "searchResultCitation", - "type": "str", - "default": "Field(min_length=1)" + "name": "agenda_intake_count", + "type": "int", + "line": 41 }, { - "name": "searchResultSummary", - "type": "str", - "default": "Field(min_length=1)" + "name": "packet_count", + "type": "int", + "line": 42 }, { - "name": "searchResultStatus", - "type": "str", - "default": "''" + "name": "notice_count", + "type": "int", + "line": 43 }, { - "name": "searchReviewer", - "type": "str", - "default": "''" - } - ], - "line": 90, - "doc": "" - }, - { - "name": "ExemptionNotePayload", - "bases": [ - "NativePayload" - ], - "fields": [ + "name": "motion_count", + "type": "int", + "line": 44 + }, { - "name": "exemptionNote", + "name": "minutes_draft_count", + "type": "int", + "line": 45 + }, + { + "name": "public_record_count", + "type": "int", + "line": 46 + }, + { + "name": "primary_meeting_id", "type": "str", - "default": "Field(min_length=1)" + "line": 47 } ], - "line": 100, - "doc": "" - }, + "line": 35 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/desktop_delivery.py", + "sha256": "88a1c62a24a3e6d16b3ade8d2f4f6f0fcc9c9efd6eeee316651f2d76f496a0cd", + "bytes": 5156, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/integration_contracts.py", + "sha256": "1d674363f0d07151c19594f8f2fbaa25997a35cad27749508b744238a5e838dc", + "bytes": 16241, + "routes": [], + "models": [ { - "name": "ExemptionDecisionPayload", - "bases": [ - "NativePayload" - ], + "name": "IntegrationCheck", + "bases": [], "fields": [ { - "name": "exemptionSource", - "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "exemptionKind", + "name": "contract_id", "type": "str", - "default": "Field(min_length=1)" + "line": 20 }, { - "name": "exemptionFinding", + "name": "scenario", "type": "str", - "default": "Field(min_length=1)" + "line": 21 }, { - "name": "exemptionDecision", - "type": "Literal['release', 'redact', 'exempt']", - "default": "" + "name": "ok", + "type": "bool", + "line": 22 }, { - "name": "exemptionBasis", + "name": "message", "type": "str", - "default": "Field(min_length=1)" + "line": 23 }, { - "name": "exemptionReviewer", + "name": "fix", "type": "str", - "default": "''" + "line": 24 } ], - "line": 104, - "doc": "" + "line": 17 }, { - "name": "FeeEstimatePayload", - "bases": [ - "NativePayload" - ], + "name": "IntegrationContract", + "bases": [], "fields": [ { - "name": "feeEstimate", + "name": "id", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 118, - "doc": "" - }, - { - "name": "FeeLinePayload", - "bases": [ - "NativePayload" - ], - "fields": [ + "line": 40 + }, { - "name": "feeLineDescription", + "name": "label", "type": "str", - "default": "Field(min_length=1)" + "line": 41 }, { - "name": "feeScheduleBasis", - "type": "str", - "default": "Field(min_length=1)" + "name": "status", + "type": "IntegrationStatus", + "line": 42 }, { - "name": "feeLineAmount", + "name": "mode", "type": "str", - "default": "" - } - ], - "line": 122, - "doc": "" - }, - { - "name": "FeeWaiverPayload", - "bases": [ - "NativePayload" - ], - "fields": [ + "line": 43 + }, { - "name": "feeWaiverReason", - "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 140, - "doc": "" - }, - { - "name": "DraftPayload", - "bases": [ - "NativePayload" - ], - "fields": [ + "name": "proof_model", + "type": "Literal['live_wire_validation', 'in_process_boundary_validation']", + "line": 44 + }, { - "name": "responseDraft", - "type": "str", - "default": "Field(min_length=1)" + "name": "dependent_module_required", + "type": "bool", + "line": 45 }, { - "name": "citation", - "type": "str", - "default": "''" - } - ], - "line": 144, - "doc": "" - }, - { - "name": "ApprovalPayload", - "bases": [ - "NativePayload" - ], - "fields": [ + "name": "network_calls", + "type": "bool", + "line": 46 + }, { - "name": "approvalNote", + "name": "contract_artifact", "type": "str", - "default": "''" - } - ], - "line": 149, - "doc": "" - }, - { - "name": "AssignCommand", - "bases": [ - "NativePayload" - ], - "fields": [ + "line": 47 + }, { - "name": "action", - "type": "Literal['assign-records-request']", - "default": "" + "name": "supported_operations", + "type": "tuple[str, ...]", + "line": 48 }, { - "name": "payload", - "type": "AssignmentPayload", - "default": "" - } - ], - "line": 153, - "doc": "" - }, - { - "name": "DeadlineCommand", - "bases": [ - "NativePayload" - ], - "fields": [ + "name": "absent_dependency_behavior", + "type": "str", + "line": 49 + }, { - "name": "action", - "type": "Literal['set-records-deadline']", - "default": "" + "name": "operator_fix", + "type": "str", + "line": 50 }, { - "name": "payload", - "type": "DeadlinePayload", - "default": "" + "name": "adversarial_scenarios", + "type": "tuple[str, ...]", + "line": 51 } ], - "line": 158, - "doc": "" + "line": 37 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/main.py", + "sha256": "411f2e69ac62e75e1b680ed7fd2954b159f6d0db1919da6ccceae9b646fdcb09", + "bytes": 148590, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 492 }, { - "name": "CalculateDeadlineCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['calculate-records-deadline']", - "default": "" - }, - { - "name": "payload", - "type": "CalculateDeadlinePayload", - "default": "" - } - ], - "line": 163, - "doc": "" + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 550 }, { - "name": "ClarificationCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['request-records-clarification']", - "default": "" - }, - { - "name": "payload", - "type": "ClarificationPayload", - "default": "" - } - ], - "line": 168, - "doc": "" + "method": "GET", + "declared_path": "/favicon.ico", + "function": "favicon", + "line": 561 }, { - "name": "MessageCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['add-records-message']", - "default": "" - }, - { - "name": "payload", - "type": "MessagePayload", - "default": "" - } - ], - "line": 173, - "doc": "" + "method": "GET", + "declared_path": "/staff", + "function": "staff_dashboard", + "line": 567 }, { - "name": "SearchNoteCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['record-records-search']", - "default": "" - }, - { - "name": "payload", - "type": "SearchNotePayload", - "default": "" - } - ], - "line": 178, - "doc": "" + "method": "GET", + "declared_path": "/public", + "function": "public_portal", + "line": 617 }, { - "name": "SearchReceiptCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['record-records-search-session']", - "default": "" - }, - { - "name": "payload", - "type": "SearchReceiptPayload", - "default": "" - } - ], - "line": 183, - "doc": "" + "method": "GET", + "declared_path": "/staff/session", + "function": "staff_session", + "line": 623 }, { - "name": "ExemptionNoteCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['add-records-exemption-review']", - "default": "" - }, - { - "name": "payload", - "type": "ExemptionNotePayload", - "default": "" - } - ], - "line": 188, - "doc": "" + "method": "GET", + "declared_path": "/staff/login", + "function": "staff_login", + "line": 705 }, { - "name": "ExemptionDecisionCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['add-records-exemption-decision']", - "default": "" - }, - { - "name": "payload", - "type": "ExemptionDecisionPayload", - "default": "" - } - ], - "line": 193, - "doc": "" + "method": "GET", + "declared_path": "/staff/oidc/callback", + "function": "staff_oidc_callback", + "line": 763 }, { - "name": "FeeEstimateCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['estimate-records-fee']", - "default": "" - }, - { - "name": "payload", - "type": "FeeEstimatePayload", - "default": "" - } - ], - "line": 198, - "doc": "" + "method": "GET", + "declared_path": "/staff/logout", + "function": "staff_logout", + "line": 861 }, { - "name": "FeeLineCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['add-records-fee-line']", - "default": "" - }, - { - "name": "payload", - "type": "FeeLinePayload", - "default": "" - } - ], - "line": 203, - "doc": "" + "method": "POST", + "declared_path": "/staff/logout", + "function": "staff_logout", + "line": 861 }, { - "name": "FeeWaiverCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['waive-records-fee']", - "default": "" - }, - { - "name": "payload", - "type": "FeeWaiverPayload", - "default": "" - } - ], - "line": 208, - "doc": "" + "method": "GET", + "declared_path": "/staff/auth-readiness", + "function": "staff_auth_readiness", + "line": 873 }, { - "name": "DraftCommand", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "action", - "type": "Literal['draft-records-response']", - "default": "" - }, - { - "name": "payload", - "type": "DraftPayload", - "default": "" - } - ], - "line": 213, - "doc": "" + "method": "GET", + "declared_path": "/admin/config", + "function": "admin_config", + "line": 935 }, { - "name": "ApprovalCommand", - "bases": [ - "NativePayload" + "method": "GET", + "declared_path": "/integrations/readiness", + "function": "integrations_readiness", + "line": 968 + }, + { + "method": "GET", + "declared_path": "/admin/prompts", + "function": "admin_prompts", + "line": 975 + }, + { + "method": "POST", + "declared_path": "/agenda-items", + "function": "create_agenda_item", + "line": 1009 + }, + { + "method": "GET", + "declared_path": "/agenda-items/{item_id}", + "function": "get_agenda_item", + "line": 1018 + }, + { + "method": "POST", + "declared_path": "/agenda-items/{item_id}/transitions", + "function": "transition_agenda_item", + "line": 1027 + }, + { + "method": "GET", + "declared_path": "/agenda-items/{item_id}/audit", + "function": "get_agenda_item_audit", + "line": 1058 + }, + { + "method": "POST", + "declared_path": "/agenda-intake", + "function": "submit_agenda_intake_item", + "line": 1067 + }, + { + "method": "GET", + "declared_path": "/agenda-intake", + "function": "list_agenda_intake_items", + "line": 1080 + }, + { + "method": "POST", + "declared_path": "/agenda-intake/{item_id}/review", + "function": "review_agenda_intake_item", + "line": 1093 + }, + { + "method": "POST", + "declared_path": "/agenda-intake/{item_id}/promote", + "function": "promote_agenda_intake_item", + "line": 1116 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/staff-reports", + "function": "create_staff_report", + "line": 1193 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/staff-reports", + "function": "list_staff_reports", + "line": 1222 + }, + { + "method": "POST", + "declared_path": "/meeting-bodies", + "function": "create_meeting_body", + "line": 1246 + }, + { + "method": "GET", + "declared_path": "/meeting-bodies", + "function": "list_meeting_bodies", + "line": 1257 + }, + { + "method": "GET", + "declared_path": "/meeting-bodies/{body_id}", + "function": "get_meeting_body", + "line": 1268 + }, + { + "method": "PATCH", + "declared_path": "/meeting-bodies/{body_id}", + "function": "update_meeting_body", + "line": 1278 + }, + { + "method": "DELETE", + "declared_path": "/meeting-bodies/{body_id}", + "function": "deactivate_meeting_body", + "line": 1296 + }, + { + "method": "POST", + "declared_path": "/meetings", + "function": "create_meeting", + "line": 1306 + }, + { + "method": "GET", + "declared_path": "/meetings", + "function": "list_meetings", + "line": 1322 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}", + "function": "get_meeting", + "line": 1329 + }, + { + "method": "PATCH", + "declared_path": "/meetings/{meeting_id}", + "function": "update_meeting_schedule", + "line": 1338 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/transitions", + "function": "transition_meeting", + "line": 1391 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/audit", + "function": "get_meeting_audit", + "line": 1424 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/packet-snapshots", + "function": "create_packet_snapshot", + "line": 1433 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/packet-snapshots", + "function": "list_packet_snapshots", + "line": 1449 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/packet-assemblies", + "function": "create_packet_assembly_record", + "line": 1463 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/packet-assemblies", + "function": "list_packet_assembly_records", + "line": 1489 + }, + { + "method": "POST", + "declared_path": "/packet-assemblies/{record_id}/finalize", + "function": "finalize_packet_assembly_record", + "line": 1503 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/export-bundle", + "function": "create_packet_export_bundle", + "line": 1524 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/notices/check", + "function": "check_notice_compliance", + "line": 1559 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/notice-checklists", + "function": "create_notice_checklist_record", + "line": 1577 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/notice-checklists", + "function": "list_notice_checklist_records", + "line": 1599 + }, + { + "method": "POST", + "declared_path": "/notice-checklists/{record_id}/posting-proof", + "function": "attach_notice_posting_proof", + "line": 1613 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/notices/post", + "function": "post_notice", + "line": 1635 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/motions", + "function": "capture_motion", + "line": 1653 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/motions", + "function": "list_motions", + "line": 1668 + }, + { + "method": "PUT", + "declared_path": "/motions/{motion_id}", + "function": "reject_motion_mutation", + "line": 1683 + }, + { + "method": "PATCH", + "declared_path": "/motions/{motion_id}", + "function": "reject_motion_mutation", + "line": 1683 + }, + { + "method": "POST", + "declared_path": "/motions/{motion_id}/corrections", + "function": "correct_motion", + "line": 1697 + }, + { + "method": "POST", + "declared_path": "/motions/{motion_id}/votes", + "function": "capture_vote", + "line": 1711 + }, + { + "method": "GET", + "declared_path": "/motions/{motion_id}/votes", + "function": "list_votes", + "line": 1728 + }, + { + "method": "PUT", + "declared_path": "/votes/{vote_id}", + "function": "reject_vote_mutation", + "line": 1743 + }, + { + "method": "PATCH", + "declared_path": "/votes/{vote_id}", + "function": "reject_vote_mutation", + "line": 1743 + }, + { + "method": "POST", + "declared_path": "/votes/{vote_id}/corrections", + "function": "correct_vote", + "line": 1757 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/action-items", + "function": "create_action_item", + "line": 1771 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/action-items", + "function": "list_action_items", + "line": 1809 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/ordinance-resolution-handoff", + "function": "create_ordinance_resolution_handoff", + "line": 2063 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/ordinance-resolution-handoff", + "function": "list_ordinance_resolution_handoffs", + "line": 2112 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/ordinance-resolution-handoff/retry", + "function": "retry_ordinance_resolution_handoff", + "line": 2125 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/minutes/drafts", + "function": "create_minutes_draft", + "line": 2159 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/minutes/ai-assist", + "function": "create_minutes_ai_assist", + "line": 2197 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/minutes/drafts", + "function": "list_minutes_drafts", + "line": 2243 + }, + { + "method": "POST", + "declared_path": "/minutes/{minute_id}/post", + "function": "reject_automatic_minutes_posting", + "line": 2257 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/transcripts", + "function": "create_transcript_record", + "line": 2271 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/transcripts", + "function": "list_transcript_records", + "line": 2295 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/public-record", + "function": "publish_public_record", + "line": 2309 + }, + { + "method": "POST", + "declared_path": "/imports/{connector_name}/meetings", + "function": "import_connector_meeting", + "line": 2347 + }, + { + "method": "POST", + "declared_path": "/vendor-live-sync/sources", + "function": "create_vendor_live_sync_source", + "line": 2365 + }, + { + "method": "GET", + "declared_path": "/vendor-live-sync/sources", + "function": "list_vendor_live_sync_sources", + "line": 2386 + }, + { + "method": "POST", + "declared_path": "/vendor-live-sync/sources/{source_id}/cursor-reset", + "function": "reset_vendor_live_sync_cursor", + "line": 2398 + }, + { + "method": "POST", + "declared_path": "/vendor-live-sync/sources/{source_id}/run-log", + "function": "record_vendor_live_sync_run", + "line": 2431 + }, + { + "method": "GET", + "declared_path": "/vendor-live-sync/sources/{source_id}/run-log", + "function": "list_vendor_live_sync_runs", + "line": 2463 + }, + { + "method": "GET", + "declared_path": "/public/meetings", + "function": "public_meetings", + "line": 2484 + }, + { + "method": "GET", + "declared_path": "/public/meetings/{record_id}", + "function": "public_meeting_detail", + "line": 2494 + }, + { + "method": "GET", + "declared_path": "/public/meetings/{record_id}/{document_kind}.txt", + "function": "public_meeting_download", + "line": 2503 + }, + { + "method": "POST", + "declared_path": "/public/meetings/{record_id}/comments", + "function": "submit_public_comment", + "line": 2530 + }, + { + "method": "GET", + "declared_path": "/public/meetings/{record_id}/comments", + "function": "list_public_comments", + "line": 2557 + }, + { + "method": "GET", + "declared_path": "/public-comments/review-queue", + "function": "list_public_comment_review_queue", + "line": 2567 + }, + { + "method": "GET", + "declared_path": "/public/archive/search", + "function": "public_archive_search", + "line": 2580 + } + ], + "models": [ + { + "name": "AgendaItemCreate", + "bases": [ + "BaseModel" ], "fields": [ { - "name": "action", - "type": "Literal['approve-records-response']", - "default": "" + "name": "title", + "type": "str", + "line": 239 }, { - "name": "payload", - "type": "ApprovalPayload", - "default": "Field(default_factory=ApprovalPayload)" + "name": "department_name", + "type": "str", + "line": 240 } ], - "line": 218, - "doc": "" + "line": 238 }, { - "name": "FinishCommand", + "name": "AgendaItemTransitionRequest", "bases": [ - "NativePayload" + "BaseModel" ], "fields": [ { - "name": "action", - "type": "Literal['fulfill-records-request', 'close-records-request']", - "default": "" + "name": "to_status", + "type": "str", + "line": 244 }, { - "name": "payload", - "type": "NativePayload", - "default": "Field(default_factory=NativePayload)" + "name": "actor", + "type": "str", + "line": 245 } ], - "line": 223, - "doc": "" + "line": 243 }, { - "name": "TimelineView", + "name": "AgendaIntakeCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", + "name": "title", "type": "str", - "default": "" + "line": 249 }, { - "name": "action", + "name": "department_name", "type": "str", - "default": "" + "line": 250 }, { - "name": "actor", + "name": "submitted_by", "type": "str", - "default": "" + "line": 251 }, { - "name": "note", + "name": "summary", "type": "str", - "default": "" + "line": 252 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "source_references", + "type": "list[dict]", + "line": 253 } ], - "line": 241, - "doc": "" + "line": 248 }, { - "name": "PublicStatusView", + "name": "AgendaIntakeReviewRequest", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", + "name": "reviewer", "type": "str", - "default": "" + "line": 257 }, { - "name": "label", - "type": "str", - "default": "" + "name": "ready", + "type": "bool", + "line": 258 }, { - "name": "summary", + "name": "notes", "type": "str", - "default": "" - }, + "line": 259 + } + ], + "line": 256 + }, + { + "name": "AgendaIntakePromoteRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "status", + "name": "reviewer", "type": "str", - "default": "" + "line": 263 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "notes", + "type": "str", + "line": 264 } ], - "line": 249, - "doc": "" + "line": 262 }, { - "name": "MessageView", + "name": "StaffReportCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", + "name": "title", "type": "str", - "default": "" + "line": 268 }, { - "name": "author", + "name": "department_name", "type": "str", - "default": "" + "line": 269 }, { - "name": "author_role", + "name": "author", "type": "str", - "default": "" + "line": 270 }, { - "name": "body", + "name": "summary", "type": "str", - "default": "" + "line": 271 }, { - "name": "visibility", - "type": "str", - "default": "" + "name": "source_references", + "type": "list[dict]", + "line": 272 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "agenda_item_id", + "type": "str | None", + "line": 273 + }, + { + "name": "legal_reviewer", + "type": "str | None", + "line": 274 } ], - "line": 257, - "doc": "" + "line": 267 }, { - "name": "FeeLineView", + "name": "MeetingCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", + "name": "title", "type": "str", - "default": "" + "line": 278 }, { - "name": "description", + "name": "meeting_type", "type": "str", - "default": "" + "line": 279 }, { - "name": "schedule_basis", - "type": "str", - "default": "" + "name": "scheduled_start", + "type": "str | None", + "line": 280 }, { - "name": "amount_cents", - "type": "int", - "default": "" + "name": "meeting_body_id", + "type": "str | None", + "line": 281 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "location", + "type": "str | None", + "line": 282 } ], - "line": 266, - "doc": "" + "line": 277 }, { - "name": "ExemptionDecisionView", + "name": "MeetingUpdate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", - "type": "str", - "default": "" + "name": "title", + "type": "str | None", + "line": 286 }, { - "name": "source", - "type": "str", - "default": "" + "name": "meeting_type", + "type": "str | None", + "line": 287 }, { - "name": "kind", - "type": "str", - "default": "" + "name": "scheduled_start", + "type": "str | None", + "line": 288 }, { - "name": "finding", - "type": "str", - "default": "" + "name": "meeting_body_id", + "type": "str | None", + "line": 289 }, { - "name": "decision", - "type": "Literal['release', 'redact', 'exempt']", - "default": "" + "name": "location", + "type": "str | None", + "line": 290 }, { - "name": "basis", + "name": "actor", + "type": "str", + "line": 291 + } + ], + "line": 285 + }, + { + "name": "MeetingBodyCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", "type": "str", - "default": "" + "line": 295 }, { - "name": "reviewer", + "name": "body_type", "type": "str", - "default": "" + "line": 296 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "is_active", + "type": "bool", + "line": 297 } ], - "line": 274, - "doc": "" + "line": 294 }, { - "name": "SearchResultView", + "name": "MeetingBodyUpdate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", - "type": "str", - "default": "" + "name": "name", + "type": "str | None", + "line": 301 }, { - "name": "title", - "type": "str", - "default": "" + "name": "body_type", + "type": "str | None", + "line": 302 }, { - "name": "citation", + "name": "is_active", + "type": "bool | None", + "line": 303 + } + ], + "line": 300 + }, + { + "name": "MeetingTransitionRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "to_status", "type": "str", - "default": "" + "line": 307 }, { - "name": "summary", + "name": "actor", "type": "str", - "default": "" + "line": 308 }, { - "name": "status", - "type": "str", - "default": "" + "name": "statutory_basis", + "type": "str | None", + "line": 309 } ], - "line": 285, - "doc": "" + "line": 306 }, { - "name": "SearchReceiptView", + "name": "PacketSnapshotCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", - "type": "str", - "default": "" + "name": "agenda_item_ids", + "type": "list[str]", + "line": 313 }, { - "name": "query", + "name": "actor", "type": "str", - "default": "" - }, + "line": 314 + } + ], + "line": 312 + }, + { + "name": "PacketAssemblyCreate", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "locations", + "name": "title", "type": "str", - "default": "" + "line": 318 }, { - "name": "reviewer", + "name": "agenda_item_ids", + "type": "list[str]", + "line": 319 + }, + { + "name": "actor", "type": "str", - "default": "" + "line": 320 }, { - "name": "results", - "type": "list[SearchResultView]", - "default": "" + "name": "source_references", + "type": "list[dict]", + "line": 321 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "citations", + "type": "list[dict]", + "line": 322 } ], - "line": 293, - "doc": "" + "line": 317 }, { - "name": "RecordsView", + "name": "PacketAssemblyFinalizeRequest", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "request_id", + "name": "actor", "type": "str", - "default": "" - }, + "line": 326 + } + ], + "line": 325 + }, + { + "name": "PacketSourceCreate", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "id", + "name": "source_id", "type": "str", - "default": "" + "line": 330 }, { - "name": "public_tracking_number", + "name": "title", "type": "str", - "default": "" + "line": 331 }, { - "name": "requester", + "name": "kind", "type": "str", - "default": "" + "line": 332 }, { - "name": "requester_contact", - "type": "str", - "default": "" + "name": "source_system", + "type": "str | None", + "line": 333 }, { - "name": "submitted_via", - "type": "str", - "default": "" + "name": "source_path", + "type": "str | None", + "line": 334 }, { - "name": "summary", - "type": "str", - "default": "" + "name": "checksum", + "type": "str | None", + "line": 335 }, { - "name": "deadline", - "type": "str", - "default": "" + "name": "sensitivity_label", + "type": "str | None", + "line": 336 }, { - "name": "deadline_basis", - "type": "str", - "default": "" - }, + "name": "citation_label", + "type": "str | None", + "line": 337 + } + ], + "line": 329 + }, + { + "name": "PacketExportCreate", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "status", + "name": "bundle_name", "type": "str", - "default": "" + "line": 341 }, { - "name": "assigned_to", + "name": "actor", "type": "str", - "default": "" + "line": 342 }, { - "name": "clarification_notes", - "type": "list[str]", - "default": "" + "name": "sources", + "type": "list[PacketSourceCreate]", + "line": 343 }, { - "name": "search_notes", - "type": "list[str]", - "default": "" - }, + "name": "public_bundle", + "type": "bool", + "line": 344 + } + ], + "line": 340 + }, + { + "name": "NoticeComplianceRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "search_sessions", - "type": "list[SearchReceiptView]", - "default": "" + "name": "notice_type", + "type": "str", + "line": 348 }, { - "name": "exemption_reviews", - "type": "list[str]", - "default": "" + "name": "posted_at", + "type": "datetime", + "line": 349 }, { - "name": "exemption_decisions", - "type": "list[ExemptionDecisionView]", - "default": "" + "name": "minimum_notice_hours", + "type": "int", + "line": 350 }, { - "name": "fee_estimate", + "name": "statutory_basis", + "type": "str | None", + "line": 351 + }, + { + "name": "approved_by", + "type": "str | None", + "line": 352 + } + ], + "line": 347 + }, + { + "name": "NoticeChecklistCreate", + "bases": [ + "NoticeComplianceRequest" + ], + "fields": [ + { + "name": "actor", + "type": "str", + "line": 356 + } + ], + "line": 355 + }, + { + "name": "NoticePostingProofCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "actor", "type": "str", - "default": "" + "line": 360 }, { - "name": "fee_line_items", - "type": "list[FeeLineView]", - "default": "" + "name": "posting_proof", + "type": "dict", + "line": 361 + } + ], + "line": 359 + }, + { + "name": "MotionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "line": 365 }, { - "name": "fee_waiver_reason", + "name": "actor", "type": "str", - "default": "" + "line": 366 }, { - "name": "citations", - "type": "list[str]", - "default": "" + "name": "agenda_item_id", + "type": "str | None", + "line": 367 }, { - "name": "response_draft", + "name": "seconded_by", + "type": "str | None", + "line": 368 + } + ], + "line": 364 + }, + { + "name": "MotionCorrectionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", "type": "str", - "default": "" + "line": 372 }, { - "name": "approval_notes", - "type": "list[str]", - "default": "" + "name": "actor", + "type": "str", + "line": 373 }, { - "name": "exports", - "type": "list[str]", - "default": "" + "name": "reason", + "type": "str", + "line": 374 + } + ], + "line": 371 + }, + { + "name": "VoteCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "voter_name", + "type": "str", + "line": 378 }, { - "name": "documents", - "type": "list['RecordsDocumentView']", - "default": "Field(default_factory=list)" + "name": "vote", + "type": "str", + "line": 379 }, { - "name": "release_packages", - "type": "list['ReleasePackageView']", - "default": "Field(default_factory=list)" + "name": "actor", + "type": "str", + "line": 380 + } + ], + "line": 377 + }, + { + "name": "VoteCorrectionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "vote", + "type": "str", + "line": 384 }, { - "name": "timeline", - "type": "list[TimelineView]", - "default": "" + "name": "actor", + "type": "str", + "line": 385 }, { - "name": "public_status_events", - "type": "list[PublicStatusView]", - "default": "" + "name": "reason", + "type": "str", + "line": 386 + } + ], + "line": 383 + }, + { + "name": "ActionItemCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "description", + "type": "str", + "line": 390 }, { - "name": "messages", - "type": "list[MessageView]", - "default": "" + "name": "actor", + "type": "str", + "line": 391 }, { - "name": "deadline_reviewed_at_unix_seconds", - "type": "int | None", - "default": "" + "name": "assigned_to", + "type": "str | None", + "line": 392 }, { - "name": "approved_at_unix_seconds", - "type": "int | None", - "default": "" + "name": "source_motion_id", + "type": "str | None", + "line": 393 + } + ], + "line": 389 + }, + { + "name": "SourceMaterialCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "line": 397 }, { - "name": "fulfilled_at_unix_seconds", - "type": "int | None", - "default": "" + "name": "label", + "type": "str", + "line": 398 }, { - "name": "closed_at_unix_seconds", - "type": "int | None", - "default": "" + "name": "text", + "type": "str", + "line": 399 + } + ], + "line": 396 + }, + { + "name": "MinutesSentenceCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "line": 403 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "citations", + "type": "list[str]", + "line": 404 } ], - "line": 302, - "doc": "" + "line": 402 }, { - "name": "RecordsOperationRead", + "name": "MinutesDraftCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "action", + "name": "model", "type": "str", - "default": "" + "line": 408 }, { - "name": "message", + "name": "prompt_version", "type": "str", - "default": "" + "line": 409 }, { - "name": "request", - "type": "RecordsView", - "default": "" + "name": "human_approver", + "type": "str", + "line": 410 + }, + { + "name": "source_materials", + "type": "list[SourceMaterialCreate]", + "line": 411 + }, + { + "name": "sentences", + "type": "list[MinutesSentenceCreate]", + "line": 412 } ], - "line": 339, - "doc": "" + "line": 407 }, { - "name": "RecordsStateRead", + "name": "MinutesAiAssistCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "demo_fixture", - "type": "dict | None", - "default": "None" + "name": "model", + "type": "str", + "line": 416 }, { - "name": "records_requests", - "type": "list[RecordsView]", - "default": "" + "name": "prompt_version", + "type": "str", + "line": 417 }, { - "name": "notification_events", - "type": "list['NotificationView']", - "default": "Field(default_factory=list)" + "name": "human_approver", + "type": "str", + "line": 418 }, { - "name": "publication_events", - "type": "list['PublicationView']", - "default": "Field(default_factory=list)" + "name": "source_materials", + "type": "list[SourceMaterialCreate]", + "line": 419 }, { - "name": "audit_entries", - "type": "list['AuditView']", - "default": "Field(default_factory=list)" + "name": "instruction", + "type": "str", + "line": 420 } ], - "line": 345, - "doc": "" + "line": 415 }, { - "name": "ManagedFileReceipt", + "name": "TranscriptCreate", "bases": [ - "NativePayload" + "BaseModel" ], "fields": [ { - "name": "original_path", + "name": "actor", "type": "str", - "default": "Field(min_length=1)" + "line": 427 }, { - "name": "stored_path", + "name": "source_label", "type": "str", - "default": "Field(min_length=1)" + "line": 428 }, { - "name": "file_name", + "name": "transcript_text", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 429 }, { - "name": "sha256", - "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "name": "public_release_requested", + "type": "bool", + "line": 430 }, { - "name": "size_bytes", - "type": "int", - "default": "Field(ge=0, le=2147483647, strict=True)" + "name": "closed_session", + "type": "bool", + "line": 431 } ], - "line": 353, - "doc": "" + "line": 426 + }, + { + "name": "OrdinanceResolutionHandoffCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "item_type", + "type": "str", + "line": 435 + }, + { + "name": "title", + "type": "str", + "line": 436 + }, + { + "name": "actor", + "type": "str", + "line": 437 + }, + { + "name": "legal_reviewer", + "type": "str", + "line": 438 + }, + { + "name": "text", + "type": "str", + "line": 439 + }, + { + "name": "source_motion_id", + "type": "str | None", + "line": 440 + }, + { + "name": "ordinance_number", + "type": "str | None", + "line": 441 + }, + { + "name": "resolution_number", + "type": "str | None", + "line": 442 + }, + { + "name": "source_references", + "type": "list[dict]", + "line": 443 + }, + { + "name": "affected_sections", + "type": "list[str]", + "line": 444 + }, + { + "name": "source_document_url", + "type": "str | None", + "line": 445 + }, + { + "name": "source_document_hash", + "type": "str | None", + "line": 446 + } + ], + "line": 434 + }, + { + "name": "OrdinanceResolutionHandoffRetry", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "handoff_id", + "type": "str | None", + "line": 450 + } + ], + "line": 449 + }, + { + "name": "PublicMeetingRecordCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "line": 454 + }, + { + "name": "visibility", + "type": "str", + "line": 455 + }, + { + "name": "posted_agenda", + "type": "str", + "line": 456 + }, + { + "name": "posted_packet", + "type": "str", + "line": 457 + }, + { + "name": "approved_minutes", + "type": "str", + "line": 458 + }, + { + "name": "public_comment_enabled", + "type": "bool", + "line": 459 + }, + { + "name": "plain_language_summary", + "type": "str | None", + "line": 460 + }, + { + "name": "minutes_adopted_at", + "type": "str | None", + "line": 461 + }, + { + "name": "minutes_signed_by", + "type": "str | None", + "line": 462 + }, + { + "name": "closed_session_notes", + "type": "str | None", + "line": 463 + } + ], + "line": 453 + }, + { + "name": "PublicCommentCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "commenter_name", + "type": "str", + "line": 467 + }, + { + "name": "comment", + "type": "str", + "line": 468 + } + ], + "line": 466 + }, + { + "name": "VendorSyncSourceCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "connector", + "type": "str", + "line": 472 + }, + { + "name": "source_name", + "type": "str", + "line": 473 + }, + { + "name": "source_url", + "type": "str", + "line": 474 + }, + { + "name": "auth_method", + "type": "str", + "line": 475 + } + ], + "line": 471 + }, + { + "name": "VendorSyncRunRecordCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "records_discovered", + "type": "int", + "line": 479 + }, + { + "name": "records_succeeded", + "type": "int", + "line": 480 + }, + { + "name": "records_failed", + "type": "int", + "line": 481 + }, + { + "name": "retries_attempted", + "type": "int", + "line": 482 + }, + { + "name": "error_summary", + "type": "str | None", + "line": 483 + } + ], + "line": 478 + }, + { + "name": "VendorSyncCursorReset", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "cursor_at", + "type": "datetime | None", + "line": 487 + }, + { + "name": "reason", + "type": "str", + "line": 488 + } + ], + "line": 486 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_MEETINGS_EXPORT_ROOT", + "line": 3457 + }, + { + "environment": "TOWNLIGHT_MEETINGS_AGENDA_INTAKE_DB_URL", + "line": 3463 + }, + { + "environment": "TOWNLIGHT_MEETINGS_AGENDA_ITEM_DB_URL", + "line": 3472 + }, + { + "environment": "TOWNLIGHT_MEETINGS_PACKET_ASSEMBLY_DB_URL", + "line": 3483 + }, + { + "environment": "TOWNLIGHT_MEETINGS_NOTICE_CHECKLIST_DB_URL", + "line": 3492 + }, + { + "environment": "TOWNLIGHT_MEETINGS_MEETING_BODY_DB_URL", + "line": 3501 + }, + { + "environment": "TOWNLIGHT_MEETINGS_MEETING_DB_URL", + "line": 3510 + }, + { + "environment": "TOWNLIGHT_MEETINGS_VENDOR_SYNC_DB_URL", + "line": 3521 + }, + { + "environment": "TOWNLIGHT_MEETINGS_MOTION_VOTE_DB_URL", + "line": 3530 + }, + { + "environment": "TOWNLIGHT_MEETINGS_MINUTES_DB_URL", + "line": 3541 + }, + { + "environment": "TOWNLIGHT_MEETINGS_PUBLIC_ARCHIVE_DB_URL", + "line": 3552 + }, + { + "environment": "TOWNLIGHT_MEETINGS_PUBLIC_ARCHIVE_DB_URL", + "line": 3563 + } + ] + }, + { + "source": "townlight_meetings/meeting_body.py", + "sha256": "8d942a6b5c5ee54118fad110a69342de050b3ade33d29d6ff7b816be169d4c52", + "bytes": 5165, + "routes": [], + "models": [ + { + "name": "MeetingBodyRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "UUID", + "line": 32 + }, + { + "name": "name", + "type": "str", + "line": 33 + }, + { + "name": "body_type", + "type": "str", + "line": 34 + }, + { + "name": "is_active", + "type": "bool", + "line": 35 + }, + { + "name": "created_at", + "type": "datetime", + "line": 36 + }, + { + "name": "updated_at", + "type": "datetime", + "line": 37 + } + ], + "line": 29 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/meeting_lifecycle.py", + "sha256": "8e85facc34e20861bf12bf4787094963057f731d908ba68c8369c347edcaee14", + "bytes": 22805, + "routes": [], + "models": [ + { + "name": "TransitionResult", + "bases": [], + "fields": [ + { + "name": "allowed", + "type": "bool", + "line": 75 + }, + { + "name": "http_status", + "type": "int", + "line": 76 + }, + { + "name": "message", + "type": "str", + "line": 77 + }, + { + "name": "fix", + "type": "str", + "line": 78 + }, + { + "name": "audit_entry", + "type": "dict[str, object]", + "line": 79 + } + ], + "line": 74 + }, + { + "name": "MeetingRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 84 + }, + { + "name": "title", + "type": "str", + "line": 85 + }, + { + "name": "meeting_type", + "type": "str", + "line": 86 + }, + { + "name": "scheduled_start", + "type": "datetime | None", + "line": 87 + }, + { + "name": "meeting_body_id", + "type": "str | None", + "line": 88 + }, + { + "name": "location", + "type": "str | None", + "line": 89 + }, + { + "name": "status", + "type": "str", + "line": 90 + }, + { + "name": "audit_entries", + "type": "list[dict[str, object]]", + "line": 91 + } + ], + "line": 83 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/__init__.py", + "sha256": "2f702ea1ab0e065bdfe893ab61f83640ed21e3d1ed0369c064c1220775ea3bc7", + "bytes": 53, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/alembic.ini", + "sha256": "92766d392cd23d39d3896a835c5e9377caf76545f263183e1dafaf90779203bb", + "bytes": 770, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/env.py", + "sha256": "2dac3fa33b6c23c15a3e22b0a047df52b21987faca89267dc220b9a45df75191", + "bytes": 2428, + "routes": [], + "models": [], + "configuration": [ + { + "environment": "DATABASE_URL", + "line": 24 + } + ] + }, + { + "source": "townlight_meetings/migrations/guards.py", + "sha256": "c15233f35fdb6aad0659926a9f86ce17ab2c05461c1ad5dda4797bb0a2ec5068", + "bytes": 514, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/__init__.py", + "sha256": "0c884013c778ac8bcf273f0a0c5bc159f488c2213e5d9580519ca057e3f93b17", + "bytes": 54, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0001_schema.py", + "sha256": "0e0ce48ca01b2c4a26a71b78456256ae250ea441342e8c6f8e7d6ac15fbb2c39", + "bytes": 7272, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0002_agenda_intake_queue.py", + "sha256": "49a9425fe4a1bb816c536aeeba439e78e0f83a13de3b740c42e8745a8c27f7bb", + "bytes": 1490, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0003_packet_assembly_records.py", + "sha256": "9a75aa6a86e6e273944c702dc0528ed4b1932d352e248bc74738fa569cf3d223", + "bytes": 1666, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0004_notice_checklist_records.py", + "sha256": "9d48fdc8044458a30e95139831e1b72061943f9c819b0b3c0633f1152d378010", + "bytes": 1735, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0005_meeting_records.py", + "sha256": "24f50601c97f145ad6a959fc8e617806286cf2f9c5a959014c14e9ba5d81e204", + "bytes": 1169, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0006_agenda_item_lifecycle_records.py", + "sha256": "d4adce2b58d003d0320198f152cc1e69c3158512a6a19ce3b94e31fd464f9d9c", + "bytes": 1127, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0007_meeting_schedule_fields.py", + "sha256": "b6bec8f062dc9f032ffd7191fa04b2b477c0ce6adcd3bde80ae66c6a90746abd", + "bytes": 1489, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0008_agenda_intake_promotion.py", + "sha256": "ee3b2ea4b1240a5d3db4e257672b3aa167b8b6a0cc73e26ba483544ff2652192", + "bytes": 1834, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0009_vendor_sync_persistence.py", + "sha256": "5c5712c4cdeb9447e060ae6e0d465e2bf75f2c888d7d7702f180ca67be901048", + "bytes": 3709, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0010_vendor_sync_cursor.py", + "sha256": "a09f09862e8a279445feea66be71b26cff83c44ff272a0c15b95248ed7cadce3", + "bytes": 858, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0011_data_model_completion.py", + "sha256": "58a960f8a84cb532d39b4af9b3088360fe5507b028aebb64a11210b93c17e5b7", + "bytes": 9389, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0012_action_item_actor.py", + "sha256": "e4efccca64d15074c36296f4a2666e02110298de02c13f8ac772798089fd8a4c", + "bytes": 999, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0013_minutes_model_posted.py", + "sha256": "50a8125f9c7ea967f8187d0d2e06c592604e64953f6a452dfc96523ebb92df41", + "bytes": 1267, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0014_public_meeting_records.py", + "sha256": "ccc0bf6229a9c9a278ee57c7ea018744ac9125bc18d3f21636869a64b5ec6b15", + "bytes": 2153, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0015_capture_seq.py", + "sha256": "598bbab49533f1aba774703d83efd35776ec3a41107195030edbfca23d832584", + "bytes": 2348, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0016_archive_indexes.py", + "sha256": "72f55f23307d04c70502674a9b6f99a23497fa96c81cccad3b1a0eeb8316a3f5", + "bytes": 1891, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0017_meeting_authority.py", + "sha256": "a78e6c3dab3f60fe864846b68387e5961d2689bf3178f635a6ef9f9d5657743c", + "bytes": 2368, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0018_agenda_authority.py", + "sha256": "eee17737b39bc3ba6ca894b093265c222794de97e560720cb3780483b914ed02", + "bytes": 1738, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0019_minutes_decisions.py", + "sha256": "740f4f76740008ed0ff1f95f02b6b6d022542236d0978ee7a131f472fb7c14d7", + "bytes": 550, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0020_delivery_history.py", + "sha256": "7dc873a822e2f85f1d30380c55e86d6c32fd9aaf7b050595134c03396d8d50d7", + "bytes": 769, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/migrations/versions/townlight_meetings_0021_sources_archive.py", + "sha256": "bdfda03eb565680a2444b17bdb743dd1dff95e9c612f80accaab7f03c55b3121", + "bytes": 923, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/minutes.py", + "sha256": "2054ae33051ea48015f65b0c3caee89c3c12d43dcd8536c372cccbf6cf281e24", + "bytes": 18230, + "routes": [], + "models": [ + { + "name": "MinutesProvenance", + "bases": [], + "fields": [ + { + "name": "model", + "type": "str", + "line": 27 + }, + { + "name": "prompt_version", + "type": "str", + "line": 28 + }, + { + "name": "data_sources", + "type": "tuple[str, ...]", + "line": 29 + }, + { + "name": "human_approver", + "type": "str", + "line": 30 + } + ], + "line": 26 + }, + { + "name": "MinutesDraft", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 43 + }, + { + "name": "meeting_id", + "type": "str", + "line": 44 + }, + { + "name": "status", + "type": "str", + "line": 45 + }, + { + "name": "sentences", + "type": "tuple[MinutesSentence, ...]", + "line": 46 + }, + { + "name": "source_materials", + "type": "tuple[SourceMaterial, ...]", + "line": 47 + }, + { + "name": "provenance", + "type": "MinutesProvenance", + "line": 48 + }, + { + "name": "adopted", + "type": "bool", + "line": 49 + }, + { + "name": "posted", + "type": "bool", + "line": 50 + }, + { + "name": "signed_by", + "type": "str | None", + "line": 51 + }, + { + "name": "decision_history", + "type": "tuple[dict, ...]", + "line": 52 + } + ], + "line": 42 + }, + { + "name": "MinutesValidationError", + "bases": [], + "fields": [ + { + "name": "message", + "type": "str", + "line": 72 + }, + { + "name": "fix", + "type": "str", + "line": 73 + } + ], + "line": 71 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/mock_city_environment.py", + "sha256": "71c8698fa5b24cdf89b020e6aab68752563f6349b01d11ce38d20a06244f9cad", + "bytes": 32670, + "routes": [], + "models": [ + { + "name": "MockCityHostileFixture", + "bases": [], + "fields": [ + { + "name": "area", + "type": "HostileArea", + "line": 50 + }, + { + "name": "scenario", + "type": "str", + "line": 51 + }, + { + "name": "target", + "type": "str", + "line": 52 + }, + { + "name": "trigger", + "type": "str", + "line": 53 + }, + { + "name": "expected_behavior", + "type": "str", + "line": 54 + }, + { + "name": "fix", + "type": "str", + "line": 55 + }, + { + "name": "sample", + "type": "dict[str, Any]", + "line": 56 + } + ], + "line": 47 + }, + { + "name": "MockCityHostileCheck", + "bases": [], + "fields": [ + { + "name": "area", + "type": "HostileArea", + "line": 74 + }, + { + "name": "scenario", + "type": "str", + "line": 75 + }, + { + "name": "target", + "type": "str", + "line": 76 + }, + { + "name": "ok", + "type": "bool", + "line": 77 + }, + { + "name": "message", + "type": "str", + "line": 78 + }, + { + "name": "fix", + "type": "str", + "line": 79 + } + ], + "line": 71 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/models.py", + "sha256": "5607a664757054913929de1cc5cc9a4f6cdce53ec73e93b4ef7e2eb9d4437195", + "bytes": 11996, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/motion_vote.py", + "sha256": "e94fb8bc6a02951c67aba8bd91e8be64f04dfe72197e147ae84339d04e53fc0b", + "bytes": 26765, + "routes": [], + "models": [ + { + "name": "MotionRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 18 + }, + { + "name": "meeting_id", + "type": "str", + "line": 19 + }, + { + "name": "text", + "type": "str", + "line": 20 + }, + { + "name": "actor", + "type": "str", + "line": 21 + }, + { + "name": "agenda_item_id", + "type": "str | None", + "line": 22 + }, + { + "name": "seconded_by", + "type": "str | None", + "line": 23 + }, + { + "name": "correction_of_id", + "type": "str | None", + "line": 24 + }, + { + "name": "correction_reason", + "type": "str | None", + "line": 25 + }, + { + "name": "captured", + "type": "bool", + "line": 26 + } + ], + "line": 17 + }, + { + "name": "VoteRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 44 + }, + { + "name": "motion_id", + "type": "str", + "line": 45 + }, + { + "name": "voter_name", + "type": "str", + "line": 46 + }, + { + "name": "vote", + "type": "str", + "line": 47 + }, + { + "name": "actor", + "type": "str", + "line": 48 + }, + { + "name": "correction_of_id", + "type": "str | None", + "line": 49 + }, + { + "name": "correction_reason", + "type": "str | None", + "line": 50 + }, + { + "name": "captured", + "type": "bool", + "line": 51 + } + ], + "line": 43 + }, + { + "name": "ActionItemRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 68 + }, + { + "name": "meeting_id", + "type": "str", + "line": 69 + }, + { + "name": "description", + "type": "str", + "line": 70 + }, + { + "name": "actor", + "type": "str", + "line": 71 + }, + { + "name": "assigned_to", + "type": "str | None", + "line": 72 + }, + { + "name": "source_motion_id", + "type": "str | None", + "line": 73 + }, + { + "name": "status", + "type": "str", + "line": 74 + } + ], + "line": 67 + }, + { + "name": "MeetingOutcomeSummary", + "bases": [], + "fields": [ + { + "name": "meeting_id", + "type": "str", + "line": 90 + }, + { + "name": "motion_id", + "type": "str", + "line": 91 + }, + { + "name": "text", + "type": "str", + "line": 92 + }, + { + "name": "actor", + "type": "str", + "line": 93 + }, + { + "name": "status", + "type": "str", + "line": 94 + }, + { + "name": "vote_count", + "type": "int", + "line": 95 + }, + { + "name": "action_item_count", + "type": "int", + "line": 96 + } + ], + "line": 89 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/notice_checklist.py", + "sha256": "53a49cd45e73aec06f89b7354f4b43fd4c3741ab095be39852339eb21989299a", + "bytes": 12416, + "routes": [], + "models": [ + { + "name": "NoticeChecklistRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 53 + }, + { + "name": "meeting_id", + "type": "str", + "line": 54 + }, + { + "name": "notice_type", + "type": "str", + "line": 55 + }, + { + "name": "status", + "type": "str", + "line": 56 + }, + { + "name": "compliant", + "type": "bool", + "line": 57 + }, + { + "name": "http_status", + "type": "int", + "line": 58 + }, + { + "name": "warnings", + "type": "list[dict]", + "line": 59 + }, + { + "name": "deadline_at", + "type": "datetime", + "line": 60 + }, + { + "name": "posted_at", + "type": "datetime", + "line": 61 + }, + { + "name": "minimum_notice_hours", + "type": "int", + "line": 62 + }, + { + "name": "statutory_basis", + "type": "str | None", + "line": 63 + }, + { + "name": "approved_by", + "type": "str | None", + "line": 64 + }, + { + "name": "posting_proof", + "type": "dict | None", + "line": 65 + }, + { + "name": "last_audit_hash", + "type": "str", + "line": 66 + }, + { + "name": "created_at", + "type": "datetime", + "line": 67 + }, + { + "name": "updated_at", + "type": "datetime", + "line": 68 + }, + { + "name": "audit_entries", + "type": "list[dict]", + "line": 69 + } + ], + "line": 50 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/oidc_auth.py", + "sha256": "56e8cf18103a38230f8b77c27d86d0fd948adfcb5c1383056d676ed26979cf36", + "bytes": 14727, + "routes": [], + "models": [ + { + "name": "OidcStaffAuthConfig", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "line": 22 + }, + { + "name": "issuer", + "type": "str", + "line": 23 + }, + { + "name": "audience", + "type": "str", + "line": 24 + }, + { + "name": "jwks_url", + "type": "str | None", + "line": 25 + }, + { + "name": "jwks_json", + "type": "str | None", + "line": 26 + }, + { + "name": "role_claims", + "type": "tuple[str, ...]", + "line": 27 + }, + { + "name": "algorithms", + "type": "tuple[str, ...]", + "line": 28 + }, + { + "name": "authorization_url", + "type": "str | None", + "line": 29 + }, + { + "name": "token_url", + "type": "str | None", + "line": 30 + }, + { + "name": "client_id", + "type": "str | None", + "line": 31 + }, + { + "name": "client_secret", + "type": "str | None", + "line": 32 + }, + { + "name": "redirect_uri", + "type": "str | None", + "line": 33 + }, + { + "name": "session_cookie_secret", + "type": "str | None", + "line": 34 + } + ], + "line": 21 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/packet_assembly.py", + "sha256": "053cbccbb5a8f2c61ab38c74a2a9e1cbfcdaedceadd30b745768935c75af68c6", + "bytes": 11617, + "routes": [], + "models": [ + { + "name": "PacketAssemblyRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 54 + }, + { + "name": "meeting_id", + "type": "str", + "line": 55 + }, + { + "name": "packet_snapshot_id", + "type": "str", + "line": 56 + }, + { + "name": "packet_version", + "type": "int", + "line": 57 + }, + { + "name": "title", + "type": "str", + "line": 58 + }, + { + "name": "status", + "type": "str", + "line": 59 + }, + { + "name": "actor", + "type": "str", + "line": 60 + }, + { + "name": "agenda_item_ids", + "type": "list[str]", + "line": 61 + }, + { + "name": "source_references", + "type": "list[dict]", + "line": 62 + }, + { + "name": "citations", + "type": "list[dict]", + "line": 63 + }, + { + "name": "finalized_by", + "type": "str | None", + "line": 64 + }, + { + "name": "finalized_at", + "type": "datetime | None", + "line": 65 + }, + { + "name": "last_audit_hash", + "type": "str", + "line": 66 + }, + { + "name": "created_at", + "type": "datetime", + "line": 67 + }, + { + "name": "updated_at", + "type": "datetime", + "line": 68 + }, + { + "name": "snapshot_content", + "type": "list[dict]", + "line": 69 + }, + { + "name": "delivery_history", + "type": "list[dict]", + "line": 70 + }, + { + "name": "audit_entries", + "type": "list[dict]", + "line": 71 + } + ], + "line": 51 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/packet_notice.py", + "sha256": "f6740f9e3a8e74e9e7c10ff91284df7cb8700f7c781f099bdb29f9492575f911", + "bytes": 18322, + "routes": [], + "models": [ + { + "name": "PacketSource", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "line": 61 + }, + { + "name": "title", + "type": "str", + "line": 62 + }, + { + "name": "kind", + "type": "str", + "line": 63 + }, + { + "name": "source_system", + "type": "str | None", + "line": 64 + }, + { + "name": "source_path", + "type": "str | None", + "line": 65 + }, + { + "name": "checksum", + "type": "str | None", + "line": 66 + }, + { + "name": "sensitivity_label", + "type": "str | None", + "line": 67 + }, + { + "name": "citation_label", + "type": "str | None", + "line": 68 + } + ], + "line": 58 + }, + { + "name": "PacketSnapshot", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 93 + }, + { + "name": "meeting_id", + "type": "str", + "line": 94 + }, + { + "name": "version", + "type": "int", + "line": 95 + }, + { + "name": "agenda_item_ids", + "type": "tuple[str, ...]", + "line": 96 + }, + { + "name": "actor", + "type": "str", + "line": 97 + }, + { + "name": "created_at", + "type": "datetime", + "line": 98 + } + ], + "line": 92 + }, + { + "name": "PacketExportResult", + "bases": [], + "fields": [ + { + "name": "meeting_id", + "type": "str", + "line": 115 + }, + { + "name": "bundle_path", + "type": "str", + "line": 116 + }, + { + "name": "manifest_path", + "type": "str", + "line": 117 + }, + { + "name": "checksums_path", + "type": "str", + "line": 118 + }, + { + "name": "townlight_core_version", + "type": "str", + "line": 119 + }, + { + "name": "packet_version", + "type": "int", + "line": 120 + }, + { + "name": "audit_hash", + "type": "str", + "line": 121 + }, + { + "name": "generated_files", + "type": "tuple[str, ...]", + "line": 122 + } + ], + "line": 112 + }, + { + "name": "NoticeComplianceResult", + "bases": [], + "fields": [ + { + "name": "meeting_id", + "type": "str", + "line": 344 + }, + { + "name": "notice_type", + "type": "str", + "line": 345 + }, + { + "name": "scheduled_start", + "type": "datetime", + "line": 346 + }, + { + "name": "posted_at", + "type": "datetime", + "line": 347 + }, + { + "name": "minimum_notice_hours", + "type": "int", + "line": 348 + }, + { + "name": "deadline_at", + "type": "datetime", + "line": 349 + }, + { + "name": "statutory_basis", + "type": "str | None", + "line": 350 + }, + { + "name": "approved_by", + "type": "str | None", + "line": 351 + }, + { + "name": "compliant", + "type": "bool", + "line": 352 + }, + { + "name": "http_status", + "type": "int", + "line": 353 + }, + { + "name": "warnings", + "type": "list[dict[str, str]]", + "line": 354 + } + ], + "line": 343 + }, + { + "name": "PostedNotice", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 373 + }, + { + "name": "result", + "type": "NoticeComplianceResult", + "line": 374 + } + ], + "line": 372 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/prompt_evals.py", + "sha256": "5f7be9d93cd550d8b09877d1db9330fd30614140318b3d6425221c816f8c79dd", + "bytes": 5642, + "routes": [], + "models": [ + { + "name": "PromptEvalResult", + "bases": [], + "fields": [ + { + "name": "prompt_reference", + "type": "str", + "line": 18 + }, + { + "name": "provider", + "type": "str", + "line": 19 + }, + { + "name": "offline", + "type": "bool", + "line": 20 + }, + { + "name": "passed", + "type": "bool", + "line": 21 + }, + { + "name": "message", + "type": "str", + "line": 22 + } + ], + "line": 17 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_CORE_LLM_PROVIDER", + "line": 128 + }, + { + "environment": "TOWNLIGHT_MEETINGS_EVAL_OFFLINE", + "line": 129 + } + ] + }, + { + "source": "townlight_meetings/prompt_library.py", + "sha256": "4bed68dc61c582fea26f61a36861dafe570d8a82b5c115c457eec19148759212", + "bytes": 10325, + "routes": [], + "models": [ + { + "name": "PromptEvaluation", + "bases": [], + "fields": [ + { + "name": "name", + "type": "str", + "line": 35 + }, + { + "name": "required_phrases", + "type": "tuple[str, ...]", + "line": 36 + } + ], + "line": 34 + }, + { + "name": "PromptDefinition", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 41 + }, + { + "name": "version", + "type": "str", + "line": 42 + }, + { + "name": "provider", + "type": "str", + "line": 43 + }, + { + "name": "purpose", + "type": "str", + "line": 44 + }, + { + "name": "required_variables", + "type": "tuple[str, ...]", + "line": 45 + }, + { + "name": "system_prompt", + "type": "str", + "line": 46 + }, + { + "name": "template", + "type": "str", + "line": 47 + }, + { + "name": "evaluations", + "type": "tuple[PromptEvaluation, ...]", + "line": 48 + }, + { + "name": "public_facing", + "type": "bool", + "line": 49 + }, + { + "name": "approval_required", + "type": "str | None", + "line": 50 + } + ], + "line": 40 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/public_archive.py", + "sha256": "cc16f9a752bd853688a04c001e4a867e53f329fce32776e0f93ff06679f8fab2", + "bytes": 28574, + "routes": [], + "models": [ + { + "name": "PublicMeetingRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 28 + }, + { + "name": "meeting_id", + "type": "str", + "line": 29 + }, + { + "name": "title", + "type": "str", + "line": 30 + }, + { + "name": "visibility", + "type": "str", + "line": 31 + }, + { + "name": "posted_agenda", + "type": "str", + "line": 32 + }, + { + "name": "posted_packet", + "type": "str", + "line": 33 + }, + { + "name": "approved_minutes", + "type": "str", + "line": 34 + }, + { + "name": "public_comment_enabled", + "type": "bool", + "line": 35 + }, + { + "name": "plain_language_summary", + "type": "str | None", + "line": 36 + }, + { + "name": "agenda_download_url", + "type": "str | None", + "line": 37 + }, + { + "name": "packet_download_url", + "type": "str | None", + "line": 38 + }, + { + "name": "minutes_download_url", + "type": "str | None", + "line": 39 + }, + { + "name": "minutes_adopted_at", + "type": "str | None", + "line": 40 + }, + { + "name": "minutes_signed_by", + "type": "str | None", + "line": 41 + }, + { + "name": "closed_session_notes", + "type": "str | None", + "line": 42 + }, + { + "name": "audit_entries", + "type": "list[dict]", + "line": 43 + } + ], + "line": 27 + }, + { + "name": "PublicCommentRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 70 + }, + { + "name": "public_record_id", + "type": "str", + "line": 71 + }, + { + "name": "commenter_name", + "type": "str", + "line": 72 + }, + { + "name": "comment", + "type": "str", + "line": 73 + }, + { + "name": "submitted_at", + "type": "str", + "line": 74 + }, + { + "name": "status", + "type": "str", + "line": 75 + } + ], + "line": 69 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/public_ui.py", + "sha256": "3a5c15cf99279eb3bf66168902fe02b29ff5f4bfc13382535ff7222a5aa85ac6", + "bytes": 13818, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/records_sources.py", + "sha256": "7de91ba5712b2518ccc1d16780b008a7a1007f85d9b2074e7153a2b29b69f239", + "bytes": 1851, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/staff_ui.py", + "sha256": "42a675c24f34d4e48dc5e06cfab93c78623f70854171afda214df6d01f529552", + "bytes": 80954, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/suite_session_compat.py", + "sha256": "aad63f43710236fdbc6766b4eca1053d016c5e80a0c8ebfa174c9a69fb0f934c", + "bytes": 5898, + "routes": [], + "models": [ + { + "name": "SuiteSessionPrincipal", + "bases": [], + "fields": [ + { + "name": "subject", + "type": "str", + "line": 31 + }, + { + "name": "roles", + "type": "frozenset[str]", + "line": 32 + }, + { + "name": "session_id", + "type": "str", + "line": 33 + } + ], + "line": 28 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/transcripts.py", + "sha256": "736ed66a6deb8554bb973410f315b3b7c83ab5bae96c5fe96a259536f0799e5a", + "bytes": 3358, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/vendor_delta.py", + "sha256": "a6ab9f820ff2541b93951e34ba18825f5901784b8b546dfc77e2eb47dee54d43", + "bytes": 358, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_meetings/vendor_live_sync.py", + "sha256": "5e3423fa73ea3d6c3ea2339fdd7cb050d35c3f26040ab3ea254dccc77e3224fe", + "bytes": 6024, + "routes": [], + "models": [ + { + "name": "LiveSyncCheck", + "bases": [], + "fields": [ + { + "name": "status", + "type": "Literal['PASS', 'FAIL']", + "line": 50 + }, + { + "name": "name", + "type": "str", + "line": 51 + }, + { + "name": "message", + "type": "str", + "line": 52 + }, + { + "name": "fix", + "type": "str", + "line": 53 + } + ], + "line": 49 + }, + { + "name": "VendorLiveSyncConfig", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "line": 58 + }, + { + "name": "source_url", + "type": "str", + "line": 59 + }, + { + "name": "auth_method", + "type": "AuthMethod", + "line": 60 + } + ], + "line": 57 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/vendor_network_sync.py", + "sha256": "03d533069a867a5ba04e37564e56b823a4b213f55ecf1fbb4f8700925a72f0f3", + "bytes": 15115, + "routes": [], + "models": [ + { + "name": "VendorNetworkSyncAttempt", + "bases": [], + "fields": [ + { + "name": "ok", + "type": "bool", + "line": 32 + }, + { + "name": "message", + "type": "str", + "line": 33 + }, + { + "name": "fix", + "type": "str", + "line": 34 + }, + { + "name": "external_meeting_id", + "type": "str | None", + "line": 35 + }, + { + "name": "error_class", + "type": "str | None", + "line": 36 + } + ], + "line": 31 + }, + { + "name": "VendorNetworkSyncReport", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "line": 41 + }, + { + "name": "connector", + "type": "str", + "line": 42 + }, + { + "name": "network_calls", + "type": "bool", + "line": 43 + }, + { + "name": "records_discovered", + "type": "int", + "line": 44 + }, + { + "name": "records_succeeded", + "type": "int", + "line": 45 + }, + { + "name": "records_failed", + "type": "int", + "line": 46 + }, + { + "name": "run_status", + "type": "str | None", + "line": 47 + }, + { + "name": "source_health_status", + "type": "str | None", + "line": 48 + }, + { + "name": "delta_request_url", + "type": "str | None", + "line": 49 + }, + { + "name": "cursor_param", + "type": "str | None", + "line": 50 + }, + { + "name": "cursor_value", + "type": "str | None", + "line": 51 + }, + { + "name": "cursor_advanced_at", + "type": "str | None", + "line": 52 + }, + { + "name": "message", + "type": "str", + "line": 53 + }, + { + "name": "fix", + "type": "str", + "line": 54 + }, + { + "name": "attempts", + "type": "list[VendorNetworkSyncAttempt]", + "line": 55 + } + ], + "line": 40 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/vendor_sync_persistence.py", + "sha256": "5802f8231c3792e8b747b2aa44a098b7ba5aa57f2b51e3a5e3f2d7ceb2d8df19", + "bytes": 17427, + "routes": [], + "models": [ + { + "name": "VendorSyncSourceRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 82 + }, + { + "name": "connector", + "type": "str", + "line": 83 + }, + { + "name": "source_name", + "type": "str", + "line": 84 + }, + { + "name": "source_url", + "type": "str", + "line": 85 + }, + { + "name": "auth_method", + "type": "str", + "line": 86 + }, + { + "name": "consecutive_failure_count", + "type": "int", + "line": 87 + }, + { + "name": "active_failure_count", + "type": "int", + "line": 88 + }, + { + "name": "sync_paused", + "type": "bool", + "line": 89 + }, + { + "name": "sync_paused_at", + "type": "datetime | None", + "line": 90 + }, + { + "name": "sync_paused_reason", + "type": "str | None", + "line": 91 + }, + { + "name": "last_sync_status", + "type": "str | None", + "line": 92 + }, + { + "name": "last_error_at", + "type": "datetime | None", + "line": 93 + }, + { + "name": "last_success_cursor_at", + "type": "datetime | None", + "line": 94 + }, + { + "name": "created_at", + "type": "datetime", + "line": 95 + }, + { + "name": "updated_at", + "type": "datetime", + "line": 96 + } + ], + "line": 81 + }, + { + "name": "VendorSyncRunRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 141 + }, + { + "name": "source_id", + "type": "str", + "line": 142 + }, + { + "name": "status", + "type": "str", + "line": 143 + }, + { + "name": "records_discovered", + "type": "int", + "line": 144 + }, + { + "name": "records_succeeded", + "type": "int", + "line": 145 + }, + { + "name": "records_failed", + "type": "int", + "line": 146 + }, + { + "name": "retries_attempted", + "type": "int", + "line": 147 + }, + { + "name": "error_summary", + "type": "str | None", + "line": 148 + }, + { + "name": "started_at", + "type": "datetime", + "line": 149 + }, + { + "name": "finished_at", + "type": "datetime", + "line": 150 + } + ], + "line": 140 + } + ], + "configuration": [] + }, + { + "source": "townlight_meetings/worker.py", + "sha256": "19a5a6f39fb8c0e5d4da12dda8b8c6cabfad2566f8446875b2ff607c836d725e", + "bytes": 10175, + "routes": [], + "models": [], + "configuration": [ + { + "environment": "TOWNLIGHT_MEETINGS_REDIS_URL", + "line": 46 + } + ] + } + ] + }, + "code": { + "repository": "townlight/ordinances", + "repository_head": "53f0314e91d6c41ba073a4f764e95d438038767d", + "working_tree_modified": true, + "principal_import": "townlight_code", + "source": [ + { + "source": "townlight_code/__init__.py", + "sha256": "2c43921d2ff34bdcf86cfcbb9eae6733fbb701514ad741e877a0218ca7b8acca", + "bytes": 128, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/ai_answer.py", + "sha256": "25e5053a66a4cc9b6bdd943b8d94c67cee2d62fdbcf9033428b4a9bb07dd2043", + "bytes": 3927, + "routes": [], + "models": [ + { + "name": "LocalLLMConfig", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "line": 19 + }, + { + "name": "base_url", + "type": "str", + "line": 20 + }, + { + "name": "model", + "type": "str", + "line": 21 + }, + { + "name": "timeout_seconds", + "type": "float", + "line": 22 + } + ], + "line": 18 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_CODE_OLLAMA_URL", + "line": 28 + }, + { + "environment": "TOWNLIGHT_CODE_OLLAMA_TIMEOUT_SECONDS", + "line": 35 + }, + { + "environment": "TOWNLIGHT_CODE_AI_MODE", + "line": 27 + }, + { + "environment": "TOWNLIGHT_CODE_OLLAMA_MODEL", + "line": 34 + } + ] + }, + { + "source": "townlight_code/citation_contract.py", + "sha256": "988fbe7893bf0ec957b2a5f04d8871b2ae9c6c1244e3a2b4a68b491fed942f98", + "bytes": 2453, + "routes": [], + "models": [ + { + "name": "CitationRefusal", + "bases": [], + "fields": [ + { + "name": "reason", + "type": "str", + "line": 13 + }, + { + "name": "fix", + "type": "str", + "line": 14 + }, + { + "name": "refusal_type", + "type": "str", + "line": 15 + } + ], + "line": 10 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/codifier_sync.py", + "sha256": "afc3b1ce364a0a77d70d554d29dc3a79e637f82a278ebb8c261082163ad8834e", + "bytes": 24683, + "routes": [], + "models": [ + { + "name": "CodifierDeltaPlan", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "line": 59 + }, + { + "name": "request_url", + "type": "str", + "line": 60 + }, + { + "name": "delta_enabled", + "type": "bool", + "line": 61 + }, + { + "name": "cursor_param", + "type": "str | None", + "line": 62 + }, + { + "name": "cursor_value", + "type": "str | None", + "line": 63 + }, + { + "name": "message", + "type": "str", + "line": 64 + }, + { + "name": "fix", + "type": "str", + "line": 65 + } + ], + "line": 56 + }, + { + "name": "CodifierSyncSource", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "line": 83 + }, + { + "name": "connector", + "type": "str", + "line": 84 + }, + { + "name": "source_name", + "type": "str", + "line": 85 + }, + { + "name": "source_url", + "type": "str", + "line": 86 + }, + { + "name": "sync_schedule", + "type": "str", + "line": 87 + }, + { + "name": "allowlisted_hosts", + "type": "tuple[str, ...]", + "line": 88 + }, + { + "name": "last_successful_sync_at", + "type": "datetime | None", + "line": 89 + }, + { + "name": "last_attempted_sync_at", + "type": "datetime | None", + "line": 90 + }, + { + "name": "last_import_job_id", + "type": "str | None", + "line": 91 + }, + { + "name": "next_sync_at_recorded", + "type": "datetime | None", + "line": 92 + }, + { + "name": "host_validation", + "type": "dict[str, Any]", + "line": 93 + }, + { + "name": "delta_plan_history", + "type": "list[dict[str, Any]]", + "line": 94 + }, + { + "name": "state", + "type": "SyncCircuitState", + "line": 95 + } + ], + "line": 80 + }, + { + "name": "CodifierSyncRun", + "bases": [], + "fields": [ + { + "name": "source", + "type": "CodifierSyncSource", + "line": 106 + }, + { + "name": "job_payload", + "type": "dict[str, Any]", + "line": 107 + }, + { + "name": "delta_plan", + "type": "CodifierDeltaPlan", + "line": 108 + } + ], + "line": 103 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/fixtures/portland/code/13.10-purpose-and-definitions.txt", + "sha256": "e86888d89e29382a48f0276aaabb9f6dbfbdb6a8456c17f51b5cc947cbb53d51", + "bytes": 814, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/fixtures/portland/code/13.40-keeping-livestock.txt", + "sha256": "178245740c874fcc13a7a12f9534692e01e232d771959d198e93d2425e8f2d74", + "bytes": 995, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/frontend_dist/assets/index-aK7NGgo8.js", + "sha256": "2780361ddd2b444b2da05ca9e33be44f7645e83d21f1d28b20e4644229deefae", + "bytes": 198313, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/frontend_dist/assets/index-DhfojJY0.css", + "sha256": "6002a43b0b5fbae50c24bd238b9b90a9a79abb5fb29ac758a8f93bfe755f8f12", + "bytes": 3921, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/frontend_dist/index.html", + "sha256": "43202d3699bc76ea94416777ff6f34654f179da57d4e03b5120390239a9578c4", + "bytes": 450, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/import_connectors.py", + "sha256": "77ca2b4da579a284ad3212126498fce7df28636e6b5df2648b0a364baa702024", + "bytes": 19826, + "routes": [], + "models": [ + { + "name": "ImportJob", + "bases": [], + "fields": [ + { + "name": "job_id", + "type": "str", + "line": 57 + }, + { + "name": "connector_type", + "type": "str", + "line": 58 + }, + { + "name": "actor", + "type": "str", + "line": 59 + }, + { + "name": "status", + "type": "str", + "line": 60 + }, + { + "name": "retry_of", + "type": "str | None", + "line": 61 + }, + { + "name": "counts", + "type": "dict[str, int]", + "line": 62 + }, + { + "name": "provenance", + "type": "dict[str, Any]", + "line": 63 + }, + { + "name": "failure", + "type": "dict[str, str] | None", + "line": 64 + }, + { + "name": "source_id", + "type": "str | None", + "line": 65 + }, + { + "name": "created_at", + "type": "datetime", + "line": 66 + }, + { + "name": "completed_at", + "type": "datetime | None", + "line": 67 + } + ], + "line": 54 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/main.py", + "sha256": "08a9c16106b52ee8a5aeeee6ad00e1721c59e2c27c40d7e83b96b89256a15e3b", + "bytes": 88337, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 786 + }, + { + "method": "GET", + "declared_path": "/townlight_code", + "function": "public_lookup_home", + "line": 834 + }, + { + "method": "GET", + "declared_path": "/townlight_code/app", + "function": "townlight_code_frontend_app", + "line": 845 + }, + { + "method": "GET", + "declared_path": "/townlight_code/app/", + "function": "townlight_code_frontend_app", + "line": 845 + }, + { + "method": "GET", + "declared_path": "/townlight_code/search", + "function": "public_lookup_search", + "line": 858 + }, + { + "method": "GET", + "declared_path": "/townlight_code/answer", + "function": "public_lookup_answer", + "line": 878 + }, + { + "method": "GET", + "declared_path": "/townlight_code/sections/{section_ref}", + "function": "public_section_detail", + "line": 901 + }, + { + "method": "GET", + "declared_path": "/townlight_code/sections/{section_ref}/export", + "function": "public_section_export", + "line": 937 + }, + { + "method": "GET", + "declared_path": "/staff/sources", + "function": "staff_source_workspace", + "line": 953 + }, + { + "method": "GET", + "declared_path": "/staff/code", + "function": "staff_code_workspace", + "line": 970 + }, + { + "method": "GET", + "declared_path": "/staff/sync", + "function": "staff_sync_workspace", + "line": 983 + }, + { + "method": "GET", + "declared_path": "/staff/imports", + "function": "staff_import_ledger", + "line": 1000 + }, + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 1013 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/operational-state", + "function": "get_staff_operational_state", + "line": 1024 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/sources/catalog", + "function": "source_registry_catalog", + "line": 1036 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/sources", + "function": "create_source", + "line": 1050 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/sources", + "function": "list_public_sources", + "line": 1068 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/sources/{source_id}", + "function": "get_public_source", + "line": 1079 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/sources", + "function": "list_staff_sources", + "line": 1097 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/sources/{source_id}", + "function": "get_staff_source", + "line": 1112 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/sources/{source_id}/transitions", + "function": "transition_source", + "line": 1127 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/titles", + "function": "create_title", + "line": 1148 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/chapters", + "function": "create_chapter", + "line": 1163 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/sections", + "function": "create_section", + "line": 1178 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/sections/{section_id}/versions", + "function": "create_section_version", + "line": 1193 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/sections/lookup", + "function": "lookup_section", + "line": 1244 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/sections/resolve", + "function": "resolve_section", + "line": 1255 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/sections/{section_id}/history", + "function": "section_history", + "line": 1354 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/sections/{section_id}/permalink", + "function": "section_permalink", + "line": 1363 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/search", + "function": "search_sections", + "line": 1372 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/popular-questions", + "function": "list_popular_questions", + "line": 1381 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/popular-questions", + "function": "create_popular_question", + "line": 1403 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/sections/{section_number}/related", + "function": "related_materials", + "line": 1453 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/citations/build", + "function": "build_citation", + "line": 1466 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/sections/{section_ref}/export", + "function": "export_section", + "line": 1472 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/questions/answer", + "function": "answer_question", + "line": 1478 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/sections/{section_id}/notes", + "function": "create_interpretation_note", + "line": 1494 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/sections/{section_id}/notes", + "function": "list_interpretation_notes", + "line": 1517 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/audit-events", + "function": "list_staff_audit_events", + "line": 1532 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/imports/local-bundle", + "function": "create_local_import_job", + "line": 1548 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/imports/shared-pdf", + "function": "create_shared_pdf_import_job", + "line": 1560 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/imports", + "function": "list_import_jobs", + "line": 1594 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/imports/{job_id}", + "function": "get_import_job", + "line": 1604 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/imports/{job_id}/retry", + "function": "retry_import_job", + "line": 1619 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/imports/{job_id}/provenance", + "function": "get_import_provenance", + "line": 1635 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/imports/{job_id}/tree", + "function": "get_imported_tree", + "line": 1650 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/sync/codifier-sources", + "function": "configure_codifier_sync_source", + "line": 1673 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_code/staff/sync/codifier-sources", + "function": "list_codifier_sync_sources", + "line": 1694 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/sync/codifier-sources/{source_id}/run", + "function": "run_codifier_sync_source", + "line": 1709 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/townlight_meetings/ordinance-events", + "function": "create_townlight_meetings_ordinance_event", + "line": 1730 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/townlight_meetings/ordinance-events/{event_id}/resolve", + "function": "resolve_townlight_meetings_ordinance_event", + "line": 1756 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/sections/{section_id}/summaries", + "function": "create_plain_language_summary", + "line": 1806 }, { - "name": "AttachDocument", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "title", - "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "citation", - "type": "str", - "default": "''" - }, - { - "name": "file", - "type": "ManagedFileReceipt", - "default": "" - } - ], - "line": 361, - "doc": "" + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/summaries/{summary_id}/approve", + "function": "approve_plain_language_summary", + "line": 1841 }, { - "name": "AttachReleaseCopy", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "status", - "type": "Literal['release-ready copy', 'redacted copy']", - "default": "" - }, - { - "name": "note", - "type": "str", - "default": "''" - }, - { - "name": "added_by", - "type": "str", - "default": "''" - }, - { - "name": "file", - "type": "ManagedFileReceipt", - "default": "" - } - ], - "line": 367, - "doc": "" + "method": "GET", + "declared_path": "/api/v1/townlight_code/sections/{section_id}/summaries", + "function": "list_public_plain_language_summaries", + "line": 1866 }, { - "name": "RecordsDocumentView", + "method": "POST", + "declared_path": "/api/v1/townlight_code/staff/questions/answer", + "function": "answer_staff_question", + "line": 1895 + } + ], + "models": [ + { + "name": "SourceCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", - "type": "str", - "default": "" - }, - { - "name": "attachment_id", - "type": "str", - "default": "" - }, - { - "name": "title", - "type": "str", - "default": "" - }, - { - "name": "original_path", - "type": "str", - "default": "" - }, - { - "name": "stored_path", - "type": "str", - "default": "" + "name": "source_id", + "type": "str | None", + "line": 291 }, { - "name": "citation", + "name": "name", "type": "str", - "default": "" + "line": 292 }, { - "name": "sha256", + "name": "publisher", "type": "str", - "default": "" - }, - { - "name": "size_bytes", - "type": "int", - "default": "" + "line": 293 }, { - "name": "status", + "name": "source_type", "type": "str", - "default": "" + "line": 294 }, { - "name": "added_by", + "name": "source_category", "type": "str", - "default": "" + "line": 295 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "source_url", + "type": "str | None", + "line": 296 }, { - "name": "release_original_path", - "type": "str", - "default": "''" + "name": "file_reference", + "type": "str | None", + "line": 297 }, { - "name": "release_stored_path", - "type": "str", - "default": "''" + "name": "retrieved_at", + "type": "datetime | None", + "line": 298 }, { - "name": "release_file_name", - "type": "str", - "default": "''" + "name": "retrieval_method", + "type": "str | None", + "line": 299 }, { - "name": "release_sha256", - "type": "str", - "default": "''" + "name": "checksum", + "type": "str | None", + "line": 300 }, { - "name": "release_size_bytes", - "type": "int", - "default": "0" + "name": "source_owner", + "type": "str | None", + "line": 301 }, { - "name": "release_status", - "type": "str", - "default": "''" + "name": "is_official", + "type": "bool", + "line": 302 }, { - "name": "release_note", - "type": "str", - "default": "''" + "name": "official_status_note", + "type": "str | None", + "line": 303 }, { - "name": "release_added_by", + "name": "status", "type": "str", - "default": "''" + "line": 304 }, { - "name": "release_added_at_unix_seconds", - "type": "int | None", - "default": "None" + "name": "staff_notes", + "type": "str | None", + "line": 305 } ], - "line": 374, - "doc": "" + "line": 286 }, { - "name": "ReleasePackageView", + "name": "SourceTransitionRequest", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", + "name": "to_status", "type": "str", - "default": "" + "line": 313 }, { - "name": "export_path", + "name": "actor", "type": "str", - "default": "" + "line": 314 }, { - "name": "package_hash", + "name": "reason", "type": "str", - "default": "" - }, - { - "name": "document_count", - "type": "int", - "default": "" - }, - { - "name": "release_artifact_count", - "type": "int", - "default": "" - }, - { - "name": "search_session_count", - "type": "int", - "default": "" - }, - { - "name": "release_count", - "type": "int", - "default": "" - }, - { - "name": "redacted_count", - "type": "int", - "default": "" - }, - { - "name": "exempt_count", - "type": "int", - "default": "" - }, - { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" - } - ], - "line": 397, - "doc": "" - }, - { - "name": "PrepareArtifact", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "kind", - "type": "Literal['response', 'release-package']", - "default": "" + "line": 315 } ], - "line": 410, - "doc": "" + "line": 308 }, { - "name": "ArtifactPlan", + "name": "TitleCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "artifact_id", - "type": "str", - "default": "" - }, - { - "name": "file_name", - "type": "str", - "default": "" + "name": "title_id", + "type": "str | None", + "line": 323 }, { - "name": "content", + "name": "title_number", "type": "str", - "default": "" + "line": 324 }, { - "name": "sha256", + "name": "title_name", "type": "str", - "default": "" + "line": 325 }, { - "name": "created_at_unix_seconds", + "name": "sort_order", "type": "int", - "default": "" - } - ], - "line": 414, - "doc": "" - }, - { - "name": "CompleteArtifact", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "export_path", - "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 422, - "doc": "" - }, - { - "name": "PublicIntake", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "requester", - "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "requesterContact", - "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "summary", - "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "deadline", - "type": "str", - "default": "''" - } - ], - "line": 426, - "doc": "" - }, - { - "name": "PublicLookup", - "bases": [ - "NativePayload" - ], - "fields": [ - { - "name": "trackingNumber", - "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "requesterContact", - "type": "str", - "default": "Field(min_length=1)" + "line": 326 } ], - "line": 433, - "doc": "" + "line": 318 }, { - "name": "PublicMessage", + "name": "ChapterCreate", "bases": [ - "PublicLookup" + "BaseModel" ], "fields": [ { - "name": "publicRequestMessage", - "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 438, - "doc": "" - }, - { - "name": "GeneratedDraft", - "bases": [ - "NativePayload" - ], - "fields": [ + "name": "chapter_id", + "type": "str | None", + "line": 334 + }, { - "name": "text", + "name": "title_id", "type": "str", - "default": "Field(min_length=1)" + "line": 335 }, { - "name": "model", + "name": "chapter_number", "type": "str", - "default": "Field(min_length=1)" + "line": 336 }, { - "name": "previous_response_sha256", + "name": "chapter_name", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 337 + }, + { + "name": "sort_order", + "type": "int", + "line": 338 } ], - "line": 442, - "doc": "" + "line": 329 }, { - "name": "NotificationView", + "name": "SectionCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", - "type": "str", - "default": "" - }, - { - "name": "notification_id", - "type": "str", - "default": "" + "name": "section_id", + "type": "str | None", + "line": 346 }, { - "name": "module_id", + "name": "chapter_id", "type": "str", - "default": "" + "line": 347 }, { - "name": "record_id", + "name": "section_number", "type": "str", - "default": "" + "line": 348 }, { - "name": "audience", + "name": "section_heading", "type": "str", - "default": "" + "line": 349 }, { - "name": "channel", - "type": "str", - "default": "" + "name": "parent_section_id", + "type": "str | None", + "line": 350 }, { - "name": "subject", - "type": "str", - "default": "" + "name": "sort_order", + "type": "int", + "line": 351 }, { - "name": "body", - "type": "str", - "default": "" + "name": "administrative_regulation_refs", + "type": "list[str]", + "line": 352 }, { - "name": "status", - "type": "str", - "default": "" + "name": "resolution_refs", + "type": "list[str]", + "line": 353 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "policy_refs", + "type": "list[str]", + "line": 354 }, { - "name": "sent_at_unix_seconds", - "type": "int | None", - "default": "" + "name": "approved_summary_refs", + "type": "list[str]", + "line": 355 } ], - "line": 448, - "doc": "" + "line": 341 }, { - "name": "PublicationView", + "name": "SectionVersionCreate", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", - "type": "str", - "default": "" + "name": "version_id", + "type": "str | None", + "line": 363 }, { - "name": "source_module", + "name": "section_id", "type": "str", - "default": "" + "line": 364 }, { - "name": "source_record_id", + "name": "source_id", "type": "str", - "default": "" + "line": 365 }, { - "name": "record_type", + "name": "version_label", "type": "str", - "default": "" + "line": 366 }, { - "name": "public_payload", + "name": "body", "type": "str", - "default": "" + "line": 367 }, { - "name": "payload_hash", + "name": "effective_start", + "type": "date", + "line": 368 + }, + { + "name": "effective_end", + "type": "date | None", + "line": 369 + }, + { + "name": "status", "type": "str", - "default": "" + "line": 370 }, { - "name": "published_at_unix_seconds", - "type": "int", - "default": "" + "name": "is_current", + "type": "bool", + "line": 371 }, { - "name": "retracted_at_unix_seconds", - "type": "int | None", - "default": "None" + "name": "adoption_event_id", + "type": "str | None", + "line": 372 }, { - "name": "retracted_by", - "type": "str", - "default": "''" + "name": "amendment_event_id", + "type": "str | None", + "line": 373 + }, + { + "name": "amendment_summary", + "type": "str | None", + "line": 374 + }, + { + "name": "prior_version_id", + "type": "str | None", + "line": 375 } ], - "line": 462, - "doc": "" + "line": 358 }, { - "name": "AuditView", + "name": "QuestionAnswerRequest", "bases": [ - "NativeView" + "BaseModel" ], "fields": [ { - "name": "id", + "name": "question", "type": "str", - "default": "" + "line": 383 }, { - "name": "module_id", - "type": "str", - "default": "" + "name": "section_number", + "type": "str | None", + "line": 384 }, { - "name": "action", - "type": "str", - "default": "" - }, + "name": "as_of", + "type": "date | None", + "line": 385 + } + ], + "line": 378 + }, + { + "name": "SectionResolveRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "summary", + "name": "consumer_module", "type": "str", - "default": "" + "line": 393 }, { - "name": "created_at_unix_seconds", - "type": "int", - "default": "" + "name": "section_number", + "type": "str | None", + "line": 394 }, { - "name": "previous_hash", - "type": "str", - "default": "" + "name": "query", + "type": "str | None", + "line": 395 }, { - "name": "entry_hash", - "type": "str", - "default": "" + "name": "as_of", + "type": "date | None", + "line": 396 } ], - "line": 474, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/app/desktop_bridge/station.py", - "sha256": "2f53398b6a897f804419ea5025895bb7dc468d8891dc553b20bb14cb5d0a8084", - "routes": [ - { - "method": "GET", - "path": "/station/context", - "router": "router", - "prefix_resolved": false, - "name": "context", - "signature": "request: Request, capability: Literal['capture', 'read'], proof: str | None=Header(default=None, alias='X-Townlight-Session'), session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 43, - "doc": "", - "decorator": "router.get('/station/context')", - "errors": [ - "HTTPException(403, 'This staff role cannot perform this Station operation')", - "HTTPException(401, str(exc))" - ] - }, - { - "method": "POST", - "path": "/requests/{request_id}/station-recordings", - "router": "router", - "prefix_resolved": false, - "name": "attach", - "signature": "request_id: UUID, data: Selection, request: Request, actor=Depends(station_actor), session: AsyncSession=Depends(get_async_session)", - "returns": "", - "line": 79, - "doc": "", - "decorator": "router.post('/requests/{request_id}/station-recordings', response_model=RecordsOperationRead)", - "errors": [ - "HTTPException(404, 'Records request not found')", - "HTTPException(409, str(exc))", - "HTTPException(422, 'Station evidence not attached; existing evidence preserved')", - "HTTPException(response.status_code, 'Station denied this recording')", - "HTTPException(409, 'Station recording is incomplete or changed; refresh selection')" - ] - } - ], - "models": [ + "line": 388 + }, { - "name": "Selection", + "name": "PopularQuestionCreate", "bases": [ "BaseModel" ], "fields": [ { - "name": "recording_id", - "type": "UUID", - "default": "" - }, - { - "name": "expected_sha256", - "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" - } - ], - "line": 61, - "doc": "" - } - ], - "configuration": [ - { - "variable": "TOWNLIGHT_STATION_URL", - "default": "''", - "line": 33 - } - ] - } - ] - }, - "meetings": { - "package": "civicclerk", - "source": [ - { - "source": "installed-owned-source/civicclerk/__init__.py", - "sha256": "e8c6f4d348bc657f507a748a9f941317ea223f13facbc6f71d5777872d472564", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/agenda_intake.py", - "sha256": "efe504bf430447fdd19ee39fbeace4c03365c6bd5f967f29bba40bd3dd48cfd2", - "routes": [], - "models": [ - { - "name": "AgendaIntakeItem", - "bases": [], - "fields": [ - { - "name": "id", - "type": "str", - "default": "" + "name": "question_id", + "type": "str | None", + "line": 404 }, { - "name": "title", + "name": "question_text", "type": "str", - "default": "" + "line": 405 }, { - "name": "department_name", + "name": "section_number", "type": "str", - "default": "" + "line": 406 }, { - "name": "submitted_by", + "name": "answer_excerpt", "type": "str", - "default": "" + "line": 407 }, { - "name": "summary", + "name": "audience", "type": "str", - "default": "" + "line": 408 }, { "name": "status", "type": "str", - "default": "" - }, - { - "name": "readiness_status", - "type": "str", - "default": "" - }, - { - "name": "source_references", - "type": "list[dict]", - "default": "" - }, - { - "name": "reviewer", - "type": "str | None", - "default": "" - }, - { - "name": "review_notes", - "type": "str | None", - "default": "" - }, - { - "name": "promoted_agenda_item_id", - "type": "str | None", - "default": "" + "line": 409 }, { - "name": "promoted_at", - "type": "datetime | None", - "default": "" - }, + "name": "is_popular", + "type": "bool", + "line": 410 + } + ], + "line": 399 + }, + { + "name": "InterpretationNoteCreate", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "promotion_audit_hash", + "name": "note_id", "type": "str | None", - "default": "" + "line": 418 }, { - "name": "last_audit_hash", + "name": "note_text", "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "" + "line": 419 }, { - "name": "updated_at", - "type": "datetime", - "default": "" + "name": "status", + "type": "str", + "line": 420 } ], - "line": 51, - "doc": "Department-submitted item waiting for staff readiness review." - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/agenda_lifecycle.py", - "sha256": "e1e3fb531ca432cbc94bb258454776b8f97112077c5bbcd7d015a6f82f751a14", - "routes": [], - "models": [ + "line": 413 + }, { - "name": "TransitionResult", - "bases": [], + "name": "PlainLanguageSummaryCreate", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "allowed", - "type": "bool", - "default": "" + "name": "summary_id", + "type": "str | None", + "line": 428 }, { - "name": "http_status", - "type": "int", - "default": "" + "name": "section_version_id", + "type": "str", + "line": 429 }, { - "name": "message", + "name": "summary_text", "type": "str", - "default": "" + "line": 430 }, { - "name": "fix", + "name": "language_code", "type": "str", - "default": "" + "line": 431 }, { - "name": "audit_entry", - "type": "dict[str, object]", - "default": "" + "name": "status", + "type": "str", + "line": 432 } ], - "line": 39, - "doc": "" + "line": 423 }, { - "name": "AgendaItemRecord", - "bases": [], + "name": "TownlightMeetingsOrdinanceEventCreate", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "id", + "name": "event_id", + "type": "str | None", + "line": 440 + }, + { + "name": "external_event_id", "type": "str", - "default": "" + "line": 441 }, { - "name": "title", + "name": "townlight_meetings_meeting_id", "type": "str", - "default": "" + "line": 442 }, { - "name": "department_name", + "name": "townlight_meetings_agenda_item_id", + "type": "str", + "line": 443 + }, + { + "name": "ordinance_number", + "type": "str", + "line": 444 + }, + { + "name": "title", "type": "str", - "default": "" + "line": 445 }, { "name": "status", "type": "str", - "default": "'DRAFTED'" + "line": 446 }, { - "name": "audit_entries", - "type": "list[dict[str, object]]", - "default": "field(default_factory=list)" + "name": "affected_sections", + "type": "list[str]", + "line": 447 }, { - "name": "meeting_id", + "name": "source_document_url", + "type": "str", + "line": 448 + }, + { + "name": "source_document_hash", + "type": "str", + "line": 449 + }, + { + "name": "ordinance_text", + "type": "str", + "line": 450 + }, + { + "name": "adopted_at", + "type": "datetime | None", + "line": 451 + }, + { + "name": "failure_reason", "type": "str | None", - "default": "None" + "line": 452 } ], - "line": 48, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/cc7_completeness.py", - "sha256": "683d4ba8f4bf4a047e0e3d87725497f30da5210c4496e4586eecc20b1784a468", - "routes": [], - "models": [ + "line": 435 + }, { - "name": "ApiCategory", - "bases": [], + "name": "TownlightMeetingsOrdinanceEventResolve", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "id", + "name": "section_version_id", "type": "str", - "default": "" + "line": 460 + } + ], + "line": 455 + }, + { + "name": "ImportBundleCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "job_id", + "type": "str | None", + "line": 468 }, { - "name": "label", + "name": "connector_type", "type": "str", - "default": "" + "line": 469 }, { - "name": "paths", - "type": "tuple[str, ...]", - "default": "" + "name": "source", + "type": "SourceCreate", + "line": 470 }, { - "name": "protected", - "type": "bool", - "default": "" + "name": "sources", + "type": "list[SourceCreate]", + "line": 471 }, { - "name": "auth_scope", - "type": "str", - "default": "'staff-only'" + "name": "titles", + "type": "list[TitleCreate]", + "line": 472 + }, + { + "name": "chapters", + "type": "list[ChapterCreate]", + "line": 473 + }, + { + "name": "sections", + "type": "list[SectionCreate]", + "line": 474 + }, + { + "name": "versions", + "type": "list[SectionVersionCreate]", + "line": 475 + }, + { + "name": "provenance", + "type": "dict[str, Any]", + "line": 476 } ], - "line": 12, - "doc": "" + "line": 463 }, { - "name": "FrontendPage", - "bases": [], + "name": "SharedPdfImportCreate", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "id", + "name": "pdf_path", "type": "str", - "default": "" + "line": 484 }, { - "name": "label", + "name": "force_reingest", + "type": "bool", + "line": 485 + } + ], + "line": 479 + }, + { + "name": "CodifierSyncConfigureRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", "type": "str", - "default": "" + "line": 493 }, { - "name": "surface", + "name": "sync_schedule", "type": "str", - "default": "" + "line": 494 }, { - "name": "evidence_states", - "type": "tuple[str, ...]", - "default": "REQUIRED_VIEW_STATES" + "name": "allowlisted_hosts", + "type": "list[str]", + "line": 495 + } + ], + "line": 488 + }, + { + "name": "CodifierSyncRunRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "payload", + "type": "ImportBundleCreate", + "line": 503 + }, + { + "name": "changed_since", + "type": "datetime | None", + "line": 504 } ], - "line": 21, - "doc": "" + "line": 498 } ], + "configuration": [ + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 1988 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 1999 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 2010 + }, + { + "environment": "TOWNLIGHT_CODE_DEMO_ACTOR", + "line": 2062 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 173 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 201 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 224 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 252 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 1567 + }, + { + "environment": "DATABASE_URL", + "line": 1567 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 2020 + }, + { + "environment": "TOWNLIGHT_CODE_DEMO_SEED", + "line": 2056 + } + ] + }, + { + "source": "townlight_code/migrations/__init__.py", + "sha256": "df7969bd664b7d37c15448defbfc1facdeabac4576ebe265dbeb6e4a20bf17b8", + "bytes": 48, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/alembic.ini", + "sha256": "bd5b1e30a38e20eeef817cd43e76fe592f9c13874624b2421a83d52a78e02440", + "bytes": 761, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/env.py", + "sha256": "a6be395a9afcff83bf1b2334cf1f3744409e12c15f226027249df1a0f713366c", + "bytes": 2408, + "routes": [], + "models": [], + "configuration": [ + { + "environment": "DATABASE_URL", + "line": 24 + } + ] + }, + { + "source": "townlight_code/migrations/guards.py", + "sha256": "db594a5a1532e7edc1b68d7c056e5b105e4be028e034ffecc3ba62f8e088124f", + "bytes": 618, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/__init__.py", + "sha256": "c86c118637e0149a6a9613dc4d6b106a0777add135b92a628ca3a481bceaad1e", + "bytes": 47, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/townlight_code_0001_schema.py", + "sha256": "fbaae32609abcfe3b8ac6fe4135f98007fd30c0ed87343acdae133d0de3d17fa", + "bytes": 7349, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/townlight_code_0002_source_registry_records.py", + "sha256": "3f4ea306bed500f106e2fb3e3c72a699a9fb4834d0467e4670ae54bfcd806749", + "bytes": 1710, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/townlight_code_0003_popular_question_records.py", + "sha256": "d63be371906b6dbf380391f32892b0c52d9099de8de426a50be6cec0597eca40", + "bytes": 1766, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/townlight_code_0004_section_lifecycle_records.py", + "sha256": "7930b4b319f4328d518c9500b35cb065aea8fe6b0c15eae9fdaf2844f125c0f0", + "bytes": 3664, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/townlight_code_0005_staff_summary_records.py", + "sha256": "cfa383851d01d6a8c9a19175c36ab1754af06d8ef9151029d7f7b8a1905dab9d", + "bytes": 3264, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/townlight_code_0006_ordinance_handoff_records.py", + "sha256": "82d7888ed0048e5e4b2c79ec4eab96ba223527bc1c5bf264525292fce658ef20", + "bytes": 2283, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/connector_import_sync.py", - "sha256": "1d30954f15c9b6d8a9afb5ef9392b4a7475bfd7d926b040707380a7005b8f96e", + "source": "townlight_code/migrations/versions/townlight_code_0007_import_job_records.py", + "sha256": "0aadb2d3d74e0f8c166e140fa9ded8b549af7bfc00354ac57bf7645e5e5142d1", + "bytes": 1429, "routes": [], - "models": [ - { - "name": "ImportAttempt", - "bases": [], - "fields": [ - { - "name": "connector", - "type": "str", - "default": "" - }, - { - "name": "payload_path", - "type": "Path", - "default": "" - }, - { - "name": "ok", - "type": "bool", - "default": "" - }, - { - "name": "message", - "type": "str", - "default": "" - }, - { - "name": "fix", - "type": "str", - "default": "" - }, - { - "name": "normalized", - "type": "dict[str, Any] | None", - "default": "None" - } - ], - "line": 14, - "doc": "" - } - ], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/connectors.py", - "sha256": "31c19cd11f63ae32db9b51f0da57ac5cc8b637a63a16c6b1287c10a7d5afda9d", + "source": "townlight_code/migrations/versions/townlight_code_0008_codifier_sync.py", + "sha256": "c0bcc3e99b24e7e4ce2f4a24c8ee2e556b5d7fa77ba55c3627b42b6b7efc368f", + "bytes": 3028, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/demo_seed.py", - "sha256": "d983fb6b80310ce84a0c703f55b5b35e5ecb73f8b5f0c407bab1f9edf27f5cbb", + "source": "townlight_code/migrations/versions/townlight_code_0009_operational_state.py", + "sha256": "fd06ecb49b1f75ab7dbddfc2b29cf3a4730f259c4c2d08a35ef42fcc7d65ef5b", + "bytes": 1708, "routes": [], - "models": [ - { - "name": "DemoSeedSummary", - "bases": [ - "TypedDict" - ], - "fields": [ - { - "name": "city", - "type": "str", - "default": "" - }, - { - "name": "meeting_body_count", - "type": "int", - "default": "" - }, - { - "name": "meeting_count", - "type": "int", - "default": "" - }, - { - "name": "agenda_intake_count", - "type": "int", - "default": "" - }, - { - "name": "packet_count", - "type": "int", - "default": "" - }, - { - "name": "notice_count", - "type": "int", - "default": "" - }, - { - "name": "motion_count", - "type": "int", - "default": "" - }, - { - "name": "minutes_draft_count", - "type": "int", - "default": "" - }, - { - "name": "public_record_count", - "type": "int", - "default": "" - }, - { - "name": "primary_meeting_id", - "type": "str", - "default": "" - } - ], - "line": 35, - "doc": "Counts and representative ids produced by the demo seed." - } - ], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/townlight_code_0010_handoff_resolution.py", + "sha256": "154c2f55ce0b8a5b5d6a301e3ba476f52d0cd6f9757a2821912b4d1c26f5cabf", + "bytes": 1404, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/migrations/versions/townlight_code_0011_semantic_search.py", + "sha256": "dbf61708c6b5ae68dcc085b528b56fb37be906936d225dcce5f12d359ee2a80c", + "bytes": 1696, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/desktop_delivery.py", - "sha256": "cbb7f44aee90b9ea16c60c1f64efffa8bb7204765d49a5ce80fe52e2670d384e", + "source": "townlight_code/migrations/versions/townlight_code_0012_drop_local_search.py", + "sha256": "2665db8af43b4ada8a889cf2745f1e2cd59d69a32e29070650019b035119e290", + "bytes": 641, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/integration_contracts.py", - "sha256": "3899a7aad3af2464ab35d15fee07b952e130cb207a36d1a07dfb6986c67bd805", + "source": "townlight_code/mock_city_environment.py", + "sha256": "13ccb031171bc7bfb0dfea4e66dcf3617559be54eaa4c93c9883bef6050ba5c2", + "bytes": 14208, "routes": [], "models": [ { - "name": "IntegrationCheck", + "name": "MockCityCodifierContract", "bases": [], "fields": [ { - "name": "contract_id", + "name": "connector", "type": "str", - "default": "" + "line": 34 }, { - "name": "scenario", + "name": "publisher", "type": "str", - "default": "" - }, - { - "name": "ok", - "type": "bool", - "default": "" + "line": 35 }, { - "name": "message", + "name": "source_type", "type": "str", - "default": "" + "line": 36 }, { - "name": "fix", - "type": "str", - "default": "" - } - ], - "line": 17, - "doc": "A no-network adversarial check for one integration contract." - }, - { - "name": "IntegrationContract", - "bases": [], - "fields": [ - { - "name": "id", + "name": "interface_status", "type": "str", - "default": "" + "line": 37 }, { - "name": "label", + "name": "source_url", "type": "str", - "default": "" - }, - { - "name": "status", - "type": "IntegrationStatus", - "default": "" + "line": 38 }, { - "name": "mode", + "name": "retrieval_method", "type": "str", - "default": "" - }, - { - "name": "proof_model", - "type": "Literal['live_wire_validation', 'in_process_boundary_validation']", - "default": "" - }, - { - "name": "dependent_module_required", - "type": "bool", - "default": "" - }, - { - "name": "network_calls", - "type": "bool", - "default": "" + "line": 39 }, { - "name": "contract_artifact", + "name": "auth_method", "type": "str", - "default": "" - }, - { - "name": "supported_operations", - "type": "tuple[str, ...]", - "default": "" + "line": 40 }, { - "name": "absent_dependency_behavior", + "name": "delta_query_param", "type": "str", - "default": "" + "line": 41 }, { - "name": "operator_fix", + "name": "sample_file", "type": "str", - "default": "" + "line": 42 }, { - "name": "adversarial_scenarios", - "type": "tuple[str, ...]", - "default": "" + "name": "source_owner", + "type": "str", + "line": 43 } ], - "line": 37, - "doc": "Operator-facing contract for an integration that may not exist yet." - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/main.py", - "sha256": "d224d17b9869739b6faaddcd7213e202f8b710f72cda402479c0c6a84e737285", - "routes": [ - { - "method": "GET", - "path": "/", - "router": "app", - "prefix_resolved": true, - "name": "root", - "signature": "", - "returns": "dict[str, str]", - "line": 492, - "doc": "Describe what the runtime foundation currently provides.", - "decorator": "app.get('/')", - "errors": [] - }, - { - "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "health", - "signature": "", - "returns": "dict[str, str]", - "line": 550, - "doc": "Provide a simple operational health check for IT staff.", - "decorator": "app.get('/health')", - "errors": [] - }, - { - "method": "GET", - "path": "/favicon.ico", - "router": "app", - "prefix_resolved": true, - "name": "favicon", - "signature": "", - "returns": "Response", - "line": 561, - "doc": "Return an empty public favicon response so browser QA stays console-clean.", - "decorator": "app.get('/favicon.ico', response_class=Response)", - "errors": [] - }, - { - "method": "GET", - "path": "/staff", - "router": "app", - "prefix_resolved": true, - "name": "staff_dashboard", - "signature": "", - "returns": "str", - "line": 567, - "doc": "Render the staff-facing workflow foundation.", - "decorator": "app.get('/staff', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/public", - "router": "app", - "prefix_resolved": true, - "name": "public_portal", - "signature": "", - "returns": "str", - "line": 617, - "doc": "Render the resident-facing public portal shell.", - "decorator": "app.get('/public', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/staff/session", - "router": "app", - "prefix_resolved": true, - "name": "staff_session", - "signature": "request: Request", - "returns": "dict[str, object]", - "line": 623, - "doc": "Describe the current staff access mode for the browser workflow shell.", - "decorator": "app.get('/staff/session')", - "errors": [ - "HTTPException(status_code=401, detail={'message': 'Staff authentication is required.', 'fix': f'The default {STAFF_AUTH_MODE_ENV_VAR}={STAFF_PROTECTED_MODE} denies anonymous staff writes. Configure bearer, trusted-header, or OIDC staff auth, or explicitly set {STAFF_AUTH_MODE_ENV_VAR}={STAFF_OPEN_MODE} only for local rehearsal.'}, headers={'WWW-Authenticate': 'Bearer'})", - "HTTPException(status_code=500, detail={'message': 'Staff session principal is missing.', 'fix': 'Retry the request with a configured bearer token or review staff auth middleware setup.'})" - ] - }, - { - "method": "GET", - "path": "/staff/login", - "router": "app", - "prefix_resolved": true, - "name": "staff_login", - "signature": "request: Request", - "returns": "RedirectResponse", - "line": 705, - "doc": "Start the municipal OIDC browser sign-in flow for staff users.", - "decorator": "app.get('/staff/login')", - "errors": [ - "HTTPException(status_code=400, detail={'message': 'OIDC browser sign-in is available only when staff auth mode is oidc.', 'fix': f'Set {STAFF_AUTH_MODE_ENV_VAR}={STAFF_OIDC_MODE} before using /staff/login.'})", - "HTTPException(status_code=503, detail={'message': 'OIDC browser sign-in is not fully configured.', 'fix': _oidc_browser_login_fix(missing)})" - ] - }, - { - "method": "GET", - "path": "/staff/oidc/callback", - "router": "app", - "prefix_resolved": true, - "name": "staff_oidc_callback", - "signature": "request: Request", - "returns": "RedirectResponse", - "line": 763, - "doc": "Complete the OIDC authorization-code callback and issue a staff session cookie.", - "decorator": "app.get('/staff/oidc/callback')", - "errors": [ - "HTTPException(status_code=400, detail={'message': 'OIDC callback received while staff auth mode is not oidc.', 'fix': f'Set {STAFF_AUTH_MODE_ENV_VAR}={STAFF_OIDC_MODE}, then restart sign-in from /staff/login.'})", - "HTTPException(status_code=400, detail={'message': 'OIDC provider returned a sign-in error.', 'fix': f\"Review the provider response '{callback_error}', then restart sign-in from /staff/login.\"})", - "HTTPException(status_code=400, detail={'message': 'OIDC sign-in state did not match.', 'fix': 'Restart sign-in from /staff/login. If this repeats, confirm cookies are allowed for the CivicMeetings host.'})", - "HTTPException(status_code=400, detail={'message': 'OIDC sign-in PKCE verifier is missing.', 'fix': 'Restart sign-in from /staff/login. If this repeats, confirm cookies are allowed for the CivicMeetings host.'})", - "HTTPException(status_code=400, detail={'message': 'OIDC callback did not include an authorization code.', 'fix': 'Restart sign-in from /staff/login and confirm the provider uses authorization-code flow.'})", - "HTTPException(status_code=503, detail={'message': 'OIDC browser sign-in is not fully configured.', 'fix': _oidc_browser_login_fix(missing)})", - "HTTPException(status_code=502, detail={'message': 'OIDC token response did not include an ID token or access token.', 'fix': 'Confirm the provider app registration issues an ID token or API access token for CivicMeetings.'})" - ] - }, - { - "method": "GET", - "path": "/staff/logout", - "router": "app", - "prefix_resolved": true, - "name": "staff_logout", - "signature": "request: Request", - "returns": "RedirectResponse", - "line": 861, - "doc": "Clear the local CivicMeetings staff browser session.", - "decorator": "app.get('/staff/logout')", - "errors": [] - }, - { - "method": "POST", - "path": "/staff/logout", - "router": "app", - "prefix_resolved": true, - "name": "staff_logout", - "signature": "request: Request", - "returns": "RedirectResponse", - "line": 861, - "doc": "Clear the local CivicMeetings staff browser session.", - "decorator": "app.post('/staff/logout')", - "errors": [] - }, - { - "method": "GET", - "path": "/staff/auth-readiness", - "router": "app", - "prefix_resolved": true, - "name": "staff_auth_readiness", - "signature": "", - "returns": "dict[str, object]", - "line": 873, - "doc": "Report whether the current staff auth mode is configured for safe use.", - "decorator": "app.get('/staff/auth-readiness')", - "errors": [] - }, - { - "method": "GET", - "path": "/admin/config", - "router": "app", - "prefix_resolved": true, - "name": "admin_config", - "signature": "", - "returns": "dict[str, object]", - "line": 935, - "doc": "Describe CC-7 runtime coverage and staff-auth configuration posture.", - "decorator": "app.get('/admin/config')", - "errors": [] - }, - { - "method": "GET", - "path": "/integrations/readiness", - "router": "app", - "prefix_resolved": true, - "name": "integrations_readiness", - "signature": "", - "returns": "dict[str, object]", - "line": 968, - "doc": "Report live or in-process integration boundary contracts.", - "decorator": "app.get('/integrations/readiness')", - "errors": [] - }, - { - "method": "GET", - "path": "/admin/prompts", - "router": "app", - "prefix_resolved": true, - "name": "admin_prompts", - "signature": "", - "returns": "dict[str, object]", - "line": 975, - "doc": "List prompt-library definitions and public approval gates for admins.", - "decorator": "app.get('/admin/prompts')", - "errors": [] - }, - { - "method": "POST", - "path": "/agenda-items", - "router": "app", - "prefix_resolved": true, - "name": "create_agenda_item", - "signature": "payload: AgendaItemCreate", - "returns": "dict[str, str]", - "line": 1009, - "doc": "Create a draft agenda item for lifecycle enforcement.", - "decorator": "app.post('/agenda-items', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/agenda-items/{item_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_agenda_item", - "signature": "item_id: str", - "returns": "dict[str, str]", - "line": 1018, - "doc": "Return the current agenda item state.", - "decorator": "app.get('/agenda-items/{item_id}')", - "errors": [ - "HTTPException(status_code=404, detail='Agenda item not found.')" - ] - }, - { - "method": "POST", - "path": "/agenda-items/{item_id}/transitions", - "router": "app", - "prefix_resolved": true, - "name": "transition_agenda_item", - "signature": "item_id: str, payload: AgendaItemTransitionRequest", - "returns": "dict[str, str]", - "line": 1027, - "doc": "Apply a canonical agenda item lifecycle transition.", - "decorator": "app.post('/agenda-items/{item_id}/transitions')", - "errors": [ - "HTTPException(status_code=404, detail='Agenda item not found.')", - "HTTPException(status_code=result.http_status, detail={'message': result.message, 'fix': result.fix, 'current_status': item.status, 'requested_status': payload.to_status})" - ] - }, - { - "method": "GET", - "path": "/agenda-items/{item_id}/audit", - "router": "app", - "prefix_resolved": true, - "name": "get_agenda_item_audit", - "signature": "item_id: str", - "returns": "dict[str, list[dict[str, object]]]", - "line": 1058, - "doc": "Return lifecycle audit entries for an agenda item.", - "decorator": "app.get('/agenda-items/{item_id}/audit')", - "errors": [ - "HTTPException(status_code=404, detail='Agenda item not found.')" - ] - }, - { - "method": "POST", - "path": "/agenda-intake", - "router": "app", - "prefix_resolved": true, - "name": "submit_agenda_intake_item", - "signature": "payload: AgendaIntakeCreate", - "returns": "dict", - "line": 1067, - "doc": "Submit a department agenda item into the database-backed staff queue.", - "decorator": "app.post('/agenda-intake', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/agenda-intake", - "router": "app", - "prefix_resolved": true, - "name": "list_agenda_intake_items", - "signature": "readiness_status: str | None=None", - "returns": "dict[str, list[dict]]", - "line": 1080, - "doc": "List department-submitted agenda intake items awaiting staff review.", - "decorator": "app.get('/agenda-intake')", - "errors": [] - }, - { - "method": "POST", - "path": "/agenda-intake/{item_id}/review", - "router": "app", - "prefix_resolved": true, - "name": "review_agenda_intake_item", - "signature": "item_id: str, payload: AgendaIntakeReviewRequest", - "returns": "dict", - "line": 1093, - "doc": "Record clerk readiness review for an intake queue item.", - "decorator": "app.post('/agenda-intake/{item_id}/review')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Agenda intake item not found.', 'fix': 'Submit the agenda item into the intake queue before review.'})" - ] - }, - { - "method": "POST", - "path": "/agenda-intake/{item_id}/promote", - "router": "app", - "prefix_resolved": true, - "name": "promote_agenda_intake_item", - "signature": "item_id: str, payload: AgendaIntakePromoteRequest, response: Response", - "returns": "dict", - "line": 1116, - "doc": "Promote a clerk-ready intake item into the canonical agenda lifecycle.", - "decorator": "app.post('/agenda-intake/{item_id}/promote', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Agenda intake item not found.', 'fix': 'Submit the agenda item into intake, then complete clerk review before promotion.'})", - "HTTPException(status_code=409, detail={'message': 'Agenda intake item is not ready for agenda promotion.', 'current_readiness_status': intake_item.readiness_status, 'fix': 'Mark the item ready in the clerk review queue, then promote it to agenda work.'})", - "HTTPException(status_code=404, detail={'message': 'Agenda intake item disappeared during promotion.', 'fix': 'Reload the intake queue and retry promotion from the current record.'})", - "HTTPException(status_code=500, detail={'message': 'Agenda item promotion could not complete its lifecycle transitions.', 'fix': 'Retry promotion after confirming the agenda lifecycle service is available.'})" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/staff-reports", - "router": "app", - "prefix_resolved": true, - "name": "create_staff_report", - "signature": "meeting_id: str, payload: StaffReportCreate", - "returns": "dict[str, object]", - "line": 1193, - "doc": "Normalize a staff report into the clerk-visible agenda intake trail.", - "decorator": "app.post('/meetings/{meeting_id}/staff-reports', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/staff-reports", - "router": "app", - "prefix_resolved": true, - "name": "list_staff_reports", - "signature": "meeting_id: str", - "returns": "dict[str, object]", - "line": 1222, - "doc": "List staff report records linked to a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/staff-reports')", - "errors": [] - }, - { - "method": "POST", - "path": "/meeting-bodies", - "router": "app", - "prefix_resolved": true, - "name": "create_meeting_body", - "signature": "payload: MeetingBodyCreate", - "returns": "dict[str, str | bool]", - "line": 1246, - "doc": "Create a municipal meeting body for staff calendar workflows.", - "decorator": "app.post('/meeting-bodies', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/meeting-bodies", - "router": "app", - "prefix_resolved": true, - "name": "list_meeting_bodies", - "signature": "active_only: bool=False", - "returns": "dict[str, int | list[dict[str, str | bool]]]", - "line": 1257, - "doc": "List municipal meeting bodies for staff setup and scheduling clients.", - "decorator": "app.get('/meeting-bodies')", - "errors": [] - }, - { - "method": "GET", - "path": "/meeting-bodies/{body_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_meeting_body", - "signature": "body_id: str", - "returns": "dict[str, str | bool]", - "line": 1268, - "doc": "Return one municipal meeting body.", - "decorator": "app.get('/meeting-bodies/{body_id}')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting body not found.')" - ] - }, - { - "method": "PATCH", - "path": "/meeting-bodies/{body_id}", - "router": "app", - "prefix_resolved": true, - "name": "update_meeting_body", - "signature": "body_id: str, payload: MeetingBodyUpdate", - "returns": "dict[str, str | bool]", - "line": 1278, - "doc": "Update a municipal meeting body without losing its record identity.", - "decorator": "app.patch('/meeting-bodies/{body_id}')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting body not found.')" - ] - }, - { - "method": "DELETE", - "path": "/meeting-bodies/{body_id}", - "router": "app", - "prefix_resolved": true, - "name": "deactivate_meeting_body", - "signature": "body_id: str", - "returns": "dict[str, str | bool]", - "line": 1296, - "doc": "Deactivate a meeting body instead of hard-deleting legal history.", - "decorator": "app.delete('/meeting-bodies/{body_id}')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting body not found.')" - ] - }, - { - "method": "POST", - "path": "/meetings", - "router": "app", - "prefix_resolved": true, - "name": "create_meeting", - "signature": "payload: MeetingCreate", - "returns": "dict[str, str]", - "line": 1306, - "doc": "Create a scheduled meeting for lifecycle enforcement.", - "decorator": "app.post('/meetings', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/meetings", - "router": "app", - "prefix_resolved": true, - "name": "list_meetings", - "signature": "", - "returns": "dict[str, int | list[dict[str, str | None]]]", - "line": 1322, - "doc": "List meetings for staff calendar and dashboard clients.", - "decorator": "app.get('/meetings')", - "errors": [] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_meeting", - "signature": "meeting_id: str", - "returns": "dict[str, str]", - "line": 1329, - "doc": "Return the current meeting state.", - "decorator": "app.get('/meetings/{meeting_id}')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "PATCH", - "path": "/meetings/{meeting_id}", - "router": "app", - "prefix_resolved": true, - "name": "update_meeting_schedule", - "signature": "meeting_id: str, payload: MeetingUpdate", - "returns": "dict[str, str]", - "line": 1338, - "doc": "Edit staff scheduling fields before the public meeting is locked.", - "decorator": "app.patch('/meetings/{meeting_id}')", - "errors": [ - "HTTPException(status_code=422, detail={'message': 'Meeting update did not include any schedule fields.', 'fix': 'Send at least one of title, meeting_type, scheduled_start, meeting_body_id, or location.'})", - "HTTPException(status_code=404, detail='Meeting not found.')", - "HTTPException(status_code=409, detail={'message': exc.message, 'fix': exc.fix})" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/transitions", - "router": "app", - "prefix_resolved": true, - "name": "transition_meeting", - "signature": "meeting_id: str, payload: MeetingTransitionRequest", - "returns": "dict[str, str]", - "line": 1391, - "doc": "Apply a canonical meeting lifecycle transition.", - "decorator": "app.post('/meetings/{meeting_id}/transitions')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')", - "HTTPException(status_code=result.http_status, detail={'message': result.message, 'fix': result.fix, 'current_status': meeting.status, 'requested_status': payload.to_status})" - ] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/audit", - "router": "app", - "prefix_resolved": true, - "name": "get_meeting_audit", - "signature": "meeting_id: str", - "returns": "dict[str, list[dict[str, object]]]", - "line": 1424, - "doc": "Return lifecycle audit entries for a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/audit')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/packet-snapshots", - "router": "app", - "prefix_resolved": true, - "name": "create_packet_snapshot", - "signature": "meeting_id: str, payload: PacketSnapshotCreate", - "returns": "dict", - "line": 1433, - "doc": "Create an immutable packet snapshot version for a meeting.", - "decorator": "app.post('/meetings/{meeting_id}/packet-snapshots', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/packet-snapshots", - "router": "app", - "prefix_resolved": true, - "name": "list_packet_snapshots", - "signature": "meeting_id: str", - "returns": "dict[str, list[dict]]", - "line": 1449, - "doc": "Return packet snapshot versions for a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/packet-snapshots')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/packet-assemblies", - "router": "app", - "prefix_resolved": true, - "name": "create_packet_assembly_record", - "signature": "meeting_id: str, payload: PacketAssemblyCreate", - "returns": "dict", - "line": 1463, - "doc": "Create a persisted packet assembly record tied to a packet snapshot.", - "decorator": "app.post('/meetings/{meeting_id}/packet-assemblies', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/packet-assemblies", - "router": "app", - "prefix_resolved": true, - "name": "list_packet_assembly_records", - "signature": "meeting_id: str", - "returns": "dict[str, list[dict]]", - "line": 1489, - "doc": "List persisted packet assembly records for a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/packet-assemblies')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "POST", - "path": "/packet-assemblies/{record_id}/finalize", - "router": "app", - "prefix_resolved": true, - "name": "finalize_packet_assembly_record", - "signature": "record_id: str, payload: PacketAssemblyFinalizeRequest", - "returns": "dict", - "line": 1503, - "doc": "Finalize a persisted packet assembly record.", - "decorator": "app.post('/packet-assemblies/{record_id}/finalize')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Packet assembly record not found.', 'fix': 'Create the packet assembly record before finalizing it.'})" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/export-bundle", - "router": "app", - "prefix_resolved": true, - "name": "create_packet_export_bundle", - "signature": "meeting_id: str, payload: PacketExportCreate", - "returns": "dict", - "line": 1524, - "doc": "Create a records-ready packet export bundle with manifest, checksums, and audit.", - "decorator": "app.post('/meetings/{meeting_id}/export-bundle', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')", - "HTTPException(status_code=error.http_status, detail=error.public_dict())" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/notices/check", - "router": "app", - "prefix_resolved": true, - "name": "check_notice_compliance", - "signature": "meeting_id: str, payload: NoticeComplianceRequest", - "returns": "dict", - "line": 1559, - "doc": "Check public notice compliance without posting.", - "decorator": "app.post('/meetings/{meeting_id}/notices/check')", - "errors": [ - "HTTPException(status_code=result.http_status, detail={'message': 'Notice is not ready for public posting. Review the warnings and fix each item.', 'warnings': result.warnings})" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/notice-checklists", - "router": "app", - "prefix_resolved": true, - "name": "create_notice_checklist_record", - "signature": "meeting_id: str, payload: NoticeChecklistCreate", - "returns": "dict", - "line": 1577, - "doc": "Persist a notice compliance checklist record for staff review.", - "decorator": "app.post('/meetings/{meeting_id}/notice-checklists', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/notice-checklists", - "router": "app", - "prefix_resolved": true, - "name": "list_notice_checklist_records", - "signature": "meeting_id: str", - "returns": "dict[str, list[dict]]", - "line": 1599, - "doc": "List persisted notice checklist records for a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/notice-checklists')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "POST", - "path": "/notice-checklists/{record_id}/posting-proof", - "router": "app", - "prefix_resolved": true, - "name": "attach_notice_posting_proof", - "signature": "record_id: str, payload: NoticePostingProofCreate", - "returns": "dict", - "line": 1613, - "doc": "Attach posting proof metadata to a persisted notice checklist record.", - "decorator": "app.post('/notice-checklists/{record_id}/posting-proof')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Notice checklist record not found.', 'fix': 'Create the notice checklist record before attaching posting proof.'})" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/notices/post", - "router": "app", - "prefix_resolved": true, - "name": "post_notice", - "signature": "meeting_id: str, payload: NoticeComplianceRequest", - "returns": "dict", - "line": 1635, - "doc": "Post a public notice after deadline and human-approval checks pass.", - "decorator": "app.post('/meetings/{meeting_id}/notices/post', status_code=201)", - "errors": [ - "HTTPException(status_code=result.http_status, detail={'message': 'Notice cannot be posted publicly. Review the warnings and fix each item.', 'warnings': result.warnings})" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/motions", - "router": "app", - "prefix_resolved": true, - "name": "capture_motion", - "signature": "meeting_id: str, payload: MotionCreate", - "returns": "dict", - "line": 1653, - "doc": "Capture an immutable motion for a meeting.", - "decorator": "app.post('/meetings/{meeting_id}/motions', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/motions", - "router": "app", - "prefix_resolved": true, - "name": "list_motions", - "signature": "meeting_id: str", - "returns": "dict[str, list[dict]]", - "line": 1668, - "doc": "List captured motions and correction records for a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/motions')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "PUT", - "path": "/motions/{motion_id}", - "router": "app", - "prefix_resolved": true, - "name": "reject_motion_mutation", - "signature": "motion_id: str", - "returns": "None", - "line": 1683, - "doc": "Reject edits to captured motions; corrections must be append-only.", - "decorator": "app.put('/motions/{motion_id}')", - "errors": [ - "HTTPException(status_code=409, detail={'message': 'Captured motions are immutable.', 'fix': 'Use POST /motions/{motion_id}/corrections to add a correction record that references the original motion.'})", - "HTTPException(status_code=404, detail='Motion not found.')" - ] - }, - { - "method": "PATCH", - "path": "/motions/{motion_id}", - "router": "app", - "prefix_resolved": true, - "name": "reject_motion_mutation", - "signature": "motion_id: str", - "returns": "None", - "line": 1683, - "doc": "Reject edits to captured motions; corrections must be append-only.", - "decorator": "app.patch('/motions/{motion_id}')", - "errors": [ - "HTTPException(status_code=409, detail={'message': 'Captured motions are immutable.', 'fix': 'Use POST /motions/{motion_id}/corrections to add a correction record that references the original motion.'})", - "HTTPException(status_code=404, detail='Motion not found.')" - ] - }, - { - "method": "POST", - "path": "/motions/{motion_id}/corrections", - "router": "app", - "prefix_resolved": true, - "name": "correct_motion", - "signature": "motion_id: str, payload: MotionCorrectionCreate", - "returns": "dict", - "line": 1697, - "doc": "Create an append-only correction record for a captured motion.", - "decorator": "app.post('/motions/{motion_id}/corrections', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Motion not found.')" - ] - }, - { - "method": "POST", - "path": "/motions/{motion_id}/votes", - "router": "app", - "prefix_resolved": true, - "name": "capture_vote", - "signature": "motion_id: str, payload: VoteCreate", - "returns": "dict", - "line": 1711, - "doc": "Capture an immutable vote for a motion.", - "decorator": "app.post('/motions/{motion_id}/votes', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Motion not found.')" - ] - }, - { - "method": "GET", - "path": "/motions/{motion_id}/votes", - "router": "app", - "prefix_resolved": true, - "name": "list_votes", - "signature": "motion_id: str", - "returns": "dict[str, list[dict]]", - "line": 1728, - "doc": "List captured votes and correction records for a motion.", - "decorator": "app.get('/motions/{motion_id}/votes')", - "errors": [ - "HTTPException(status_code=404, detail='Motion not found.')" - ] - }, - { - "method": "PUT", - "path": "/votes/{vote_id}", - "router": "app", - "prefix_resolved": true, - "name": "reject_vote_mutation", - "signature": "vote_id: str", - "returns": "None", - "line": 1743, - "doc": "Reject edits to captured votes; corrections must be append-only.", - "decorator": "app.put('/votes/{vote_id}')", - "errors": [ - "HTTPException(status_code=409, detail={'message': 'Captured votes are immutable.', 'fix': 'Use POST /votes/{vote_id}/corrections to add a correction record that references the original vote.'})", - "HTTPException(status_code=404, detail='Vote not found.')" - ] + "line": 31 }, { - "method": "PATCH", - "path": "/votes/{vote_id}", - "router": "app", - "prefix_resolved": true, - "name": "reject_vote_mutation", - "signature": "vote_id: str", - "returns": "None", - "line": 1743, - "doc": "Reject edits to captured votes; corrections must be append-only.", - "decorator": "app.patch('/votes/{vote_id}')", - "errors": [ - "HTTPException(status_code=409, detail={'message': 'Captured votes are immutable.', 'fix': 'Use POST /votes/{vote_id}/corrections to add a correction record that references the original vote.'})", - "HTTPException(status_code=404, detail='Vote not found.')" - ] - }, - { - "method": "POST", - "path": "/votes/{vote_id}/corrections", - "router": "app", - "prefix_resolved": true, - "name": "correct_vote", - "signature": "vote_id: str, payload: VoteCorrectionCreate", - "returns": "dict", - "line": 1757, - "doc": "Create an append-only correction record for a captured vote.", - "decorator": "app.post('/votes/{vote_id}/corrections', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Vote not found.')" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/action-items", - "router": "app", - "prefix_resolved": true, - "name": "create_action_item", - "signature": "meeting_id: str, payload: ActionItemCreate", - "returns": "dict", - "line": 1771, - "doc": "Create an action item linked to a meeting outcome.", - "decorator": "app.post('/meetings/{meeting_id}/action-items', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')", - "HTTPException(status_code=422, detail={'message': 'Action items must reference a captured meeting outcome.', 'fix': 'Capture the related motion first, then send its id as source_motion_id.'})", - "HTTPException(status_code=404, detail='Source motion not found.')", - "HTTPException(status_code=422, detail={'message': 'Action item source motion belongs to a different meeting.', 'fix': 'Use a motion captured for this meeting as source_motion_id.'})" - ] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/action-items", - "router": "app", - "prefix_resolved": true, - "name": "list_action_items", - "signature": "meeting_id: str", - "returns": "dict[str, list[dict]]", - "line": 1809, - "doc": "List action items linked to a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/action-items')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/ordinance-resolution-handoff", - "router": "app", - "prefix_resolved": true, - "name": "create_ordinance_resolution_handoff", - "signature": "meeting_id: str, payload: OrdinanceResolutionHandoffCreate", - "returns": "dict[str, object]", - "line": 2063, - "doc": "Create a code-drafting handoff from adopted meeting action.", - "decorator": "app.post('/meetings/{meeting_id}/ordinance-resolution-handoff', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Source motion not found.')", - "HTTPException(status_code=422, detail={'message': 'Ordinance or resolution source motion belongs to a different meeting.', 'fix': 'Use a motion captured for this meeting, then retry the handoff.'})" - ] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/ordinance-resolution-handoff", - "router": "app", - "prefix_resolved": true, - "name": "list_ordinance_resolution_handoffs", - "signature": "meeting_id: str", - "returns": "dict[str, object]", - "line": 2112, - "doc": "List ordinance and resolution handoffs for a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/ordinance-resolution-handoff')", - "errors": [] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/ordinance-resolution-handoff/retry", - "router": "app", - "prefix_resolved": true, - "name": "retry_ordinance_resolution_handoff", - "signature": "meeting_id: str, payload: OrdinanceResolutionHandoffRetry | None=None", - "returns": "dict[str, object]", - "line": 2125, - "doc": "Retry CivicCode emission for failed or unconfigured ordinance handoffs.", - "decorator": "app.post('/meetings/{meeting_id}/ordinance-resolution-handoff/retry')", - "errors": [ - "HTTPException(status_code=404, detail='Handoff not found.')" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/minutes/drafts", - "router": "app", - "prefix_resolved": true, - "name": "create_minutes_draft", - "signature": "meeting_id: str, payload: MinutesDraftCreate", - "returns": "dict", - "line": 2159, - "doc": "Create a cited minutes draft from staff-provided sentence text.", - "decorator": "app.post('/meetings/{meeting_id}/minutes/drafts', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')", - "HTTPException(status_code=422, detail={'message': result.message, 'fix': result.fix})" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/minutes/ai-assist", - "router": "app", - "prefix_resolved": true, - "name": "create_minutes_ai_assist", - "signature": "meeting_id: str, payload: MinutesAiAssistCreate", - "returns": "dict", - "line": 2197, - "doc": "Generate an optional Ollama-assisted cited minutes draft.", - "decorator": "app.post('/meetings/{meeting_id}/minutes/ai-assist', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')", - "HTTPException(status_code=422, detail={'message': result.message, 'fix': result.fix})", - "HTTPException(status_code=503, detail=_minutes_ai_unavailable_detail(str(exc)))" - ] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/minutes/drafts", - "router": "app", - "prefix_resolved": true, - "name": "list_minutes_drafts", - "signature": "meeting_id: str", - "returns": "dict[str, list[dict]]", - "line": 2243, - "doc": "List citation-gated minutes drafts for a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/minutes/drafts')", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')" - ] - }, - { - "method": "POST", - "path": "/minutes/{minute_id}/post", - "router": "app", - "prefix_resolved": true, - "name": "reject_automatic_minutes_posting", - "signature": "minute_id: str", - "returns": "None", - "line": 2257, - "doc": "Reject automatic public posting of AI-drafted minutes.", - "decorator": "app.post('/minutes/{minute_id}/post')", - "errors": [ - "HTTPException(status_code=409, detail={'message': 'AI-drafted minutes cannot be posted automatically.', 'fix': 'Review, cite-check, and adopt minutes through a human approval workflow before public posting.'})", - "HTTPException(status_code=404, detail='Minutes draft not found.')" - ] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/transcripts", - "router": "app", - "prefix_resolved": true, - "name": "create_transcript_record", - "signature": "meeting_id: str, payload: TranscriptCreate", - "returns": "dict[str, object]", - "line": 2271, - "doc": "Capture transcript material for clerk review before public release.", - "decorator": "app.post('/meetings/{meeting_id}/transcripts', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/meetings/{meeting_id}/transcripts", - "router": "app", - "prefix_resolved": true, - "name": "list_transcript_records", - "signature": "meeting_id: str", - "returns": "dict[str, object]", - "line": 2295, - "doc": "List transcript records queued for a meeting.", - "decorator": "app.get('/meetings/{meeting_id}/transcripts')", - "errors": [] - }, - { - "method": "POST", - "path": "/meetings/{meeting_id}/public-record", - "router": "app", - "prefix_resolved": true, - "name": "publish_public_record", - "signature": "meeting_id: str, payload: PublicMeetingRecordCreate", - "returns": "dict", - "line": 2309, - "doc": "Create a public or restricted archive record for a meeting.", - "decorator": "app.post('/meetings/{meeting_id}/public-record', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Meeting not found.')", - "HTTPException(status_code=404, detail={'message': 'Meeting not found in the public archive database.', 'fix': 'Point CIVICCLERK_PUBLIC_ARCHIVE_DB_URL at the same database as CIVICCLERK_MEETING_DB_URL so published records reference real meetings.'})" - ] - }, - { - "method": "POST", - "path": "/imports/{connector_name}/meetings", - "router": "app", - "prefix_resolved": true, - "name": "import_connector_meeting", - "signature": "connector_name: str, payload: dict", - "returns": "dict", - "line": 2347, - "doc": "Import a local connector export payload without outbound network calls.", - "decorator": "app.post('/imports/{connector_name}/meetings', status_code=201)", - "errors": [ - "HTTPException(status_code=status_code, detail=error.public_dict())" - ] - }, - { - "method": "POST", - "path": "/vendor-live-sync/sources", - "router": "app", - "prefix_resolved": true, - "name": "create_vendor_live_sync_source", - "signature": "payload: VendorSyncSourceCreate", - "returns": "dict", - "line": 2365, - "doc": "Create a durable vendor live-sync source record without contacting the vendor.", - "decorator": "app.post('/vendor-live-sync/sources', status_code=201)", - "errors": [ - "HTTPException(status_code=422, detail=error.public_dict())" - ] - }, - { - "method": "GET", - "path": "/vendor-live-sync/sources", - "router": "app", - "prefix_resolved": true, - "name": "list_vendor_live_sync_sources", - "signature": "", - "returns": "dict[str, object]", - "line": 2386, - "doc": "List persisted vendor live-sync source health without contacting vendors.", - "decorator": "app.get('/vendor-live-sync/sources')", - "errors": [] - }, - { - "method": "POST", - "path": "/vendor-live-sync/sources/{source_id}/cursor-reset", - "router": "app", - "prefix_resolved": true, - "name": "reset_vendor_live_sync_cursor", - "signature": "source_id: str, payload: VendorSyncCursorReset", - "returns": "dict[str, object]", - "line": 2398, - "doc": "Clear or move a vendor delta cursor without contacting the vendor network.", - "decorator": "app.post('/vendor-live-sync/sources/{source_id}/cursor-reset')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Vendor live-sync source not found.', 'fix': 'Create the source with POST /vendor-live-sync/sources before resetting its cursor.'})" - ] - }, - { - "method": "POST", - "path": "/vendor-live-sync/sources/{source_id}/run-log", - "router": "app", - "prefix_resolved": true, - "name": "record_vendor_live_sync_run", - "signature": "source_id: str, payload: VendorSyncRunRecordCreate", - "returns": "dict", - "line": 2431, - "doc": "Record one vendor sync run outcome without starting a vendor pull.", - "decorator": "app.post('/vendor-live-sync/sources/{source_id}/run-log', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Vendor live-sync source not found.', 'fix': 'Create the source with POST /vendor-live-sync/sources before recording a run outcome.'})" - ] - }, - { - "method": "GET", - "path": "/vendor-live-sync/sources/{source_id}/run-log", - "router": "app", - "prefix_resolved": true, - "name": "list_vendor_live_sync_runs", - "signature": "source_id: str", - "returns": "dict[str, object]", - "line": 2463, - "doc": "Return persisted run history for one vendor source without contacting vendors.", - "decorator": "app.get('/vendor-live-sync/sources/{source_id}/run-log')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Vendor live-sync source not found.', 'fix': 'Create the source with POST /vendor-live-sync/sources before viewing run history.'})" - ] - }, - { - "method": "GET", - "path": "/public/meetings", - "router": "app", - "prefix_resolved": true, - "name": "public_meetings", - "signature": "", - "returns": "dict[str, int | list[dict]]", - "line": 2484, - "doc": "Return public meeting calendar records only.", - "decorator": "app.get('/public/meetings')", - "errors": [] - }, - { - "method": "GET", - "path": "/public/meetings/{record_id}", - "router": "app", - "prefix_resolved": true, - "name": "public_meeting_detail", - "signature": "record_id: str", - "returns": "dict", - "line": 2494, - "doc": "Return one public meeting record without revealing restricted records.", - "decorator": "app.get('/public/meetings/{record_id}')", - "errors": [ - "HTTPException(status_code=404, detail='Public meeting record not found.')" - ] - }, - { - "method": "GET", - "path": "/public/meetings/{record_id}/{document_kind}.txt", - "router": "app", - "prefix_resolved": true, - "name": "public_meeting_download", - "signature": "record_id: str, document_kind: str", - "returns": "Response", - "line": 2503, - "doc": "Download one public-safe agenda, packet, or adopted-minutes text file.", - "decorator": "app.get('/public/meetings/{record_id}/{document_kind}.txt')", - "errors": [ - "HTTPException(status_code=404, detail='Public meeting record not found.')", - "HTTPException(status_code=404, detail={'message': 'Public meeting document not found.', 'fix': 'Use agenda.txt, packet.txt, or minutes.txt from the public meeting detail response.'})" - ] - }, - { - "method": "POST", - "path": "/public/meetings/{record_id}/comments", - "router": "app", - "prefix_resolved": true, - "name": "submit_public_comment", - "signature": "record_id: str, payload: PublicCommentCreate", - "returns": "dict", - "line": 2530, - "doc": "Accept a resident comment only for public records with comment intake enabled.", - "decorator": "app.post('/public/meetings/{record_id}/comments', status_code=201)", - "errors": [ - "HTTPException(status_code=404, detail='Public meeting record not found.')", - "HTTPException(status_code=409, detail={'message': 'Public comment intake is closed for this meeting record.', 'fix': 'Contact the clerk for the official comment method or check the posted agenda for comment instructions.'})" - ] - }, - { - "method": "GET", - "path": "/public/meetings/{record_id}/comments", - "router": "app", - "prefix_resolved": true, - "name": "list_public_comments", - "signature": "record_id: str", - "returns": "dict[str, int | list[dict]]", - "line": 2557, - "doc": "List resident comments collected for a public record.", - "decorator": "app.get('/public/meetings/{record_id}/comments')", - "errors": [ - "HTTPException(status_code=404, detail='Public meeting record not found.')" - ] - }, - { - "method": "GET", - "path": "/public-comments/review-queue", - "router": "app", - "prefix_resolved": true, - "name": "list_public_comment_review_queue", - "signature": "", - "returns": "dict[str, object]", - "line": 2567, - "doc": "List resident comments awaiting staff review across public records.", - "decorator": "app.get('/public-comments/review-queue')", - "errors": [] - }, - { - "method": "GET", - "path": "/public/archive/search", - "router": "app", - "prefix_resolved": true, - "name": "public_archive_search", - "signature": "q: str, credentials: HTTPAuthorizationCredentials | None=Depends(_archive_search_bearer)", - "returns": "dict[str, int | list[dict]]", - "line": 2580, - "doc": "Search public archives with permission-aware closed-session filtering.", - "decorator": "app.get('/public/archive/search')", - "errors": [] - } - ], - "models": [ - { - "name": "AgendaItemCreate", - "bases": [ - "BaseModel" - ], + "name": "MockCityCodeCheck", + "bases": [], "fields": [ { - "name": "title", + "name": "connector", "type": "str", - "default": "Field(min_length=1)" + "line": 69 }, { - "name": "department_name", - "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 238, - "doc": "" - }, - { - "name": "AgendaItemTransitionRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "to_status", - "type": "str", - "default": "Field(min_length=1)" + "name": "ok", + "type": "bool", + "line": 70 }, { - "name": "actor", + "name": "message", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 243, - "doc": "" - }, - { - "name": "AgendaIntakeCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 71 + }, { - "name": "title", + "name": "fix", "type": "str", - "default": "Field(min_length=1)" + "line": 72 }, { - "name": "department_name", - "type": "str", - "default": "Field(min_length=1)" + "name": "source_id", + "type": "str | None", + "line": 73 }, { - "name": "submitted_by", - "type": "str", - "default": "Field(min_length=1)" + "name": "import_job_id", + "type": "str | None", + "line": 74 }, { - "name": "summary", - "type": "str", - "default": "Field(min_length=1)" + "name": "delta_request_url", + "type": "str | None", + "line": 75 }, { - "name": "source_references", - "type": "list[dict]", - "default": "Field(min_length=1)" + "name": "checked_sections", + "type": "tuple[str, ...]", + "line": 76 } ], - "line": 248, - "doc": "" - }, + "line": 66 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/models.py", + "sha256": "4e3ae05293b927f6b1ce149abf707af12abb5a4181ddfcc77b85f37e5b5da03f", + "bytes": 7837, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/operational_readiness.py", + "sha256": "359353d77cf6742700c48f8533149390a9a84daf2a068f71259fb0445d0e4510", + "bytes": 7124, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/operational_state.py", + "sha256": "cdb7bd2baa6731dafafbf91f054f28cb763fbfd0a65f80905da44e4da66c6c94", + "bytes": 11156, + "routes": [], + "models": [ { - "name": "AgendaIntakeReviewRequest", - "bases": [ - "BaseModel" - ], + "name": "OperationalStateRecord", + "bases": [], "fields": [ { - "name": "reviewer", + "name": "record_id", "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "ready", - "type": "bool", - "default": "" + "line": 23 }, { - "name": "notes", + "name": "lane", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 256, - "doc": "" - }, - { - "name": "AgendaIntakePromoteRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 24 + }, { - "name": "reviewer", + "name": "record_type", "type": "str", - "default": "Field(min_length=1)" + "line": 25 }, { - "name": "notes", + "name": "subject_id", "type": "str", - "default": "Field(default='Promoted to agenda lifecycle.', min_length=1)" - } - ], - "line": 262, - "doc": "" - }, - { - "name": "StaffReportCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 26 + }, { - "name": "title", + "name": "status", "type": "str", - "default": "Field(min_length=1)" + "line": 27 }, { - "name": "department_name", + "name": "actor", "type": "str", - "default": "Field(min_length=1)" + "line": 28 }, { - "name": "author", - "type": "str", - "default": "Field(min_length=1)" + "name": "attempt_count", + "type": "int", + "line": 29 }, { - "name": "summary", - "type": "str", - "default": "Field(min_length=1)" + "name": "next_attempt_at", + "type": "datetime | None", + "line": 30 }, { - "name": "source_references", - "type": "list[dict]", - "default": "Field(min_length=1)" + "name": "cursor_key", + "type": "str | None", + "line": 31 }, { - "name": "agenda_item_id", + "name": "cursor_value", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 32 }, { - "name": "legal_reviewer", + "name": "replay_of", "type": "str | None", - "default": "Field(default=None, min_length=1)" - } - ], - "line": 267, - "doc": "" - }, - { - "name": "MeetingCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 33 + }, { - "name": "title", - "type": "str", - "default": "Field(min_length=1)" + "name": "payload_hash", + "type": "str | None", + "line": 34 }, { - "name": "meeting_type", - "type": "str", - "default": "Field(min_length=1)" + "name": "details", + "type": "dict[str, Any]", + "line": 35 }, { - "name": "scheduled_start", - "type": "str | None", - "default": "None" + "name": "failure", + "type": "dict[str, Any] | None", + "line": 36 }, { - "name": "meeting_body_id", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "created_at", + "type": "datetime", + "line": 37 }, { - "name": "location", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "updated_at", + "type": "datetime", + "line": 38 } ], - "line": 277, - "doc": "" - }, + "line": 20 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/ordinance_handoff.py", + "sha256": "3b6c0315d2398e4a967d5c5cbfda07759949495eee24157ed4995a61ca41fe75", + "bytes": 21987, + "routes": [], + "models": [ { - "name": "MeetingUpdate", - "bases": [ - "BaseModel" - ], + "name": "OrdinanceEvent", + "bases": [], "fields": [ { - "name": "title", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "event_id", + "type": "str", + "line": 40 }, { - "name": "meeting_type", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "external_event_id", + "type": "str", + "line": 41 }, { - "name": "scheduled_start", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "townlight_meetings_meeting_id", + "type": "str", + "line": 42 }, { - "name": "meeting_body_id", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "townlight_meetings_agenda_item_id", + "type": "str", + "line": 43 }, { - "name": "location", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "ordinance_number", + "type": "str", + "line": 44 }, { - "name": "actor", + "name": "title", "type": "str", - "default": "Field(default='clerk@example.gov', min_length=1)" - } - ], - "line": 285, - "doc": "" - }, - { - "name": "MeetingBodyCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 45 + }, { - "name": "name", + "name": "status", "type": "str", - "default": "Field(min_length=1)" + "line": 46 }, { - "name": "body_type", - "type": "str", - "default": "Field(min_length=1)" + "name": "affected_sections", + "type": "list[str]", + "line": 47 }, { - "name": "is_active", - "type": "bool", - "default": "True" - } - ], - "line": 294, - "doc": "" - }, - { - "name": "MeetingBodyUpdate", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "source_document_url", + "type": "str", + "line": 48 + }, { - "name": "name", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "source_document_hash", + "type": "str", + "line": 49 }, { - "name": "body_type", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "ordinance_text", + "type": "str", + "line": 50 }, { - "name": "is_active", - "type": "bool | None", - "default": "None" - } - ], - "line": 300, - "doc": "" - }, - { - "name": "MeetingTransitionRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "adopted_at", + "type": "datetime | None", + "line": 51 + }, { - "name": "to_status", - "type": "str", - "default": "Field(min_length=1)" + "name": "failure_reason", + "type": "str | None", + "line": 52 }, { - "name": "actor", - "type": "str", - "default": "Field(min_length=1)" + "name": "resolved_section_version_id", + "type": "str | None", + "line": 53 }, { - "name": "statutory_basis", + "name": "resolved_by", "type": "str | None", - "default": "Field(default=None, min_length=1)" - } - ], - "line": 306, - "doc": "" - }, - { - "name": "PacketSnapshotCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 54 + }, { - "name": "agenda_item_ids", - "type": "list[str]", - "default": "Field(min_length=1)" + "name": "resolved_at", + "type": "datetime | None", + "line": 55 }, { - "name": "actor", + "name": "created_by", "type": "str", - "default": "Field(min_length=1)" + "line": 56 + }, + { + "name": "created_at", + "type": "datetime", + "line": 57 } ], - "line": 312, - "doc": "" + "line": 39 }, { - "name": "PacketAssemblyCreate", - "bases": [ - "BaseModel" - ], + "name": "HandoffAuditEvent", + "bases": [], "fields": [ { - "name": "title", + "name": "event_id", "type": "str", - "default": "Field(min_length=1)" + "line": 70 }, { - "name": "agenda_item_ids", - "type": "list[str]", - "default": "Field(min_length=1)" + "name": "event_type", + "type": "str", + "line": 71 }, { "name": "actor", "type": "str", - "default": "Field(min_length=1)" + "line": 72 }, { - "name": "source_references", - "type": "list[dict]", - "default": "Field(min_length=1)" + "name": "target_id", + "type": "str", + "line": 73 }, { - "name": "citations", - "type": "list[dict]", - "default": "Field(min_length=1)" + "name": "created_at", + "type": "datetime", + "line": 74 } ], - "line": 317, - "doc": "" - }, + "line": 69 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/plain_language.py", + "sha256": "c333624bd8677938ed7817055a4f96d46169c147425a05b2972ea696862ee45e", + "bytes": 14321, + "routes": [], + "models": [ { - "name": "PacketAssemblyFinalizeRequest", - "bases": [ - "BaseModel" - ], + "name": "PlainLanguageSummary", + "bases": [], "fields": [ { - "name": "actor", + "name": "summary_id", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 325, - "doc": "" - }, - { - "name": "PacketSourceCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 32 + }, + { + "name": "section_id", + "type": "str", + "line": 33 + }, { - "name": "source_id", + "name": "section_version_id", "type": "str", - "default": "Field(min_length=1)" + "line": 34 }, { - "name": "title", + "name": "summary_text", "type": "str", - "default": "Field(min_length=1)" + "line": 35 }, { - "name": "kind", + "name": "status", "type": "str", - "default": "Field(default='document', min_length=1)" + "line": 36 }, { - "name": "source_system", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "language_code", + "type": "str", + "line": 37 }, { - "name": "source_path", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "created_by", + "type": "str", + "line": 38 }, { - "name": "checksum", + "name": "approved_by", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 39 }, { - "name": "sensitivity_label", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "approved_at", + "type": "datetime | None", + "line": 40 }, { - "name": "citation_label", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "created_at", + "type": "datetime", + "line": 41 } ], - "line": 329, - "doc": "" + "line": 31 }, { - "name": "PacketExportCreate", - "bases": [ - "BaseModel" - ], + "name": "SummaryAuditEvent", + "bases": [], "fields": [ { - "name": "bundle_name", + "name": "event_id", + "type": "str", + "line": 50 + }, + { + "name": "event_type", "type": "str", - "default": "Field(min_length=1)" + "line": 51 }, { "name": "actor", "type": "str", - "default": "Field(min_length=1)" + "line": 52 }, { - "name": "sources", - "type": "list[PacketSourceCreate]", - "default": "Field(min_length=1)" + "name": "section_id", + "type": "str", + "line": 53 }, { - "name": "public_bundle", - "type": "bool", - "default": "True" + "name": "target_id", + "type": "str", + "line": 54 + }, + { + "name": "created_at", + "type": "datetime", + "line": 55 } ], - "line": 340, - "doc": "" - }, + "line": 49 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/public_discovery.py", + "sha256": "656e72f672dc2839d58cc4a26252169ba712265533f60ef7b35e11fc6f6c4a94", + "bytes": 10332, + "routes": [], + "models": [ { - "name": "NoticeComplianceRequest", - "bases": [ - "BaseModel" - ], + "name": "PopularQuestion", + "bases": [], "fields": [ { - "name": "notice_type", + "name": "question_id", "type": "str", - "default": "Field(min_length=1)" + "line": 35 }, { - "name": "posted_at", - "type": "datetime", - "default": "" + "name": "question_text", + "type": "str", + "line": 36 }, { - "name": "minimum_notice_hours", - "type": "int", - "default": "Field(gt=0)" + "name": "section_id", + "type": "str", + "line": 37 }, { - "name": "statutory_basis", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "section_number", + "type": "str", + "line": 38 + }, + { + "name": "section_heading", + "type": "str", + "line": 39 + }, + { + "name": "answer_excerpt", + "type": "str", + "line": 40 + }, + { + "name": "citation_payload", + "type": "dict[str, Any]", + "line": 41 + }, + { + "name": "audience", + "type": "str", + "line": 42 + }, + { + "name": "status", + "type": "str", + "line": 43 + }, + { + "name": "is_popular", + "type": "bool", + "line": 44 }, { "name": "approved_by", "type": "str | None", - "default": "Field(default=None, min_length=1)" - } - ], - "line": 347, - "doc": "" - }, - { - "name": "NoticeChecklistCreate", - "bases": [ - "NoticeComplianceRequest" - ], - "fields": [ + "line": 45 + }, { - "name": "actor", - "type": "str", - "default": "Field(min_length=1)" + "name": "approved_at", + "type": "datetime | None", + "line": 46 + }, + { + "name": "created_at", + "type": "datetime", + "line": 47 } ], - "line": 355, - "doc": "" - }, + "line": 34 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/public_exports.py", + "sha256": "9a8a8a7f9db81da204be0d48a0aa9c50df56363d2d3ff37388460b81a447d372", + "bytes": 6800, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/public_lookup.py", + "sha256": "15d1d309c6034daade696531c73d5d5d3fbcf48cf459097646b2892422dc38c9", + "bytes": 23186, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/qa_harness.py", + "sha256": "db2f1e72367a5c7bd64bff9540bc7c65c6447624e06afc52479da2fc49fde34a", + "bytes": 5986, + "routes": [], + "models": [ { - "name": "NoticePostingProofCreate", - "bases": [ - "BaseModel" - ], + "name": "QuestionRequestContext", + "bases": [], "fields": [ { - "name": "actor", + "name": "question", "type": "str", - "default": "Field(min_length=1)" + "line": 40 }, { - "name": "posting_proof", - "type": "dict", - "default": "Field(min_length=1)" + "name": "section_number", + "type": "str | None", + "line": 41 + }, + { + "name": "as_of", + "type": "date | None", + "line": 42 } ], - "line": 359, - "doc": "" - }, + "line": 37 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/real_municipal_fixtures.py", + "sha256": "e8e7814607ede1b28e0df15341aa44cbc7dad32a07122e4a08205f7db9dacc46", + "bytes": 10397, + "routes": [], + "models": [ { - "name": "MotionCreate", - "bases": [ - "BaseModel" - ], + "name": "PortlandSectionFixture", + "bases": [], "fields": [ { - "name": "text", + "name": "section_id", "type": "str", - "default": "Field(min_length=1)" + "line": 23 }, { - "name": "actor", + "name": "section_number", "type": "str", - "default": "Field(min_length=1)" + "line": 24 }, { - "name": "agenda_item_id", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "heading", + "type": "str", + "line": 25 }, { - "name": "seconded_by", - "type": "str | None", - "default": "Field(default=None, min_length=1)" - } - ], - "line": 364, - "doc": "" - }, - { - "name": "MotionCorrectionCreate", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "text", + "name": "source_id", "type": "str", - "default": "Field(min_length=1)" + "line": 26 }, { - "name": "actor", + "name": "source_url", "type": "str", - "default": "Field(min_length=1)" + "line": 27 }, { - "name": "reason", + "name": "file_reference", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 371, - "doc": "" - }, - { - "name": "VoteCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 28 + }, { - "name": "voter_name", + "name": "body", "type": "str", - "default": "Field(min_length=1)" + "line": 29 }, { - "name": "vote", + "name": "effective_start", "type": "str", - "default": "Field(min_length=1)" + "line": 30 }, { - "name": "actor", - "type": "str", - "default": "Field(min_length=1)" + "name": "adoption_event_id", + "type": "str | None", + "line": 31 } ], - "line": 377, - "doc": "" - }, + "line": 22 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/section_lifecycle.py", + "sha256": "51fd91c02b020575641fcfbc1e2529aaedaad796559742b1aad956a3d7fd1b11", + "bytes": 42407, + "routes": [], + "models": [ { - "name": "VoteCorrectionCreate", - "bases": [ - "BaseModel" - ], + "name": "CodeTitle", + "bases": [], "fields": [ { - "name": "vote", + "name": "title_id", "type": "str", - "default": "Field(min_length=1)" + "line": 43 }, { - "name": "actor", + "name": "title_number", "type": "str", - "default": "Field(min_length=1)" + "line": 44 }, { - "name": "reason", + "name": "title_name", "type": "str", - "default": "Field(min_length=1)" + "line": 45 + }, + { + "name": "sort_order", + "type": "int", + "line": 46 + }, + { + "name": "created_at", + "type": "datetime", + "line": 47 } ], - "line": 383, - "doc": "" + "line": 42 }, { - "name": "ActionItemCreate", - "bases": [ - "BaseModel" - ], + "name": "CodeChapter", + "bases": [], "fields": [ { - "name": "description", + "name": "chapter_id", + "type": "str", + "line": 52 + }, + { + "name": "title_id", + "type": "str", + "line": 53 + }, + { + "name": "chapter_number", "type": "str", - "default": "Field(min_length=1)" + "line": 54 }, { - "name": "actor", + "name": "chapter_name", "type": "str", - "default": "Field(min_length=1)" + "line": 55 }, { - "name": "assigned_to", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "sort_order", + "type": "int", + "line": 56 }, { - "name": "source_motion_id", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "created_at", + "type": "datetime", + "line": 57 } ], - "line": 389, - "doc": "" + "line": 51 }, { - "name": "SourceMaterialCreate", - "bases": [ - "BaseModel" - ], + "name": "CodeSection", + "bases": [], "fields": [ { - "name": "source_id", + "name": "section_id", "type": "str", - "default": "Field(min_length=1)" + "line": 62 }, { - "name": "label", + "name": "chapter_id", "type": "str", - "default": "Field(min_length=1)" + "line": 63 }, { - "name": "text", + "name": "section_number", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 396, - "doc": "" - }, - { - "name": "MinutesSentenceCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 64 + }, { - "name": "text", + "name": "section_heading", "type": "str", - "default": "Field(min_length=1)" + "line": 65 }, { - "name": "citations", - "type": "list[str]", - "default": "Field(default_factory=list)" - } - ], - "line": 402, - "doc": "" - }, - { - "name": "MinutesDraftCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "parent_section_id", + "type": "str | None", + "line": 66 + }, { - "name": "model", - "type": "str", - "default": "Field(min_length=1)" + "name": "sort_order", + "type": "int", + "line": 67 }, { - "name": "prompt_version", - "type": "str", - "default": "Field(min_length=1)" + "name": "administrative_regulation_refs", + "type": "list[str]", + "line": 68 }, { - "name": "human_approver", - "type": "str", - "default": "Field(min_length=1)" + "name": "resolution_refs", + "type": "list[str]", + "line": 69 }, { - "name": "source_materials", - "type": "list[SourceMaterialCreate]", - "default": "Field(min_length=1)" + "name": "policy_refs", + "type": "list[str]", + "line": 70 }, { - "name": "sentences", - "type": "list[MinutesSentenceCreate]", - "default": "Field(min_length=1)" + "name": "approved_summary_refs", + "type": "list[str]", + "line": 71 + }, + { + "name": "created_at", + "type": "datetime", + "line": 72 } ], - "line": 407, - "doc": "" + "line": 61 }, { - "name": "MinutesAiAssistCreate", - "bases": [ - "BaseModel" - ], + "name": "SectionVersion", + "bases": [], "fields": [ { - "name": "model", + "name": "version_id", "type": "str", - "default": "Field(min_length=1)" + "line": 77 }, { - "name": "prompt_version", + "name": "section_id", "type": "str", - "default": "Field(min_length=1)" + "line": 78 }, { - "name": "human_approver", + "name": "source_id", "type": "str", - "default": "Field(min_length=1)" + "line": 79 }, { - "name": "source_materials", - "type": "list[SourceMaterialCreate]", - "default": "Field(min_length=1)" + "name": "version_label", + "type": "str", + "line": 80 }, { - "name": "instruction", + "name": "body", "type": "str", - "default": "Field(default='Draft concise meeting minutes from the cited source material.', min_length=1)" - } - ], - "line": 415, - "doc": "" - }, - { - "name": "TranscriptCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 81 + }, { - "name": "actor", - "type": "str", - "default": "Field(min_length=1)" + "name": "effective_start", + "type": "date", + "line": 82 }, { - "name": "source_label", - "type": "str", - "default": "Field(min_length=1)" + "name": "effective_end", + "type": "date | None", + "line": 83 }, { - "name": "transcript_text", + "name": "status", "type": "str", - "default": "Field(min_length=1)" + "line": 84 }, { - "name": "public_release_requested", + "name": "is_current", "type": "bool", - "default": "False" + "line": 85 }, { - "name": "closed_session", - "type": "bool", - "default": "False" + "name": "adoption_event_id", + "type": "str | None", + "line": 86 + }, + { + "name": "amendment_event_id", + "type": "str | None", + "line": 87 + }, + { + "name": "amendment_summary", + "type": "str | None", + "line": 88 + }, + { + "name": "prior_version_id", + "type": "str | None", + "line": 89 + }, + { + "name": "created_at", + "type": "datetime", + "line": 90 } ], - "line": 426, - "doc": "" - }, + "line": 76 + } + ], + "configuration": [ { - "name": "OrdinanceResolutionHandoffCreate", - "bases": [ - "BaseModel" - ], + "environment": "TOWNLIGHT_CODE_SEMANTIC_SCORE_FLOOR", + "line": 929 + } + ] + }, + { + "source": "townlight_code/semantic_search.py", + "sha256": "21c05a1238ee9b84e68289c4b7f91e631e4c0a66d30de537b589bce1029fa9f7", + "bytes": 3889, + "routes": [], + "models": [ + { + "name": "SemanticDocument", + "bases": [], "fields": [ { - "name": "item_type", + "name": "id", "type": "str", - "default": "Field(pattern='^(ordinance|resolution)$')" + "line": 25 }, { - "name": "title", + "name": "version_id", "type": "str", - "default": "Field(min_length=1)" + "line": 26 }, { - "name": "actor", + "name": "text", + "type": "str", + "line": 27 + } + ], + "line": 24 + }, + { + "name": "EmbeddingConfig", + "bases": [], + "fields": [ + { + "name": "mode", "type": "str", - "default": "Field(min_length=1)" + "line": 32 }, { - "name": "legal_reviewer", + "name": "base_url", "type": "str", - "default": "Field(min_length=1)" + "line": 33 }, { - "name": "text", + "name": "model", "type": "str", - "default": "Field(min_length=1)" + "line": 34 }, { - "name": "source_motion_id", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "timeout_seconds", + "type": "float", + "line": 35 + } + ], + "line": 31 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_CODE_OLLAMA_EMBEDDING_MODEL", + "line": 49 + }, + { + "environment": "TOWNLIGHT_CODE_OLLAMA_EMBEDDING_URL", + "line": 45 + }, + { + "environment": "TOWNLIGHT_CODE_OLLAMA_URL", + "line": 46 + }, + { + "environment": "OLLAMA_BASE_URL", + "line": 47 + }, + { + "environment": "TOWNLIGHT_CODE_OLLAMA_EMBEDDING_TIMEOUT_SECONDS", + "line": 50 + }, + { + "environment": "TOWNLIGHT_CODE_EMBEDDING_MODE", + "line": 40 + } + ] + }, + { + "source": "townlight_code/shared_ingestion.py", + "sha256": "1d16228fdafa8c533a52e528fa9e99e71c9a009099d99e8e6291baa72b14eb5e", + "bytes": 28230, + "routes": [], + "models": [ + { + "name": "SharedIngestionImport", + "bases": [], + "fields": [ + { + "name": "payload", + "type": "dict[str, Any]", + "line": 68 }, { - "name": "ordinance_number", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "proof", + "type": "dict[str, Any]", + "line": 69 + } + ], + "line": 65 + } + ], + "configuration": [ + { + "environment": "DATABASE_URL", + "line": 172 + }, + { + "environment": "TOWNLIGHT_CODE_SHARED_INGEST_CHUNK_SIZE", + "line": 88 + }, + { + "environment": "TOWNLIGHT_CODE_SHARED_INGEST_CHUNK_OVERLAP", + "line": 89 + }, + { + "environment": "TOWNLIGHT_CODE_SHARED_INGEST_ALLOWED_DIRS", + "line": 252 + }, + { + "environment": "TOWNLIGHT_CODE_SHARED_INGEST_ALLOWED_DIR", + "line": 252 + } + ] + }, + { + "source": "townlight_code/source_registry.py", + "sha256": "4a9b4df376bb2a8456676f95de554ee7508b58892fda9e0342c27186a4740a76", + "bytes": 20364, + "routes": [], + "models": [ + { + "name": "CodeSource", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "line": 77 }, { - "name": "resolution_number", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "name", + "type": "str", + "line": 78 }, { - "name": "source_references", - "type": "list[dict]", - "default": "Field(default_factory=list)" + "name": "publisher", + "type": "str", + "line": 79 }, { - "name": "affected_sections", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "source_type", + "type": "str", + "line": 80 }, { - "name": "source_document_url", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "source_category", + "type": "str", + "line": 81 }, { - "name": "source_document_hash", + "name": "source_url", "type": "str | None", - "default": "Field(default=None, min_length=1)" - } - ], - "line": 434, - "doc": "" - }, - { - "name": "OrdinanceResolutionHandoffRetry", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 82 + }, { - "name": "handoff_id", + "name": "file_reference", "type": "str | None", - "default": "Field(default=None, min_length=1)" - } - ], - "line": 449, - "doc": "" - }, - { - "name": "PublicMeetingRecordCreate", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "title", - "type": "str", - "default": "Field(min_length=1)" + "line": 83 }, { - "name": "visibility", - "type": "str", - "default": "Field(min_length=1)" + "name": "retrieved_at", + "type": "datetime | None", + "line": 84 }, { - "name": "posted_agenda", - "type": "str", - "default": "Field(min_length=1)" + "name": "retrieval_method", + "type": "str | None", + "line": 85 }, { - "name": "posted_packet", - "type": "str", - "default": "Field(min_length=1)" + "name": "checksum", + "type": "str | None", + "line": 86 }, { - "name": "approved_minutes", - "type": "str", - "default": "Field(min_length=1)" + "name": "source_owner", + "type": "str | None", + "line": 87 }, { - "name": "public_comment_enabled", + "name": "is_official", "type": "bool", - "default": "False" + "line": 88 }, { - "name": "plain_language_summary", + "name": "official_status_note", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 89 }, { - "name": "minutes_adopted_at", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "status", + "type": "str", + "line": 90 }, { - "name": "minutes_signed_by", + "name": "staff_notes", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 91 }, { - "name": "closed_session_notes", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "created_at", + "type": "datetime", + "line": 92 + }, + { + "name": "updated_at", + "type": "datetime", + "line": 93 } ], - "line": 453, - "doc": "" - }, + "line": 74 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/staff_code.py", + "sha256": "5e182127807244627eee862325e0d8f8bf971487727fd7c82d3a7a96cf35a4de", + "bytes": 11716, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/staff_imports.py", + "sha256": "25d0008a594aa2292eea2f3a02a5b8e0d0cc46ff5ba5b3cfbda02c99ee308823", + "bytes": 12231, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/staff_sources.py", + "sha256": "2e726e0776a086d4395657fa6d76e3254322faf9329b015c023dafeb3146041e", + "bytes": 10334, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/staff_sync.py", + "sha256": "8b8eabf1485a67e877348050645be5d7751d4a0567f3ca3fe404334f230e0b3e", + "bytes": 12704, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_code/staff_workbench.py", + "sha256": "542b379f07c9a0ab41f5b002b7eb78b5a193d8c75d011b11bbf683b66b08e60d", + "bytes": 9134, + "routes": [], + "models": [ { - "name": "PublicCommentCreate", - "bases": [ - "BaseModel" - ], + "name": "InterpretationNote", + "bases": [], "fields": [ { - "name": "commenter_name", + "name": "note_id", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 32 }, { - "name": "comment", + "name": "section_id", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 466, - "doc": "" - }, - { - "name": "VendorSyncSourceCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 33 + }, { - "name": "connector", + "name": "note_text", "type": "str", - "default": "Field(min_length=1)" + "line": 34 }, { - "name": "source_name", + "name": "status", "type": "str", - "default": "Field(min_length=1)" + "line": 35 }, { - "name": "source_url", + "name": "visibility", "type": "str", - "default": "Field(min_length=1)" + "line": 36 }, { - "name": "auth_method", + "name": "created_by", "type": "str", - "default": "Field(min_length=1)" + "line": 37 + }, + { + "name": "created_at", + "type": "datetime", + "line": 38 } ], - "line": 471, - "doc": "" + "line": 31 }, { - "name": "VendorSyncRunRecordCreate", - "bases": [ - "BaseModel" - ], + "name": "AuditEvent", + "bases": [], "fields": [ { - "name": "records_discovered", - "type": "int", - "default": "Field(ge=0)" + "name": "event_id", + "type": "str", + "line": 43 }, { - "name": "records_succeeded", - "type": "int", - "default": "Field(ge=0)" + "name": "event_type", + "type": "str", + "line": 44 }, { - "name": "records_failed", - "type": "int", - "default": "Field(ge=0)" + "name": "actor", + "type": "str", + "line": 45 }, { - "name": "retries_attempted", - "type": "int", - "default": "Field(default=0, ge=0)" + "name": "section_id", + "type": "str | None", + "line": 46 }, { - "name": "error_summary", + "name": "target_id", "type": "str | None", - "default": "Field(default=None, min_length=1)" + "line": 47 + }, + { + "name": "created_at", + "type": "datetime", + "line": 48 } ], - "line": 478, - "doc": "" - }, + "line": 42 + } + ], + "configuration": [] + }, + { + "source": "townlight_code/suite_session_auth.py", + "sha256": "91ee6d997570b8c1e27f3aa2507b1ec005cf2a1bd3e51536fe622d3c03e5a12c", + "bytes": 9854, + "routes": [], + "models": [ { - "name": "VendorSyncCursorReset", - "bases": [ - "BaseModel" - ], + "name": "SuiteSessionPrincipal", + "bases": [], "fields": [ { - "name": "cursor_at", - "type": "datetime | None", - "default": "None" + "name": "subject", + "type": "str", + "line": 35 }, { - "name": "reason", + "name": "roles", + "type": "frozenset[str]", + "line": 36 + }, + { + "name": "session_id", "type": "str", - "default": "Field(min_length=8, max_length=500)" + "line": 37 } ], - "line": 486, - "doc": "" + "line": 32 } ], - "configuration": [ - { - "variable": "CIVICCLERK_EXPORT_ROOT", - "default": "'exports'", - "line": 3457 - }, - { - "variable": "CIVICCLERK_AGENDA_INTAKE_DB_URL", - "default": "", - "line": 3463 - }, - { - "variable": "CIVICCLERK_AGENDA_ITEM_DB_URL", - "default": "", - "line": 3472 - }, - { - "variable": "CIVICCLERK_PACKET_ASSEMBLY_DB_URL", - "default": "", - "line": 3483 - }, - { - "variable": "CIVICCLERK_NOTICE_CHECKLIST_DB_URL", - "default": "", - "line": 3492 - }, - { - "variable": "CIVICCLERK_MEETING_BODY_DB_URL", - "default": "", - "line": 3501 - }, - { - "variable": "CIVICCLERK_MEETING_DB_URL", - "default": "", - "line": 3510 - }, - { - "variable": "CIVICCLERK_VENDOR_SYNC_DB_URL", - "default": "", - "line": 3521 - }, - { - "variable": "CIVICCLERK_MOTION_VOTE_DB_URL", - "default": "", - "line": 3530 - }, - { - "variable": "CIVICCLERK_MINUTES_DB_URL", - "default": "", - "line": 3541 - }, - { - "variable": "CIVICCLERK_PUBLIC_ARCHIVE_DB_URL", - "default": "", - "line": 3552 - }, - { - "variable": "CIVICCLERK_PUBLIC_ARCHIVE_DB_URL", - "default": "", - "line": 3563 - } - ] + "configuration": [] + } + ] + }, + "zoning": { + "repository": "townlight/zone", + "repository_head": "4d2a77a653e42a17aaea8d83d0b196ba83413c57", + "working_tree_modified": true, + "principal_import": "townlight_zoning", + "source": [ + { + "source": "townlight_zoning/__init__.py", + "sha256": "c92eb3c3aa9d0fd13b8904cbdc0d75828d3eb4a0cbeaba1165140254ce0889a7", + "bytes": 58, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/cited_questions.py", + "sha256": "a243c3887ee4358698008f4753a4877d17c4179ef7f59672ef06429013ea2537", + "bytes": 12311, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/cited_rules.py", + "sha256": "ed8c7210d9f0fd320713f32e9c06a9ea03c94252ddcced19d4c60edf98c549ff", + "bytes": 8521, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/connected_sources.py", + "sha256": "8bf1acad90f7f66e637a45727fc751a5d74f2c98f893c43f91a41914f8735883", + "bytes": 11235, + "routes": [], + "models": [], + "configuration": [] }, { - "source": "installed-owned-source/civicclerk/meeting_body.py", - "sha256": "21085a87b167afb85ddd1e20f561695f580f1e20e8259bc8586e29f5f40cc079", + "source": "townlight_zoning/discretionary.py", + "sha256": "cd7afa08af24988604e6e3daa7c2db3f6d9103b64d64cc55716725f9ef50afd6", + "bytes": 10195, "routes": [], "models": [ { - "name": "MeetingBodyRecord", - "bases": [], - "fields": [ - { - "name": "id", - "type": "UUID", - "default": "" - }, + "name": "Unavailable", + "bases": [], + "fields": [ { - "name": "name", + "name": "reason", "type": "str", - "default": "" + "line": 48 }, { - "name": "body_type", + "name": "fix", "type": "str", - "default": "" + "line": 49 }, { - "name": "is_active", + "name": "review_required", "type": "bool", - "default": "" + "line": 50 }, { - "name": "created_at", - "type": "datetime", - "default": "" - }, - { - "name": "updated_at", - "type": "datetime", - "default": "" + "name": "disclaimer", + "type": "str", + "line": 51 } ], - "line": 29, - "doc": "One municipal body that can own public meetings." - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/meeting_lifecycle.py", - "sha256": "3eb5fdb3d1a259a6841280fca6ce1c1c56317ff8f79de39022e8b5e35fd9115e", - "routes": [], - "models": [ + "line": 45 + }, { - "name": "TransitionResult", + "name": "NonconformityFlag", "bases": [], "fields": [ { - "name": "allowed", - "type": "bool", - "default": "" + "name": "observed", + "type": "str", + "line": 58 }, { - "name": "http_status", - "type": "int", - "default": "" + "name": "standard", + "type": "str", + "line": 59 }, { - "name": "message", + "name": "citation", "type": "str", - "default": "" + "line": 60 }, { - "name": "fix", + "name": "basis", "type": "str", - "default": "" + "line": 61 }, { - "name": "audit_entry", - "type": "dict[str, object]", - "default": "" + "name": "review_required", + "type": "bool", + "line": 62 + }, + { + "name": "determination_made", + "type": "bool", + "line": 63 + }, + { + "name": "disclaimer", + "type": "str", + "line": 64 } ], - "line": 74, - "doc": "" + "line": 55 }, { - "name": "MeetingRecord", + "name": "ProcessExplanation", "bases": [], "fields": [ { - "name": "id", + "name": "process", "type": "str", - "default": "" + "line": 69 }, { - "name": "title", + "name": "label", "type": "str", - "default": "" + "line": 70 }, { - "name": "meeting_type", + "name": "what", "type": "str", - "default": "" + "line": 71 }, { - "name": "scheduled_start", - "type": "datetime | None", - "default": "None" + "name": "standard_citation", + "type": "str", + "line": 72 }, { - "name": "meeting_body_id", - "type": "str | None", - "default": "None" + "name": "needs", + "type": "list", + "line": 73 }, { - "name": "location", - "type": "str | None", - "default": "None" + "name": "review", + "type": "list", + "line": 74 }, { - "name": "status", + "name": "source_citation", + "type": "dict", + "line": 75 + }, + { + "name": "standards", + "type": "list", + "line": 76 + }, + { + "name": "flags", + "type": "list", + "line": 77 + }, + { + "name": "review_required", + "type": "bool", + "line": 78 + }, + { + "name": "determination_made", + "type": "bool", + "line": 79 + }, + { + "name": "disclaimer", "type": "str", - "default": "'SCHEDULED'" + "line": 80 }, { - "name": "audit_entries", - "type": "list[dict[str, object]]", - "default": "field(default_factory=list)" + "name": "as_of", + "type": "str | None", + "line": 81 } ], - "line": 83, - "doc": "" + "line": 68 } ], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/migrations/__init__.py", - "sha256": "dd0a9b788de59eae83bec1152f0508532d3921e8bec7f175ba85f7caa5acc64f", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/env.py", - "sha256": "9b3b3726c41218c534b726516d30de7dce83cc3d8b2f5d02f561ae3460807d5f", - "routes": [], - "models": [], - "configuration": [ - { - "variable": "DATABASE_URL", - "default": "", - "line": 24 - } - ] - }, - { - "source": "installed-owned-source/civicclerk/migrations/guards.py", - "sha256": "5dfcd955681e2467f4ae52ebfe04cf3b5892c9aa68adeae3cb5a999c15ceb69e", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/__init__.py", - "sha256": "e08e35c06b073f92af22b7b5bb564ea2b9caaf2295b68e9c6c5ec175605dcc96", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0001_schema.py", - "sha256": "21441c137f2570d037447bb832d9a8223dcba7ee16e4e7cd7a974d81f1824028", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0002_agenda_intake_queue.py", - "sha256": "e23ff5cf9360ab9657e183970c1e36d67111ebf57d5ab1025f9c820eb81f51b3", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0003_packet_assembly_records.py", - "sha256": "28b2b1adc000bbbfd1d537df7abfed94c1a3120f9755542718c05478e96968cc", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0004_notice_checklist_records.py", - "sha256": "a9759ee9a869cbae969e7f371800a296c53f2787ff6654dcb347c18117ce5fcf", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0005_meeting_records.py", - "sha256": "48d3c089a65d4733c164215ec9a18c153b20226f11d9cf06db0ec19d578ec4ea", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0006_agenda_item_lifecycle_records.py", - "sha256": "b030e37ee25d963ada7b51f907c28dbdd77949f2d9882dedf27ea5dc2cfdf32a", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0007_meeting_schedule_fields.py", - "sha256": "e19e655c7fdbf347a85c22be379b2a537e8075a53748facd55f0856bf93ab598", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0008_agenda_intake_promotion.py", - "sha256": "56d0019f2c413c731a09c8dae9150c4d2cd4ccf7b3911786d6e833b9d965dcc0", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0009_vendor_sync_persistence.py", - "sha256": "83df336d1ba176f5e5ef4c01485b013dd5686e5cbb1c8ca935dd5bb1336b641d", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0010_vendor_sync_cursor.py", - "sha256": "860c440f1696e8094d466c8b634b330416a7e0c0616a660820a1463542f6931b", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0011_data_model_completion.py", - "sha256": "ee830e52b4fd24d37f234ad928b4beda378ef5267a35542739477a46e7b6a93e", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0012_action_item_actor.py", - "sha256": "d7a9b4c893b3387ff7557015213cdc6dda893881998071e74b82cf15be2a986c", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0013_minutes_model_posted.py", - "sha256": "908d75f2a666d4a2837823ff48b94cdc0394227d91b48c46deb6efcc9a69e962", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0014_public_meeting_records.py", - "sha256": "f92409988f5893fcc0da7dcaa5fa083e20b7c42056681c54e9ae8152b6bf1331", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0015_capture_seq.py", - "sha256": "092e93ad53ec9ee047bf4d0d634933f5d735c2b3fa46a1de1e13f1dc11408ff1", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0016_archive_indexes.py", - "sha256": "3d91062951e78685411983f45ea206ab436b6fadb20627a79624880def896742", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0017_meeting_authority.py", - "sha256": "73c6266df0dd33b74223133a2a00d045112a1996ffc38025d3aa8ba7831f1082", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0018_agenda_authority.py", - "sha256": "7dc3993bf51db8239270fd53a651b98ebbff0dbfce56ccbb73414ac9bbac2464", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0019_minutes_decisions.py", - "sha256": "5f088e0026bef9f492cac6a4c4a6c16ee81409d6447b1ab1ee19c037cd56d9cc", + "source": "townlight_zoning/geo_import.py", + "sha256": "8926ce327572fe40e18e513c04928920a5d14306df6b003fd3e0a466914a5a26", + "bytes": 13686, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0020_delivery_history.py", - "sha256": "92a6779b59cb3228b3bbd963a9c4cef921163cbd07473381f015dbf474ba4005", + "source": "townlight_zoning/geo_spatial.py", + "sha256": "dfe4c88a940a20825c5c493babacb0cb0a96a70cb31a831c3ff1ecb4b77ebc13", + "bytes": 5469, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/migrations/versions/civicclerk_0021_sources_archive.py", - "sha256": "3220a0e7992d865b5a1f5a9bb71cb85722336f276fc974c13939d81fbfc1b29c", + "source": "townlight_zoning/geo_validate.py", + "sha256": "65b4a2b84722be8c25decfaeb80c6177ff30588259379927e853f7727d767178", + "bytes": 6419, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/minutes.py", - "sha256": "d4d890d0c9faaa3fdd51643a156e5f6a29274f436eba858db63746ad0ebb1ea3", + "source": "townlight_zoning/integration_mocks.py", + "sha256": "a31da986c6165cf5528bf2065ac856d25fdf3576c11e6fed4cf4656dca683bed", + "bytes": 14445, "routes": [], "models": [ { - "name": "MinutesProvenance", + "name": "IntegrationError", "bases": [], "fields": [ { - "name": "model", + "name": "provider", "type": "str", - "default": "" + "line": 28 }, { - "name": "prompt_version", + "name": "message", "type": "str", - "default": "" + "line": 29 }, { - "name": "data_sources", - "type": "tuple[str, ...]", - "default": "" + "name": "fix", + "type": "str", + "line": 30 }, { - "name": "human_approver", + "name": "code", "type": "str", - "default": "" + "line": 31 } ], - "line": 26, - "doc": "" + "line": 27 }, { - "name": "MinutesDraft", + "name": "IntegrationResult", "bases": [], "fields": [ { - "name": "id", + "name": "provider", "type": "str", - "default": "" + "line": 36 }, { - "name": "meeting_id", - "type": "str", - "default": "" + "name": "records", + "type": "tuple[dict[str, Any], ...]", + "line": 37 }, { - "name": "status", + "name": "source", "type": "str", - "default": "" - }, - { - "name": "sentences", - "type": "tuple[MinutesSentence, ...]", - "default": "" - }, - { - "name": "source_materials", - "type": "tuple[SourceMaterial, ...]", - "default": "" - }, - { - "name": "provenance", - "type": "MinutesProvenance", - "default": "" - }, - { - "name": "adopted", - "type": "bool", - "default": "False" - }, - { - "name": "posted", - "type": "bool", - "default": "False" + "line": 38 }, { - "name": "signed_by", - "type": "str | None", - "default": "None" + "name": "warnings", + "type": "tuple[str, ...]", + "line": 39 }, { - "name": "decision_history", - "type": "tuple[dict, ...]", - "default": "()" + "name": "stale", + "type": "bool", + "line": 40 } ], - "line": 42, - "doc": "" + "line": 35 }, { - "name": "MinutesValidationError", + "name": "LocalIntegrationAdapter", "bases": [], "fields": [ { - "name": "message", + "name": "provider", "type": "str", - "default": "" + "line": 44 }, { - "name": "fix", - "type": "str", - "default": "" + "name": "dependency", + "type": "str | None", + "line": 45 } ], - "line": 71, - "doc": "" + "line": 43 } ], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/mock_city_environment.py", - "sha256": "6df0969766b42257f372e2babf23675b50aead141a1c91e3e9b95237074f084f", - "routes": [], + "source": "townlight_zoning/main.py", + "sha256": "90e869902f36672be17516e85aca88a348e37d2942243deb415cb5f6018f7183", + "bytes": 27978, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 74 + }, + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 92 + }, + { + "method": "GET", + "declared_path": "/townlight_zoning", + "function": "public_townlight_zoning_page", + "line": 104 + }, + { + "method": "GET", + "declared_path": "/townlight_zoning/staff", + "function": "staff_townlight_zoning_page", + "line": 111 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/parcels/lookup", + "function": "parcel_lookup", + "line": 220 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/rules/use", + "function": "use_rule_lookup", + "line": 246 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/rules/dimensional", + "function": "dimensional_rule_lookup", + "line": 261 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/standards/process-explanation", + "function": "discretionary_explanation", + "line": 283 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/questions/answer", + "function": "zone_question_answer", + "line": 353 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/planner-review/classify", + "function": "planner_review_classify", + "line": 378 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_zoning/staff/precedents/{precedent_id}", + "function": "staff_precedent", + "line": 384 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/staff/questions/answer", + "function": "staff_question_answer", + "line": 402 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/staff/ambiguity-reviews", + "function": "create_ambiguity_review", + "line": 415 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_zoning/staff/ambiguity-reviews", + "function": "list_ambiguity_reviews", + "line": 429 + }, + { + "method": "PATCH", + "declared_path": "/api/v1/townlight_zoning/staff/ambiguity-reviews/{item_id}", + "function": "update_ambiguity_review", + "line": 443 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_zoning/staff/questions/analytics", + "function": "staff_question_analytics", + "line": 472 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/staff/reports/outline", + "function": "staff_report_outline", + "line": 496 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_zoning/staff/flagged-answers", + "function": "create_flagged_answer_review", + "line": 520 + }, + { + "method": "PATCH", + "declared_path": "/api/v1/townlight_zoning/staff/flagged-answers/{review_id}/improve", + "function": "improve_flagged_answer_review", + "line": 536 + } + ], "models": [ { - "name": "MockCityHostileFixture", + "name": "StaffPrincipal", "bases": [], "fields": [ { - "name": "area", - "type": "HostileArea", - "default": "" - }, - { - "name": "scenario", - "type": "str", - "default": "" - }, - { - "name": "target", - "type": "str", - "default": "" - }, - { - "name": "trigger", + "name": "subject", "type": "str", - "default": "" + "line": 69 }, { - "name": "expected_behavior", - "type": "str", - "default": "" - }, + "name": "roles", + "type": "tuple[str, ...]", + "line": 70 + } + ], + "line": 68 + }, + { + "name": "ParcelLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "fix", - "type": "str", - "default": "" + "name": "parcel_number", + "type": "str | None", + "line": 118 }, { - "name": "sample", - "type": "dict[str, Any]", - "default": "" + "name": "address", + "type": "str | None", + "line": 119 } ], - "line": 47, - "doc": "Secret-free adversarial fixture for the mock-city hostile-mode toggle." + "line": 117 }, { - "name": "MockCityHostileCheck", - "bases": [], + "name": "UseRuleLookupRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "area", - "type": "HostileArea", - "default": "" - }, - { - "name": "scenario", + "name": "zone_code", "type": "str", - "default": "" + "line": 123 }, { - "name": "target", + "name": "use", "type": "str", - "default": "" - }, - { - "name": "ok", - "type": "bool", - "default": "" - }, + "line": 124 + } + ], + "line": 122 + }, + { + "name": "DimensionalRuleLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "message", + "name": "zone_code", "type": "str", - "default": "" + "line": 128 }, { - "name": "fix", + "name": "rule_type", "type": "str", - "default": "" + "line": 129 } ], - "line": 71, - "doc": "Conformance result for a hostile-mode mock-city fixture." - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/models.py", - "sha256": "ffc262c2381523ee111259d53bc402938781de926624ca2c791f2ca23bb8072c", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/motion_vote.py", - "sha256": "8bc167f9e1ab291f7ee8a616f54786bf4baa686849deac1db33884d5a6d5eaef", - "routes": [], - "models": [ + "line": 127 + }, { - "name": "MotionRecord", - "bases": [], + "name": "ZoneQuestionRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "id", + "name": "zone_code", "type": "str", - "default": "" + "line": 133 }, { - "name": "meeting_id", + "name": "question", "type": "str", - "default": "" - }, + "line": 134 + } + ], + "line": 132 + }, + { + "name": "PlannerReviewRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "text", + "name": "question", "type": "str", - "default": "" - }, + "line": 138 + } + ], + "line": 137 + }, + { + "name": "StaffQuestionAnswerRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "actor", + "name": "zone_code", "type": "str", - "default": "" - }, - { - "name": "agenda_item_id", - "type": "str | None", - "default": "None" - }, - { - "name": "seconded_by", - "type": "str | None", - "default": "None" - }, - { - "name": "correction_of_id", - "type": "str | None", - "default": "None" - }, - { - "name": "correction_reason", - "type": "str | None", - "default": "None" + "line": 142 }, { - "name": "captured", - "type": "bool", - "default": "True" + "name": "question", + "type": "str", + "line": 143 } ], - "line": 17, - "doc": "" + "line": 141 }, { - "name": "VoteRecord", - "bases": [], + "name": "AmbiguityReviewCreateRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "id", + "name": "zone_code", "type": "str", - "default": "" + "line": 147 }, { - "name": "motion_id", + "name": "question", "type": "str", - "default": "" + "line": 148 }, { - "name": "voter_name", + "name": "reason", "type": "str", - "default": "" - }, + "line": 149 + } + ], + "line": 146 + }, + { + "name": "AmbiguityReviewUpdateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "vote", + "name": "status", "type": "str", - "default": "" + "line": 153 }, { - "name": "actor", - "type": "str", - "default": "" + "name": "assigned_to", + "type": "str | None", + "line": 154 }, { - "name": "correction_of_id", + "name": "resolution", "type": "str | None", - "default": "None" + "line": 155 + } + ], + "line": 152 + }, + { + "name": "StaffReportOutlineRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "line": 159 }, { - "name": "correction_reason", - "type": "str | None", - "default": "None" + "name": "question_ids", + "type": "list[str]", + "line": 160 }, { - "name": "captured", - "type": "bool", - "default": "True" + "name": "queue_item_ids", + "type": "list[str]", + "line": 161 } ], - "line": 43, - "doc": "" + "line": 158 }, { - "name": "ActionItemRecord", - "bases": [], + "name": "FlaggedAnswerCreateRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "id", + "name": "zone_code", "type": "str", - "default": "" + "line": 165 }, { - "name": "meeting_id", + "name": "question", "type": "str", - "default": "" + "line": 166 }, { - "name": "description", + "name": "original_answer", "type": "str", - "default": "" + "line": 167 }, { - "name": "actor", + "name": "flag_reason", "type": "str", - "default": "" - }, - { - "name": "assigned_to", - "type": "str | None", - "default": "None" - }, - { - "name": "source_motion_id", - "type": "str | None", - "default": "None" + "line": 168 }, { - "name": "status", - "type": "str", - "default": "'OPEN'" + "name": "citations", + "type": "list[str]", + "line": 169 } ], - "line": 67, - "doc": "" + "line": 164 }, { - "name": "MeetingOutcomeSummary", - "bases": [], + "name": "FlaggedAnswerImproveRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "meeting_id", + "name": "improved_answer", "type": "str", - "default": "" + "line": 173 }, { - "name": "motion_id", + "name": "improvement_notes", "type": "str", - "default": "" - }, + "line": 174 + } + ], + "line": 172 + }, + { + "name": "DiscretionaryExplanationRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "text", + "name": "process_section", "type": "str", - "default": "" + "line": 275 }, { - "name": "actor", + "name": "question", "type": "str", - "default": "" + "line": 276 }, { - "name": "status", + "name": "zone_code", "type": "str", - "default": "" + "line": 277 }, { - "name": "vote_count", - "type": "int", - "default": "" + "name": "rule_types", + "type": "list[str]", + "line": 278 }, { - "name": "action_item_count", - "type": "int", - "default": "" + "name": "observed", + "type": "dict[str, str]", + "line": 279 } ], - "line": 89, - "doc": "" + "line": 274 } ], + "configuration": [ + { + "environment": "TOWNLIGHT_ZONING_PARCEL_RULE_DB_URL", + "line": 559 + } + ] + }, + { + "source": "townlight_zoning/migrations/__init__.py", + "sha256": "5b0db2ee33fc0c4091e615e58fc97420e861a39c50b7a37a090ba8e117c9869e", + "bytes": 43, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/migrations/alembic.ini", + "sha256": "d5dee873fc4cceb1d53bfae71f8fbed319dd4c1b93934e35cbb271d3b97c9c08", + "bytes": 580, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/migrations/env.py", + "sha256": "5d437b18f5267667c260fe384f6617648d57d940e2d3a91de05b79aa87598e21", + "bytes": 2206, + "routes": [], + "models": [], + "configuration": [ + { + "environment": "DATABASE_URL", + "line": 22 + } + ] + }, + { + "source": "townlight_zoning/migrations/guards.py", + "sha256": "6dff39d29a7936155d1bd5e3ff9b84e09548beeff7a031cdf1172a6855128398", + "bytes": 543, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/migrations/versions/__init__.py", + "sha256": "6529bd8ce272c2c512ceda3ababea3a9d17dc04e8842f3a7f991657e1c7a8d72", + "bytes": 44, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/migrations/versions/townlight_zoning_0001_schema.py", + "sha256": "c0a1010064afac0904ec92314f0c03c6820a360e75f36df523962226008fd2bf", + "bytes": 5813, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/migrations/versions/townlight_zoning_0002_parcel_rule_lookup_records.py", + "sha256": "1a69bdf0eee9bd044ca970eb5ea23eb72abb778dbf313c9c53cb00ca57f374ab", + "bytes": 2733, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/migrations/versions/townlight_zoning_0003_question_ledger.py", + "sha256": "5161cc3504e7be2f7b59c893d7d94f2fc42ab141b501b01c745c86833d9cc943", + "bytes": 1372, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/migrations/versions/townlight_zoning_0004_staff_workflows.py", + "sha256": "a6101844d74baca978f82703ceedcaa817452cb2bcabe20cb6863fdd8d8714ef", + "bytes": 3447, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/migrations/versions/townlight_zoning_0005_geo_import.py", + "sha256": "e0a14dadd86311b9af7e66c34c33d94ea9b3a2489c59c3b188b870e77ba48c6f", + "bytes": 3920, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/notice_checklist.py", - "sha256": "093031a3501ad47e35075e5350f20a3cf5ad8f7d29aa9298ea654edcbd253f71", + "source": "townlight_zoning/migrations/versions/townlight_zoning_0006_cited_questions.py", + "sha256": "5195cf011c8c384b5c0a3b7cf7abc1b3414f59dc8e92a37c5248c6f8dfada527", + "bytes": 2398, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/models.py", + "sha256": "bdbc7553151a8bd14d24bd9f50a929087a08fa9ce8a17cd8398cd665753aee93", + "bytes": 6251, "routes": [], "models": [ { - "name": "NoticeChecklistRecord", + "name": "TimestampMixin", "bases": [], "fields": [ { - "name": "id", - "type": "str", - "default": "" - }, - { - "name": "meeting_id", - "type": "str", - "default": "" - }, - { - "name": "notice_type", - "type": "str", - "default": "" - }, - { - "name": "status", - "type": "str", - "default": "" - }, - { - "name": "compliant", - "type": "bool", - "default": "" - }, - { - "name": "http_status", - "type": "int", - "default": "" - }, - { - "name": "warnings", - "type": "list[dict]", - "default": "" - }, - { - "name": "deadline_at", - "type": "datetime", - "default": "" + "name": "created_at", + "type": "Mapped[object]", + "line": 13 }, { - "name": "posted_at", - "type": "datetime", - "default": "" - }, + "name": "updated_at", + "type": "Mapped[object]", + "line": 16 + } + ], + "line": 12 + }, + { + "name": "IdMixin", + "bases": [], + "fields": [ { - "name": "minimum_notice_hours", - "type": "int", - "default": "" - }, + "name": "id", + "type": "Mapped[uuid.UUID]", + "line": 22 + } + ], + "line": 21 + }, + { + "name": "Zone", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ { - "name": "statutory_basis", - "type": "str | None", - "default": "" + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 29 }, { - "name": "approved_by", - "type": "str | None", - "default": "" + "name": "code", + "type": "Mapped[str]", + "line": 31 }, { - "name": "posting_proof", - "type": "dict | None", - "default": "" + "name": "name", + "type": "Mapped[str]", + "line": 32 }, { - "name": "last_audit_hash", - "type": "str", - "default": "" + "name": "description", + "type": "Mapped[str | None]", + "line": 33 }, { - "name": "created_at", - "type": "datetime", - "default": "" + "name": "jurisdiction", + "type": "Mapped[str]", + "line": 34 }, { - "name": "updated_at", - "type": "datetime", - "default": "" + "name": "source_section_ref", + "type": "Mapped[str | None]", + "line": 35 }, { - "name": "audit_entries", - "type": "list[dict]", - "default": "" + "name": "is_active", + "type": "Mapped[bool]", + "line": 36 } ], - "line": 50, - "doc": "Persisted notice compliance check and optional posting proof." - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/oidc_auth.py", - "sha256": "3c9ae9b5d1f664d4372048c6e708cc77589cceb071d3e15cab8b90cf76926120", - "routes": [], - "models": [ + "line": 27 + }, { - "name": "OidcStaffAuthConfig", - "bases": [], + "name": "Overlay", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], "fields": [ { - "name": "provider", - "type": "str", - "default": "" - }, - { - "name": "issuer", - "type": "str", - "default": "" + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 41 }, { - "name": "audience", - "type": "str", - "default": "" + "name": "code", + "type": "Mapped[str]", + "line": 43 }, { - "name": "jwks_url", - "type": "str | None", - "default": "" + "name": "name", + "type": "Mapped[str]", + "line": 44 }, { - "name": "jwks_json", - "type": "str | None", - "default": "" + "name": "description", + "type": "Mapped[str | None]", + "line": 45 }, { - "name": "role_claims", - "type": "tuple[str, ...]", - "default": "" + "name": "source_section_ref", + "type": "Mapped[str | None]", + "line": 46 }, { - "name": "algorithms", - "type": "tuple[str, ...]", - "default": "" + "name": "is_active", + "type": "Mapped[bool]", + "line": 47 + } + ], + "line": 39 + }, + { + "name": "Parcel", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 52 }, { - "name": "authorization_url", - "type": "str | None", - "default": "" + "name": "parcel_number", + "type": "Mapped[str]", + "line": 54 }, { - "name": "token_url", - "type": "str | None", - "default": "" + "name": "address", + "type": "Mapped[str]", + "line": 55 }, { - "name": "client_id", - "type": "str | None", - "default": "" + "name": "zone_id", + "type": "Mapped[uuid.UUID]", + "line": 56 }, { - "name": "client_secret", - "type": "str | None", - "default": "" + "name": "overlay_payload", + "type": "Mapped[dict]", + "line": 57 }, { - "name": "redirect_uri", - "type": "str | None", - "default": "" + "name": "geometry_ref", + "type": "Mapped[str | None]", + "line": 58 }, { - "name": "session_cookie_secret", - "type": "str | None", - "default": "" + "name": "source_payload", + "type": "Mapped[dict]", + "line": 59 } ], - "line": 21, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/packet_assembly.py", - "sha256": "5edc8d3316a5eb4965b8bcbd94468fb70ef5050ed75811facccc560cec6a4791", - "routes": [], - "models": [ + "line": 50 + }, { - "name": "PacketAssemblyRecord", - "bases": [], + "name": "UseCategory", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], "fields": [ { - "name": "id", - "type": "str", - "default": "" + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 64 }, { - "name": "meeting_id", - "type": "str", - "default": "" + "name": "code", + "type": "Mapped[str]", + "line": 66 }, { - "name": "packet_snapshot_id", - "type": "str", - "default": "" + "name": "label", + "type": "Mapped[str]", + "line": 67 }, { - "name": "packet_version", - "type": "int", - "default": "" + "name": "description", + "type": "Mapped[str | None]", + "line": 68 + } + ], + "line": 62 + }, + { + "name": "UseRule", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 73 }, { - "name": "title", - "type": "str", - "default": "" + "name": "zone_id", + "type": "Mapped[uuid.UUID]", + "line": 75 + }, + { + "name": "use_category_id", + "type": "Mapped[uuid.UUID]", + "line": 76 }, { "name": "status", - "type": "str", - "default": "" + "type": "Mapped[str]", + "line": 79 }, { - "name": "actor", - "type": "str", - "default": "" + "name": "review_path", + "type": "Mapped[str | None]", + "line": 80 }, { - "name": "agenda_item_ids", - "type": "list[str]", - "default": "" + "name": "source_section_ref", + "type": "Mapped[str | None]", + "line": 81 }, { - "name": "source_references", - "type": "list[dict]", - "default": "" + "name": "conditions", + "type": "Mapped[dict]", + "line": 82 + } + ], + "line": 71 + }, + { + "name": "DimensionalRule", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 87 }, { - "name": "citations", - "type": "list[dict]", - "default": "" + "name": "zone_id", + "type": "Mapped[uuid.UUID]", + "line": 89 }, { - "name": "finalized_by", - "type": "str | None", - "default": "" + "name": "rule_type", + "type": "Mapped[str]", + "line": 90 }, { - "name": "finalized_at", - "type": "datetime | None", - "default": "" + "name": "value_text", + "type": "Mapped[str]", + "line": 91 }, { - "name": "last_audit_hash", - "type": "str", - "default": "" + "name": "source_section_ref", + "type": "Mapped[str | None]", + "line": 92 }, { - "name": "created_at", - "type": "datetime", - "default": "" + "name": "applies_to", + "type": "Mapped[str | None]", + "line": 93 + } + ], + "line": 85 + }, + { + "name": "Citation", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 98 }, { - "name": "updated_at", - "type": "datetime", - "default": "" + "name": "source_section_ref", + "type": "Mapped[str]", + "line": 100 }, { - "name": "snapshot_content", - "type": "list[dict]", - "default": "" + "name": "citation_text", + "type": "Mapped[str]", + "line": 101 }, { - "name": "delivery_history", - "type": "list[dict]", - "default": "" + "name": "url", + "type": "Mapped[str | None]", + "line": 102 }, { - "name": "audit_entries", - "type": "list[dict]", - "default": "" + "name": "retrieved_at", + "type": "Mapped[object | None]", + "line": 103 } ], - "line": 51, - "doc": "One persisted packet assembly draft or finalized packet record." - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/packet_notice.py", - "sha256": "826b46e12dc114c10b25838bd68bc2d668dc5bdfa2e74bfafc841b6fddff3ffc", - "routes": [], - "models": [ + "line": 96 + }, { - "name": "PacketSource", - "bases": [], + "name": "Precedent", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], "fields": [ { - "name": "source_id", - "type": "str", - "default": "" + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 108 }, { "name": "title", - "type": "str", - "default": "" - }, - { - "name": "kind", - "type": "str", - "default": "'document'" - }, - { - "name": "source_system", - "type": "str | None", - "default": "None" + "type": "Mapped[str]", + "line": 110 }, { - "name": "source_path", - "type": "str | None", - "default": "None" + "name": "body", + "type": "Mapped[str]", + "line": 111 }, { - "name": "checksum", - "type": "str | None", - "default": "None" + "name": "visibility", + "type": "Mapped[str]", + "line": 112 }, { - "name": "sensitivity_label", - "type": "str | None", - "default": "None" + "name": "source_ref", + "type": "Mapped[str | None]", + "line": 113 }, { - "name": "citation_label", - "type": "str | None", - "default": "None" + "name": "tags", + "type": "Mapped[dict]", + "line": 114 } ], - "line": 58, - "doc": "Source material included in an exported packet bundle." + "line": 106 }, { - "name": "PacketSnapshot", - "bases": [], + "name": "InterpretationNote", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], "fields": [ { - "name": "id", - "type": "str", - "default": "" - }, - { - "name": "meeting_id", - "type": "str", - "default": "" + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 119 }, { - "name": "version", - "type": "int", - "default": "" + "name": "zone_id", + "type": "Mapped[uuid.UUID | None]", + "line": 121 }, { - "name": "agenda_item_ids", - "type": "tuple[str, ...]", - "default": "" + "name": "note_text", + "type": "Mapped[str]", + "line": 122 }, { - "name": "actor", - "type": "str", - "default": "" + "name": "visibility", + "type": "Mapped[str]", + "line": 123 }, { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "name": "status", + "type": "Mapped[str]", + "line": 124 } ], - "line": 92, - "doc": "" + "line": 117 }, { - "name": "PacketExportResult", - "bases": [], + "name": "ZoneQuestion", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], "fields": [ { - "name": "meeting_id", - "type": "str", - "default": "" - }, - { - "name": "bundle_path", - "type": "str", - "default": "" + "name": "__table_args__", + "type": "ClassVar[dict]", + "line": 129 }, { - "name": "manifest_path", - "type": "str", - "default": "" + "name": "question_text", + "type": "Mapped[str]", + "line": 131 }, { - "name": "checksums_path", - "type": "str", - "default": "" + "name": "audience", + "type": "Mapped[str]", + "line": 132 }, { - "name": "civiccore_version", - "type": "str", - "default": "" + "name": "status", + "type": "Mapped[str]", + "line": 133 }, { - "name": "packet_version", - "type": "int", - "default": "" + "name": "answer_text", + "type": "Mapped[str | None]", + "line": 134 }, { - "name": "audit_hash", - "type": "str", - "default": "" + "name": "citation_payload", + "type": "Mapped[dict]", + "line": 135 }, { - "name": "generated_files", - "type": "tuple[str, ...]", - "default": "" + "name": "escalation_reason", + "type": "Mapped[str | None]", + "line": 136 } ], - "line": 112, - "doc": "Result of creating a records-ready packet export bundle." - }, + "line": 127 + } + ], + "configuration": [] + }, + { + "source": "townlight_zoning/parcel_lookup.py", + "sha256": "45703bbce2f91f8c6f2b86b3571314d6bafeaf58ba6965b6a7e9c7e3b01b925f", + "bytes": 6367, + "routes": [], + "models": [ { - "name": "NoticeComplianceResult", + "name": "ParcelLookupResult", "bases": [], "fields": [ { - "name": "meeting_id", + "name": "parcel_number", "type": "str", - "default": "" + "line": 13 }, { - "name": "notice_type", + "name": "address", "type": "str", - "default": "" - }, - { - "name": "scheduled_start", - "type": "datetime", - "default": "" - }, - { - "name": "posted_at", - "type": "datetime", - "default": "" - }, - { - "name": "minimum_notice_hours", - "type": "int", - "default": "" + "line": 14 }, { - "name": "deadline_at", - "type": "datetime", - "default": "" + "name": "zone_code", + "type": "str", + "line": 15 }, { - "name": "statutory_basis", - "type": "str | None", - "default": "" + "name": "zone_name", + "type": "str", + "line": 16 }, { - "name": "approved_by", - "type": "str | None", - "default": "" + "name": "overlays", + "type": "tuple[str, ...]", + "line": 17 }, { - "name": "compliant", - "type": "bool", - "default": "" + "name": "constraints", + "type": "tuple[str, ...]", + "line": 18 }, { - "name": "http_status", - "type": "int", - "default": "" + "name": "source", + "type": "str", + "line": 19 }, { - "name": "warnings", - "type": "list[dict[str, str]]", - "default": "" + "name": "disclaimer", + "type": "str", + "line": 20 } ], - "line": 343, - "doc": "" + "line": 12 }, { - "name": "PostedNotice", + "name": "ParcelLookupError", "bases": [], "fields": [ { - "name": "id", + "name": "message", "type": "str", - "default": "" + "line": 25 }, { - "name": "result", - "type": "NoticeComplianceResult", - "default": "" + "name": "fix", + "type": "str", + "line": 26 } ], - "line": 372, - "doc": "" + "line": 24 } ], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/prompt_evals.py", - "sha256": "0c47c06b36500ae63a0ad9dda52edd4baadd8688010714701b6228d6ccca21bd", + "source": "townlight_zoning/public_ui.py", + "sha256": "494537866bf7b7198eef0cefa59d83c8ad6608ccc44b1c521a4b1a58a041a58c", + "bytes": 12835, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_zoning/qa.py", + "sha256": "adad43278cb57b3c83032117d46df2b48b919354cb92083162389993cfb29f85", + "bytes": 4699, "routes": [], "models": [ { - "name": "PromptEvalResult", + "name": "ZoneAnswer", "bases": [], "fields": [ { - "name": "prompt_reference", + "name": "answer", "type": "str", - "default": "" + "line": 17 }, { - "name": "provider", + "name": "citations", + "type": "tuple[str, ...]", + "line": 18 + }, + { + "name": "status", "type": "str", - "default": "" + "line": 19 }, { - "name": "offline", - "type": "bool", - "default": "" + "name": "reason", + "type": "str", + "line": 20 }, { - "name": "passed", - "type": "bool", - "default": "" + "name": "confidence", + "type": "str", + "line": 21 }, { - "name": "message", + "name": "next_step", + "type": "str", + "line": 22 + }, + { + "name": "disclaimer", "type": "str", - "default": "" + "line": 23 } ], - "line": 17, - "doc": "" + "line": 16 } ], - "configuration": [ - { - "variable": "CIVICCORE_LLM_PROVIDER", - "default": "''", - "line": 128 - }, - { - "variable": "CIVICCLERK_EVAL_OFFLINE", - "default": "", - "line": 129 - } - ] + "configuration": [] }, { - "source": "installed-owned-source/civicclerk/prompt_library.py", - "sha256": "433e349bb9c768d37359bae0a68c89715337da8f363ddaec5a62f37bddd563d9", + "source": "townlight_zoning/question_ledger.py", + "sha256": "7895c6ba5ec3eb4fba1666cf42ba131a389570c308237b01a91473b937c761b6", + "bytes": 4945, "routes": [], "models": [ { - "name": "PromptEvaluation", + "name": "ZoneQuestionLedgerRecord", "bases": [], "fields": [ { - "name": "name", + "name": "id", "type": "str", - "default": "" + "line": 33 }, { - "name": "required_phrases", - "type": "tuple[str, ...]", - "default": "" - } - ], - "line": 34, - "doc": "" - }, - { - "name": "PromptDefinition", - "bases": [], - "fields": [ - { - "name": "id", + "name": "zone_code", "type": "str", - "default": "" + "line": 34 }, { - "name": "version", + "name": "question_text", "type": "str", - "default": "" + "line": 35 }, { - "name": "provider", + "name": "audience", "type": "str", - "default": "" + "line": 36 }, { - "name": "purpose", + "name": "status", "type": "str", - "default": "" + "line": 37 }, { - "name": "required_variables", - "type": "tuple[str, ...]", - "default": "" + "name": "answer_text", + "type": "str | None", + "line": 38 }, { - "name": "system_prompt", - "type": "str", - "default": "" + "name": "citation_payload", + "type": "tuple[str, ...]", + "line": 39 }, { - "name": "template", + "name": "disclaimer", "type": "str", - "default": "" + "line": 40 }, { - "name": "evaluations", - "type": "tuple[PromptEvaluation, ...]", - "default": "" + "name": "escalation_reason", + "type": "str | None", + "line": 41 }, { - "name": "public_facing", - "type": "bool", - "default": "False" + "name": "created_at", + "type": "datetime", + "line": 42 }, { - "name": "approval_required", - "type": "str | None", - "default": "None" + "name": "updated_at", + "type": "datetime", + "line": 43 } ], - "line": 40, - "doc": "" + "line": 32 } ], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/public_archive.py", - "sha256": "389d714ee91ef1c4b0cbf49d960894bba49787232a29537ddaebcb9eecbe06b9", + "source": "townlight_zoning/rule_lookup.py", + "sha256": "b69c6e8a89cf2586b05984ccb6079164c75fa460c053fca546c3e771ea8c75f5", + "bytes": 9642, "routes": [], "models": [ { - "name": "PublicMeetingRecord", + "name": "UseRuleResult", "bases": [], "fields": [ { - "name": "id", - "type": "str", - "default": "" - }, - { - "name": "meeting_id", + "name": "zone_code", "type": "str", - "default": "" + "line": 15 }, { - "name": "title", + "name": "use", "type": "str", - "default": "" + "line": 16 }, { - "name": "visibility", + "name": "status", "type": "str", - "default": "" + "line": 17 }, { - "name": "posted_agenda", + "name": "review_path", "type": "str", - "default": "" + "line": 18 }, { - "name": "posted_packet", + "name": "citation", "type": "str", - "default": "" + "line": 19 }, { - "name": "approved_minutes", + "name": "disclaimer", "type": "str", - "default": "" - }, - { - "name": "public_comment_enabled", - "type": "bool", - "default": "False" - }, - { - "name": "plain_language_summary", - "type": "str | None", - "default": "None" - }, - { - "name": "agenda_download_url", - "type": "str | None", - "default": "None" - }, - { - "name": "packet_download_url", - "type": "str | None", - "default": "None" - }, - { - "name": "minutes_download_url", - "type": "str | None", - "default": "None" - }, - { - "name": "minutes_adopted_at", - "type": "str | None", - "default": "None" - }, - { - "name": "minutes_signed_by", - "type": "str | None", - "default": "None" - }, - { - "name": "closed_session_notes", - "type": "str | None", - "default": "None" - }, - { - "name": "audit_entries", - "type": "list[dict]", - "default": "field(default_factory=list)" + "line": 20 } ], - "line": 27, - "doc": "" + "line": 14 }, { - "name": "PublicCommentRecord", + "name": "DimensionalRuleResult", "bases": [], "fields": [ { - "name": "id", + "name": "zone_code", "type": "str", - "default": "" + "line": 25 }, { - "name": "public_record_id", + "name": "rule_type", "type": "str", - "default": "" + "line": 26 }, { - "name": "commenter_name", + "name": "value", "type": "str", - "default": "" + "line": 27 }, { - "name": "comment", + "name": "citation", "type": "str", - "default": "" + "line": 28 }, { - "name": "submitted_at", + "name": "disclaimer", + "type": "str", + "line": 29 + } + ], + "line": 24 + }, + { + "name": "RuleLookupError", + "bases": [], + "fields": [ + { + "name": "message", "type": "str", - "default": "" + "line": 34 }, { - "name": "status", + "name": "fix", "type": "str", - "default": "'RECEIVED'" + "line": 35 } ], - "line": 69, - "doc": "" + "line": 33 } ], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/public_ui.py", - "sha256": "4359447b52c4499727fa1d62f385e778154a4243af716cd2fb828e30af6f5db0", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/records_sources.py", - "sha256": "843b4808e4a335ab05a7801a33a3a5750dc49ce84d7e71961841e91e7532598f", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/staff_ui.py", - "sha256": "158329afdeafeb52619ae70bb78cdc731a1cc65f21b31494e3cafd2884b5bdb3", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/suite_session_compat.py", - "sha256": "6b7cfc7719b722eb7da68fa137c3996d64f237d313ef925ba340f6c39d74474e", + "source": "townlight_zoning/staff_context.py", + "sha256": "50784c2b595741098e2de9d9ad90a7957607ae09839afe6167af13e38037c91c", + "bytes": 1368, "routes": [], "models": [ { - "name": "SuiteSessionPrincipal", + "name": "EscalationResult", "bases": [], "fields": [ { - "name": "subject", + "name": "status", "type": "str", - "default": "" + "line": 10 }, { - "name": "roles", - "type": "frozenset[str]", - "default": "" + "name": "reason", + "type": "str", + "line": 11 }, { - "name": "session_id", + "name": "next_step", + "type": "str", + "line": 12 + } + ], + "line": 9 + }, + { + "name": "StaffPrecedent", + "bases": [], + "fields": [ + { + "name": "title", + "type": "str", + "line": 17 + }, + { + "name": "summary", + "type": "str", + "line": 18 + }, + { + "name": "visibility", "type": "str", - "default": "" + "line": 19 } ], - "line": 28, - "doc": "Validated CivicCore suite session principal." + "line": 16 } ], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/transcripts.py", - "sha256": "33d5b6f97ce58b6f645e0c236a53a855c358d01db06ee048ec9c90100474bc98", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/vendor_delta.py", - "sha256": "cebd1ffb95726fd5beb874fbfd9726555681e6c35be7957b97dda26a69898cd3", + "source": "townlight_zoning/staff_ui.py", + "sha256": "0b9f26845887662a88e643224360e3c89b11d0fbe88dcca0e865c57fecb623ee", + "bytes": 8358, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicclerk/vendor_live_sync.py", - "sha256": "0a5048436302ad12e21d822952705ae754ed0ca7a76a7ea9080b292cc2489ab5", + "source": "townlight_zoning/staff_workflows.py", + "sha256": "620797c1132212795b703d5a452553be1d0b4f2ae73082e9b26c52615a95b498", + "bytes": 24606, "routes": [], "models": [ { - "name": "LiveSyncCheck", + "name": "CodeCrossReference", "bases": [], "fields": [ { - "name": "status", - "type": "Literal['PASS', 'FAIL']", - "default": "" - }, - { - "name": "name", + "name": "citation", "type": "str", - "default": "" + "line": 81 }, { - "name": "message", + "name": "source", "type": "str", - "default": "" + "line": 82 }, { - "name": "fix", + "name": "relevance", "type": "str", - "default": "" + "line": 83 } ], - "line": 49, - "doc": "" + "line": 80 }, { - "name": "VendorLiveSyncConfig", + "name": "StaffQuestionRecord", "bases": [], "fields": [ { - "name": "connector", + "name": "id", "type": "str", - "default": "" + "line": 88 }, { - "name": "source_url", + "name": "zone_code", "type": "str", - "default": "" + "line": 89 }, { - "name": "auth_method", - "type": "AuthMethod", - "default": "" - } - ], - "line": 57, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/vendor_network_sync.py", - "sha256": "cf3a9c14de83f76b8deb87aabfaeb43e93bca98f26a65183f1dd4001a3df91e1", - "routes": [], - "models": [ - { - "name": "VendorNetworkSyncAttempt", - "bases": [], - "fields": [ + "name": "question_text", + "type": "str", + "line": 90 + }, { - "name": "ok", - "type": "bool", - "default": "" + "name": "status", + "type": "str", + "line": 91 }, { - "name": "message", + "name": "answer_text", "type": "str", - "default": "" + "line": 92 }, { - "name": "fix", + "name": "citations", + "type": "tuple[str, ...]", + "line": 93 + }, + { + "name": "code_cross_references", + "type": "tuple[CodeCrossReference, ...]", + "line": 94 + }, + { + "name": "created_by", "type": "str", - "default": "" + "line": 95 }, { - "name": "external_meeting_id", - "type": "str | None", - "default": "None" + "name": "created_at", + "type": "datetime", + "line": 96 }, { - "name": "error_class", - "type": "str | None", - "default": "None" + "name": "visibility", + "type": "str", + "line": 97 + }, + { + "name": "disclaimer", + "type": "str", + "line": 98 } ], - "line": 31, - "doc": "" + "line": 87 }, { - "name": "VendorNetworkSyncReport", + "name": "AmbiguityReviewItem", "bases": [], "fields": [ { - "name": "source_id", + "name": "id", "type": "str", - "default": "" + "line": 103 }, { - "name": "connector", + "name": "zone_code", "type": "str", - "default": "" - }, - { - "name": "network_calls", - "type": "bool", - "default": "" - }, - { - "name": "records_discovered", - "type": "int", - "default": "" + "line": 104 }, { - "name": "records_succeeded", - "type": "int", - "default": "" + "name": "question_text", + "type": "str", + "line": 105 }, { - "name": "records_failed", - "type": "int", - "default": "" + "name": "reason", + "type": "str", + "line": 106 }, { - "name": "run_status", - "type": "str | None", - "default": "" + "name": "status", + "type": "str", + "line": 107 }, { - "name": "source_health_status", + "name": "assigned_to", "type": "str | None", - "default": "" + "line": 108 }, { - "name": "delta_request_url", + "name": "resolution", "type": "str | None", - "default": "" + "line": 109 }, { - "name": "cursor_param", + "name": "source_question_id", "type": "str | None", - "default": "" + "line": 110 }, { - "name": "cursor_value", - "type": "str | None", - "default": "" + "name": "created_by", + "type": "str", + "line": 111 }, { - "name": "cursor_advanced_at", - "type": "str | None", - "default": "" + "name": "created_at", + "type": "datetime", + "line": 112 }, { - "name": "message", - "type": "str", - "default": "" + "name": "updated_at", + "type": "datetime", + "line": 113 }, { - "name": "fix", + "name": "visibility", "type": "str", - "default": "" - }, - { - "name": "attempts", - "type": "list[VendorNetworkSyncAttempt]", - "default": "" + "line": 114 } ], - "line": 40, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicclerk/vendor_sync_persistence.py", - "sha256": "f719849f9cd2e1c667bc61f501dc281bf0efe26646e230b0b5b786afcb082d9b", - "routes": [], - "models": [ + "line": 102 + }, { - "name": "VendorSyncSourceRecord", + "name": "HighVolumeQuestion", "bases": [], "fields": [ { - "name": "id", + "name": "zone_code", "type": "str", - "default": "" + "line": 119 }, { - "name": "connector", + "name": "question_text", "type": "str", - "default": "" + "line": 120 }, { - "name": "source_name", - "type": "str", - "default": "" + "name": "count", + "type": "int", + "line": 121 }, { - "name": "source_url", - "type": "str", - "default": "" + "name": "statuses", + "type": "tuple[str, ...]", + "line": 122 }, { - "name": "auth_method", + "name": "latest_question_id", "type": "str", - "default": "" - }, + "line": 123 + } + ], + "line": 118 + }, + { + "name": "StaffQuestionAnalytics", + "bases": [], + "fields": [ { - "name": "consecutive_failure_count", + "name": "total_questions", "type": "int", - "default": "" + "line": 128 }, { - "name": "active_failure_count", - "type": "int", - "default": "" + "name": "by_status", + "type": "dict[str, int]", + "line": 129 }, { - "name": "sync_paused", - "type": "bool", - "default": "" + "name": "high_volume_questions", + "type": "tuple[HighVolumeQuestion, ...]", + "line": 130 }, { - "name": "sync_paused_at", - "type": "datetime | None", - "default": "" + "name": "generated_at", + "type": "datetime", + "line": 131 }, { - "name": "sync_paused_reason", - "type": "str | None", - "default": "" + "name": "visibility", + "type": "str", + "line": 132 + } + ], + "line": 127 + }, + { + "name": "StaffReportOutline", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "line": 137 }, { - "name": "last_sync_status", - "type": "str | None", - "default": "" + "name": "title", + "type": "str", + "line": 138 }, { - "name": "last_error_at", - "type": "datetime | None", - "default": "" + "name": "sections", + "type": "tuple[dict[str, object], ...]", + "line": 139 }, { - "name": "last_success_cursor_at", - "type": "datetime | None", - "default": "" + "name": "source_question_ids", + "type": "tuple[str, ...]", + "line": 140 + }, + { + "name": "source_queue_item_ids", + "type": "tuple[str, ...]", + "line": 141 + }, + { + "name": "created_by", + "type": "str", + "line": 142 }, { "name": "created_at", "type": "datetime", - "default": "" + "line": 143 + }, + { + "name": "visibility", + "type": "str", + "line": 144 }, { - "name": "updated_at", - "type": "datetime", - "default": "" + "name": "disclaimer", + "type": "str", + "line": 145 } ], - "line": 81, - "doc": "" + "line": 136 }, { - "name": "VendorSyncRunRecord", + "name": "FlaggedAnswerReview", "bases": [], "fields": [ { "name": "id", "type": "str", - "default": "" + "line": 150 }, { - "name": "source_id", + "name": "zone_code", "type": "str", - "default": "" + "line": 151 }, { - "name": "status", + "name": "question_text", "type": "str", - "default": "" + "line": 152 }, { - "name": "records_discovered", - "type": "int", - "default": "" + "name": "original_answer", + "type": "str", + "line": 153 }, { - "name": "records_succeeded", - "type": "int", - "default": "" + "name": "flag_reason", + "type": "str", + "line": 154 }, { - "name": "records_failed", - "type": "int", - "default": "" + "name": "citations", + "type": "tuple[str, ...]", + "line": 155 }, { - "name": "retries_attempted", - "type": "int", - "default": "" + "name": "status", + "type": "str", + "line": 156 }, { - "name": "error_summary", + "name": "improved_answer", "type": "str | None", - "default": "" + "line": 157 }, { - "name": "started_at", + "name": "improvement_notes", + "type": "str | None", + "line": 158 + }, + { + "name": "reviewed_by", + "type": "str | None", + "line": 159 + }, + { + "name": "created_by", + "type": "str", + "line": 160 + }, + { + "name": "created_at", "type": "datetime", - "default": "" + "line": 161 }, { - "name": "finished_at", + "name": "updated_at", "type": "datetime", - "default": "" + "line": 162 + }, + { + "name": "visibility", + "type": "str", + "line": 163 } ], - "line": 140, - "doc": "" + "line": 149 } ], "configuration": [] + } + ] + }, + "planning": { + "repository": "townlight/plan", + "repository_head": "8dc9e455a5f4bb916b66d65da820914cfab42af1", + "working_tree_modified": true, + "principal_import": "townlight_planning", + "source": [ + { + "source": "townlight_planning/__init__.py", + "sha256": "e435f903a2e808bb3d38271366e0a2bad2d7333e20d4cb69839f5a4891fe8af6", + "bytes": 65, + "routes": [], + "models": [], + "configuration": [] }, { - "source": "installed-owned-source/civicclerk/worker.py", - "sha256": "6e0aa475591252a06401a613e85d402c8981bdaaf23b460f30b442efbdd43a9b", + "source": "townlight_planning/connections.py", + "sha256": "649c8474e787fca1e30a11f153d2f776283204b5dc8053b7e88fbc325cdcf944", + "bytes": 2293, "routes": [], "models": [], - "configuration": [ - { - "variable": "CIVICCLERK_REDIS_URL", - "default": "'redis://redis:6379/0'", - "line": 46 - } - ] - } - ], - "bridge": [ + "configuration": [] + }, { - "source": "installed-owned-source/civicsuite_runtime/meetings_bridge.py", - "sha256": "37ea43e633b55e9428e928143e5da0d41a7a5906673b8cc54b40fa4d1748fa52", - "routes": [ - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/stages", - "router": "router", - "prefix_resolved": true, - "name": "record_meeting_stage", - "signature": "meeting_id: UUID, data: MeetingStageInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 106, - "doc": "", - "decorator": "router.post('/meetings/{meeting_id}/stages')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings", - "router": "router", - "prefix_resolved": true, - "name": "create_meeting", - "signature": "data: MeetingInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 128, - "doc": "", - "decorator": "router.post('/meetings', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/meetings/meetings/{meeting_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_meeting", - "signature": "meeting_id: UUID, actor_id: str=Depends(actor)", - "returns": "", - "line": 136, - "doc": "", - "decorator": "router.get('/meetings/{meeting_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/agenda-items", - "router": "router", - "prefix_resolved": true, - "name": "create_agenda_item", - "signature": "data: AgendaInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 141, - "doc": "", - "decorator": "router.post('/agenda-items', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/meetings/agenda-items/{item_id}", - "router": "router", - "prefix_resolved": true, - "name": "get_agenda_item", - "signature": "item_id: UUID, actor_id: str=Depends(actor)", - "returns": "", - "line": 148, - "doc": "", - "decorator": "router.get('/agenda-items/{item_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/agenda-items/{item_id}/reviews", - "router": "router", - "prefix_resolved": true, - "name": "record_agenda_review", - "signature": "item_id: UUID, data: AgendaReviewInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 164, - "doc": "", - "decorator": "router.post('/agenda-items/{item_id}/reviews')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/agenda-items/{item_id}/meeting", - "router": "router", - "prefix_resolved": true, - "name": "assign_agenda", - "signature": "item_id: UUID, data: AgendaAssignment, actor_id: str=Depends(actor)", - "returns": "", - "line": 170, - "doc": "", - "decorator": "router.post('/agenda-items/{item_id}/meeting')", - "errors": [ - "HTTPException(409, str(error))" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/meetings/notices/{notice_id}/template", - "router": "router", - "prefix_resolved": true, - "name": "notice_template", - "signature": "notice_id: UUID, actor_id: str=Depends(actor)", - "returns": "", - "line": 249, - "doc": "", - "decorator": "router.get('/notices/{notice_id}/template')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/notices/{notice_id}/document", - "router": "router", - "prefix_resolved": true, - "name": "notice_document", - "signature": "notice_id: UUID, data: NoticeDocumentInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 264, - "doc": "", - "decorator": "router.post('/notices/{notice_id}/document')", - "errors": [ - "HTTPException(404, 'Notice not found.')", - "HTTPException(422, 'Notice delivery not confirmed; existing documents were retained.')", - "HTTPException(503, 'Notice history write not confirmed; read saved work before retrying.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/notice-checks", - "router": "router", - "prefix_resolved": true, - "name": "check_notice", - "signature": "meeting_id: UUID, data: NoticeInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 278, - "doc": "", - "decorator": "router.post('/meetings/{meeting_id}/notice-checks', status_code=201)", - "errors": [ - "HTTPException(422, 'A scheduled start is needed to calculate a notice deadline.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/notices/{notice_id}/proof", - "router": "router", - "prefix_resolved": true, - "name": "record_notice_proof", - "signature": "notice_id: UUID, data: NoticeProofInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 295, - "doc": "", - "decorator": "router.post('/notices/{notice_id}/proof')", - "errors": [ - "HTTPException(422, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/transcripts", - "router": "router", - "prefix_resolved": true, - "name": "capture_transcript", - "signature": "meeting_id: UUID, data: TranscriptInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 332, - "doc": "", - "decorator": "router.post('/meetings/{meeting_id}/transcripts', status_code=201)", - "errors": [ - "HTTPException(422, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/action-items", - "router": "router", - "prefix_resolved": true, - "name": "capture_action_item", - "signature": "meeting_id: UUID, data: ActionItemInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 344, - "doc": "", - "decorator": "router.post('/meetings/{meeting_id}/action-items', status_code=201)", - "errors": [ - "HTTPException(422, 'Motion belongs to another meeting.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/archive", - "router": "router", - "prefix_resolved": true, - "name": "archive_meeting", - "signature": "meeting_id: UUID, data: ArchiveInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 356, - "doc": "", - "decorator": "router.post('/meetings/{meeting_id}/archive', status_code=201)", - "errors": [ - "HTTPException(422, 'Packet belongs to another meeting.')", - "HTTPException(422, 'Minutes belong to another meeting.')" - ] - }, - { - "method": "GET", - "path": "/public/meetings", - "router": "public_router", - "prefix_resolved": true, - "name": "public_archive_index", - "signature": "q: str=''", - "returns": "", - "line": 399, - "doc": "", - "decorator": "public_router.get('', response_class=HTMLResponse, dependencies=[Depends(public_active)])", - "errors": [] - }, - { - "method": "GET", - "path": "/public/meetings/{record_id}", - "router": "public_router", - "prefix_resolved": true, - "name": "public_archive_detail", - "signature": "record_id: UUID", - "returns": "", - "line": 407, - "doc": "", - "decorator": "public_router.get('/{record_id}', response_class=HTMLResponse, dependencies=[Depends(public_active)])", - "errors": [] - }, - { - "method": "GET", - "path": "/public/meetings/{record_id}/{kind}.txt", - "router": "public_router", - "prefix_resolved": true, - "name": "public_archive_download", - "signature": "record_id: UUID, kind: Literal['agenda', 'packet', 'minutes']", - "returns": "", - "line": 417, - "doc": "", - "decorator": "public_router.get('/{record_id}/{kind}.txt', dependencies=[Depends(public_active)])", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots", - "router": "router", - "prefix_resolved": true, - "name": "capture_packet", - "signature": "meeting_id: UUID, data: PacketInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 441, - "doc": "", - "decorator": "router.post('/meetings/{meeting_id}/packet-snapshots', status_code=201)", - "errors": [ - "HTTPException(422, str(error))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/packets/{packet_id}/deliver", - "router": "router", - "prefix_resolved": true, - "name": "export_packet", - "signature": "packet_id: UUID, actor_id: str=Depends(actor)", - "returns": "", - "line": 462, - "doc": "", - "decorator": "router.post('/packets/{packet_id}/deliver')", - "errors": [ - "HTTPException(404, 'Packet not found.')", - "HTTPException(422, str(error))", - "HTTPException(503, 'Packet delivery not confirmed. Inspect saved work before retrying.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/minutes/{draft_id}/decisions", - "router": "router", - "prefix_resolved": true, - "name": "decide_minutes", - "signature": "draft_id: UUID, data: MinutesDecision, actor_id: str=Depends(actor)", - "returns": "", - "line": 475, - "doc": "", - "decorator": "router.post('/minutes/{draft_id}/decisions')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/motions", - "router": "router", - "prefix_resolved": true, - "name": "capture_motion", - "signature": "meeting_id: UUID, data: MotionInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 498, - "doc": "", - "decorator": "router.post('/meetings/{meeting_id}/motions', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/motions/{motion_id}/corrections", - "router": "router", - "prefix_resolved": true, - "name": "correct_motion", - "signature": "motion_id: UUID, data: MotionCorrection, actor_id: str=Depends(actor)", - "returns": "", - "line": 505, - "doc": "", - "decorator": "router.post('/motions/{motion_id}/corrections', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/motions/{motion_id}/votes", - "router": "router", - "prefix_resolved": true, - "name": "capture_vote", - "signature": "motion_id: UUID, data: VoteInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 511, - "doc": "", - "decorator": "router.post('/motions/{motion_id}/votes', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/votes/{vote_id}/corrections", - "router": "router", - "prefix_resolved": true, - "name": "correct_vote", - "signature": "vote_id: UUID, data: VoteCorrection, actor_id: str=Depends(actor)", - "returns": "", - "line": 517, - "doc": "", - "decorator": "router.post('/votes/{vote_id}/corrections', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts", - "router": "router", - "prefix_resolved": true, - "name": "create_minutes", - "signature": "meeting_id: UUID, data: DraftInput, actor_id: str=Depends(actor)", - "returns": "", - "line": 523, - "doc": "", - "decorator": "router.post('/meetings/{meeting_id}/minutes/drafts', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/meetings/meetings/{meeting_id}/proceedings", - "router": "router", - "prefix_resolved": true, - "name": "proceedings", - "signature": "meeting_id: UUID, actor_id: str=Depends(actor)", - "returns": "", - "line": 532, - "doc": "", - "decorator": "router.get('/meetings/{meeting_id}/proceedings')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/meetings/station/catalog", - "router": "router", - "prefix_resolved": true, - "name": "station_catalog", - "signature": "actor_id: str=Depends(actor)", - "returns": "", - "line": 552, - "doc": "Authorized name-based operator selection from canonical Meetings data.", - "decorator": "router.get('/station/catalog')", - "errors": [] - } - ], + "source": "townlight_planning/consistency.py", + "sha256": "6bfcecb82ae9ebdceb7760c10eb9ae00b5d6895474cb4dc636b8bc0e448e4aaf", + "bytes": 1759, + "routes": [], "models": [ { - "name": "MeetingInput", - "bases": [ - "BaseModel" - ], + "name": "ConsistencyCheck", + "bases": [], "fields": [ { - "name": "title", + "name": "policy_id", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 12 }, { - "name": "scheduled_start", - "type": "AwareDatetime", - "default": "" + "name": "status", + "type": "str", + "line": 13 }, { - "name": "location", + "name": "factors", + "type": "tuple[str, ...]", + "line": 14 + }, + { + "name": "staff_next_step", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 15 }, { - "name": "meeting_type", - "type": "Literal['regular', 'special', 'emergency', 'closed_session', 'executive']", - "default": "'regular'" + "name": "disclaimer", + "type": "str", + "line": 16 } ], - "line": 83, - "doc": "" - }, + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/integration_mocks.py", + "sha256": "f70c0cc39c08cd7e5044c67e39e735fea4857313a6f8eae9f8d1cf838523215f", + "bytes": 5350, + "routes": [], + "models": [ { - "name": "AgendaInput", - "bases": [ - "BaseModel" - ], + "name": "IntegrationError", + "bases": [], "fields": [ { - "name": "title", + "name": "provider", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 19 }, { - "name": "department_name", + "name": "message", + "type": "str", + "line": 20 + }, + { + "name": "fix", + "type": "str", + "line": 21 + }, + { + "name": "code", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 22 } ], - "line": 91, - "doc": "" + "line": 18 }, { - "name": "MeetingStageInput", - "bases": [ - "BaseModel" - ], + "name": "IntegrationResult", + "bases": [], "fields": [ { - "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']", - "default": "" + "name": "provider", + "type": "str", + "line": 27 }, { - "name": "statutory_basis", - "type": "str | None", - "default": "None" + "name": "records", + "type": "tuple[dict[str, Any], ...]", + "line": 28 + }, + { + "name": "source", + "type": "str", + "line": 29 + }, + { + "name": "warnings", + "type": "tuple[str, ...]", + "line": 30 } ], - "line": 97, - "doc": "" + "line": 26 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/main.py", + "sha256": "f1132f0cd9b3b169a835565f146a8575b918687ff95650ba87ac917daa462c6d", + "bytes": 25178, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 130 }, { - "name": "AgendaReviewInput", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "to_status", - "type": "Literal['DRAFTED', 'SUBMITTED', 'DEPT_APPROVED', 'LEGAL_REVIEWED', 'CLERK_ACCEPTED', 'ON_AGENDA', 'IN_PACKET', 'POSTED', 'HEARD', 'DISPOSED', 'ARCHIVED']", - "default": "" - } - ], - "line": 152, - "doc": "" + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 148 }, { - "name": "AgendaAssignment", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "meeting_id", - "type": "UUID", - "default": "" - } - ], - "line": 158, - "doc": "" + "method": "GET", + "declared_path": "/townlight_planning", + "function": "public_townlight_planning_page", + "line": 194 }, { - "name": "MotionInput", + "method": "GET", + "declared_path": "/api/v1/townlight_planning/public/plan-explore", + "function": "public_plan_explore", + "line": 221 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_planning/public/policy/{revision_id}/{policy_id}", + "function": "public_policy_citation", + "line": 238 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/policies/lookup", + "function": "policy_lookup", + "line": 257 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/policies/ingest", + "function": "ingest_policy", + "line": 271 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_planning/plans/navigator", + "function": "plans_navigator", + "line": 284 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/questions/answer", + "function": "plan_question_answer", + "line": 293 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/plans/synthesis", + "function": "plan_synthesis", + "line": 307 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/context/townlight_meetings", + "function": "townlight_meetings_context", + "line": 315 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/integrations/mock", + "function": "integration_mock", + "line": 329 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/context/zoning", + "function": "zoning_policy_context", + "line": 350 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/consistency/check", + "function": "consistency_check", + "line": 379 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/staff-analysis/draft", + "function": "staff_analysis", + "line": 393 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_planning/staff-analysis/{analysis_id}", + "function": "get_staff_analysis", + "line": 420 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_planning/export", + "function": "policy_export", + "line": 452 + } + ], + "models": [ + { + "name": "PolicyLookupRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "text", + "name": "topic", "type": "str", - "default": "Field(min_length=1)" + "line": 66 }, { - "name": "seconded_by", - "type": "str | None", - "default": "Field(default=None, min_length=1)" + "name": "plan_type", + "type": "str", + "line": 67 } ], - "line": 178, - "doc": "" + "line": 65 }, { - "name": "MotionCorrection", + "name": "ZoningPolicyContextRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "text", + "name": "topic", "type": "str", - "default": "Field(min_length=1)" + "line": 71 }, { - "name": "reason", - "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 184, - "doc": "" - }, - { - "name": "VoteInput", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "zone_code", + "type": "str | None", + "line": 72 + }, + { + "name": "use", + "type": "str | None", + "line": 73 + }, + { + "name": "parcel_number", + "type": "str | None", + "line": 74 + }, + { + "name": "address", + "type": "str | None", + "line": 75 + }, { - "name": "voter_name", + "name": "plan_type", "type": "str", - "default": "Field(min_length=1)" + "line": 76 }, { - "name": "vote", - "type": "str", - "default": "Field(min_length=1)" + "name": "townlight_zoning_context_id", + "type": "str | None", + "line": 77 } ], - "line": 190, - "doc": "" + "line": 70 }, { - "name": "VoteCorrection", + "name": "ConsistencyRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "vote", + "name": "proposal", "type": "str", - "default": "Field(min_length=1)" + "line": 81 }, { - "name": "reason", + "name": "policy_id", "type": "str", - "default": "Field(min_length=1)" + "line": 82 } ], - "line": 196, - "doc": "" + "line": 80 }, { - "name": "SourceInput", + "name": "StaffAnalysisRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "source_id", + "name": "project_name", "type": "str", - "default": "Field(min_length=1)" + "line": 86 }, { - "name": "label", + "name": "proposal", "type": "str", - "default": "Field(min_length=1)" + "line": 87 }, { - "name": "text", + "name": "policy_id", "type": "str", - "default": "Field(min_length=1)" + "line": 88 } ], - "line": 202, - "doc": "" + "line": 85 }, { - "name": "SentenceInput", + "name": "PolicyExportRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "text", + "name": "title", "type": "str", - "default": "Field(min_length=1)" + "line": 92 }, { - "name": "citations", - "type": "list[str]", - "default": "Field(default_factory=list)" - } - ], - "line": 209, - "doc": "" - }, - { - "name": "DraftInput", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "policy_id", + "type": "str", + "line": 93 + }, { - "name": "source_materials", - "type": "list[SourceInput]", - "default": "Field(default_factory=list)" + "name": "format", + "type": "str", + "line": 94 }, { - "name": "sentences", - "type": "list[SentenceInput]", - "default": "Field(min_length=1)" + "name": "snapshot_id", + "type": "str | None", + "line": 95 } ], - "line": 215, - "doc": "" + "line": 91 }, { - "name": "MinutesDecision", + "name": "PolicyIngestRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "action", - "type": "Literal['post', 'adopt', 'sign']", - "default": "" + "name": "topic_key", + "type": "str", + "line": 99 }, { - "name": "note", + "name": "policy_id", "type": "str", - "default": "''" - } - ], - "line": 221, - "doc": "" - }, - { - "name": "NoticeInput", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "notice_type", - "type": "Literal['regular', 'special', 'emergency', 'closed_session', 'executive']", - "default": "" + "line": 100 }, { - "name": "posted_at", - "type": "AwareDatetime", - "default": "" + "name": "plan_type", + "type": "str", + "line": 101 }, { - "name": "minimum_notice_hours", - "type": "int", - "default": "Field(ge=0)" + "name": "title", + "type": "str", + "line": 102 }, { - "name": "statutory_basis", - "type": "str | None", - "default": "None" + "name": "citation", + "type": "str", + "line": 103 }, { - "name": "approved_by", - "type": "str | None", - "default": "None" - } - ], - "line": 227, - "doc": "" - }, - { - "name": "NoticeProofInput", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "location", + "name": "excerpt", "type": "str", - "default": "Field(min_length=1)" + "line": 104 }, { - "name": "note", + "name": "relevance", "type": "str", - "default": "''" + "line": 105 }, { - "name": "document_delivery_id", - "type": "str | None", - "default": "None" - } - ], - "line": 236, - "doc": "" - }, - { - "name": "NoticeDocumentInput", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "text", + "name": "adoption_status", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 243, - "doc": "" - }, - { - "name": "PacketInput", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "agenda_item_ids", - "type": "list[UUID]", - "default": "" + "line": 106 }, { - "name": "source_files", - "type": "list['ManagedSource']", - "default": "Field(default_factory=list)" + "name": "source_document", + "type": "str", + "line": 107 } ], - "line": 303, - "doc": "" + "line": 98 }, { - "name": "TranscriptInput", + "name": "PlanQuestionRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "source_label", + "name": "question", "type": "str", - "default": "Field(min_length=1)" + "line": 111 }, { - "name": "transcript_text", + "name": "plan_type", "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "correction_of_id", - "type": "UUID | None", - "default": "None" + "line": 112 } ], - "line": 309, - "doc": "" + "line": 110 }, { - "name": "ActionItemInput", + "name": "PlanSynthesisRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "description", + "name": "topic", "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "assigned_to", - "type": "str | None", - "default": "None" - }, - { - "name": "source_motion_id", - "type": "UUID | None", - "default": "None" + "line": 116 } ], - "line": 316, - "doc": "" + "line": 115 }, { - "name": "ArchiveInput", + "name": "TownlightMeetingsContextRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "visibility", - "type": "Literal['public', 'closed_session']", - "default": "" - }, - { - "name": "packet_id", - "type": "UUID | None", - "default": "None" - }, - { - "name": "minutes_id", - "type": "UUID | None", - "default": "None" + "name": "agenda_item", + "type": "str", + "line": 120 }, { - "name": "plain_language_summary", + "name": "topic", "type": "str", - "default": "''" + "line": 121 } ], - "line": 323, - "doc": "" + "line": 119 }, { - "name": "ManagedSource", + "name": "IntegrationMockRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "original_path", - "type": "str", - "default": "" - }, - { - "name": "stored_path", - "type": "str", - "default": "" - }, - { - "name": "file_name", - "type": "str", - "default": "" - }, - { - "name": "sha256", + "name": "provider", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 125 }, { - "name": "size_bytes", - "type": "int", - "default": "Field(ge=0)" + "name": "payload", + "type": "dict[str, object]", + "line": 126 } ], - "line": 424, - "doc": "" + "line": 124 } ], "configuration": [ { - "variable": "DATABASE_URL", - "default": "''", - "line": 38 + "environment": "TOWNLIGHT_PLANNING_POLICY_DB_URL", + "line": 470 }, { - "variable": "TOWNLIGHT_PROFILE_ROOT", - "default": "", - "line": 434 + "environment": "TOWNLIGHT_PLANNING_DEMO_MODE", + "line": 497 } ] - } - ] - }, - "code": { - "package": "civiccode", - "source": [ + }, { - "source": "installed-owned-source/civiccode/__init__.py", - "sha256": "22abb4eaa2a94737461591a5b6f494bf7c4ad481b476fc3cf020fa090c97bcd8", + "source": "townlight_planning/migrations/__init__.py", + "sha256": "d633520d0fcec8ca93f8f5dc22e206cc65ea5c646a8a61e89eb6614d51008986", + "bytes": 2183, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccode/ai_answer.py", - "sha256": "0d82f0c105e1b8102e0b640b97de85f95f79695cc6903008d56245ed79e6568d", + "source": "townlight_planning/migrations/__main__.py", + "sha256": "dc61223a3923f9e2b085e0dab9e033dcf799f99b08f4c808638824e0d303d13b", + "bytes": 647, "routes": [], - "models": [ - { - "name": "LocalLLMConfig", - "bases": [], - "fields": [ - { - "name": "provider", - "type": "str", - "default": "" - }, - { - "name": "base_url", - "type": "str", - "default": "" - }, - { - "name": "model", - "type": "str", - "default": "" - }, - { - "name": "timeout_seconds", - "type": "float", - "default": "" - } - ], - "line": 18, - "doc": "" - } - ], + "models": [], "configuration": [ { - "variable": "CIVICCODE_OLLAMA_URL", - "default": "''", - "line": 28 - }, - { - "variable": "CIVICCODE_OLLAMA_TIMEOUT_SECONDS", - "default": "'20'", - "line": 35 - }, - { - "variable": "CIVICCODE_AI_MODE", - "default": "''", - "line": 27 - }, - { - "variable": "CIVICCODE_OLLAMA_MODEL", - "default": "'gemma4:e4b'", - "line": 34 + "environment": "TOWNLIGHT_PLANNING_POLICY_DB_URL", + "line": 7 } ] }, { - "source": "installed-owned-source/civiccode/citation_contract.py", - "sha256": "58e2cc3b8e05987a801a94c174ad34a8a7af18f684d367b08f097ab420ff3e37", + "source": "townlight_planning/migrations/env.py", + "sha256": "c1dcc827b65af850e94f41ac02aec0528ad0abaf5b0d6a22e5773df2ceadaafc", + "bytes": 442, "routes": [], - "models": [ - { - "name": "CitationRefusal", - "bases": [], - "fields": [ - { - "name": "reason", - "type": "str", - "default": "" - }, - { - "name": "fix", - "type": "str", - "default": "" - }, - { - "name": "refusal_type", - "type": "str", - "default": "" - } - ], - "line": 10, - "doc": "Structured refusal object for unsafe citation requests." - } - ], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/migrations/versions/townlight_planning_0001_sources.py", + "sha256": "0552047ca4ca0eee1eaf5878f3f8f759e188da8d371a377efc93df9867ac2601", + "bytes": 1608, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/migrations/versions/townlight_planning_0002_workflows.py", + "sha256": "eba85cad351b499cd7456e68305309d92cb4c3087e355417df5259458d9c3f4f", + "bytes": 1093, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/migrations/versions/townlight_planning_0003_municipal.py", + "sha256": "c66314f036cb2c96263eafece836760e1fb0c31b96578238c5c900cdd5477417", + "bytes": 1200, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/migrations/versions/townlight_planning_0004_neighborhoods.py", + "sha256": "5db83c05d550ab4f9f0a414c6f139fa454bdc03ae1c7963e55290ecbc8fd644a", + "bytes": 853, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccode/codifier_sync.py", - "sha256": "9c8b9635a2534eaccd3f80cc0b2a9b5c4751830a9d99796bb125e773778bd57f", + "source": "townlight_planning/municipal.py", + "sha256": "97e153119e296d9529f3c6b4e51d40be446fb3fed12a41c301b0fc3aa70b4e10", + "bytes": 12736, "routes": [], "models": [ { - "name": "CodifierDeltaPlan", - "bases": [], + "name": "Measurement", + "bases": [ + "BundleModel" + ], "fields": [ { - "name": "connector", - "type": "str", - "default": "" + "name": "recorded_on", + "type": "date", + "line": 42 }, { - "name": "request_url", - "type": "str", - "default": "" + "name": "value", + "type": "Decimal", + "line": 43 }, { - "name": "delta_enabled", - "type": "bool", - "default": "" - }, + "name": "evidence", + "type": "str", + "line": 44 + } + ], + "line": 41 + }, + { + "name": "Milestone", + "bases": [ + "BundleModel" + ], + "fields": [ { - "name": "cursor_param", - "type": "str | None", - "default": "" + "name": "title", + "type": "str", + "line": 54 }, { - "name": "cursor_value", - "type": "str | None", - "default": "" + "name": "due_on", + "type": "date", + "line": 55 }, { - "name": "message", - "type": "str", - "default": "" + "name": "completed_on", + "type": "date | None", + "line": 56 }, { - "name": "fix", + "name": "evidence", "type": "str", - "default": "" + "line": 57 } ], - "line": 56, - "doc": "Operator-visible planned codifier request." + "line": 53 }, { - "name": "CodifierSyncSource", - "bases": [], + "name": "InitiativeInput", + "bases": [ + "BundleModel" + ], "fields": [ { - "name": "source_id", - "type": "str", - "default": "" + "name": "expected_revision", + "type": "str | None", + "line": 67 }, { - "name": "connector", + "name": "title", "type": "str", - "default": "" + "line": 68 }, { - "name": "source_name", - "type": "str", - "default": "" + "name": "policy", + "type": "PolicySelection", + "line": 69 }, { - "name": "source_url", + "name": "responsible_staff", "type": "str", - "default": "" + "line": 70 }, { - "name": "sync_schedule", + "name": "target", + "type": "Decimal", + "line": 71 + }, + { + "name": "unit", "type": "str", - "default": "" + "line": 72 }, { - "name": "allowlisted_hosts", - "type": "tuple[str, ...]", - "default": "()" + "name": "due_on", + "type": "date", + "line": 73 }, { - "name": "last_successful_sync_at", - "type": "datetime | None", - "default": "None" + "name": "status", + "type": "Literal['planned', 'active', 'completed', 'cancelled']", + "line": 74 }, { - "name": "last_attempted_sync_at", - "type": "datetime | None", - "default": "None" + "name": "milestones", + "type": "list[Milestone]", + "line": 75 }, { - "name": "last_import_job_id", + "name": "measurements", + "type": "list[Measurement]", + "line": 76 + }, + { + "name": "note", + "type": "str", + "line": 77 + } + ], + "line": 66 + }, + { + "name": "AmendmentInput", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "expected_revision", "type": "str | None", - "default": "None" + "line": 91 }, { - "name": "next_sync_at_recorded", - "type": "datetime | None", - "default": "None" + "name": "title", + "type": "str", + "line": 92 }, { - "name": "host_validation", - "type": "dict[str, Any]", - "default": "field(default_factory=dict)" + "name": "policy", + "type": "PolicySelection", + "line": 93 }, { - "name": "delta_plan_history", - "type": "list[dict[str, Any]]", - "default": "field(default_factory=list)" + "name": "proposal", + "type": "str", + "line": 94 }, { - "name": "state", - "type": "SyncCircuitState", - "default": "field(default_factory=lambda: SyncCircuitState(connector='codifier'))" - } - ], - "line": 80, - "doc": "Configured codifier sync source backed by a registered CivicCode source." - }, - { - "name": "CodifierSyncRun", - "bases": [], - "fields": [ + "name": "responsible_staff", + "type": "str", + "line": 95 + }, { - "name": "source", - "type": "CodifierSyncSource", - "default": "" + "name": "status", + "type": "Literal['draft', 'review', 'adopted', 'withdrawn']", + "line": 96 }, { - "name": "job_payload", - "type": "dict[str, Any]", - "default": "" + "name": "review_note", + "type": "str", + "line": 97 }, { - "name": "delta_plan", - "type": "CodifierDeltaPlan", - "default": "" + "name": "adoption_revision", + "type": "str | None", + "line": 98 + }, + { + "name": "note", + "type": "str", + "line": 99 } ], - "line": 103, - "doc": "Result of one local codifier sync run." + "line": 90 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/municipal_api.py", + "sha256": "8b6b99a44b2a2b186f1e2c6c0c09a4815c8aa7184f60993aab6e45ffbc2fa5bd", + "bytes": 2323, + "routes": [ + { + "method": "POST", + "declared_path": "/initiatives", + "function": "create_initiative", + "line": 17 + }, + { + "method": "POST", + "declared_path": "/initiatives/{item_id}/revisions", + "function": "update_initiative", + "line": 22 + }, + { + "method": "POST", + "declared_path": "/amendments", + "function": "create_amendment", + "line": 29 + }, + { + "method": "POST", + "declared_path": "/amendments/{item_id}/revisions", + "function": "update_amendment", + "line": 34 + }, + { + "method": "GET", + "declared_path": "/municipal-work/{item_id}/history", + "function": "history", + "line": 41 + }, + { + "method": "GET", + "declared_path": "/progress/targets", + "function": "progress", + "line": 49 + }, + { + "method": "GET", + "declared_path": "/amendments/history", + "function": "amendments", + "line": 60 } ], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccode/import_connectors.py", - "sha256": "bf4013448af2bd851642baefdbd1abcd212dd7b5b3c0e91d5811414c85e792f0", + "source": "townlight_planning/persistence.py", + "sha256": "3a19584080cbb99c2a3bccd9673fe57d0abf20ecae8ad541cabccb42bccc9465", + "bytes": 10309, "routes": [], "models": [ { - "name": "ImportJob", + "name": "StoredStaffAnalysis", "bases": [], "fields": [ { - "name": "job_id", + "name": "analysis_id", "type": "str", - "default": "" + "line": 52 }, { - "name": "connector_type", + "name": "project_name", "type": "str", - "default": "" + "line": 53 }, { - "name": "actor", + "name": "proposal", "type": "str", - "default": "" + "line": 54 }, { - "name": "status", + "name": "policy_id", "type": "str", - "default": "'pending'" + "line": 55 }, { - "name": "retry_of", - "type": "str | None", - "default": "None" + "name": "heading", + "type": "str", + "line": 56 }, { - "name": "counts", - "type": "dict[str, int]", - "default": "field(default_factory=dict)" + "name": "bullets", + "type": "tuple[str, ...]", + "line": 57 }, { - "name": "provenance", - "type": "dict[str, Any]", - "default": "field(default_factory=dict)" + "name": "citations", + "type": "tuple[str, ...]", + "line": 58 }, { - "name": "failure", - "type": "dict[str, str] | None", - "default": "None" + "name": "review_required", + "type": "bool", + "line": 59 }, { - "name": "source_id", - "type": "str | None", - "default": "None" + "name": "disclaimer", + "type": "str", + "line": 60 }, { "name": "created_at", "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" - }, - { - "name": "completed_at", - "type": "datetime | None", - "default": "None" + "line": 61 } ], - "line": 54, - "doc": "Auditable local import job record." + "line": 51 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccode/main.py", - "sha256": "930e05298b82f10ec0338040770d8af83aa56a9d43016908931ab8f796e63f48", - "routes": [ - { - "method": "GET", - "path": "/", - "router": "app", - "prefix_resolved": true, - "name": "root", - "signature": "", - "returns": "dict[str, str]", - "line": 786, - "doc": "Describe the current shipped runtime boundary.", - "decorator": "app.get('/')", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode", - "router": "app", - "prefix_resolved": true, - "name": "public_lookup_home", - "signature": "", - "returns": "str", - "line": 834, - "doc": "Render the resident-facing public code lookup home page.", - "decorator": "app.get('/civiccode', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/app", - "router": "app", - "prefix_resolved": true, - "name": "civiccode_frontend_app", - "signature": "", - "returns": "Response", - "line": 845, - "doc": "Serve the React/Vite CivicCode frontend when built.", - "decorator": "app.get('/civiccode/app')", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/app/", - "router": "app", - "prefix_resolved": true, - "name": "civiccode_frontend_app", - "signature": "", - "returns": "Response", - "line": 845, - "doc": "Serve the React/Vite CivicCode frontend when built.", - "decorator": "app.get('/civiccode/app/')", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/search", - "router": "app", - "prefix_resolved": true, - "name": "public_lookup_search", - "signature": "q: str=''", - "returns": "str", - "line": 858, - "doc": "Render public search results, empty states, or refusal states.", - "decorator": "app.get('/civiccode/search', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/answer", - "router": "app", - "prefix_resolved": true, - "name": "public_lookup_answer", - "signature": "q: str='', section_number: str | None=None, as_of: date | None=None", - "returns": "str", - "line": 878, - "doc": "Render a resident-facing cited answer for one adopted section.", - "decorator": "app.get('/civiccode/answer', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/sections/{section_ref}", - "router": "app", - "prefix_resolved": true, - "name": "public_section_detail", - "signature": "section_ref: str, as_of: date | None=None", - "returns": "str", - "line": 901, - "doc": "Render a public section detail page with citation and warning context.", - "decorator": "app.get('/civiccode/sections/{section_ref}', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/sections/{section_ref}/export", - "router": "app", - "prefix_resolved": true, - "name": "public_section_export", - "signature": "section_ref: str, as_of: date | None=None", - "returns": "str", - "line": 937, - "doc": "Render an accessible records-ready export page for a section.", - "decorator": "app.get('/civiccode/sections/{section_ref}/export', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/staff/sources", - "router": "app", - "prefix_resolved": true, - "name": "staff_source_workspace", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "HTMLResponse", - "line": 953, - "doc": "Render the staff source registry workspace.", - "decorator": "app.get('/staff/sources', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/staff/code", - "router": "app", - "prefix_resolved": true, - "name": "staff_code_workspace", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "HTMLResponse", - "line": 970, - "doc": "Render the staff code lifecycle workspace.", - "decorator": "app.get('/staff/code', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/staff/sync", - "router": "app", - "prefix_resolved": true, - "name": "staff_sync_workspace", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "HTMLResponse", - "line": 983, - "doc": "Render the staff codifier sync health workspace.", - "decorator": "app.get('/staff/sync', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/staff/imports", - "router": "app", - "prefix_resolved": true, - "name": "staff_import_ledger", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "HTMLResponse", - "line": 1000, - "doc": "Render the staff import job and provenance ledger.", - "decorator": "app.get('/staff/imports', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "health", - "signature": "", - "returns": "dict[str, str]", - "line": 1013, - "doc": "Provide a simple operational health check for IT staff.", - "decorator": "app.get('/health')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/operational-state", - "router": "app", - "prefix_resolved": true, - "name": "get_staff_operational_state", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1024, - "doc": "Return current operational readiness state for staff operators.", - "decorator": "app.get('/api/v1/civiccode/staff/operational-state')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sources/catalog", - "router": "app", - "prefix_resolved": true, - "name": "source_registry_catalog", - "signature": "", - "returns": "dict[str, Any]", - "line": 1036, - "doc": "Expose allowed source registry vocabulary for staff integration clients.", - "decorator": "app.get('/api/v1/civiccode/sources/catalog')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/sources", - "router": "app", - "prefix_resolved": true, - "name": "create_source", - "signature": "request: SourceCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1050, - "doc": "Register a municipal code source without importing its contents yet.", - "decorator": "app.post('/api/v1/civiccode/sources', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sources", - "router": "app", - "prefix_resolved": true, - "name": "list_public_sources", - "signature": "", - "returns": "dict[str, Any]", - "line": 1068, - "doc": "List public-visible sources without exposing staff-only notes.", - "decorator": "app.get('/api/v1/civiccode/sources')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sources/{source_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_public_source", - "signature": "source_id: str", - "returns": "dict[str, Any]", - "line": 1079, - "doc": "Read a public source record without leaking staff-only notes.", - "decorator": "app.get('/api/v1/civiccode/sources/{source_id}')", - "errors": [ - "HTTPException(status_code=404, detail={'message': f\"Source '{source_id}' is not public-visible.\", 'fix': 'Use the staff source endpoint if you are authorized to view it.'})" - ] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/sources", - "router": "app", - "prefix_resolved": true, - "name": "list_staff_sources", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1097, - "doc": "List all registered sources for staff workflows.", - "decorator": "app.get('/api/v1/civiccode/staff/sources')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/sources/{source_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_staff_source", - "signature": "source_id: str, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1112, - "doc": "Read a staff source record including staff-only notes.", - "decorator": "app.get('/api/v1/civiccode/staff/sources/{source_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/sources/{source_id}/transitions", - "router": "app", - "prefix_resolved": true, - "name": "transition_source", - "signature": "source_id: str, request: SourceTransitionRequest, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1127, - "doc": "Transition a source through the official registry lifecycle.", - "decorator": "app.post('/api/v1/civiccode/sources/{source_id}/transitions')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/titles", - "router": "app", - "prefix_resolved": true, - "name": "create_title", - "signature": "request: TitleCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1148, - "doc": "Create a municipal code title container.", - "decorator": "app.post('/api/v1/civiccode/titles', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/chapters", - "router": "app", - "prefix_resolved": true, - "name": "create_chapter", - "signature": "request: ChapterCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1163, - "doc": "Create a municipal code chapter under a title.", - "decorator": "app.post('/api/v1/civiccode/chapters', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/sections", - "router": "app", - "prefix_resolved": true, - "name": "create_section", - "signature": "request: SectionCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1178, - "doc": "Create a code section or subsection without generating answers.", - "decorator": "app.post('/api/v1/civiccode/sections', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/sections/{section_id}/versions", - "router": "app", - "prefix_resolved": true, - "name": "create_section_version", - "signature": "section_id: str, request: SectionVersionCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1193, - "doc": "Create an immutable section version for adopted, pending, or retired text.", - "decorator": "app.post('/api/v1/civiccode/sections/{section_id}/versions', status_code=201)", - "errors": [ - "HTTPException(status_code=422, detail={'message': 'Path section_id must match request body section_id.', 'fix': 'Use the same section_id in the URL and JSON body.'})", - "HTTPException(status_code=409, detail={'message': f\"Source '{source.source_id}' is {source.status} and cannot back section text.\", 'fix': 'Use an active source or refresh the source registry record first.'})", - "HTTPException(status_code=409, detail={'message': 'Adopted section versions require an active public-visible source.', 'fix': 'Activate an official source in the registry before marking text as adopted law.'})", - "HTTPException(status_code=404, detail={'message': f\"Source '{data['source_id']}' was not found for this section version.\", 'fix': 'Register the source before adding section text from it.'})" - ] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sections/lookup", - "router": "app", - "prefix_resolved": true, - "name": "lookup_section", - "signature": "section_number: str, as_of: date | None=None", - "returns": "dict[str, Any]", - "line": 1244, - "doc": "Lookup adopted section text by current flag or effective date.", - "decorator": "app.get('/api/v1/civiccode/sections/lookup')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/sections/resolve", - "router": "app", - "prefix_resolved": true, - "name": "resolve_section", - "signature": "request: SectionResolveRequest", - "returns": "dict[str, Any]", - "line": 1255, - "doc": "Resolve adopted code context for downstream CivicSuite module clients.", - "decorator": "app.post('/api/v1/civiccode/sections/resolve')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sections/{section_id}/history", - "router": "app", - "prefix_resolved": true, - "name": "section_history", - "signature": "section_id: str", - "returns": "dict[str, Any]", - "line": 1354, - "doc": "Return immutable amendment/version history for a section.", - "decorator": "app.get('/api/v1/civiccode/sections/{section_id}/history')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sections/{section_id}/permalink", - "router": "app", - "prefix_resolved": true, - "name": "section_permalink", - "signature": "section_id: str", - "returns": "dict[str, Any]", - "line": 1363, - "doc": "Return the stable public-facing permalink for a section.", - "decorator": "app.get('/api/v1/civiccode/sections/{section_id}/permalink')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/search", - "router": "app", - "prefix_resolved": true, - "name": "search_sections", - "signature": "q: str", - "returns": "dict[str, Any]", - "line": 1372, - "doc": "Search public-visible code sections and related public materials.", - "decorator": "app.get('/api/v1/civiccode/search')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/popular-questions", - "router": "app", - "prefix_resolved": true, - "name": "list_popular_questions", - "signature": "", - "returns": "dict[str, Any]", - "line": 1381, - "doc": "List staff-approved public popular questions as navigation aids.", - "decorator": "app.get('/api/v1/civiccode/popular-questions')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/popular-questions", - "router": "app", - "prefix_resolved": true, - "name": "create_popular_question", - "signature": "request: PopularQuestionCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1403, - "doc": "Create a staff-approved public popular question tied to cited adopted code.", - "decorator": "app.post('/api/v1/civiccode/staff/popular-questions', status_code=201)", - "errors": [ - "HTTPException(status_code=422, detail={'message': 'Popular questions cannot ask CivicCode for a legal determination.', 'fix': \"Rewrite the question as a navigation prompt, such as 'Where do I read the backyard chicken permit rule?'\"})", - "HTTPException(status_code=409, detail={'message': citation_payload.get('reason', 'Citation could not be built.'), 'fix': citation_payload.get('fix', 'Attach the question to cited adopted code.')})" - ] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sections/{section_number}/related", - "router": "app", - "prefix_resolved": true, - "name": "related_materials", - "signature": "section_number: str", - "returns": "dict[str, Any]", - "line": 1453, - "doc": "List explicit public related materials for one adopted section.", - "decorator": "app.get('/api/v1/civiccode/sections/{section_number}/related')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/citations/build", - "router": "app", - "prefix_resolved": true, - "name": "build_citation", - "signature": "section_number: str, as_of: date | None=None", - "returns": "dict[str, Any]", - "line": 1466, - "doc": "Build a deterministic citation object or a structured refusal.", - "decorator": "app.get('/api/v1/civiccode/citations/build')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sections/{section_ref}/export", - "router": "app", - "prefix_resolved": true, - "name": "export_section", - "signature": "section_ref: str, as_of: date | None=None", - "returns": "dict[str, Any]", - "line": 1472, - "doc": "Return a records-ready section export with citation and source provenance.", - "decorator": "app.get('/api/v1/civiccode/sections/{section_ref}/export')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/questions/answer", - "router": "app", - "prefix_resolved": true, - "name": "answer_question", - "signature": "request: QuestionAnswerRequest", - "returns": "dict[str, Any]", - "line": 1478, - "doc": "Answer code questions only when an adopted section citation grounds them.", - "decorator": "app.post('/api/v1/civiccode/questions/answer')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/sections/{section_id}/notes", - "router": "app", - "prefix_resolved": true, - "name": "create_interpretation_note", - "signature": "section_id: str, request: InterpretationNoteCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1494, - "doc": "Create a staff-only interpretation note without exposing it publicly.", - "decorator": "app.post('/api/v1/civiccode/staff/sections/{section_id}/notes', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/sections/{section_id}/notes", - "router": "app", - "prefix_resolved": true, - "name": "list_interpretation_notes", - "signature": "section_id: str, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1517, - "doc": "List staff-only interpretation notes for authorized staff clients.", - "decorator": "app.get('/api/v1/civiccode/staff/sections/{section_id}/notes')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/audit-events", - "router": "app", - "prefix_resolved": true, - "name": "list_staff_audit_events", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1532, - "doc": "List staff workbench audit events for authorized staff clients.", - "decorator": "app.get('/api/v1/civiccode/staff/audit-events')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/imports/local-bundle", - "router": "app", - "prefix_resolved": true, - "name": "create_local_import_job", - "signature": "request: ImportBundleCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1548, - "doc": "Import a local codifier/file-drop fixture without outbound network calls.", - "decorator": "app.post('/api/v1/civiccode/staff/imports/local-bundle', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/imports/shared-pdf", - "router": "app", - "prefix_resolved": true, - "name": "create_shared_pdf_import_job", - "signature": "request: SharedPdfImportCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1560, - "doc": "Ingest a municipal code PDF through CivicCore, then structure it for CivicCode.", - "decorator": "app.post('/api/v1/civiccode/staff/imports/shared-pdf', status_code=201)", - "errors": [ - "HTTPException(status_code=409, detail={'message': 'Shared PDF ingestion requires a durable PostgreSQL runtime.', 'fix': 'Set CIVICCODE_SOURCE_REGISTRY_DB_URL or DATABASE_URL to the CivicCode PostgreSQL DSN.'})" - ] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/imports", - "router": "app", - "prefix_resolved": true, - "name": "list_import_jobs", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1594, - "doc": "List local import jobs and their visible success/failure states.", - "decorator": "app.get('/api/v1/civiccode/staff/imports')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/imports/{job_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_import_job", - "signature": "job_id: str, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1604, - "doc": "Read a local import job, including actionable failure details.", - "decorator": "app.get('/api/v1/civiccode/staff/imports/{job_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/imports/{job_id}/retry", - "router": "app", - "prefix_resolved": true, - "name": "retry_import_job", - "signature": "job_id: str, request: ImportBundleCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1619, - "doc": "Retry a failed import job with a corrected local bundle.", - "decorator": "app.post('/api/v1/civiccode/staff/imports/{job_id}/retry', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/imports/{job_id}/provenance", - "router": "app", - "prefix_resolved": true, - "name": "get_import_provenance", - "signature": "job_id: str, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1635, - "doc": "Return a provenance report for a local import job.", - "decorator": "app.get('/api/v1/civiccode/staff/imports/{job_id}/provenance')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/imports/{job_id}/tree", - "router": "app", - "prefix_resolved": true, - "name": "get_imported_tree", - "signature": "job_id: str, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1650, - "doc": "Show imported title/chapter/section/version tree for staff verification.", - "decorator": "app.get('/api/v1/civiccode/staff/imports/{job_id}/tree')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/sync/codifier-sources", - "router": "app", - "prefix_resolved": true, - "name": "configure_codifier_sync_source", - "signature": "request: CodifierSyncConfigureRequest, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1673, - "doc": "Enable staff-controlled codifier sync readiness for an official source.", - "decorator": "app.post('/api/v1/civiccode/staff/sync/codifier-sources', status_code=201)", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/staff/sync/codifier-sources", - "router": "app", - "prefix_resolved": true, - "name": "list_codifier_sync_sources", - "signature": "x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1694, - "doc": "List codifier sync readiness and circuit health for staff.", - "decorator": "app.get('/api/v1/civiccode/staff/sync/codifier-sources')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/sync/codifier-sources/{source_id}/run", - "router": "app", - "prefix_resolved": true, - "name": "run_codifier_sync_source", - "signature": "source_id: str, request: CodifierSyncRunRequest, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1709, - "doc": "Run one staff-controlled codifier sync using an already fetched local payload.", - "decorator": "app.post('/api/v1/civiccode/staff/sync/codifier-sources/{source_id}/run', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/civicclerk/ordinance-events", - "router": "app", - "prefix_resolved": true, - "name": "create_civicclerk_ordinance_event", - "signature": "request: CivicClerkOrdinanceEventCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None), x_civiccode_intake_auth: str | None=Header(default=None, alias=CIVICCODE_INTAKE_AUTH_HEADER), authorization: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1730, - "doc": "Receive CivicClerk ordinance/adoption events without codifying them.", - "decorator": "app.post('/api/v1/civiccode/staff/civicclerk/ordinance-events', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/civicclerk/ordinance-events/{event_id}/resolve", - "router": "app", - "prefix_resolved": true, - "name": "resolve_civicclerk_ordinance_event", - "signature": "event_id: str, request: CivicClerkOrdinanceEventResolve, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None), x_civiccode_intake_auth: str | None=Header(default=None, alias=CIVICCODE_INTAKE_AUTH_HEADER), authorization: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1756, - "doc": "Mark a CivicClerk handoff codified after staff creates the adopted code version.", - "decorator": "app.post('/api/v1/civiccode/staff/civicclerk/ordinance-events/{event_id}/resolve')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/sections/{section_id}/summaries", - "router": "app", - "prefix_resolved": true, - "name": "create_plain_language_summary", - "signature": "section_id: str, request: PlainLanguageSummaryCreate, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1806, - "doc": "Create a staff-drafted plain-language summary tied to adopted code text.", - "decorator": "app.post('/api/v1/civiccode/staff/sections/{section_id}/summaries', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/summaries/{summary_id}/approve", - "router": "app", - "prefix_resolved": true, - "name": "approve_plain_language_summary", - "signature": "summary_id: str, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1841, - "doc": "Approve a plain-language summary for public display after staff review.", - "decorator": "app.post('/api/v1/civiccode/staff/summaries/{summary_id}/approve')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiccode/sections/{section_id}/summaries", - "router": "app", - "prefix_resolved": true, - "name": "list_public_plain_language_summaries", - "signature": "section_id: str", - "returns": "dict[str, Any]", - "line": 1866, - "doc": "List public approved summaries while keeping authoritative code visible.", - "decorator": "app.get('/api/v1/civiccode/sections/{section_id}/summaries')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiccode/staff/questions/answer", - "router": "app", - "prefix_resolved": true, - "name": "answer_staff_question", - "signature": "request: QuestionAnswerRequest, x_civiccode_role: str | None=Header(default=None), x_civiccode_actor: str | None=Header(default=None)", - "returns": "dict[str, Any]", - "line": 1895, - "doc": "Answer staff questions with staff-only notes kept out of public responses.", - "decorator": "app.post('/api/v1/civiccode/staff/questions/answer')", - "errors": [] - } - ], + "source": "townlight_planning/plan_workflows.py", + "sha256": "d303125e8b39b632081b320ca96869c729c3941fd29d1e34d8daae3e35038414", + "bytes": 7954, + "routes": [], "models": [ { - "name": "SourceCreate", - "bases": [ - "BaseModel" - ], + "name": "PlanPolicyIngestRecord", + "bases": [], "fields": [ { - "name": "source_id", - "type": "str | None", - "default": "None" + "name": "topic_key", + "type": "str", + "line": 15 }, { - "name": "name", - "type": "str", - "default": "Field(min_length=1)" + "name": "policy", + "type": "PlanPolicy", + "line": 16 }, { - "name": "publisher", - "type": "str", - "default": "Field(min_length=1)" + "name": "adoption_status", + "type": "PlanStatus", + "line": 17 }, { - "name": "source_type", + "name": "source_document", + "type": "str", + "line": 18 + } + ], + "line": 14 + }, + { + "name": "PlanQuestionAnswer", + "bases": [], + "fields": [ + { + "name": "status", "type": "str", - "default": "Field(min_length=1)" + "line": 23 }, { - "name": "source_category", + "name": "answer", "type": "str", - "default": "Field(min_length=1)" + "line": 24 }, { - "name": "source_url", - "type": "str | None", - "default": "None" + "name": "citations", + "type": "tuple[str, ...]", + "line": 25 }, { - "name": "file_reference", - "type": "str | None", - "default": "None" + "name": "source_policy_ids", + "type": "tuple[str, ...]", + "line": 26 }, { - "name": "retrieved_at", - "type": "datetime | None", - "default": "None" + "name": "review_required", + "type": "bool", + "line": 27 }, { - "name": "retrieval_method", - "type": "str | None", - "default": "None" + "name": "disclaimer", + "type": "str", + "line": 28 + } + ], + "line": 22 + }, + { + "name": "PlanAmendment", + "bases": [], + "fields": [ + { + "name": "amendment_id", + "type": "str", + "line": 33 }, { - "name": "checksum", - "type": "str | None", - "default": "None" + "name": "plan_type", + "type": "str", + "line": 34 }, { - "name": "source_owner", - "type": "str | None", - "default": "None" + "name": "title", + "type": "str", + "line": 35 }, { - "name": "is_official", - "type": "bool", - "default": "True" + "name": "adoption_status", + "type": "PlanStatus", + "line": 36 }, { - "name": "official_status_note", + "name": "adopted_date", "type": "str | None", - "default": "None" + "line": 37 }, { - "name": "status", + "name": "citation", "type": "str", - "default": "'draft'" + "line": 38 }, { - "name": "staff_notes", - "type": "str | None", - "default": "None" + "name": "summary", + "type": "str", + "line": 39 } ], - "line": 286, - "doc": "Request body for registering an official or explicitly labeled source." + "line": 32 }, { - "name": "SourceTransitionRequest", - "bases": [ - "BaseModel" - ], + "name": "ProgressTarget", + "bases": [], "fields": [ { - "name": "to_status", + "name": "target_id", "type": "str", - "default": "" + "line": 44 }, { - "name": "actor", + "name": "policy_id", "type": "str", - "default": "Field(min_length=1)" + "line": 45 }, { - "name": "reason", + "name": "metric", "type": "str", - "default": "Field(min_length=1)" - } - ], - "line": 308, - "doc": "Request body for source-state changes." - }, - { - "name": "TitleCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 46 + }, { - "name": "title_id", - "type": "str | None", - "default": "None" + "name": "status", + "type": "str", + "line": 47 }, { - "name": "title_number", + "name": "evidence", "type": "str", - "default": "Field(min_length=1)" + "line": 48 }, { - "name": "title_name", + "name": "citation", "type": "str", - "default": "Field(min_length=1)" + "line": 49 }, { - "name": "sort_order", - "type": "int", - "default": "0" + "name": "updated_at", + "type": "datetime", + "line": 50 } ], - "line": 318, - "doc": "Request body for creating a code title." - }, + "line": 43 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/policy_lookup.py", + "sha256": "eef53ba621332d75f069f00ddcac34c19bca42d469a697fd22555eb3d11c68b2", + "bytes": 3155, + "routes": [], + "models": [ { - "name": "ChapterCreate", - "bases": [ - "BaseModel" - ], + "name": "PlanPolicy", + "bases": [], "fields": [ { - "name": "chapter_id", - "type": "str | None", - "default": "None" + "name": "policy_id", + "type": "str", + "line": 17 }, { - "name": "title_id", + "name": "plan_type", "type": "str", - "default": "Field(min_length=1)" + "line": 18 }, { - "name": "chapter_number", + "name": "title", "type": "str", - "default": "Field(min_length=1)" + "line": 19 }, { - "name": "chapter_name", + "name": "citation", "type": "str", - "default": "Field(min_length=1)" + "line": 20 }, { - "name": "sort_order", - "type": "int", - "default": "0" + "name": "excerpt", + "type": "str", + "line": 21 + }, + { + "name": "relevance", + "type": "str", + "line": 22 + }, + { + "name": "disclaimer", + "type": "str", + "line": 23 } ], - "line": 329, - "doc": "Request body for creating a code chapter." - }, + "line": 16 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/policy_service.py", + "sha256": "27fa2483c62a98d4bb4b80a8b88598e7366c9a8ad421701e594e0f71d7f1ddc4", + "bytes": 5990, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/public_explore.py", + "sha256": "2ff3160485f6a947db8e6cf38f56b7e0259c0f5492b714aed40dafd974351dd3", + "bytes": 7151, + "routes": [], + "models": [ { - "name": "SectionCreate", - "bases": [ - "BaseModel" - ], + "name": "Exploration", + "bases": [], "fields": [ { - "name": "section_id", - "type": "str | None", - "default": "None" + "name": "query", + "type": "str", + "line": 37 }, { - "name": "chapter_id", + "name": "plan_type", "type": "str", - "default": "Field(min_length=1)" + "line": 38 }, { - "name": "section_number", + "name": "goal", "type": "str", - "default": "Field(min_length=1)" + "line": 39 }, { - "name": "section_heading", + "name": "topic", "type": "str", - "default": "Field(min_length=1)" + "line": 40 }, { - "name": "parent_section_id", - "type": "str | None", - "default": "None" + "name": "neighborhood", + "type": "str", + "line": 41 }, { - "name": "sort_order", + "name": "plans", + "type": "list", + "line": 42 + }, + { + "name": "total", "type": "int", - "default": "0" + "line": 43 }, { - "name": "administrative_regulation_refs", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "review_required", + "type": "bool", + "line": 44 }, { - "name": "resolution_refs", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "disclaimer", + "type": "str", + "line": 45 }, { - "name": "policy_refs", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "empty_reason", + "type": "str | None", + "line": 46 }, { - "name": "approved_summary_refs", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "facets", + "type": "dict", + "line": 49 } ], - "line": 341, - "doc": "Request body for creating a code section or subsection." - }, + "line": 34 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/public_explore_ui.py", + "sha256": "609356af82f905829d271060c9150ddb4f5576b201ae7d91a9a6027252406869", + "bytes": 9868, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/public_ui.py", + "sha256": "8551ce36f854a4a7fc4573a20b73dbb0b6f01d7b60b7267d8c73b5f21f246ccc", + "bytes": 6946, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/records_export.py", + "sha256": "f846832525f23c4183db12742de37c3ce68fe4c57219762e2a5ac81947965d1c", + "bytes": 1294, + "routes": [], + "models": [ { - "name": "SectionVersionCreate", - "bases": [ - "BaseModel" - ], + "name": "PolicyExport", + "bases": [], "fields": [ { - "name": "version_id", - "type": "str | None", - "default": "None" - }, - { - "name": "section_id", - "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "source_id", + "name": "title", "type": "str", - "default": "Field(min_length=1)" + "line": 12 }, { - "name": "version_label", + "name": "policy_id", "type": "str", - "default": "Field(min_length=1)" + "line": 13 }, { - "name": "body", + "name": "format", "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "effective_start", - "type": "date", - "default": "" + "line": 14 }, { - "name": "effective_end", - "type": "date | None", - "default": "None" + "name": "checklist", + "type": "tuple[str, ...]", + "line": 15 }, { - "name": "status", + "name": "retention_note", "type": "str", - "default": "'draft'" - }, - { - "name": "is_current", - "type": "bool", - "default": "False" - }, - { - "name": "adoption_event_id", - "type": "str | None", - "default": "None" - }, - { - "name": "amendment_event_id", - "type": "str | None", - "default": "None" - }, + "line": 16 + } + ], + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/source_api.py", + "sha256": "42ff7e02374c4624112c104bcb8a246b62f3fbc68110b008e5a1fbfa66295207", + "bytes": 3468, + "routes": [ + { + "method": "POST", + "declared_path": "/source-imports", + "function": "import_sources", + "line": 51 + }, + { + "method": "GET", + "declared_path": "/source-plans/{plan_id}/history", + "function": "source_history", + "line": 63 + }, + { + "method": "GET", + "declared_path": "/source-revisions/{revision_id}", + "function": "source_revision", + "line": 68 + }, + { + "method": "GET", + "declared_path": "/source-revisions/{revision_id}/documents/{document_id}", + "function": "source_document", + "line": 76 + } + ], + "models": [ + { + "name": "ImportRequest", + "bases": [ + "BundleModel" + ], + "fields": [ { - "name": "amendment_summary", - "type": "str | None", - "default": "None" + "name": "bundle", + "type": "PlanBundle", + "line": 46 }, { - "name": "prior_version_id", + "name": "expected_previous_revision", "type": "str | None", - "default": "None" + "line": 47 } ], - "line": 358, - "doc": "Request body for adding an immutable section version." - }, + "line": 45 + } + ], + "configuration": [ { - "name": "QuestionAnswerRequest", + "environment": "TOWNLIGHT_PLANNING_POLICY_DB_URL", + "line": 31 + } + ] + }, + { + "source": "townlight_planning/source_bundle.py", + "sha256": "f6547516067e27697dfcd6ba80de6e2ca03d1473370209aa354a5bf95b7db98a", + "bytes": 6466, + "routes": [], + "models": [ + { + "name": "SourceDocument", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "question", + "name": "document_id", "type": "str", - "default": "Field(min_length=1)" + "line": 19 }, { - "name": "section_number", - "type": "str | None", - "default": "None" + "name": "filename", + "type": "str", + "line": 20 }, { - "name": "as_of", - "type": "date | None", - "default": "None" + "name": "media_type", + "type": "Literal['text/plain', 'text/markdown', 'application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document']", + "line": 21 + }, + { + "name": "sha256", + "type": "str", + "line": 25 + }, + { + "name": "content_base64", + "type": "str", + "line": 26 } ], - "line": 378, - "doc": "Request body for citation-grounded code Q&A." + "line": 18 }, { - "name": "SectionResolveRequest", + "name": "SourcePolicy", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "consumer_module", + "name": "policy_id", "type": "str", - "default": "Field(min_length=1)" + "line": 63 }, { - "name": "section_number", - "type": "str | None", - "default": "None" + "name": "document_id", + "type": "str", + "line": 64 }, { - "name": "query", - "type": "str | None", - "default": "None" + "name": "goal", + "type": "str", + "line": 65 }, { - "name": "as_of", - "type": "date | None", - "default": "None" - } - ], - "line": 388, - "doc": "Request body for downstream module section-resolution clients." - }, - { - "name": "PopularQuestionCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "objective", + "type": "str", + "line": 66 + }, { - "name": "question_id", - "type": "str | None", - "default": "None" + "name": "topic_key", + "type": "str", + "line": 67 }, { - "name": "question_text", + "name": "neighborhoods", + "type": "list[str]", + "line": 68 + }, + { + "name": "title", "type": "str", - "default": "Field(min_length=1)" + "line": 69 }, { - "name": "section_number", + "name": "citation", "type": "str", - "default": "Field(min_length=1)" + "line": 70 }, { - "name": "answer_excerpt", + "name": "anchor", "type": "str", - "default": "Field(min_length=1)" + "line": 71 }, { - "name": "audience", + "name": "excerpt", "type": "str", - "default": "'public'" + "line": 72 }, { - "name": "status", + "name": "relevance", "type": "str", - "default": "'approved'" + "line": 73 }, { - "name": "is_popular", - "type": "bool", - "default": "True" + "name": "staff_verified", + "type": "Literal[True]", + "line": 74 } ], - "line": 399, - "doc": "Request body for a staff-approved public popular-question navigation aid." + "line": 62 }, { - "name": "InterpretationNoteCreate", + "name": "AdoptionEvidence", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "note_id", - "type": "str | None", - "default": "None" + "name": "kind", + "type": "Literal['manual-record', 'meeting-reference', 'source-document']", + "line": 78 }, { - "name": "note_text", + "name": "reference", "type": "str", - "default": "Field(min_length=1)" + "line": 79 }, { - "name": "status", + "name": "document_id", + "type": "str | None", + "line": 80 + }, + { + "name": "note", "type": "str", - "default": "'draft'" + "line": 81 } ], - "line": 413, - "doc": "Request body for staff-only interpretation notes." + "line": 77 }, { - "name": "PlainLanguageSummaryCreate", + "name": "PlanBundle", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "summary_id", - "type": "str | None", - "default": "None" + "name": "schema_version", + "type": "Literal[1]", + "line": 85 }, { - "name": "section_version_id", + "name": "plan_id", "type": "str", - "default": "Field(min_length=1)" + "line": 86 }, { - "name": "summary_text", + "name": "title", "type": "str", - "default": "Field(min_length=1)" + "line": 87 }, { - "name": "language_code", + "name": "jurisdiction", "type": "str", - "default": "'en'" + "line": 88 + }, + { + "name": "plan_type", + "type": "PlanType", + "line": 89 }, { "name": "status", - "type": "str", - "default": "'draft'" - } - ], - "line": 423, - "doc": "Request body for staff-drafted plain-language summaries." - }, - { - "name": "CivicClerkOrdinanceEventCreate", - "bases": [ - "BaseModel" - ], - "fields": [ + "type": "Literal['pending', 'adopted', 'superseded']", + "line": 90 + }, { - "name": "event_id", - "type": "str | None", - "default": "None" + "name": "visibility", + "type": "Literal['staff', 'public']", + "line": 91 }, { - "name": "external_event_id", - "type": "str", - "default": "Field(min_length=1)" + "name": "dataset_kind", + "type": "Literal['municipal', 'demo']", + "line": 92 }, { - "name": "civicclerk_meeting_id", - "type": "str", - "default": "Field(min_length=1)" + "name": "source_date", + "type": "date", + "line": 93 }, { - "name": "civicclerk_agenda_item_id", - "type": "str", - "default": "Field(min_length=1)" + "name": "adopted_on", + "type": "date | None", + "line": 94 }, { - "name": "ordinance_number", - "type": "str", - "default": "Field(min_length=1)" + "name": "effective_on", + "type": "date | None", + "line": 95 }, { - "name": "title", + "name": "change_note", "type": "str", - "default": "Field(min_length=1)" + "line": 96 }, { - "name": "status", + "name": "reviewer_label", "type": "str", - "default": "'pending'" + "line": 97 }, { - "name": "affected_sections", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "documents", + "type": "list[SourceDocument]", + "line": 98 }, { - "name": "source_document_url", + "name": "policies", + "type": "list[SourcePolicy]", + "line": 99 + }, + { + "name": "adoption_evidence", + "type": "list[AdoptionEvidence]", + "line": 100 + } + ], + "line": 84 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/source_schema.py", + "sha256": "24e5350df4f9e1439327a8e72097dc50b7e4a35b1fe8f87d9db0ab4d92114b52", + "bytes": 4535, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/source_store.py", + "sha256": "7d04677e0c94acd7831d5bfad930c7e8d1583fb1ed9ca6e654da9df4fded76bb", + "bytes": 14109, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/staff_analysis.py", + "sha256": "2cb81dca0930e2289daa9fa8550b7ee8518d114efc4c3be89ea8b954eb3cec1d", + "bytes": 1369, + "routes": [], + "models": [ + { + "name": "StaffAnalysisDraft", + "bases": [], + "fields": [ + { + "name": "project_name", "type": "str", - "default": "Field(min_length=1)" + "line": 13 }, { - "name": "source_document_hash", + "name": "heading", "type": "str", - "default": "Field(min_length=1)" + "line": 14 + }, + { + "name": "bullets", + "type": "tuple[str, ...]", + "line": 15 + }, + { + "name": "citations", + "type": "tuple[str, ...]", + "line": 16 + }, + { + "name": "review_required", + "type": "bool", + "line": 17 }, { - "name": "ordinance_text", + "name": "disclaimer", + "type": "str", + "line": 18 + } + ], + "line": 12 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/workflow_api.py", + "sha256": "4aaf78976e900770cb6d1d1e7bdb8fdf489646a541ad460b8261786751a265e3", + "bytes": 5797, + "routes": [ + { + "method": "POST", + "declared_path": "/analyses", + "function": "create_analysis", + "line": 45 + }, + { + "method": "POST", + "declared_path": "/analyses/{analysis_id}/revisions", + "function": "revise_analysis", + "line": 52 + }, + { + "method": "GET", + "declared_path": "/analyses/{analysis_id}", + "function": "read_analysis", + "line": 59 + }, + { + "method": "GET", + "declared_path": "/analyses/{analysis_id}/history", + "function": "analysis_history", + "line": 67 + }, + { + "method": "POST", + "declared_path": "/analyses/{analysis_id}/snapshots", + "function": "create_snapshot", + "line": 77 + }, + { + "method": "GET", + "declared_path": "/snapshots/{snapshot_id}", + "function": "read_snapshot", + "line": 82 + }, + { + "method": "GET", + "declared_path": "/snapshots/{snapshot_id}/export", + "function": "export_snapshot", + "line": 90 + }, + { + "method": "POST", + "declared_path": "/snapshots/{snapshot_id}/access-advice", + "function": "access_advice", + "line": 98 + }, + { + "method": "POST", + "declared_path": "/policies/search", + "function": "search_policies", + "line": 108 + }, + { + "method": "POST", + "declared_path": "/connections/search", + "function": "search_connections", + "line": 118 + }, + { + "method": "GET", + "declared_path": "/policy-sources/{revision_id}/documents/{document_id}", + "function": "public_original", + "line": 123 + } + ], + "models": [ + { + "name": "SnapshotInput", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "expected_revision", "type": "str", - "default": "''" - }, - { - "name": "adopted_at", - "type": "datetime | None", - "default": "None" + "line": 72 }, { - "name": "failure_reason", - "type": "str | None", - "default": "None" + "name": "visibility", + "type": "Literal['staff_only', 'public']", + "line": 73 } ], - "line": 435, - "doc": "Request body for CivicClerk ordinance/adoption handoff intake." + "line": 71 }, { - "name": "CivicClerkOrdinanceEventResolve", + "name": "SearchInput", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "section_version_id", + "name": "query", "type": "str", - "default": "Field(min_length=1)" + "line": 103 + }, + { + "name": "plan_type", + "type": "str | None", + "line": 104 } ], - "line": 455, - "doc": "Request body for resolving a handoff after staff codifies the amendment." + "line": 102 }, { - "name": "ImportBundleCreate", + "name": "ConnectionSearch", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "job_id", - "type": "str | None", - "default": "None" + "name": "provider", + "type": "Literal['meetings', 'zoning']", + "line": 113 }, { - "name": "connector_type", + "name": "query", "type": "str", - "default": "Field(min_length=1)" - }, - { - "name": "source", - "type": "SourceCreate", - "default": "" - }, - { - "name": "sources", - "type": "list[SourceCreate]", - "default": "Field(default_factory=list)" - }, - { - "name": "titles", - "type": "list[TitleCreate]", - "default": "Field(default_factory=list)" - }, - { - "name": "chapters", - "type": "list[ChapterCreate]", - "default": "Field(default_factory=list)" - }, - { - "name": "sections", - "type": "list[SectionCreate]", - "default": "Field(default_factory=list)" - }, - { - "name": "versions", - "type": "list[SectionVersionCreate]", - "default": "Field(default_factory=list)" - }, - { - "name": "provenance", - "type": "dict[str, Any]", - "default": "Field(default_factory=dict)" + "line": 114 } ], - "line": 463, - "doc": "Request body for local fixture/file-drop import jobs." - }, + "line": 112 + } + ], + "configuration": [] + }, + { + "source": "townlight_planning/workflow_models.py", + "sha256": "26e6d23b365d440c827351d639fbe825ca28f0d76c98da5f64e34a464d856ffe", + "bytes": 2748, + "routes": [], + "models": [ { - "name": "SharedPdfImportCreate", + "name": "PolicySelection", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "pdf_path", + "name": "plan_id", "type": "str", - "default": "Field(min_length=1)" + "line": 8 }, { - "name": "force_reingest", - "type": "bool", - "default": "False" + "name": "revision_id", + "type": "str", + "line": 9 + }, + { + "name": "policy_id", + "type": "str", + "line": 10 } ], - "line": 479, - "doc": "Request body for CivicCore shared PDF ingestion into CivicCode." + "line": 7 }, { - "name": "CodifierSyncConfigureRequest", + "name": "LinkedSource", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ + { + "name": "provider", + "type": "Literal['meetings', 'zoning']", + "line": 14 + }, { "name": "source_id", "type": "str", - "default": "Field(min_length=1)" + "line": 15 }, { - "name": "sync_schedule", + "name": "expected_sha256", "type": "str", - "default": "Field(min_length=1)" + "line": 16 }, { - "name": "allowlisted_hosts", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "relation", + "type": "Literal['adoption-evidence', 'hearing', 'context', 'precedent']", + "line": 17 } ], - "line": 488, - "doc": "Request body for enabling staff-controlled codifier sync readiness." + "line": 13 }, { - "name": "CodifierSyncRunRequest", + "name": "Consideration", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "payload", - "type": "ImportBundleCreate", - "default": "" + "name": "policy", + "type": "PolicySelection", + "line": 21 }, { - "name": "changed_since", - "type": "datetime | None", - "default": "None" + "name": "stance", + "type": "Literal['supporting', 'conflicting', 'uncertain']", + "line": 22 + }, + { + "name": "note", + "type": "str", + "line": 23 } ], - "line": 498, - "doc": "Request body for a local codifier sync run." - } - ], - "configuration": [ - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 1988 - }, - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 1999 - }, - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 2010 - }, - { - "variable": "CIVICCODE_DEMO_ACTOR", - "default": "'demo-seed@portland.example.gov'", - "line": 2062 - }, - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 173 - }, - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 201 - }, - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 224 - }, - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 252 + "line": 20 }, { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 1567 - }, - { - "variable": "DATABASE_URL", - "default": "", - "line": 1567 - }, - { - "variable": "CIVICCODE_SOURCE_REGISTRY_DB_URL", - "default": "", - "line": 2020 - }, - { - "variable": "CIVICCODE_DEMO_SEED", - "default": "''", - "line": 2056 - } - ] - }, - { - "source": "installed-owned-source/civiccode/migrations/__init__.py", - "sha256": "4c8b91a2b40fe7951bf11bd74070344c9967b0feb5170a68d490305dc8333b8e", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/env.py", - "sha256": "5526b8ac01c1bc652c77861bb77209503668127d5c9a8d810dda351dff7a158e", - "routes": [], - "models": [], - "configuration": [ - { - "variable": "DATABASE_URL", - "default": "", - "line": 24 - } - ] - }, - { - "source": "installed-owned-source/civiccode/migrations/guards.py", - "sha256": "110cca437db7e2507374b9e0d9d32739dbdbaf57c664ac89d8a4c56472c05d7f", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/__init__.py", - "sha256": "74446fe86c7d899c1e4942b131ef47880cbb716011970d702ac78799902cc7ac", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0001_schema.py", - "sha256": "3361408fb75b2330c3dffa4c343bffa39ec96cb41b25d7c3e980f3efea69a950", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0002_source_registry_records.py", - "sha256": "a237d274d614a260242b2eee1661845fa96476445a8496c1fc2e8ff773fcc85c", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0003_popular_question_records.py", - "sha256": "d973ad1e13a5b84cc4bcc19d9977d9532d09388451c3872549180fa02ecfe609", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0004_section_lifecycle_records.py", - "sha256": "e11d0b3c4d08f32c00e513bbf336bf9f3ee2459c929aca0fed7c2158b688299f", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0005_staff_summary_records.py", - "sha256": "04d9a42402dbf503f9988dc07c4fe264390470d798d8e2d51983a1d7b8a5e601", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0006_ordinance_handoff_records.py", - "sha256": "bd2c85f222a0d4946298bdb580a36af174be378fbb3bdf62641457b87d5499fa", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0007_import_job_records.py", - "sha256": "d965ccf019d4059fe56ffd234955f45193d51d52a38b20fa1ba66e809493cb67", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0008_codifier_sync.py", - "sha256": "10b417a95e25d79ea3cc48fb3feedec0eea878f9580eba0b3c9e0b9413886366", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0009_operational_state.py", - "sha256": "5ff5a28d099a69b55c121fbf6ff9336cb8dee51e385966900510aba5df9a7540", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0010_handoff_resolution.py", - "sha256": "ed20579ff39863de49bd01a97a47b77d84b380f54f0aba7473c1aad360b11b4a", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0011_semantic_search.py", - "sha256": "4bf32028058db6ff90c19e2cf891886fef6d4e958ed7e72165e9a224ebd1b19d", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/migrations/versions/civiccode_0012_drop_local_search.py", - "sha256": "6ac60feecb72efbe78a788066ac58d790f6e6c460f4a71eea6ecf6cf30a6570d", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/mock_city_environment.py", - "sha256": "91c1e1089e2956417fd520725847950c544166f0a93f2a0a63b7c1a9859c1189", - "routes": [], - "models": [ - { - "name": "MockCityCodifierContract", - "bases": [], - "fields": [ - { - "name": "connector", - "type": "str", - "default": "" - }, - { - "name": "publisher", - "type": "str", - "default": "" - }, + "name": "AnalysisInput", + "bases": [ + "BundleModel" + ], + "fields": [ { - "name": "source_type", - "type": "str", - "default": "" + "name": "expected_previous_revision", + "type": "str | None", + "line": 27 }, { - "name": "interface_status", + "name": "project_name", "type": "str", - "default": "" + "line": 28 }, { - "name": "source_url", + "name": "proposal", "type": "str", - "default": "" + "line": 29 }, { - "name": "retrieval_method", - "type": "str", - "default": "" + "name": "selected_policies", + "type": "list[PolicySelection]", + "line": 30 }, { - "name": "auth_method", - "type": "str", - "default": "" + "name": "considerations", + "type": "list[Consideration]", + "line": 31 }, { - "name": "delta_query_param", + "name": "analysis_text", "type": "str", - "default": "" + "line": 32 }, { - "name": "sample_file", + "name": "public_summary", "type": "str", - "default": "" + "line": 33 }, { - "name": "source_owner", - "type": "str", - "default": "'City Clerk'" - } - ], - "line": 31, - "doc": "A public, secret-free contract for one municipal-code source interface." - }, - { - "name": "MockCityCodeCheck", - "bases": [], - "fields": [ - { - "name": "connector", + "name": "staff_notes", "type": "str", - "default": "" + "line": 34 }, { - "name": "ok", - "type": "bool", - "default": "" + "name": "audience", + "type": "Literal['staff', 'public']", + "line": 35 }, { - "name": "message", - "type": "str", - "default": "" + "name": "review_state", + "type": "Literal['draft', 'reviewed']", + "line": 36 }, { - "name": "fix", + "name": "reviewer_label", "type": "str", - "default": "" - }, - { - "name": "source_id", - "type": "str | None", - "default": "None" + "line": 37 }, { - "name": "import_job_id", - "type": "str | None", - "default": "None" + "name": "reviewed_on", + "type": "date | None", + "line": 38 }, { - "name": "delta_request_url", - "type": "str | None", - "default": "None" + "name": "review_notes", + "type": "str", + "line": 39 }, { - "name": "checked_sections", - "type": "tuple[str, ...]", - "default": "()" + "name": "linked_sources", + "type": "list[LinkedSource]", + "line": 40 } ], - "line": 66, - "doc": "Result for one mock-city codifier contract check." + "line": 26 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccode/models.py", - "sha256": "15f328be4b05481401d8ccd296110136ef98e98634fe59af1c2aa729340e8e4f", + "source": "townlight_planning/workflow_schema.py", + "sha256": "4976be5b782694c5b5ab126bc47d3fff1cd96fdec4b04a6fa9b01871e23ef98b", + "bytes": 2272, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_planning/workflow_store.py", + "sha256": "abf17394c1d03528208f26343afece0dd928e96920e9ecc7c46885d0f1543aef", + "bytes": 17298, + "routes": [], + "models": [], + "configuration": [] + } + ] + }, + "permitting": { + "repository": "townlight/permit", + "repository_head": "7d3f0cf0aff294c2a2372ae393d340f4e4ce1bc8", + "working_tree_modified": true, + "principal_import": "townlight_permitting", + "source": [ + { + "source": "townlight_permitting/__init__.py", + "sha256": "bedf11d628d9eb33c3d6724f11c532296889b719a6b5fe71c23b4eec6c7e55d8", + "bytes": 68, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccode/operational_readiness.py", - "sha256": "002130b66583a7645218e271d515ca6b9295f7a8fe19ee9e85e6e52adacc07a9", + "source": "townlight_permitting/connections.py", + "sha256": "4159a4eb4a407bebbefeb49bb760788cff3ac51a45c34af094d3be4b5a746798", + "bytes": 1995, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccode/operational_state.py", - "sha256": "6d73c3201fc449de9bf6678d129184533323960f82ccb0a5c0f6dcb147421b0f", + "source": "townlight_permitting/intake_review.py", + "sha256": "50aff3cf1b85c1789bf989edeaba444e124e42c49449c845fe0cd66053d9738c", + "bytes": 1626, "routes": [], "models": [ { - "name": "OperationalStateRecord", + "name": "IntakeReadiness", "bases": [], "fields": [ { - "name": "record_id", - "type": "str", - "default": "" - }, - { - "name": "lane", + "name": "project_type", "type": "str", - "default": "" + "line": 12 }, { - "name": "record_type", + "name": "status", "type": "str", - "default": "" + "line": 13 }, { - "name": "subject_id", - "type": "str", - "default": "" + "name": "missing_or_unclear", + "type": "tuple[str, ...]", + "line": 14 }, { - "name": "status", + "name": "next_step", "type": "str", - "default": "" + "line": 15 }, { - "name": "actor", + "name": "disclaimer", "type": "str", - "default": "'system'" - }, - { - "name": "attempt_count", - "type": "int", - "default": "0" - }, - { - "name": "next_attempt_at", - "type": "datetime | None", - "default": "None" - }, - { - "name": "cursor_key", - "type": "str | None", - "default": "None" - }, - { - "name": "cursor_value", - "type": "str | None", - "default": "None" - }, - { - "name": "replay_of", - "type": "str | None", - "default": "None" - }, - { - "name": "payload_hash", - "type": "str | None", - "default": "None" - }, - { - "name": "details", - "type": "dict[str, Any]", - "default": "field(default_factory=dict)" - }, - { - "name": "failure", - "type": "dict[str, Any] | None", - "default": "None" - }, - { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" - }, - { - "name": "updated_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "line": 16 } ], - "line": 20, - "doc": "One operator-visible operational state record." + "line": 11 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccode/ordinance_handoff.py", - "sha256": "5e98eefc3e510efaf0d5973927aa3506f8b652d319320f745a831bef0cb5897b", + "source": "townlight_permitting/integration_mocks.py", + "sha256": "dbdd49fba6836940936e5112076582a43d94bcff8c9c87faa2f80a49e4e5736c", + "bytes": 2023, "routes": [], "models": [ { - "name": "OrdinanceEvent", + "name": "IntegrationMockResult", "bases": [], "fields": [ { - "name": "event_id", - "type": "str", - "default": "" - }, - { - "name": "external_event_id", - "type": "str", - "default": "" - }, - { - "name": "civicclerk_meeting_id", - "type": "str", - "default": "" - }, - { - "name": "civicclerk_agenda_item_id", - "type": "str", - "default": "" - }, - { - "name": "ordinance_number", - "type": "str", - "default": "" - }, - { - "name": "title", + "name": "scenario", "type": "str", - "default": "" + "line": 11 }, { "name": "status", "type": "str", - "default": "" - }, - { - "name": "affected_sections", - "type": "list[str]", - "default": "" + "line": 12 }, { - "name": "source_document_url", - "type": "str", - "default": "" + "name": "review_required", + "type": "bool", + "line": 13 }, { - "name": "source_document_hash", - "type": "str", - "default": "" + "name": "findings", + "type": "tuple[str, ...]", + "line": 14 }, { - "name": "ordinance_text", + "name": "boundary", "type": "str", - "default": "''" - }, - { - "name": "adopted_at", - "type": "datetime | None", - "default": "None" - }, - { - "name": "failure_reason", - "type": "str | None", - "default": "None" - }, - { - "name": "resolved_section_version_id", - "type": "str | None", - "default": "None" - }, - { - "name": "resolved_by", - "type": "str | None", - "default": "None" - }, - { - "name": "resolved_at", - "type": "datetime | None", - "default": "None" - }, + "line": 15 + } + ], + "line": 10 + } + ], + "configuration": [] + }, + { + "source": "townlight_permitting/main.py", + "sha256": "6c554e6d74ff5be743db71541d4b05f0c7118f65cb442ec0b784eaa131f99cd7", + "bytes": 24021, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 104 + }, + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 124 + }, + { + "method": "GET", + "declared_path": "/townlight_permitting", + "function": "public_townlight_permitting_page", + "line": 163 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/requirements/lookup", + "function": "requirement_lookup", + "line": 170 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/intake/review", + "function": "intake_review", + "line": 179 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/pathway/explain", + "function": "pathway_explain", + "line": 305 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/pathway/explain-assisted", + "function": "pathway_explain_assisted", + "line": 319 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/context/development-review", + "function": "development_review_context", + "line": 339 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/integrations/mock/development-review", + "function": "integration_mock_development_review", + "line": 372 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_permitting/intake/{intake_id}", + "function": "get_intake_review", + "line": 384 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/submittal/outline", + "function": "submittal_outline", + "line": 411 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/export", + "function": "permit_export", + "line": 421 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_permitting/staff/reviews", + "function": "create_staff_review", + "line": 431 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_permitting/staff/reviews", + "function": "list_staff_reviews", + "line": 449 + }, + { + "method": "PATCH", + "declared_path": "/api/v1/townlight_permitting/staff/reviews/{review_id}", + "function": "update_staff_review", + "line": 466 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_permitting/staff/reviews/summary", + "function": "staff_review_summary", + "line": 498 + } + ], + "models": [ + { + "name": "RequirementLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "created_by", + "name": "project_type", "type": "str", - "default": "'unknown'" + "line": 46 }, { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "name": "location_context", + "type": "str", + "line": 47 } ], - "line": 39, - "doc": "" + "line": 45 }, { - "name": "HandoffAuditEvent", - "bases": [], + "name": "IntakeReviewRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "event_id", - "type": "str", - "default": "" - }, - { - "name": "event_type", - "type": "str", - "default": "" - }, - { - "name": "actor", + "name": "proposal", "type": "str", - "default": "" + "line": 51 }, { - "name": "target_id", + "name": "project_type", "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "line": 52 } ], - "line": 69, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/plain_language.py", - "sha256": "074b7aae42a3c4ee7ae5e64726a5fbbe151039cb51467f89f47b977e93e9b2bd", - "routes": [], - "models": [ + "line": 50 + }, { - "name": "PlainLanguageSummary", - "bases": [], + "name": "DevelopmentReviewContextRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "summary_id", - "type": "str", - "default": "" - }, - { - "name": "section_id", - "type": "str", - "default": "" - }, - { - "name": "section_version_id", - "type": "str", - "default": "" - }, - { - "name": "summary_text", - "type": "str", - "default": "" - }, - { - "name": "status", + "name": "project_type", "type": "str", - "default": "" + "line": 58 }, { - "name": "language_code", + "name": "proposal", "type": "str", - "default": "'en'" + "line": 59 }, { - "name": "created_by", + "name": "location_context", "type": "str", - "default": "'unknown'" + "line": 60 }, { - "name": "approved_by", + "name": "zoning_context_id", "type": "str | None", - "default": "None" - }, - { - "name": "approved_at", - "type": "datetime | None", - "default": "None" + "line": 61 }, { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "name": "code_context_id", + "type": "str | None", + "line": 62 } ], - "line": 31, - "doc": "" + "line": 55 }, { - "name": "SummaryAuditEvent", - "bases": [], + "name": "SubmittalOutlineRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "event_id", - "type": "str", - "default": "" - }, - { - "name": "event_type", - "type": "str", - "default": "" - }, - { - "name": "actor", + "name": "project_name", "type": "str", - "default": "" + "line": 66 }, { - "name": "section_id", + "name": "proposal", "type": "str", - "default": "" + "line": 67 }, { - "name": "target_id", + "name": "project_type", "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "line": 68 } ], - "line": 49, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/public_discovery.py", - "sha256": "f87497befbd3f75db94c4db0f36fb04fc1a34af8eba73a425ff49edb8dfc20ae", - "routes": [], - "models": [ + "line": 65 + }, { - "name": "PopularQuestion", - "bases": [], + "name": "PermitExportRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "question_id", - "type": "str", - "default": "" - }, - { - "name": "question_text", - "type": "str", - "default": "" - }, - { - "name": "section_id", + "name": "title", "type": "str", - "default": "" + "line": 72 }, { - "name": "section_number", + "name": "project_type", "type": "str", - "default": "" + "line": 73 }, { - "name": "section_heading", + "name": "format", "type": "str", - "default": "" - }, + "line": 74 + } + ], + "line": 71 + }, + { + "name": "StaffReviewCreateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "answer_excerpt", + "name": "proposal", "type": "str", - "default": "" - }, - { - "name": "citation_payload", - "type": "dict[str, Any]", - "default": "" + "line": 78 }, { - "name": "audience", + "name": "project_type", "type": "str", - "default": "'public'" + "line": 79 }, { - "name": "status", + "name": "reason", "type": "str", - "default": "'draft'" - }, - { - "name": "is_popular", - "type": "bool", - "default": "True" + "line": 80 }, { - "name": "approved_by", + "name": "intake_id", "type": "str | None", - "default": "None" - }, - { - "name": "approved_at", - "type": "datetime | None", - "default": "None" - }, - { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "line": 81 } ], - "line": 34, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/public_exports.py", - "sha256": "2d413d312f8baf1e790bb4205ad93ac25928f1afefa3aca1898d91092085bcc4", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/public_lookup.py", - "sha256": "a3c62b6aaa3de1ef98ac824fd5806e61bd444ae61241e2a19f0f7dff3a3cca79", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/qa_harness.py", - "sha256": "bc040cb0c4ff124f13a63e10fbcb26d478a06da5364e7fa18d177b40af269797", - "routes": [], - "models": [ + "line": 77 + }, { - "name": "QuestionRequestContext", - "bases": [], + "name": "StaffReviewUpdateRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "question", + "name": "status", "type": "str", - "default": "" + "line": 85 }, { - "name": "section_number", + "name": "assigned_to", "type": "str | None", - "default": "None" + "line": 86 }, { - "name": "as_of", - "type": "date | None", - "default": "None" + "name": "resolution", + "type": "str | None", + "line": 87 } ], - "line": 37, - "doc": "Normalized input for deterministic question answering." - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/real_municipal_fixtures.py", - "sha256": "a88b400d5b5bb8d6a74ec8a29d793c3e51ab94226e0f0b8abbde7030f667280a", - "routes": [], - "models": [ + "line": 84 + }, { - "name": "PortlandSectionFixture", - "bases": [], + "name": "PathwayRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "section_id", - "type": "str", - "default": "" - }, - { - "name": "section_number", - "type": "str", - "default": "" - }, - { - "name": "heading", - "type": "str", - "default": "" - }, - { - "name": "source_id", + "name": "project_type", "type": "str", - "default": "" + "line": 91 }, { - "name": "source_url", + "name": "proposal", "type": "str", - "default": "" + "line": 92 }, { - "name": "file_reference", + "name": "location_context", "type": "str", - "default": "" + "line": 93 }, { - "name": "body", - "type": "str", - "default": "" - }, + "name": "use_model_assistance", + "type": "bool", + "line": 94 + } + ], + "line": 90 + }, + { + "name": "IntegrationMockRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "effective_start", + "name": "scenario", "type": "str", - "default": "" - }, - { - "name": "adoption_event_id", - "type": "str | None", - "default": "None" + "line": 100 } ], - "line": 22, - "doc": "" + "line": 97 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_PERMITTING_INTAKE_DB_URL", + "line": 508 + }, + { + "environment": "TOWNLIGHT_PERMITTING_LLM_MODEL", + "line": 233 + }, + { + "environment": "TOWNLIGHT_PERMITTING_LLM_PROVIDER", + "line": 218 } - ], + ] + }, + { + "source": "townlight_permitting/migrations/__init__.py", + "sha256": "ef1b983ce930e61e3f65c585e38d76dc54005d07ad81dcc67bd0bffc842b66af", + "bytes": 1872, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_permitting/migrations/env.py", + "sha256": "b802c986b358b031ff58863a84322c332fcef243d7376fa60e44bcc9563bff88", + "bytes": 439, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_permitting/migrations/versions/townlight_permitting_0001_connected.py", + "sha256": "8ca41fd995d6c4b4ed938d6aa5b13467df6db04224344544a0ad38d40d420765", + "bytes": 1343, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccode/section_lifecycle.py", - "sha256": "34096b4ca4fa8f65628d33761609044f29a03bf0d89a5da09085440e56d149f2", + "source": "townlight_permitting/pathway.py", + "sha256": "52b79c81f8cf016145a074f877171896a99268b31917314e221b2ca395698e75", + "bytes": 14992, "routes": [], "models": [ { - "name": "CodeTitle", - "bases": [], + "name": "AssistantProvider", + "bases": [ + "Protocol" + ], "fields": [ { - "name": "title_id", - "type": "str", - "default": "" - }, - { - "name": "title_number", - "type": "str", - "default": "" - }, - { - "name": "title_name", + "name": "name", "type": "str", - "default": "" - }, - { - "name": "sort_order", - "type": "int", - "default": "0" - }, - { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "line": 77 } ], - "line": 42, - "doc": "" + "line": 74 }, { - "name": "CodeChapter", + "name": "PathwayStage", "bases": [], "fields": [ { - "name": "chapter_id", + "name": "key", "type": "str", - "default": "" + "line": 99 }, { - "name": "title_id", + "name": "label", "type": "str", - "default": "" + "line": 100 }, { - "name": "chapter_number", + "name": "source_id", "type": "str", - "default": "" + "line": 101 }, { - "name": "chapter_name", + "name": "typical_time", "type": "str", - "default": "" - }, - { - "name": "sort_order", - "type": "int", - "default": "0" - }, - { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "line": 102 } ], - "line": 51, - "doc": "" + "line": 91 }, { - "name": "CodeSection", + "name": "Pathway", "bases": [], "fields": [ { - "name": "section_id", + "name": "project_type", "type": "str", - "default": "" + "line": 107 }, { - "name": "chapter_id", + "name": "title", "type": "str", - "default": "" + "line": 108 }, { - "name": "section_number", - "type": "str", - "default": "" + "name": "stages", + "type": "tuple[PathwayStage, ...]", + "line": 109 }, { - "name": "section_heading", + "name": "attachments_citation", "type": "str", - "default": "" - }, - { - "name": "parent_section_id", - "type": "str | None", - "default": "None" - }, - { - "name": "sort_order", - "type": "int", - "default": "0" + "line": 110 }, { - "name": "administrative_regulation_refs", - "type": "list[str]", - "default": "field(default_factory=list)" - }, - { - "name": "resolution_refs", - "type": "list[str]", - "default": "field(default_factory=list)" - }, - { - "name": "policy_refs", - "type": "list[str]", - "default": "field(default_factory=list)" - }, - { - "name": "approved_summary_refs", - "type": "list[str]", - "default": "field(default_factory=list)" + "name": "attachments", + "type": "tuple[str, ...]", + "line": 111 }, { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "name": "note", + "type": "str", + "line": 112 } ], - "line": 61, - "doc": "" + "line": 106 }, { - "name": "SectionVersion", + "name": "PathwayExplanation", "bases": [], "fields": [ { - "name": "version_id", + "name": "project_type", "type": "str", - "default": "" + "line": 135 }, { - "name": "section_id", + "name": "title", "type": "str", - "default": "" + "line": 136 }, { - "name": "source_id", - "type": "str", - "default": "" + "name": "likely_permits", + "type": "list[dict[str, str]]", + "line": 137 }, { - "name": "version_label", - "type": "str", - "default": "" + "name": "attachments", + "type": "list[dict[str, str]]", + "line": 138 }, { - "name": "body", - "type": "str", - "default": "" + "name": "timeline", + "type": "list[dict[str, str]]", + "line": 139 }, { - "name": "effective_start", - "type": "date", - "default": "" + "name": "unavailable", + "type": "list[dict[str, str]]", + "line": 140 }, { - "name": "effective_end", - "type": "date | None", - "default": "None" + "name": "fee", + "type": "dict[str, object]", + "line": 141 }, { - "name": "status", + "name": "resident_explanation", "type": "str", - "default": "'draft'" + "line": 142 }, { - "name": "is_current", - "type": "bool", - "default": "False" - }, - { - "name": "adoption_event_id", - "type": "str | None", - "default": "None" - }, - { - "name": "amendment_event_id", - "type": "str | None", - "default": "None" - }, - { - "name": "amendment_summary", - "type": "str | None", - "default": "None" - }, - { - "name": "prior_version_id", - "type": "str | None", - "default": "None" + "name": "assistance", + "type": "dict[str, object]", + "line": 143 }, { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" - } - ], - "line": 76, - "doc": "" - } - ], - "configuration": [ - { - "variable": "CIVICCODE_SEMANTIC_SCORE_FLOOR", - "default": "", - "line": 929 - } - ] - }, - { - "source": "installed-owned-source/civiccode/semantic_search.py", - "sha256": "85de9cb0b861a7551a701bd4082ec3343728831c8bf20e45d90719db60f8b78c", - "routes": [], - "models": [ - { - "name": "SemanticDocument", - "bases": [], - "fields": [ - { - "name": "id", - "type": "str", - "default": "" + "name": "review_required", + "type": "bool", + "line": 144 }, { - "name": "version_id", - "type": "str", - "default": "" + "name": "determination_made", + "type": "bool", + "line": 145 }, { - "name": "text", - "type": "str", - "default": "" - } - ], - "line": 24, - "doc": "" - }, - { - "name": "EmbeddingConfig", - "bases": [], - "fields": [ - { - "name": "mode", - "type": "str", - "default": "" + "name": "citations", + "type": "list[str]", + "line": 146 }, { - "name": "base_url", + "name": "boundary", "type": "str", - "default": "" + "line": 147 }, { - "name": "model", + "name": "disclaimer", "type": "str", - "default": "" - }, - { - "name": "timeout_seconds", - "type": "float", - "default": "" + "line": 148 } ], - "line": 31, - "doc": "" + "line": 132 } ], - "configuration": [ - { - "variable": "CIVICCODE_OLLAMA_EMBEDDING_MODEL", - "default": "DEFAULT_EMBEDDING_MODEL", - "line": 49 - }, - { - "variable": "CIVICCODE_OLLAMA_EMBEDDING_URL", - "default": "", - "line": 45 - }, - { - "variable": "CIVICCODE_OLLAMA_URL", - "default": "", - "line": 46 - }, - { - "variable": "OLLAMA_BASE_URL", - "default": "", - "line": 47 - }, - { - "variable": "CIVICCODE_OLLAMA_EMBEDDING_TIMEOUT_SECONDS", - "default": "'30'", - "line": 50 - }, - { - "variable": "CIVICCODE_EMBEDDING_MODE", - "default": "''", - "line": 40 - } - ] + "configuration": [] }, { - "source": "installed-owned-source/civiccode/shared_ingestion.py", - "sha256": "caf8ec1c4d1da5a485ec96d0ae04e800e29f02fe1a71809cbebe0718c574f987", + "source": "townlight_permitting/persistence.py", + "sha256": "71b13022235e2f7a248c0638f3f2909e292b3519812dbbf33ac75bf7d78bf315", + "bytes": 14453, "routes": [], "models": [ { - "name": "SharedIngestionImport", + "name": "StoredIntakeReview", "bases": [], "fields": [ { - "name": "payload", - "type": "dict[str, Any]", - "default": "" + "name": "intake_id", + "type": "str", + "line": 73 }, { - "name": "proof", - "type": "dict[str, Any]", - "default": "" - } - ], - "line": 65, - "doc": "A CivicCore-ingested document plus a CivicCode local-bundle payload." - } - ], - "configuration": [ - { - "variable": "DATABASE_URL", - "default": "", - "line": 172 - }, - { - "variable": "CIVICCODE_SHARED_INGEST_CHUNK_SIZE", - "default": "'500'", - "line": 88 - }, - { - "variable": "CIVICCODE_SHARED_INGEST_CHUNK_OVERLAP", - "default": "'50'", - "line": 89 - }, - { - "variable": "CIVICCODE_SHARED_INGEST_ALLOWED_DIRS", - "default": "", - "line": 252 - }, - { - "variable": "CIVICCODE_SHARED_INGEST_ALLOWED_DIR", - "default": "", - "line": 252 - } - ] - }, - { - "source": "installed-owned-source/civiccode/source_registry.py", - "sha256": "292e2286802f36458a7468b749f81ff82277cc5f404fbf7b0ac7dd88f5d79651", - "routes": [], - "models": [ - { - "name": "CodeSource", - "bases": [], - "fields": [ + "name": "project_type", + "type": "str", + "line": 74 + }, { - "name": "source_id", + "name": "proposal", "type": "str", - "default": "" + "line": 75 }, { - "name": "name", + "name": "status", "type": "str", - "default": "" + "line": 76 }, { - "name": "publisher", + "name": "missing_or_unclear", + "type": "tuple[str, ...]", + "line": 77 + }, + { + "name": "next_step", "type": "str", - "default": "" + "line": 78 }, { - "name": "source_type", + "name": "disclaimer", "type": "str", - "default": "" + "line": 79 }, { - "name": "source_category", + "name": "created_at", + "type": "datetime", + "line": 80 + } + ], + "line": 72 + }, + { + "name": "StaffReviewQueueItem", + "bases": [], + "fields": [ + { + "name": "review_id", "type": "str", - "default": "" + "line": 85 }, { - "name": "source_url", + "name": "intake_id", "type": "str | None", - "default": "None" + "line": 86 }, { - "name": "file_reference", - "type": "str | None", - "default": "None" + "name": "project_type", + "type": "str", + "line": 87 }, { - "name": "retrieved_at", - "type": "datetime | None", - "default": "None" + "name": "proposal", + "type": "str", + "line": 88 }, { - "name": "retrieval_method", - "type": "str | None", - "default": "None" + "name": "status", + "type": "str", + "line": 89 }, { - "name": "checksum", + "name": "reason", + "type": "str", + "line": 90 + }, + { + "name": "assigned_to", "type": "str | None", - "default": "None" + "line": 91 }, { - "name": "source_owner", + "name": "resolution", "type": "str | None", - "default": "None" + "line": 92 }, { - "name": "is_official", - "type": "bool", - "default": "True" + "name": "created_by", + "type": "str", + "line": 93 }, { - "name": "official_status_note", - "type": "str | None", - "default": "None" + "name": "created_at", + "type": "datetime", + "line": 94 }, { - "name": "status", + "name": "updated_at", + "type": "datetime", + "line": 95 + }, + { + "name": "visibility", "type": "str", - "default": "'draft'" + "line": 96 + } + ], + "line": 84 + }, + { + "name": "StaffReviewSummary", + "bases": [], + "fields": [ + { + "name": "total_items", + "type": "int", + "line": 101 }, { - "name": "staff_notes", - "type": "str | None", - "default": "None" + "name": "by_status", + "type": "dict[str, int]", + "line": 102 }, { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "name": "open_items", + "type": "int", + "line": 103 }, { - "name": "updated_at", + "name": "generated_at", "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "line": 104 + }, + { + "name": "visibility", + "type": "str", + "line": 105 } ], - "line": 74, - "doc": "Runtime representation of an official or explicitly non-official source." + "line": 100 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccode/staff_code.py", - "sha256": "90b3d8ac3c6eb0c65831b47d8f6fa63ce3ac3d2350442c0913e15f7a768e317d", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/staff_imports.py", - "sha256": "f5ccf4e1d8d24bd23b62f922013f0f8eb2a8b633737b0a1134002ea0ea51e8df", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/staff_sources.py", - "sha256": "b7d00f3e051f131fde7142426b911e4484076987e4711685d18cf85dcee15412", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiccode/staff_sync.py", - "sha256": "92361f57357bd12e22dff589a6f2353de3602947ed739b8738d8479e2462791d", + "source": "townlight_permitting/public_ui.py", + "sha256": "e0e1e6056acb09ce92cde228bcf91711ce57b9b93b374acff51d462227c9f3c8", + "bytes": 11183, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiccode/staff_workbench.py", - "sha256": "13893408816cb0794c266c78d78e30e8182171b92830e757353001afea4f79fd", + "source": "townlight_permitting/records_export.py", + "sha256": "990c764b82130895bea153363e48e65a812a06d8589a8e5376f3709b4d84aecd", + "bytes": 1335, "routes": [], "models": [ { - "name": "InterpretationNote", + "name": "PermitExport", "bases": [], "fields": [ { - "name": "note_id", - "type": "str", - "default": "" - }, - { - "name": "section_id", + "name": "title", "type": "str", - "default": "" + "line": 12 }, { - "name": "note_text", + "name": "project_type", "type": "str", - "default": "" + "line": 13 }, { - "name": "status", + "name": "format", "type": "str", - "default": "" + "line": 14 }, { - "name": "visibility", - "type": "str", - "default": "'staff_only'" + "name": "checklist", + "type": "tuple[str, ...]", + "line": 15 }, { - "name": "created_by", + "name": "retention_note", "type": "str", - "default": "'unknown'" - }, - { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "line": 16 } ], - "line": 31, - "doc": "" - }, + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_permitting/requirement_lookup.py", + "sha256": "f9a1fbd111096e7d4c00cc6cb7f25b9cf91af522f26c743f86234a0ecffe783c", + "bytes": 2998, + "routes": [], + "models": [ { - "name": "AuditEvent", + "name": "PermitRequirement", "bases": [], "fields": [ { - "name": "event_id", + "name": "requirement_id", "type": "str", - "default": "" + "line": 17 }, { - "name": "event_type", + "name": "project_type", "type": "str", - "default": "" + "line": 18 }, { - "name": "actor", + "name": "title", "type": "str", - "default": "" + "line": 19 }, { - "name": "section_id", - "type": "str | None", - "default": "None" + "name": "citation", + "type": "str", + "line": 20 }, { - "name": "target_id", - "type": "str | None", - "default": "None" + "name": "required_materials", + "type": "tuple[str, ...]", + "line": 21 }, { - "name": "created_at", - "type": "datetime", - "default": "field(default_factory=lambda: datetime.now(UTC))" + "name": "staff_note", + "type": "str", + "line": 22 + }, + { + "name": "disclaimer", + "type": "str", + "line": 23 } ], - "line": 42, - "doc": "" + "line": 16 } ], "configuration": [] }, { - "source": "installed-owned-source/civiccode/suite_session_auth.py", - "sha256": "b30a449b95838c04098d33373f3b6b030539b7a8ea2a998210333b314f9f4582", + "source": "townlight_permitting/sources.py", + "sha256": "b49dd295c25b33f48a9756c86d6063137e35d76fdc8c4ff0f29ed8e22c4207df", + "bytes": 4372, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_permitting/submittal_outline.py", + "sha256": "14f980ef5a70f3bc712f582a1c27b1b596e8d35e86f28b2aeb110460e4859eff", + "bytes": 1365, "routes": [], "models": [ { - "name": "SuiteSessionPrincipal", + "name": "SubmittalOutline", "bases": [], "fields": [ { - "name": "subject", + "name": "project_name", "type": "str", - "default": "" + "line": 13 }, { - "name": "roles", - "type": "frozenset[str]", - "default": "" + "name": "heading", + "type": "str", + "line": 14 }, { - "name": "session_id", + "name": "required_materials", + "type": "tuple[str, ...]", + "line": 15 + }, + { + "name": "applicant_message", "type": "str", - "default": "" + "line": 16 + }, + { + "name": "review_required", + "type": "bool", + "line": 17 + }, + { + "name": "disclaimer", + "type": "str", + "line": 18 } ], - "line": 32, - "doc": "Validated CivicCore suite-session identity." - } - ], - "configuration": [] - } - ], - "bridge": [ - { - "source": "installed-owned-source/civicsuite_runtime/code_bridge.py", - "sha256": "901f1473aa6f4db4b089925a2fec17e963cef7a27c6bf885099a362df1fe15e9", - "routes": [ - { - "method": "POST", - "path": "/desktop/v1/code/imports", - "router": "router", - "prefix_resolved": true, - "name": "imports", - "signature": "data: code.ImportBundleCreate, actor_id: str=Depends(actor)", - "returns": "", - "line": 46, - "doc": "", - "decorator": "router.post('/imports')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/sources", - "router": "router", - "prefix_resolved": true, - "name": "sources", - "signature": "actor_id: str=Depends(actor)", - "returns": "", - "line": 55, - "doc": "", - "decorator": "router.get('/sources')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/workspace", - "router": "router", - "prefix_resolved": true, - "name": "workspace", - "signature": "actor_id: str=Depends(actor)", - "returns": "", - "line": 60, - "doc": "", - "decorator": "router.get('/workspace')", - "errors": [ - "HTTPException(503, 'Townlight Code persistence unavailable.')" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/code/lookup", - "router": "router", - "prefix_resolved": true, - "name": "lookup", - "signature": "section_number: str, as_of: date | None=None, actor_id: str=Depends(actor)", - "returns": "", - "line": 68, - "doc": "", - "decorator": "router.get('/lookup')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/sections/{section_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "section_history", - "signature": "section_id: str, actor_id: str=Depends(actor)", - "returns": "", - "line": 77, - "doc": "", - "decorator": "router.get('/sections/{section_id}/history')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/citation", - "router": "router", - "prefix_resolved": true, - "name": "citation", - "signature": "section_number: str, as_of: date | None=None, actor_id: str=Depends(actor)", - "returns": "", - "line": 82, - "doc": "", - "decorator": "router.get('/citation')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/search", - "router": "router", - "prefix_resolved": true, - "name": "search", - "signature": "q: str, actor_id: str=Depends(actor)", - "returns": "", - "line": 89, - "doc": "", - "decorator": "router.get('/search')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/imports", - "router": "router", - "prefix_resolved": true, - "name": "list_imports", - "signature": "actor_id: str=Depends(actor)", - "returns": "", - "line": 100, - "doc": "", - "decorator": "router.get('/imports')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/imports/{job_id}/tree", - "router": "router", - "prefix_resolved": true, - "name": "import_tree", - "signature": "job_id: str, actor_id: str=Depends(actor)", - "returns": "", - "line": 105, - "doc": "", - "decorator": "router.get('/imports/{job_id}/tree')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/imports/{job_id}/provenance", - "router": "router", - "prefix_resolved": true, - "name": "import_provenance", - "signature": "job_id: str, actor_id: str=Depends(actor)", - "returns": "", - "line": 110, - "doc": "", - "decorator": "router.get('/imports/{job_id}/provenance')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/export", - "router": "router", - "prefix_resolved": true, - "name": "export_section", - "signature": "section_ref: str, as_of: date | None=None, actor_id: str=Depends(actor)", - "returns": "", - "line": 115, - "doc": "", - "decorator": "router.get('/export')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/code/questions", - "router": "router", - "prefix_resolved": true, - "name": "questions", - "signature": "data: code.QuestionAnswerRequest, actor_id: str=Depends(actor)", - "returns": "", - "line": 120, - "doc": "", - "decorator": "router.post('/questions')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/code/sections/{section_id}/notes", - "router": "router", - "prefix_resolved": true, - "name": "create_note", - "signature": "section_id: str, data: code.InterpretationNoteCreate, actor_id: str=Depends(actor)", - "returns": "", - "line": 125, - "doc": "", - "decorator": "router.post('/sections/{section_id}/notes')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/sections/{section_id}/notes", - "router": "router", - "prefix_resolved": true, - "name": "list_notes", - "signature": "section_id: str, actor_id: str=Depends(actor)", - "returns": "", - "line": 130, - "doc": "", - "decorator": "router.get('/sections/{section_id}/notes')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/code/sections/{section_id}/summaries", - "router": "router", - "prefix_resolved": true, - "name": "create_summary", - "signature": "section_id: str, data: code.PlainLanguageSummaryCreate, actor_id: str=Depends(actor)", - "returns": "", - "line": 135, - "doc": "", - "decorator": "router.post('/sections/{section_id}/summaries')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/code/summaries/{summary_id}/approve", - "router": "router", - "prefix_resolved": true, - "name": "approve_summary", - "signature": "summary_id: str, actor_id: str=Depends(actor)", - "returns": "", - "line": 140, - "doc": "", - "decorator": "router.post('/summaries/{summary_id}/approve')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/sections/{section_id}/summaries", - "router": "router", - "prefix_resolved": true, - "name": "list_summaries", - "signature": "section_id: str, actor_id: str=Depends(actor)", - "returns": "", - "line": 145, - "doc": "", - "decorator": "router.get('/sections/{section_id}/summaries')", - "errors": [] - } - ], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicsuite_runtime/code_public.py", - "sha256": "0fe956329a96e54e138b669d4ab4f69ab0d6f489b647a115cfd126cfa58742a5", - "routes": [ - { - "method": "GET", - "path": "/civiccode", - "router": "router", - "prefix_resolved": true, - "name": "home", - "signature": "", - "returns": "", - "line": 66, - "doc": "", - "decorator": "router.get('', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/search", - "router": "router", - "prefix_resolved": true, - "name": "search", - "signature": "q: str=''", - "returns": "", - "line": 71, - "doc": "", - "decorator": "router.get('/search', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/answer", - "router": "router", - "prefix_resolved": true, - "name": "answer", - "signature": "q: str='', section_number: str | None=None, as_of: date | None=None", - "returns": "", - "line": 80, - "doc": "", - "decorator": "router.get('/answer', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/civiccode/sections/{section_ref}", - "router": "router", - "prefix_resolved": true, - "name": "detail", - "signature": "section_ref: str, as_of: date | None=None", - "returns": "HTMLResponse", - "line": 91, - "doc": "", - "decorator": "router.get('/sections/{section_ref}', response_class=HTMLResponse)", - "errors": [ - "HTTPException(503, 'Service unavailable')" - ] - }, - { - "method": "GET", - "path": "/civiccode/sections/{section_ref}/export", - "router": "router", - "prefix_resolved": true, - "name": "export", - "signature": "section_ref: str, as_of: date | None=None", - "returns": "HTMLResponse", - "line": 109, - "doc": "", - "decorator": "router.get('/sections/{section_ref}/export', response_class=HTMLResponse)", - "errors": [ - "HTTPException(503, 'Service unavailable')" - ] + "line": 12 } ], - "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicsuite_runtime/code_meetings_bridge.py", - "sha256": "831045dc48508e866472a9ff6d9d837e8eed0a46c91c8f93b41eec526650c7c5", - "routes": [ - { - "method": "GET", - "path": "/desktop/v1/code/connections", - "router": "code_router", - "prefix_resolved": true, - "name": "list_connections", - "signature": "actor=Depends(code_actor)", - "returns": "", - "line": 87, - "doc": "", - "decorator": "code_router.get('/connections')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/code/connections/{connection_id}", - "router": "code_router", - "prefix_resolved": true, - "name": "get_connection", - "signature": "connection_id: Key, actor=Depends(code_actor)", - "returns": "", - "line": 92, - "doc": "", - "decorator": "code_router.get('/connections/{connection_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/code/connections", - "router": "code_router", - "prefix_resolved": true, - "name": "create_connection", - "signature": "payload: Proposal, actor=Depends(code_actor)", - "returns": "", - "line": 97, - "doc": "", - "decorator": "code_router.post('/connections')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/code/connections/{connection_id}/closeout", - "router": "code_router", - "prefix_resolved": true, - "name": "closeout_connection", - "signature": "connection_id: Key, payload: Closeout, actor=Depends(code_actor)", - "returns": "", - "line": 104, - "doc": "", - "decorator": "code_router.post('/connections/{connection_id}/closeout')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/meetings/code-connections", - "router": "meetings_router", - "prefix_resolved": true, - "name": "list_code_connections", - "signature": "actor=Depends(meeting_actor)", - "returns": "", - "line": 111, - "doc": "", - "decorator": "meetings_router.get('/code-connections')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/meetings/code-connections/{connection_id}", - "router": "meetings_router", - "prefix_resolved": true, - "name": "get_code_connection", - "signature": "connection_id: Key, actor=Depends(meeting_actor)", - "returns": "", - "line": 116, - "doc": "", - "decorator": "meetings_router.get('/code-connections/{connection_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/meetings/code-connections/{connection_id}/decisions", - "router": "meetings_router", - "prefix_resolved": true, - "name": "record_decision", - "signature": "connection_id: Key, payload: Decision, actor=Depends(meeting_actor)", - "returns": "", - "line": 121, - "doc": "", - "decorator": "meetings_router.post('/code-connections/{connection_id}/decisions')", - "errors": [] - } - ], + "source": "townlight_permitting/workflow_models.py", + "sha256": "3d09f3ae137c5c48091e22a60a3e732ea3ec299236778d377df55807bb8bbfdd", + "bytes": 4405, + "routes": [], "models": [ { - "name": "Proposal", + "name": "Material", "bases": [ - "_Strict" + "Model" ], "fields": [ { - "name": "id", - "type": "Key", - "default": "" + "name": "material_id", + "type": "str", + "line": 21 }, { - "name": "version_id", + "name": "description", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 22 }, { - "name": "meeting_id", - "type": "UUID", - "default": "" - }, + "name": "citation", + "type": "str", + "line": 23 + } + ], + "line": 20 + }, + { + "name": "PathwayStep", + "bases": [ + "Model" + ], + "fields": [ { - "name": "title", + "name": "step", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 27 }, { - "name": "ordinance_number", + "name": "citation", "type": "str", - "default": "Field(min_length=1, max_length=120)" + "line": 28 }, { - "name": "proposed_text", + "name": "typical_time", "type": "str", - "default": "Field(min_length=1, max_length=1000000)" + "line": 29 + } + ], + "line": 26 + }, + { + "name": "SourceLink", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['code', 'zoning']", + "line": 33 }, { - "name": "supersedes_id", - "type": "Key | None", - "default": "None" + "name": "source_id", + "type": "str", + "line": 34 }, { - "name": "reconciliation_note", - "type": "str | None", - "default": "None" + "name": "expected_sha256", + "type": "str", + "line": 35 } ], - "line": 26, - "doc": "" + "line": 32 }, { - "name": "Decision", + "name": "RequirementBundle", "bases": [ - "_Strict" + "Model" ], "fields": [ { - "name": "id", - "type": "Key", - "default": "" + "name": "requirement_id", + "type": "str", + "line": 39 }, { - "name": "outcome", - "type": "Literal['adopted', 'not_adopted', 'deferred', 'withdrawn']", - "default": "" + "name": "title", + "type": "str", + "line": 40 }, { - "name": "decided_at", - "type": "AwareDatetime | None", - "default": "None" + "name": "jurisdiction", + "type": "str", + "line": 41 }, { - "name": "decision_text", + "name": "project_type", "type": "str", - "default": "Field(min_length=1, max_length=1000000)" + "line": 42 }, { - "name": "supporting_references", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "source_reference", + "type": "str", + "line": 43 }, { - "name": "supersedes_decision_id", - "type": "Key | None", - "default": "None" + "name": "source_date", + "type": "date", + "line": 44 }, { - "name": "reconciliation_note", - "type": "str | None", - "default": "None" - } - ], - "line": 37, - "doc": "" - }, - { - "name": "Closeout", - "bases": [ - "_Strict" - ], - "fields": [ + "name": "effective_on", + "type": "date", + "line": 45 + }, { - "name": "decision_id", - "type": "Key", - "default": "" + "name": "dataset_kind", + "type": "Literal['municipal', 'fictional']", + "line": 46 }, { - "name": "version_id", + "name": "filename", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 47 }, { - "name": "source_id", + "name": "content_base64", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 48 }, { - "name": "version_label", + "name": "sha256", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 49 }, { - "name": "body", - "type": "str", - "default": "Field(min_length=1, max_length=1000000)" + "name": "materials", + "type": "list[Material]", + "line": 50 }, { - "name": "effective_start", - "type": "date", - "default": "" + "name": "pathway", + "type": "list[PathwayStep]", + "line": 51 }, { - "name": "effective_end", - "type": "date | None", - "default": "None" + "name": "fee_link", + "type": "SourceLink | None", + "line": 52 }, { - "name": "is_current", - "type": "bool", - "default": "" + "name": "staff_note", + "type": "str", + "line": 53 }, { - "name": "reconciliation_note", - "type": "str | None", - "default": "None" + "name": "change_note", + "type": "str", + "line": 54 } ], - "line": 47, - "doc": "" - } - ], - "configuration": [] - } - ] - }, - "zoning": { - "package": "civiczone", - "source": [ - { - "source": "installed-owned-source/civiczone/__init__.py", - "sha256": "528eaa60c6814c1cf2b3ceb5a510c059380c37670f48928c27a02d765a2d4d15", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/cited_questions.py", - "sha256": "7a154dd540eae464090b4c12e6e0c1ca263670525df6a7328d317b0dd1e79a43", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/cited_rules.py", - "sha256": "4fb421ff3cd9e27be7689de75711bba8d1cd3ede304547868c204cf7a0daa43a", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/connected_sources.py", - "sha256": "68ad55c71b897eca689a6d028f4aee115dc5ca4b5ef005613385f9588387715b", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/discretionary.py", - "sha256": "919a5a573109fc76840290b4656e8fc63be91cdd10a6b3ff21fd106b52218ca5", - "routes": [], - "models": [ + "line": 38 + }, { - "name": "Unavailable", - "bases": [], + "name": "MaterialReview", + "bases": [ + "Model" + ], "fields": [ { - "name": "reason", - "type": "str", - "default": "" - }, - { - "name": "fix", + "name": "material_id", "type": "str", - "default": "" + "line": 71 }, { - "name": "review_required", - "type": "bool", - "default": "True" + "name": "status", + "type": "Literal['not_reviewed', 'provided', 'missing', 'unclear']", + "line": 72 }, { - "name": "disclaimer", + "name": "note", "type": "str", - "default": "DISCLAIMER" + "line": 73 } ], - "line": 45, - "doc": "An explicit refusal: the sources do not support an answer." + "line": 70 }, { - "name": "NonconformityFlag", - "bases": [], + "name": "IntakeInput", + "bases": [ + "Model" + ], "fields": [ { - "name": "observed", - "type": "str", - "default": "" + "name": "expected_revision", + "type": "UUID | None", + "line": 77 }, { - "name": "standard", + "name": "project_name", "type": "str", - "default": "" + "line": 78 }, { - "name": "citation", + "name": "project_description", "type": "str", - "default": "" + "line": 79 }, { - "name": "basis", + "name": "location", "type": "str", - "default": "" + "line": 80 }, { - "name": "review_required", - "type": "bool", - "default": "True" + "name": "applicant_contact", + "type": "str", + "line": 81 }, { - "name": "determination_made", - "type": "bool", - "default": "False" + "name": "requirement_revision", + "type": "UUID", + "line": 82 }, { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" - } - ], - "line": 55, - "doc": "A REVIEW flag raised from existing parcel/rule data. Never a finding." - }, - { - "name": "ProcessExplanation", - "bases": [], - "fields": [ - { - "name": "process", - "type": "str", - "default": "" + "name": "materials", + "type": "list[MaterialReview]", + "line": 83 }, { - "name": "label", - "type": "str", - "default": "" + "name": "linked_sources", + "type": "list[SourceLink]", + "line": 84 }, { - "name": "what", + "name": "staff_notes", "type": "str", - "default": "" + "line": 85 }, { - "name": "standard_citation", + "name": "assigned_to", "type": "str", - "default": "" + "line": 86 }, { - "name": "needs", - "type": "list", - "default": "" + "name": "review_state", + "type": "Literal['draft', 'follow_up', 'reviewed']", + "line": 87 }, { - "name": "review", - "type": "list", - "default": "" + "name": "review_notes", + "type": "str", + "line": 88 }, { - "name": "source_citation", - "type": "dict", - "default": "field(default_factory=dict)" - }, + "name": "public_summary", + "type": "str", + "line": 89 + } + ], + "line": 76 + } + ], + "configuration": [] + }, + { + "source": "townlight_permitting/workflow_schema.py", + "sha256": "6797fd13cbe6ba85884fc522c05e56aefe0fea3796d5a269d5be8824da3809c5", + "bytes": 2263, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_permitting/workflow_store.py", + "sha256": "451c6ee455cf85d1b5a18a1e54ac02653b52a1d2e479adbe9213f086104ddd94", + "bytes": 15521, + "routes": [], + "models": [], + "configuration": [] + } + ] + }, + "inspections": { + "repository": "townlight/inspect", + "repository_head": "e058106d36b9164b702acac878fb00c3e533e4a6", + "working_tree_modified": true, + "principal_import": "townlight_inspections", + "source": [ + { + "source": "townlight_inspections/__init__.py", + "sha256": "f1a274959add447eba3a43e59f72d62e4abbe6189a62c723c7ce2d127baa2096", + "bytes": 69, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_inspections/_whistle_driver.py", + "sha256": "90ce9276c7d1de4d3259a2c00ff581e5d55d28dd8da913ed7b8bd2d7c89a5264", + "bytes": 1419, + "routes": [], + "models": [], + "configuration": [ + { + "environment": "TEXTFLOWKIT_MODELS_DIR", + "line": 19 + }, + { + "environment": "TEXTFLOWKIT_OFFLINE", + "line": 20 + } + ] + }, + { + "source": "townlight_inspections/adapters.py", + "sha256": "6ac1d1b2d1a57c63c1c03af1e23bfa9540136bb1b8b2fba9eda3f27e42ecfd9e", + "bytes": 5419, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_inspections/case_lookup.py", + "sha256": "b68030ecdf6a7f83ed35aec636afcb70c5ce247a40ed7d60a3283655bfdb3214", + "bytes": 1538, + "routes": [], + "models": [ + { + "name": "RepeatCaseResult", + "bases": [], + "fields": [ { - "name": "standards", - "type": "list", - "default": "field(default_factory=list)" + "name": "property_reference", + "type": "str", + "line": 16 }, { - "name": "flags", - "type": "list", - "default": "field(default_factory=list)" + "name": "violation_type", + "type": "str", + "line": 17 }, { - "name": "review_required", - "type": "bool", - "default": "True" + "name": "repeat_case_count", + "type": "int", + "line": 18 }, { - "name": "determination_made", - "type": "bool", - "default": "False" + "name": "related_case_ids", + "type": "tuple[str, ...]", + "line": 19 }, { - "name": "disclaimer", + "name": "staff_note", "type": "str", - "default": "DISCLAIMER" + "line": 20 }, { - "name": "as_of", - "type": "str | None", - "default": "None" + "name": "disclaimer", + "type": "str", + "line": 21 } ], - "line": 68, - "doc": "" + "line": 15 } ], "configuration": [] }, { - "source": "installed-owned-source/civiczone/geo_import.py", - "sha256": "e49824301593f8c06dd6bc64832542721d7b1763d745deb7ba531f7b894cc4a0", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/geo_spatial.py", - "sha256": "dfe4c88a940a20825c5c493babacb0cb0a96a70cb31a831c3ff1ecb4b77ebc13", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/geo_validate.py", - "sha256": "65b4a2b84722be8c25decfaeb80c6177ff30588259379927e853f7727d767178", + "source": "townlight_inspections/connections.py", + "sha256": "a32e5723ed2b93b0e72a6659ac0db8f614db1be7cc5cb4881a40b9abdff85e60", + "bytes": 1969, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiczone/integration_mocks.py", - "sha256": "ed14fba1a58020377ebee28c20ef042f5b50126ca2351efb73e46d7a2d80982c", + "source": "townlight_inspections/integration_mocks.py", + "sha256": "a22c28a8d47e6357b3c4b526b1d4690e8b98cc9d9115c93c74656734a58901ce", + "bytes": 2337, "routes": [], "models": [ { - "name": "IntegrationError", + "name": "IntegrationMockResult", "bases": [], "fields": [ { - "name": "provider", + "name": "scenario", "type": "str", - "default": "" + "line": 11 }, { - "name": "message", + "name": "status", "type": "str", - "default": "" + "line": 12 }, { - "name": "fix", + "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_inspections/main.py", + "sha256": "d6f4908f4898ef87372b61527536fa73542630d4c96b5fad5cdf9e626698db65", + "bytes": 19966, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 130 + }, + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 150 + }, + { + "method": "GET", + "declared_path": "/townlight_inspections", + "function": "public_townlight_inspections_page", + "line": 162 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/cases/repeat-lookup", + "function": "repeat_case_lookup", + "line": 169 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/reports/draft", + "function": "inspection_report_draft", + "line": 178 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_inspections/reports/{report_id}", + "function": "get_inspection_report", + "line": 215 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/evidence/retain", + "function": "retain_evidence_route", + "line": 291 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/media/analyse", + "function": "media_analyse", + "line": 307 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/notices/draft", + "function": "notice_draft", + "line": 325 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/context/inspection-review", + "function": "inspection_review_context", + "line": 336 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/integrations/mock/inspection-context", + "function": "integration_mock_inspection_context", + "line": 365 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/export", + "function": "inspection_export", + "line": 377 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_inspections/staff/reviews", + "function": "create_staff_review", + "line": 387 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_inspections/staff/reviews", + "function": "list_staff_reviews", + "line": 403 + }, + { + "method": "PATCH", + "declared_path": "/api/v1/townlight_inspections/staff/reviews/{review_id}", + "function": "update_staff_review", + "line": 418 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_inspections/staff/reviews/summary", + "function": "staff_review_summary", + "line": 448 + } + ], + "models": [ + { + "name": "RepeatCaseLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "property_reference", "type": "str", - "default": "" + "line": 51 }, { - "name": "code", + "name": "violation_type", "type": "str", - "default": "" + "line": 52 } ], - "line": 27, - "doc": "" + "line": 50 }, { - "name": "IntegrationResult", - "bases": [], + "name": "ReportDraftRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "provider", + "name": "inspection_id", "type": "str", - "default": "" + "line": 56 }, { - "name": "records", - "type": "tuple[dict[str, Any], ...]", - "default": "" + "name": "property_reference", + "type": "str", + "line": 57 }, { - "name": "source", + "name": "inspector_notes", "type": "str", - "default": "" + "line": 58 }, { - "name": "warnings", - "type": "tuple[str, ...]", - "default": "()" + "name": "photo_observations", + "type": "list[str]", + "line": 59 }, { - "name": "stale", - "type": "bool", - "default": "False" + "name": "voice_notes", + "type": "str", + "line": 60 + }, + { + "name": "analysis", + "type": "AnalysisRecord | None", + "line": 61 } ], - "line": 35, - "doc": "" + "line": 55 }, { - "name": "LocalIntegrationAdapter", - "bases": [], + "name": "NoticeDraftRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "provider", + "name": "case_id", "type": "str", - "default": "" + "line": 65 }, { - "name": "dependency", - "type": "str | None", - "default": "None" + "name": "property_reference", + "type": "str", + "line": 66 + }, + { + "name": "violation_type", + "type": "str", + "line": 67 + }, + { + "name": "observations", + "type": "list[str]", + "line": 68 } ], - "line": 43, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/main.py", - "sha256": "cdbc4bd6f20650c08ca4a81c7e9d2fc7c85e0896bbd3d1c4e982dfe178c7bb93", - "routes": [ - { - "method": "GET", - "path": "/", - "router": "app", - "prefix_resolved": true, - "name": "root", - "signature": "", - "returns": "dict[str, str]", - "line": 74, - "doc": "Return current product state without overstating unshipped behavior.", - "decorator": "app.get('/')", - "errors": [] - }, - { - "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "health", - "signature": "", - "returns": "dict[str, str]", - "line": 92, - "doc": "Return dependency/version health for deployment smoke checks.", - "decorator": "app.get('/health')", - "errors": [] - }, - { - "method": "GET", - "path": "/civiczone", - "router": "app", - "prefix_resolved": true, - "name": "public_civiczone_page", - "signature": "", - "returns": "str", - "line": 104, - "doc": "Return the accessible public sample UI.", - "decorator": "app.get('/civiczone', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/civiczone/staff", - "router": "app", - "prefix_resolved": true, - "name": "staff_civiczone_page", - "signature": "", - "returns": "str", - "line": 111, - "doc": "Return the staff workflow shell without exposing staff data in HTML.", - "decorator": "app.get('/civiczone/staff', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/parcels/lookup", - "router": "app", - "prefix_resolved": true, - "name": "parcel_lookup", - "signature": "request: ParcelLookupRequest", - "returns": "dict[str, object]", - "line": 220, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/parcels/lookup')", - "errors": [ - "HTTPException(status_code=422, detail={'message': 'Provide either parcel_number or address.', 'fix': \"Send parcel_number '100-200-300' or address '123 Main St', or load local parcel records into CIVICZONE_PARCEL_RULE_DB_URL.\"})", - "HTTPException(status_code=404, detail={'message': result.message, 'fix': result.fix})" - ] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/rules/use", - "router": "app", - "prefix_resolved": true, - "name": "use_rule_lookup", - "signature": "request: UseRuleLookupRequest", - "returns": "dict[str, str]", - "line": 246, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/rules/use')", - "errors": [ - "HTTPException(status_code=404, detail={'message': result.message, 'fix': result.fix})" - ] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/rules/dimensional", - "router": "app", - "prefix_resolved": true, - "name": "dimensional_rule_lookup", - "signature": "request: DimensionalRuleLookupRequest", - "returns": "dict[str, str]", - "line": 261, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/rules/dimensional')", - "errors": [ - "HTTPException(status_code=404, detail={'message': result.message, 'fix': result.fix})" - ] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/standards/process-explanation", - "router": "app", - "prefix_resolved": true, - "name": "discretionary_explanation", - "signature": "request: DiscretionaryExplanationRequest", - "returns": "dict[str, object]", - "line": 283, - "doc": "Explain the variance/CUP process a question is about, with citations.\n\nReturns an explicit ``unavailable`` payload when the loaded rule dataset cannot\nsupport an answer; never a guessed standard, and never a determination.", - "decorator": "app.post('/api/v1/civiczone/standards/process-explanation')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/questions/answer", - "router": "app", - "prefix_resolved": true, - "name": "zone_question_answer", - "signature": "request: ZoneQuestionRequest", - "returns": "dict[str, object]", - "line": 353, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/questions/answer')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/planner-review/classify", - "router": "app", - "prefix_resolved": true, - "name": "planner_review_classify", - "signature": "request: PlannerReviewRequest", - "returns": "dict[str, str]", - "line": 378, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/planner-review/classify')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiczone/staff/precedents/{precedent_id}", - "router": "app", - "prefix_resolved": true, - "name": "staff_precedent", - "signature": "precedent_id: str, _principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", - "returns": "dict[str, str]", - "line": 384, - "doc": "", - "decorator": "app.get('/api/v1/civiczone/staff/precedents/{precedent_id}')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Staff precedent not found.', 'fix': \"Try precedent_id 'historic-adu'.\"})" - ] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/staff/questions/answer", - "router": "app", - "prefix_resolved": true, - "name": "staff_question_answer", - "signature": "request: StaffQuestionAnswerRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", - "returns": "dict[str, object]", - "line": 402, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/staff/questions/answer')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/staff/ambiguity-reviews", - "router": "app", - "prefix_resolved": true, - "name": "create_ambiguity_review", - "signature": "request: AmbiguityReviewCreateRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", - "returns": "dict[str, object]", - "line": 415, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/staff/ambiguity-reviews')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civiczone/staff/ambiguity-reviews", - "router": "app", - "prefix_resolved": true, - "name": "list_ambiguity_reviews", - "signature": "_principal: Annotated[StaffPrincipal, Depends(_require_staff_access)], status: str | None=None", - "returns": "dict[str, object]", - "line": 429, - "doc": "", - "decorator": "app.get('/api/v1/civiczone/staff/ambiguity-reviews')", - "errors": [] - }, - { - "method": "PATCH", - "path": "/api/v1/civiczone/staff/ambiguity-reviews/{item_id}", - "router": "app", - "prefix_resolved": true, - "name": "update_ambiguity_review", - "signature": "item_id: str, request: AmbiguityReviewUpdateRequest, _principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", - "returns": "dict[str, object]", - "line": 443, - "doc": "", - "decorator": "app.patch('/api/v1/civiczone/staff/ambiguity-reviews/{item_id}')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Ambiguity review item was not found.', 'fix': 'List staff ambiguity reviews and retry with an existing item id.'})", - "HTTPException(status_code=422, detail={'message': 'Ambiguity review update is invalid.', 'fix': str(exc)})" - ] - }, - { - "method": "GET", - "path": "/api/v1/civiczone/staff/questions/analytics", - "router": "app", - "prefix_resolved": true, - "name": "staff_question_analytics", - "signature": "_principal: Annotated[StaffPrincipal, Depends(_require_staff_access)], high_volume_threshold: int=2", - "returns": "dict[str, object]", - "line": 472, - "doc": "", - "decorator": "app.get('/api/v1/civiczone/staff/questions/analytics')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/staff/reports/outline", - "router": "app", - "prefix_resolved": true, - "name": "staff_report_outline", - "signature": "request: StaffReportOutlineRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", - "returns": "dict[str, object]", - "line": 496, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/staff/reports/outline')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civiczone/staff/flagged-answers", - "router": "app", - "prefix_resolved": true, - "name": "create_flagged_answer_review", - "signature": "request: FlaggedAnswerCreateRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", - "returns": "dict[str, object]", - "line": 520, - "doc": "", - "decorator": "app.post('/api/v1/civiczone/staff/flagged-answers')", - "errors": [] + "line": 64 }, { - "method": "PATCH", - "path": "/api/v1/civiczone/staff/flagged-answers/{review_id}/improve", - "router": "app", - "prefix_resolved": true, - "name": "improve_flagged_answer_review", - "signature": "review_id: str, request: FlaggedAnswerImproveRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", - "returns": "dict[str, object]", - "line": 536, - "doc": "", - "decorator": "app.patch('/api/v1/civiczone/staff/flagged-answers/{review_id}/improve')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Flagged answer review was not found.', 'fix': 'Create or list the flagged answer review before submitting improvements.'})" - ] - } - ], - "models": [ - { - "name": "StaffPrincipal", - "bases": [], + "name": "InspectionExportRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "subject", + "name": "title", "type": "str", - "default": "" + "line": 72 }, { - "name": "roles", - "type": "tuple[str, ...]", - "default": "" + "name": "case_id", + "type": "str", + "line": 73 + }, + { + "name": "format", + "type": "str", + "line": 74 } ], - "line": 68, - "doc": "" + "line": 71 }, { - "name": "ParcelLookupRequest", + "name": "InspectionContextRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "parcel_number", - "type": "str | None", - "default": "Field(default=None)" + "name": "inspection_id", + "type": "str", + "line": 78 }, { - "name": "address", - "type": "str | None", - "default": "Field(default=None)" + "name": "property_reference", + "type": "str", + "line": 79 + }, + { + "name": "violation_type", + "type": "str", + "line": 80 + }, + { + "name": "code_context_id", + "type": "str", + "line": 81 + }, + { + "name": "case_context_id", + "type": "str", + "line": 82 + }, + { + "name": "source_date_status", + "type": "str", + "line": 83 } ], - "line": 117, - "doc": "" + "line": 77 }, { - "name": "UseRuleLookupRequest", + "name": "IntegrationMockRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "zone_code", + "name": "scenario", + "type": "str", + "line": 87 + }, + { + "name": "role", + "type": "str", + "line": 88 + }, + { + "name": "code_context_id", + "type": "str", + "line": 89 + }, + { + "name": "case_context_id", + "type": "str", + "line": 90 + }, + { + "name": "official_finding", + "type": "bool", + "line": 91 + }, + { + "name": "citation_issued", + "type": "bool", + "line": 92 + }, + { + "name": "fine_amount", + "type": "str | None", + "line": 93 + }, + { + "name": "photo_analysis_source", "type": "str", - "default": "" + "line": 94 }, { - "name": "use", + "name": "source_date_status", "type": "str", - "default": "" + "line": 95 } ], - "line": 122, - "doc": "" + "line": 86 }, { - "name": "DimensionalRuleLookupRequest", + "name": "EvidenceItemRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "zone_code", + "name": "filename", "type": "str", - "default": "" + "line": 99 }, { - "name": "rule_type", + "name": "media_type", "type": "str", - "default": "" - } - ], - "line": 127, - "doc": "" - }, - { - "name": "ZoneQuestionRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 100 + }, { - "name": "zone_code", + "name": "description", "type": "str", - "default": "Field(min_length=1, max_length=80)" + "line": 101 }, { - "name": "question", + "name": "content_base64", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 102 + }, + { + "name": "sha256", + "type": "str", + "line": 103 } ], - "line": 132, - "doc": "" + "line": 98 }, { - "name": "PlannerReviewRequest", + "name": "EvidenceRetainRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "question", - "type": "str", - "default": "" + "name": "items", + "type": "list[EvidenceItemRequest]", + "line": 107 } ], - "line": 137, - "doc": "" + "line": 106 }, { - "name": "StaffQuestionAnswerRequest", + "name": "MediaAnalysisRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "zone_code", - "type": "str", - "default": "Field(min_length=1, max_length=80)" + "name": "items", + "type": "list[EvidenceItemRequest]", + "line": 111 }, { - "name": "question", + "name": "code_links", + "type": "list[dict[str, str]]", + "line": 112 + }, + { + "name": "inspector_supplied_text", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 113 } ], - "line": 141, - "doc": "" + "line": 110 }, { - "name": "AmbiguityReviewCreateRequest", + "name": "StaffReviewCreateRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "zone_code", + "name": "inspection_id", "type": "str", - "default": "Field(min_length=1, max_length=80)" + "line": 117 }, { - "name": "question", + "name": "property_reference", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 118 }, { "name": "reason", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 119 + }, + { + "name": "report_id", + "type": "str | None", + "line": 120 } ], - "line": 146, - "doc": "" + "line": 116 }, { - "name": "AmbiguityReviewUpdateRequest", + "name": "StaffReviewUpdateRequest", "bases": [ "BaseModel" ], @@ -29569,6108 +28185,5558 @@ { "name": "status", "type": "str", - "default": "Field(min_length=1, max_length=80)" + "line": 124 }, { "name": "assigned_to", "type": "str | None", - "default": "Field(default=None, max_length=255)" + "line": 125 }, { "name": "resolution", "type": "str | None", - "default": "Field(default=None, max_length=1000)" + "line": 126 } ], - "line": 152, - "doc": "" - }, + "line": 123 + } + ], + "configuration": [ { - "name": "StaffReportOutlineRequest", - "bases": [ - "BaseModel" - ], + "environment": "TOWNLIGHT_INSPECTIONS_CASE_DB_URL", + "line": 456 + } + ] + }, + { + "source": "townlight_inspections/media_analysis.py", + "sha256": "b976ff774c8bb158346a34cd1976dc2d6b553bdef7c0f435808c133c6d062dd1", + "bytes": 14084, + "routes": [], + "models": [ + { + "name": "RetainedEvidence", + "bases": [], "fields": [ { - "name": "title", + "name": "filename", "type": "str", - "default": "Field(min_length=1, max_length=255)" - }, - { - "name": "question_ids", - "type": "list[str]", - "default": "Field(default_factory=list)" + "line": 58 }, { - "name": "queue_item_ids", - "type": "list[str]", - "default": "Field(default_factory=list)" - } - ], - "line": 158, - "doc": "" - }, - { - "name": "FlaggedAnswerCreateRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "zone_code", + "name": "media_type", "type": "str", - "default": "Field(min_length=1, max_length=80)" + "line": 59 }, { - "name": "question", + "name": "description", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 60 }, { - "name": "original_answer", - "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "name": "size_bytes", + "type": "int", + "line": 61 }, { - "name": "flag_reason", + "name": "sha256", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 62 }, { - "name": "citations", - "type": "list[str]", - "default": "Field(default_factory=list)" + "name": "raw", + "type": "bytes", + "line": 63 } ], - "line": 164, - "doc": "" + "line": 55 }, { - "name": "FlaggedAnswerImproveRequest", + "name": "VisionProvider", "bases": [ - "BaseModel" + "Protocol" ], "fields": [ { - "name": "improved_answer", + "name": "name", "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "line": 113 }, { - "name": "improvement_notes", - "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "name": "supports_images", + "type": "bool", + "line": 114 } ], - "line": 172, - "doc": "" + "line": 110 }, { - "name": "DiscretionaryExplanationRequest", + "name": "TranscriptionProvider", "bases": [ - "BaseModel" + "Protocol" ], "fields": [ { - "name": "process_section", + "name": "name", "type": "str", - "default": "Field(default='', max_length=255)" + "line": 124 + } + ], + "line": 121 + }, + { + "name": "MediaAnalysis", + "bases": [], + "fields": [ + { + "name": "draft_observations", + "type": "list[dict[str, Any]]", + "line": 142 }, { - "name": "question", - "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "name": "cited_sections", + "type": "list[dict[str, str]]", + "line": 143 }, { - "name": "zone_code", - "type": "str", - "default": "Field(default='', max_length=20)" + "name": "unavailable", + "type": "list[dict[str, str]]", + "line": 144 }, { - "name": "rule_types", - "type": "list[str]", - "default": "Field(default_factory=list, max_length=12)" + "name": "retained", + "type": "list[dict[str, Any]]", + "line": 145 }, { - "name": "observed", - "type": "dict[str, str]", - "default": "Field(default_factory=dict)" + "name": "runtime", + "type": "dict[str, Any]", + "line": 146 + }, + { + "name": "review_required", + "type": "bool", + "line": 147 + }, + { + "name": "determination_made", + "type": "bool", + "line": 148 + }, + { + "name": "boundary", + "type": "str", + "line": 149 } ], - "line": 274, - "doc": "" + "line": 139 } ], - "configuration": [ - { - "variable": "CIVICZONE_PARCEL_RULE_DB_URL", - "default": "", - "line": 559 - } - ] - }, - { - "source": "installed-owned-source/civiczone/migrations/__init__.py", - "sha256": "38cbccb2471a214eac40f174b618d28d0367c43a0e66d3eb5807dad737142765", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/migrations/env.py", - "sha256": "3baae8fbf8726f8811647eb75d257e310d2d9660b0150833f17220dd8fa431ba", - "routes": [], - "models": [], - "configuration": [ - { - "variable": "DATABASE_URL", - "default": "", - "line": 22 - } - ] - }, - { - "source": "installed-owned-source/civiczone/migrations/guards.py", - "sha256": "9346e9812f238cfee1bdd21f5487fb5c51ee4cabeda45da9aaed6ac2db9b5f7c", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/migrations/versions/__init__.py", - "sha256": "a1087a2a3cedf40641ab02c8e97838630305726600105ad59e30727b61a2f95d", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/migrations/versions/civiczone_0001_schema.py", - "sha256": "0a6985e6fda034f4e654e63f2cb47610bf2af75dd028fc8f43473604550a2a18", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/migrations/versions/civiczone_0002_parcel_rule_lookup_records.py", - "sha256": "8a473e69469f9fdbca5adefcdb7e9a41d50850f1a7460381691da5a4f137314d", - "routes": [], - "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiczone/migrations/versions/civiczone_0003_question_ledger.py", - "sha256": "fd654ca0d15832acb727b88ece26acce25cb45da1ff8b438152ad7c766df0abc", + "source": "townlight_inspections/migrations/__init__.py", + "sha256": "80c59209c59d5bc08d3c46e01a38ec9afef712d6e660c9d3842684be9c7bacf9", + "bytes": 1879, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiczone/migrations/versions/civiczone_0004_staff_workflows.py", - "sha256": "3c0a145ff691077453b65413f2f08a6b7107a55f3ff21c072a8bc3788028b952", + "source": "townlight_inspections/migrations/env.py", + "sha256": "a3a7ca12e132a15db797733d493de4b07f6596cf3e92127b12102c3b0c7ae1ec", + "bytes": 442, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiczone/migrations/versions/civiczone_0005_geo_import.py", - "sha256": "8d4c34c15197ddc856c712d7fb8f9005cb553a2befd38a093a2c952a321d20ce", + "source": "townlight_inspections/migrations/versions/townlight_inspections_0001_connected.py", + "sha256": "1f8aaf5660480513bf538ee1b4145e287f4fd29f4495ce3fdf6f0c13ee030494", + "bytes": 1350, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civiczone/migrations/versions/civiczone_0006_cited_questions.py", - "sha256": "65b8c591b5adf3f0022720a2c4e780c818f0f4b5b51db83b81cab78edb2a1f9d", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/models.py", - "sha256": "206d16a1b4aa343eceee7bb25bdf39411f2b57e947a98a8be45607664635aba9", + "source": "townlight_inspections/notice_draft.py", + "sha256": "30a230f05dc3b31aad29dc1389ec713af4ee89ca306a8b30ed39cf60d4db6417", + "bytes": 1831, "routes": [], "models": [ { - "name": "TimestampMixin", + "name": "NoticeDraft", "bases": [], "fields": [ { - "name": "created_at", - "type": "Mapped[object]", - "default": "mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())" + "name": "case_id", + "type": "str", + "line": 12 }, { - "name": "updated_at", - "type": "Mapped[object]", - "default": "mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())" + "name": "property_reference", + "type": "str", + "line": 13 + }, + { + "name": "heading", + "type": "str", + "line": 14 + }, + { + "name": "draft_body", + "type": "str", + "line": 15 + }, + { + "name": "required_staff_actions", + "type": "tuple[str, ...]", + "line": 16 + }, + { + "name": "disclaimer", + "type": "str", + "line": 17 } ], - "line": 12, - "doc": "" - }, + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_inspections/persistence.py", + "sha256": "0145cd2f96215ca17f9d6bbb5f1249777e9f9e87ab23863792be4deb4b05458a", + "bytes": 14471, + "routes": [], + "models": [ { - "name": "IdMixin", + "name": "StoredInspectionReport", "bases": [], "fields": [ { - "name": "id", - "type": "Mapped[uuid.UUID]", - "default": "mapped_column(UUID(as_uuid=True), primary_key=True, server_default=text('gen_random_uuid()'))" - } - ], - "line": 21, - "doc": "" - }, - { - "name": "Zone", - "bases": [ - "IdMixin", - "TimestampMixin", - "Base" - ], - "fields": [ + "name": "report_id", + "type": "str", + "line": 71 + }, { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" + "name": "inspection_id", + "type": "str", + "line": 72 }, { - "name": "code", - "type": "Mapped[str]", - "default": "mapped_column(String(80), nullable=False)" + "name": "property_reference", + "type": "str", + "line": 73 }, { - "name": "name", - "type": "Mapped[str]", - "default": "mapped_column(String(255), nullable=False)" + "name": "summary", + "type": "str", + "line": 74 }, { - "name": "description", - "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "name": "observation_bullets", + "type": "tuple[str, ...]", + "line": 75 }, { - "name": "jurisdiction", - "type": "Mapped[str]", - "default": "mapped_column(String(255), nullable=False)" + "name": "inspector_review_required", + "type": "bool", + "line": 76 }, { - "name": "source_section_ref", - "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" + "name": "disclaimer", + "type": "str", + "line": 77 }, { - "name": "is_active", - "type": "Mapped[bool]", - "default": "mapped_column(Boolean, nullable=False, server_default=text('true'))" + "name": "created_at", + "type": "datetime", + "line": 78 } ], - "line": 27, - "doc": "" + "line": 70 }, { - "name": "Overlay", - "bases": [ - "IdMixin", - "TimestampMixin", - "Base" - ], + "name": "StaffReviewQueueItem", + "bases": [], "fields": [ { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" + "name": "review_id", + "type": "str", + "line": 83 }, { - "name": "code", - "type": "Mapped[str]", - "default": "mapped_column(String(80), nullable=False)" + "name": "report_id", + "type": "str | None", + "line": 84 }, { - "name": "name", - "type": "Mapped[str]", - "default": "mapped_column(String(255), nullable=False)" + "name": "inspection_id", + "type": "str", + "line": 85 }, { - "name": "description", - "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "name": "property_reference", + "type": "str", + "line": 86 }, { - "name": "source_section_ref", - "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" + "name": "status", + "type": "str", + "line": 87 }, { - "name": "is_active", - "type": "Mapped[bool]", - "default": "mapped_column(Boolean, nullable=False, server_default=text('true'))" - } - ], - "line": 39, - "doc": "" - }, - { - "name": "Parcel", - "bases": [ - "IdMixin", - "TimestampMixin", - "Base" - ], - "fields": [ - { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" + "name": "reason", + "type": "str", + "line": 88 }, { - "name": "parcel_number", - "type": "Mapped[str]", - "default": "mapped_column(String(120), nullable=False)" + "name": "assigned_to", + "type": "str | None", + "line": 89 }, { - "name": "address", - "type": "Mapped[str]", - "default": "mapped_column(String(500), nullable=False)" + "name": "resolution", + "type": "str | None", + "line": 90 }, { - "name": "zone_id", - "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('civiczone.zones.id'), nullable=False)" + "name": "created_by", + "type": "str", + "line": 91 }, { - "name": "overlay_payload", - "type": "Mapped[dict]", - "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'[]'::jsonb\"))" + "name": "created_at", + "type": "datetime", + "line": 92 }, { - "name": "geometry_ref", - "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "name": "updated_at", + "type": "datetime", + "line": 93 }, { - "name": "source_payload", - "type": "Mapped[dict]", - "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'{}'::jsonb\"))" + "name": "visibility", + "type": "str", + "line": 94 } ], - "line": 50, - "doc": "" + "line": 82 }, { - "name": "UseCategory", - "bases": [ - "IdMixin", - "TimestampMixin", - "Base" - ], + "name": "StaffReviewSummary", + "bases": [], "fields": [ { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" + "name": "total_items", + "type": "int", + "line": 99 }, { - "name": "code", - "type": "Mapped[str]", - "default": "mapped_column(String(120), nullable=False)" + "name": "by_status", + "type": "dict[str, int]", + "line": 100 }, { - "name": "label", - "type": "Mapped[str]", - "default": "mapped_column(String(255), nullable=False)" + "name": "open_items", + "type": "int", + "line": 101 }, { - "name": "description", - "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "name": "generated_at", + "type": "datetime", + "line": 102 + }, + { + "name": "visibility", + "type": "str", + "line": 103 } ], - "line": 62, - "doc": "" - }, + "line": 98 + } + ], + "configuration": [] + }, + { + "source": "townlight_inspections/public_ui.py", + "sha256": "c14bd5b3d45dc1434edeffb931cd6abb8804bff675989769c8eb89c85a46f965", + "bytes": 8120, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_inspections/records_export.py", + "sha256": "6adcb9a04cbff7d9d455f41598a0bdb1dfd736aa13f439a61f1e2ed98f8b49bb", + "bytes": 1178, + "routes": [], + "models": [ { - "name": "UseRule", - "bases": [ - "IdMixin", - "TimestampMixin", - "Base" - ], + "name": "InspectionExport", + "bases": [], "fields": [ { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" - }, - { - "name": "zone_id", - "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('civiczone.zones.id'), nullable=False)" - }, - { - "name": "use_category_id", - "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('civiczone.use_categories.id'), nullable=False)" + "name": "title", + "type": "str", + "line": 10 }, { - "name": "status", - "type": "Mapped[str]", - "default": "mapped_column(String(80), nullable=False)" + "name": "case_id", + "type": "str", + "line": 11 }, { - "name": "review_path", - "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" + "name": "format", + "type": "str", + "line": 12 }, { - "name": "source_section_ref", - "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" + "name": "checklist", + "type": "tuple[str, ...]", + "line": 13 }, { - "name": "conditions", - "type": "Mapped[dict]", - "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'[]'::jsonb\"))" + "name": "retention_note", + "type": "str", + "line": 14 } ], - "line": 71, - "doc": "" - }, + "line": 9 + } + ], + "configuration": [] + }, + { + "source": "townlight_inspections/report_draft.py", + "sha256": "9de0986afe2e0aee2e39e913af1ea6dd7b8f37c91f0b26d4294566fbc0f0a03c", + "bytes": 2420, + "routes": [], + "models": [ { - "name": "DimensionalRule", - "bases": [ - "IdMixin", - "TimestampMixin", - "Base" - ], + "name": "InspectionReportDraft", + "bases": [], "fields": [ { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" - }, - { - "name": "zone_id", - "type": "Mapped[uuid.UUID]", - "default": "mapped_column(ForeignKey('civiczone.zones.id'), nullable=False)" - }, - { - "name": "rule_type", - "type": "Mapped[str]", - "default": "mapped_column(String(120), nullable=False)" - }, - { - "name": "value_text", - "type": "Mapped[str]", - "default": "mapped_column(String(255), nullable=False)" + "name": "inspection_id", + "type": "str", + "line": 12 }, { - "name": "source_section_ref", - "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" + "name": "property_reference", + "type": "str", + "line": 13 }, { - "name": "applies_to", - "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" - } - ], - "line": 85, - "doc": "" - }, - { - "name": "Citation", - "bases": [ - "IdMixin", - "TimestampMixin", - "Base" - ], - "fields": [ - { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" + "name": "summary", + "type": "str", + "line": 14 }, { - "name": "source_section_ref", - "type": "Mapped[str]", - "default": "mapped_column(String(255), nullable=False)" + "name": "observation_bullets", + "type": "tuple[str, ...]", + "line": 15 }, { - "name": "citation_text", - "type": "Mapped[str]", - "default": "mapped_column(String(500), nullable=False)" + "name": "inspector_review_required", + "type": "bool", + "line": 16 }, { - "name": "url", - "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "name": "cited_sections", + "type": "tuple[str, ...]", + "line": 17 }, { - "name": "retrieved_at", - "type": "Mapped[object | None]", - "default": "mapped_column(DateTime(timezone=True))" + "name": "disclaimer", + "type": "str", + "line": 18 } ], - "line": 96, - "doc": "" + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_inspections/transcription.py", + "sha256": "632f91d1c28aa4ed00c383cec0fd903cbaba42734b99f08fd67d4f384a263ab1", + "bytes": 6488, + "routes": [], + "models": [], + "configuration": [ + { + "environment": "TOWNLIGHT_INSPECTIONS_FFMPEG", + "line": 53 }, { - "name": "Precedent", + "environment": "TOWNLIGHT_INSPECTIONS_TEXTFLOWKIT_PYTHON", + "line": 49 + } + ] + }, + { + "source": "townlight_inspections/workflow_models.py", + "sha256": "8f2a9ee259a26d05c35efa1e63225094934256922e2477337c15ca987119d5e7", + "bytes": 7436, + "routes": [], + "models": [ + { + "name": "AnalysisObservation", "bases": [ - "IdMixin", - "TimestampMixin", - "Base" + "Model" ], "fields": [ { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" + "name": "source", + "type": "str", + "line": 26 }, { - "name": "title", - "type": "Mapped[str]", - "default": "mapped_column(String(500), nullable=False)" + "name": "filename", + "type": "str", + "line": 27 }, { - "name": "body", - "type": "Mapped[str]", - "default": "mapped_column(Text, nullable=False)" + "name": "media_type", + "type": "str", + "line": 28 }, { - "name": "visibility", - "type": "Mapped[str]", - "default": "mapped_column(String(80), nullable=False)" + "name": "text", + "type": "str", + "line": 29 }, { - "name": "source_ref", - "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" + "name": "adapter", + "type": "str", + "line": 30 }, { - "name": "tags", - "type": "Mapped[dict]", - "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'[]'::jsonb\"))" + "name": "citation_source_ids", + "type": "list[str]", + "line": 31 } ], - "line": 106, - "doc": "" + "line": 23 }, { - "name": "InterpretationNote", + "name": "CitedSection", "bases": [ - "IdMixin", - "TimestampMixin", - "Base" + "Model" ], "fields": [ { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" - }, - { - "name": "zone_id", - "type": "Mapped[uuid.UUID | None]", - "default": "mapped_column(ForeignKey('civiczone.zones.id'))" + "name": "source_id", + "type": "str", + "line": 43 }, { - "name": "note_text", - "type": "Mapped[str]", - "default": "mapped_column(Text, nullable=False)" + "name": "citation", + "type": "str", + "line": 44 }, { - "name": "visibility", - "type": "Mapped[str]", - "default": "mapped_column(String(80), nullable=False)" + "name": "title", + "type": "str", + "line": 45 }, { - "name": "status", - "type": "Mapped[str]", - "default": "mapped_column(String(80), nullable=False)" + "name": "version", + "type": "str", + "line": 46 } ], - "line": 117, - "doc": "" + "line": 40 }, { - "name": "ZoneQuestion", + "name": "AnalysisRecord", "bases": [ - "IdMixin", - "TimestampMixin", - "Base" + "Model" ], "fields": [ { - "name": "__table_args__", - "type": "ClassVar[dict]", - "default": "{'schema': 'civiczone'}" - }, - { - "name": "question_text", - "type": "Mapped[str]", - "default": "mapped_column(Text, nullable=False)" - }, - { - "name": "audience", - "type": "Mapped[str]", - "default": "mapped_column(String(80), nullable=False)" + "name": "observations", + "type": "list[AnalysisObservation]", + "line": 52 }, { - "name": "status", - "type": "Mapped[str]", - "default": "mapped_column(String(80), nullable=False)" + "name": "cited_sections", + "type": "list[CitedSection]", + "line": 53 }, { - "name": "answer_text", - "type": "Mapped[str | None]", - "default": "mapped_column(Text)" + "name": "unavailable", + "type": "list[str]", + "line": 54 }, { - "name": "citation_payload", - "type": "Mapped[dict]", - "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'[]'::jsonb\"))" + "name": "runtime", + "type": "dict", + "line": 55 }, { - "name": "escalation_reason", - "type": "Mapped[str | None]", - "default": "mapped_column(String(255))" + "name": "review_required", + "type": "bool", + "line": 56 } ], - "line": 127, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/parcel_lookup.py", - "sha256": "3629424d9af4d5ac514f285835f9b8179c1cf6ceb22d586576603a270edb5671", - "routes": [], - "models": [ + "line": 49 + }, { - "name": "ParcelLookupResult", - "bases": [], + "name": "Evidence", + "bases": [ + "Model" + ], "fields": [ { - "name": "parcel_number", - "type": "str", - "default": "" - }, - { - "name": "address", - "type": "str", - "default": "" - }, - { - "name": "zone_code", + "name": "filename", "type": "str", - "default": "" + "line": 94 }, { - "name": "zone_name", + "name": "description", "type": "str", - "default": "" + "line": 95 }, { - "name": "overlays", - "type": "tuple[str, ...]", - "default": "" - }, - { - "name": "constraints", - "type": "tuple[str, ...]", - "default": "" + "name": "media_type", + "type": "Literal['text/plain', 'image/jpeg', 'image/png', 'image/webp', 'application/pdf', 'audio/webm', 'audio/ogg', 'audio/wav', 'audio/mpeg', 'audio/mp4']", + "line": 96 }, { - "name": "source", + "name": "content_base64", "type": "str", - "default": "" + "line": 99 }, { - "name": "disclaimer", + "name": "sha256", "type": "str", - "default": "" + "line": 100 } ], - "line": 12, - "doc": "" + "line": 93 }, { - "name": "ParcelLookupError", - "bases": [], + "name": "SourceLink", + "bases": [ + "Model" + ], "fields": [ { - "name": "message", + "name": "provider", + "type": "Literal['code']", + "line": 114 + }, + { + "name": "source_id", "type": "str", - "default": "" + "line": 115 }, { - "name": "fix", + "name": "expected_sha256", "type": "str", - "default": "" + "line": 116 } ], - "line": 24, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/public_ui.py", - "sha256": "75d1542af38b920b5a4527da79af374ade3abf03d7a78f5d9ad2b075790681a5", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/qa.py", - "sha256": "374b232775a482a3a02ce283d047652e0c188f7f856e0046e465d663ef863315", - "routes": [], - "models": [ + "line": 113 + }, { - "name": "ZoneAnswer", - "bases": [], + "name": "InspectionInput", + "bases": [ + "Model" + ], "fields": [ { - "name": "answer", - "type": "str", - "default": "" + "name": "expected_revision", + "type": "UUID | None", + "line": 120 }, { - "name": "citations", - "type": "tuple[str, ...]", - "default": "" + "name": "title", + "type": "str", + "line": 121 }, { - "name": "status", + "name": "property_reference", "type": "str", - "default": "" + "line": 122 }, { - "name": "reason", + "name": "inspection_reference", "type": "str", - "default": "" + "line": 123 }, { - "name": "confidence", - "type": "str", - "default": "" + "name": "dataset_kind", + "type": "Literal['municipal', 'fictional']", + "line": 124 }, { - "name": "next_step", + "name": "inspector_notes", "type": "str", - "default": "" + "line": 125 }, { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" - } - ], - "line": 16, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/question_ledger.py", - "sha256": "0fca91aa0a7338771f760fe9032da442023c3407584d0ee0c621ce0290a65e7b", - "routes": [], - "models": [ - { - "name": "ZoneQuestionLedgerRecord", - "bases": [], - "fields": [ + "name": "photo_observations", + "type": "list[str]", + "line": 126 + }, { - "name": "id", + "name": "voice_notes", "type": "str", - "default": "" + "line": 127 }, { - "name": "zone_code", - "type": "str", - "default": "" + "name": "evidence", + "type": "list[Evidence]", + "line": 128 }, { - "name": "question_text", - "type": "str", - "default": "" + "name": "linked_sources", + "type": "list[SourceLink]", + "line": 129 }, { - "name": "audience", + "name": "assigned_to", "type": "str", - "default": "" + "line": 130 }, { - "name": "status", + "name": "staff_notes", "type": "str", - "default": "" + "line": 131 }, { - "name": "answer_text", - "type": "str | None", - "default": "" + "name": "notice_draft", + "type": "str", + "line": 132 }, { - "name": "citation_payload", - "type": "tuple[str, ...]", - "default": "" + "name": "review_state", + "type": "Literal['draft', 'follow_up', 'reviewed']", + "line": 133 }, { - "name": "disclaimer", + "name": "review_notes", "type": "str", - "default": "" - }, - { - "name": "escalation_reason", - "type": "str | None", - "default": "" + "line": 134 }, { - "name": "created_at", - "type": "datetime", - "default": "" + "name": "public_summary", + "type": "str", + "line": 135 }, { - "name": "updated_at", - "type": "datetime", - "default": "" + "name": "analysis", + "type": "AnalysisRecord | None", + "line": 136 } ], - "line": 32, - "doc": "" + "line": 119 } ], "configuration": [] }, { - "source": "installed-owned-source/civiczone/rule_lookup.py", - "sha256": "5c53135c7a413e0eecf663061593945c56330eae6a96808d61d69bd4e6d996a2", + "source": "townlight_inspections/workflow_schema.py", + "sha256": "1d7b0976826350a2e34671ea569918471848639ea09a571d5b775e9646b9db2a", + "bytes": 2264, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_inspections/workflow_store.py", + "sha256": "1ebe80dee56578f11dd5aeac643a0b899325a2bc250af399600979075fa9911d", + "bytes": 17794, + "routes": [], + "models": [], + "configuration": [] + } + ] + }, + "access": { + "repository": "townlight/access", + "repository_head": "a70b56263aa0eef26d4021a5e47b5fb0a7ba7e97", + "working_tree_modified": true, + "principal_import": "townlight_access", + "source": [ + { + "source": "townlight_access/__init__.py", + "sha256": "f49d540adddb1dde0dbc6b109c82349cdd0b1af029bb06a6b41c28e799bff0f5", + "bytes": 58, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_access/access_review.py", + "sha256": "511b887896e468aa0954e1a8763d0445d4ba4ea10f2fcf99a462dc725e98746e", + "bytes": 13859, "routes": [], "models": [ { - "name": "UseRuleResult", + "name": "AccessibilityFinding", "bases": [], "fields": [ { - "name": "zone_code", + "name": "code", "type": "str", - "default": "" + "line": 16 }, { - "name": "use", + "name": "severity", "type": "str", - "default": "" + "line": 17 }, { - "name": "status", + "name": "message", "type": "str", - "default": "" + "line": 18 }, { - "name": "review_path", + "name": "fix", "type": "str", - "default": "" + "line": 19 }, { - "name": "citation", + "name": "wcag_reference", + "type": "str", + "line": 20 + } + ], + "line": 15 + }, + { + "name": "AccessibilityReview", + "bases": [], + "fields": [ + { + "name": "status", "type": "str", - "default": "" + "line": 25 + }, + { + "name": "findings", + "type": "tuple[AccessibilityFinding, ...]", + "line": 26 }, { "name": "disclaimer", "type": "str", - "default": "DISCLAIMER" + "line": 27 + }, + { + "name": "next_steps", + "type": "tuple[str, ...]", + "line": 28 } ], - "line": 14, - "doc": "" + "line": 24 }, { - "name": "DimensionalRuleResult", + "name": "StoredAccessibilityReview", "bases": [], "fields": [ { - "name": "zone_code", + "name": "review_id", "type": "str", - "default": "" + "line": 33 }, { - "name": "rule_type", + "name": "title", "type": "str", - "default": "" + "line": 34 }, { - "name": "value", + "name": "body", "type": "str", - "default": "" + "line": 35 }, { - "name": "citation", + "name": "has_alt_text", + "type": "bool", + "line": 36 + }, + { + "name": "language", + "type": "str", + "line": 37 + }, + { + "name": "status", "type": "str", - "default": "" + "line": 38 + }, + { + "name": "findings", + "type": "tuple[AccessibilityFinding, ...]", + "line": 39 }, { "name": "disclaimer", "type": "str", - "default": "DISCLAIMER" + "line": 40 + }, + { + "name": "created_at", + "type": "datetime", + "line": 41 } ], - "line": 24, - "doc": "" + "line": 32 }, { - "name": "RuleLookupError", + "name": "SchemaStatus", "bases": [], "fields": [ { - "name": "message", + "name": "schema_version", + "type": "str | None", + "line": 91 + }, + { + "name": "expected_schema_version", "type": "str", - "default": "" + "line": 92 }, { - "name": "fix", + "name": "ready", + "type": "bool", + "line": 93 + }, + { + "name": "missing_tables", + "type": "tuple[str, ...]", + "line": 94 + }, + { + "name": "dialect", "type": "str", - "default": "" + "line": 95 } ], - "line": 33, - "doc": "" + "line": 90 } ], "configuration": [] }, { - "source": "installed-owned-source/civiczone/staff_context.py", - "sha256": "50784c2b595741098e2de9d9ad90a7957607ae09839afe6167af13e38037c91c", + "source": "townlight_access/db_admin.py", + "sha256": "c9b86df06388061de0646c9c7bc1c6964cdf075113a04fdda3b6a4103aa988c0", + "bytes": 1099, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_access/exports.py", + "sha256": "f6496dc04cae8445a25c779d1556a8026f27dd304d7b1c22325e143faedb48ab", + "bytes": 1793, "routes": [], "models": [ { - "name": "EscalationResult", + "name": "AccessibleExport", "bases": [], "fields": [ { - "name": "status", + "name": "title", "type": "str", - "default": "" + "line": 10 }, { - "name": "reason", + "name": "format", "type": "str", - "default": "" + "line": 11 }, { - "name": "next_step", - "type": "str", - "default": "" - } - ], - "line": 9, - "doc": "" - }, - { - "name": "StaffPrecedent", - "bases": [], - "fields": [ + "name": "checklist", + "type": "tuple[str, ...]", + "line": 12 + }, { - "name": "title", + "name": "retention_note", "type": "str", - "default": "" + "line": 13 }, { - "name": "summary", + "name": "status", "type": "str", - "default": "" + "line": 14 }, { - "name": "visibility", - "type": "str", - "default": "'staff_only'" + "name": "fix", + "type": "str | None", + "line": 15 } ], - "line": 16, - "doc": "" + "line": 9 } ], "configuration": [] }, { - "source": "installed-owned-source/civiczone/staff_ui.py", - "sha256": "69448abc334931b5f19168fdffbef81497e250dd61f1912811d4ebdb28ee0b25", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civiczone/staff_workflows.py", - "sha256": "27cf6da89c7a1472b23cbcace93adb63a0384be443b95228c882eb3bfb0ed642", - "routes": [], + "source": "townlight_access/main.py", + "sha256": "0eb87c6acb2c97e6c43f928a457bb226a826d807a8bc3c5afc347bf88c8daf8e", + "bytes": 18671, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 87 + }, + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 103 + }, + { + "method": "GET", + "declared_path": "/ready", + "function": "ready", + "line": 142 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_access/readiness", + "function": "readiness", + "line": 149 + }, + { + "method": "GET", + "declared_path": "/townlight_access", + "function": "public_townlight_access_page", + "line": 156 + }, + { + "method": "GET", + "declared_path": "/townlight_access/staff", + "function": "staff_townlight_access_page", + "line": 163 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/analyze", + "function": "analyze_accessibility", + "line": 173 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/review", + "function": "accessibility_review", + "line": 192 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_access/reviews", + "function": "list_accessibility_reviews", + "line": 207 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_access/reviews/{review_id}", + "function": "get_accessibility_review", + "line": 217 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/reviews/{review_id}/records-export", + "function": "export_accessibility_review_record", + "line": 231 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_access/integration-contracts", + "function": "integration_contracts", + "line": 278 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/plain-language", + "function": "plain_language_rewrite", + "line": 307 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/language-variant", + "function": "language_variant", + "line": 313 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/forms", + "function": "accessible_form", + "line": 319 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/publishing-workflow", + "function": "publishing_workflow", + "line": 331 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/ada-title-ii", + "function": "ada_title_ii_review", + "line": 348 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/tagged-pdf", + "function": "tagged_pdf_expectations", + "line": 363 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_access/export", + "function": "accessible_export", + "line": 374 + } + ], "models": [ { - "name": "CodeCrossReference", - "bases": [], + "name": "AccessibilityReviewRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "citation", + "name": "title", "type": "str", - "default": "" + "line": 45 }, { - "name": "source", + "name": "body", "type": "str", - "default": "" + "line": 46 }, { - "name": "relevance", + "name": "has_alt_text", + "type": "bool", + "line": 47 + }, + { + "name": "language", "type": "str", - "default": "" + "line": 48 } ], - "line": 80, - "doc": "" + "line": 44 }, { - "name": "StaffQuestionRecord", - "bases": [], + "name": "PlainLanguageRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "id", + "name": "text", "type": "str", - "default": "" - }, + "line": 52 + } + ], + "line": 51 + }, + { + "name": "LanguageVariantRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "zone_code", + "name": "text", "type": "str", - "default": "" + "line": 56 }, { - "name": "question_text", + "name": "language", "type": "str", - "default": "" - }, + "line": 57 + } + ], + "line": 55 + }, + { + "name": "AccessibleExportRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "status", + "name": "title", "type": "str", - "default": "" + "line": 61 }, { - "name": "answer_text", + "name": "format", "type": "str", - "default": "" - }, + "line": 62 + } + ], + "line": 60 + }, + { + "name": "AccessibleFormRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "citations", - "type": "tuple[str, ...]", - "default": "" + "name": "form_name", + "type": "str", + "line": 66 }, { - "name": "code_cross_references", - "type": "tuple[CodeCrossReference, ...]", - "default": "" - }, + "name": "fields", + "type": "list[str]", + "line": 67 + } + ], + "line": 65 + }, + { + "name": "PublishingWorkflowRequest", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "created_by", + "name": "title", "type": "str", - "default": "" + "line": 71 }, { - "name": "created_at", - "type": "datetime", - "default": "" + "name": "has_review", + "type": "bool", + "line": 72 }, { - "name": "visibility", + "name": "has_plain_language", + "type": "bool", + "line": 73 + }, + { + "name": "has_translation_review", + "type": "bool", + "line": 74 + } + ], + "line": 70 + }, + { + "name": "AdaTitleIiReviewRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "service_area", "type": "str", - "default": "STAFF_VISIBILITY" + "line": 78 }, { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" + "name": "has_coordinator_review", + "type": "bool", + "line": 79 + } + ], + "line": 77 + }, + { + "name": "TaggedPdfExpectationRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "heading_levels", + "type": "list[int]", + "line": 83 } ], - "line": 87, - "doc": "" + "line": 82 + } + ], + "configuration": [ + { + "environment": "TOWNLIGHT_ACCESS_TRUSTED_WRITE_TOKEN", + "line": 387 }, { - "name": "AmbiguityReviewItem", + "environment": "TOWNLIGHT_ACCESS_REVIEW_DB_URL", + "line": 427 + }, + { + "environment": "DATABASE_URL", + "line": 431 + }, + { + "environment": "TOWNLIGHT_ACCESS_DATA_DIR", + "line": 435 + } + ] + }, + { + "source": "townlight_access/multilingual.py", + "sha256": "49903d5b7cddc2453fe99989e519306d4ac1796e8a45713cae0651c00aae9be6", + "bytes": 1630, + "routes": [], + "models": [ + { + "name": "LanguageVariant", "bases": [], "fields": [ { - "name": "id", + "name": "source_text", "type": "str", - "default": "" + "line": 12 }, { - "name": "zone_code", + "name": "language", "type": "str", - "default": "" + "line": 13 }, { - "name": "question_text", + "name": "text", "type": "str", - "default": "" + "line": 14 }, { - "name": "reason", - "type": "str", - "default": "" + "name": "review_required", + "type": "bool", + "line": 15 }, { "name": "status", "type": "str", - "default": "" - }, - { - "name": "assigned_to", - "type": "str | None", - "default": "" - }, - { - "name": "resolution", - "type": "str | None", - "default": "" - }, - { - "name": "source_question_id", - "type": "str | None", - "default": "" + "line": 16 }, { - "name": "created_by", + "name": "fix", "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "" + "line": 17 }, { - "name": "updated_at", - "type": "datetime", - "default": "" + "name": "translation_performed", + "type": "bool", + "line": 18 }, { - "name": "visibility", + "name": "disclaimer", "type": "str", - "default": "STAFF_VISIBILITY" + "line": 19 } ], - "line": 102, - "doc": "" - }, + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_access/plain_language.py", + "sha256": "7677832cee72ad515490486489749b41f0a209fc66a75fb76e7a7190bf69ca26", + "bytes": 1420, + "routes": [], + "models": [ { - "name": "HighVolumeQuestion", + "name": "PlainLanguageRewrite", "bases": [], "fields": [ { - "name": "zone_code", + "name": "original", "type": "str", - "default": "" + "line": 12 }, { - "name": "question_text", + "name": "rewritten", "type": "str", - "default": "" + "line": 13 }, { - "name": "count", - "type": "int", - "default": "" + "name": "reading_level", + "type": "str", + "line": 14 }, { - "name": "statuses", + "name": "review_required", + "type": "bool", + "line": 15 + }, + { + "name": "provenance", "type": "tuple[str, ...]", - "default": "" + "line": 16 }, { - "name": "latest_question_id", + "name": "disclaimer", "type": "str", - "default": "" + "line": 17 } ], - "line": 118, - "doc": "" - }, + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_access/public_ui.py", + "sha256": "78168321622a780a4d373b35432668daad0d5f6a0a3f011c8e41862c9998068e", + "bytes": 20623, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_access/record_artifact.py", + "sha256": "57d8966dbdbd0764b323355fdca5ef6ff52f7ca86594f22926b2ffa96f4b8d29", + "bytes": 985, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_access/workflows.py", + "sha256": "87d7787f658c9cb43ff2bee670ad78e532d836944ba4d26bdbc15b5b9c66f860", + "bytes": 5913, + "routes": [], + "models": [ { - "name": "StaffQuestionAnalytics", + "name": "AccessibleFormPlan", "bases": [], "fields": [ { - "name": "total_questions", - "type": "int", - "default": "" + "name": "status", + "type": "str", + "line": 12 }, { - "name": "by_status", - "type": "dict[str, int]", - "default": "" + "name": "missing_fields", + "type": "tuple[str, ...]", + "line": 13 }, { - "name": "high_volume_questions", - "type": "tuple[HighVolumeQuestion, ...]", - "default": "" + "name": "checklist", + "type": "tuple[str, ...]", + "line": 14 }, { - "name": "generated_at", - "type": "datetime", - "default": "" + "name": "fix", + "type": "str | None", + "line": 15 }, { - "name": "visibility", + "name": "disclaimer", "type": "str", - "default": "STAFF_VISIBILITY" + "line": 16 } ], - "line": 127, - "doc": "" + "line": 11 }, { - "name": "StaffReportOutline", + "name": "PublishingWorkflowPlan", "bases": [], "fields": [ { - "name": "id", - "type": "str", - "default": "" - }, - { - "name": "title", + "name": "status", "type": "str", - "default": "" - }, - { - "name": "sections", - "type": "tuple[dict[str, object], ...]", - "default": "" + "line": 21 }, { - "name": "source_question_ids", + "name": "steps", "type": "tuple[str, ...]", - "default": "" + "line": 22 }, { - "name": "source_queue_item_ids", + "name": "blockers", "type": "tuple[str, ...]", - "default": "" - }, - { - "name": "created_by", - "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "" + "line": 23 }, { - "name": "visibility", - "type": "str", - "default": "STAFF_VISIBILITY" + "name": "fix", + "type": "str | None", + "line": 24 }, { "name": "disclaimer", "type": "str", - "default": "'Draft staff outline only; verify citations before publication.'" + "line": 25 } ], - "line": 136, - "doc": "" + "line": 20 }, { - "name": "FlaggedAnswerReview", + "name": "AdaTitleIiReviewPlan", "bases": [], "fields": [ { - "name": "id", + "name": "status", "type": "str", - "default": "" + "line": 30 }, { - "name": "zone_code", - "type": "str", - "default": "" + "name": "checklist", + "type": "tuple[str, ...]", + "line": 31 }, { - "name": "question_text", - "type": "str", - "default": "" + "name": "reviewer_required", + "type": "bool", + "line": 32 }, { - "name": "original_answer", - "type": "str", - "default": "" + "name": "fix", + "type": "str | None", + "line": 33 }, { - "name": "flag_reason", + "name": "disclaimer", "type": "str", - "default": "" - }, - { - "name": "citations", - "type": "tuple[str, ...]", - "default": "" - }, + "line": 34 + } + ], + "line": 29 + }, + { + "name": "TaggedPdfExpectationPlan", + "bases": [], + "fields": [ { "name": "status", "type": "str", - "default": "" + "line": 39 }, { - "name": "improved_answer", - "type": "str | None", - "default": "" - }, - { - "name": "improvement_notes", - "type": "str | None", - "default": "" + "name": "checklist", + "type": "tuple[str, ...]", + "line": 40 }, { - "name": "reviewed_by", + "name": "fix", "type": "str | None", - "default": "" - }, - { - "name": "created_by", - "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "" - }, - { - "name": "updated_at", - "type": "datetime", - "default": "" + "line": 41 }, { - "name": "visibility", + "name": "disclaimer", "type": "str", - "default": "STAFF_VISIBILITY" + "line": 42 } ], - "line": 149, - "doc": "" + "line": 38 } ], "configuration": [] } - ], - "bridge": [ + ] + }, + "notice": { + "repository": "townlight/notice", + "repository_head": "6c7bc4435cdd700fd4673486d3c7b3794d5def82", + "working_tree_modified": true, + "principal_import": "townlight_notice", + "source": [ { - "source": "installed-owned-source/civicsuite_runtime/zoning_bridge.py", - "sha256": "eb80d79ffc4fc736789aab4f3d3b75a4d9d01101d6414a69a29053c7d5f90505", - "routes": [ - { - "method": "POST", - "path": "/desktop/v1/zoning/imports", - "router": "router", - "prefix_resolved": true, - "name": "imports", - "signature": "payload: dict, actor_id: str=Depends(actor)", - "returns": "", - "line": 68, - "doc": "", - "decorator": "router.post('/imports')", - "errors": [ - "HTTPException(422, detail)", - "HTTPException(503, 'Zoning persistence unavailable.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/parcels/lookup", - "router": "router", - "prefix_resolved": true, - "name": "parcel_lookup", - "signature": "body: _ParcelLookupIn, _actor: str=Depends(actor)", - "returns": "", - "line": 91, - "doc": "", - "decorator": "router.post('/parcels/lookup')", - "errors": [ - "HTTPException(503, 'Townlight Code database/schema is not ready; no determination.')", - "HTTPException(503, 'Zoning persistence unavailable.')" - ] - }, - { - "method": "GET", - "path": "/desktop/v1/zoning/questions/{question_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "question_history", - "signature": "question_id: UUID, actor_id=Depends(actor), provider=Depends(meeting_provider)", - "returns": "", - "line": 209, - "doc": "", - "decorator": "router.get('/questions/{question_id}/history')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/meetings/search", - "router": "router", - "prefix_resolved": true, - "name": "search_meetings", - "signature": "p: MeetingSearch, actor_id=Depends(actor), provider=Depends(meeting_provider)", - "returns": "", - "line": 216, - "doc": "", - "decorator": "router.post('/meetings/search')", - "errors": [ - "HTTPException(status_code=503, detail='Meeting search unavailable')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/questions/{question_id}/meetings", - "router": "router", - "prefix_resolved": true, - "name": "link_meeting", - "signature": "question_id: UUID, p: MeetingLink, actor_id=Depends(actor), provider=Depends(meeting_provider)", - "returns": "", - "line": 242, - "doc": "", - "decorator": "router.post('/questions/{question_id}/meetings')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/questions/{question_id}/snapshots", - "router": "router", - "prefix_resolved": true, - "name": "create_snapshot", - "signature": "question_id: UUID, p: SourceSnapshot, actor_id=Depends(actor), provider=Depends(meeting_provider)", - "returns": "", - "line": 259, - "doc": "", - "decorator": "router.post('/questions/{question_id}/snapshots')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/rules", - "router": "router", - "prefix_resolved": true, - "name": "create_rule", - "signature": "p: Rule, actor_id=Depends(actor)", - "returns": "", - "line": 291, - "doc": "", - "decorator": "router.post('/rules')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/questions", - "router": "router", - "prefix_resolved": true, - "name": "create_question", - "signature": "p: Question, actor_id=Depends(actor)", - "returns": "", - "line": 300, - "doc": "", - "decorator": "router.post('/questions')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/zoning/workspace", - "router": "router", - "prefix_resolved": true, - "name": "get_workspace", - "signature": "actor_id=Depends(actor)", - "returns": "", - "line": 313, - "doc": "", - "decorator": "router.get('/workspace')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/questions/{question_id}/reviews", - "router": "router", - "prefix_resolved": true, - "name": "create_review", - "signature": "question_id: UUID, p: Review, actor_id=Depends(actor)", - "returns": "", - "line": 318, - "doc": "", - "decorator": "router.post('/questions/{question_id}/reviews')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/outlines", - "router": "router", - "prefix_resolved": true, - "name": "create_outline", - "signature": "p: Outline, actor_id=Depends(actor)", - "returns": "", - "line": 325, - "doc": "", - "decorator": "router.post('/outlines')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/code-context", - "router": "router", - "prefix_resolved": true, - "name": "create_code_context", - "signature": "p: CodeContext, actor_id=Depends(actor)", - "returns": "", - "line": 332, - "doc": "", - "decorator": "router.post('/code-context')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/zoning/standards/process-explanation", - "router": "router", - "prefix_resolved": true, - "name": "standards_explanation", - "signature": "p: StandardsExplanation, actor_id=Depends(actor)", - "returns": "", - "line": 373, - "doc": "Cited variance/CUP/nonconformity process; never a determination.", - "decorator": "router.post('/standards/process-explanation')", - "errors": [ - "HTTPException(422, f\"Unknown rule type '{rule_type}'.\")" - ] - }, - { - "method": "POST", - "path": "/civiczone/questions", - "router": "public_router", - "prefix_resolved": true, - "name": "public_question", - "signature": "p: Question", - "returns": "", - "line": 423, - "doc": "", - "decorator": "public_router.post('/questions', dependencies=[Depends(public_active)])", - "errors": [] - }, - { - "method": "POST", - "path": "/civiczone/parcels/lookup", - "router": "public_router", - "prefix_resolved": true, - "name": "public_parcel_lookup", - "signature": "p: _ParcelLookupIn", - "returns": "", - "line": 434, - "doc": "", - "decorator": "public_router.post('/parcels/lookup', dependencies=[Depends(public_active)])", - "errors": [] - } - ], + "source": "townlight_notice/__init__.py", + "sha256": "cdce8d39689ef3269af032210d1990198318fdbe04f6eb0a739241f347102890", + "bytes": 64, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_notice/accessibility_review.py", + "sha256": "a2f9463a4362b03ef0b2a41d00c0991a0e99346d2cf8b64c6909bf06328fb23f", + "bytes": 3448, + "routes": [], "models": [ { - "name": "_ParcelLookupIn", - "bases": [ - "BaseModel" - ], + "name": "NoticeAccessibilityReview", + "bases": [], "fields": [ { - "name": "jurisdiction", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 12 }, { - "name": "query", + "name": "title", "type": "str", - "default": "Field(min_length=1, max_length=500)" - } - ], - "line": 60, - "doc": "" - }, - { - "name": "Question", - "bases": [ - "Strict" - ], - "fields": [ + "line": 13 + }, { - "name": "jurisdiction", - "type": "str", - "default": "Field(min_length=1, max_length=255)" + "name": "missing_accessibility_items", + "type": "tuple[str, ...]", + "line": 14 }, { - "name": "query", - "type": "str", - "default": "Field(min_length=1, max_length=500)" + "name": "plain_language_flags", + "type": "tuple[str, ...]", + "line": 15 }, { - "name": "question", - "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "name": "translation_tasks", + "type": "tuple[str, ...]", + "line": 16 }, { - "name": "kind", - "type": "Literal['use', 'dimension']", - "default": "" + "name": "attachment_review_required", + "type": "bool", + "line": 17 }, { - "name": "key", - "type": "str", - "default": "Field(min_length=1, max_length=255)" + "name": "staff_review_required", + "type": "bool", + "line": 18 }, { - "name": "audience", - "type": "Literal['resident', 'staff']", - "default": "'resident'" - } - ], - "line": 150, - "doc": "" - }, - { - "name": "Rule", - "bases": [ - "Strict" + "name": "review_notes", + "type": "tuple[str, ...]", + "line": 19 + }, + { + "name": "disclaimer", + "type": "str", + "line": 20 + } ], + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_notice/archive_packet.py", + "sha256": "05db28385a7e2854cfeb96148751f119586e888e2ce0460f3686ed651f16ae32", + "bytes": 3101, + "routes": [], + "models": [ + { + "name": "NoticeArchivePacket", + "bases": [], "fields": [ { - "name": "jurisdiction", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 12 }, { - "name": "zone_code", + "name": "notice_type", "type": "str", - "default": "Field(..., min_length=1, max_length=80)" + "line": 13 }, { - "name": "key", + "name": "source_module", "type": "str", - "default": "Field(..., min_length=1, max_length=120)" + "line": 14 }, { - "name": "section_number", + "name": "source_record_id", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 15 }, { - "name": "kind", - "type": "Literal['use', 'dimension']", - "default": "" + "name": "evidence_items", + "type": "tuple[str, ...]", + "line": 16 }, { - "name": "value", - "type": "str", - "default": "Field(..., min_length=1, max_length=255)" + "name": "missing_items", + "type": "tuple[str, ...]", + "line": 17 }, { - "name": "overlay_code", - "type": "str | None", - "default": "Field(default=None, max_length=255)" - } - ], - "line": 159, - "doc": "" - }, - { - "name": "Review", - "bases": [ - "Strict" - ], - "fields": [ + "name": "handoff_targets", + "type": "tuple[str, ...]", + "line": 18 + }, { - "name": "answer", + "name": "readiness_status", "type": "str", - "default": "Field(default='', max_length=10000)" + "line": 19 }, { - "name": "notes", - "type": "str", - "default": "Field(default='', max_length=10000)" + "name": "staff_review_required", + "type": "bool", + "line": 20 }, { - "name": "queue_status", - "type": "Literal['open', 'in_review', 'resolved', 'closed']", - "default": "'resolved'" + "name": "disclaimer", + "type": "str", + "line": 21 } ], - "line": 169, - "doc": "" - }, + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_notice/channel_plan.py", + "sha256": "acdce60fa24fcfbd903100e02df1d730ed9b913013a52f8287839272bf58a643", + "bytes": 1182, + "routes": [], + "models": [ { - "name": "Outline", - "bases": [ - "Strict" - ], + "name": "ChannelPlan", + "bases": [], "fields": [ { - "name": "title", + "name": "notice_type", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 12 }, { - "name": "question_ids", - "type": "list[UUID]", - "default": "Field(min_length=1, max_length=50)" + "name": "channels", + "type": "tuple[str, ...]", + "line": 13 + }, + { + "name": "accessibility_notes", + "type": "tuple[str, ...]", + "line": 14 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 15 + }, + { + "name": "disclaimer", + "type": "str", + "line": 16 } ], - "line": 175, - "doc": "" - }, + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_notice/deadline_tracker.py", + "sha256": "7dd15044ff4cf2597be1b0eebd525ea641328388d7f79ff2ad42d7f1063b6c8d", + "bytes": 1106, + "routes": [], + "models": [ { - "name": "CodeContext", - "bases": [ - "Strict" - ], + "name": "DeadlinePlan", + "bases": [], "fields": [ { - "name": "section_number", + "name": "notice_type", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 14 }, { - "name": "as_of", - "type": "date | None", - "default": "None" - } - ], - "line": 180, - "doc": "" - }, - { - "name": "MeetingSearch", - "bases": [ - "Strict" - ], - "fields": [ + "name": "event_date", + "type": "date", + "line": 15 + }, { - "name": "query", + "name": "reminders", + "type": "tuple[str, ...]", + "line": 16 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 17 + }, + { + "name": "disclaimer", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 18 } ], - "line": 185, - "doc": "" + "line": 13 + } + ], + "configuration": [] + }, + { + "source": "townlight_notice/main.py", + "sha256": "5074a5d9d80332f672401cfa37035d13ec4e5b9707b155ea154d1a689404c920", + "bytes": 23999, + "routes": [ + { + "method": "GET", + "declared_path": "/", + "function": "root", + "line": 186 }, { - "name": "MeetingLink", + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 206 + }, + { + "method": "GET", + "declared_path": "/townlight_notice", + "function": "public_townlight_notice_page", + "line": 218 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/registry", + "function": "notice_registry", + "line": 225 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_notice/registry/{record_id}", + "function": "get_notice_registry", + "line": 250 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/deadlines", + "function": "deadline_plan", + "line": 272 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_notice/deadlines/{plan_id}", + "function": "get_deadline_plan", + "line": 297 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/publication-proof", + "function": "publication_proof", + "line": 319 + }, + { + "method": "GET", + "declared_path": "/api/v1/townlight_notice/publication-proof/{proof_id}", + "function": "get_publication_proof", + "line": 352 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/publication-check", + "function": "publication_checklist", + "line": 376 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/rule-check", + "function": "rule_check", + "line": 384 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/templates", + "function": "notice_template", + "line": 404 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/channels", + "function": "channel_plan", + "line": 421 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/subscribers/plan", + "function": "subscriber_delivery_plan", + "line": 429 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/accessibility-review", + "function": "accessibility_review", + "line": 451 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/archive-packet", + "function": "archive_packet", + "line": 465 + }, + { + "method": "POST", + "declared_path": "/api/v1/townlight_notice/export", + "function": "records_export", + "line": 483 + } + ], + "models": [ + { + "name": "NoticeRegistryRequest", "bases": [ - "Strict" + "BaseModel" ], "fields": [ { - "name": "source_id", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=200)" + "line": 55 }, { - "name": "expected_sha256", + "name": "notice_type", "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "line": 56 }, { - "name": "relation", - "type": "Literal['hearing', 'context', 'precedent']", - "default": "" + "name": "owner", + "type": "str", + "line": 57 } ], - "line": 189, - "doc": "" + "line": 54 }, { - "name": "SourceSnapshot", + "name": "DeadlineRequest", "bases": [ - "Strict" + "BaseModel" ], "fields": [ { - "name": "visibility", - "type": "Literal['public', 'staff_only']", - "default": "" + "name": "notice_type", + "type": "str", + "line": 61 }, { - "name": "meeting_event_ids", - "type": "list[UUID]", - "default": "Field(default_factory=list, max_length=50)" + "name": "event_date", + "type": "date", + "line": 62 + }, + { + "name": "lead_days", + "type": "int", + "line": 63 } ], - "line": 195, - "doc": "" + "line": 60 }, { - "name": "StandardsExplanation", + "name": "PublicationRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "question", - "type": "str", - "default": "Field(min_length=1, max_length=2000)" - }, - { - "name": "process_section", + "name": "notice_type", "type": "str", - "default": "Field(default='', max_length=255)" + "line": 67 }, { - "name": "zone_code", + "name": "channel", "type": "str", - "default": "Field(default='', max_length=40)" - }, - { - "name": "rule_types", - "type": "list[str]", - "default": "Field(default_factory=list, max_length=10)" - }, - { - "name": "observed", - "type": "dict[str, str]", - "default": "Field(default_factory=dict)" + "line": 68 } ], - "line": 342, - "doc": "" - } - ], - "configuration": [ - { - "variable": "CIVICZONE_PARCEL_RULE_DB_URL", - "default": "", - "line": 359 - } - ] - } - ] - }, - "planning": { - "package": "civicplan", - "source": [ - { - "source": "installed-owned-source/civicplan/__init__.py", - "sha256": "d6a014eba48a6bdcdaea2a444cfcaa743cd2ba33cec6d63ea5e450266ad71c82", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/connections.py", - "sha256": "649c8474e787fca1e30a11f153d2f776283204b5dc8053b7e88fbc325cdcf944", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/consistency.py", - "sha256": "d18ef439391d859f0d1a020356edaf91d2441333eacf36036d03d1b7ea467210", - "routes": [], - "models": [ + "line": 66 + }, { - "name": "ConsistencyCheck", - "bases": [], + "name": "RuleCheckRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "policy_id", + "name": "notice_type", "type": "str", - "default": "" + "line": 72 }, { - "name": "status", - "type": "str", - "default": "" + "name": "event_date", + "type": "date", + "line": 77 }, { - "name": "factors", - "type": "tuple[str, ...]", - "default": "" + "name": "publication_dates", + "type": "list[date]", + "line": 81 + }, + { + "name": "channels", + "type": "list[str]", + "line": 86 }, { - "name": "staff_next_step", - "type": "str", - "default": "" + "name": "content_fields", + "type": "list[str]", + "line": 91 }, { - "name": "disclaimer", + "name": "statutory_basis", "type": "str", - "default": "DISCLAIMER" + "line": 96 } ], - "line": 11, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/integration_mocks.py", - "sha256": "09c350c13fe4e14c3f385549021f57c09341c8dbe110b18e6e4739cf70ac6254", - "routes": [], - "models": [ + "line": 71 + }, { - "name": "IntegrationError", - "bases": [], + "name": "NoticeTemplateRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "provider", + "name": "notice_type", "type": "str", - "default": "" + "line": 105 }, { - "name": "message", + "name": "matter_title", "type": "str", - "default": "" + "line": 110 }, { - "name": "fix", - "type": "str", - "default": "" + "name": "event_date", + "type": "date", + "line": 111 }, { - "name": "code", - "type": "str", - "default": "" - } - ], - "line": 18, - "doc": "" - }, - { - "name": "IntegrationResult", - "bases": [], - "fields": [ - { - "name": "provider", + "name": "location", "type": "str", - "default": "" + "line": 112 }, { - "name": "records", - "type": "tuple[dict[str, Any], ...]", - "default": "" + "name": "contact", + "type": "str", + "line": 113 }, { - "name": "source", + "name": "source_module", "type": "str", - "default": "" + "line": 114 }, { - "name": "warnings", - "type": "tuple[str, ...]", - "default": "()" + "name": "statutory_basis", + "type": "str", + "line": 115 } ], - "line": 26, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/main.py", - "sha256": "34aaae27da4bc8f34570849cc446a134efb78c004294425ac62ef2c80abb1adf", - "routes": [ - { - "method": "GET", - "path": "/", - "router": "app", - "prefix_resolved": true, - "name": "root", - "signature": "", - "returns": "dict[str, str]", - "line": 129, - "doc": "Return current product state without overstating unshipped behavior.", - "decorator": "app.get('/')", - "errors": [] - }, - { - "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "health", - "signature": "", - "returns": "dict[str, str]", - "line": 147, - "doc": "Return dependency/version health for deployment smoke checks.", - "decorator": "app.get('/health')", - "errors": [] - }, - { - "method": "GET", - "path": "/civicplan", - "router": "app", - "prefix_resolved": true, - "name": "public_civicplan_page", - "signature": "q: str='', goal: str='', topic: str='', plan_type: str='', clear: str='', neighborhood: str=''", - "returns": "str", - "line": 193, - "doc": "Explore the adopted plan sources this deployment actually holds.\n\nPublic readers get only adopted, effective, public municipal revisions. When\nno plan database is configured the page says so instead of showing sample text.", - "decorator": "app.get('/civicplan', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/public/plan-explore", - "router": "app", - "prefix_resolved": true, - "name": "public_plan_explore", - "signature": "q: str='', goal: str='', topic: str='', plan_type: str='', neighborhood: str=''", - "returns": "dict[str, object]", - "line": 220, - "doc": "The same persisted-source exploration as the page, as JSON.", - "decorator": "app.get('/api/v1/civicplan/public/plan-explore')", - "errors": [ - "HTTPException(503, 'No plan source database is configured for this deployment.')" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/public/policy/{revision_id}/{policy_id}", - "router": "app", - "prefix_resolved": true, - "name": "public_policy_citation", - "signature": "revision_id: str, policy_id: str", - "returns": "dict[str, object]", - "line": 237, - "doc": "One cited policy for a public reader, or a refusal.\n\nA staff-only, pending, superseded or non-effective revision is refused here by\nthe service; naming its id does not reach it.", - "decorator": "app.get('/api/v1/civicplan/public/policy/{revision_id}/{policy_id}')", - "errors": [ - "HTTPException(503, 'No plan source database is configured for this deployment.')", - "HTTPException(404, str(exc))" - ] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/policies/lookup", - "router": "app", - "prefix_resolved": true, - "name": "policy_lookup", - "signature": "request: PolicyLookupRequest, is_staff=Depends(audience)", - "returns": "dict[str, object]", - "line": 256, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/policies/lookup')", - "errors": [ - "HTTPException(404, 'No supported adopted policy found; inspect imported sources.')" - ] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/policies/ingest", - "router": "app", - "prefix_resolved": true, - "name": "ingest_policy", - "signature": "request: PolicyIngestRequest, x_civicplan_role: Annotated[str | None, Header()]=None, x_civicplan_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 270, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/policies/ingest')", - "errors": [ - "HTTPException(409, detail={'message': 'Metadata-only ingestion cannot establish plan provenance.', 'fix': 'Use POST /api/v1/civicplan/source-imports with a staff-verified source bundle.'})" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/plans/navigator", - "router": "app", - "prefix_resolved": true, - "name": "plans_navigator", - "signature": "plan_type: str | None=None, is_staff=Depends(audience)", - "returns": "dict[str, object]", - "line": 283, - "doc": "", - "decorator": "app.get('/api/v1/civicplan/plans/navigator')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/questions/answer", - "router": "app", - "prefix_resolved": true, - "name": "plan_question_answer", - "signature": "request: PlanQuestionRequest, is_staff=Depends(audience)", - "returns": "dict[str, object]", - "line": 292, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/questions/answer')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/plans/synthesis", - "router": "app", - "prefix_resolved": true, - "name": "plan_synthesis", - "signature": "request: PlanSynthesisRequest, is_staff=Depends(audience)", - "returns": "dict[str, object]", - "line": 306, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/plans/synthesis')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/context/civicclerk", - "router": "app", - "prefix_resolved": true, - "name": "civicclerk_context", - "signature": "request: CivicClerkContextRequest, is_staff=Depends(audience)", - "returns": "dict[str, object]", - "line": 314, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/context/civicclerk')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/integrations/mock", - "router": "app", - "prefix_resolved": true, - "name": "integration_mock", - "signature": "request: IntegrationMockRequest", - "returns": "dict[str, object]", - "line": 328, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/integrations/mock')", - "errors": [ - "HTTPException(status_code=422, detail={'message': result.message, 'fix': result.fix, 'code': result.code, 'provider': result.provider})" - ] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/context/zoning", - "router": "app", - "prefix_resolved": true, - "name": "zoning_policy_context", - "signature": "request: ZoningPolicyContextRequest, is_staff=Depends(audience)", - "returns": "dict[str, object]", - "line": 349, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/context/zoning')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/consistency/check", - "router": "app", - "prefix_resolved": true, - "name": "consistency_check", - "signature": "request: ConsistencyRequest, is_staff=Depends(audience)", - "returns": "dict[str, object]", - "line": 378, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/consistency/check')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/staff-analysis/draft", - "router": "app", - "prefix_resolved": true, - "name": "staff_analysis", - "signature": "request: StaffAnalysisRequest, x_civicplan_role: Annotated[str | None, Header()]=None, x_civicplan_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 392, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/staff-analysis/draft')", - "errors": [ - "HTTPException(404, 'No supported adopted policy found.')" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/staff-analysis/{analysis_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_staff_analysis", - "signature": "analysis_id: str, native_request: Request, x_civicplan_role: Annotated[str | None, Header()]=None, x_civicplan_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 419, - "doc": "", - "decorator": "app.get('/api/v1/civicplan/staff-analysis/{analysis_id}')", - "errors": [ - "HTTPException(status_code=503, detail={'message': 'Townlight Planning policy persistence is not configured.', 'fix': 'Set CIVICPLAN_POLICY_DB_URL to retrieve persisted staff-analysis records.'})", - "HTTPException(status_code=404, detail={'message': 'Staff-analysis record not found.', 'fix': 'Use an analysis_id returned by POST /api/v1/civicplan/staff-analysis/draft.'})" - ] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/export", - "router": "app", - "prefix_resolved": true, - "name": "policy_export", - "signature": "request: PolicyExportRequest, native_request: Request, is_staff=Depends(audience)", - "returns": "dict[str, object]", - "line": 451, - "doc": "", - "decorator": "app.post('/api/v1/civicplan/export')", - "errors": [ - "HTTPException(403, 'Staff authentication is required to export analysis snapshots.')", - "HTTPException(422, 'Select a reviewed immutable snapshot; a policy ID alone is not an export.')", - "HTTPException(404, 'Snapshot not found.')" - ] - } - ], - "models": [ + "line": 104 + }, { - "name": "PolicyLookupRequest", + "name": "ChannelRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "topic", + "name": "notice_type", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 119 }, { - "name": "plan_type", + "name": "audience", "type": "str", - "default": "Field(default='comprehensive', min_length=1, max_length=120)" + "line": 120 } ], - "line": 64, - "doc": "" + "line": 118 }, { - "name": "ZoningPolicyContextRequest", + "name": "SubscriberRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "topic", + "name": "subscriber_id", "type": "str", - "default": "Field(min_length=1, max_length=500)" - }, - { - "name": "zone_code", - "type": "str | None", - "default": "Field(default=None, max_length=80)" + "line": 124 }, { - "name": "use", - "type": "str | None", - "default": "Field(default=None, max_length=160)" + "name": "name", + "type": "str", + "line": 125 }, { - "name": "parcel_number", - "type": "str | None", - "default": "Field(default=None, max_length=120)" + "name": "email", + "type": "str", + "line": 126 }, { - "name": "address", - "type": "str | None", - "default": "Field(default=None, max_length=500)" + "name": "channels", + "type": "list[str]", + "line": 127 }, { - "name": "plan_type", + "name": "language", "type": "str", - "default": "Field(default='comprehensive', min_length=1, max_length=120)" + "line": 128 }, { - "name": "civiczone_context_id", - "type": "str | None", - "default": "Field(default=None, max_length=160)" + "name": "active", + "type": "bool", + "line": 129 } ], - "line": 69, - "doc": "" + "line": 123 }, { - "name": "ConsistencyRequest", + "name": "SubscriberDeliveryRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "proposal", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "line": 133 }, { - "name": "policy_id", + "name": "notice_type", "type": "str", - "default": "Field(min_length=1, max_length=160)" - } - ], - "line": 79, - "doc": "" - }, - { - "name": "StaffAnalysisRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 134 + }, { - "name": "project_name", + "name": "audience", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 135 }, { - "name": "proposal", - "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "name": "subscribers", + "type": "list[SubscriberRequest]", + "line": 136 }, { - "name": "policy_id", - "type": "str", - "default": "Field(min_length=1, max_length=160)" + "name": "required_channels", + "type": "list[str]", + "line": 137 } ], - "line": 84, - "doc": "" + "line": 132 }, { - "name": "PolicyExportRequest", + "name": "AccessibilityReviewRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "title", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 141 }, { - "name": "policy_id", + "name": "title", "type": "str", - "default": "Field(min_length=1, max_length=160)" + "line": 142 }, { - "name": "format", + "name": "notice_text", "type": "str", - "default": "Field(default='markdown', min_length=1, max_length=40)" + "line": 143 }, { - "name": "snapshot_id", - "type": "str | None", - "default": "Field(default=None, min_length=36, max_length=36)" + "name": "target_languages", + "type": "list[str]", + "line": 144 + }, + { + "name": "attachments", + "type": "list[str]", + "line": 145 + }, + { + "name": "has_contact", + "type": "bool", + "line": 146 + }, + { + "name": "has_event_date", + "type": "bool", + "line": 147 + }, + { + "name": "has_plain_language_summary", + "type": "bool", + "line": 148 } ], - "line": 90, - "doc": "" + "line": 140 }, { - "name": "PolicyIngestRequest", + "name": "ArchivePacketRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "topic_key", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=160)" + "line": 152 }, { - "name": "policy_id", + "name": "notice_type", "type": "str", - "default": "Field(min_length=1, max_length=160)" + "line": 153 }, { - "name": "plan_type", + "name": "source_module", "type": "str", - "default": "Field(min_length=1, max_length=120)" + "line": 154 }, { - "name": "title", + "name": "source_record_id", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 155 }, { - "name": "citation", + "name": "registry_record_id", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 156 }, { - "name": "excerpt", + "name": "deadline_plan_id", "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "line": 157 }, { - "name": "relevance", + "name": "publication_proof_id", "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "line": 158 }, { - "name": "adoption_status", - "type": "str", - "default": "Field(default='adopted', min_length=1, max_length=80)" + "name": "rule_check_complete", + "type": "bool", + "line": 159 }, { - "name": "source_document", - "type": "str", - "default": "Field(min_length=1, max_length=500)" + "name": "template_complete", + "type": "bool", + "line": 160 + }, + { + "name": "accessibility_review_complete", + "type": "bool", + "line": 161 + }, + { + "name": "subscriber_delivery_complete", + "type": "bool", + "line": 162 + }, + { + "name": "records_export_complete", + "type": "bool", + "line": 163 } ], - "line": 97, - "doc": "" + "line": 151 }, { - "name": "PlanQuestionRequest", + "name": "RecordsExportRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "question", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "line": 167 }, { - "name": "plan_type", + "name": "title", "type": "str", - "default": "Field(default='comprehensive', min_length=1, max_length=120)" - } - ], - "line": 109, - "doc": "" - }, - { - "name": "PlanSynthesisRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 168 + }, { - "name": "topic", + "name": "format", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 169 } ], - "line": 114, - "doc": "" + "line": 166 }, { - "name": "CivicClerkContextRequest", + "name": "PublicationProofRequest", "bases": [ "BaseModel" ], "fields": [ { - "name": "agenda_item", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 173 }, { - "name": "topic", + "name": "notice_type", "type": "str", - "default": "Field(min_length=1, max_length=500)" - } - ], - "line": 118, - "doc": "" - }, - { - "name": "IntegrationMockRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 174 + }, { - "name": "provider", + "name": "source_module", "type": "str", - "default": "Field(min_length=1, max_length=120)" + "line": 175 }, { - "name": "payload", - "type": "dict[str, object]", - "default": "Field(default_factory=dict)" + "name": "source_record_id", + "type": "str", + "line": 176 + }, + { + "name": "channel", + "type": "str", + "line": 177 + }, + { + "name": "published_at", + "type": "str", + "line": 178 + }, + { + "name": "location", + "type": "str", + "line": 179 + }, + { + "name": "confirmation_reference", + "type": "str", + "line": 180 + }, + { + "name": "statutory_basis", + "type": "str", + "line": 181 + }, + { + "name": "reviewer", + "type": "str", + "line": 182 } ], - "line": 123, - "doc": "" + "line": 172 } ], "configuration": [ - { - "variable": "CIVICPLAN_POLICY_DB_URL", - "default": "", - "line": 469 - }, - { - "variable": "CIVICPLAN_DEMO_MODE", - "default": "", - "line": 496 - } - ] - }, - { - "source": "installed-owned-source/civicplan/migrations/__init__.py", - "sha256": "daf5e64cefda400a5db1023d952e41bef6f7954db19406d63ea84770c82dccd9", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/migrations/__main__.py", - "sha256": "321e543984ca92e2540d1f4d9eca54658dc608987b95bc5abc61b651b4305fd6", - "routes": [], - "models": [], - "configuration": [ - { - "variable": "CIVICPLAN_POLICY_DB_URL", - "default": "", - "line": 7 - } - ] - }, - { - "source": "installed-owned-source/civicplan/migrations/env.py", - "sha256": "832a41b6c40d14da47178b486650eba98bff574a66652e3b614cc782db04f8df", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/migrations/versions/civicplan_0001_sources.py", - "sha256": "807e5a18d1fa295d482f3963f7799f244f046ab98297bfc33cbd17131fb44d17", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/migrations/versions/civicplan_0002_workflows.py", - "sha256": "7c6fcdfe4a1fa33c9289cef975a25f4b0f6746471c380226c14520f8a5f09dbf", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/migrations/versions/civicplan_0003_municipal.py", - "sha256": "64735db3119b22b54a232e0a4486657a91b5304e4a253b14ce7cae1acb204681", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/migrations/versions/civicplan_0004_neighborhoods.py", - "sha256": "006f8f8f9859da76189efee9035d1f89c65e0b27172b5df9e316e1aa173434f8", - "routes": [], - "models": [], - "configuration": [] + { + "environment": "TOWNLIGHT_NOTICE_WORKPAPER_DB_URL", + "line": 492 + }, + { + "environment": "TOWNLIGHT_NOTICE_TRUSTED_WRITE_TOKEN", + "line": 496 + } + ] }, { - "source": "installed-owned-source/civicplan/municipal.py", - "sha256": "dbd5bd841f3f90d2ab7256eafb30ed8b7ba6036bd3921e23595d7df6715b8555", + "source": "townlight_notice/notice_registry.py", + "sha256": "8a5195d4c87f4bb76e1b499bf7cc188ded3bf62d8d9c54113a9d86b04cba1418", + "bytes": 1258, "routes": [], "models": [ { - "name": "Measurement", - "bases": [ - "BundleModel" - ], + "name": "NoticeRecord", + "bases": [], "fields": [ { - "name": "recorded_on", - "type": "date", - "default": "" + "name": "notice_id", + "type": "str", + "line": 17 }, { - "name": "value", - "type": "Decimal", - "default": "Field(allow_inf_nan=False)" + "name": "notice_type", + "type": "str", + "line": 18 }, { - "name": "evidence", + "name": "owner", + "type": "str", + "line": 19 + }, + { + "name": "registry_notes", + "type": "tuple[str, ...]", + "line": 20 + }, + { + "name": "disclaimer", "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "line": 21 } ], - "line": 41, - "doc": "" - }, + "line": 16 + } + ], + "configuration": [] + }, + { + "source": "townlight_notice/notice_templates.py", + "sha256": "fcd44c4e05afcd8ed6dd5c3913a8d522bf6c0bd5b7d291f2937842a5b49fd6ac", + "bytes": 2176, + "routes": [], + "models": [ { - "name": "Milestone", - "bases": [ - "BundleModel" - ], + "name": "NoticeTemplate", + "bases": [], "fields": [ + { + "name": "notice_type", + "type": "str", + "line": 14 + }, { "name": "title", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 15 }, { - "name": "due_on", - "type": "date", - "default": "" + "name": "source_module", + "type": "str", + "line": 16 }, { - "name": "completed_on", - "type": "date | None", - "default": "None" + "name": "template_lines", + "type": "tuple[str, ...]", + "line": 17 }, { - "name": "evidence", + "name": "required_fields", + "type": "tuple[str, ...]", + "line": 18 + }, + { + "name": "placeholders_remaining", + "type": "tuple[str, ...]", + "line": 19 + }, + { + "name": "staff_review_required", + "type": "bool", + "line": 20 + }, + { + "name": "disclaimer", "type": "str", - "default": "Field(default='', max_length=2000)" + "line": 21 } ], - "line": 53, - "doc": "" - }, + "line": 13 + } + ], + "configuration": [] + }, + { + "source": "townlight_notice/persistence.py", + "sha256": "bfc2871328900220b9dad1a01d07aeae6f0f7e7b1ab25e66a2908b5766f9d2d6", + "bytes": 11387, + "routes": [], + "models": [ { - "name": "InitiativeInput", - "bases": [ - "BundleModel" - ], + "name": "StoredNoticeRecord", + "bases": [], "fields": [ { - "name": "expected_revision", - "type": "str | None", - "default": "Field(default=None, min_length=36, max_length=36)" + "name": "record_id", + "type": "str", + "line": 67 }, { - "name": "title", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 68 }, { - "name": "policy", - "type": "PolicySelection", - "default": "" + "name": "notice_type", + "type": "str", + "line": 69 }, { - "name": "responsible_staff", + "name": "owner", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 70 }, { - "name": "target", - "type": "Decimal", - "default": "Field(allow_inf_nan=False)" + "name": "registry_notes", + "type": "tuple[str, ...]", + "line": 71 }, { - "name": "unit", + "name": "disclaimer", "type": "str", - "default": "Field(min_length=1, max_length=80)" + "line": 72 }, { - "name": "due_on", - "type": "date", - "default": "" + "name": "created_at", + "type": "datetime", + "line": 73 + } + ], + "line": 66 + }, + { + "name": "StoredDeadlinePlan", + "bases": [], + "fields": [ + { + "name": "plan_id", + "type": "str", + "line": 78 }, { - "name": "status", - "type": "Literal['planned', 'active', 'completed', 'cancelled']", - "default": "'planned'" + "name": "notice_type", + "type": "str", + "line": 79 }, { - "name": "milestones", - "type": "list[Milestone]", - "default": "Field(default_factory=list, max_length=100)" + "name": "event_date", + "type": "date", + "line": 80 }, { - "name": "measurements", - "type": "list[Measurement]", - "default": "Field(default_factory=list, max_length=1000)" + "name": "reminders", + "type": "tuple[str, ...]", + "line": 81 }, { - "name": "note", + "name": "staff_review_required", + "type": "bool", + "line": 82 + }, + { + "name": "disclaimer", "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "line": 83 + }, + { + "name": "created_at", + "type": "datetime", + "line": 84 } ], - "line": 66, - "doc": "" + "line": 77 }, { - "name": "AmendmentInput", - "bases": [ - "BundleModel" - ], + "name": "StoredPublicationProof", + "bases": [], "fields": [ { - "name": "expected_revision", - "type": "str | None", - "default": "Field(default=None, min_length=36, max_length=36)" + "name": "proof_id", + "type": "str", + "line": 89 }, { - "name": "title", + "name": "notice_id", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 90 }, { - "name": "policy", - "type": "PolicySelection", - "default": "" + "name": "notice_type", + "type": "str", + "line": 91 }, { - "name": "proposal", + "name": "source_module", "type": "str", - "default": "Field(min_length=1, max_length=20000)" + "line": 92 }, { - "name": "responsible_staff", + "name": "source_record_id", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 93 }, { - "name": "status", - "type": "Literal['draft', 'review', 'adopted', 'withdrawn']", - "default": "'draft'" + "name": "channel", + "type": "str", + "line": 94 }, { - "name": "review_note", + "name": "published_at", "type": "str", - "default": "Field(default='', max_length=5000)" + "line": 95 }, { - "name": "adoption_revision", - "type": "str | None", - "default": "Field(default=None, min_length=36, max_length=36)" + "name": "location", + "type": "str", + "line": 96 }, { - "name": "note", + "name": "confirmation_reference", + "type": "str", + "line": 97 + }, + { + "name": "statutory_basis", + "type": "str", + "line": 98 + }, + { + "name": "reviewer", + "type": "str", + "line": 99 + }, + { + "name": "proof_notes", + "type": "tuple[str, ...]", + "line": 100 + }, + { + "name": "compliance_status", + "type": "str", + "line": 101 + }, + { + "name": "disclaimer", "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "line": 102 + }, + { + "name": "created_at", + "type": "datetime", + "line": 103 } ], - "line": 90, - "doc": "" + "line": 88 } ], "configuration": [] }, { - "source": "installed-owned-source/civicplan/municipal_api.py", - "sha256": "b71876bd1b6f354f7a9ad8d06f19d8ae7c071a0315f19421d3ff4df07bb8dc1f", - "routes": [ - { - "method": "POST", - "path": "/api/v1/civicplan/initiatives", - "router": "router", - "prefix_resolved": true, - "name": "create_initiative", - "signature": "data: InitiativeInput, actor=Depends(staff), repo=Depends(municipal)", - "returns": "", - "line": 17, - "doc": "", - "decorator": "router.post('/initiatives', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/initiatives/{item_id}/revisions", - "router": "router", - "prefix_resolved": true, - "name": "update_initiative", - "signature": "item_id: str, data: InitiativeInput, actor=Depends(staff), repo=Depends(municipal)", - "returns": "", - "line": 22, - "doc": "", - "decorator": "router.post('/initiatives/{item_id}/revisions')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/amendments", - "router": "router", - "prefix_resolved": true, - "name": "create_amendment", - "signature": "data: AmendmentInput, actor=Depends(staff), repo=Depends(municipal)", - "returns": "", - "line": 29, - "doc": "", - "decorator": "router.post('/amendments', status_code=201)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/amendments/{item_id}/revisions", - "router": "router", - "prefix_resolved": true, - "name": "update_amendment", - "signature": "item_id: str, data: AmendmentInput, actor=Depends(staff), repo=Depends(municipal)", - "returns": "", - "line": 34, - "doc": "", - "decorator": "router.post('/amendments/{item_id}/revisions')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/municipal-work/{item_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "history", - "signature": "item_id: str, actor=Depends(staff), repo=Depends(municipal)", - "returns": "", - "line": 41, - "doc": "", - "decorator": "router.get('/municipal-work/{item_id}/history')", - "errors": [ - "HTTPException(404, 'Municipal workflow not found')" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/progress/targets", - "router": "router", - "prefix_resolved": true, - "name": "progress", - "signature": "policy_id: str | None=None, offset: int=Query(0, ge=0, le=100000), limit: int=Query(50, ge=1, le=100), actor=Depends(staff), repo=Depends(municipal)", - "returns": "", - "line": 49, - "doc": "", - "decorator": "router.get('/progress/targets')", - "errors": [] - }, + "source": "townlight_notice/public_ui.py", + "sha256": "d3c07a7bd9c4bbef24d49107824941812ee5d04bce9ee53a2c83a63e541aa32e", + "bytes": 6462, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "townlight_notice/publication_check.py", + "sha256": "e19f0d812ddd348aca7f30e9bcf28cd6d15dc5552a1e79a04f0d35f5f04997ac", + "bytes": 1107, + "routes": [], + "models": [ { - "method": "GET", - "path": "/api/v1/civicplan/amendments/history", - "router": "router", - "prefix_resolved": true, - "name": "amendments", - "signature": "plan_type: str | None=None, offset: int=Query(0, ge=0, le=100000), limit: int=Query(50, ge=1, le=100), actor=Depends(staff), repo=Depends(municipal)", - "returns": "", - "line": 60, - "doc": "", - "decorator": "router.get('/amendments/history')", - "errors": [] + "name": "PublicationChecklist", + "bases": [], + "fields": [ + { + "name": "notice_type", + "type": "str", + "line": 12 + }, + { + "name": "checklist", + "type": "tuple[str, ...]", + "line": 13 + }, + { + "name": "proof_required", + "type": "bool", + "line": 14 + }, + { + "name": "disclaimer", + "type": "str", + "line": 15 + } + ], + "line": 11 } ], - "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicplan/persistence.py", - "sha256": "30d920165ab9b4f9675a0d61dd887587823b6c075ef160e3a56670db95d2cc7e", + "source": "townlight_notice/publication_proof.py", + "sha256": "807dd53445c1fdfa6e0c6bc5988ad4be5c255abfefd5acefaf60dc13a3fc350f", + "bytes": 2390, "routes": [], "models": [ { - "name": "StoredStaffAnalysis", + "name": "PublicationProof", "bases": [], "fields": [ { - "name": "analysis_id", + "name": "notice_id", "type": "str", - "default": "" + "line": 12 }, { - "name": "project_name", + "name": "notice_type", "type": "str", - "default": "" + "line": 13 }, { - "name": "proposal", + "name": "source_module", "type": "str", - "default": "" + "line": 14 }, { - "name": "policy_id", + "name": "source_record_id", "type": "str", - "default": "" + "line": 15 }, { - "name": "heading", + "name": "channel", "type": "str", - "default": "" + "line": 16 }, { - "name": "bullets", - "type": "tuple[str, ...]", - "default": "" + "name": "published_at", + "type": "str", + "line": 17 }, { - "name": "citations", - "type": "tuple[str, ...]", - "default": "" + "name": "location", + "type": "str", + "line": 18 }, { - "name": "review_required", - "type": "bool", - "default": "" + "name": "confirmation_reference", + "type": "str", + "line": 19 }, { - "name": "disclaimer", + "name": "statutory_basis", "type": "str", - "default": "" + "line": 20 }, { - "name": "created_at", - "type": "datetime", - "default": "" + "name": "reviewer", + "type": "str", + "line": 21 + }, + { + "name": "proof_notes", + "type": "tuple[str, ...]", + "line": 22 + }, + { + "name": "compliance_status", + "type": "str", + "line": 23 + }, + { + "name": "disclaimer", + "type": "str", + "line": 24 } ], - "line": 51, - "doc": "" + "line": 11 } ], "configuration": [] }, { - "source": "installed-owned-source/civicplan/plan_workflows.py", - "sha256": "e69084e3608fa33bbc6ab140d4570efa3850cb04317000b407c5a5f5ca635115", + "source": "townlight_notice/records_export.py", + "sha256": "faa93c41f8f38bc89b4924e328a7ae354b45ad1478236bd02e924dd4bd8c8f6c", + "bytes": 1290, "routes": [], "models": [ { - "name": "PlanPolicyIngestRecord", + "name": "NoticeRecordsExport", "bases": [], "fields": [ { - "name": "topic_key", + "name": "notice_id", "type": "str", - "default": "" + "line": 12 }, { - "name": "policy", - "type": "PlanPolicy", - "default": "" + "name": "title", + "type": "str", + "line": 13 }, { - "name": "adoption_status", - "type": "PlanStatus", - "default": "" + "name": "checklist", + "type": "tuple[str, ...]", + "line": 14 }, { - "name": "source_document", + "name": "retention_note", + "type": "str", + "line": 15 + }, + { + "name": "disclaimer", "type": "str", - "default": "" + "line": 16 } ], - "line": 14, - "doc": "" - }, + "line": 11 + } + ], + "configuration": [] + }, + { + "source": "townlight_notice/statutory_rules.py", + "sha256": "0f56cf2c90af07981225565e44ecfc6e7e5468440f4141cc8ee1448703b8fe0a", + "bytes": 6430, + "routes": [], + "models": [ { - "name": "PlanQuestionAnswer", + "name": "NoticeRule", "bases": [], "fields": [ { - "name": "status", + "name": "notice_type", "type": "str", - "default": "" + "line": 13 }, { - "name": "answer", - "type": "str", - "default": "" + "name": "minimum_lead_days", + "type": "int", + "line": 14 }, { - "name": "citations", - "type": "tuple[str, ...]", - "default": "" + "name": "required_publications", + "type": "int", + "line": 15 }, { - "name": "source_policy_ids", + "name": "required_channels", "type": "tuple[str, ...]", - "default": "" + "line": 16 }, { - "name": "review_required", - "type": "bool", - "default": "" + "name": "required_content", + "type": "tuple[str, ...]", + "line": 17 }, { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" + "name": "emergency_path_allowed", + "type": "bool", + "line": 18 } ], - "line": 22, - "doc": "" + "line": 12 }, { - "name": "PlanAmendment", + "name": "StatutoryRuleCheck", "bases": [], "fields": [ { - "name": "amendment_id", + "name": "notice_type", "type": "str", - "default": "" + "line": 23 }, { - "name": "plan_type", - "type": "str", - "default": "" + "name": "event_date", + "type": "date", + "line": 24 }, { - "name": "title", - "type": "str", - "default": "" + "name": "required_deadline_date", + "type": "date", + "line": 25 }, { - "name": "adoption_status", - "type": "PlanStatus", - "default": "" + "name": "publication_dates", + "type": "tuple[date, ...]", + "line": 26 }, { - "name": "adopted_date", - "type": "str | None", - "default": "" + "name": "channels", + "type": "tuple[str, ...]", + "line": 27 }, { - "name": "citation", - "type": "str", - "default": "" + "name": "required_publications", + "type": "int", + "line": 28 }, { - "name": "summary", - "type": "str", - "default": "" - } - ], - "line": 32, - "doc": "" - }, - { - "name": "ProgressTarget", - "bases": [], - "fields": [ + "name": "required_channels", + "type": "tuple[str, ...]", + "line": 29 + }, { - "name": "target_id", - "type": "str", - "default": "" + "name": "missing_channels", + "type": "tuple[str, ...]", + "line": 30 }, { - "name": "policy_id", - "type": "str", - "default": "" + "name": "required_content", + "type": "tuple[str, ...]", + "line": 31 }, { - "name": "metric", - "type": "str", - "default": "" + "name": "missing_content", + "type": "tuple[str, ...]", + "line": 32 }, { - "name": "status", + "name": "statutory_basis", "type": "str", - "default": "" + "line": 33 }, { - "name": "evidence", + "name": "deadline_status", "type": "str", - "default": "" + "line": 34 }, { - "name": "citation", + "name": "publication_count_status", "type": "str", - "default": "" + "line": 35 }, { - "name": "updated_at", - "type": "datetime", - "default": "" + "name": "staff_review_required", + "type": "bool", + "line": 36 + }, + { + "name": "disclaimer", + "type": "str", + "line": 37 } ], - "line": 43, - "doc": "" + "line": 22 } ], "configuration": [] }, { - "source": "installed-owned-source/civicplan/policy_lookup.py", - "sha256": "eef53ba621332d75f069f00ddcac34c19bca42d469a697fd22555eb3d11c68b2", + "source": "townlight_notice/subscriber_delivery.py", + "sha256": "2defdbcd6c807b2f4c9171afe21559d5b566acaef5376aecb1a5e7faeeb58f94", + "bytes": 3445, "routes": [], "models": [ { - "name": "PlanPolicy", + "name": "Subscriber", "bases": [], "fields": [ { - "name": "policy_id", - "type": "str", - "default": "" - }, - { - "name": "plan_type", + "name": "subscriber_id", "type": "str", - "default": "" + "line": 12 }, { - "name": "title", + "name": "name", "type": "str", - "default": "" + "line": 13 }, { - "name": "citation", + "name": "email", "type": "str", - "default": "" + "line": 14 }, { - "name": "excerpt", - "type": "str", - "default": "" + "name": "channels", + "type": "tuple[str, ...]", + "line": 15 }, { - "name": "relevance", + "name": "language", "type": "str", - "default": "" + "line": 16 }, { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" + "name": "active", + "type": "bool", + "line": 17 } ], - "line": 16, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/policy_service.py", - "sha256": "c5e5461fadea4b32cba43366e1c9795ecb4cd8212db30734f5eadd24a9144808", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/public_explore.py", - "sha256": "c5cbb2de92661538857e52b25f2e0bc4e7cd4f5c9d91eb0fa7d0518b28374720", - "routes": [], - "models": [ + "line": 11 + }, { - "name": "Exploration", + "name": "SubscriberDeliveryPlan", "bases": [], "fields": [ { - "name": "query", + "name": "notice_id", "type": "str", - "default": "''" + "line": 22 }, { - "name": "plan_type", + "name": "notice_type", "type": "str", - "default": "''" + "line": 23 }, { - "name": "goal", + "name": "audience", "type": "str", - "default": "''" + "line": 24 }, { - "name": "topic", - "type": "str", - "default": "''" + "name": "active_subscriber_count", + "type": "int", + "line": 25 }, { - "name": "neighborhood", - "type": "str", - "default": "''" + "name": "suppressed_subscriber_count", + "type": "int", + "line": 26 }, { - "name": "plans", - "type": "list", - "default": "field(default_factory=list)" + "name": "delivery_channels", + "type": "tuple[str, ...]", + "line": 27 }, { - "name": "total", - "type": "int", - "default": "0" + "name": "email_recipients", + "type": "tuple[str, ...]", + "line": 28 }, { - "name": "review_required", + "name": "missing_required_channels", + "type": "tuple[str, ...]", + "line": 29 + }, + { + "name": "language_review_required", "type": "bool", - "default": "True" + "line": 30 }, { - "name": "disclaimer", - "type": "str", - "default": "''" + "name": "staff_review_required", + "type": "bool", + "line": 31 }, { - "name": "empty_reason", - "type": "str | None", - "default": "None" + "name": "delivery_notes", + "type": "tuple[str, ...]", + "line": 32 }, { - "name": "facets", - "type": "dict", - "default": "field(default_factory=dict)" + "name": "disclaimer", + "type": "str", + "line": 33 } ], - "line": 34, - "doc": "One exploration request and what the persisted sources support for it." + "line": 21 } ], "configuration": [] }, { - "source": "installed-owned-source/civicplan/public_explore_ui.py", - "sha256": "bd137701e16391a4ee820c4c88b5db583944491d5fc487ff7580b1083e944e5d", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/public_ui.py", - "sha256": "8551ce36f854a4a7fc4573a20b73dbb0b6f01d7b60b7267d8c73b5f21f246ccc", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/records_export.py", - "sha256": "6894fb9450f5d0177ebf86babcd489be1a789a714ce2c3c825c7afd5ed51bb23", + "source": "townlight_notice/workflow.py", + "sha256": "b88b0fe7488519206ed84a22e69d5577c5746dece7d47e7d91b673abc4d1b8e1", + "bytes": 14094, "routes": [], "models": [ { - "name": "PolicyExport", - "bases": [], + "name": "NoticeDraft", + "bases": [ + "BaseModel" + ], "fields": [ { "name": "title", "type": "str", - "default": "" + "line": 33 }, { - "name": "policy_id", + "name": "body", "type": "str", - "default": "" + "line": 34 }, { - "name": "format", + "name": "notice_type", "type": "str", - "default": "" + "line": 35 }, { - "name": "checklist", - "type": "tuple[str, ...]", - "default": "" + "name": "statutory_basis", + "type": "str", + "line": 36 }, { - "name": "retention_note", - "type": "str", - "default": "" + "name": "event_date", + "type": "date", + "line": 37 + }, + { + "name": "lead_days", + "type": "int", + "line": 38 } ], - "line": 11, - "doc": "" + "line": 31 } ], "configuration": [] + } + ] + }, + "station": { + "repository": "townlight/station", + "repository_head": "4b5afac07dda1c7f725993d06860a820959d7e06", + "working_tree_modified": true, + "principal_import": "townlight_station", + "source": [ + { + "source": "beta-1/townlight_station/__init__.py", + "sha256": "0e4ae6948a7b82358592fa123efcb0f2f19edd0322d93e8077da9db1dcde1ccc", + "bytes": 132, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/air.py", + "sha256": "07bbb24d673c73ecb17274965c3aeefaca4b904c2a16af772009088c65b37cb5", + "bytes": 10038, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/airplay.py", + "sha256": "1a55dd17541478f97a86d7ff4e3054c6d998c95070bf86bb0d27fa5eeea1d231", + "bytes": 13211, + "routes": [], + "models": [], + "configuration": [] }, { - "source": "installed-owned-source/civicplan/source_api.py", - "sha256": "4af39debaf4f9cbb219c294ddfeaea642495d45e492e62852049372e296f1df4", + "source": "beta-1/townlight_station/api.py", + "sha256": "fa99dd6f913fb5020ce4790db6043bd080424bcd99f2e8d97e576daa96432a36", + "bytes": 14339, "routes": [ + { + "method": "GET", + "declared_path": "/health", + "function": "health", + "line": 80 + }, + { + "method": "GET", + "declared_path": "/v1/identity", + "function": "identity", + "line": 85 + }, { "method": "POST", - "path": "/api/v1/civicplan/source-imports", - "router": "router", - "prefix_resolved": true, - "name": "import_sources", - "signature": "request: ImportRequest, actor: str=Depends(staff), repo=Depends(repository)", - "returns": "", - "line": 51, - "doc": "", - "decorator": "router.post('/source-imports')", - "errors": [ - "HTTPException(409, str(exc))" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/source-plans/{plan_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "source_history", - "signature": "plan_id: str, _actor=Depends(staff), repo=Depends(repository)", - "returns": "", - "line": 63, - "doc": "", - "decorator": "router.get('/source-plans/{plan_id}/history')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/source-revisions/{revision_id}", - "router": "router", - "prefix_resolved": true, - "name": "source_revision", - "signature": "revision_id: str, _actor=Depends(staff), repo=Depends(repository)", - "returns": "", - "line": 68, - "doc": "", - "decorator": "router.get('/source-revisions/{revision_id}')", - "errors": [ - "HTTPException(404, 'Planning source revision not found.')" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/source-revisions/{revision_id}/documents/{document_id}", - "router": "router", - "prefix_resolved": true, - "name": "source_document", - "signature": "revision_id: str, document_id: str, _actor=Depends(staff), repo=Depends(repository)", - "returns": "", - "line": 76, - "doc": "", - "decorator": "router.get('/source-revisions/{revision_id}/documents/{document_id}')", - "errors": [ - "HTTPException(404, 'Planning source document not found.')" - ] - } - ], - "models": [ + "declared_path": "/v1/recordings", + "function": "capture", + "line": 90 + }, { - "name": "ImportRequest", - "bases": [ - "BundleModel" - ], - "fields": [ - { - "name": "bundle", - "type": "PlanBundle", - "default": "" - }, - { - "name": "expected_previous_revision", - "type": "str | None", - "default": "Field(default=None, min_length=36, max_length=36)" - } - ], - "line": 45, - "doc": "" - } - ], - "configuration": [ + "method": "GET", + "declared_path": "/v1/recordings/{identity}", + "function": "get_record", + "line": 192 + }, { - "variable": "CIVICPLAN_POLICY_DB_URL", - "default": "", - "line": 31 - } - ] - }, - { - "source": "installed-owned-source/civicplan/source_bundle.py", - "sha256": "f6547516067e27697dfcd6ba80de6e2ca03d1473370209aa354a5bf95b7db98a", - "routes": [], + "method": "GET", + "declared_path": "/v1/recordings/{identity}/content", + "function": "content", + "line": 196 + }, + { + "method": "POST", + "declared_path": "/v1/recordings/{identity}/retry", + "function": "retry", + "line": 207 + }, + { + "method": "GET", + "declared_path": "/v1/live-sources", + "function": "live_sources", + "line": 220 + }, + { + "method": "GET", + "declared_path": "/v1/recordings", + "function": "list_records", + "line": 225 + }, + { + "method": "POST", + "declared_path": "/v1/recordings/{identity}/stop", + "function": "stop_live", + "line": 231 + } + ], "models": [ { - "name": "SourceDocument", + "name": "Capture", "bases": [ - "BundleModel" + "BaseModel" ], "fields": [ { - "name": "document_id", - "type": "str", - "default": "Field(min_length=1, max_length=160, pattern='^[A-Za-z0-9][A-Za-z0-9._:-]*$')" + "name": "meeting_id", + "type": "UUID", + "line": 36 }, { - "name": "filename", - "type": "str", - "default": "Field(min_length=1, max_length=255)" + "name": "agenda_ids", + "type": "list[UUID]", + "line": 37 }, { - "name": "media_type", - "type": "Literal['text/plain', 'text/markdown', 'application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document']", - "default": "" + "name": "source_file", + "type": "str | None", + "line": 38 }, { - "name": "sha256", - "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" + "name": "live_source_id", + "type": "str | None", + "line": 39 }, { - "name": "content_base64", + "name": "civiccast_feed_id", + "type": "str | None", + "line": 40 + }, + { + "name": "captions_file", + "type": "str | None", + "line": 41 + }, + { + "name": "idempotency_key", "type": "str", - "default": "Field(min_length=1, max_length=14000000)" + "line": 42 } ], - "line": 18, - "doc": "" - }, + "line": 34 + } + ], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/boundary.py", + "sha256": "700a35e89a4e0292a5e10e53957cda336fdfd1419ade5041982c653cc6af81a3", + "bytes": 7458, + "routes": [], + "models": [ { - "name": "SourcePolicy", - "bases": [ - "BundleModel" - ], + "name": "Settings", + "bases": [], "fields": [ { - "name": "policy_id", - "type": "str", - "default": "Field(min_length=1, max_length=160)" - }, - { - "name": "document_id", - "type": "str", - "default": "Field(min_length=1, max_length=160)" - }, - { - "name": "goal", - "type": "str", - "default": "Field(min_length=1, max_length=500)" + "name": "data", + "type": "Path", + "line": 46 }, { - "name": "objective", + "name": "database_url", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 47 }, { - "name": "topic_key", + "name": "suite_url", "type": "str", - "default": "Field(min_length=1, max_length=160)" + "line": 48 }, { - "name": "neighborhoods", - "type": "list[str]", - "default": "Field(default_factory=list, max_length=100)" + "name": "media_source", + "type": "Path", + "line": 49 }, { - "name": "title", - "type": "str", - "default": "Field(min_length=1, max_length=500)" + "name": "media_python", + "type": "Path", + "line": 50 }, { - "name": "citation", - "type": "str", - "default": "Field(min_length=1, max_length=500)" + "name": "media_runtime", + "type": "Path", + "line": 51 }, { - "name": "anchor", - "type": "str", - "default": "Field(min_length=1, max_length=500)" + "name": "ffprobe", + "type": "Path", + "line": 52 }, { - "name": "excerpt", - "type": "str", - "default": "Field(min_length=1, max_length=20000)" + "name": "max_seconds", + "type": "int", + "line": 53 }, { - "name": "relevance", - "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "name": "max_bytes", + "type": "int", + "line": 54 }, { - "name": "staff_verified", - "type": "Literal[True]", - "default": "" - } - ], - "line": 62, - "doc": "" - }, - { - "name": "AdoptionEvidence", - "bases": [ - "BundleModel" - ], - "fields": [ - { - "name": "kind", - "type": "Literal['manual-record', 'meeting-reference', 'source-document']", - "default": "" + "name": "width", + "type": "int", + "line": 55 }, { - "name": "reference", - "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "name": "height", + "type": "int", + "line": 56 }, { - "name": "document_id", - "type": "str | None", - "default": "Field(default=None, min_length=1, max_length=160)" + "name": "fps", + "type": "int", + "line": 57 }, { - "name": "note", - "type": "str", - "default": "Field(min_length=1, max_length=4000)" + "name": "bitrate_kbps", + "type": "int", + "line": 58 } ], - "line": 77, - "doc": "" + "line": 45 + } + ], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/cli.py", + "sha256": "b67d712170f08a90e3477d2c12b04ecef0581e6844f6ad79c661bf0e8f86b722", + "bytes": 2362, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/delivery.py", + "sha256": "c0a850ee43c111e125b79504f4f12c2f99b2b04813ade8f8cfcbc6ace60c0065", + "bytes": 11456, + "routes": [ + { + "method": "GET", + "declared_path": "/v1/civiccast-feeds", + "function": "catalog", + "line": 56 }, { - "name": "PlanBundle", + "method": "POST", + "declared_path": "/v1/recordings/{identity}/youtube", + "function": "upload", + "line": 61 + }, + { + "method": "GET", + "declared_path": "/v1/youtube-uploads", + "function": "list_uploads", + "line": 92 + }, + { + "method": "POST", + "declared_path": "/v1/youtube-uploads/{identity}/retry", + "function": "retry", + "line": 98 + } + ], + "models": [ + { + "name": "Upload", "bases": [ - "BundleModel" + "BaseModel" ], "fields": [ - { - "name": "schema_version", - "type": "Literal[1]", - "default": "1" - }, - { - "name": "plan_id", - "type": "str", - "default": "Field(min_length=1, max_length=160, pattern='^[A-Za-z0-9][A-Za-z0-9._:-]*$')" - }, { "name": "title", "type": "str", - "default": "Field(min_length=1, max_length=500)" - }, - { - "name": "jurisdiction", - "type": "str", - "default": "Field(min_length=1, max_length=255)" - }, - { - "name": "plan_type", - "type": "PlanType", - "default": "" - }, - { - "name": "status", - "type": "Literal['pending', 'adopted', 'superseded']", - "default": "" - }, - { - "name": "visibility", - "type": "Literal['staff', 'public']", - "default": "'staff'" - }, - { - "name": "dataset_kind", - "type": "Literal['municipal', 'demo']", - "default": "'municipal'" - }, - { - "name": "source_date", - "type": "date", - "default": "" - }, - { - "name": "adopted_on", - "type": "date | None", - "default": "None" + "line": 48 }, { - "name": "effective_on", - "type": "date | None", - "default": "None" + "name": "privacy", + "type": "Literal['private', 'unlisted', 'public']", + "line": 49 }, { - "name": "change_note", + "name": "approval_note", "type": "str", - "default": "Field(min_length=1, max_length=4000)" + "line": 50 }, { - "name": "reviewer_label", + "name": "idempotency_key", "type": "str", - "default": "Field(min_length=1, max_length=255)" - }, - { - "name": "documents", - "type": "list[SourceDocument]", - "default": "Field(min_length=1, max_length=20)" - }, - { - "name": "policies", - "type": "list[SourcePolicy]", - "default": "Field(min_length=1, max_length=1000)" - }, - { - "name": "adoption_evidence", - "type": "list[AdoptionEvidence]", - "default": "Field(default_factory=list, max_length=100)" + "line": 51 } ], - "line": 84, - "doc": "" + "line": 46 + } + ], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/feed_job.py", + "sha256": "a2e08fa43b4fb5b7f036de8fdef256cff1a6c39f2b4adabc08b09aa3fedb21f1", + "bytes": 4086, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/live.py", + "sha256": "5f32afd8d2b5e74296a083436b367fec3940da6ae33123fc17842bf0c6c05cce", + "bytes": 1251, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/media-lock.json", + "sha256": "df53ec1559329e1c10c49febd38664a7ced17831bd346044145155d2b3600064", + "bytes": 83333, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/media_job.py", + "sha256": "15237eaa872c9772c548aaf57dced25ec51a343489b894a462d95de19507e59b", + "bytes": 4024, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/operations.py", + "sha256": "69019673d277ee4850d4dd1789e0576b6883d684b0f1ead2be9f965cfdf7b7d2", + "bytes": 19402, + "routes": [ + { + "method": "POST", + "declared_path": "/v1/schedules", + "function": "create_schedule", + "line": 106 + }, + { + "method": "GET", + "declared_path": "/v1/schedules", + "function": "list_schedules", + "line": 143 + }, + { + "method": "POST", + "declared_path": "/v1/schedules/{identity}/cancel", + "function": "cancel_schedule", + "line": 151 + }, + { + "method": "POST", + "declared_path": "/v1/playouts", + "function": "create_playout", + "line": 163 + }, + { + "method": "GET", + "declared_path": "/v1/playouts", + "function": "list_playouts", + "line": 187 + }, + { + "method": "GET", + "declared_path": "/v1/playouts/{identity}", + "function": "get_playout", + "line": 194 + }, + { + "method": "GET", + "declared_path": "/v1/on-air", + "function": "on_air", + "line": 203 + }, + { + "method": "POST", + "declared_path": "/v1/on-air/live", + "function": "live_override", + "line": 215 + }, + { + "method": "POST", + "declared_path": "/v1/on-air/return-to-schedule", + "function": "return_to_schedule", + "line": 232 + }, + { + "method": "POST", + "declared_path": "/v1/playouts/{identity}/approve", + "function": "approve", + "line": 243 + }, + { + "method": "POST", + "declared_path": "/v1/playouts/{identity}/publish", + "function": "publish", + "line": 256 + }, + { + "method": "GET", + "declared_path": "/v1/public/playback/{identity}", + "function": "public_playback", + "line": 285 + }, + { + "method": "GET", + "declared_path": "/v1/public/playback/{identity}/captions", + "function": "public_captions", + "line": 301 + }, + { + "method": "GET", + "declared_path": "/v1/public/playback/{identity}/program", + "function": "public_program", + "line": 315 } ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/source_schema.py", - "sha256": "1c429c22247cda2aaec5abe6807639177f035cae843993666dbf8b2824bbdbf1", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/source_store.py", - "sha256": "97022c50baa5b7e81bcc12fccd6c2e429af35f163680542cbf99b65722905d82", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/staff_analysis.py", - "sha256": "71ab2f06804f1c01678f708c60a27714d7bd9b14444e1d2c8546cedb8ac1bd69", - "routes": [], "models": [ { - "name": "StaffAnalysisDraft", - "bases": [], + "name": "ScheduleRequest", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "project_name", - "type": "str", - "default": "" + "name": "meeting_id", + "type": "UUID", + "line": 60 }, { - "name": "heading", - "type": "str", - "default": "" + "name": "agenda_ids", + "type": "list[UUID]", + "line": 61 }, { - "name": "bullets", - "type": "tuple[str, ...]", - "default": "" + "name": "source_file", + "type": "str | None", + "line": 62 }, { - "name": "citations", - "type": "tuple[str, ...]", - "default": "" + "name": "live_source_id", + "type": "str | None", + "line": 63 }, { - "name": "review_required", - "type": "bool", - "default": "" + "name": "captions_file", + "type": "str | None", + "line": 64 }, { - "name": "disclaimer", + "name": "start_at", + "type": "datetime", + "line": 65 + }, + { + "name": "idempotency_key", "type": "str", - "default": "DISCLAIMER" + "line": 66 } ], - "line": 12, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicplan/workflow_api.py", - "sha256": "6a48664442a3a8bae19a8cea7676e91f53ca3360f65e912dec666504862e792b", - "routes": [ - { - "method": "POST", - "path": "/api/v1/civicplan/analyses", - "router": "router", - "prefix_resolved": true, - "name": "create_analysis", - "signature": "data: AnalysisInput, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 45, - "doc": "", - "decorator": "router.post('/analyses')", - "errors": [ - "HTTPException(422, 'New analyses have no previous revision.')" - ] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/analyses/{analysis_id}/revisions", - "router": "router", - "prefix_resolved": true, - "name": "revise_analysis", - "signature": "analysis_id: str, data: AnalysisInput, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 52, - "doc": "", - "decorator": "router.post('/analyses/{analysis_id}/revisions')", - "errors": [ - "HTTPException(422, 'Supply the analysis previous revision.')" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/analyses/{analysis_id}", - "router": "router", - "prefix_resolved": true, - "name": "read_analysis", - "signature": "analysis_id: str, revision_id: str | None=None, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 59, - "doc": "", - "decorator": "router.get('/analyses/{analysis_id}')", - "errors": [ - "HTTPException(404, 'Analysis not found.')" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/analyses/{analysis_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "analysis_history", - "signature": "analysis_id: str, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 67, - "doc": "", - "decorator": "router.get('/analyses/{analysis_id}/history')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/analyses/{analysis_id}/snapshots", - "router": "router", - "prefix_resolved": true, - "name": "create_snapshot", - "signature": "analysis_id: str, data: SnapshotInput, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 77, - "doc": "", - "decorator": "router.post('/analyses/{analysis_id}/snapshots')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/snapshots/{snapshot_id}", - "router": "router", - "prefix_resolved": true, - "name": "read_snapshot", - "signature": "snapshot_id: str, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 82, - "doc": "", - "decorator": "router.get('/snapshots/{snapshot_id}')", - "errors": [ - "HTTPException(404, 'Snapshot not found.')" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/snapshots/{snapshot_id}/export", - "router": "router", - "prefix_resolved": true, - "name": "export_snapshot", - "signature": "snapshot_id: str, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 90, - "doc": "", - "decorator": "router.get('/snapshots/{snapshot_id}/export')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/snapshots/{snapshot_id}/access-advice", - "router": "router", - "prefix_resolved": true, - "name": "access_advice", - "signature": "snapshot_id: str, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 98, - "doc": "", - "decorator": "router.post('/snapshots/{snapshot_id}/access-advice')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/policies/search", - "router": "router", - "prefix_resolved": true, - "name": "search_policies", - "signature": "data: SearchInput, is_staff=Depends(audience), sources=Depends(repository)", - "returns": "", - "line": 108, - "doc": "", - "decorator": "router.post('/policies/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicplan/connections/search", - "router": "router", - "prefix_resolved": true, - "name": "search_connections", - "signature": "data: ConnectionSearch, actor=Depends(staff), repo=Depends(workflows)", - "returns": "", - "line": 118, - "doc": "", - "decorator": "router.post('/connections/search')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicplan/policy-sources/{revision_id}/documents/{document_id}", - "router": "router", - "prefix_resolved": true, - "name": "public_original", - "signature": "revision_id: str, document_id: str, sources=Depends(repository)", - "returns": "", - "line": 123, - "doc": "", - "decorator": "router.get('/policy-sources/{revision_id}/documents/{document_id}')", - "errors": [ - "HTTPException(404, 'Public policy source unavailable.')", - "HTTPException(404, 'Public policy document not found.')" - ] - } - ], - "models": [ + "line": 58 + }, { - "name": "SnapshotInput", + "name": "PlayoutRequest", "bases": [ - "BundleModel" + "BaseModel" ], "fields": [ { - "name": "expected_revision", + "name": "recording_id", + "type": "UUID", + "line": 71 + }, + { + "name": "mode", "type": "str", - "default": "Field(min_length=36, max_length=36)" + "line": 72 }, { - "name": "visibility", - "type": "Literal['staff_only', 'public']", - "default": "'staff_only'" + "name": "idempotency_key", + "type": "str", + "line": 73 } ], - "line": 71, - "doc": "" + "line": 69 }, { - "name": "SearchInput", + "name": "ApprovalRequest", "bases": [ - "BundleModel" + "BaseModel" ], "fields": [ { - "name": "query", + "name": "note", "type": "str", - "default": "Field(min_length=1, max_length=2000)" - }, - { - "name": "plan_type", - "type": "str | None", - "default": "Field(default=None, max_length=40)" + "line": 78 } ], - "line": 102, - "doc": "" + "line": 76 }, { - "name": "ConnectionSearch", + "name": "LiveOverrideRequest", "bases": [ - "BundleModel" + "BaseModel" ], "fields": [ { - "name": "provider", - "type": "Literal['meetings', 'zoning']", - "default": "" + "name": "live_source_id", + "type": "str", + "line": 85 }, { - "name": "query", + "name": "reason", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 86 } ], - "line": 112, - "doc": "" + "line": 81 } ], "configuration": [] }, { - "source": "installed-owned-source/civicplan/workflow_models.py", - "sha256": "d22e978fe778d7f4fdc3989a043370d9f6966b1e4920ed2c75698c73a8ee4e04", - "routes": [], - "models": [ + "source": "beta-1/townlight_station/operator.py", + "sha256": "6471894a1240b611a2bf006867ce79848630f6dc69270e29e54b71dbb26f3837", + "bytes": 6737, + "routes": [ { - "name": "PolicySelection", - "bases": [ - "BundleModel" - ], - "fields": [ - { - "name": "plan_id", - "type": "str", - "default": "Field(min_length=1, max_length=160)" - }, - { - "name": "revision_id", - "type": "str", - "default": "Field(min_length=36, max_length=36)" - }, - { - "name": "policy_id", - "type": "str", - "default": "Field(min_length=1, max_length=160)" - } - ], - "line": 7, - "doc": "" + "method": "POST", + "declared_path": "/v1/operator-ticket", + "function": "issue", + "line": 51 }, { - "name": "LinkedSource", - "bases": [ - "BundleModel" - ], - "fields": [ - { - "name": "provider", - "type": "Literal['meetings', 'zoning']", - "default": "" - }, - { - "name": "source_id", - "type": "str", - "default": "Field(min_length=1, max_length=200)" - }, - { - "name": "expected_sha256", - "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" - }, - { - "name": "relation", - "type": "Literal['adoption-evidence', 'hearing', 'context', 'precedent']", - "default": "" - } - ], - "line": 13, - "doc": "" + "method": "POST", + "declared_path": "/operator/session", + "function": "exchange", + "line": 60 }, { - "name": "Consideration", + "method": "POST", + "declared_path": "/operator/logout", + "function": "logout", + "line": 75 + }, + { + "method": "GET", + "declared_path": "/operator/catalog", + "function": "catalog", + "line": 82 + }, + { + "method": "GET", + "declared_path": "/operator/meeting/{identity}", + "function": "meeting", + "line": 102 + }, + { + "method": "POST", + "declared_path": "/operator/handoff", + "function": "handoff", + "line": 106 + }, + { + "method": "GET", + "declared_path": "/", + "function": "page", + "line": 124 + }, + { + "method": "GET", + "declared_path": "/operator.js", + "function": "script", + "line": 128 + }, + { + "method": "GET", + "declared_path": "/operator.css", + "function": "style", + "line": 132 + } + ], + "models": [ + { + "name": "Ticket", "bases": [ - "BundleModel" + "BaseModel" ], "fields": [ { - "name": "policy", - "type": "PolicySelection", - "default": "" - }, - { - "name": "stance", - "type": "Literal['supporting', 'conflicting', 'uncertain']", - "default": "" - }, - { - "name": "note", + "name": "ticket", "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "line": 15 } ], - "line": 20, - "doc": "" + "line": 13 }, { - "name": "AnalysisInput", + "name": "Handoff", "bases": [ - "BundleModel" + "BaseModel" ], "fields": [ { - "name": "expected_previous_revision", - "type": "str | None", - "default": "Field(default=None, min_length=36, max_length=36)" - }, - { - "name": "project_name", - "type": "str", - "default": "Field(min_length=1, max_length=500)" - }, - { - "name": "proposal", - "type": "str", - "default": "Field(min_length=1, max_length=10000)" - }, - { - "name": "selected_policies", - "type": "list[PolicySelection]", - "default": "Field(min_length=1, max_length=50)" - }, - { - "name": "considerations", - "type": "list[Consideration]", - "default": "Field(default_factory=list, max_length=100)" - }, - { - "name": "analysis_text", - "type": "str", - "default": "Field(default='', max_length=50000)" - }, - { - "name": "public_summary", - "type": "str", - "default": "Field(default='', max_length=10000)" - }, - { - "name": "staff_notes", - "type": "str", - "default": "Field(default='', max_length=10000)" - }, - { - "name": "audience", - "type": "Literal['staff', 'public']", - "default": "'staff'" - }, - { - "name": "review_state", - "type": "Literal['draft', 'reviewed']", - "default": "'draft'" - }, - { - "name": "reviewer_label", - "type": "str", - "default": "Field(default='', max_length=255)" + "name": "request_id", + "type": "UUID", + "line": 20 }, { - "name": "reviewed_on", - "type": "date | None", - "default": "None" + "name": "recording_id", + "type": "UUID", + "line": 21 }, { - "name": "review_notes", + "name": "expected_sha256", "type": "str", - "default": "Field(default='', max_length=5000)" - }, - { - "name": "linked_sources", - "type": "list[LinkedSource]", - "default": "Field(default_factory=list, max_length=50)" + "line": 22 } ], - "line": 26, - "doc": "" + "line": 18 } ], "configuration": [] }, { - "source": "installed-owned-source/civicplan/workflow_schema.py", - "sha256": "11d864214fabc6d509351fdc7f3e3eb90a910a5db1a137f84a7a8efca5d0002e", + "source": "beta-1/townlight_station/packaging.py", + "sha256": "e53a0b87870b728f6ee5015672e08f9ca05eab0e3c33f5d4c8ecb08b88d92158", + "bytes": 3726, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/store.py", + "sha256": "a075061d7de057e3dbc523ae499ff4160e9ea8db65e6a2816ec2b7bfda62a313", + "bytes": 5756, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/ui/index.html", + "sha256": "89f91f83f2fb28e34aa77ec361209a3c7049b7d38ef48d3f13befc30dbbf5c79", + "bytes": 383, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/ui/operator.css", + "sha256": "689079902c8b58f4737a47bdc8a4352f9845c21d0d6bbc017660bf1c21015ec9", + "bytes": 1723, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/ui/operator.js", + "sha256": "0e55284e2359e62006879948dd6e0f90fc4d6f1095230cafd58e5af3651ae2e7", + "bytes": 202782, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/vod_job.py", + "sha256": "d55a20bdf377142d6acd857aaca86d17468837ee638311dd3ac0fb76b571821d", + "bytes": 4583, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "beta-1/townlight_station/windows_service.py", + "sha256": "8eebfbe5d14fcae26cbd67ff712e7980444b9ae2a2e600283dc577025552a050", + "bytes": 3456, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicplan/workflow_store.py", - "sha256": "4d4fec6d6c876997726ff1d8f2ff39302f44228fae748edc013739267d210741", + "source": "beta-1/townlight_station/worker.py", + "sha256": "dd69aaf49e1af7a887a104b1aee7c5a0f459dc95d6a3d520bacb88ad82748e32", + "bytes": 21320, "routes": [], "models": [], "configuration": [] } - ], - "bridge": [ + ] + }, + "runtime": { + "repository": "townlight/townlight", + "repository_head": "1bad62a1107e9f50bee17ea01ee5cc2e3d0a8bea", + "working_tree_modified": true, + "principal_import": "townlight_runtime", + "source": [ + { + "source": "desktop/runtime/python-services/townlight_runtime/__init__.py", + "sha256": "db3facb7198193860bfabca8f0942a86c69e0739b28475fc6ab43d82ba7515dd", + "bytes": 118, + "routes": [], + "models": [], + "configuration": [] + }, { - "source": "installed-owned-source/civicsuite_runtime/planning_bridge.py", - "sha256": "74a855b995b7f323873b9c788cd15bd4b0ebe3fc1c53879596e1b5043c2825bb", + "source": "desktop/runtime/python-services/townlight_runtime/access_bridge.py", + "sha256": "2a6631747d98cb0e2681fc06455c699a0f1d92584c74d5ca7beae5b9df128ecb", + "bytes": 21767, "routes": [ + { + "method": "GET", + "declared_path": "/state", + "function": "access_state", + "line": 190 + }, + { + "method": "POST", + "declared_path": "/review-context", + "function": "review_context", + "line": 195 + }, + { + "method": "POST", + "declared_path": "/reviews", + "function": "save_review", + "line": 209 + }, + { + "method": "POST", + "declared_path": "/reviews/{review_id}/delete", + "function": "delete_review", + "line": 239 + }, + { + "method": "POST", + "declared_path": "/tools", + "function": "tool", + "line": 255 + }, + { + "method": "POST", + "declared_path": "/rewrite-context", + "function": "rewrite_context", + "line": 285 + }, + { + "method": "POST", + "declared_path": "/rewrite-result", + "function": "rewrite_result", + "line": 300 + }, + { + "method": "POST", + "declared_path": "/reviews/{review_id}/export", + "function": "prepare_export", + "line": 334 + }, { "method": "POST", - "path": "/desktop/v1/planning/imports/preview", - "router": "router", - "prefix_resolved": true, - "name": "preview_import", - "signature": "body: Import, identity=Depends(actor)", - "returns": "", - "line": 80, - "doc": "", - "decorator": "router.post('/imports/preview')", - "errors": [ - "HTTPException(422, 'Invalid source bundle; verify metadata, excerpts, anchors and original hashes.')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/imports", - "router": "router", - "prefix_resolved": true, - "name": "import_source", - "signature": "request: Request, body: Import, identity=Depends(actor)", - "returns": "", - "line": 89, - "doc": "", - "decorator": "router.post('/imports')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/sources", - "router": "router", - "prefix_resolved": true, - "name": "source_list", - "signature": "request: Request, limit: int=Query(50, ge=1, le=100), offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 98, - "doc": "", - "decorator": "router.get('/sources')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/sources/{plan_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "source_history", - "signature": "request: Request, plan_id: str, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 104, - "doc": "", - "decorator": "router.get('/sources/{plan_id}/history')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/revisions/{revision_id}", - "router": "router", - "prefix_resolved": true, - "name": "revision", - "signature": "request: Request, revision_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 109, - "doc": "", - "decorator": "router.get('/revisions/{revision_id}')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/revisions/{revision_id}/documents/{document_id}", - "router": "router", - "prefix_resolved": true, - "name": "staff_original", - "signature": "request: Request, revision_id: UUID, document_id: str, identity=Depends(actor)", - "returns": "", - "line": 127, - "doc": "", - "decorator": "router.get('/revisions/{revision_id}/documents/{document_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/policies/search", - "router": "router", - "prefix_resolved": true, - "name": "policies", - "signature": "request: Request, body: Search, identity=Depends(actor)", - "returns": "", - "line": 137, - "doc": "", - "decorator": "router.post('/policies/search')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/analyses", - "router": "router", - "prefix_resolved": true, - "name": "analyses", - "signature": "request: Request, limit: int=Query(50, ge=1, le=100), offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 142, - "doc": "", - "decorator": "router.get('/analyses')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/analyses", - "router": "router", - "prefix_resolved": true, - "name": "create_analysis", - "signature": "request: Request, body: dict, identity=Depends(actor)", - "returns": "", - "line": 155, - "doc": "", - "decorator": "router.post('/analyses')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/analyses/{analysis_id}/revisions", - "router": "router", - "prefix_resolved": true, - "name": "revise_analysis", - "signature": "request: Request, analysis_id: UUID, body: dict, identity=Depends(actor)", - "returns": "", - "line": 165, - "doc": "", - "decorator": "router.post('/analyses/{analysis_id}/revisions')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/analyses/{analysis_id}", - "router": "router", - "prefix_resolved": true, - "name": "analysis", - "signature": "request: Request, analysis_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 175, - "doc": "", - "decorator": "router.get('/analyses/{analysis_id}')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/analyses/{analysis_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "analysis_history", - "signature": "request: Request, analysis_id: UUID, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 180, - "doc": "", - "decorator": "router.get('/analyses/{analysis_id}/history')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/analyses/{analysis_id}/snapshot-preview", - "router": "router", - "prefix_resolved": true, - "name": "preview_snapshot", - "signature": "request: Request, analysis_id: UUID, body: Snapshot, identity=Depends(actor)", - "returns": "", - "line": 190, - "doc": "", - "decorator": "router.post('/analyses/{analysis_id}/snapshot-preview')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/analyses/{analysis_id}/snapshots", - "router": "router", - "prefix_resolved": true, - "name": "snapshot", - "signature": "request: Request, analysis_id: UUID, body: Snapshot, identity=Depends(actor)", - "returns": "", - "line": 195, - "doc": "", - "decorator": "router.post('/analyses/{analysis_id}/snapshots')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/snapshots", - "router": "router", - "prefix_resolved": true, - "name": "snapshots", - "signature": "request: Request, limit: int=Query(50, ge=1, le=100), offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 200, - "doc": "", - "decorator": "router.get('/snapshots')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/snapshots/{snapshot_id}", - "router": "router", - "prefix_resolved": true, - "name": "document", - "signature": "request: Request, snapshot_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 206, - "doc": "", - "decorator": "router.get('/snapshots/{snapshot_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/snapshots/{snapshot_id}/access-advice", - "router": "router", - "prefix_resolved": true, - "name": "access_advice", - "signature": "request: Request, snapshot_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 211, - "doc": "", - "decorator": "router.post('/snapshots/{snapshot_id}/access-advice')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/connections/search", - "router": "router", - "prefix_resolved": true, - "name": "connections", - "signature": "request: Request, body: ConnectionSearch, identity=Depends(actor)", - "returns": "", - "line": 221, - "doc": "", - "decorator": "router.post('/connections/search')", - "errors": [] - }, - { - "method": "POST", - "path": "/civicplan/policies/search", - "router": "public_router", - "prefix_resolved": true, - "name": "public_policies", - "signature": "request: Request, body: Search", - "returns": "", - "line": 226, - "doc": "", - "decorator": "public_router.post('/policies/search', dependencies=[Depends(available)])", - "errors": [] - }, - { - "method": "POST", - "path": "/civicplan/plan-explore", - "router": "public_router", - "prefix_resolved": true, - "name": "public_plan_explore", - "signature": "request: Request, body: PublicExplore", - "returns": "", - "line": 238, - "doc": "Topic/goal/plan-type exploration over adopted public plan sources only.", - "decorator": "public_router.post('/plan-explore', dependencies=[Depends(available)])", - "errors": [] - }, - { - "method": "GET", - "path": "/civicplan/snapshots", - "router": "public_router", - "prefix_resolved": true, - "name": "public_snapshots", - "signature": "request: Request, limit: int=Query(50, ge=1, le=100), offset: int=Query(0, ge=0, le=100000)", - "returns": "", - "line": 254, - "doc": "", - "decorator": "public_router.get('/snapshots', dependencies=[Depends(available)])", - "errors": [] - }, - { - "method": "GET", - "path": "/civicplan/snapshots/{snapshot_id}", - "router": "public_router", - "prefix_resolved": true, - "name": "public_document", - "signature": "request: Request, snapshot_id: UUID", - "returns": "", - "line": 260, - "doc": "", - "decorator": "public_router.get('/snapshots/{snapshot_id}', dependencies=[Depends(available)])", - "errors": [] - }, - { - "method": "GET", - "path": "/civicplan/revisions/{revision_id}/documents/{document_id}", - "router": "public_router", - "prefix_resolved": true, - "name": "public_original", - "signature": "request: Request, revision_id: UUID, document_id: str", - "returns": "", - "line": 265, - "doc": "", - "decorator": "public_router.get('/revisions/{revision_id}/documents/{document_id}', dependencies=[Depends(available)])", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/progress/targets", - "router": "router", - "prefix_resolved": true, - "name": "municipal_progress", - "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 270, - "doc": "", - "decorator": "router.get('/progress/targets')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/amendments/history", - "router": "router", - "prefix_resolved": true, - "name": "municipal_amendments", - "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 275, - "doc": "", - "decorator": "router.get('/amendments/history')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/planning/municipal-work/{item_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "municipal_history", - "signature": "request: Request, item_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 280, - "doc": "", - "decorator": "router.get('/municipal-work/{item_id}/history')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/initiatives", - "router": "router", - "prefix_resolved": true, - "name": "create_initiative", - "signature": "request: Request, body: InitiativeInput, identity=Depends(actor)", - "returns": "", - "line": 285, - "doc": "", - "decorator": "router.post('/initiatives')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/initiatives/{item_id}/revisions", - "router": "router", - "prefix_resolved": true, - "name": "update_initiative", - "signature": "request: Request, item_id: UUID, body: InitiativeInput, identity=Depends(actor)", - "returns": "", - "line": 290, - "doc": "", - "decorator": "router.post('/initiatives/{item_id}/revisions')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/amendments", - "router": "router", - "prefix_resolved": true, - "name": "create_amendment", - "signature": "request: Request, body: AmendmentInput, identity=Depends(actor)", - "returns": "", - "line": 295, - "doc": "", - "decorator": "router.post('/amendments')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/planning/amendments/{item_id}/revisions", - "router": "router", - "prefix_resolved": true, - "name": "update_amendment", - "signature": "request: Request, item_id: UUID, body: AmendmentInput, identity=Depends(actor)", - "returns": "", - "line": 300, - "doc": "", - "decorator": "router.post('/amendments/{item_id}/revisions')", - "errors": [] + "declared_path": "/drafts/{draft_id}/export", + "function": "export_draft", + "line": 345 + }, + { + "method": "POST", + "declared_path": "/exports/{artifact_id}/complete", + "function": "complete_export", + "line": 373 } ], "models": [ { - "name": "Import", + "name": "ReviewInput", "bases": [ - "BundleModel" + "BaseModel" ], "fields": [ { - "name": "bundle", - "type": "dict", - "default": "" + "name": "title", + "type": "str", + "line": 84 }, { - "name": "expected_previous_revision", - "type": "str | None", - "default": "Field(default=None, min_length=36, max_length=36)" + "name": "body", + "type": "str", + "line": 85 + }, + { + "name": "hasAltText", + "type": "bool", + "line": 86 + }, + { + "name": "language", + "type": "str", + "line": 87 } ], - "line": 74, - "doc": "" + "line": 82 }, { - "name": "Search", + "name": "SaveReview", "bases": [ - "BundleModel" + "ReviewInput" ], "fields": [ { - "name": "query", - "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "name": "ai_analysis", + "type": "str | None", + "line": 92 }, { - "name": "plan_type", + "name": "ai_analysis_model", "type": "str | None", - "default": "Field(default=None, max_length=40)" + "line": 93 + }, + { + "name": "ai_outcome", + "type": "Literal['generated', 'unavailable', 'failed']", + "line": 94 } ], - "line": 131, - "doc": "" + "line": 90 }, { - "name": "Snapshot", + "name": "FormPlan", "bases": [ - "BundleModel" + "ToolInput" ], "fields": [ { - "name": "expected_revision", - "type": "UUID", - "default": "" + "name": "action", + "type": "Literal['form-plan']", + "line": 102 }, { - "name": "visibility", - "type": "Literal['staff_only', 'public']", - "default": "" + "name": "formName", + "type": "str", + "line": 103 + }, + { + "name": "fields", + "type": "list[str]", + "line": 104 } ], - "line": 184, - "doc": "" + "line": 101 }, { - "name": "ConnectionSearch", + "name": "PublishingPlan", "bases": [ - "BundleModel" + "ToolInput" ], "fields": [ { - "name": "provider", - "type": "Literal['meetings', 'zoning']", - "default": "" + "name": "action", + "type": "Literal['publishing-workflow']", + "line": 108 }, { - "name": "query", + "name": "title", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 109 + }, + { + "name": "hasReview", + "type": "bool", + "line": 110 + }, + { + "name": "hasPlainLanguage", + "type": "bool", + "line": 111 + }, + { + "name": "hasTranslationReview", + "type": "bool", + "line": 112 } ], - "line": 215, - "doc": "" + "line": 107 }, { - "name": "PublicExplore", + "name": "AdaPlan", "bases": [ - "BundleModel" + "ToolInput" ], "fields": [ { - "name": "goal", - "type": "str", - "default": "Field(default='', max_length=500)" - }, - { - "name": "topic", - "type": "str", - "default": "Field(default='', max_length=160)" + "name": "action", + "type": "Literal['ada-title-ii']", + "line": 116 }, { - "name": "neighborhood", + "name": "serviceArea", "type": "str", - "default": "Field(default='', max_length=255)" + "line": 117 }, { - "name": "plan_type", - "type": "str", - "default": "Field(default='', max_length=120)" + "name": "hasCoordinatorReview", + "type": "bool", + "line": 118 } ], - "line": 230, - "doc": "" - } - ], - "configuration": [] - } - ] - }, - "permitting": { - "package": "civicpermit", - "source": [ - { - "source": "installed-owned-source/civicpermit/__init__.py", - "sha256": "a5b97430c7d8d5cfff984857fe16a7c72868d652340640cb9bdcdfe39ddb209c", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/connections.py", - "sha256": "4159a4eb4a407bebbefeb49bb760788cff3ac51a45c34af094d3be4b5a746798", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/intake_review.py", - "sha256": "694f531a12e56c283579e92f85651d08da776e916021ab19f4d7108c3120b41d", - "routes": [], - "models": [ + "line": 115 + }, { - "name": "IntakeReadiness", - "bases": [], + "name": "TaggedPlan", + "bases": [ + "ToolInput" + ], "fields": [ { - "name": "project_type", - "type": "str", - "default": "" + "name": "action", + "type": "Literal['tagged-pdf']", + "line": 122 }, { - "name": "status", - "type": "str", - "default": "" - }, + "name": "headingLevels", + "type": "list[Annotated[int, Field(ge=0, le=4294967295, strict=True)]]", + "line": 123 + } + ], + "line": 121 + }, + { + "name": "RewriteInput", + "bases": [ + "ToolInput" + ], + "fields": [ { - "name": "missing_or_unclear", - "type": "tuple[str, ...]", - "default": "" + "name": "action", + "type": "Literal['plain-language', 'language-variant']", + "line": 130 }, { - "name": "next_step", + "name": "text", "type": "str", - "default": "" + "line": 131 }, { - "name": "disclaimer", + "name": "language", "type": "str", - "default": "DISCLAIMER" + "line": 132 } ], - "line": 11, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/integration_mocks.py", - "sha256": "d1f1b614d502ada64a87d879703e9afa72402b69e8df5a1cf25cbd78f783e111", - "routes": [], - "models": [ + "line": 129 + }, { - "name": "IntegrationMockResult", - "bases": [], + "name": "RewriteResult", + "bases": [ + "RewriteInput" + ], "fields": [ { - "name": "scenario", - "type": "str", - "default": "" - }, - { - "name": "status", - "type": "str", - "default": "" + "name": "outcome", + "type": "Literal['generated', 'unavailable']", + "line": 136 }, { - "name": "review_required", - "type": "bool", - "default": "" + "name": "generated", + "type": "str | None", + "line": 137 }, { - "name": "findings", - "type": "tuple[str, ...]", - "default": "" - }, + "name": "model", + "type": "str | None", + "line": 138 + } + ], + "line": 135 + }, + { + "name": "ExportReceipt", + "bases": [ + "ToolInput" + ], + "fields": [ { - "name": "boundary", + "name": "export_path", "type": "str", - "default": "" + "line": 142 } ], - "line": 10, - "doc": "" + "line": 141 + } + ], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/code_bridge.py", + "sha256": "62a20112343434f75867e6feefeca235688b9e6f37b08410f332a3a0e185774c", + "bytes": 5279, + "routes": [ + { + "method": "POST", + "declared_path": "/imports", + "function": "imports", + "line": 46 + }, + { + "method": "GET", + "declared_path": "/sources", + "function": "sources", + "line": 55 + }, + { + "method": "GET", + "declared_path": "/workspace", + "function": "workspace", + "line": 60 + }, + { + "method": "GET", + "declared_path": "/lookup", + "function": "lookup", + "line": 68 + }, + { + "method": "GET", + "declared_path": "/sections/{section_id}/history", + "function": "section_history", + "line": 77 + }, + { + "method": "GET", + "declared_path": "/citation", + "function": "citation", + "line": 82 + }, + { + "method": "GET", + "declared_path": "/search", + "function": "search", + "line": 89 + }, + { + "method": "GET", + "declared_path": "/imports", + "function": "list_imports", + "line": 100 + }, + { + "method": "GET", + "declared_path": "/imports/{job_id}/tree", + "function": "import_tree", + "line": 105 + }, + { + "method": "GET", + "declared_path": "/imports/{job_id}/provenance", + "function": "import_provenance", + "line": 110 + }, + { + "method": "GET", + "declared_path": "/export", + "function": "export_section", + "line": 115 + }, + { + "method": "POST", + "declared_path": "/questions", + "function": "questions", + "line": 120 + }, + { + "method": "POST", + "declared_path": "/sections/{section_id}/notes", + "function": "create_note", + "line": 125 + }, + { + "method": "GET", + "declared_path": "/sections/{section_id}/notes", + "function": "list_notes", + "line": 130 + }, + { + "method": "POST", + "declared_path": "/sections/{section_id}/summaries", + "function": "create_summary", + "line": 135 + }, + { + "method": "POST", + "declared_path": "/summaries/{summary_id}/approve", + "function": "approve_summary", + "line": 140 + }, + { + "method": "GET", + "declared_path": "/sections/{section_id}/summaries", + "function": "list_summaries", + "line": 145 } ], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/code_meetings.py", + "sha256": "dafae58b355e09ae4fcf81037c25801d48fe38ca7f0f379d5ca44e9145e808a3", + "bytes": 13399, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicpermit/main.py", - "sha256": "d1186d8d291225cfff5dc66e40ab435d899d8a059506a6be6f3b413b7a5c8b90", + "source": "desktop/runtime/python-services/townlight_runtime/code_meetings_bridge.py", + "sha256": "eed7d1036cdc81b98288246e960194057d90edd6df6d3634a7f9cfce1ddc52e0", + "bytes": 4635, "routes": [ { "method": "GET", - "path": "/", - "router": "app", - "prefix_resolved": true, - "name": "root", - "signature": "", - "returns": "dict[str, str]", - "line": 104, - "doc": "Return current product state without overstating unshipped behavior.", - "decorator": "app.get('/')", - "errors": [] - }, - { - "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "health", - "signature": "", - "returns": "dict[str, str]", - "line": 124, - "doc": "Return dependency/version health for deployment smoke checks.", - "decorator": "app.get('/health')", - "errors": [] - }, - { - "method": "GET", - "path": "/civicpermit", - "router": "app", - "prefix_resolved": true, - "name": "public_civicpermit_page", - "signature": "", - "returns": "str", - "line": 163, - "doc": "Return the public sample permit pre-application UI.", - "decorator": "app.get('/civicpermit', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/requirements/lookup", - "router": "app", - "prefix_resolved": true, - "name": "requirement_lookup", - "signature": "request: RequirementLookupRequest", - "returns": "dict[str, object]", - "line": 170, - "doc": "", - "decorator": "app.post('/api/v1/civicpermit/requirements/lookup')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/intake/review", - "router": "app", - "prefix_resolved": true, - "name": "intake_review", - "signature": "request: IntakeReviewRequest, x_civicpermit_role: Annotated[str | None, Header()]=None, x_civicpermit_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 179, - "doc": "", - "decorator": "app.post('/api/v1/civicpermit/intake/review')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/pathway/explain", - "router": "app", - "prefix_resolved": true, - "name": "pathway_explain", - "signature": "request: PathwayRequest", - "returns": "dict[str, object]", - "line": 305, - "doc": "Cited likely pathway/attachments/timeline/explainer, no model call.", - "decorator": "app.post('/api/v1/civicpermit/pathway/explain')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/pathway/explain-assisted", - "router": "app", - "prefix_resolved": true, - "name": "pathway_explain_assisted", - "signature": "request: PathwayRequest", - "returns": "dict[str, object]", - "line": 319, - "doc": "Same, plus an actual configured-provider call; `assistance` says what ran.", - "decorator": "app.post('/api/v1/civicpermit/pathway/explain-assisted')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/context/development-review", - "router": "app", - "prefix_resolved": true, - "name": "development_review_context", - "signature": "request: DevelopmentReviewContextRequest", - "returns": "dict[str, object]", - "line": 339, - "doc": "", - "decorator": "app.post('/api/v1/civicpermit/context/development-review')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/integrations/mock/development-review", - "router": "app", - "prefix_resolved": true, - "name": "integration_mock_development_review", - "signature": "request: IntegrationMockRequest", - "returns": "dict[str, object]", - "line": 372, - "doc": "", - "decorator": "app.post('/api/v1/civicpermit/integrations/mock/development-review')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicpermit/intake/{intake_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_intake_review", - "signature": "intake_id: str, x_civicpermit_role: Annotated[str | None, Header()]=None, x_civicpermit_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 384, - "doc": "", - "decorator": "app.get('/api/v1/civicpermit/intake/{intake_id}')", - "errors": [ - "HTTPException(status_code=503, detail={'message': 'Townlight Permitting intake persistence is not configured.', 'fix': 'Set CIVICPERMIT_INTAKE_DB_URL to retrieve persisted intake review records.'})", - "HTTPException(status_code=404, detail={'message': 'Permit intake record not found.', 'fix': 'Use an intake_id returned by POST /api/v1/civicpermit/intake/review.'})" - ] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/submittal/outline", - "router": "app", - "prefix_resolved": true, - "name": "submittal_outline", - "signature": "request: SubmittalOutlineRequest", - "returns": "dict[str, object]", - "line": 411, - "doc": "", - "decorator": "app.post('/api/v1/civicpermit/submittal/outline')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/export", - "router": "app", - "prefix_resolved": true, - "name": "permit_export", - "signature": "request: PermitExportRequest", - "returns": "dict[str, object]", - "line": 421, - "doc": "", - "decorator": "app.post('/api/v1/civicpermit/export')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicpermit/staff/reviews", - "router": "app", - "prefix_resolved": true, - "name": "create_staff_review", - "signature": "request: StaffReviewCreateRequest, x_civicpermit_role: Annotated[str | None, Header()]=None, x_civicpermit_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 431, - "doc": "", - "decorator": "app.post('/api/v1/civicpermit/staff/reviews')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicpermit/staff/reviews", - "router": "app", - "prefix_resolved": true, - "name": "list_staff_reviews", - "signature": "status: str | None=None, x_civicpermit_role: Annotated[str | None, Header()]=None, x_civicpermit_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 449, - "doc": "", - "decorator": "app.get('/api/v1/civicpermit/staff/reviews')", - "errors": [] + "declared_path": "/connections", + "function": "list_connections", + "line": 87 }, { - "method": "PATCH", - "path": "/api/v1/civicpermit/staff/reviews/{review_id}", - "router": "app", - "prefix_resolved": true, - "name": "update_staff_review", - "signature": "review_id: str, request: StaffReviewUpdateRequest, x_civicpermit_role: Annotated[str | None, Header()]=None, x_civicpermit_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 466, - "doc": "", - "decorator": "app.patch('/api/v1/civicpermit/staff/reviews/{review_id}')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Townlight Permitting staff review item was not found.', 'fix': 'List staff reviews and retry with an existing review_id.'})", - "HTTPException(status_code=422, detail={'message': 'Staff review update is invalid.', 'fix': str(exc)})" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicpermit/staff/reviews/summary", - "router": "app", - "prefix_resolved": true, - "name": "staff_review_summary", - "signature": "x_civicpermit_role: Annotated[str | None, Header()]=None, x_civicpermit_staff_key: Annotated[str | None, Header()]=None", - "returns": "dict[str, object]", - "line": 498, - "doc": "", - "decorator": "app.get('/api/v1/civicpermit/staff/reviews/summary')", - "errors": [] + "method": "GET", + "declared_path": "/connections/{connection_id}", + "function": "get_connection", + "line": 92 + }, + { + "method": "POST", + "declared_path": "/connections", + "function": "create_connection", + "line": 97 + }, + { + "method": "POST", + "declared_path": "/connections/{connection_id}/closeout", + "function": "closeout_connection", + "line": 104 + }, + { + "method": "GET", + "declared_path": "/code-connections", + "function": "list_code_connections", + "line": 111 + }, + { + "method": "GET", + "declared_path": "/code-connections/{connection_id}", + "function": "get_code_connection", + "line": 116 + }, + { + "method": "POST", + "declared_path": "/code-connections/{connection_id}/decisions", + "function": "record_decision", + "line": 121 } ], "models": [ { - "name": "RequirementLookupRequest", + "name": "Proposal", "bases": [ - "BaseModel" + "_Strict" ], "fields": [ { - "name": "project_type", - "type": "str", - "default": "Field(min_length=1, max_length=255)" + "name": "id", + "type": "Key", + "line": 27 }, { - "name": "location_context", - "type": "str", - "default": "Field(default='', max_length=500)" - } - ], - "line": 45, - "doc": "" - }, - { - "name": "IntakeReviewRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "proposal", + "name": "version_id", "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "line": 28 }, { - "name": "project_type", - "type": "str", - "default": "Field(min_length=1, max_length=255)" - } - ], - "line": 50, - "doc": "" - }, - { - "name": "DevelopmentReviewContextRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "meeting_id", + "type": "UUID", + "line": 29 + }, { - "name": "project_type", + "name": "title", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 30 }, { - "name": "proposal", + "name": "ordinance_number", "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "line": 31 }, { - "name": "location_context", + "name": "proposed_text", "type": "str", - "default": "Field(default='', max_length=500)" + "line": 32 }, { - "name": "zoning_context_id", - "type": "str | None", - "default": "Field(default=None, max_length=160)" + "name": "supersedes_id", + "type": "Key | None", + "line": 33 }, { - "name": "code_context_id", + "name": "reconciliation_note", "type": "str | None", - "default": "Field(default=None, max_length=160)" + "line": 34 } ], - "line": 55, - "doc": "" + "line": 26 }, { - "name": "SubmittalOutlineRequest", + "name": "Decision", "bases": [ - "BaseModel" + "_Strict" ], "fields": [ { - "name": "project_name", - "type": "str", - "default": "Field(min_length=1, max_length=500)" + "name": "id", + "type": "Key", + "line": 38 }, { - "name": "proposal", - "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "name": "outcome", + "type": "Literal['adopted', 'not_adopted', 'deferred', 'withdrawn']", + "line": 39 }, { - "name": "project_type", - "type": "str", - "default": "Field(min_length=1, max_length=255)" - } - ], - "line": 65, - "doc": "" - }, - { - "name": "PermitExportRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "name": "decided_at", + "type": "AwareDatetime | None", + "line": 40 + }, { - "name": "title", + "name": "decision_text", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 41 }, { - "name": "project_type", - "type": "str", - "default": "Field(min_length=1, max_length=255)" + "name": "supporting_references", + "type": "list[str]", + "line": 42 }, { - "name": "format", - "type": "str", - "default": "Field(default='markdown', min_length=1, max_length=40)" + "name": "supersedes_decision_id", + "type": "Key | None", + "line": 43 + }, + { + "name": "reconciliation_note", + "type": "str | None", + "line": 44 } ], - "line": 71, - "doc": "" + "line": 37 }, { - "name": "StaffReviewCreateRequest", + "name": "Closeout", "bases": [ - "BaseModel" + "_Strict" ], "fields": [ { - "name": "proposal", - "type": "str", - "default": "Field(min_length=1, max_length=5000)" + "name": "decision_id", + "type": "Key", + "line": 48 }, { - "name": "project_type", + "name": "version_id", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 49 }, { - "name": "reason", + "name": "source_id", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 50 }, { - "name": "intake_id", - "type": "str | None", - "default": "Field(default=None, max_length=36)" - } - ], - "line": 77, - "doc": "" - }, - { - "name": "StaffReviewUpdateRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "status", + "name": "version_label", "type": "str", - "default": "Field(min_length=1, max_length=80)" - }, - { - "name": "assigned_to", - "type": "str | None", - "default": "Field(default=None, max_length=255)" + "line": 51 }, { - "name": "resolution", - "type": "str | None", - "default": "Field(default=None, max_length=2000)" - } - ], - "line": 84, - "doc": "" - }, - { - "name": "PathwayRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "project_type", + "name": "body", "type": "str", - "default": "Field(min_length=1, max_length=255)" + "line": 52 }, { - "name": "proposal", - "type": "str", - "default": "Field(default='', max_length=5000)" + "name": "effective_start", + "type": "date", + "line": 53 }, { - "name": "location_context", - "type": "str", - "default": "Field(default='', max_length=500)" + "name": "effective_end", + "type": "date | None", + "line": 54 }, { - "name": "use_model_assistance", + "name": "is_current", "type": "bool", - "default": "Field(default=False)" - } - ], - "line": 90, - "doc": "" - }, - { - "name": "IntegrationMockRequest", - "bases": [ - "BaseModel" - ], - "fields": [ + "line": 55 + }, { - "name": "scenario", - "type": "str", - "default": "Field(default='development-review-context', max_length=160)" + "name": "reconciliation_note", + "type": "str | None", + "line": 56 } ], - "line": 97, - "doc": "" + "line": 47 } ], - "configuration": [ + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/code_public.py", + "sha256": "8c28292fed544f4db88541054f02d60d707130c11c70a1f10b42916302a02433", + "bytes": 4822, + "routes": [ { - "variable": "CIVICPERMIT_INTAKE_DB_URL", - "default": "", - "line": 508 + "method": "GET", + "declared_path": "", + "function": "home", + "line": 66 }, { - "variable": "CIVICPERMIT_LLM_MODEL", - "default": "", - "line": 233 + "method": "GET", + "declared_path": "/search", + "function": "search", + "line": 71 }, { - "variable": "CIVICPERMIT_LLM_PROVIDER", - "default": "''", - "line": 218 + "method": "GET", + "declared_path": "/answer", + "function": "answer", + "line": 80 + }, + { + "method": "GET", + "declared_path": "/sections/{section_ref}", + "function": "detail", + "line": 91 + }, + { + "method": "GET", + "declared_path": "/sections/{section_ref}/export", + "function": "export", + "line": 109 } - ] + ], + "models": [], + "configuration": [] }, { - "source": "installed-owned-source/civicpermit/migrations/__init__.py", - "sha256": "01c6b95137260717ee792116a0479392b3f2da330542c55dbd181c4a93d404a3", + "source": "desktop/runtime/python-services/townlight_runtime/code_records.py", + "sha256": "d7a78ddc87493c02c78b9f027a69708b55040c8c4445644ba4b36340fd459bc4", + "bytes": 3174, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicpermit/migrations/env.py", - "sha256": "91715ad26e140d1b25b30ad38b3418d36ea63da4a195348aa5fe621c99edbe5e", + "source": "desktop/runtime/python-services/townlight_runtime/database_identity.py", + "sha256": "7aaf74fe0ab5b5e13c5527f1069e5ad15a4b66c13df98c327969b3bad2c3bd7d", + "bytes": 1624, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicpermit/migrations/versions/civicpermit_0001_connected.py", - "sha256": "e3fc90959836887334b429888407537140fa2d119c202886b63c538feb4e9360", + "source": "desktop/runtime/python-services/townlight_runtime/fixtures/redstone-valley-records-demo-v1.json", + "sha256": "859a65633f6f4575bb53f5db61a11b0a092cc1f9b145b828e70729cfd28e6a34", + "bytes": 6629, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicpermit/pathway.py", - "sha256": "b1e311809d61f4efab043c681efa9d711d5bf4bf76b5f33f808c1769e3687d08", - "routes": [], + "source": "desktop/runtime/python-services/townlight_runtime/inspections_bridge.py", + "sha256": "6c840905c53d00a5d7ab5f39b8ca276924098ff11929913fe9b02bba457bf553", + "bytes": 10132, + "routes": [ + { + "method": "POST", + "declared_path": "/repeat-cases", + "function": "repeat_cases", + "line": 93 + }, + { + "method": "POST", + "declared_path": "/notice-draft", + "function": "notice", + "line": 98 + }, + { + "method": "GET", + "declared_path": "/cases", + "function": "cases", + "line": 105 + }, + { + "method": "POST", + "declared_path": "/cases", + "function": "create_case", + "line": 110 + }, + { + "method": "GET", + "declared_path": "/cases/{case_id}", + "function": "case", + "line": 115 + }, + { + "method": "POST", + "declared_path": "/cases/{case_id}/revisions", + "function": "revise", + "line": 120 + }, + { + "method": "GET", + "declared_path": "/cases/{case_id}/history", + "function": "history", + "line": 125 + }, + { + "method": "POST", + "declared_path": "/cases/{case_id}/packets", + "function": "packet", + "line": 135 + }, + { + "method": "GET", + "declared_path": "/packets/{packet_id}", + "function": "document", + "line": 140 + }, + { + "method": "GET", + "declared_path": "/evidence/supported-types", + "function": "supported_types", + "line": 179 + }, + { + "method": "POST", + "declared_path": "/evidence/retain", + "function": "retain", + "line": 188 + }, + { + "method": "POST", + "declared_path": "/media/analyse", + "function": "media_analyse", + "line": 199 + }, + { + "method": "POST", + "declared_path": "/connections/search", + "function": "connections", + "line": 234 + } + ], "models": [ { - "name": "AssistantProvider", + "name": "RepeatLookup", "bases": [ - "Protocol" + "Model" ], "fields": [ { - "name": "name", + "name": "property_reference", "type": "str", - "default": "" + "line": 89 } ], - "line": 74, - "doc": "Structural type of the civiccore LLM provider used for the explainer." + "line": 88 }, { - "name": "PathwayStage", - "bases": [], + "name": "Packet", + "bases": [ + "Model" + ], "fields": [ { - "name": "key", - "type": "str", - "default": "" - }, - { - "name": "label", - "type": "str", - "default": "" - }, - { - "name": "source_id", - "type": "str", - "default": "" + "name": "expected_revision", + "type": "UUID", + "line": 130 }, { - "name": "typical_time", - "type": "str", - "default": "" + "name": "visibility", + "type": "Literal['staff_only', 'records_copy']", + "line": 131 } ], - "line": 91, - "doc": "A cited step in the pre-application pathway.\n\n``source_id`` is resolved through the configured public source providers;\nthe displayed citation and text are copied from the resolved source so the\npathway can never show a citation that does not exist." + "line": 129 }, { - "name": "Pathway", - "bases": [], + "name": "EvidenceItem", + "bases": [ + "Model" + ], "fields": [ { - "name": "project_type", + "name": "filename", "type": "str", - "default": "" + "line": 145 }, { - "name": "title", + "name": "media_type", "type": "str", - "default": "" - }, - { - "name": "stages", - "type": "tuple[PathwayStage, ...]", - "default": "" + "line": 146 }, { - "name": "attachments_citation", + "name": "description", "type": "str", - "default": "" + "line": 147 }, { - "name": "attachments", - "type": "tuple[str, ...]", - "default": "" + "name": "content_base64", + "type": "str", + "line": 148 }, { - "name": "note", + "name": "sha256", "type": "str", - "default": "''" + "line": 149 } ], - "line": 106, - "doc": "" + "line": 144 }, { - "name": "PathwayExplanation", - "bases": [], + "name": "EvidenceItems", + "bases": [ + "Model" + ], "fields": [ { - "name": "project_type", - "type": "str", - "default": "" - }, - { - "name": "title", - "type": "str", - "default": "" - }, - { - "name": "likely_permits", - "type": "list[dict[str, str]]", - "default": "field(default_factory=list)" - }, - { - "name": "attachments", - "type": "list[dict[str, str]]", - "default": "field(default_factory=list)" - }, - { - "name": "timeline", - "type": "list[dict[str, str]]", - "default": "field(default_factory=list)" - }, - { - "name": "unavailable", - "type": "list[dict[str, str]]", - "default": "field(default_factory=list)" - }, - { - "name": "fee", - "type": "dict[str, object]", - "default": "field(default_factory=dict)" - }, - { - "name": "resident_explanation", - "type": "str", - "default": "''" - }, - { - "name": "assistance", - "type": "dict[str, object]", - "default": "field(default_factory=dict)" - }, - { - "name": "review_required", - "type": "bool", - "default": "True" - }, - { - "name": "determination_made", - "type": "bool", - "default": "False" - }, + "name": "items", + "type": "list[EvidenceItem]", + "line": 153 + } + ], + "line": 152 + }, + { + "name": "CodeLink", + "bases": [ + "Model" + ], + "fields": [ { - "name": "citations", - "type": "list[str]", - "default": "field(default_factory=list)" + "name": "provider", + "type": "Literal['code']", + "line": 157 }, { - "name": "boundary", + "name": "source_id", "type": "str", - "default": "BOUNDARY" + "line": 158 }, { - "name": "disclaimer", + "name": "expected_sha256", "type": "str", - "default": "DISCLAIMER" + "line": 159 } ], - "line": 132, - "doc": "Assembled, citation-checked pre-application explanation." - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/persistence.py", - "sha256": "cea7301cde02497e65601351e58100b3211cf79e85e3036f251107f7d21fe95b", - "routes": [], - "models": [ + "line": 156 + }, { - "name": "StoredIntakeReview", - "bases": [], + "name": "MediaAnalysis", + "bases": [ + "Model" + ], "fields": [ { - "name": "intake_id", - "type": "str", - "default": "" - }, - { - "name": "project_type", - "type": "str", - "default": "" + "name": "items", + "type": "list[EvidenceItem]", + "line": 163 }, { - "name": "proposal", - "type": "str", - "default": "" + "name": "code_links", + "type": "list[CodeLink]", + "line": 164 }, { - "name": "status", + "name": "inspector_supplied_text", "type": "str", - "default": "" - }, - { - "name": "missing_or_unclear", - "type": "tuple[str, ...]", - "default": "" - }, + "line": 165 + } + ], + "line": 162 + }, + { + "name": "Search", + "bases": [ + "Model" + ], + "fields": [ { - "name": "next_step", - "type": "str", - "default": "" + "name": "provider", + "type": "Literal['code']", + "line": 229 }, { - "name": "disclaimer", + "name": "query", "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "" + "line": 230 } ], - "line": 72, - "doc": "" + "line": 228 + } + ], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/meetings_bridge.py", + "sha256": "c188c7f52163681ffbd3dcee61da2f7cba24df6839adb421be804087dca4ff4c", + "bytes": 29127, + "routes": [ + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/stages", + "function": "record_meeting_stage", + "line": 106 + }, + { + "method": "POST", + "declared_path": "/meetings", + "function": "create_meeting", + "line": 128 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}", + "function": "get_meeting", + "line": 136 + }, + { + "method": "POST", + "declared_path": "/agenda-items", + "function": "create_agenda_item", + "line": 141 + }, + { + "method": "GET", + "declared_path": "/agenda-items/{item_id}", + "function": "get_agenda_item", + "line": 148 + }, + { + "method": "POST", + "declared_path": "/agenda-items/{item_id}/reviews", + "function": "record_agenda_review", + "line": 164 + }, + { + "method": "POST", + "declared_path": "/agenda-items/{item_id}/meeting", + "function": "assign_agenda", + "line": 170 + }, + { + "method": "GET", + "declared_path": "/notices/{notice_id}/template", + "function": "notice_template", + "line": 249 + }, + { + "method": "POST", + "declared_path": "/notices/{notice_id}/document", + "function": "notice_document", + "line": 264 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/notice-checks", + "function": "check_notice", + "line": 278 + }, + { + "method": "POST", + "declared_path": "/notices/{notice_id}/proof", + "function": "record_notice_proof", + "line": 295 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/transcripts", + "function": "capture_transcript", + "line": 332 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/action-items", + "function": "capture_action_item", + "line": 344 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/archive", + "function": "archive_meeting", + "line": 356 + }, + { + "method": "GET", + "declared_path": "", + "function": "public_archive_index", + "line": 399 + }, + { + "method": "GET", + "declared_path": "/{record_id}", + "function": "public_archive_detail", + "line": 407 }, { - "name": "StaffReviewQueueItem", - "bases": [], + "method": "GET", + "declared_path": "/{record_id}/{kind}.txt", + "function": "public_archive_download", + "line": 417 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/packet-snapshots", + "function": "capture_packet", + "line": 441 + }, + { + "method": "POST", + "declared_path": "/packets/{packet_id}/deliver", + "function": "export_packet", + "line": 462 + }, + { + "method": "POST", + "declared_path": "/minutes/{draft_id}/decisions", + "function": "decide_minutes", + "line": 475 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/motions", + "function": "capture_motion", + "line": 498 + }, + { + "method": "POST", + "declared_path": "/motions/{motion_id}/corrections", + "function": "correct_motion", + "line": 505 + }, + { + "method": "POST", + "declared_path": "/motions/{motion_id}/votes", + "function": "capture_vote", + "line": 511 + }, + { + "method": "POST", + "declared_path": "/votes/{vote_id}/corrections", + "function": "correct_vote", + "line": 517 + }, + { + "method": "POST", + "declared_path": "/meetings/{meeting_id}/minutes/drafts", + "function": "create_minutes", + "line": 523 + }, + { + "method": "GET", + "declared_path": "/meetings/{meeting_id}/proceedings", + "function": "proceedings", + "line": 532 + }, + { + "method": "GET", + "declared_path": "/station/catalog", + "function": "station_catalog", + "line": 552 + } + ], + "models": [ + { + "name": "MeetingInput", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "review_id", + "name": "title", "type": "str", - "default": "" + "line": 85 }, { - "name": "intake_id", - "type": "str | None", - "default": "" + "name": "scheduled_start", + "type": "AwareDatetime", + "line": 86 }, { - "name": "project_type", + "name": "location", "type": "str", - "default": "" + "line": 87 }, { - "name": "proposal", - "type": "str", - "default": "" - }, + "name": "meeting_type", + "type": "Literal['regular', 'special', 'emergency', 'closed_session', 'executive']", + "line": 88 + } + ], + "line": 83 + }, + { + "name": "AgendaInput", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "status", + "name": "title", "type": "str", - "default": "" + "line": 93 }, { - "name": "reason", + "name": "department_name", "type": "str", - "default": "" - }, + "line": 94 + } + ], + "line": 91 + }, + { + "name": "MeetingStageInput", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "assigned_to", - "type": "str | None", - "default": "" + "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 }, { - "name": "resolution", + "name": "statutory_basis", "type": "str | None", - "default": "" - }, - { - "name": "created_by", - "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "" - }, - { - "name": "updated_at", - "type": "datetime", - "default": "" - }, + "line": 102 + } + ], + "line": 97 + }, + { + "name": "AgendaReviewInput", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "visibility", - "type": "str", - "default": "'staff_only'" + "name": "to_status", + "type": "Literal['DRAFTED', 'SUBMITTED', 'DEPT_APPROVED', 'LEGAL_REVIEWED', 'CLERK_ACCEPTED', 'ON_AGENDA', 'IN_PACKET', 'POSTED', 'HEARD', 'DISPOSED', 'ARCHIVED']", + "line": 154 } ], - "line": 84, - "doc": "" + "line": 152 }, { - "name": "StaffReviewSummary", - "bases": [], + "name": "AgendaAssignment", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "total_items", - "type": "int", - "default": "" - }, + "name": "meeting_id", + "type": "UUID", + "line": 160 + } + ], + "line": 158 + }, + { + "name": "MotionInput", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "by_status", - "type": "dict[str, int]", - "default": "" + "name": "text", + "type": "str", + "line": 180 }, { - "name": "open_items", - "type": "int", - "default": "" - }, + "name": "seconded_by", + "type": "str | None", + "line": 181 + } + ], + "line": 178 + }, + { + "name": "MotionCorrection", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "generated_at", - "type": "datetime", - "default": "" + "name": "text", + "type": "str", + "line": 186 }, { - "name": "visibility", + "name": "reason", "type": "str", - "default": "'staff_only'" + "line": 187 } ], - "line": 100, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/public_ui.py", - "sha256": "0f06685bd18b171987cc08413bc930112f400a03468c0f27e98badba6b732f29", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/records_export.py", - "sha256": "231801e8bd30b92f0fe6aeb0a8f2aed2d5097acae5f2cc5eda2e18f9c9a1fae8", - "routes": [], - "models": [ + "line": 184 + }, { - "name": "PermitExport", - "bases": [], + "name": "VoteInput", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "title", + "name": "voter_name", "type": "str", - "default": "" + "line": 192 }, { - "name": "project_type", + "name": "vote", "type": "str", - "default": "" - }, + "line": 193 + } + ], + "line": 190 + }, + { + "name": "VoteCorrection", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "format", + "name": "vote", "type": "str", - "default": "" - }, - { - "name": "checklist", - "type": "tuple[str, ...]", - "default": "" + "line": 198 }, { - "name": "retention_note", + "name": "reason", "type": "str", - "default": "" + "line": 199 } ], - "line": 11, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/requirement_lookup.py", - "sha256": "f9a1fbd111096e7d4c00cc6cb7f25b9cf91af522f26c743f86234a0ecffe783c", - "routes": [], - "models": [ + "line": 196 + }, { - "name": "PermitRequirement", - "bases": [], + "name": "SourceInput", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "requirement_id", + "name": "source_id", "type": "str", - "default": "" + "line": 204 }, { - "name": "project_type", + "name": "label", "type": "str", - "default": "" + "line": 205 }, { - "name": "title", + "name": "text", "type": "str", - "default": "" - }, + "line": 206 + } + ], + "line": 202 + }, + { + "name": "SentenceInput", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "citation", + "name": "text", "type": "str", - "default": "" + "line": 211 }, { - "name": "required_materials", - "type": "tuple[str, ...]", - "default": "" - }, + "name": "citations", + "type": "list[str]", + "line": 212 + } + ], + "line": 209 + }, + { + "name": "DraftInput", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "staff_note", - "type": "str", - "default": "" + "name": "source_materials", + "type": "list[SourceInput]", + "line": 217 }, { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" + "name": "sentences", + "type": "list[SentenceInput]", + "line": 218 } ], - "line": 16, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/sources.py", - "sha256": "8e26b8c98635689f985e14d57a0137f6538145c50414da918ba0cb41a7f489a3", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/submittal_outline.py", - "sha256": "f6465de3058d51bb47b7d278e10b67a2ac1ac46aeefa2563eabd041dcb54aae1", - "routes": [], - "models": [ + "line": 215 + }, { - "name": "SubmittalOutline", - "bases": [], + "name": "MinutesDecision", + "bases": [ + "BaseModel" + ], "fields": [ { - "name": "project_name", - "type": "str", - "default": "" + "name": "action", + "type": "Literal['post', 'adopt', 'sign']", + "line": 223 }, { - "name": "heading", + "name": "note", "type": "str", - "default": "" + "line": 224 + } + ], + "line": 221 + }, + { + "name": "NoticeInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "notice_type", + "type": "Literal['regular', 'special', 'emergency', 'closed_session', 'executive']", + "line": 229 }, { - "name": "required_materials", - "type": "tuple[str, ...]", - "default": "" + "name": "posted_at", + "type": "AwareDatetime", + "line": 230 }, { - "name": "applicant_message", - "type": "str", - "default": "" + "name": "minimum_notice_hours", + "type": "int", + "line": 231 }, { - "name": "review_required", - "type": "bool", - "default": "" + "name": "statutory_basis", + "type": "str | None", + "line": 232 }, { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" + "name": "approved_by", + "type": "str | None", + "line": 233 } ], - "line": 12, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/workflow_models.py", - "sha256": "3d09f3ae137c5c48091e22a60a3e732ea3ec299236778d377df55807bb8bbfdd", - "routes": [], - "models": [ + "line": 227 + }, { - "name": "Material", + "name": "NoticeProofInput", "bases": [ - "Model" + "BaseModel" ], "fields": [ { - "name": "material_id", + "name": "location", "type": "str", - "default": "Field(pattern='^[a-zA-Z0-9_-]{1,80}$')" + "line": 238 }, { - "name": "description", + "name": "note", "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "line": 239 }, { - "name": "citation", - "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "name": "document_delivery_id", + "type": "str | None", + "line": 240 } ], - "line": 20, - "doc": "" + "line": 236 }, { - "name": "PathwayStep", + "name": "NoticeDocumentInput", "bases": [ - "Model" + "BaseModel" ], "fields": [ { - "name": "step", - "type": "str", - "default": "Field(min_length=1, max_length=2000)" - }, - { - "name": "citation", - "type": "str", - "default": "Field(min_length=1, max_length=1000)" - }, - { - "name": "typical_time", + "name": "text", "type": "str", - "default": "Field(default='', max_length=1000)" + "line": 245 } ], - "line": 26, - "doc": "" + "line": 243 }, { - "name": "SourceLink", + "name": "PacketInput", "bases": [ - "Model" + "BaseModel" ], "fields": [ { - "name": "provider", - "type": "Literal['code', 'zoning']", - "default": "" - }, - { - "name": "source_id", - "type": "str", - "default": "Field(min_length=1, max_length=500)" + "name": "agenda_item_ids", + "type": "list[UUID]", + "line": 305 }, { - "name": "expected_sha256", - "type": "str", - "default": "Field(pattern='^[a-f0-9]{64}$')" + "name": "source_files", + "type": "list['ManagedSource']", + "line": 306 } ], - "line": 32, - "doc": "" + "line": 303 }, { - "name": "RequirementBundle", + "name": "TranscriptInput", "bases": [ - "Model" + "BaseModel" ], "fields": [ { - "name": "requirement_id", - "type": "str", - "default": "Field(pattern='^[a-zA-Z0-9_-]{1,100}$')" - }, - { - "name": "title", - "type": "str", - "default": "Field(min_length=1, max_length=500)" - }, - { - "name": "jurisdiction", - "type": "str", - "default": "Field(min_length=1, max_length=255)" - }, - { - "name": "project_type", - "type": "str", - "default": "Field(min_length=1, max_length=255)" - }, - { - "name": "source_reference", + "name": "source_label", "type": "str", - "default": "Field(min_length=1, max_length=1000)" - }, - { - "name": "source_date", - "type": "date", - "default": "" - }, - { - "name": "effective_on", - "type": "date", - "default": "" - }, - { - "name": "dataset_kind", - "type": "Literal['municipal', 'fictional']", - "default": "" + "line": 311 }, { - "name": "filename", + "name": "transcript_text", "type": "str", - "default": "Field(pattern='^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,150}$')" + "line": 312 }, { - "name": "content_base64", - "type": "str", - "default": "Field(min_length=1, max_length=14000000)" - }, + "name": "correction_of_id", + "type": "UUID | None", + "line": 313 + } + ], + "line": 309 + }, + { + "name": "ActionItemInput", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "sha256", + "name": "description", "type": "str", - "default": "Field(pattern='^[a-f0-9]{64}$')" - }, - { - "name": "materials", - "type": "list[Material]", - "default": "Field(min_length=1, max_length=100)" - }, - { - "name": "pathway", - "type": "list[PathwayStep]", - "default": "Field(default_factory=list, max_length=100)" - }, - { - "name": "fee_link", - "type": "SourceLink | None", - "default": "None" + "line": 318 }, { - "name": "staff_note", - "type": "str", - "default": "Field(default='', max_length=4000)" + "name": "assigned_to", + "type": "str | None", + "line": 319 }, { - "name": "change_note", - "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "name": "source_motion_id", + "type": "UUID | None", + "line": 320 } ], - "line": 38, - "doc": "" + "line": 316 }, { - "name": "MaterialReview", + "name": "ArchiveInput", "bases": [ - "Model" + "BaseModel" ], "fields": [ { - "name": "material_id", - "type": "str", - "default": "Field(min_length=1, max_length=80)" + "name": "visibility", + "type": "Literal['public', 'closed_session']", + "line": 325 }, { - "name": "status", - "type": "Literal['not_reviewed', 'provided', 'missing', 'unclear']", - "default": "'not_reviewed'" + "name": "packet_id", + "type": "UUID | None", + "line": 326 }, { - "name": "note", + "name": "minutes_id", + "type": "UUID | None", + "line": 327 + }, + { + "name": "plain_language_summary", "type": "str", - "default": "Field(default='', max_length=2000)" + "line": 328 } ], - "line": 70, - "doc": "" + "line": 323 }, { - "name": "IntakeInput", + "name": "ManagedSource", "bases": [ - "Model" + "BaseModel" ], "fields": [ { - "name": "expected_revision", - "type": "UUID | None", - "default": "None" - }, - { - "name": "project_name", + "name": "original_path", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 426 }, { - "name": "project_description", + "name": "stored_path", "type": "str", - "default": "Field(min_length=1, max_length=10000)" + "line": 427 }, { - "name": "location", + "name": "file_name", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 428 }, { - "name": "applicant_contact", + "name": "sha256", "type": "str", - "default": "Field(default='', max_length=2000)" + "line": 429 }, { - "name": "requirement_revision", - "type": "UUID", - "default": "" - }, + "name": "size_bytes", + "type": "int", + "line": 430 + } + ], + "line": 424 + } + ], + "configuration": [ + { + "environment": "DATABASE_URL", + "line": 38 + }, + { + "environment": "TOWNLIGHT_PROFILE_ROOT", + "line": 434 + } + ] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/migrate.py", + "sha256": "072bcee7c652a1858a69cac4056fd7a6ecd0d19e59ca7affa536fb32d39ea081", + "bytes": 6108, + "routes": [], + "models": [], + "configuration": [ + { + "environment": "DATABASE_URL", + "line": 41 + } + ] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/native_accounts.py", + "sha256": "497fb326fccb61dec69b58daf35a382ab832adeed190e65d2a7f87098fb3c6e7", + "bytes": 4090, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/notice_bridge.py", + "sha256": "23de374634960f6ee5b07f13f445fcec07af84a44d6393def6559224f4231b4b", + "bytes": 7532, + "routes": [ + { + "method": "GET", + "declared_path": "/notices", + "function": "inventory", + "line": 69 + }, + { + "method": "POST", + "declared_path": "/notices", + "function": "create", + "line": 74 + }, + { + "method": "GET", + "declared_path": "/notices/{notice_id}", + "function": "read", + "line": 79 + }, + { + "method": "POST", + "declared_path": "/notices/{notice_id}/revisions", + "function": "edit", + "line": 85 + }, + { + "method": "POST", + "declared_path": "/notices/{notice_id}/review", + "function": "review", + "line": 90 + }, + { + "method": "POST", + "declared_path": "/notices/{notice_id}/approval", + "function": "approve", + "line": 95 + }, + { + "method": "POST", + "declared_path": "/notices/{notice_id}/proof", + "function": "proof", + "line": 100 + }, + { + "method": "POST", + "declared_path": "/notices/{notice_id}/archive", + "function": "archive", + "line": 110 + }, + { + "method": "GET", + "declared_path": "/archives/{archive_id}", + "function": "export", + "line": 115 + }, + { + "method": "POST", + "declared_path": "/archives/{archive_id}/records", + "function": "handoff", + "line": 127 + } + ], + "models": [ + { + "name": "Version", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "materials", - "type": "list[MaterialReview]", - "default": "Field(min_length=1, max_length=100)" - }, + "name": "sequence", + "type": "int", + "line": 50 + } + ], + "line": 48 + }, + { + "name": "Revision", + "bases": [ + "Version" + ], + "fields": [ { - "name": "linked_sources", - "type": "list[SourceLink]", - "default": "Field(default_factory=list, max_length=30)" - }, + "name": "document", + "type": "NoticeDraft", + "line": 54 + } + ], + "line": 53 + }, + { + "name": "Review", + "bases": [ + "Version" + ], + "fields": [ { - "name": "staff_notes", + "name": "note", "type": "str", - "default": "Field(default='', max_length=10000)" - }, + "line": 58 + } + ], + "line": 57 + }, + { + "name": "Proof", + "bases": [ + "Version" + ], + "fields": [ { - "name": "assigned_to", + "name": "filename", "type": "str", - "default": "Field(default='', max_length=255)" + "line": 62 }, { - "name": "review_state", - "type": "Literal['draft', 'follow_up', 'reviewed']", - "default": "'draft'" + "name": "content_base64", + "type": "str", + "line": 63 }, { - "name": "review_notes", + "name": "location", "type": "str", - "default": "Field(default='', max_length=4000)" + "line": 64 }, { - "name": "public_summary", + "name": "published_at", "type": "str", - "default": "Field(default='', max_length=10000)" + "line": 65 + } + ], + "line": 61 + }, + { + "name": "Handoff", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "request_id", + "type": "UUID", + "line": 123 } ], - "line": 76, - "doc": "" + "line": 121 } ], "configuration": [] }, { - "source": "installed-owned-source/civicpermit/workflow_schema.py", - "sha256": "07dfc3dfafd5131ffee8b087add38fd7ebf446c2cf104100920636e732aaee59", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicpermit/workflow_store.py", - "sha256": "c3415dd94aaed609a593d28b60d0719f2dc1a504a5f15391d9708714038ea259", - "routes": [], - "models": [], - "configuration": [] - } - ], - "bridge": [ - { - "source": "installed-owned-source/civicsuite_runtime/permitting_bridge.py", - "sha256": "786abd0dfc18ed0ce7ada70fcd120f96795d8e1ee46f38ca0770a8217b4d6e1d", + "source": "desktop/runtime/python-services/townlight_runtime/permitting_bridge.py", + "sha256": "3505589503441a72fe6c6094b6cd6d31a111ce633f912e85ccd72edd08cf2535", + "bytes": 9103, "routes": [ { "method": "POST", - "path": "/desktop/v1/permitting/requirements", - "router": "router", - "prefix_resolved": true, - "name": "import_requirements", - "signature": "request: Request, body: Import, identity=Depends(actor)", - "returns": "", - "line": 85, - "doc": "", - "decorator": "router.post('/requirements')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/permitting/requirements", - "router": "router", - "prefix_resolved": true, - "name": "requirements", - "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 91, - "doc": "", - "decorator": "router.get('/requirements')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/permitting/requirements/{revision_id}", - "router": "router", - "prefix_resolved": true, - "name": "requirement", - "signature": "request: Request, revision_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 96, - "doc": "", - "decorator": "router.get('/requirements/{revision_id}')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/permitting/cases", - "router": "router", - "prefix_resolved": true, - "name": "cases", - "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 101, - "doc": "", - "decorator": "router.get('/cases')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/permitting/cases", - "router": "router", - "prefix_resolved": true, - "name": "create_case", - "signature": "request: Request, body: IntakeInput, identity=Depends(actor)", - "returns": "", - "line": 106, - "doc": "", - "decorator": "router.post('/cases')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/permitting/cases/{case_id}", - "router": "router", - "prefix_resolved": true, - "name": "case", - "signature": "request: Request, case_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 111, - "doc": "", - "decorator": "router.get('/cases/{case_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/permitting/cases/{case_id}/revisions", - "router": "router", - "prefix_resolved": true, - "name": "revise", - "signature": "request: Request, case_id: UUID, body: IntakeInput, identity=Depends(actor)", - "returns": "", - "line": 116, - "doc": "", - "decorator": "router.post('/cases/{case_id}/revisions')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/permitting/cases/{case_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "history", - "signature": "request: Request, case_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 121, - "doc": "", - "decorator": "router.get('/cases/{case_id}/history')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/permitting/cases/{case_id}/packets", - "router": "router", - "prefix_resolved": true, - "name": "packet", - "signature": "request: Request, case_id: UUID, body: Packet, identity=Depends(actor)", - "returns": "", - "line": 131, - "doc": "", - "decorator": "router.post('/cases/{case_id}/packets')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/permitting/packets/{packet_id}", - "router": "router", - "prefix_resolved": true, - "name": "document", - "signature": "request: Request, packet_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 136, - "doc": "", - "decorator": "router.get('/packets/{packet_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/permitting/pathway", - "router": "router", - "prefix_resolved": true, - "name": "pathway", - "signature": "request: Request, body: Pathway, identity=Depends(actor)", - "returns": "", - "line": 149, - "doc": "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.", - "decorator": "router.post('/pathway')", - "errors": [ - "HTTPException(503, f'Configured public permit sources unavailable: {exc}')" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/permitting/connections/search", - "router": "router", - "prefix_resolved": true, - "name": "connections", - "signature": "request: Request, body: Search, identity=Depends(actor)", - "returns": "", - "line": 199, - "doc": "", - "decorator": "router.post('/connections/search')", - "errors": [] + "declared_path": "/requirements", + "function": "import_requirements", + "line": 85 + }, + { + "method": "GET", + "declared_path": "/requirements", + "function": "requirements", + "line": 91 + }, + { + "method": "GET", + "declared_path": "/requirements/{revision_id}", + "function": "requirement", + "line": 96 + }, + { + "method": "GET", + "declared_path": "/cases", + "function": "cases", + "line": 101 + }, + { + "method": "POST", + "declared_path": "/cases", + "function": "create_case", + "line": 106 + }, + { + "method": "GET", + "declared_path": "/cases/{case_id}", + "function": "case", + "line": 111 + }, + { + "method": "POST", + "declared_path": "/cases/{case_id}/revisions", + "function": "revise", + "line": 116 + }, + { + "method": "GET", + "declared_path": "/cases/{case_id}/history", + "function": "history", + "line": 121 + }, + { + "method": "POST", + "declared_path": "/cases/{case_id}/packets", + "function": "packet", + "line": 131 + }, + { + "method": "GET", + "declared_path": "/packets/{packet_id}", + "function": "document", + "line": 136 + }, + { + "method": "POST", + "declared_path": "/pathway", + "function": "pathway", + "line": 149 + }, + { + "method": "POST", + "declared_path": "/connections/search", + "function": "connections", + "line": 199 } ], "models": [ @@ -35683,16 +33749,15 @@ { "name": "bundle", "type": "RequirementBundle", - "default": "" + "line": 80 }, { "name": "expected_revision", "type": "UUID | None", - "default": "None" + "line": 81 } ], - "line": 79, - "doc": "" + "line": 79 }, { "name": "Packet", @@ -35703,16 +33768,15 @@ { "name": "expected_revision", "type": "UUID", - "default": "" + "line": 126 }, { "name": "visibility", "type": "Literal['staff_only', 'records_copy']", - "default": "" + "line": 127 } ], - "line": 125, - "doc": "" + "line": 125 }, { "name": "Pathway", @@ -35723,31 +33787,30 @@ { "name": "project_type", "type": "str", - "default": "Field(min_length=1, max_length=120)" + "line": 141 }, { "name": "proposal", "type": "str", - "default": "Field(default='', max_length=4000)" + "line": 142 }, { "name": "location_context", "type": "str", - "default": "Field(default='', max_length=1000)" + "line": 143 }, { "name": "requirement_revision", "type": "UUID | None", - "default": "None" + "line": 144 }, { "name": "fee_link", "type": "SourceLink | None", - "default": "None" + "line": 145 } ], - "line": 140, - "doc": "" + "line": 140 }, { "name": "Search", @@ -35758,2683 +33821,1653 @@ { "name": "provider", "type": "Literal['code', 'zoning']", - "default": "" + "line": 194 }, { "name": "query", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 195 } ], - "line": 193, - "doc": "" + "line": 193 } ], "configuration": [] - } - ] - }, - "inspections": { - "package": "civicinspect", - "source": [ - { - "source": "installed-owned-source/civicinspect/__init__.py", - "sha256": "eff685acecf3985653f811403aaabc6862d52ce7e343c38aa5242f40d4266c47", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicinspect/_whistle_driver.py", - "sha256": "90ce9276c7d1de4d3259a2c00ff581e5d55d28dd8da913ed7b8bd2d7c89a5264", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicinspect/adapters.py", - "sha256": "ab76d8c1a8b57167acf759390b49a3941f04b4483a606be2abbae69f4f8165db", - "routes": [], - "models": [], - "configuration": [] }, { - "source": "installed-owned-source/civicinspect/case_lookup.py", - "sha256": "b68030ecdf6a7f83ed35aec636afcb70c5ce247a40ed7d60a3283655bfdb3214", - "routes": [], - "models": [ + "source": "desktop/runtime/python-services/townlight_runtime/planning_bridge.py", + "sha256": "9722286324a54d1dd831ae2f978c8337450b98bd90dee74fe15ff8cbd771992c", + "bytes": 14570, + "routes": [ { - "name": "RepeatCaseResult", - "bases": [], - "fields": [ - { - "name": "property_reference", - "type": "str", - "default": "" - }, - { - "name": "violation_type", - "type": "str", - "default": "" - }, - { - "name": "repeat_case_count", - "type": "int", - "default": "" - }, - { - "name": "related_case_ids", - "type": "tuple[str, ...]", - "default": "" - }, - { - "name": "staff_note", - "type": "str", - "default": "" - }, - { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" - } - ], - "line": 15, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicinspect/connections.py", - "sha256": "82221673e19e1bd48215cfc9dbeab837070cd9a6bdd3f3cf57cf3034f3ac3bef", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicinspect/integration_mocks.py", - "sha256": "dfc700d977badb104db5abddded3120b1bff99445a6bbf18f7a6925c9087c797", - "routes": [], - "models": [ + "method": "POST", + "declared_path": "/imports/preview", + "function": "preview_import", + "line": 80 + }, { - "name": "IntegrationMockResult", - "bases": [], - "fields": [ - { - "name": "scenario", - "type": "str", - "default": "" - }, - { - "name": "status", - "type": "str", - "default": "" - }, - { - "name": "review_required", - "type": "bool", - "default": "" - }, - { - "name": "findings", - "type": "tuple[str, ...]", - "default": "" - }, - { - "name": "boundary", - "type": "str", - "default": "" - } - ], - "line": 10, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicinspect/main.py", - "sha256": "16306b47d0e6e526176c050b2eb2edb6a047edea3bb5f313df48c026a81cc53e", - "routes": [ + "method": "POST", + "declared_path": "/imports", + "function": "import_source", + "line": 89 + }, + { + "method": "GET", + "declared_path": "/sources", + "function": "source_list", + "line": 98 + }, + { + "method": "GET", + "declared_path": "/sources/{plan_id}/history", + "function": "source_history", + "line": 104 + }, + { + "method": "GET", + "declared_path": "/revisions/{revision_id}", + "function": "revision", + "line": 109 + }, + { + "method": "GET", + "declared_path": "/revisions/{revision_id}/documents/{document_id}", + "function": "staff_original", + "line": 127 + }, + { + "method": "POST", + "declared_path": "/policies/search", + "function": "policies", + "line": 137 + }, + { + "method": "GET", + "declared_path": "/analyses", + "function": "analyses", + "line": 142 + }, + { + "method": "POST", + "declared_path": "/analyses", + "function": "create_analysis", + "line": 155 + }, + { + "method": "POST", + "declared_path": "/analyses/{analysis_id}/revisions", + "function": "revise_analysis", + "line": 165 + }, + { + "method": "GET", + "declared_path": "/analyses/{analysis_id}", + "function": "analysis", + "line": 175 + }, + { + "method": "GET", + "declared_path": "/analyses/{analysis_id}/history", + "function": "analysis_history", + "line": 180 + }, + { + "method": "POST", + "declared_path": "/analyses/{analysis_id}/snapshot-preview", + "function": "preview_snapshot", + "line": 190 + }, + { + "method": "POST", + "declared_path": "/analyses/{analysis_id}/snapshots", + "function": "snapshot", + "line": 195 + }, + { + "method": "GET", + "declared_path": "/snapshots", + "function": "snapshots", + "line": 200 + }, + { + "method": "GET", + "declared_path": "/snapshots/{snapshot_id}", + "function": "document", + "line": 206 + }, + { + "method": "POST", + "declared_path": "/snapshots/{snapshot_id}/access-advice", + "function": "access_advice", + "line": 211 + }, + { + "method": "POST", + "declared_path": "/connections/search", + "function": "connections", + "line": 221 + }, + { + "method": "POST", + "declared_path": "/policies/search", + "function": "public_policies", + "line": 226 + }, + { + "method": "POST", + "declared_path": "/plan-explore", + "function": "public_plan_explore", + "line": 238 + }, + { + "method": "GET", + "declared_path": "/snapshots", + "function": "public_snapshots", + "line": 254 + }, + { + "method": "GET", + "declared_path": "/snapshots/{snapshot_id}", + "function": "public_document", + "line": 260 + }, + { + "method": "GET", + "declared_path": "/revisions/{revision_id}/documents/{document_id}", + "function": "public_original", + "line": 265 + }, + { + "method": "GET", + "declared_path": "/progress/targets", + "function": "municipal_progress", + "line": 270 + }, + { + "method": "GET", + "declared_path": "/amendments/history", + "function": "municipal_amendments", + "line": 275 + }, + { + "method": "GET", + "declared_path": "/municipal-work/{item_id}/history", + "function": "municipal_history", + "line": 280 + }, + { + "method": "POST", + "declared_path": "/initiatives", + "function": "create_initiative", + "line": 285 + }, { - "method": "GET", - "path": "/", - "router": "app", - "prefix_resolved": true, - "name": "root", - "signature": "", - "returns": "dict[str, str]", - "line": 130, - "doc": "Return current product state without overstating unshipped behavior.", - "decorator": "app.get('/')", - "errors": [] - }, - { - "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "health", - "signature": "", - "returns": "dict[str, str]", - "line": 150, - "doc": "Return dependency/version health for deployment smoke checks.", - "decorator": "app.get('/health')", - "errors": [] - }, - { - "method": "GET", - "path": "/civicinspect", - "router": "app", - "prefix_resolved": true, - "name": "public_civicinspect_page", - "signature": "", - "returns": "str", - "line": 162, - "doc": "Return the public sample inspection support UI.", - "decorator": "app.get('/civicinspect', response_class=HTMLResponse)", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/cases/repeat-lookup", - "router": "app", - "prefix_resolved": true, - "name": "repeat_case_lookup", - "signature": "request: RepeatCaseLookupRequest", - "returns": "dict[str, object]", - "line": 169, - "doc": "", - "decorator": "app.post('/api/v1/civicinspect/cases/repeat-lookup')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/reports/draft", - "router": "app", - "prefix_resolved": true, - "name": "inspection_report_draft", - "signature": "request: ReportDraftRequest", - "returns": "dict[str, object]", - "line": 178, - "doc": "", - "decorator": "app.post('/api/v1/civicinspect/reports/draft')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicinspect/reports/{report_id}", - "router": "app", - "prefix_resolved": true, - "name": "get_inspection_report", - "signature": "report_id: str", - "returns": "dict[str, object]", - "line": 215, - "doc": "", - "decorator": "app.get('/api/v1/civicinspect/reports/{report_id}')", - "errors": [ - "HTTPException(status_code=503, detail={'message': 'Townlight Inspections case persistence is not configured.', 'fix': 'Set CIVICINSPECT_CASE_DB_URL to retrieve persisted inspection report records.'})", - "HTTPException(status_code=404, detail={'message': 'Inspection report record not found.', 'fix': 'Use a report_id returned by POST /api/v1/civicinspect/reports/draft.'})" - ] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/evidence/retain", - "router": "app", - "prefix_resolved": true, - "name": "retain_evidence_route", - "signature": "request: EvidenceRetainRequest", - "returns": "dict[str, object]", - "line": 291, - "doc": "Retain original evidence bytes (photos, documents and raw audio) with hashes.", - "decorator": "app.post('/api/v1/civicinspect/evidence/retain')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/media/analyse", - "router": "app", - "prefix_resolved": true, - "name": "media_analyse", - "signature": "request: MediaAnalysisRequest", - "returns": "dict[str, object]", - "line": 307, - "doc": "Draft-only analysis of retained media; inspector review always required.", - "decorator": "app.post('/api/v1/civicinspect/media/analyse')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/notices/draft", - "router": "app", - "prefix_resolved": true, - "name": "notice_draft", - "signature": "request: NoticeDraftRequest", - "returns": "dict[str, object]", - "line": 325, - "doc": "", - "decorator": "app.post('/api/v1/civicinspect/notices/draft')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/context/inspection-review", - "router": "app", - "prefix_resolved": true, - "name": "inspection_review_context", - "signature": "request: InspectionContextRequest", - "returns": "dict[str, object]", - "line": 336, - "doc": "", - "decorator": "app.post('/api/v1/civicinspect/context/inspection-review')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/integrations/mock/inspection-context", - "router": "app", - "prefix_resolved": true, - "name": "integration_mock_inspection_context", - "signature": "request: IntegrationMockRequest", - "returns": "dict[str, object]", - "line": 365, - "doc": "", - "decorator": "app.post('/api/v1/civicinspect/integrations/mock/inspection-context')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/export", - "router": "app", - "prefix_resolved": true, - "name": "inspection_export", - "signature": "request: InspectionExportRequest", - "returns": "dict[str, object]", - "line": 377, - "doc": "", - "decorator": "app.post('/api/v1/civicinspect/export')", - "errors": [] - }, - { - "method": "POST", - "path": "/api/v1/civicinspect/staff/reviews", - "router": "app", - "prefix_resolved": true, - "name": "create_staff_review", - "signature": "request: StaffReviewCreateRequest, _staff_principal: object=Depends(_require_staff_key)", - "returns": "dict[str, object]", - "line": 387, - "doc": "", - "decorator": "app.post('/api/v1/civicinspect/staff/reviews')", - "errors": [] - }, - { - "method": "GET", - "path": "/api/v1/civicinspect/staff/reviews", - "router": "app", - "prefix_resolved": true, - "name": "list_staff_reviews", - "signature": "status: str | None=None, _staff_principal: object=Depends(_require_staff_key)", - "returns": "dict[str, object]", - "line": 403, - "doc": "", - "decorator": "app.get('/api/v1/civicinspect/staff/reviews')", - "errors": [] + "method": "POST", + "declared_path": "/initiatives/{item_id}/revisions", + "function": "update_initiative", + "line": 290 }, { - "method": "PATCH", - "path": "/api/v1/civicinspect/staff/reviews/{review_id}", - "router": "app", - "prefix_resolved": true, - "name": "update_staff_review", - "signature": "review_id: str, request: StaffReviewUpdateRequest, _staff_principal: object=Depends(_require_staff_key)", - "returns": "dict[str, object]", - "line": 418, - "doc": "", - "decorator": "app.patch('/api/v1/civicinspect/staff/reviews/{review_id}')", - "errors": [ - "HTTPException(status_code=404, detail={'message': 'Townlight Inspections staff review item was not found.', 'fix': 'List staff reviews and retry with an existing review_id.'})", - "HTTPException(status_code=422, detail={'message': 'Staff review update is invalid.', 'fix': str(exc)})" - ] - }, - { - "method": "GET", - "path": "/api/v1/civicinspect/staff/reviews/summary", - "router": "app", - "prefix_resolved": true, - "name": "staff_review_summary", - "signature": "_staff_principal: object=Depends(_require_staff_key)", - "returns": "dict[str, object]", - "line": 448, - "doc": "", - "decorator": "app.get('/api/v1/civicinspect/staff/reviews/summary')", - "errors": [] + "method": "POST", + "declared_path": "/amendments", + "function": "create_amendment", + "line": 295 + }, + { + "method": "POST", + "declared_path": "/amendments/{item_id}/revisions", + "function": "update_amendment", + "line": 300 } ], "models": [ { - "name": "RepeatCaseLookupRequest", + "name": "Import", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "property_reference", - "type": "str", - "default": "" + "name": "bundle", + "type": "dict", + "line": 75 }, { - "name": "violation_type", - "type": "str", - "default": "''" + "name": "expected_previous_revision", + "type": "str | None", + "line": 76 } ], - "line": 50, - "doc": "" + "line": 74 }, { - "name": "ReportDraftRequest", + "name": "Search", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "inspection_id", - "type": "str", - "default": "" - }, - { - "name": "property_reference", - "type": "str", - "default": "" - }, - { - "name": "inspector_notes", - "type": "str", - "default": "" - }, - { - "name": "photo_observations", - "type": "list[str]", - "default": "[]" - }, - { - "name": "voice_notes", + "name": "query", "type": "str", - "default": "''" + "line": 132 }, { - "name": "analysis", - "type": "AnalysisRecord | None", - "default": "None" + "name": "plan_type", + "type": "str | None", + "line": 133 } ], - "line": 55, - "doc": "" + "line": 131 }, { - "name": "NoticeDraftRequest", + "name": "Snapshot", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "case_id", - "type": "str", - "default": "" - }, - { - "name": "property_reference", - "type": "str", - "default": "" - }, - { - "name": "violation_type", - "type": "str", - "default": "" + "name": "expected_revision", + "type": "UUID", + "line": 185 }, { - "name": "observations", - "type": "list[str]", - "default": "" + "name": "visibility", + "type": "Literal['staff_only', 'public']", + "line": 186 } ], - "line": 64, - "doc": "" + "line": 184 }, { - "name": "InspectionExportRequest", + "name": "ConnectionSearch", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "title", - "type": "str", - "default": "" - }, - { - "name": "case_id", - "type": "str", - "default": "" + "name": "provider", + "type": "Literal['meetings', 'zoning']", + "line": 216 }, { - "name": "format", + "name": "query", "type": "str", - "default": "'markdown'" + "line": 217 } ], - "line": 71, - "doc": "" + "line": 215 }, { - "name": "InspectionContextRequest", + "name": "PublicExplore", "bases": [ - "BaseModel" + "BundleModel" ], "fields": [ { - "name": "inspection_id", - "type": "str", - "default": "" - }, - { - "name": "property_reference", - "type": "str", - "default": "" - }, - { - "name": "violation_type", + "name": "goal", "type": "str", - "default": "" + "line": 231 }, { - "name": "code_context_id", + "name": "topic", "type": "str", - "default": "''" + "line": 232 }, { - "name": "case_context_id", + "name": "neighborhood", "type": "str", - "default": "''" + "line": 233 }, { - "name": "source_date_status", + "name": "plan_type", "type": "str", - "default": "'current'" + "line": 234 } ], - "line": 77, - "doc": "" - }, + "line": 230 + } + ], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/planning_connections.py", + "sha256": "116b2e0cf1d1acaba1d5135f746a91e283cbd5fb238631379a4672496d96ae77", + "bytes": 2494, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/records_cutover.py", + "sha256": "e0c2f9b4ef95e913c8c096bf5bc472bde66ff1eab1d1775026e8923f900675e0", + "bytes": 4650, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/records_demo.py", + "sha256": "fe5d902ba81e6c55bcce095ce7eb13071254c028c2dd730393a7cce10c6a7263", + "bytes": 7341, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/records_import.py", + "sha256": "7baa9f06e3d046711b4111bb2ba28e89adcaed156bd896ec3caeab03feb2622e", + "bytes": 8613, + "routes": [], + "models": [ { - "name": "IntegrationMockRequest", - "bases": [ - "BaseModel" - ], + "name": "ImportPreflight", + "bases": [], "fields": [ { - "name": "scenario", - "type": "str", - "default": "'inspection-context'" - }, - { - "name": "role", - "type": "str", - "default": "'staff'" + "name": "source_path", + "type": "Path", + "line": 30 }, { - "name": "code_context_id", - "type": "str", - "default": "''" + "name": "source_bytes", + "type": "bytes", + "line": 31 }, { - "name": "case_context_id", + "name": "source_sha256", "type": "str", - "default": "''" + "line": 32 }, { - "name": "official_finding", - "type": "bool", - "default": "False" + "name": "original", + "type": "dict", + "line": 33 }, { - "name": "citation_issued", - "type": "bool", - "default": "False" + "name": "records", + "type": "tuple[RecordsView, ...]", + "line": 34 }, { - "name": "fine_amount", - "type": "str | None", - "default": "None" + "name": "verified_files", + "type": "tuple[tuple[str, str, int], ...]", + "line": 35 }, { - "name": "photo_analysis_source", + "name": "legacy_audit_head", "type": "str", - "default": "'inspector_observation'" + "line": 36 }, { - "name": "source_date_status", - "type": "str", - "default": "'current'" + "name": "unhashed_audit_entries", + "type": "int", + "line": 37 } ], - "line": 86, - "doc": "" - }, + "line": 29 + } + ], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/records_import_access.py", + "sha256": "51ccf503c5901e60d836a657972539a880e723285482821d418065053addf8fa", + "bytes": 3191, + "routes": [], + "models": [ { - "name": "EvidenceItemRequest", + "name": "Finding", "bases": [ "BaseModel" ], "fields": [ { - "name": "filename", - "type": "str", - "default": "" - }, - { - "name": "media_type", - "type": "str", - "default": "" - }, - { - "name": "description", - "type": "str", - "default": "''" - }, - { - "name": "content_base64", + "name": "code", "type": "str", - "default": "" + "line": 12 }, { - "name": "sha256", + "name": "severity", "type": "str", - "default": "" - } - ], - "line": 98, - "doc": "" - }, - { - "name": "EvidenceRetainRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "items", - "type": "list[EvidenceItemRequest]", - "default": "" - } - ], - "line": 106, - "doc": "" - }, - { - "name": "MediaAnalysisRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "items", - "type": "list[EvidenceItemRequest]", - "default": "" - }, - { - "name": "code_links", - "type": "list[dict[str, str]]", - "default": "[]" + "line": 13 }, { - "name": "inspector_supplied_text", - "type": "str", - "default": "''" - } - ], - "line": 110, - "doc": "" - }, - { - "name": "StaffReviewCreateRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "inspection_id", + "name": "message", "type": "str", - "default": "" + "line": 14 }, { - "name": "property_reference", + "name": "fix", "type": "str", - "default": "" + "line": 15 }, { - "name": "reason", + "name": "wcag_reference", "type": "str", - "default": "" - }, - { - "name": "report_id", - "type": "str | None", - "default": "None" + "line": 16 } ], - "line": 116, - "doc": "" + "line": 10 }, { - "name": "StaffReviewUpdateRequest", + "name": "Review", "bases": [ "BaseModel" ], "fields": [ { - "name": "status", + "name": "review_id", "type": "str", - "default": "" + "line": 21 }, { - "name": "assigned_to", - "type": "str | None", - "default": "None" - }, - { - "name": "resolution", - "type": "str | None", - "default": "None" - } - ], - "line": 123, - "doc": "" - } - ], - "configuration": [ - { - "variable": "CIVICINSPECT_CASE_DB_URL", - "default": "", - "line": 456 - } - ] - }, - { - "source": "installed-owned-source/civicinspect/media_analysis.py", - "sha256": "be51101ee98596bca3055f99136531e3a76e28f2dc584148cf26098d75a94c5a", - "routes": [], - "models": [ - { - "name": "RetainedEvidence", - "bases": [], - "fields": [ + "name": "title", + "type": "str", + "line": 22 + }, { - "name": "filename", + "name": "body", "type": "str", - "default": "" + "line": 23 }, { - "name": "media_type", + "name": "has_alt_text", + "type": "bool", + "line": 24 + }, + { + "name": "language", "type": "str", - "default": "" + "line": 25 }, { - "name": "description", + "name": "status", "type": "str", - "default": "" + "line": 26 }, { - "name": "size_bytes", - "type": "int", - "default": "" + "name": "findings", + "type": "list[Finding]", + "line": 27 }, { - "name": "sha256", + "name": "disclaimer", "type": "str", - "default": "" + "line": 28 }, { - "name": "raw", - "type": "bytes", - "default": "field(repr=False)" - } - ], - "line": 55, - "doc": "Original evidence bytes with their verified digest and provenance." - }, - { - "name": "VisionProvider", - "bases": [ - "Protocol" - ], - "fields": [ + "name": "ai_analysis", + "type": "str | None", + "line": 29 + }, { - "name": "name", - "type": "str", - "default": "" + "name": "ai_analysis_model", + "type": "str | None", + "line": 30 }, { - "name": "supports_images", - "type": "bool", - "default": "" + "name": "created_at_unix_seconds", + "type": "int", + "line": 31 } ], - "line": 110, - "doc": "The owned civiccore provider shape (multimodal generate)." + "line": 19 }, { - "name": "TranscriptionProvider", + "name": "Event", "bases": [ - "Protocol" + "BaseModel" ], "fields": [ { - "name": "name", + "name": "event_id", "type": "str", - "default": "" - } - ], - "line": 121, - "doc": "Adapter that turns retained audio bytes into text." - }, - { - "name": "MediaAnalysis", - "bases": [], - "fields": [ - { - "name": "draft_observations", - "type": "list[dict[str, Any]]", - "default": "field(default_factory=list)" - }, - { - "name": "cited_sections", - "type": "list[dict[str, str]]", - "default": "field(default_factory=list)" - }, - { - "name": "unavailable", - "type": "list[dict[str, str]]", - "default": "field(default_factory=list)" + "line": 36 }, { - "name": "retained", - "type": "list[dict[str, Any]]", - "default": "field(default_factory=list)" + "name": "action", + "type": "str", + "line": 37 }, { - "name": "runtime", - "type": "dict[str, Any]", - "default": "field(default_factory=dict)" + "name": "subject_id", + "type": "str | None", + "line": 38 }, { - "name": "review_required", - "type": "bool", - "default": "True" + "name": "actor", + "type": "str", + "line": 39 }, { - "name": "determination_made", - "type": "bool", - "default": "False" - }, + "name": "created_at_unix_seconds", + "type": "int", + "line": 40 + } + ], + "line": 34 + } + ], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/records_import_store.py", + "sha256": "e5f116e7620d86cca0b46f37561dd7b1f714c83178be681f51bd6a9db942edcd", + "bytes": 16872, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/records_snapshot.py", + "sha256": "aa5bb7ee752f961c1cda5f5ebd1001d0fe603bdf3fa39857a7f28363ef8bb87d", + "bytes": 7220, + "routes": [ + { + "method": "GET", + "declared_path": "/state", + "function": "suite_state", + "line": 67 + }, + { + "method": "POST", + "declared_path": "/search", + "function": "search", + "line": 85 + } + ], + "models": [ + { + "name": "SearchInput", + "bases": [ + "BaseModel" + ], + "fields": [ { - "name": "boundary", + "name": "query", "type": "str", - "default": "BOUNDARY" + "line": 73 } ], - "line": 139, - "doc": "Result of a draft-only analysis pass." + "line": 71 + } + ], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/services.py", + "sha256": "c2839cde26f3bd8937d492c33129b6709898c3213a8f57416710c2e8253e10bf", + "bytes": 23688, + "routes": [ + { + "method": "GET", + "declared_path": "/health", + "function": "runtime_health", + "line": 443 + }, + { + "method": "GET", + "declared_path": "/modules", + "function": "runtime_health", + "line": 443 + }, + { + "method": "GET", + "declared_path": "/ready", + "function": "domain_ready", + "line": 448 } ], + "models": [], + "configuration": [ + { + "environment": "TOWNLIGHT_PROFILE_ROOT", + "line": 56 + }, + { + "environment": "TOWNLIGHT_DATA_DIR", + "line": 61 + }, + { + "environment": "LOCALAPPDATA", + "line": 64 + }, + { + "environment": "JWT_SECRET_FILE", + "line": 92 + }, + { + "environment": "FIRST_ADMIN_PASSWORD_FILE", + "line": 93 + }, + { + "environment": "ENCRYPTION_KEY", + "line": 94 + }, + { + "environment": "PORTAL_MODE", + "line": 99 + }, + { + "environment": "OLLAMA_BASE_URL", + "line": 100 + }, + { + "environment": "TOWNLIGHT_MEETINGS_OLLAMA_BASE_URL", + "line": 101 + }, + { + "environment": "TOWNLIGHT_CORE_LLM_PROVIDER", + "line": 102 + }, + { + "environment": "DATABASE_URL", + "line": 103 + }, + { + "environment": "DATABASE_URL", + "line": 148 + }, + { + "environment": "TOWNLIGHT_RUNTIME_HOST", + "line": 483 + }, + { + "environment": "TESTING", + "line": 113 + }, + { + "environment": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "line": 242 + }, + { + "environment": "DATABASE_URL", + "line": 302 + }, + { + "environment": "TOWNLIGHT_RUNTIME_PORT", + "line": 486 + } + ] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/storage.py", + "sha256": "d5c7aaa30c2b781ef9869de8cf9414e11ddfc855824439ba8d292bfb1fd1b9c3", + "bytes": 1016, + "routes": [], + "models": [], + "configuration": [ + { + "environment": "TOWNLIGHT_FILE_STORAGE_DIR", + "line": 12 + }, + { + "environment": "TOWNLIGHT_DATA_DIR", + "line": 15 + } + ] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/env.py", + "sha256": "8928b9156c23c2d63337d21c908784f87077cb515c758d3ccf0d6f88ac07ce45", + "bytes": 2922, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/001_initial.py", + "sha256": "cac7c6704232487a16a7443e45ccaa18a28bbd9d5b2bec975ef57c39d5165381", + "bytes": 4352, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/002_documents.py", + "sha256": "21474b7be697e152f256622a5396aa19b8defe67614aa1decaf9b1809aea496f", + "bytes": 3862, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/003_model_registry.py", + "sha256": "a4a1bf77d4e82f8b4ea763d5e65ef5ba6286c906a4e8f02b38b604ed1a442e2a", + "bytes": 1223, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/004_search.py", + "sha256": "ee9a39dcb25fbcdf16de136673655bd01c71b107cca27c41dacf8879a7fad948", + "bytes": 3541, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/005_requests.py", + "sha256": "0a55883877cd95959d495b8865efec727f18b8bbb86bf8269a938d876e575e55", + "bytes": 3782, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/006_exemptions.py", + "sha256": "c2935f1b3fa8771375a78fe065bb5274721a87c1650efb0146be4091ee475675", + "bytes": 3843, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/008_extend_request_status_enum.py", + "sha256": "b98949215e447bbef20643a34445f21018e9c1719c78634dca1485740911c3f4", + "bytes": 1156, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/009_fee_waivers.py", + "sha256": "3374202e15d16b5e1f64679bd6720c27ed2ebe63993c045bf75e6cc68b8fadb8", + "bytes": 1446, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/010_remove_sent_status.py", + "sha256": "45aca2a0b308c0b3e519f087711e6229ff92edc5bedf538e8572c433245336c7", + "bytes": 4012, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/011_fix_schema_drift.py", + "sha256": "a152698912070e923c7909ed98105bb29a739222b4cd5695e26e95351cf8d698", + "bytes": 4011, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/012_add_liaison_public_roles.py", + "sha256": "f5823d9a088125f055f6e6c2c5577a94002a899836b03e8a3f54adec50826879", + "bytes": 2217, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/013_add_connector_types.py", + "sha256": "234267eca383c478fa62403d7c34f93c0c2d721c557f40442febcb087da5baa0", + "bytes": 1524, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/014_p6a_idempotency.py", + "sha256": "3f6d96173809739a5990f53f855b63f169419810f6d68fffb28d5ab240cb1282", + "bytes": 3476, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/015_p6b_scheduler.py", + "sha256": "92c3929d3b951b22bd65d67e41409b07b19420dbe87442e45cabeeffd6fba945", + "bytes": 7272, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/016_p7_sync_failures.py", + "sha256": "99344bf472ac7fc854aeb78ae8bb9687543d20d65d1c097947f8a89aff543339", + "bytes": 3955, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/017_rename_connector_enum_values.py", + "sha256": "0d419b2ee2d571a96a947f700c73bfee07561cffa55ebb62d12aaaf3148522cc", + "bytes": 2053, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/migrations/__init__.py", - "sha256": "e18fc02330135cd7d0dd678a3e17f9e81966a9e187c3ed0ec002439fa8d3bbb1", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/018_city_profile_state_nullable.py", + "sha256": "5b78e57ccd12ecb2c322f144403cea522e802d9ee8abd9459c70deac06c53b8f", + "bytes": 2068, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/migrations/env.py", - "sha256": "9612897b28e02e86d1fa5b9ed48d951b76bb5a87151112d0c1cdbe10a0d343e3", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/019_encrypt_connection_config.py", + "sha256": "7665ba8bc10db28244384d8cdcf55162907e9657a75899464b037e075802f8a9", + "bytes": 5735, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/migrations/versions/civicinspect_0001_connected.py", - "sha256": "0e71ed311993f45634eb42ba22f5c2b2c4a3854639b221857af76f826d1b68de", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/020_phase2_consumer_app_backfill.py", + "sha256": "2376c670acb4bf7ae9fb4a6e323641c5e59231c413262b2c6e6b4c1a6c0e287c", + "bytes": 2601, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/notice_draft.py", - "sha256": "ef44c7d6bcf131bc703f6d0282510fe8a49cc6b5988f6252d01353e15551a2f6", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/021_first_admin_password_rotation.py", + "sha256": "365d7fdfe5d733077649d00fe6983fdefd0dc2d9fc078b9cea0753d0d5f734e7", + "bytes": 796, "routes": [], - "models": [ - { - "name": "NoticeDraft", - "bases": [], - "fields": [ - { - "name": "case_id", - "type": "str", - "default": "" - }, - { - "name": "property_reference", - "type": "str", - "default": "" - }, - { - "name": "heading", - "type": "str", - "default": "" - }, - { - "name": "draft_body", - "type": "str", - "default": "" - }, - { - "name": "required_staff_actions", - "type": "tuple[str, ...]", - "default": "" - }, - { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" - } - ], - "line": 11, - "doc": "" - } - ], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/persistence.py", - "sha256": "a4c75976a7fe2cc25d2c9a9074eee1a2870eb47bcf6890564d2fb31b113579e3", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/022_native_records_mapping.py", + "sha256": "1ae8180ca83c5863c1718274e5435fe1419ec48a4737ccf2434f531a4f2fd7b8", + "bytes": 4271, "routes": [], - "models": [ - { - "name": "StoredInspectionReport", - "bases": [], - "fields": [ - { - "name": "report_id", - "type": "str", - "default": "" - }, - { - "name": "inspection_id", - "type": "str", - "default": "" - }, - { - "name": "property_reference", - "type": "str", - "default": "" - }, - { - "name": "summary", - "type": "str", - "default": "" - }, - { - "name": "observation_bullets", - "type": "tuple[str, ...]", - "default": "" - }, - { - "name": "inspector_review_required", - "type": "bool", - "default": "" - }, - { - "name": "disclaimer", - "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "" - } - ], - "line": 70, - "doc": "" - }, - { - "name": "StaffReviewQueueItem", - "bases": [], - "fields": [ - { - "name": "review_id", - "type": "str", - "default": "" - }, - { - "name": "report_id", - "type": "str | None", - "default": "" - }, - { - "name": "inspection_id", - "type": "str", - "default": "" - }, - { - "name": "property_reference", - "type": "str", - "default": "" - }, - { - "name": "status", - "type": "str", - "default": "" - }, - { - "name": "reason", - "type": "str", - "default": "" - }, - { - "name": "assigned_to", - "type": "str | None", - "default": "" - }, - { - "name": "resolution", - "type": "str | None", - "default": "" - }, - { - "name": "created_by", - "type": "str", - "default": "" - }, - { - "name": "created_at", - "type": "datetime", - "default": "" - }, - { - "name": "updated_at", - "type": "datetime", - "default": "" - }, - { - "name": "visibility", - "type": "str", - "default": "'staff_only'" - } - ], - "line": 82, - "doc": "" - }, - { - "name": "StaffReviewSummary", - "bases": [], - "fields": [ - { - "name": "total_items", - "type": "int", - "default": "" - }, - { - "name": "by_status", - "type": "dict[str, int]", - "default": "" - }, - { - "name": "open_items", - "type": "int", - "default": "" - }, - { - "name": "generated_at", - "type": "datetime", - "default": "" - }, - { - "name": "visibility", - "type": "str", - "default": "'staff_only'" - } - ], - "line": 98, - "doc": "" - } - ], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/public_ui.py", - "sha256": "c14bd5b3d45dc1434edeffb931cd6abb8804bff675989769c8eb89c85a46f965", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/023_native_records_lifecycle.py", + "sha256": "00633480cbda11121fc6f98aa10b978ca24213a3626ddd4106c1aa5f660e599e", + "bytes": 6067, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/records_export.py", - "sha256": "6adcb9a04cbff7d9d455f41598a0bdb1dfd736aa13f439a61f1e2ed98f8b49bb", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/024_records_file_evidence.py", + "sha256": "09c48872ab8e378d709542e20f8495cb1857146b78238e73de570a21151f2fcf", + "bytes": 2553, "routes": [], - "models": [ - { - "name": "InspectionExport", - "bases": [], - "fields": [ - { - "name": "title", - "type": "str", - "default": "" - }, - { - "name": "case_id", - "type": "str", - "default": "" - }, - { - "name": "format", - "type": "str", - "default": "" - }, - { - "name": "checklist", - "type": "tuple[str, ...]", - "default": "" - }, - { - "name": "retention_note", - "type": "str", - "default": "" - } - ], - "line": 9, - "doc": "" - } - ], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/report_draft.py", - "sha256": "40faeb3103ac9ba5ae45fd74136d5cff0a96c5fa73acb96f4a16a34d1cb7ebd5", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/025_records_artifacts.py", + "sha256": "b4f4c62211d57b123978fe78ae3dc0c7503110ccae9422776e1bd6d13d003b8a", + "bytes": 2526, "routes": [], - "models": [ - { - "name": "InspectionReportDraft", - "bases": [], - "fields": [ - { - "name": "inspection_id", - "type": "str", - "default": "" - }, - { - "name": "property_reference", - "type": "str", - "default": "" - }, - { - "name": "summary", - "type": "str", - "default": "" - }, - { - "name": "observation_bullets", - "type": "tuple[str, ...]", - "default": "" - }, - { - "name": "inspector_review_required", - "type": "bool", - "default": "" - }, - { - "name": "cited_sections", - "type": "tuple[str, ...]", - "default": "()" - }, - { - "name": "disclaimer", - "type": "str", - "default": "DISCLAIMER" - } - ], - "line": 11, - "doc": "" - } - ], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/civicinspect/transcription.py", - "sha256": "0289536c591fa63b6bfa25512444c4a36edc1f160a93d195d3e5aea9e718289f", + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/026_native_public_actor.py", + "sha256": "3958251d4c9710ffc20572ee7dcc0fe2dbc169e6f56bd1461d6c1239c2ac231c", + "bytes": 631, "routes": [], "models": [], - "configuration": [ + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/027_import_artifact_order.py", + "sha256": "9ef98e386a1dc848a1fab6893b009198d70556020482df207618519a3301faf8", + "bytes": 430, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/townlight_records_alembic/alembic/versions/787207afc66a_phase2_extensions_12_new_tables_and_.py", + "sha256": "4d3c03861b6061058d19953a8deb8d8c46cdba775154bf05eed055ee16b26e24", + "bytes": 18344, + "routes": [], + "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", + "bytes": 15192, + "routes": [ + { + "method": "POST", + "declared_path": "/imports", + "function": "imports", + "line": 68 + }, + { + "method": "POST", + "declared_path": "/parcels/lookup", + "function": "parcel_lookup", + "line": 91 + }, + { + "method": "GET", + "declared_path": "/questions/{question_id}/history", + "function": "question_history", + "line": 209 + }, + { + "method": "POST", + "declared_path": "/meetings/search", + "function": "search_meetings", + "line": 216 + }, + { + "method": "POST", + "declared_path": "/questions/{question_id}/meetings", + "function": "link_meeting", + "line": 242 + }, { - "variable": "CIVICINSPECT_FFMPEG", - "default": "", - "line": 53 + "method": "POST", + "declared_path": "/questions/{question_id}/snapshots", + "function": "create_snapshot", + "line": 259 }, { - "variable": "CIVICINSPECT_TEXTFLOWKIT_PYTHON", - "default": "", - "line": 49 - } - ] - }, - { - "source": "installed-owned-source/civicinspect/workflow_models.py", - "sha256": "7f61e6c7bde5b79202b562d9183c5558d5504fe19eda9ed8fe52541d92152377", - "routes": [], - "models": [ + "method": "POST", + "declared_path": "/rules", + "function": "create_rule", + "line": 291 + }, { - "name": "AnalysisObservation", - "bases": [ - "Model" - ], - "fields": [ - { - "name": "source", - "type": "str", - "default": "Field(min_length=1, max_length=64)" - }, - { - "name": "filename", - "type": "str", - "default": "Field(default='', max_length=160)" - }, - { - "name": "media_type", - "type": "str", - "default": "Field(default='', max_length=80)" - }, - { - "name": "text", - "type": "str", - "default": "Field(min_length=1, max_length=4000)" - }, - { - "name": "adapter", - "type": "str", - "default": "Field(default='', max_length=120)" - }, - { - "name": "citation_source_ids", - "type": "list[str]", - "default": "Field(default_factory=list, max_length=30)" - } - ], - "line": 23, - "doc": "One draft observation, named with the adapter that actually produced it." + "method": "POST", + "declared_path": "/questions", + "function": "create_question", + "line": 300 }, { - "name": "CitedSection", - "bases": [ - "Model" - ], - "fields": [ - { - "name": "source_id", - "type": "str", - "default": "Field(min_length=1, max_length=500)" - }, - { - "name": "citation", - "type": "str", - "default": "Field(min_length=1, max_length=500)" - }, - { - "name": "title", - "type": "str", - "default": "Field(default='', max_length=500)" - }, - { - "name": "version", - "type": "str", - "default": "Field(default='', max_length=80)" - } - ], - "line": 40, - "doc": "One resolved public Code section; never a caller-supplied quotation." + "method": "GET", + "declared_path": "/workspace", + "function": "get_workspace", + "line": 313 }, { - "name": "AnalysisRecord", - "bases": [ - "Model" - ], - "fields": [ - { - "name": "observations", - "type": "list[AnalysisObservation]", - "default": "Field(default_factory=list, max_length=30)" - }, - { - "name": "cited_sections", - "type": "list[CitedSection]", - "default": "Field(default_factory=list, max_length=30)" - }, - { - "name": "unavailable", - "type": "list[str]", - "default": "Field(default_factory=list, max_length=30)" - }, - { - "name": "runtime", - "type": "dict", - "default": "Field(default_factory=dict)" - }, - { - "name": "review_required", - "type": "bool", - "default": "True" - } - ], - "line": 49, - "doc": "The adapter output that accompanies a saved inspection draft." + "method": "POST", + "declared_path": "/questions/{question_id}/reviews", + "function": "create_review", + "line": 318 }, { - "name": "AnalysisRecord", + "method": "POST", + "declared_path": "/outlines", + "function": "create_outline", + "line": 325 + }, + { + "method": "POST", + "declared_path": "/code-context", + "function": "create_code_context", + "line": 332 + }, + { + "method": "POST", + "declared_path": "/standards/process-explanation", + "function": "standards_explanation", + "line": 373 + }, + { + "method": "POST", + "declared_path": "/questions", + "function": "public_question", + "line": 423 + }, + { + "method": "POST", + "declared_path": "/parcels/lookup", + "function": "public_parcel_lookup", + "line": 434 + } + ], + "models": [ + { + "name": "_ParcelLookupIn", "bases": [ - "Model" + "BaseModel" ], "fields": [ { - "name": "observations", - "type": "list[AnalysisObservation]", - "default": "Field(default_factory=list, max_length=30)" - }, - { - "name": "cited_sections", - "type": "list[CitedSection]", - "default": "Field(default_factory=list, max_length=30)" - }, - { - "name": "unavailable", - "type": "list[str]", - "default": "Field(default_factory=list, max_length=30)" - }, - { - "name": "runtime", - "type": "dict", - "default": "Field(default_factory=dict)" + "name": "jurisdiction", + "type": "str", + "line": 63 }, { - "name": "review_required", - "type": "bool", - "default": "True" + "name": "query", + "type": "str", + "line": 64 } ], - "line": 74, - "doc": "The adapter output that accompanies a saved inspection draft." + "line": 60 }, { - "name": "Evidence", + "name": "Question", "bases": [ - "Model" + "Strict" ], "fields": [ { - "name": "filename", + "name": "jurisdiction", "type": "str", - "default": "Field(pattern='^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,150}$')" + "line": 151 }, { - "name": "description", + "name": "query", "type": "str", - "default": "Field(min_length=1, max_length=2000)" + "line": 152 }, { - "name": "media_type", - "type": "Literal['text/plain', 'image/jpeg', 'image/png', 'image/webp', 'application/pdf', 'audio/webm', 'audio/ogg', 'audio/wav', 'audio/mpeg', 'audio/mp4']", - "default": "" - }, - { - "name": "content_base64", + "name": "question", "type": "str", - "default": "Field(min_length=1, max_length=14000000)" + "line": 153 }, { - "name": "sha256", - "type": "str", - "default": "Field(pattern='^[a-f0-9]{64}$')" - } - ], - "line": 118, - "doc": "" - }, - { - "name": "SourceLink", - "bases": [ - "Model" - ], - "fields": [ - { - "name": "provider", - "type": "Literal['code']", - "default": "'code'" + "name": "kind", + "type": "Literal['use', 'dimension']", + "line": 154 }, { - "name": "source_id", + "name": "key", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 155 }, { - "name": "expected_sha256", - "type": "str", - "default": "Field(pattern='^[a-f0-9]{64}$')" + "name": "audience", + "type": "Literal['resident', 'staff']", + "line": 156 } ], - "line": 138, - "doc": "" + "line": 150 }, { - "name": "InspectionInput", + "name": "Rule", "bases": [ - "Model" + "Strict" ], "fields": [ { - "name": "expected_revision", - "type": "UUID | None", - "default": "None" - }, - { - "name": "title", - "type": "str", - "default": "Field(min_length=1, max_length=500)" - }, - { - "name": "property_reference", - "type": "str", - "default": "Field(min_length=1, max_length=1000)" - }, - { - "name": "inspection_reference", - "type": "str", - "default": "Field(min_length=1, max_length=160)" - }, - { - "name": "dataset_kind", - "type": "Literal['municipal', 'fictional']", - "default": "" - }, - { - "name": "inspector_notes", - "type": "str", - "default": "Field(min_length=1, max_length=10000)" - }, - { - "name": "photo_observations", - "type": "list[str]", - "default": "Field(default_factory=list, max_length=30)" - }, - { - "name": "voice_notes", + "name": "jurisdiction", "type": "str", - "default": "Field(default='', max_length=10000)" - }, - { - "name": "evidence", - "type": "list[Evidence]", - "default": "Field(default_factory=list, max_length=10)" - }, - { - "name": "linked_sources", - "type": "list[SourceLink]", - "default": "Field(default_factory=list, max_length=30)" + "line": 160 }, { - "name": "assigned_to", + "name": "zone_code", "type": "str", - "default": "Field(default='', max_length=255)" + "line": 161 }, { - "name": "staff_notes", + "name": "key", "type": "str", - "default": "Field(default='', max_length=10000)" + "line": 162 }, { - "name": "notice_draft", + "name": "section_number", "type": "str", - "default": "Field(default='', max_length=10000)" - }, - { - "name": "review_state", - "type": "Literal['draft', 'follow_up', 'reviewed']", - "default": "'draft'" + "line": 163 }, { - "name": "review_notes", - "type": "str", - "default": "Field(default='', max_length=4000)" + "name": "kind", + "type": "Literal['use', 'dimension']", + "line": 164 }, { - "name": "public_summary", + "name": "value", "type": "str", - "default": "Field(default='', max_length=10000)" + "line": 165 }, { - "name": "analysis", - "type": "AnalysisRecord | None", - "default": "None" + "name": "overlay_code", + "type": "str | None", + "line": 166 } ], - "line": 144, - "doc": "" - } - ], - "configuration": [] - }, - { - "source": "installed-owned-source/civicinspect/workflow_schema.py", - "sha256": "2f8638e3319939ce8b3f7b0b1ef59013f3344b8bcaf9be7d1ad6f3bd4b30ac68", - "routes": [], - "models": [], - "configuration": [] - }, - { - "source": "installed-owned-source/civicinspect/workflow_store.py", - "sha256": "df4ff48879d5f8fe31d71a410a99ed8c359676ab05a267db65e1468cb4764146", - "routes": [], - "models": [], - "configuration": [] - } - ], - "bridge": [ - { - "source": "installed-owned-source/civicsuite_runtime/inspections_bridge.py", - "sha256": "b7429c3ab988005a198795d6f1dfc3f785c7f96f61410903f8cb0ad38c6f512c", - "routes": [ - { - "method": "POST", - "path": "/desktop/v1/inspections/repeat-cases", - "router": "router", - "prefix_resolved": true, - "name": "repeat_cases", - "signature": "request: Request, body: RepeatLookup, identity=Depends(actor)", - "returns": "", - "line": 93, - "doc": "", - "decorator": "router.post('/repeat-cases')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections/notice-draft", - "router": "router", - "prefix_resolved": true, - "name": "notice", - "signature": "request: Request, body: InspectionInput, identity=Depends(actor)", - "returns": "", - "line": 98, - "doc": "", - "decorator": "router.post('/notice-draft')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/inspections/cases", - "router": "router", - "prefix_resolved": true, - "name": "cases", - "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", - "returns": "", - "line": 105, - "doc": "", - "decorator": "router.get('/cases')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections/cases", - "router": "router", - "prefix_resolved": true, - "name": "create_case", - "signature": "request: Request, body: InspectionInput, identity=Depends(actor)", - "returns": "", - "line": 110, - "doc": "", - "decorator": "router.post('/cases')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/inspections/cases/{case_id}", - "router": "router", - "prefix_resolved": true, - "name": "case", - "signature": "request: Request, case_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 115, - "doc": "", - "decorator": "router.get('/cases/{case_id}')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections/cases/{case_id}/revisions", - "router": "router", - "prefix_resolved": true, - "name": "revise", - "signature": "request: Request, case_id: UUID, body: InspectionInput, identity=Depends(actor)", - "returns": "", - "line": 120, - "doc": "", - "decorator": "router.post('/cases/{case_id}/revisions')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/inspections/cases/{case_id}/history", - "router": "router", - "prefix_resolved": true, - "name": "history", - "signature": "request: Request, case_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 125, - "doc": "", - "decorator": "router.get('/cases/{case_id}/history')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections/cases/{case_id}/packets", - "router": "router", - "prefix_resolved": true, - "name": "packet", - "signature": "request: Request, case_id: UUID, body: Packet, identity=Depends(actor)", - "returns": "", - "line": 135, - "doc": "", - "decorator": "router.post('/cases/{case_id}/packets')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/inspections/packets/{packet_id}", - "router": "router", - "prefix_resolved": true, - "name": "document", - "signature": "request: Request, packet_id: UUID, identity=Depends(actor)", - "returns": "", - "line": 140, - "doc": "", - "decorator": "router.get('/packets/{packet_id}')", - "errors": [] - }, - { - "method": "GET", - "path": "/desktop/v1/inspections/evidence/supported-types", - "router": "router", - "prefix_resolved": true, - "name": "supported_types", - "signature": "identity=Depends(actor)", - "returns": "", - "line": 179, - "doc": "The media types this deployment's product model actually accepts.", - "decorator": "router.get('/evidence/supported-types')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections/evidence/retain", - "router": "router", - "prefix_resolved": true, - "name": "retain", - "signature": "request: Request, body: EvidenceItems, identity=Depends(actor)", - "returns": "", - "line": 188, - "doc": "", - "decorator": "router.post('/evidence/retain')", - "errors": [] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections/media/analyse", - "router": "router", - "prefix_resolved": true, - "name": "media_analyse", - "signature": "request: Request, body: MediaAnalysis, identity=Depends(actor)", - "returns": "", - "line": 199, - "doc": "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.", - "decorator": "router.post('/media/analyse')", - "errors": [ - "HTTPException(503, str(exc))" - ] - }, - { - "method": "POST", - "path": "/desktop/v1/inspections/connections/search", - "router": "router", - "prefix_resolved": true, - "name": "connections", - "signature": "request: Request, body: Search, identity=Depends(actor)", - "returns": "", - "line": 234, - "doc": "", - "decorator": "router.post('/connections/search')", - "errors": [] - } - ], - "models": [ + "line": 159 + }, { - "name": "RepeatLookup", + "name": "Review", "bases": [ - "Model" + "Strict" ], "fields": [ { - "name": "property_reference", + "name": "answer", + "type": "str", + "line": 170 + }, + { + "name": "notes", "type": "str", - "default": "Field(min_length=1, max_length=1000)" + "line": 171 + }, + { + "name": "queue_status", + "type": "Literal['open', 'in_review', 'resolved', 'closed']", + "line": 172 } ], - "line": 88, - "doc": "" + "line": 169 }, { - "name": "Packet", + "name": "Outline", "bases": [ - "Model" + "Strict" ], "fields": [ { - "name": "expected_revision", - "type": "UUID", - "default": "" + "name": "title", + "type": "str", + "line": 176 }, { - "name": "visibility", - "type": "Literal['staff_only', 'records_copy']", - "default": "" + "name": "question_ids", + "type": "list[UUID]", + "line": 177 } ], - "line": 129, - "doc": "" + "line": 175 }, { - "name": "EvidenceItem", + "name": "CodeContext", "bases": [ - "Model" + "Strict" ], "fields": [ { - "name": "filename", - "type": "str", - "default": "Field(min_length=1, max_length=151)" - }, - { - "name": "media_type", - "type": "str", - "default": "Field(min_length=1, max_length=80)" - }, - { - "name": "description", - "type": "str", - "default": "Field(default='', max_length=2000)" - }, - { - "name": "content_base64", + "name": "section_number", "type": "str", - "default": "Field(min_length=1, max_length=14000000)" + "line": 181 }, { - "name": "sha256", - "type": "str", - "default": "Field(pattern='^[a-f0-9]{64}$')" + "name": "as_of", + "type": "date | None", + "line": 182 } ], - "line": 144, - "doc": "" + "line": 180 }, { - "name": "EvidenceItems", + "name": "MeetingSearch", "bases": [ - "Model" + "Strict" ], "fields": [ { - "name": "items", - "type": "list[EvidenceItem]", - "default": "Field(min_length=1, max_length=10)" + "name": "query", + "type": "str", + "line": 186 } ], - "line": 152, - "doc": "" + "line": 185 }, { - "name": "CodeLink", + "name": "MeetingLink", "bases": [ - "Model" + "Strict" ], "fields": [ - { - "name": "provider", - "type": "Literal['code']", - "default": "'code'" - }, { "name": "source_id", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 190 }, { "name": "expected_sha256", "type": "str", - "default": "Field(pattern='^[a-f0-9]{64}$')" + "line": 191 + }, + { + "name": "relation", + "type": "Literal['hearing', 'context', 'precedent']", + "line": 192 } ], - "line": 156, - "doc": "" + "line": 189 }, { - "name": "MediaAnalysis", + "name": "SourceSnapshot", "bases": [ - "Model" + "Strict" ], "fields": [ { - "name": "items", - "type": "list[EvidenceItem]", - "default": "Field(min_length=1, max_length=10)" - }, - { - "name": "code_links", - "type": "list[CodeLink]", - "default": "Field(default_factory=list, max_length=30)" + "name": "visibility", + "type": "Literal['public', 'staff_only']", + "line": 196 }, { - "name": "inspector_supplied_text", - "type": "str", - "default": "Field(default='', max_length=10000)" + "name": "meeting_event_ids", + "type": "list[UUID]", + "line": 197 } ], - "line": 162, - "doc": "" + "line": 195 }, { - "name": "Search", + "name": "StandardsExplanation", "bases": [ - "Model" + "BaseModel" ], "fields": [ { - "name": "provider", - "type": "Literal['code']", - "default": "" + "name": "question", + "type": "str", + "line": 345 }, { - "name": "query", + "name": "process_section", + "type": "str", + "line": 346 + }, + { + "name": "zone_code", "type": "str", - "default": "Field(min_length=1, max_length=500)" + "line": 347 + }, + { + "name": "rule_types", + "type": "list[str]", + "line": 348 + }, + { + "name": "observed", + "type": "dict[str, str]", + "line": 349 } ], - "line": 228, - "doc": "" + "line": 342 } ], + "configuration": [ + { + "environment": "TOWNLIGHT_ZONING_PARCEL_RULE_DB_URL", + "line": 359 + } + ] + }, + { + "source": "desktop/runtime/python-services/townlight_runtime/zoning_records.py", + "sha256": "c4cb908e45e90baeaedff9fd4c668ca65229e129bc298b4d893d515046e73449", + "bytes": 1700, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/atomic_io.rs", + "sha256": "f48017db219a365b17988522616e2f5ab332986936064712fb12c5f228ab3d35", + "bytes": 5543, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/auth.rs", + "sha256": "e5d5febef258b15f03edb006f2204467e87890b08259db1f8ffeec5f208ee156", + "bytes": 45187, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/code_client.rs", + "sha256": "7f07c7b90ccf97bfb8883541525417d598c6f385d54a9694d65e9ac40890cdad", + "bytes": 9186, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/demo_fixture.rs", + "sha256": "118bf6c8ebdc6fe8d7210bb08c7f7aae7c7f58b99ca25a805f74b49264b51725", + "bytes": 9823, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/domain_client.rs", + "sha256": "95e608acfac2f5621205314a61a317f50437f53b1bbee9cdd2e59431ee893a2c", + "bytes": 41159, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/domain_files.rs", + "sha256": "85e715da4f8b0762bd2496755c76cbc1b7bc3e81f7d23995cf3ecc16b55a5095", + "bytes": 13384, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/first_run.rs", + "sha256": "45e42d7fae458cf4546bedb6b55d5e25cdc617ebda8fc612cef9e0838124b00f", + "bytes": 56023, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/inspections_client.rs", + "sha256": "88f582cd2941c27ddd1245df18666d6cfe95ad5523225ea2186bc6d3a5a6643c", + "bytes": 4521, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/local_paths.rs", + "sha256": "f07d2a74cef04beaa64cf92a37eef8e1095dbc16d8c8d48e679702666a1b6f19", + "bytes": 4291, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/local_shell.rs", + "sha256": "feeb5b6b396c0ad3eea0ecc8505068745eaaf0354bac1e97274aad9a68971100", + "bytes": 2428, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/main.rs", + "sha256": "a0b4dd53a0b7c2c4a4e10ae19d236c5bafadc5c3d01065ed89a6fdbfbac31378", + "bytes": 80956, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/model.rs", + "sha256": "dbec92b4eb25790ac05c55cde83458819559d5918c97dee0c57258b0cdb36d4c", + "bytes": 100505, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/module_registry.rs", + "sha256": "d7afcece112c88cd421932c4502446280dffbbf732ee99b06951a2054edf050a", + "bytes": 61224, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/notice_client.rs", + "sha256": "6ae504993b9f503b05dbc4acbbedf58a52895c19f9c16298723de094a17d4ae3", + "bytes": 2591, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/permitting_client.rs", + "sha256": "2efc10f71c22cb9167b2f4c6e2ab9c24a6ea3301d37a1bdc04c0e3a76fbd882a", + "bytes": 4373, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/planning_client.rs", + "sha256": "5733d0364c2d28d6e98af4ea5357c6b22d1f605f69c58630ce561327112eee1f", + "bytes": 10603, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/profile_gate.rs", + "sha256": "5efaedda31be755a165b86d34e87c71d54cd01db94efdcc2b596d50d54cd5b66", + "bytes": 1809, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/profile_identity.rs", + "sha256": "04f49fc1fcf51adadf958a100204db63c8527034fbb679df15a589794c01fb3a", + "bytes": 2536, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/records_authority.rs", + "sha256": "87f47a88d1675425dbea11bb630c552d32d2b04c7dcf5010af6cf1ef32c1ab11", + "bytes": 2970, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/supervisor.rs", + "sha256": "9266597ef98e59e965241df5b9e48face47c1f2483af634733c67a3de352616a", + "bytes": 212785, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/workflows.rs", + "sha256": "f0a1a9fdfd3b62852c88a3997c6425510078194727cd5d605b411ce68b2abee0", + "bytes": 42706, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src-tauri/src/zoning_client.rs", + "sha256": "3ffa1fe93379491ca5efb00fefc4044ae35479bd04479f674bc0f2ee77e4ee85", + "bytes": 4140, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/code/client.ts", + "sha256": "82e69121ebba5c8d617a4b9afcc7b6a9d9fa360464bb1a62778cbfe2ea40e22c", + "bytes": 5805, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/code/view.js", + "sha256": "cd4de8e1f4caae9a7a5331e1f34beadf2a8faef00883b14ac6a4e8be06be53e6", + "bytes": 10101, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/inspections/view.js", + "sha256": "7f3bb66fbaf5f78705c729e2db82dafd77b6c0ea6a2accd2aed57ad057d980bf", + "bytes": 17631, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/main.js", + "sha256": "1c3cd828e8c142fbcb0242a172c967dcbc56dacec400c8063a339238bfae5c02", + "bytes": 356383, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/meetings/client.ts", + "sha256": "ba12839650f17a66d5eff5782c0e5feb1a9ad7abfbe1442958b86d9f7813e1cc", + "bytes": 6896, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/meetings/view.js", + "sha256": "3d12d5fde231bd777eb3717aac068a8397afe4b2182debff3711592c9881ac24", + "bytes": 17252, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/notice/view.js", + "sha256": "05fdae1f9647ea84ef1afee51dda4aad72fdf2765dd32dab8e987c043b14cbf1", + "bytes": 9626, + "routes": [], + "models": [], "configuration": [] - } - ] - }, - "station": { - "package": "townlight_station", - "source": [ + }, { - "source": "installed-owned-source/townlight_station/__init__.py", - "sha256": "0e4ae6948a7b82358592fa123efcb0f2f19edd0322d93e8077da9db1dcde1ccc", + "source": "desktop/src/permitting/view.js", + "sha256": "261b6bcbdffc4c107bfddcfb46c7c8013de78e94b22171560034e3353e545a01", + "bytes": 19392, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/air.py", - "sha256": "501f3ab5cd85ef7409e692496b8ab8146c3f894a0c3c963fb40d44a71088a97f", + "source": "desktop/src/planning/client.ts", + "sha256": "90f5f834e301189b907bcf2cc6a83ecd5b9f5bc10199a61b7cd06224905c6584", + "bytes": 1249, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/airplay.py", - "sha256": "49efe58ba56e37260c24e9ac329f942f6520c3f16d341b0d4ece803750ce0988", + "source": "desktop/src/planning/municipal.js", + "sha256": "b3e0cb7dd66e81584d317a6f270e9cf1892147805349e1f3ec91e453ece90d70", + "bytes": 9154, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/api.py", - "sha256": "ac098e06290f5888924bb7a211a3925107161c9e01634f998f7303f05a854b18", - "routes": [ - { - "method": "GET", - "path": "/health", - "router": "app", - "prefix_resolved": true, - "name": "health", - "signature": "", - "returns": "", - "line": 79, - "doc": "", - "decorator": "app.get('/health')", - "errors": [] - }, - { - "method": "GET", - "path": "/v1/identity", - "router": "app", - "prefix_resolved": true, - "name": "identity", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 84, - "doc": "", - "decorator": "app.get('/v1/identity')", - "errors": [] - }, - { - "method": "POST", - "path": "/v1/recordings", - "router": "app", - "prefix_resolved": true, - "name": "capture", - "signature": "data: Capture, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 89, - "doc": "", - "decorator": "app.post('/v1/recordings', status_code=202)", - "errors": [ - "HTTPException(422, 'Select one recorded file or live input; live input preserves embedded captions')", - "HTTPException(422, 'Configured live input not found')", - "HTTPException(422, 'Source file missing or exceeds configured limit')", - "HTTPException(422, 'Caption sidecar missing or too large')", - "HTTPException(409, 'Agenda item does not belong to this meeting')", - "HTTPException(409, 'Station is busy; live recording must start immediately')", - "HTTPException(429, 'Station queue is full; no capture accepted')", - "HTTPException(409, 'Idempotency key already describes different source evidence')" - ] - }, - { - "method": "GET", - "path": "/v1/recordings/{identity}", - "router": "app", - "prefix_resolved": true, - "name": "get_record", - "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 187, - "doc": "", - "decorator": "app.get('/v1/recordings/{identity}')", - "errors": [] - }, - { - "method": "GET", - "path": "/v1/recordings/{identity}/content", - "router": "app", - "prefix_resolved": true, - "name": "content", - "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 191, - "doc": "", - "decorator": "app.get('/v1/recordings/{identity}/content')", - "errors": [ - "HTTPException(409, 'Recording is not complete')", - "HTTPException(409, 'Recording integrity failure')" - ] - }, - { - "method": "POST", - "path": "/v1/recordings/{identity}/retry", - "router": "app", - "prefix_resolved": true, - "name": "retry", - "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 202, - "doc": "", - "decorator": "app.post('/v1/recordings/{identity}/retry', status_code=202)", - "errors": [ - "HTTPException(404, 'Recording not found')", - "HTTPException(409, 'Only failed/interrupted recordings can be retried')", - "HTTPException(409, 'A live gap cannot be retried; start a new recording')" - ] - }, - { - "method": "GET", - "path": "/v1/live-sources", - "router": "app", - "prefix_resolved": true, - "name": "live_sources", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 215, - "doc": "", - "decorator": "app.get('/v1/live-sources')", - "errors": [] - }, - { - "method": "GET", - "path": "/v1/recordings", - "router": "app", - "prefix_resolved": true, - "name": "list_records", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 220, - "doc": "", - "decorator": "app.get('/v1/recordings')", - "errors": [] - }, - { - "method": "POST", - "path": "/v1/recordings/{identity}/stop", - "router": "app", - "prefix_resolved": true, - "name": "stop_live", - "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 226, - "doc": "", - "decorator": "app.post('/v1/recordings/{identity}/stop', status_code=202)", - "errors": [ - "HTTPException(404, 'Recording not found')", - "HTTPException(409, 'This recording is not live')", - "HTTPException(409, 'Recording already ended')" - ] - } - ], - "models": [ - { - "name": "Capture", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "meeting_id", - "type": "UUID", - "default": "" - }, - { - "name": "agenda_ids", - "type": "list[UUID]", - "default": "Field(default_factory=list, max_length=100)" - }, - { - "name": "source_file", - "type": "str | None", - "default": "Field(default=None, pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}$')" - }, - { - "name": "live_source_id", - "type": "str | None", - "default": "Field(default=None, pattern='^[A-Za-z0-9_-]{1,64}$')" - }, - { - "name": "captions_file", - "type": "str | None", - "default": "Field(default=None, pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}\\\\.srt$')" - }, - { - "name": "idempotency_key", - "type": "str", - "default": "Field(min_length=1, max_length=100)" - } - ], - "line": 34, - "doc": "" - } - ], + "source": "desktop/src/planning/planning.css", + "sha256": "477e8f96587001e6d67f406bea2768d112fa519ae2e8cde55e18ad2eda678cfb", + "bytes": 7003, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/boundary.py", - "sha256": "e3b39156fb3fd3e0c4ff1dc9370ce133b9163ee689eeb4be0f5e235833e5336e", + "source": "desktop/src/planning/view.js", + "sha256": "9b3b76c9ec43ac09df553469ed20263ba60c2cde65cfcaa8e32a591f59078a36", + "bytes": 44120, "routes": [], - "models": [ - { - "name": "Settings", - "bases": [], - "fields": [ - { - "name": "data", - "type": "Path", - "default": "" - }, - { - "name": "database_url", - "type": "str", - "default": "" - }, - { - "name": "suite_url", - "type": "str", - "default": "" - }, - { - "name": "media_source", - "type": "Path", - "default": "" - }, - { - "name": "media_python", - "type": "Path", - "default": "" - }, - { - "name": "media_runtime", - "type": "Path", - "default": "" - }, - { - "name": "ffprobe", - "type": "Path", - "default": "" - }, - { - "name": "max_seconds", - "type": "int", - "default": "7200" - }, - { - "name": "max_bytes", - "type": "int", - "default": "2147483647" - }, - { - "name": "width", - "type": "int", - "default": "1920" - }, - { - "name": "height", - "type": "int", - "default": "1080" - }, - { - "name": "fps", - "type": "int", - "default": "30" - }, - { - "name": "bitrate_kbps", - "type": "int", - "default": "6000" - } - ], - "line": 45, - "doc": "" - } - ], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/cli.py", - "sha256": "ffbd1fc7ce709ff255d4b5f190fda532d395c9febddf5c281fdff3345f19a9c9", + "source": "desktop/src/records/access-client.ts", + "sha256": "6c284a448745a2f3872b2a36dbe1ccd30d0426212362f8c944a923061656b5a7", + "bytes": 3525, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/live.py", - "sha256": "a35de110d5dbfdcf0b98425baf4b664fc4d0324c640c737086936dbe17adc829", + "source": "desktop/src/records/client.ts", + "sha256": "9df93865a964bbb3ba991956f89bc51053511a6497e92b230f01a7a366420e6c", + "bytes": 6675, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/media_job.py", - "sha256": "15237eaa872c9772c548aaf57dced25ec51a343489b894a462d95de19507e59b", + "source": "desktop/src/records/code-sources.ts", + "sha256": "52755e6d4248bbfc6268c62f9c663edef7526497dac27acb29b887d5b7b9d0d4", + "bytes": 4716, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/operations.py", - "sha256": "69019673d277ee4850d4dd1789e0576b6883d684b0f1ead2be9f965cfdf7b7d2", - "routes": [ - { - "method": "POST", - "path": "/v1/schedules", - "router": "app", - "prefix_resolved": true, - "name": "create_schedule", - "signature": "data: ScheduleRequest, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 106, - "doc": "", - "decorator": "app.post('/v1/schedules', status_code=202)", - "errors": [ - "HTTPException(422, 'Select one recorded file or live input; live input preserves embedded captions')", - "HTTPException(422, 'Configured live input not found')", - "HTTPException(422, 'Source file missing from managed ingest')", - "HTTPException(422, 'Caption sidecar missing from managed ingest')", - "HTTPException(409, 'Agenda item does not belong to this meeting')" - ] - }, - { - "method": "GET", - "path": "/v1/schedules", - "router": "app", - "prefix_resolved": true, - "name": "list_schedules", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 143, - "doc": "", - "decorator": "app.get('/v1/schedules')", - "errors": [] - }, - { - "method": "POST", - "path": "/v1/schedules/{identity}/cancel", - "router": "app", - "prefix_resolved": true, - "name": "cancel_schedule", - "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 151, - "doc": "", - "decorator": "app.post('/v1/schedules/{identity}/cancel', status_code=202)", - "errors": [ - "HTTPException(409, 'Only a schedule that has not started can be cancelled')" - ] - }, - { - "method": "POST", - "path": "/v1/playouts", - "router": "app", - "prefix_resolved": true, - "name": "create_playout", - "signature": "data: PlayoutRequest, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 163, - "doc": "", - "decorator": "app.post('/v1/playouts', status_code=202)", - "errors": [ - "HTTPException(404, 'Recording not found')", - "HTTPException(409, 'Only a complete, verified recording can be committed to air')" - ] - }, - { - "method": "GET", - "path": "/v1/playouts", - "router": "app", - "prefix_resolved": true, - "name": "list_playouts", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 187, - "doc": "", - "decorator": "app.get('/v1/playouts')", - "errors": [] - }, - { - "method": "GET", - "path": "/v1/playouts/{identity}", - "router": "app", - "prefix_resolved": true, - "name": "get_playout", - "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 194, - "doc": "", - "decorator": "app.get('/v1/playouts/{identity}')", - "errors": [ - "HTTPException(404, 'Playout not found')" - ] - }, - { - "method": "GET", - "path": "/v1/on-air", - "router": "app", - "prefix_resolved": true, - "name": "on_air", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 203, - "doc": "", - "decorator": "app.get('/v1/on-air')", - "errors": [] - }, - { - "method": "POST", - "path": "/v1/on-air/live", - "router": "app", - "prefix_resolved": true, - "name": "live_override", - "signature": "data: LiveOverrideRequest, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 215, - "doc": "Put a configured live input on air, in place of the scheduled program.", - "decorator": "app.post('/v1/on-air/live', status_code=202)", - "errors": [ - "HTTPException(422, 'Configured live input not found')" - ] - }, - { - "method": "POST", - "path": "/v1/on-air/return-to-schedule", - "router": "app", - "prefix_resolved": true, - "name": "return_to_schedule", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 232, - "doc": "", - "decorator": "app.post('/v1/on-air/return-to-schedule', status_code=202)", - "errors": [] - }, - { - "method": "POST", - "path": "/v1/playouts/{identity}/approve", - "router": "app", - "prefix_resolved": true, - "name": "approve", - "signature": "identity: UUID, data: ApprovalRequest, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 243, - "doc": "", - "decorator": "app.post('/v1/playouts/{identity}/approve', status_code=202)", - "errors": [ - "HTTPException(409, 'Only a rendered playout can be approved for public playback')" - ] - }, - { - "method": "POST", - "path": "/v1/playouts/{identity}/publish", - "router": "app", - "prefix_resolved": true, - "name": "publish", - "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 256, - "doc": "", - "decorator": "app.post('/v1/playouts/{identity}/publish', status_code=202)", - "errors": [ - "HTTPException(404, 'Playout not found')", - "HTTPException(409, 'Explicit staff approval is required before public playback')" - ] - }, - { - "method": "GET", - "path": "/v1/public/playback/{identity}", - "router": "app", - "prefix_resolved": true, - "name": "public_playback", - "signature": "identity: UUID", - "returns": "", - "line": 285, - "doc": "", - "decorator": "app.get('/v1/public/playback/{identity}')", - "errors": [ - "HTTPException(404, 'Playback not found')", - "HTTPException(409, 'Playback integrity failure')" - ] - }, - { - "method": "GET", - "path": "/v1/public/playback/{identity}/captions", - "router": "app", - "prefix_resolved": true, - "name": "public_captions", - "signature": "identity: UUID", - "returns": "", - "line": 301, - "doc": "", - "decorator": "app.get('/v1/public/playback/{identity}/captions')", - "errors": [ - "HTTPException(404, 'Captions not found')", - "HTTPException(409, 'Caption integrity failure')" - ] - }, - { - "method": "GET", - "path": "/v1/public/playback/{identity}/program", - "router": "app", - "prefix_resolved": true, - "name": "public_program", - "signature": "identity: UUID", - "returns": "", - "line": 315, - "doc": "", - "decorator": "app.get('/v1/public/playback/{identity}/program')", - "errors": [ - "HTTPException(404, 'Playback not found')", - "HTTPException(409, 'Playback integrity failure')" - ] - } - ], - "models": [ - { - "name": "ScheduleRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "meeting_id", - "type": "UUID", - "default": "" - }, - { - "name": "agenda_ids", - "type": "list[UUID]", - "default": "Field(default_factory=list, max_length=100)" - }, - { - "name": "source_file", - "type": "str | None", - "default": "Field(default=None, pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}$')" - }, - { - "name": "live_source_id", - "type": "str | None", - "default": "Field(default=None, pattern='^[A-Za-z0-9_-]{1,64}$')" - }, - { - "name": "captions_file", - "type": "str | None", - "default": "Field(default=None, pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}\\\\.srt$')" - }, - { - "name": "start_at", - "type": "datetime", - "default": "" - }, - { - "name": "idempotency_key", - "type": "str", - "default": "Field(min_length=1, max_length=100)" - } - ], - "line": 58, - "doc": "" - }, - { - "name": "PlayoutRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "recording_id", - "type": "UUID", - "default": "" - }, - { - "name": "mode", - "type": "str", - "default": "Field(pattern='^(dry-run|commit)$')" - }, - { - "name": "idempotency_key", - "type": "str", - "default": "Field(min_length=1, max_length=100)" - } - ], - "line": 69, - "doc": "" - }, - { - "name": "ApprovalRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "note", - "type": "str", - "default": "Field(min_length=3, max_length=500)" - } - ], - "line": 76, - "doc": "" - }, - { - "name": "LiveOverrideRequest", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "live_source_id", - "type": "str", - "default": "Field(pattern='^[A-Za-z0-9_-]{1,64}$')" - }, - { - "name": "reason", - "type": "str", - "default": "Field(min_length=3, max_length=200)" - } - ], - "line": 81, - "doc": "An on-air override naming an administrator-configured live input." - } - ], + "source": "desktop/src/records/controller.ts", + "sha256": "f57adefbdb21a06a96b818b043f9be7e1d52d081738085bae1d95f9172efebb9", + "bytes": 3420, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/operator.py", - "sha256": "6471894a1240b611a2bf006867ce79848630f6dc69270e29e54b71dbb26f3837", - "routes": [ - { - "method": "POST", - "path": "/v1/operator-ticket", - "router": "app", - "prefix_resolved": true, - "name": "issue", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 51, - "doc": "", - "decorator": "app.post('/v1/operator-ticket')", - "errors": [ - "HTTPException(429, 'Too many outstanding operator launches')" - ] - }, - { - "method": "POST", - "path": "/operator/session", - "router": "app", - "prefix_resolved": true, - "name": "exchange", - "signature": "data: Ticket, request: Request", - "returns": "", - "line": 60, - "doc": "", - "decorator": "app.post('/operator/session')", - "errors": [ - "HTTPException(401, 'Launch link expired or already used; reopen Station from the signed-in staff session')", - "HTTPException(429, 'Operator session capacity reached')" - ] - }, - { - "method": "POST", - "path": "/operator/logout", - "router": "app", - "prefix_resolved": true, - "name": "logout", - "signature": "request: Request", - "returns": "", - "line": 75, - "doc": "", - "decorator": "app.post('/operator/logout')", - "errors": [] - }, - { - "method": "GET", - "path": "/operator/catalog", - "router": "app", - "prefix_resolved": true, - "name": "catalog", - "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 82, - "doc": "", - "decorator": "app.get('/operator/catalog')", - "errors": [] - }, - { - "method": "GET", - "path": "/operator/meeting/{identity}", - "router": "app", - "prefix_resolved": true, - "name": "meeting", - "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 102, - "doc": "", - "decorator": "app.get('/operator/meeting/{identity}')", - "errors": [] - }, - { - "method": "POST", - "path": "/operator/handoff", - "router": "app", - "prefix_resolved": true, - "name": "handoff", - "signature": "data: Handoff, proof: str | None=Header(default=None, alias='X-Townlight-Session')", - "returns": "", - "line": 106, - "doc": "", - "decorator": "app.post('/operator/handoff')", - "errors": [ - "HTTPException(result.status_code if result.status_code in (401, 403, 404, 409, 422) else 503, 'Records did not accept the recording. Check your Records role and request, then retry.')", - "HTTPException(503, 'Records unavailable. Retry safely; existing attachments are preserved.')" - ] - }, - { - "method": "GET", - "path": "/", - "router": "app", - "prefix_resolved": true, - "name": "page", - "signature": "", - "returns": "", - "line": 124, - "doc": "", - "decorator": "app.get('/')", - "errors": [] - }, - { - "method": "GET", - "path": "/operator.js", - "router": "app", - "prefix_resolved": true, - "name": "script", - "signature": "", - "returns": "", - "line": 128, - "doc": "", - "decorator": "app.get('/operator.js')", - "errors": [] - }, - { - "method": "GET", - "path": "/operator.css", - "router": "app", - "prefix_resolved": true, - "name": "style", - "signature": "", - "returns": "", - "line": 132, - "doc": "", - "decorator": "app.get('/operator.css')", - "errors": [] - } - ], - "models": [ - { - "name": "Ticket", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "ticket", - "type": "str", - "default": "Field(min_length=32, max_length=128)" - } - ], - "line": 13, - "doc": "" - }, - { - "name": "Handoff", - "bases": [ - "BaseModel" - ], - "fields": [ - { - "name": "request_id", - "type": "UUID", - "default": "" - }, - { - "name": "recording_id", - "type": "UUID", - "default": "" - }, - { - "name": "expected_sha256", - "type": "str", - "default": "Field(pattern='^[0-9a-f]{64}$')" - } - ], - "line": 18, - "doc": "" - } - ], + "source": "desktop/src/records/meetings-sources.ts", + "sha256": "ba5be1b8f0c1854ec777a69e7f5e307785f34d4a929179eabbcea6cf09712c6f", + "bytes": 3211, + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "desktop/src/records/planning-sources.ts", + "sha256": "98217a4d2c88068c036e9c9d5c2ba8e89f47fc74cc8054e3d4230c421199cbad", + "bytes": 3383, + "routes": [], + "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/packaging.py", - "sha256": "e4b1cbdfaab908f44d8acafb0e024fa99439a66eaedfaeb2655a63293b626e82", + "source": "desktop/src/records/view.js", + "sha256": "78b60d7322fffa44e77e9431ed194fae3470fc0210f81801aa2961c186b73db1", + "bytes": 26073, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/store.py", - "sha256": "d9aca0003057897a435c7c310559620f727a1703d625bd87af5c7c505d7e3fbd", + "source": "desktop/src/records/zoning-sources.ts", + "sha256": "333ba5a17c34e45627b04b185e4259a128cb624b2842943be770aa1db323064c", + "bytes": 3340, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/vod_job.py", - "sha256": "dfb3669fa0331fdb481cf765825e67cdf8432ed8c40eff9b5f2b7b34f42648f8", + "source": "desktop/src/styles.css", + "sha256": "9e3baf03bb8bc258d3fd4548ba0d1fdab73edde1fc30f20bf055675ee6b7ee99", + "bytes": 19655, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/windows_service.py", - "sha256": "ed2c3b73b8033413b2d28700a686ee6f71f01db11b3d95c4a2d2109d340c782f", + "source": "desktop/src/zoning/client.ts", + "sha256": "aac2300bcc8ca6be214937da2905b03e65cecd4ae671a35052ec0f2e59f8b9ee", + "bytes": 5810, "routes": [], "models": [], "configuration": [] }, { - "source": "installed-owned-source/townlight_station/worker.py", - "sha256": "f026f53950f3e7dc881831ad1c15818caf5fed27cb2f01fd3ebb0992121be2a1", + "source": "desktop/src/zoning/view.js", + "sha256": "3548b0755bde1ec2db0396e03f4f56f5b3dfa679fa25da7f1473844cfa4a5b4d", + "bytes": 11823, "routes": [], "models": [], "configuration": [] } - ], - "bridge": [] + ] } } -} \ No newline at end of file +} diff --git a/docs/beta-1/versions.html b/docs/beta-1/versions.html index b34162d..04ad542 100644 --- a/docs/beta-1/versions.html +++ b/docs/beta-1/versions.html @@ -1,5 +1,6 @@ -Versions -and Candidate Identity | Townlight Beta 1
    townlightTownlight Beta 1
    -
    Townlight Beta 1

    Versions -and Candidate -Identity

    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

    Candidate identity

    + + +

    Component versions

    +

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

    ---- - - + + + - - - - - - + + + - - + + + - - + + + - - + + + - - + + + - - - - -
    IdentityValueProductDistributionCandidate version
    Public documentation identityTownlight Beta 1
    Installer version1.6.0.1Townlight Coretownlight-core1.3.0.dev2
    Native desktop source version1.6.0-1Townlight Recordstownlight-records1.8.0.dev2
    Candidate MSI SHA25698bcdef11ebdf5c767f620c904ff49f85115fde3b5c23f62703b111e645aaf86Townlight Meetingstownlight-meetings1.0.5
    Corresponding-source SHA25684a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06bTownlight Codetownlight-code1.0.9
    Current owned software licenseAGPL-3.0-onlyTownlight Accesstownlight-access0.5.0
    Supported acceptance profileWindows x64 fresh install; inspections-preview; separate Station -configuration
    -

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

    -

    Existing component versions

    - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
    ProductPackageVersion
    Coreciviccore1.3.0.dev1
    Recordscivicrecords-ai1.8.0.dev1
    Meetingscivicclerk1.0.4Townlight Noticetownlight-notice0.3.0
    Codeciviccode1.0.8Townlight Zoningtownlight-zoning0.2.3
    Zoningciviczone0.2.2Townlight Planningtownlight-planning0.4.0.dev2
    Planningcivicplan0.4.0.dev1Townlight Permittingtownlight-permitting0.3.0+dev.2
    Permittingcivicpermit0.3.0+dev.1Townlight Inspectionstownlight-inspections0.3.0+dev.2
    Inspectionscivicinspect0.3.0+dev.1Townlight Stationtownlight-station0.3.0
    Stationtownlight-station0.3.0Runtimetownlight-runtime0.2.0
    -

    Versioning policy

    -

    Use Townlight Beta 1 as the coordinated documentation label. Keep -existing package, binary and installer versions. Advance technical -versions only with an actual software change and its packaging decision. -Never rewrite historical receipts to make their versions match a display -label.

    - \ No newline at end of file +

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

    +

    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 diff --git a/docs/catalog-beta.md b/docs/catalog-beta.md index 9e7e0d1..b0440ad 100644 --- a/docs/catalog-beta.md +++ b/docs/catalog-beta.md @@ -1,9 +1,9 @@ # Shared systems catalog candidate -`civiccore.catalog` provides async `domains(session)`, `system_catalog(session, domain=None)`, `connectors_for(session, domain)` and `import_catalog(session, payload, actor_id=...)`. The caller supplies its authenticated SQLAlchemy session and commits or rolls back. Core does not authenticate arbitrary callers or make vendor connections. +`townlight_core.catalog` provides async `domains(session)`, `system_catalog(session, domain=None)`, `connectors_for(session, domain)` and `import_catalog(session, payload, actor_id=...)`. The caller supplies its authenticated SQLAlchemy session and commits or rolls back. Core does not authenticate arbitrary callers or make vendor connections. -Apply Core migrations before using the new candidate. Existing `system_catalog`/`connector_templates` tables retain their data and shape. The new `civiccore_catalog_imports` ledger records complete imports and their SHA-256, actor, count and time. Reusing a version with changed or incomplete contents raises `ValueError`; nothing is silently replaced. Unknown domains return empty results. Connector templates are distinguished from commissioned connections. +Apply Core migrations before using the new candidate. Existing `system_catalog`/`connector_templates` tables retain their data and shape. The new `townlight_core_catalog_imports` ledger records complete imports and their SHA-256, actor, count and time. Reusing a version with changed or incomplete contents raises `ValueError`; nothing is silently replaced. Unknown domains return empty results. Connector templates are distinguished from commissioned connections. Records' catalog routes and loader delegate to this contract, retaining staff/admin authorization. The reference catalog is shared non-secret product metadata; it does not contain municipal documents or serve as an authorization filter for search. Department-bound search remains another C1 requirement. -The current systems listing retains historical versions to preserve the existing Records API behavior. A version-selection UI, city-specific commissioning and general catalog administration remain outstanding. Installed-module inventory and recommendations are a separate contract in `civiccore.platform.inventory`—see [module-inventory.md](module-inventory.md) and [ADR-0008](adr/ADR-0008-beta-module-inventory.md)—and are deliberately not derived from catalog rows: reference data about vendor systems is not evidence that a module is installed. The broader `civiccore.catalog` promise is therefore not yet complete. +The current systems listing retains historical versions to preserve the existing Records API behavior. A version-selection UI, city-specific commissioning and general catalog administration remain outstanding. Installed-module inventory and recommendations are a separate contract in `townlight_core.platform.inventory`—see [module-inventory.md](module-inventory.md) and [ADR-0008](adr/ADR-0008-beta-module-inventory.md)—and are deliberately not derived from catalog rows: reference data about vendor systems is not evidence that a module is installed. The broader `townlight_core.catalog` promise is therefore not yet complete. diff --git a/docs/department-authority.md b/docs/department-authority.md index 537f18b..5f5a65b 100644 --- a/docs/department-authority.md +++ b/docs/department-authority.md @@ -1,6 +1,6 @@ # Department-scoped shared authority -`civiccore.auth.department_scope` is Core's single authorization contract for department-scoped +`townlight_core.auth.department_scope` is Core's single authorization contract for department-scoped material. It answers one question for every consumer: *may this already-authenticated subject reach this department in this deployment scope, and with which roles?* Search results and snippets, export bundles and model context all pass through the same object, so there is no @@ -13,7 +13,7 @@ search service (see [What this does not do](#what-this-does-not-do)). ## The trust boundary The only admissible source of a department claim is the persisted, server-side grant ledger -`civiccore_department_grant_events`, read through `active_department_grants` and keyed by +`townlight_core_department_grant_events`, read through `active_department_grants` and keyed by `(scope_id, subject, department_id)`. A department named in a request body, query string, cookie, HTTP header, environment variable, @@ -22,13 +22,13 @@ parameter that accepts one, and `DepartmentAuthority` cannot be constructed with resolver's private provenance token: ```python -from civiccore.auth import DepartmentAuthority +from townlight_core.auth import DepartmentAuthority DepartmentAuthority(...) # AuthorityProvenanceError: caller-supplied claims are not authority ``` -Credential verification stays where it already lives: `civiccore.auth.bearer`, -`civiccore.auth.trusted_headers` (with `enforce_trusted_proxy_source` proving the proxy really -is the proxy), `civiccore.auth.staff_key` and `civiccore.auth.suite_session`. This module only +Credential verification stays where it already lives: `townlight_core.auth.bearer`, +`townlight_core.auth.trusted_headers` (with `enforce_trusted_proxy_source` proving the proxy really +is the proxy), `townlight_core.auth.staff_key` and `townlight_core.auth.suite_session`. This module only consumes the `AuthenticatedPrincipal` those helpers return, and only for the four identity sources in `TRUSTED_AUTH_METHODS`. @@ -85,11 +85,11 @@ erase the authority history that allowed earlier access. Reusing the shipped helpers rather than adding new engines: - `scope_search_results(authority, records, department_for=...)` — drops results before snippets - or facets are built. Internally uses `civiccore.search.roles_grant_access`. + or facets are built. Internally uses `townlight_core.search.roles_grant_access`. - `authorize_export(authority, department_id=..., purpose=...)` — the gate a static export bundle - must pass before `civiccore.exports` writes anything. + must pass before `townlight_core.exports` writes anything. - `scope_model_context_chunks(authority, chunks, department_for=...)` — returns the exact - `chunks` list `civiccore.llm.context.assemble_context` accepts, so there is one context + `chunks` list `townlight_core.llm.context.assemble_context` accepts, so there is one context builder and one permission gate in front of it. ## What this does not do @@ -110,7 +110,7 @@ Reusing the shipped helpers rather than adding new engines: Contract tests (no database): `tests/test_department_authority.py`. Real PostgreSQL: `work/beta-foundations/core-authority-01/harness.py` starts one disposable owned -cluster, applies the real Core chain to head `civiccore_0008_authority`, and asserts nine checks +cluster, applies the real Core chain to head `townlight_core_0008_authority`, and asserts nine checks covering deny-by-default on real rows, idempotent attributed grants, two-department isolation of results/snippets/exports, immediate revocation with retained history, scope isolation, database append-only/CHECK guards, concurrent sequence assignment, and restart survival. @@ -118,4 +118,4 @@ append-only/CHECK guards, concurrent sequence assignment, and restart survival. ## Compatibility Purely additive: no existing table, function or export changed meaning. The pre-existing public -symbols of `civiccore.auth` remain exported, and the new names are added alongside them. +symbols of `townlight_core.auth` remain exported, and the new names are added alongside them. diff --git a/docs/diagrams/civiccore-extraction-map.svg b/docs/diagrams/civiccore-extraction-map.svg deleted file mode 100644 index a5c10c9..0000000 --- a/docs/diagrams/civiccore-extraction-map.svg +++ /dev/null @@ -1 +0,0 @@ -

    Planned extraction targets — placeholder __init__.py only, no implementation

    civiccore.auth

    civiccore.audit

    civiccore.catalog

    civiccore.connectors

    civiccore.exemptions

    civiccore.ingest

    civiccore.notifications

    civiccore.onboarding

    civiccore.scaffold

    civiccore.search

    civiccore.verification

    civiccore v1.2.0 - shipped core surface

    civiccore.migrations
    runner + idempotent guards
    civiccore_0001_baseline_v1
    civiccore_0002_llm
    civiccore_0003_local_task_queue

    civiccore.db.Base
    shared SQLAlchemy
    declarative base

    civiccore.llm
    providers + templates +
    registry + context +
    structured output

    \ No newline at end of file diff --git a/docs/diagrams/migration-order.svg b/docs/diagrams/migration-order.svg index b0be701..34ec9d2 100644 --- a/docs/diagrams/migration-order.svg +++ b/docs/diagrams/migration-order.svg @@ -1 +1 @@ -alembic_versionalembic_version_civiccoreciviccore.migrations.runner.upgrade_to_headConsumer app(records-ai env.py)alembic_versionalembic_version_civiccoreciviccore.migrations.runner.upgrade_to_headConsumer app(records-ai env.py)Two separate version tablesprevent revision-name collisionsbetween civiccore and consumers.upgrade_to_head() [subprocess]1civiccore_0001_baseline_v12civiccore_0002_llm (ALTER prompt_templates)3civiccore_0003_local_task_queue4stamp 'civiccore_0003_local_task_queue'5done6run consumer-side alembic chain7stamp '020_phase2_consumer_app_backfill'8 \ No newline at end of file +alembic_versionalembic_version_townlight_coretownlight_core.migrations.runner.upgrade_to_headConsumer app(records-ai env.py)alembic_versionalembic_version_townlight_coretownlight_core.migrations.runner.upgrade_to_headConsumer app(records-ai env.py)Two separate version tablesprevent revision-name collisionsbetween townlight_core and consumers.upgrade_to_head() [subprocess]1townlight_core_0001_baseline_v12townlight_core_0002_llm (ALTER prompt_templates)3townlight_core_0003_local_task_queue4stamp 'townlight_core_0003'5done6run consumer-side alembic chain7stamp '020_phase2_consumer_app_backfill'8 \ No newline at end of file diff --git a/docs/diagrams/provider-abstraction.svg b/docs/diagrams/provider-abstraction.svg index a8fae3a..f536ff3 100644 --- a/docs/diagrams/provider-abstraction.svg +++ b/docs/diagrams/provider-abstraction.svg @@ -1 +1 @@ -

    civiccore.llm.providers

    implements

    implements

    implements

    implements

    Consumer code
    (records-ai, future modules)

    LLMProvider ABC
    generate / embed /
    embed_batch / name /
    supports_images

    PROVIDER_REGISTRY
    + register_provider

    build_provider(name, config)

    OllamaConfig

    OpenAIConfig

    AnthropicConfig

    OllamaProvider
    local /api/generate

    OpenAIProvider
    cloud, optional extra

    AnthropicProvider
    cloud, optional extra

    Third-party
    @register_provider('custom')

    \ No newline at end of file +

    townlight_core.llm.providers

    implements

    implements

    implements

    implements

    Consumer code
    (records-ai, future modules)

    LLMProvider ABC
    generate / embed /
    embed_batch / name /
    supports_images

    PROVIDER_REGISTRY
    + register_provider

    build_provider(name, config)

    OllamaConfig

    OpenAIConfig

    AnthropicConfig

    OllamaProvider
    local /api/generate

    OpenAIProvider
    cloud, optional extra

    AnthropicProvider
    cloud, optional extra

    Third-party
    @register_provider('custom')

    \ No newline at end of file diff --git a/docs/diagrams/civiccore-extraction-map.mmd b/docs/diagrams/townlight_core-extraction-map.mmd similarity index 100% rename from docs/diagrams/civiccore-extraction-map.mmd rename to docs/diagrams/townlight_core-extraction-map.mmd diff --git a/docs/diagrams/civiccore-extraction-map.png b/docs/diagrams/townlight_core-extraction-map.png similarity index 100% rename from docs/diagrams/civiccore-extraction-map.png rename to docs/diagrams/townlight_core-extraction-map.png diff --git a/docs/diagrams/townlight_core-extraction-map.svg b/docs/diagrams/townlight_core-extraction-map.svg new file mode 100644 index 0000000..a8d89a2 --- /dev/null +++ b/docs/diagrams/townlight_core-extraction-map.svg @@ -0,0 +1 @@ +

    Planned extraction targets — placeholder __init__.py only, no implementation

    townlight_core.auth

    townlight_core.audit

    townlight_core.catalog

    townlight_core.connectors

    townlight_core.exemptions

    townlight_core.ingest

    townlight_core.notifications

    townlight_core.onboarding

    townlight_core.scaffold

    townlight_core.search

    townlight_core.verification

    townlight_core v1.2.0 - shipped core surface

    townlight_core.migrations
    runner + idempotent guards
    townlight_core_0001_baseline_v1
    townlight_core_0002_llm
    townlight_core_0003_local_task_queue

    townlight_core.db.Base
    shared SQLAlchemy
    declarative base

    townlight_core.llm
    providers + templates +
    registry + context +
    structured output

    \ No newline at end of file diff --git a/docs/github-discussions-seed.md b/docs/github-discussions-seed.md index 58c341f..da6cb7d 100644 --- a/docs/github-discussions-seed.md +++ b/docs/github-discussions-seed.md @@ -1,44 +1,44 @@ -# civiccore — GitHub Discussions seed posts +# townlight_core — GitHub Discussions seed posts Drafts for the initial Discussions categories on https://github.com/townlight/core/discussions. Edit inline before posting. --- -## Announcements: civiccore v0.2.0 released — Phase 2 LLM module +## Announcements: townlight_core v0.2.0 released — Phase 2 LLM module -civiccore v0.2.0 ships the LLM module: provider abstraction, prompt-template engine + 3-step override resolver, model registry service, context utilities, and structured-output helper. The full public API surface is importable from `civiccore.llm`. +townlight_core v0.2.0 ships the LLM module: provider abstraction, prompt-template engine + 3-step override resolver, model registry service, context utilities, and structured-output helper. The full public API surface is importable from `townlight_core.llm`. **What's new since v0.1.0:** -- `civiccore.llm.providers` — `LLMProvider` ABC, decorator registry, built-in Ollama/OpenAI/Anthropic + Pydantic config schemas + `build_provider` factory -- `civiccore.llm.templates` — string.Template engine, 3-step override resolver (DB override → app code override → civiccore default), `OVERRIDE_REGISTRY` -- `civiccore.llm.registry` — `ModelRegistry` ORM, async service, FastAPI admin router -- `civiccore.llm.context` — token-budget assembly, prompt-injection sanitization -- `civiccore.llm.structured` — Pydantic-validated output with retry-on-malformed -- Migration `civiccore_0002_llm` — `prompt_templates` schema evolution +- `townlight_core.llm.providers` — `LLMProvider` ABC, decorator registry, built-in Ollama/OpenAI/Anthropic + Pydantic config schemas + `build_provider` factory +- `townlight_core.llm.templates` — string.Template engine, 3-step override resolver (DB override → app code override → townlight_core default), `OVERRIDE_REGISTRY` +- `townlight_core.llm.registry` — `ModelRegistry` ORM, async service, FastAPI admin router +- `townlight_core.llm.context` — token-budget assembly, prompt-injection sanitization +- `townlight_core.llm.structured` — Pydantic-validated output with retry-on-malformed +- Migration `townlight_core_0002_llm` — `prompt_templates` schema evolution -**Install:** `pip install https://github.com/CivicSuite/civiccore/releases/download/v0.2.0/civiccore-0.2.0-py3-none-any.whl` +**Install:** `pip install https://github.com/Townlight/townlight_core/releases/download/v0.2.0/townlight_core-0.2.0-py3-none-any.whl` **Compatibility:** records-ai v1.4.0 consumes this release. --- -## Q&A: How do I use civiccore in a new module? +## Q&A: How do I use townlight_core in a new module? -Add the wheel pin to your `pyproject.toml` and consume the public API from `civiccore.llm`: +Add the wheel pin to your `pyproject.toml` and consume the public API from `townlight_core.llm`: ```toml dependencies = [ - "civiccore @ https://github.com/CivicSuite/civiccore/releases/download/v0.2.0/civiccore-0.2.0-py3-none-any.whl", + "townlight_core @ https://github.com/Townlight/townlight_core/releases/download/v0.2.0/townlight_core-0.2.0-py3-none-any.whl", ] ``` -Run civiccore migrations as part of your alembic chain (records-ai's `backend/alembic/env.py` shows the pattern: subprocess-invoke `civiccore.migrations.runner.upgrade_to_head()` before your own migrations run). +Run townlight_core migrations as part of your alembic chain (records-ai's `backend/alembic/env.py` shows the pattern: subprocess-invoke `townlight_core.migrations.runner.upgrade_to_head()` before your own migrations run). --- ## Dev / Architecture: Provider registry decorator pattern -`civiccore.llm.providers` uses an in-process decorator registry rather than setuptools entry-points. Trade-offs: +`townlight_core.llm.providers` uses an in-process decorator registry rather than setuptools entry-points. Trade-offs: - **For** decorator: zero startup cost, no packaging metadata complexity, simple to reason about - **Against** decorator: third-party providers require a consumer-side import to register @@ -48,30 +48,30 @@ ADR-0004 §6 has the full rationale. Discussion welcome on whether/when entry-po --- -## Ideas: Future civiccore modules +## Ideas: Future townlight_core modules -What modules belong in civiccore vs. in their own consumer repos? +What modules belong in townlight_core vs. in their own consumer repos? -Currently in civiccore: +Currently in townlight_core: - migrations runner + idempotency guards - shared declarative `Base` - `llm.{providers,templates,registry,context,structured}` -Likely candidates for future civiccore modules: +Likely candidates for future townlight_core modules: - shared notification / channel abstraction (multi-consumer relevance) -- shared connector framework (records-ai already has connectors; civicclerk will too) +- shared connector framework (records-ai already has connectors; townlight_meetings will too) -Likely **not** civiccore concerns: +Likely **not** townlight_core concerns: - domain-specific workflows (FOIA exemptions, meeting agendas) - consumer-specific frontends --- -## Compatibility: civicrecords-ai v1.4.0 pairing +## Compatibility: townlight_records v1.4.0 pairing -records-ai v1.4.0 (released 2026-04-25) is the first downstream release consuming civiccore v0.2.0. Compatibility statement: +records-ai v1.4.0 (released 2026-04-25) is the first downstream release consuming townlight_core v0.2.0. Compatibility statement: -| civiccore | civicrecords-ai | Status | +| townlight_core | townlight_records | Status | |---|---|---| | 0.2.0 | 1.4.0 | Supported | | 0.1.0 | 1.3.0 | Supported (Phase 1) | diff --git a/docs/history/pre-naming-2026-11/source-inventory.json b/docs/history/pre-naming-2026-11/source-inventory.json new file mode 100644 index 0000000..7b307de --- /dev/null +++ b/docs/history/pre-naming-2026-11/source-inventory.json @@ -0,0 +1,38440 @@ +{ + "candidate_source_sha256": "84a23e1297e42d17b16cfc9e51b2dd78bc46414c0de8ad7ebd2466c1a409d06b", + "basis": "Immutable corresponding source of signed candidate; AST extraction is not executed endpoint acceptance. Router mounts require runtime OpenAPI or source include_router context.", + "products": { + "core": { + "package": "townlight_core", + "source": [ + { + "source": "installed-owned-source/townlight_core/__init__.py", + "sha256": "22823aa2e5f34ff62c57276cc877fc52fb6c654877b5e3756d6dccdb40f7dc15", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/audit/__init__.py", + "sha256": "9066c9b752564f42427bb925f2ec72e92007f389fbec24b3bde90655cfb3c9d9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/audit/primitives.py", + "sha256": "293ba8cf2d89165bf50d1fb019c05a4a1e5a1ca22c3703be25f6c96014491d3a", + "routes": [], + "models": [ + { + "name": "AuditActor", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "actor_id", + "type": "str", + "default": "" + }, + { + "name": "actor_type", + "type": "str", + "default": "" + }, + { + "name": "display_name", + "type": "str | None", + "default": "None" + } + ], + "line": 55, + "doc": "Actor that initiated an auditable action." + }, + { + "name": "AuditSubject", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "subject_id", + "type": "str", + "default": "" + }, + { + "name": "subject_type", + "type": "str", + "default": "" + }, + { + "name": "display_name", + "type": "str | None", + "default": "None" + } + ], + "line": 65, + "doc": "Record, document, workflow, or other entity affected by an action." + }, + { + "name": "AuditEvent", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "event_id", + "type": "str", + "default": "Field(default_factory=lambda: str(uuid4()))" + }, + { + "name": "actor", + "type": "AuditActor", + "default": "" + }, + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "subject", + "type": "AuditSubject", + "default": "" + }, + { + "name": "source_module", + "type": "str", + "default": "" + }, + { + "name": "timestamp", + "type": "datetime", + "default": "Field(default_factory=_utc_now)" + }, + { + "name": "metadata", + "type": "dict[str, Any]", + "default": "Field(default_factory=dict)" + }, + { + "name": "previous_hash", + "type": "str | None", + "default": "None" + }, + { + "name": "current_hash", + "type": "str | None", + "default": "None" + } + ], + "line": 75, + "doc": "One audit event with deterministic hash-chain fields." + }, + { + "name": "AuditHashChain", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "events", + "type": "list[AuditEvent]", + "default": "Field(default_factory=list)" + } + ], + "line": 159, + "doc": "In-memory helper for building and verifying hash-chained events." + }, + { + "name": "PersistedAuditLogEntry", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "previous_hash", + "type": "str", + "default": "Field(default=ZERO_HASH, min_length=64, max_length=64)" + }, + { + "name": "entry_hash", + "type": "str", + "default": "Field(min_length=64, max_length=64)" + }, + { + "name": "timestamp", + "type": "datetime | str", + "default": "" + }, + { + "name": "actor_id", + "type": "str | None", + "default": "None" + }, + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "details", + "type": "dict[str, Any] | None", + "default": "None" + }, + { + "name": "entry_id", + "type": "int | str | None", + "default": "None" + } + ], + "line": 192, + "doc": "Storage-neutral view of a legacy persisted audit-log row.\n\nThis model preserves the historical Townlight Records hash formula for\ndatabase-backed ``audit_log`` rows. It intentionally lives beside, rather\nthan replacing, ``AuditEvent`` because existing deployed rows must continue\nto verify after modules move their reusable audit math into Townlight Core." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/auth/__init__.py", + "sha256": "7a3f307c6fc4ac465688b2ad83b49b85d551721d248e569d0acbb8bf0db49f5a", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/auth/bearer.py", + "sha256": "6515b07ecf4be9fc344ab05eeef891b165f3e0310387dfa3a59fc2531c5dacb9", + "routes": [], + "models": [ + { + "name": "AuthenticatedPrincipal", + "bases": [], + "fields": [ + { + "name": "token_fingerprint", + "type": "str | None", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "auth_method", + "type": "str", + "default": "'bearer'" + }, + { + "name": "subject", + "type": "str | None", + "default": "None" + }, + { + "name": "provider", + "type": "str | None", + "default": "None" + } + ], + "line": 16, + "doc": "Represents the caller that satisfied a bearer-token role check." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/auth/department_scope.py", + "sha256": "57905c13074c10acdf07f7a353634bf3e51b1f42f67cd6f7b3d8920dca91f7d1", + "routes": [], + "models": [ + { + "name": "DepartmentGrant", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "scope_id", + "type": "str", + "default": "Field(min_length=2, max_length=64)" + }, + { + "name": "subject", + "type": "str", + "default": "Field(min_length=1, max_length=320)" + }, + { + "name": "department_id", + "type": "UUID", + "default": "" + }, + { + "name": "sequence", + "type": "int", + "default": "Field(ge=1)" + }, + { + "name": "action", + "type": "GrantAction", + "default": "" + }, + { + "name": "roles", + "type": "tuple[str, ...]", + "default": "()" + }, + { + "name": "recorded_by", + "type": "str", + "default": "Field(min_length=1, max_length=128)" + }, + { + "name": "recorded_at", + "type": "AwareDatetime", + "default": "" + }, + { + "name": "content_sha256", + "type": "str", + "default": "Field(min_length=64, max_length=64)" + } + ], + "line": 148, + "doc": "One persisted grant/revoke event for a subject in one scope and department.\n\nRows are append-only: a ``revoke`` event does not delete the earlier ``grant`` event, it\nsupersedes it. ``sequence`` is monotonic per ``(scope_id, subject, department_id)`` so the\nactive state is always the highest-sequence event." + }, + { + "name": "DepartmentEntitlement", + "bases": [], + "fields": [ + { + "name": "department_id", + "type": "UUID", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "granted_by", + "type": "str", + "default": "" + }, + { + "name": "granted_at", + "type": "datetime", + "default": "" + } + ], + "line": 210, + "doc": "A department this subject may reach, with the roles granted there." + }, + { + "name": "DepartmentAuthority", + "bases": [], + "fields": [ + { + "name": "scope_id", + "type": "str", + "default": "" + }, + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "auth_method", + "type": "str", + "default": "" + }, + { + "name": "provider", + "type": "str | None", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "entitlements", + "type": "tuple[DepartmentEntitlement, ...]", + "default": "" + }, + { + "name": "resolved_at", + "type": "datetime", + "default": "" + }, + { + "name": "grants_digest", + "type": "str", + "default": "" + }, + { + "name": "provenance", + "type": "Literal['persisted-grant']", + "default": "'persisted-grant'" + }, + { + "name": "_token", + "type": "Any", + "default": "field(default=None, repr=False, compare=False)" + } + ], + "line": 220, + "doc": "The only object Core consumers may use to scope search, exports and model context.\n\nInstances are produced by :func:`resolve_department_authority`. Direct construction raises\n:class:`AuthorityProvenanceError`, because a hand-built authority would be exactly the\n\"trust the caller's department claim\" hole this contract exists to close." + }, + { + "name": "GrantOutcome", + "bases": [], + "fields": [ + { + "name": "grant", + "type": "DepartmentGrant", + "default": "" + }, + { + "name": "inserted", + "type": "bool", + "default": "" + } + ], + "line": 437, + "doc": "Result of an append attempt. ``inserted`` is False for an exact repeat." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/auth/staff_key.py", + "sha256": "ef7dc371bcd7f419d6266cc61aad01884f263edbcca5db7d5ba4dc1e91d251db", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/auth/suite_session.py", + "sha256": "e33e13634568261accb2ba6706402de013975f3c58117b987cced3cd92c0db2e", + "routes": [], + "models": [ + { + "name": "SuiteSessionPrincipal", + "bases": [], + "fields": [ + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "session_id", + "type": "str", + "default": "" + } + ], + "line": 35, + "doc": "Immutable principal decoded from a shared Townlight staff session." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/auth/trusted_headers.py", + "sha256": "771e7cbf1f5d73dafad082d97ebb6e350a49b15362ce50eb36b261172e3b9c5c", + "routes": [], + "models": [ + { + "name": "TrustedHeaderAuthConfig", + "bases": [], + "fields": [ + { + "name": "provider_name", + "type": "str", + "default": "" + }, + { + "name": "principal_header_name", + "type": "str", + "default": "" + }, + { + "name": "roles_header_name", + "type": "str", + "default": "" + }, + { + "name": "trusted_proxy_cidrs", + "type": "tuple[str, ...]", + "default": "" + } + ], + "line": 17, + "doc": "Service-specific trusted-header auth settings loaded from env/defaults." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/catalog/__init__.py", + "sha256": "e323a7808ae719b4b90530c238dc945a107ee1cf9a9050cb00d7efbf5aa1a823", + "routes": [], + "models": [ + { + "name": "SystemInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "vendor_name", + "type": "str", + "default": "Field(min_length=1, max_length=200)" + }, + { + "name": "access_protocol", + "type": "str", + "default": "Field(min_length=1, max_length=50)" + }, + { + "name": "data_shape", + "type": "str", + "default": "Field(min_length=1, max_length=50)" + }, + { + "name": "common_record_types", + "type": "list[str]", + "default": "Field(max_length=100)" + }, + { + "name": "redaction_tier", + "type": "int", + "default": "Field(ge=1, le=3)" + }, + { + "name": "discovery_hints", + "type": "dict", + "default": "Field(default_factory=dict)" + } + ], + "line": 16, + "doc": "" + }, + { + "name": "DomainInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "domain", + "type": "str", + "default": "Field(min_length=1, max_length=100)" + }, + { + "name": "systems", + "type": "list[SystemInput]", + "default": "Field(max_length=500)" + } + ], + "line": 38, + "doc": "" + }, + { + "name": "CatalogInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "catalog_version", + "type": "str", + "default": "Field(min_length=1, max_length=20)" + }, + { + "name": "domains", + "type": "list[DomainInput]", + "default": "Field(max_length=100)" + } + ], + "line": 44, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/city_profile/__init__.py", + "sha256": "c22e26dac2fcb454cbf91bcbf23311fdef9bf854fbb2bba2d76149945986bd72", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/city_profile/models.py", + "sha256": "e34b6bbc69f44656ad22217de2b911b5c437fb226b594439f935705c95a47ed6", + "routes": [], + "models": [ + { + "name": "DepartmentProfile", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "slug", + "type": "str", + "default": "Field(min_length=1, pattern='^[a-z0-9][a-z0-9-]*$')" + }, + { + "name": "public_email", + "type": "str | None", + "default": "Field(default=None, min_length=3)" + }, + { + "name": "public_phone", + "type": "str | None", + "default": "Field(default=None, min_length=3)" + } + ], + "line": 16, + "doc": "A city department surfaced during local onboarding." + }, + { + "name": "DeploymentProfile", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "mode", + "type": "Literal['local_demo', 'local', 'self_hosted']", + "default": "'local_demo'" + }, + { + "name": "allow_outbound_services", + "type": "bool", + "default": "False" + } + ], + "line": 27, + "doc": "Deployment posture for a profile without acting as an installer." + }, + { + "name": "ModuleEnablement", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "Field(min_length=1, pattern='^[a-z0-9][a-z0-9_-]*$')" + }, + { + "name": "enabled", + "type": "bool", + "default": "True" + }, + { + "name": "settings", + "type": "dict[str, Any]", + "default": "Field(default_factory=dict)" + } + ], + "line": 36, + "doc": "Per-module enablement flags and local configuration metadata." + }, + { + "name": "CityProfile", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "city_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "timezone", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "departments", + "type": "list[DepartmentProfile]", + "default": "Field(default_factory=list)" + }, + { + "name": "enabled_modules", + "type": "list[ModuleEnablement]", + "default": "Field(default_factory=list)" + }, + { + "name": "default_llm_provider", + "type": "str", + "default": "'ollama'" + }, + { + "name": "file_drop_roots", + "type": "list[Path]", + "default": "Field(default_factory=list)" + }, + { + "name": "public_contact", + "type": "dict[str, str]", + "default": "Field(default_factory=dict)" + }, + { + "name": "deployment", + "type": "DeploymentProfile", + "default": "Field(default_factory=DeploymentProfile)" + } + ], + "line": 46, + "doc": "Local city profile loaded from trusted JSON/YAML configuration." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/connectors/__init__.py", + "sha256": "92d5a39aa8241f8fed6405fd0a8b3068994fdeb66ea3f80975ff708dde673870", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/connectors/delta.py", + "sha256": "d99e5624e0eebcc434146909d65040eba0023cc84b2d5d03ce1de2b36c70e52f", + "routes": [], + "models": [ + { + "name": "VendorDeltaRequestPlan", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "request_url", + "type": "str", + "default": "" + }, + { + "name": "delta_enabled", + "type": "bool", + "default": "" + }, + { + "name": "cursor_param", + "type": "str | None", + "default": "" + }, + { + "name": "cursor_value", + "type": "str | None", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 19, + "doc": "Storage-neutral plan for a full or cursor-based vendor pull." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/connectors/imports.py", + "sha256": "1ed6dafe0072eb57327e7d61b12df801f79bfb9ea7ea1738548afb5a002e0606", + "routes": [], + "models": [ + { + "name": "ConnectorImportError", + "bases": [ + "ValueError" + ], + "fields": [ + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 13, + "doc": "Actionable validation error for local connector import payloads." + }, + { + "name": "ImportedAgendaItem", + "bases": [], + "fields": [ + { + "name": "external_item_id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "department", + "type": "str | None", + "default": "" + }, + { + "name": "connector", + "type": "str", + "default": "" + } + ], + "line": 27, + "doc": "Normalized agenda item imported from a local connector payload." + }, + { + "name": "ImportedMeeting", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "external_meeting_id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "scheduled_start", + "type": "str", + "default": "" + }, + { + "name": "agenda_items", + "type": "tuple[ImportedAgendaItem, ...]", + "default": "" + } + ], + "line": 49, + "doc": "Normalized meeting imported from a local connector payload." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/connectors/manifest.py", + "sha256": "15caa167acce428facdf7683085d47dd4a01b02cc2d05df25d6aa1d157bb79bd", + "routes": [], + "models": [ + { + "name": "ManifestFile", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "path", + "type": "str", + "default": "" + }, + { + "name": "byte_size", + "type": "int", + "default": "Field(ge=0)" + }, + { + "name": "sha256", + "type": "str", + "default": "" + }, + { + "name": "media_type", + "type": "str | None", + "default": "None" + }, + { + "name": "description", + "type": "str | None", + "default": "None" + } + ], + "line": 43, + "doc": "A file entry recorded in an import or export manifest." + }, + { + "name": "_ManifestBase", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "manifest_version", + "type": "str", + "default": "'1.0'" + }, + { + "name": "module_name", + "type": "str", + "default": "" + }, + { + "name": "module_version", + "type": "str", + "default": "" + }, + { + "name": "townlight_core_version", + "type": "str", + "default": "" + }, + { + "name": "purpose", + "type": "ManifestPurpose", + "default": "" + }, + { + "name": "source_files", + "type": "list[ManifestFile]", + "default": "Field(default_factory=list)" + }, + { + "name": "generated_files", + "type": "list[ManifestFile]", + "default": "Field(default_factory=list)" + }, + { + "name": "limitations", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 79, + "doc": "" + }, + { + "name": "ImportManifest", + "bases": [ + "_ManifestBase" + ], + "fields": [ + { + "name": "purpose", + "type": "ImportPurpose", + "default": "" + } + ], + "line": 123, + "doc": "Manifest for offline file-drop, CSV, or GeoJSON imports." + }, + { + "name": "ExportManifest", + "bases": [ + "_ManifestBase" + ], + "fields": [ + { + "name": "purpose", + "type": "ExportPurpose", + "default": "'static_export_bundle'" + } + ], + "line": 135, + "doc": "Manifest for an offline static export bundle." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/connectors/sync.py", + "sha256": "ef8bb329bf9d385fd96c617e58a8495989dd76a5d641e0afae3fcf3cba2ca503", + "routes": [], + "models": [ + { + "name": "SyncRetryPolicy", + "bases": [], + "fields": [ + { + "name": "max_attempts", + "type": "int", + "default": "3" + }, + { + "name": "base_delay_seconds", + "type": "float", + "default": "1.0" + }, + { + "name": "jitter_factor", + "type": "float", + "default": "0.2" + }, + { + "name": "max_backoff_seconds", + "type": "float", + "default": "30.0" + }, + { + "name": "retry_after_cap_seconds", + "type": "float", + "default": "600.0" + } + ], + "line": 28, + "doc": "HTTP retry policy for live vendor connector calls." + }, + { + "name": "SyncCircuitPolicy", + "bases": [], + "fields": [ + { + "name": "full_failure_threshold", + "type": "int", + "default": "5" + }, + { + "name": "grace_period_failure_threshold", + "type": "int", + "default": "2" + }, + { + "name": "grace_period_reason", + "type": "str", + "default": "'grace_period'" + } + ], + "line": 43, + "doc": "Circuit-breaker thresholds shared by live connector consumers." + }, + { + "name": "SyncCircuitState", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "source_name", + "type": "str", + "default": "'connector source'" + }, + { + "name": "consecutive_failure_count", + "type": "int", + "default": "0" + }, + { + "name": "active_failure_count", + "type": "int", + "default": "0" + }, + { + "name": "sync_paused", + "type": "bool", + "default": "False" + }, + { + "name": "sync_paused_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "sync_paused_reason", + "type": "str | None", + "default": "None" + }, + { + "name": "last_sync_status", + "type": "str | None", + "default": "None" + }, + { + "name": "last_error_at", + "type": "datetime | None", + "default": "None" + } + ], + "line": 52, + "doc": "Storage-neutral state needed to compute live-sync health." + }, + { + "name": "SyncRunResult", + "bases": [], + "fields": [ + { + "name": "records_discovered", + "type": "int", + "default": "" + }, + { + "name": "records_succeeded", + "type": "int", + "default": "" + }, + { + "name": "records_failed", + "type": "int", + "default": "" + }, + { + "name": "retries_attempted", + "type": "int", + "default": "0" + }, + { + "name": "error_summary", + "type": "str | None", + "default": "None" + } + ], + "line": 71, + "doc": "Normalized result summary for one connector sync run." + }, + { + "name": "SyncOperatorStatus", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "source_name", + "type": "str", + "default": "" + }, + { + "name": "health_status", + "type": "SyncHealthStatus", + "default": "" + }, + { + "name": "consecutive_failure_count", + "type": "int", + "default": "" + }, + { + "name": "active_failure_count", + "type": "int", + "default": "" + }, + { + "name": "sync_paused", + "type": "bool", + "default": "" + }, + { + "name": "sync_paused_reason", + "type": "str | None", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 94, + "doc": "Actionable health copy that can be rendered directly in module UIs." + }, + { + "name": "SyncSourceStatus", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "source_name", + "type": "str", + "default": "" + }, + { + "name": "health_status", + "type": "SyncHealthStatus", + "default": "" + }, + { + "name": "consecutive_failure_count", + "type": "int", + "default": "" + }, + { + "name": "active_failure_count", + "type": "int", + "default": "" + }, + { + "name": "sync_paused", + "type": "bool", + "default": "" + }, + { + "name": "sync_paused_reason", + "type": "str | None", + "default": "" + }, + { + "name": "last_sync_status", + "type": "str | None", + "default": "" + }, + { + "name": "next_sync_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 122, + "doc": "Storage-neutral status projection for module connector source lists." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/db/__init__.py", + "sha256": "19fc1241d2d81b136813d1ca7ebb47d3831a5ffccec8b548237577ddcd65aebb", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/exemptions/__init__.py", + "sha256": "83575c21379e697bbbc42b124c8674d8dc99020006f4806237eed0fb71083173", + "routes": [], + "models": [ + { + "name": "Rule", + "bases": [], + "fields": [ + { + "name": "id", + "type": "UUID", + "default": "" + }, + { + "name": "state_code", + "type": "str", + "default": "" + }, + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "rule_type", + "type": "str", + "default": "" + }, + { + "name": "definition", + "type": "str", + "default": "" + }, + { + "name": "version", + "type": "int", + "default": "" + } + ], + "line": 26, + "doc": "" + }, + { + "name": "FlagResult", + "bases": [], + "fields": [ + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "matched_text", + "type": "str", + "default": "" + }, + { + "name": "confidence", + "type": "float", + "default": "" + }, + { + "name": "rule_id", + "type": "UUID | None", + "default": "None" + }, + { + "name": "rule_type", + "type": "str", + "default": "'regex'" + }, + { + "name": "rule_version", + "type": "int | None", + "default": "None" + } + ], + "line": 36, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/exemptions/history.py", + "sha256": "b6b1e5be26a6c7a16391d34b6e50e4c08eb19d5cc25788db8917b0b46044b0ea", + "routes": [], + "models": [ + { + "name": "RuleVersionInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "rule_id", + "type": "UUID", + "default": "" + }, + { + "name": "state_code", + "type": "str", + "default": "Field(min_length=2, max_length=2)" + }, + { + "name": "version", + "type": "int", + "default": "Field(ge=1)" + }, + { + "name": "category", + "type": "str", + "default": "Field(min_length=1, max_length=100)" + }, + { + "name": "rule_type", + "type": "Literal['regex', 'keyword']", + "default": "" + }, + { + "name": "rule_definition", + "type": "str", + "default": "Field(min_length=1, max_length=8000)" + }, + { + "name": "citation_text", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "citation_url", + "type": "str | None", + "default": "Field(default=None, max_length=2000)" + }, + { + "name": "effective_from", + "type": "date | None", + "default": "None" + }, + { + "name": "retrieved_at", + "type": "AwareDatetime", + "default": "" + }, + { + "name": "coverage_declaration", + "type": "Literal['synthetic-fixture', 'tenant-supplied']", + "default": "" + } + ], + "line": 93, + "doc": "One cited rule version as supplied by an authorized caller." + }, + { + "name": "RuleVersion", + "bases": [], + "fields": [ + { + "name": "rule_id", + "type": "UUID", + "default": "" + }, + { + "name": "state_code", + "type": "str", + "default": "" + }, + { + "name": "version", + "type": "int", + "default": "" + }, + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "rule_type", + "type": "str", + "default": "" + }, + { + "name": "rule_definition", + "type": "str", + "default": "" + }, + { + "name": "citation_text", + "type": "str", + "default": "" + }, + { + "name": "citation_url", + "type": "str | None", + "default": "" + }, + { + "name": "effective_from", + "type": "date | None", + "default": "" + }, + { + "name": "retrieved_at", + "type": "object", + "default": "" + }, + { + "name": "coverage_declaration", + "type": "str", + "default": "" + }, + { + "name": "content_sha256", + "type": "str", + "default": "" + }, + { + "name": "recorded_by", + "type": "str", + "default": "" + } + ], + "line": 152, + "doc": "A persisted, immutable cited rule version." + }, + { + "name": "RecordOutcome", + "bases": [], + "fields": [ + { + "name": "rule_version", + "type": "RuleVersion", + "default": "" + }, + { + "name": "inserted", + "type": "bool", + "default": "" + }, + { + "name": "fingerprint", + "type": "str", + "default": "" + } + ], + "line": 182, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/exemptions/patterns.py", + "sha256": "b8c4ea484f1fe521295d29eebcc36703c4560d274b36c88f5af28f5abded98af", + "routes": [], + "models": [ + { + "name": "PIIPattern", + "bases": [], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "pattern", + "type": "re.Pattern", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "confidence", + "type": "float", + "default": "" + } + ], + "line": 15, + "doc": "" + }, + { + "name": "PIIMatch", + "bases": [], + "fields": [ + { + "name": "pattern_name", + "type": "str", + "default": "" + }, + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "matched_text", + "type": "str", + "default": "" + }, + { + "name": "start", + "type": "int", + "default": "" + }, + { + "name": "end", + "type": "int", + "default": "" + }, + { + "name": "confidence", + "type": "float", + "default": "" + } + ], + "line": 149, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/exports/__init__.py", + "sha256": "7b46221c065defc5c31f148cdc5d2464ff6f665d786499b90a0059474fe9713c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/exports/bundle.py", + "sha256": "22075c7ad189a9eb958b16a5cb4ef759213789f63e799e78b585a671a84ea5bd", + "routes": [], + "models": [ + { + "name": "ExportBundle", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "module_name", + "type": "str", + "default": "" + }, + { + "name": "module_version", + "type": "str", + "default": "" + }, + { + "name": "townlight_core_version", + "type": "str", + "default": "TOWNLIGHT_CORE_VERSION" + }, + { + "name": "purpose", + "type": "str", + "default": "'static_export_bundle'" + }, + { + "name": "files", + "type": "list[BundleFile]", + "default": "Field(default_factory=list)" + }, + { + "name": "limitations", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 54, + "doc": "Description of a static export bundle that can be validated offline." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/__init__.py", + "sha256": "6bef6d820315269d126b92aafa02a6d023c6c8706e378003a0cbad434318b791", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/chunker.py", + "sha256": "cf9515ec9aecfa7a5b4bbe077c99711ecce651c6c155a4bef07475e404a96c83", + "routes": [], + "models": [ + { + "name": "Chunk", + "bases": [], + "fields": [ + { + "name": "text", + "type": "str", + "default": "" + }, + { + "name": "index", + "type": "int", + "default": "" + }, + { + "name": "page_number", + "type": "int | None", + "default": "None" + }, + { + "name": "token_count", + "type": "int", + "default": "0" + } + ], + "line": 5, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/contracts.py", + "sha256": "7536789de18c66e150ad16986c44a794c6ad3353c5dd9e1b29b10f24fa5afaca", + "routes": [], + "models": [ + { + "name": "HealthCheckResult", + "bases": [], + "fields": [ + { + "name": "status", + "type": "HealthStatus", + "default": "" + }, + { + "name": "latency_ms", + "type": "int | None", + "default": "None" + }, + { + "name": "error_message", + "type": "str | None", + "default": "None" + }, + { + "name": "records_available", + "type": "int | None", + "default": "None" + }, + { + "name": "schema_hash", + "type": "str | None", + "default": "None" + }, + { + "name": "checked_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(timezone.utc))" + } + ], + "line": 18, + "doc": "" + }, + { + "name": "DiscoveredRecord", + "bases": [], + "fields": [ + { + "name": "source_path", + "type": "str", + "default": "" + }, + { + "name": "filename", + "type": "str", + "default": "" + }, + { + "name": "file_type", + "type": "str", + "default": "" + }, + { + "name": "file_size", + "type": "int", + "default": "" + }, + { + "name": "last_modified", + "type": "datetime | None", + "default": "None" + }, + { + "name": "metadata", + "type": "dict", + "default": "field(default_factory=dict)" + } + ], + "line": 28, + "doc": "A record discovered in a source system." + }, + { + "name": "FetchedDocument", + "bases": [], + "fields": [ + { + "name": "source_path", + "type": "str", + "default": "" + }, + { + "name": "filename", + "type": "str", + "default": "" + }, + { + "name": "file_type", + "type": "str", + "default": "" + }, + { + "name": "content", + "type": "bytes", + "default": "" + }, + { + "name": "file_size", + "type": "int", + "default": "" + }, + { + "name": "metadata", + "type": "dict", + "default": "field(default_factory=dict)" + } + ], + "line": 40, + "doc": "A document fetched from a source system, ready for ingest." + }, + { + "name": "SourceMaterial", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + }, + { + "name": "text", + "type": "str", + "default": "" + } + ], + "line": 52, + "doc": "Human-readable source text that downstream workflows may cite." + }, + { + "name": "CitedSentence", + "bases": [], + "fields": [ + { + "name": "text", + "type": "str", + "default": "" + }, + { + "name": "citations", + "type": "tuple[str, ...]", + "default": "" + } + ], + "line": 68, + "doc": "One output sentence plus the source ids it cites." + }, + { + "name": "CitationValidationError", + "bases": [], + "fields": [ + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 82, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/embedder.py", + "sha256": "655ae601f7901c847507e7ef4ab7cc3b77463e7ca1011831d9006b44cb3045ea", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "OLLAMA_BASE_URL", + "default": "'http://localhost:11434'", + "line": 13 + } + ] + }, + { + "source": "installed-owned-source/townlight_core/ingest/llm_extractor.py", + "sha256": "bfa082031b17b4a1af58472eb3faac4cd6cbc91f2d9a2f7e59763f5c92fa5680", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "OLLAMA_BASE_URL", + "default": "'http://localhost:11434'", + "line": 15 + } + ] + }, + { + "source": "installed-owned-source/townlight_core/ingest/models.py", + "sha256": "a10de63e573ec5d4df5d258265f07695e6ed1805b3cf02897828dfe6008f73bd", + "routes": [], + "models": [ + { + "name": "DataSource", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "name", + "type": "Mapped[str]", + "default": "mapped_column(String(255), unique=True)" + }, + { + "name": "source_type", + "type": "Mapped[SourceType]", + "default": "mapped_column(Enum(SourceType, name='source_type', create_type=False, values_callable=lambda e: [m.value for m in e]))" + }, + { + "name": "connection_config", + "type": "Mapped[dict[str, Any]]", + "default": "mapped_column(JSONB, default=dict)" + }, + { + "name": "is_active", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=True)" + }, + { + "name": "created_by", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "last_ingestion_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "discovered_source_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(nullable=True)" + }, + { + "name": "connector_template_id", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "sync_schedule", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50), nullable=True)" + }, + { + "name": "schedule_enabled", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=True, server_default='true')" + }, + { + "name": "last_sync_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "last_sync_cursor", + "type": "Mapped[str | None]", + "default": "mapped_column(String, nullable=True)" + }, + { + "name": "last_sync_status", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "consecutive_failure_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0, server_default='0')" + }, + { + "name": "last_error_message", + "type": "Mapped[str | None]", + "default": "mapped_column(String(500), nullable=True)" + }, + { + "name": "last_error_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "sync_paused", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=False, server_default='false')" + }, + { + "name": "sync_paused_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "sync_paused_reason", + "type": "Mapped[str | None]", + "default": "mapped_column(String(200), nullable=True)" + }, + { + "name": "retry_batch_size", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "retry_time_limit_seconds", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "health_status", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "schema_hash", + "type": "Mapped[str | None]", + "default": "mapped_column(String(64), nullable=True)" + } + ], + "line": 36, + "doc": "Source system or corpus that owns ingested documents." + }, + { + "name": "Document", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "source_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('data_sources.id'), index=True)" + }, + { + "name": "source_path", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "filename", + "type": "Mapped[str]", + "default": "mapped_column(String(500))" + }, + { + "name": "file_type", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "file_hash", + "type": "Mapped[str]", + "default": "mapped_column(String(64), index=True)" + }, + { + "name": "file_size", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "ingestion_status", + "type": "Mapped[IngestionStatus]", + "default": "mapped_column(Enum(IngestionStatus, name='ingestion_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=IngestionStatus.PENDING)" + }, + { + "name": "ingestion_error", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "chunk_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "ingested_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "metadata_", + "type": "Mapped[dict[str, Any] | None]", + "default": "mapped_column('metadata', JSONB, nullable=True)" + }, + { + "name": "connector_type", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "updated_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "display_name", + "type": "Mapped[str | None]", + "default": "mapped_column(String(500), nullable=True)" + }, + { + "name": "department_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(nullable=True)" + }, + { + "name": "redaction_status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), server_default='none')" + }, + { + "name": "derivative_path", + "type": "Mapped[str | None]", + "default": "mapped_column(String(1000), nullable=True)" + }, + { + "name": "original_locked", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, server_default='false')" + } + ], + "line": 75, + "doc": "One ingested file or structured record." + }, + { + "name": "DocumentChunk", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "document_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('documents.id', ondelete='CASCADE'), index=True)" + }, + { + "name": "chunk_index", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "content_text", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "embedding", + "type": "Mapped[list[float] | None]", + "default": "mapped_column(Vector(768), nullable=True)" + }, + { + "name": "token_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "page_number", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + } + ], + "line": 113, + "doc": "Sentence-aware chunk text and vector embedding for one document." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/__init__.py", + "sha256": "f6d7f512bae3794abd587b16845f42af7689ada1f994aca134389f922a445537", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/base.py", + "sha256": "d2618295496026752492dcbab6230d8973ed51f4a91984f7150e1bb064c36423", + "routes": [], + "models": [ + { + "name": "ParsedPage", + "bases": [], + "fields": [ + { + "name": "text", + "type": "str", + "default": "" + }, + { + "name": "page_number", + "type": "int | None", + "default": "None" + }, + { + "name": "metadata", + "type": "dict", + "default": "field(default_factory=dict)" + } + ], + "line": 6, + "doc": "" + }, + { + "name": "ParseResult", + "bases": [], + "fields": [ + { + "name": "pages", + "type": "list[ParsedPage]", + "default": "" + }, + { + "name": "metadata", + "type": "dict", + "default": "field(default_factory=dict)" + }, + { + "name": "file_type", + "type": "str", + "default": "''" + } + ], + "line": 12, + "doc": "" + }, + { + "name": "BaseParser", + "bases": [ + "ABC" + ], + "fields": [ + { + "name": "supported_extensions", + "type": "list[str]", + "default": "[]" + } + ], + "line": 25, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/csv_parser.py", + "sha256": "7c8208fed09911e4f8153ab3c7d1fcfc281b5aec016589b697a728769bdcb41c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/docx.py", + "sha256": "224542a9d2ebfdf9d3ef8947c7040ec683d13b507462a9c929e167c6b05529f3", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/email.py", + "sha256": "a83333d1ed5498fd56c61b47ce897b3d2c3b221070d7d13b000ea95336ea08e1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/html.py", + "sha256": "a0383c330920702a913140377891e3eed43f029a3c756e9dceade4eb6d81b92e", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/pdf.py", + "sha256": "fe312d998d3224a5cc10ee28c6f76f50a856075b5338370baed56d83ebbc0032", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/text.py", + "sha256": "b77c107e8446d92e1fa0ce4f11ed54906e02c2bc5980c19e344c175d635c3441", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/parsers/xlsx.py", + "sha256": "3bd37c6f389644b630d44fe4964f5f82623469ae2855c04e81437b0fbe9f8fe0", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/ingest/pipeline.py", + "sha256": "6d1cbe9794d4bf98e22ddbf18ba4bed5bb96e8a0231f87075b92eeebac4bf570", + "routes": [], + "models": [ + { + "name": "IngestHandler", + "bases": [ + "Protocol" + ], + "fields": [ + { + "name": "supported_extensions", + "type": "list[str]", + "default": "" + } + ], + "line": 19, + "doc": "Parser-like handler contract for file suffixes." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/__init__.py", + "sha256": "7f8341c07da53f39684a477f9b4fe88ce425a3dc5444f9ac6560eca9787bdac5", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/context.py", + "sha256": "e7df765626e5ff642e0b86c36771379662ce35594b147391fef0566835762daa", + "routes": [], + "models": [ + { + "name": "TokenBudget", + "bases": [], + "fields": [ + { + "name": "system_instruction", + "type": "int", + "default": "500" + }, + { + "name": "request_context", + "type": "int", + "default": "500" + }, + { + "name": "retrieved_chunks", + "type": "int", + "default": "5000" + }, + { + "name": "exemption_rules", + "type": "int", + "default": "500" + }, + { + "name": "output_reservation", + "type": "int", + "default": "1500" + }, + { + "name": "safety_margin", + "type": "int", + "default": "192" + } + ], + "line": 34, + "doc": "Token budget allocation for an LLM call." + }, + { + "name": "ContextBlock", + "bases": [], + "fields": [ + { + "name": "role", + "type": "str", + "default": "" + }, + { + "name": "content", + "type": "str", + "default": "" + }, + { + "name": "estimated_tokens", + "type": "int", + "default": "0" + } + ], + "line": 57, + "doc": "A block of content with its role and estimated token count." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/factory.py", + "sha256": "0497147ca6d8af7c4b233a4157089fe4911bb49d0ea214f4fce9ac4c65e48aee", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/providers/__init__.py", + "sha256": "4decd4720c452fa27d1b245a603d409b7dc99db1c5015dbdb3ae29d745ac61fc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/providers/anthropic.py", + "sha256": "dba9eb64c724fe8a209dbac48743f99463f99e0c1c67b1306d9126985348b267", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/providers/base.py", + "sha256": "fe430884bcaf7678f625db6203312e1f1dcdce617db36870623e87b5ac066b32", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/providers/config.py", + "sha256": "db4ee77e2e0a3ac16fd71df4f0979fab89d36b2ff1985c1e2d4498299810fd3a", + "routes": [], + "models": [ + { + "name": "OllamaConfig", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "base_url", + "type": "str", + "default": "Field(default='http://localhost:11434')" + }, + { + "name": "default_model", + "type": "str", + "default": "Field(default='gemma4:e4b')" + }, + { + "name": "default_embed_model", + "type": "str", + "default": "Field(default='nomic-embed-text')" + }, + { + "name": "think", + "type": "bool | str | None", + "default": "Field(default=None)" + } + ], + "line": 12, + "doc": "Config schema for OllamaProvider.\n\nAll fields have sensible defaults \u2014 Ollama runs locally and does not\nrequire credentials." + }, + { + "name": "OpenAIConfig", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "api_key", + "type": "str", + "default": "Field(min_length=1, description='OpenAI API key')" + }, + { + "name": "default_model", + "type": "str", + "default": "Field(default='gpt-4o-mini')" + }, + { + "name": "default_embed_model", + "type": "str", + "default": "Field(default='text-embedding-3-small')" + } + ], + "line": 26, + "doc": "Config schema for OpenAIProvider.\n\napi_key is required; passing it via env var is the caller's responsibility\n(e.g., `OpenAIConfig(api_key=os.environ[\"OPENAI_API_KEY\"])`)." + }, + { + "name": "AnthropicConfig", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "api_key", + "type": "str", + "default": "Field(min_length=1, description='Anthropic API key')" + }, + { + "name": "default_model", + "type": "str", + "default": "Field(default='claude-haiku-4-5')" + }, + { + "name": "max_tokens", + "type": "int", + "default": "Field(default=4096, gt=0)" + } + ], + "line": 37, + "doc": "Config schema for AnthropicProvider.\n\napi_key is required. max_tokens is a sensible default (4096) and can be\nincreased for longer outputs." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/providers/ollama.py", + "sha256": "bd1c78980c464dd41c7fdc24d9c362d17d20d343c9eac3c01000609bacd47e2b", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/providers/openai.py", + "sha256": "d54920131ea2f0f14b8eee8c970dce47bf5ee5886815626f09f765fd8d4f4a30", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/providers/registry.py", + "sha256": "2733af50366c7e8975c1b552fbe5302ed12d284abd59e65768ac8453d3639870", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/registry/__init__.py", + "sha256": "9223edf2e5652dcee6612a2593299b12e06c6e46f24b4784d9d97bdda333a3d0", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/registry/models.py", + "sha256": "f58ccb6ce42a7d344c4de7432ca3623e7865a59c91646736e1d397b565e07b0e", + "routes": [], + "models": [ + { + "name": "ModelRegistry", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[int]", + "default": "mapped_column(Integer, primary_key=True)" + }, + { + "name": "model_name", + "type": "Mapped[str]", + "default": "mapped_column(String(255), nullable=False)" + }, + { + "name": "model_version", + "type": "Mapped[str | None]", + "default": "mapped_column(String(100), nullable=True)" + }, + { + "name": "parameter_count", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50), nullable=True)" + }, + { + "name": "license", + "type": "Mapped[str | None]", + "default": "mapped_column(String(100), nullable=True)" + }, + { + "name": "model_card_url", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "is_active", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, nullable=False, server_default='false')" + }, + { + "name": "added_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(TIMESTAMP(timezone=True), nullable=True)" + }, + { + "name": "context_window_size", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "supports_ner", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, nullable=False, server_default='false')" + }, + { + "name": "supports_vision", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, nullable=False, server_default='false')" + } + ], + "line": 29, + "doc": "ORM model for the model_registry table." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/registry/router.py", + "sha256": "03815bc31f8b2651acee939dd370f44c91a2c92e663ebe25273986540a379b2f", + "routes": [ + { + "method": "GET", + "path": "/admin/models", + "router": "router", + "prefix_resolved": true, + "name": "list_models", + "signature": "session: AsyncSession=Depends(get_session)", + "returns": "", + "line": 46, + "doc": "", + "decorator": "router.get('', response_model=list[ModelRegistryRead])", + "errors": [] + }, + { + "method": "GET", + "path": "/admin/models/{model_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_model", + "signature": "model_id: int, session: AsyncSession=Depends(get_session)", + "returns": "", + "line": 53, + "doc": "", + "decorator": "router.get('/{model_id}', response_model=ModelRegistryRead)", + "errors": [ + "HTTPException(status_code=404, detail=f'Model {model_id} not found')" + ] + }, + { + "method": "POST", + "path": "/admin/models", + "router": "router", + "prefix_resolved": true, + "name": "create_model", + "signature": "payload: ModelRegistryCreate, session: AsyncSession=Depends(get_session)", + "returns": "", + "line": 61, + "doc": "", + "decorator": "router.post('', response_model=ModelRegistryRead, status_code=201)", + "errors": [] + }, + { + "method": "PATCH", + "path": "/admin/models/{model_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_model", + "signature": "model_id: int, payload: ModelRegistryUpdate, session: AsyncSession=Depends(get_session)", + "returns": "", + "line": 73, + "doc": "", + "decorator": "router.patch('/{model_id}', response_model=ModelRegistryRead)", + "errors": [ + "HTTPException(status_code=404, detail=f'Model {model_id} not found')" + ] + }, + { + "method": "DELETE", + "path": "/admin/models/{model_id}", + "router": "router", + "prefix_resolved": true, + "name": "delete_model", + "signature": "model_id: int, session: AsyncSession=Depends(get_session)", + "returns": "", + "line": 89, + "doc": "", + "decorator": "router.delete('/{model_id}', status_code=204)", + "errors": [ + "HTTPException(status_code=404, detail=f'Model {model_id} not found')" + ] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/registry/schemas.py", + "sha256": "324d0b48abc8d3d0b7a66f9763145a29fed4e81a6b8a59f865b63fb1ab980bfe", + "routes": [], + "models": [ + { + "name": "ModelRegistryCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "model_name", + "type": "str", + "default": "" + }, + { + "name": "model_version", + "type": "str | None", + "default": "None" + }, + { + "name": "parameter_count", + "type": "str | None", + "default": "None" + }, + { + "name": "license", + "type": "str | None", + "default": "None" + }, + { + "name": "model_card_url", + "type": "str | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool", + "default": "False" + }, + { + "name": "context_window_size", + "type": "int | None", + "default": "None" + }, + { + "name": "supports_ner", + "type": "bool", + "default": "False" + }, + { + "name": "supports_vision", + "type": "bool", + "default": "False" + } + ], + "line": 18, + "doc": "Schema for creating a new model_registry record (POST body)." + }, + { + "name": "ModelRegistryRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "int", + "default": "" + }, + { + "name": "model_name", + "type": "str", + "default": "" + }, + { + "name": "model_version", + "type": "str | None", + "default": "None" + }, + { + "name": "parameter_count", + "type": "str | None", + "default": "None" + }, + { + "name": "license", + "type": "str | None", + "default": "None" + }, + { + "name": "model_card_url", + "type": "str | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool", + "default": "" + }, + { + "name": "added_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "context_window_size", + "type": "int | None", + "default": "None" + }, + { + "name": "supports_ner", + "type": "bool", + "default": "" + }, + { + "name": "supports_vision", + "type": "bool", + "default": "" + } + ], + "line": 32, + "doc": "Schema for returning a model_registry record (GET response).\n\n``from_attributes=True`` allows construction directly from an ORM instance." + }, + { + "name": "ModelRegistryUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "model_name", + "type": "str | None", + "default": "None" + }, + { + "name": "model_version", + "type": "str | None", + "default": "None" + }, + { + "name": "parameter_count", + "type": "str | None", + "default": "None" + }, + { + "name": "license", + "type": "str | None", + "default": "None" + }, + { + "name": "model_card_url", + "type": "str | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool | None", + "default": "None" + }, + { + "name": "context_window_size", + "type": "int | None", + "default": "None" + }, + { + "name": "supports_ner", + "type": "bool | None", + "default": "None" + }, + { + "name": "supports_vision", + "type": "bool | None", + "default": "None" + } + ], + "line": 53, + "doc": "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." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/registry/service.py", + "sha256": "9280f0161a4db25de8182f214fa9d143ef2b1bfc3dac65b1b83b570ed12ee407", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/structured.py", + "sha256": "9f7ad6645f2a02aa6a41207906be09a6e1adfc70a89c6eb78387e78cb807477a", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/templates/__init__.py", + "sha256": "a00806b2b0d3c3b7dd966dee85db8f2ee6178697c6f222c28abe4454518ba341", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/templates/engine.py", + "sha256": "cb4f72ba249be0264c827c4503b64dea8b61fe525ebb1a93870a9ba58b46d5df", + "routes": [], + "models": [ + { + "name": "RenderedPrompt", + "bases": [], + "fields": [ + { + "name": "system", + "type": "str", + "default": "" + }, + { + "name": "user", + "type": "str", + "default": "" + }, + { + "name": "template_name", + "type": "str", + "default": "" + }, + { + "name": "consumer_app", + "type": "str", + "default": "" + }, + { + "name": "version", + "type": "int", + "default": "" + } + ], + "line": 20, + "doc": "Result of rendering a PromptTemplate.\n\nAttributes:\n system: Rendered system_prompt string.\n user: Rendered user_prompt_template string.\n template_name: The source template's logical name.\n consumer_app: The source template's consumer_app namespace.\n version: The source template's version number." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/templates/exceptions.py", + "sha256": "53bbdcfd915d751cc878edc148a39b52424b5c34a4d03ed8120d763464967a96", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/templates/models.py", + "sha256": "c1a61785d12d40657aad28ead8f8d27c947634ab159bc48b4309788ae4ed674d", + "routes": [], + "models": [ + { + "name": "PromptTemplate", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "template_name", + "type": "Mapped[str]", + "default": "mapped_column(String(200), nullable=False)" + }, + { + "name": "consumer_app", + "type": "Mapped[str]", + "default": "mapped_column(String(100), nullable=False, server_default='townlight_core')" + }, + { + "name": "is_override", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, nullable=False, server_default='false')" + }, + { + "name": "purpose", + "type": "Mapped[str]", + "default": "mapped_column(String(50), nullable=False)" + }, + { + "name": "system_prompt", + "type": "Mapped[str]", + "default": "mapped_column(Text, nullable=False)" + }, + { + "name": "user_prompt_template", + "type": "Mapped[str]", + "default": "mapped_column(Text, nullable=False)" + }, + { + "name": "token_budget", + "type": "Mapped[dict | None]", + "default": "mapped_column(JSONB, nullable=True)" + }, + { + "name": "model_id", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, ForeignKey('model_registry.id', ondelete='SET NULL'), nullable=True)" + }, + { + "name": "version", + "type": "Mapped[int]", + "default": "mapped_column(Integer, nullable=False, server_default='1')" + }, + { + "name": "is_active", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, nullable=False, server_default='true')" + }, + { + "name": "created_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(PG_UUID(as_uuid=True), nullable=True)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now())" + } + ], + "line": 37, + "doc": "ORM model for the prompt_templates table." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/templates/overrides.py", + "sha256": "6a32018a76d803c74408937b75e6d3ad597f247d533e2d8092ce7bbccc0d0cd1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/templates/resolver.py", + "sha256": "389bf9b01902b046f8986fc3415125c859bf8a4923e07d146d0cdd75587b9636", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/llm/templates/schemas.py", + "sha256": "f012308c13d12ec8e338335c5ba451d73c171605697a79a8f3dba334f4af1854", + "routes": [], + "models": [ + { + "name": "PromptTemplateCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "template_name", + "type": "str", + "default": "" + }, + { + "name": "purpose", + "type": "str", + "default": "" + }, + { + "name": "system_prompt", + "type": "str", + "default": "" + }, + { + "name": "user_prompt_template", + "type": "str", + "default": "" + }, + { + "name": "consumer_app", + "type": "str", + "default": "'townlight_core'" + }, + { + "name": "is_override", + "type": "bool", + "default": "False" + }, + { + "name": "token_budget", + "type": "dict | None", + "default": "None" + }, + { + "name": "model_id", + "type": "int | None", + "default": "None" + }, + { + "name": "version", + "type": "int", + "default": "1" + }, + { + "name": "is_active", + "type": "bool", + "default": "True" + }, + { + "name": "created_by", + "type": "uuid.UUID | None", + "default": "None" + } + ], + "line": 13, + "doc": "Fields required (or defaulted) when creating a new prompt template." + }, + { + "name": "PromptTemplateRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "template_name", + "type": "str", + "default": "" + }, + { + "name": "consumer_app", + "type": "str", + "default": "" + }, + { + "name": "is_override", + "type": "bool", + "default": "" + }, + { + "name": "purpose", + "type": "str", + "default": "" + }, + { + "name": "system_prompt", + "type": "str", + "default": "" + }, + { + "name": "user_prompt_template", + "type": "str", + "default": "" + }, + { + "name": "token_budget", + "type": "dict | None", + "default": "" + }, + { + "name": "model_id", + "type": "int | None", + "default": "" + }, + { + "name": "version", + "type": "int", + "default": "" + }, + { + "name": "is_active", + "type": "bool", + "default": "" + }, + { + "name": "created_by", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 32, + "doc": "All columns for reading a prompt template row." + }, + { + "name": "PromptTemplateUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "template_name", + "type": "str | None", + "default": "None" + }, + { + "name": "purpose", + "type": "str | None", + "default": "None" + }, + { + "name": "system_prompt", + "type": "str | None", + "default": "None" + }, + { + "name": "user_prompt_template", + "type": "str | None", + "default": "None" + }, + { + "name": "consumer_app", + "type": "str | None", + "default": "None" + }, + { + "name": "is_override", + "type": "bool | None", + "default": "None" + }, + { + "name": "token_budget", + "type": "dict | None", + "default": "None" + }, + { + "name": "model_id", + "type": "int | None", + "default": "None" + }, + { + "name": "version", + "type": "int | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool | None", + "default": "None" + } + ], + "line": 52, + "doc": "Partial update schema for PATCH operations. All fields optional." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/__init__.py", + "sha256": "6cb4358063e7a281454ae36e2aa4565e9048e00d193d1da0bab81df47a453703", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/env.py", + "sha256": "208de714d58a5b3fa8f3797c05eadba49d0b46105afeb20c50e7685e298fb4cb", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "DATABASE_URL", + "default": "", + "line": 64 + }, + { + "variable": "DATABASE_URL", + "default": "", + "line": 27 + } + ] + }, + { + "source": "installed-owned-source/townlight_core/migrations/guards.py", + "sha256": "c55de91c7189b39537aed6130a1e9f50817f819bd13aa4728ae4e8dd4c863aad", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/runner.py", + "sha256": "4f3b554197baf06924cc3676d42df083f14f3a9db1456a775601d975499e354e", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "DATABASE_URL", + "default": "", + "line": 47 + } + ] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/__init__.py", + "sha256": "61c059e42b35e302a4372a1c7697ca495118b123f7303306d7c54ff15173c8c6", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0001_baseline_v1.py", + "sha256": "69186f3f798a01d61638ae42993761c3038ced04e143ea8dd292ebc1fc63afb7", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0002_llm.py", + "sha256": "fa273e35f651a6298842df0de87bd5548d1a83698adc27e1385ceb28449b00cd", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py", + "sha256": "51276a0dc2737fd1fc2615f26d66d942c1df3be2ef40f1513436cd4579b1ecf0", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0004_catalog.py", + "sha256": "a9f46f8ca1bcde43a2796dd62891ad36840d1067220b16fdde8583a1f700a06d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0005_job_leases.py", + "sha256": "a6651789d82cb0c39481f16855449bf09d65644c93a97bab1e33f8d7546157f7", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0006_rule_history.py", + "sha256": "ac29f724f60125de435235655a052ae3738a286467b1d6d8213a22558994a868", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0007_module_inventory.py", + "sha256": "41aefee7ff2de883f92eebb7a39de2f0ed8b6bd4fecf88c6ebfd62a0b3cb7456", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0008_department_authority.py", + "sha256": "fa7328f869594d1af2f4daceb4b362cd8ebe304b7e1ecbefaa22497d08430b4a", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/migrations/versions/townlight_core_0009_job_artifacts.py", + "sha256": "ee8952caff749c4b9df5cbc15c379f69f7066351ea5f7690525136be1481d9d8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/models/__init__.py", + "sha256": "213b3086e533a98047d460720e7a1becd7f6196f4a6db989a39253351b8894c9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/notifications/__init__.py", + "sha256": "988bcb1091aef4451a1566202a6ec50e3b8908770707b5ad45398923bdb2d6be", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/notifications/notice.py", + "sha256": "78c2542686403c647859b27f5a7bf7ff832cd29ca3ff4086b32c6e5fc098247b", + "routes": [], + "models": [ + { + "name": "DeadlinePlan", + "bases": [], + "fields": [ + { + "name": "notice_type", + "type": "str", + "default": "" + }, + { + "name": "event_date", + "type": "date", + "default": "" + }, + { + "name": "publish_by", + "type": "date", + "default": "" + }, + { + "name": "reminders", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "staff_review_required", + "type": "bool", + "default": "" + } + ], + "line": 13, + "doc": "Deterministic notice deadline reminders without legal determinations." + }, + { + "name": "NoticeComplianceWarning", + "bases": [], + "fields": [ + { + "name": "code", + "type": "str", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 24, + "doc": "Actionable warning describing a notice-compliance gap." + }, + { + "name": "NoticeComplianceResult", + "bases": [], + "fields": [ + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "notice_type", + "type": "str", + "default": "" + }, + { + "name": "scheduled_start", + "type": "datetime", + "default": "" + }, + { + "name": "posted_at", + "type": "datetime", + "default": "" + }, + { + "name": "minimum_notice_hours", + "type": "int", + "default": "" + }, + { + "name": "deadline_at", + "type": "datetime", + "default": "" + }, + { + "name": "statutory_basis", + "type": "str | None", + "default": "" + }, + { + "name": "approved_by", + "type": "str | None", + "default": "" + }, + { + "name": "compliant", + "type": "bool", + "default": "" + }, + { + "name": "http_status", + "type": "int", + "default": "" + }, + { + "name": "warnings", + "type": "tuple[NoticeComplianceWarning, ...]", + "default": "" + } + ], + "line": 36, + "doc": "Result of checking whether a meeting notice is ready to publish." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/onboarding/__init__.py", + "sha256": "d4d47bddbea571ade848657d39a128849e7b02c45a2c5476bd4ee933033a5713", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/onboarding/profile.py", + "sha256": "76f82f3b710700d4d3913a1ec5575c15499e46c11b4bb9ddffa2455710b93a93", + "routes": [], + "models": [ + { + "name": "OnboardingField", + "bases": [], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "question", + "type": "str", + "default": "" + }, + { + "name": "kind", + "type": "str", + "default": "'text'" + } + ], + "line": 10, + "doc": "A tracked onboarding field and the default prompt used to ask for it." + }, + { + "name": "OnboardingProgress", + "bases": [], + "fields": [ + { + "name": "next_field", + "type": "str | None", + "default": "" + }, + { + "name": "next_question", + "type": "str | None", + "default": "" + }, + { + "name": "completed_fields", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "skipped_fields", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "all_complete", + "type": "bool", + "default": "" + } + ], + "line": 19, + "doc": "Skip-aware progress state for an interview-style onboarding walk." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/platform/__init__.py", + "sha256": "a8618133480c425c95c6ab8b773261aa430f600603941248148b402341ac9f94", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/platform/backup.py", + "sha256": "15396fd6bdeaebbddead4a619e11090b427dfcb8744dccd582bbbaf5ca49b407", + "routes": [], + "models": [ + { + "name": "BackupItem", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "module_id", + "type": "str", + "default": "Field(pattern='^[a-z][a-z0-9-]{1,63}$')" + }, + { + "name": "relative_path", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "size_bytes", + "type": "int", + "default": "Field(ge=0)" + }, + { + "name": "sha256", + "type": "str", + "default": "Field(pattern='^[a-f0-9]{64}$')" + }, + { + "name": "required", + "type": "bool", + "default": "True" + } + ], + "line": 15, + "doc": "One file captured in a local backup." + }, + { + "name": "BackupManifest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "schema_version", + "type": "str", + "default": "'1.0'" + }, + { + "name": "backup_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "city_profile_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "townlight_core_version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "created_at", + "type": "datetime", + "default": "Field(default_factory=lambda: datetime.now(UTC))" + }, + { + "name": "modules", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "items", + "type": "list[BackupItem]", + "default": "" + } + ], + "line": 27, + "doc": "Versioned backup manifest for a Townlight local profile." + }, + { + "name": "BackupValidationResult", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "valid", + "type": "bool", + "default": "" + }, + { + "name": "missing", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "hash_mismatches", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 41, + "doc": "Result of checking a backup manifest against files on disk." + }, + { + "name": "BackupRestoreAction", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_relative_path", + "type": "str", + "default": "" + }, + { + "name": "target_relative_path", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "RestoreActionStatus", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + } + ], + "line": 51, + "doc": "One file restore action and its safety status." + }, + { + "name": "BackupRestorePlan", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "ready", + "type": "bool", + "default": "" + }, + { + "name": "actions", + "type": "list[BackupRestoreAction]", + "default": "" + }, + { + "name": "blocked_reason", + "type": "str | None", + "default": "None" + } + ], + "line": 62, + "doc": "A non-destructive restore plan." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/platform/health.py", + "sha256": "41f35066ee9a5c1ea3948605f3acf39c568a8916340598468def3502a0ec1634", + "routes": [], + "models": [ + { + "name": "PlatformHealthCheck", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "component", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "status", + "type": "PlatformHealthStatus", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "next_action", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "blocking", + "type": "bool", + "default": "False" + }, + { + "name": "checked_at", + "type": "datetime", + "default": "Field(default_factory=lambda: datetime.now(UTC))" + }, + { + "name": "admin_detail", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 19, + "doc": "One health check result suitable for staff/admin health screens." + }, + { + "name": "PlatformHealthSummary", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "status", + "type": "PlatformHealthStatus", + "default": "" + }, + { + "name": "checks", + "type": "list[PlatformHealthCheck]", + "default": "" + }, + { + "name": "next_action", + "type": "str", + "default": "" + }, + { + "name": "staff_message", + "type": "str", + "default": "" + }, + { + "name": "admin_message", + "type": "str", + "default": "" + }, + { + "name": "blocked_components", + "type": "list[str]", + "default": "" + }, + { + "name": "degraded_components", + "type": "list[str]", + "default": "" + } + ], + "line": 34, + "doc": "Aggregated health status for the umbrella shell." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/platform/inventory.py", + "sha256": "b6b1936c8bc2d5ba459370e9406395b3bf899a24ba439ff92ac38ae393fe7dda", + "routes": [], + "models": [ + { + "name": "ModuleInventoryEntry", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "module_id", + "type": "str", + "default": "Field(min_length=2, max_length=64)" + }, + { + "name": "version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "enabled", + "type": "bool", + "default": "" + }, + { + "name": "manifest", + "type": "ModuleManifest", + "default": "" + } + ], + "line": 120, + "doc": "One module the scope declares it has, plus the manifest it was installed from." + }, + { + "name": "ModuleInventory", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "scope_id", + "type": "str", + "default": "Field(min_length=2, max_length=64)" + }, + { + "name": "revision", + "type": "int", + "default": "Field(ge=1)" + }, + { + "name": "profile", + "type": "InstallProfile", + "default": "'windows_local'" + }, + { + "name": "townlight_core_version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "entries", + "type": "list[ModuleInventoryEntry]", + "default": "Field(default_factory=list)" + } + ], + "line": 139, + "doc": "A scope's declared installed/enabled module set at one revision." + }, + { + "name": "InventoryOutcome", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "inventory", + "type": "ModuleInventory", + "default": "" + }, + { + "name": "inserted", + "type": "bool", + "default": "" + }, + { + "name": "fingerprint", + "type": "str", + "default": "" + } + ], + "line": 204, + "doc": "Result of one append attempt." + }, + { + "name": "ModuleRecommendation", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "module_id", + "type": "str", + "default": "Field(min_length=2, max_length=64)" + }, + { + "name": "action", + "type": "RecommendationAction", + "default": "" + }, + { + "name": "basis", + "type": "RecommendationBasis", + "default": "" + }, + { + "name": "reasons", + "type": "list[str]", + "default": "Field(min_length=1)" + }, + { + "name": "operator_action", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 410, + "doc": "Advisory next step for one module. Never installation or health evidence." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/platform/modules.py", + "sha256": "7d3af6bcdc8cc3af90c6c663f5e0ea4571cfe607b0c3ee76a3ce0f966cb8a0c3", + "routes": [], + "models": [ + { + "name": "ModuleDependency", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "module_id", + "type": "str", + "default": "Field(pattern=MODULE_ID_PATTERN)" + }, + { + "name": "min_version", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "required", + "type": "bool", + "default": "True" + } + ], + "line": 46, + "doc": "Another Townlight module required by a manifest." + }, + { + "name": "ModulePermission", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "key", + "type": "str", + "default": "Field(pattern=SLUG_PATTERN)" + }, + { + "name": "label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "description", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "surface", + "type": "ModuleSurface", + "default": "'staff'" + }, + { + "name": "roles", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 56, + "doc": "Permission surfaced to the shell and module manager." + }, + { + "name": "ModuleRoute", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "Field(pattern=SLUG_PATTERN)" + }, + { + "name": "path", + "type": "str", + "default": "Field(pattern='^/[a-z0-9/_:-]*$')" + }, + { + "name": "label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "surface", + "type": "ModuleSurface", + "default": "'staff'" + }, + { + "name": "permission", + "type": "str | None", + "default": "Field(default=None, pattern=SLUG_PATTERN)" + } + ], + "line": 75, + "doc": "A route the desktop shell may expose for a module." + }, + { + "name": "ModuleService", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "Field(pattern=SLUG_PATTERN)" + }, + { + "name": "service_type", + "type": "ServiceType", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "required", + "type": "bool", + "default": "True" + }, + { + "name": "start_order", + "type": "int", + "default": "Field(default=100, ge=0)" + }, + { + "name": "health_check_id", + "type": "str | None", + "default": "Field(default=None, pattern=SLUG_PATTERN)" + } + ], + "line": 87, + "doc": "A local service, schema, or command needed by a module." + }, + { + "name": "ModuleMigration", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "Field(pattern=SLUG_PATTERN)" + }, + { + "name": "description", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "owner_schema", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "required", + "type": "bool", + "default": "True" + } + ], + "line": 100, + "doc": "A migration contract that the installer/runtime must apply or verify." + }, + { + "name": "ModuleHealthCheck", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "Field(pattern=SLUG_PATTERN)" + }, + { + "name": "label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "description", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "blocking", + "type": "bool", + "default": "True" + }, + { + "name": "surface", + "type": "Literal['staff', 'admin', 'system']", + "default": "'admin'" + }, + { + "name": "repair_action", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 111, + "doc": "A module health check known to the umbrella health center." + }, + { + "name": "ModuleBackupHook", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "Field(pattern=SLUG_PATTERN)" + }, + { + "name": "label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "includes", + "type": "list[str]", + "default": "Field(min_length=1)" + }, + { + "name": "restore_supported", + "type": "bool", + "default": "True" + } + ], + "line": 124, + "doc": "A backup/restore hook the module contributes to the shared backup plan." + }, + { + "name": "ModuleModelRequirement", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "Field(pattern=SLUG_PATTERN)" + }, + { + "name": "provider", + "type": "Literal['ollama', 'local', 'none', 'openai', 'anthropic']", + "default": "'ollama'" + }, + { + "name": "model_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "required", + "type": "bool", + "default": "True" + }, + { + "name": "local_only", + "type": "bool", + "default": "True" + }, + { + "name": "minimum_context_tokens", + "type": "int | None", + "default": "Field(default=None, ge=1)" + }, + { + "name": "checksum_sha256", + "type": "str | None", + "default": "Field(default=None, pattern='^[a-fA-F0-9]{64}$')" + }, + { + "name": "download_url", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "license_name", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 135, + "doc": "A model requirement declared by a module." + }, + { + "name": "ModuleRuntimeRequirement", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "kind", + "type": "RuntimeRequirementKind", + "default": "" + }, + { + "name": "name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "description", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "required", + "type": "bool", + "default": "True" + }, + { + "name": "operator_visible", + "type": "bool", + "default": "False" + } + ], + "line": 151, + "doc": "Runtime capability needed by a module." + }, + { + "name": "ModuleManifest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "module_id", + "type": "str", + "default": "Field(pattern=MODULE_ID_PATTERN)" + }, + { + "name": "name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "package_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "townlight_core_min_version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "enabled_by_default", + "type": "bool", + "default": "True" + }, + { + "name": "surfaces", + "type": "list[ModuleSurface]", + "default": "Field(default_factory=lambda: ['staff'])" + }, + { + "name": "install_profiles", + "type": "list[InstallProfile]", + "default": "Field(default_factory=lambda: ['windows_local'])" + }, + { + "name": "dependencies", + "type": "list[ModuleDependency]", + "default": "Field(default_factory=list)" + }, + { + "name": "routes", + "type": "list[ModuleRoute]", + "default": "Field(default_factory=list)" + }, + { + "name": "permissions", + "type": "list[ModulePermission]", + "default": "Field(default_factory=list)" + }, + { + "name": "services", + "type": "list[ModuleService]", + "default": "Field(default_factory=list)" + }, + { + "name": "migrations", + "type": "list[ModuleMigration]", + "default": "Field(default_factory=list)" + }, + { + "name": "health_checks", + "type": "list[ModuleHealthCheck]", + "default": "Field(default_factory=list)" + }, + { + "name": "backup_hooks", + "type": "list[ModuleBackupHook]", + "default": "Field(default_factory=list)" + }, + { + "name": "model_requirements", + "type": "list[ModuleModelRequirement]", + "default": "Field(default_factory=list)" + }, + { + "name": "runtime_requirements", + "type": "list[ModuleRuntimeRequirement]", + "default": "Field(default_factory=list)" + }, + { + "name": "settings_schema_version", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "metadata", + "type": "dict[str, Any]", + "default": "Field(default_factory=dict)" + } + ], + "line": 163, + "doc": "Complete manifest for a Townlight module package." + }, + { + "name": "ModuleRegistryEntry", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "module_id", + "type": "str", + "default": "Field(pattern=MODULE_ID_PATTERN)" + }, + { + "name": "name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "enabled", + "type": "bool", + "default": "" + }, + { + "name": "locked", + "type": "bool", + "default": "False" + }, + { + "name": "status", + "type": "ModuleRegistryStatus", + "default": "" + }, + { + "name": "reason", + "type": "str | None", + "default": "None" + }, + { + "name": "manifest", + "type": "ModuleManifest", + "default": "" + } + ], + "line": 230, + "doc": "One module's resolved state in a runtime profile." + }, + { + "name": "ModuleRegistryState", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "profile", + "type": "InstallProfile", + "default": "'windows_local'" + }, + { + "name": "townlight_core_version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "townlight_core_locked", + "type": "bool", + "default": "True" + }, + { + "name": "entries", + "type": "list[ModuleRegistryEntry]", + "default": "" + } + ], + "line": 245, + "doc": "Resolved module registry for the desktop shell and installer." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/platform/runtime.py", + "sha256": "8c9ba7958b8fa08e7b0378a78d3693d8a586714555e5de9420a10626283f579a", + "routes": [], + "models": [ + { + "name": "RuntimeActionResult", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "action", + "type": "RuntimeAction", + "default": "" + }, + { + "name": "status", + "type": "RuntimeActionStatus", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "message", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "next_action", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "evidence", + "type": "dict[str, str | int | bool | None]", + "default": "Field(default_factory=dict)" + }, + { + "name": "started_at", + "type": "datetime", + "default": "Field(default_factory=lambda: datetime.now(UTC))" + }, + { + "name": "completed_at", + "type": "datetime | None", + "default": "None" + } + ], + "line": 28, + "doc": "Plain-English result returned by installer/runtime APIs." + }, + { + "name": "LocalRuntimeProfile", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "profile_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "city_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "data_root", + "type": "Path", + "default": "" + }, + { + "name": "backup_root", + "type": "Path", + "default": "" + }, + { + "name": "module_registry", + "type": "ModuleRegistryState", + "default": "" + }, + { + "name": "model_provider", + "type": "str", + "default": "'ollama'" + }, + { + "name": "local_only", + "type": "bool", + "default": "True" + }, + { + "name": "network_allowed_for", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 43, + "doc": "Resolved local runtime profile for one installed city." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/platform/task_queue.py", + "sha256": "438c2e7364ef0232b62a4ea379b22a679c248c8c1ab9c0b3149fd87ec8e5fb46", + "routes": [], + "models": [ + { + "name": "LocalTask", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "task_id", + "type": "Mapped[str]", + "default": "mapped_column(String(128), primary_key=True)" + }, + { + "name": "module_id", + "type": "Mapped[str]", + "default": "mapped_column(String(64), index=True)" + }, + { + "name": "task_type", + "type": "Mapped[str]", + "default": "mapped_column(String(100), index=True)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), index=True, default='queued')" + }, + { + "name": "payload", + "type": "Mapped[dict[str, Any]]", + "default": "mapped_column(JSONB, default=dict)" + }, + { + "name": "attempt_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "queued_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True))" + }, + { + "name": "available_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "last_error", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "idempotency_key", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255), nullable=True, unique=True)" + }, + { + "name": "audit_subject_id", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255), nullable=True)" + }, + { + "name": "claim_token", + "type": "Mapped[str | None]", + "default": "mapped_column(String(64), nullable=True)" + }, + { + "name": "lease_expires_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "cancelled_by", + "type": "Mapped[str | None]", + "default": "mapped_column(String(128), nullable=True)" + } + ], + "line": 27, + "doc": "Durable local task row used by the Windows local runtime." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/platform/tasks.py", + "sha256": "cbf2bf5323fb37c5ff58038d77597464b16c6637b205dcf00a03ad274d120847", + "routes": [], + "models": [ + { + "name": "TaskRetryPolicy", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "max_attempts", + "type": "int", + "default": "Field(default=3, ge=1)" + }, + { + "name": "base_delay_seconds", + "type": "int", + "default": "Field(default=30, ge=0)" + }, + { + "name": "max_delay_seconds", + "type": "int", + "default": "Field(default=3600, ge=0)" + } + ], + "line": 14, + "doc": "Retry settings for local durable task queues." + }, + { + "name": "LocalTaskEnvelope", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "task_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "module_id", + "type": "str", + "default": "Field(pattern='^[a-z][a-z0-9-]{1,63}$')" + }, + { + "name": "task_type", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "status", + "type": "TaskStatus", + "default": "'queued'" + }, + { + "name": "payload", + "type": "dict[str, Any]", + "default": "Field(default_factory=dict)" + }, + { + "name": "attempt_count", + "type": "int", + "default": "Field(default=0, ge=0)" + }, + { + "name": "queued_at", + "type": "datetime", + "default": "Field(default_factory=lambda: datetime.now(UTC))" + }, + { + "name": "available_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "last_error", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "idempotency_key", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "audit_subject_id", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "claim_token", + "type": "str | None", + "default": "None" + }, + { + "name": "lease_expires_at", + "type": "datetime | None", + "default": "None" + } + ], + "line": 24, + "doc": "Storage-neutral task record for module-owned persistence." + }, + { + "name": "LocalTaskResult", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "task", + "type": "LocalTaskEnvelope", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "retry_at", + "type": "datetime | None", + "default": "None" + } + ], + "line": 52, + "doc": "Result returned after recording a local task attempt." + }, + { + "name": "TaskQueueSummary", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "total", + "type": "int", + "default": "" + }, + { + "name": "counts", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "blocked", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + } + ], + "line": 62, + "doc": "Counts and operator copy for a module task queue." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/provenance/__init__.py", + "sha256": "0f703072d5ba898b13a2683285eb8d57e66815356391103f27d63237467d0ab8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/provenance/contracts.py", + "sha256": "56dfe26f57056ae1ea85fb8eb808a5259700609483d8e14e67625e123040d57c", + "routes": [], + "models": [ + { + "name": "CitationTarget", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "label", + "type": "str | None", + "default": "None" + }, + { + "name": "page", + "type": "int | None", + "default": "Field(default=None, ge=1)" + }, + { + "name": "section", + "type": "str | None", + "default": "None" + }, + { + "name": "line_start", + "type": "int | None", + "default": "Field(default=None, ge=1)" + }, + { + "name": "line_end", + "type": "int | None", + "default": "Field(default=None, ge=1)" + }, + { + "name": "parcel_id", + "type": "str | None", + "default": "None" + }, + { + "name": "anchor", + "type": "str | None", + "default": "None" + } + ], + "line": 41, + "doc": "Locator that lets an export cite a precise place in a source." + }, + { + "name": "SourceReference", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "kind", + "type": "SourceKind", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "source_system", + "type": "str | None", + "default": "None" + }, + { + "name": "source_path", + "type": "str | None", + "default": "None" + }, + { + "name": "source_url", + "type": "str | None", + "default": "None" + }, + { + "name": "captured_at", + "type": "datetime", + "default": "Field(default_factory=_utc_now)" + }, + { + "name": "checksum", + "type": "str | None", + "default": "None" + }, + { + "name": "retention_hint", + "type": "str | None", + "default": "None" + }, + { + "name": "sensitivity_label", + "type": "str | None", + "default": "None" + }, + { + "name": "citation_locator", + "type": "CitationTarget | None", + "default": "Field(default=None, validation_alias=AliasChoices('citation_locator', 'citation'))" + } + ], + "line": 55, + "doc": "Metadata for an original source used by Townlight Core." + }, + { + "name": "DocumentMetadata", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "document_id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "source", + "type": "SourceReference", + "default": "" + }, + { + "name": "document_type", + "type": "str | None", + "default": "None" + }, + { + "name": "created_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "captured_at", + "type": "datetime", + "default": "Field(default_factory=_utc_now)" + }, + { + "name": "checksum", + "type": "str | None", + "default": "None" + }, + { + "name": "retention_hint", + "type": "str | None", + "default": "None" + }, + { + "name": "sensitivity_label", + "type": "str | None", + "default": "None" + } + ], + "line": 81, + "doc": "Document-level descriptive metadata for export manifests." + }, + { + "name": "ProvenanceBundle", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "bundle_id", + "type": "str", + "default": "" + }, + { + "name": "generated_at", + "type": "datetime", + "default": "Field(default_factory=_utc_now)" + }, + { + "name": "sources", + "type": "list[SourceReference]", + "default": "Field(default_factory=list)" + }, + { + "name": "documents", + "type": "list[DocumentMetadata]", + "default": "Field(default_factory=list)" + } + ], + "line": 104, + "doc": "Serializable manifest of sources and documents behind an export." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/release_provenance.py", + "sha256": "52df52fe6354b741a0cfb759156601fc6682aa34caed7cead9e624ac70e1faf7", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "GH_TOKEN", + "default": "", + "line": 62 + }, + { + "variable": "GITHUB_TOKEN", + "default": "", + "line": 62 + } + ] + }, + { + "source": "installed-owned-source/townlight_core/scaffold/__init__.py", + "sha256": "313ad60b0afe49ab6d7632c99d96a13deec90466a74e1d4d375a6c663e4a2266", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/scaffold/__main__.py", + "sha256": "926a8bb2eede99ffb44ac34a5ff57950df4de748280d37edb38a8cf1c8441819", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/scaffold/cli.py", + "sha256": "a2228cce93986f97ae26cbdc5ce402ea31c5e83685b6b2cf31c1e52a4ee669d5", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/scaffold/project.py", + "sha256": "343d74719e25beec71fdc0b855f4e1a38db1e338e3a4b62ef1c7b3951e070587", + "routes": [], + "models": [ + { + "name": "PlannedFile", + "bases": [], + "fields": [ + { + "name": "relative_path", + "type": "str", + "default": "" + }, + { + "name": "content", + "type": "str", + "default": "" + }, + { + "name": "executable", + "type": "bool", + "default": "False" + } + ], + "line": 33, + "doc": "One file the generator will create, relative to the project root." + }, + { + "name": "ProjectPlan", + "bases": [], + "fields": [ + { + "name": "spec", + "type": "ModuleSpec", + "default": "" + }, + { + "name": "project_root_name", + "type": "str", + "default": "" + }, + { + "name": "files", + "type": "tuple[PlannedFile, ...]", + "default": "field(default_factory=tuple)" + } + ], + "line": 46, + "doc": "" + }, + { + "name": "GenerationResult", + "bases": [], + "fields": [ + { + "name": "spec", + "type": "ModuleSpec", + "default": "" + }, + { + "name": "project_root", + "type": "Path", + "default": "" + }, + { + "name": "created", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "dry_run", + "type": "bool", + "default": "" + } + ], + "line": 57, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/scaffold/spec.py", + "sha256": "603e6d89700bf64b4ffc285c06446b9cf9f66b318613de01ca8b5ef94cc134d2", + "routes": [], + "models": [ + { + "name": "ModuleSpec", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "module_id", + "type": "str", + "default": "Field(pattern=MODULE_ID_PATTERN)" + }, + { + "name": "name", + "type": "str", + "default": "Field(min_length=1, max_length=120)" + }, + { + "name": "description", + "type": "str", + "default": "Field(min_length=12, max_length=500)" + }, + { + "name": "version", + "type": "str", + "default": "'0.1.0'" + }, + { + "name": "townlight_core_min_version", + "type": "str", + "default": "'1.3.0.dev1'" + }, + { + "name": "permission_key", + "type": "str | None", + "default": "Field(default=None, pattern=SLUG_PATTERN)" + }, + { + "name": "staff_roles", + "type": "tuple[str, ...]", + "default": "('staff',)" + }, + { + "name": "route_path", + "type": "str | None", + "default": "Field(default=None, pattern=ROUTE_PATH_PATTERN)" + } + ], + "line": 65, + "doc": "Everything the generator needs, already validated.\n\n``module_id`` is the only identity; ``package_name``, import path, env-var\nprefix and migration revision ids are derived from it so a caller cannot\ncreate an inconsistent project." + }, + { + "name": "ScaffoldOptions", + "bases": [], + "fields": [ + { + "name": "dry_run", + "type": "bool", + "default": "False" + } + ], + "line": 165, + "doc": "Non-identity options, kept out of the persisted manifest." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/scheduling/__init__.py", + "sha256": "f887d66fc8bf298e094c46bae19fa42b67e5d26911522913d8c5a546d606b4cc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/scheduling/cron.py", + "sha256": "a7c5688dc5a3e5c410466cc92a7d884a88a50fe92974d0a7642b0fbe954f0b08", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/search/__init__.py", + "sha256": "2450f3768c47b0e2869ca1056b188d41b9ba58f88a0865cad5ad854f03801908", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/security/__init__.py", + "sha256": "376e78b0875c2fd3074935b586cef2b806c371f140085ffc40eeb6aed09b9211", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/security/at_rest.py", + "sha256": "eb339fa93cff4af29df7f01b3f5552fff56c6bdc676fef6cb9aad8356a610d3e", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/security/config_validation.py", + "sha256": "e4064bf0394ffc7cdc0aafccfc689a2a17667cfd31d8455dc6f8a623d963af45", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/security/host_validation.py", + "sha256": "3e62ec5540713eea903409c88c4e2255b0dd8d54a9d5d23fc69ad15e03c15045", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/tasks/__init__.py", + "sha256": "2b30985e76210900397d5e65b5060786e8fec6478d8762690e8971a37c49d5f1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/tasks/artifacts.py", + "sha256": "fbb9db7c76ce4b3bd91b3412ba2cfdcc52d3c67959ef117a0a765ee9dc3d972f", + "routes": [], + "models": [ + { + "name": "JobArtifact", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "artifact_id", + "type": "Mapped[str]", + "default": "mapped_column(String(64), primary_key=True)" + }, + { + "name": "task_id", + "type": "Mapped[str]", + "default": "mapped_column(String(128), index=True)" + }, + { + "name": "module_id", + "type": "Mapped[str]", + "default": "mapped_column(String(64))" + }, + { + "name": "task_type", + "type": "Mapped[str]", + "default": "mapped_column(String(100))" + }, + { + "name": "claim_token", + "type": "Mapped[str]", + "default": "mapped_column(String(64))" + }, + { + "name": "attempt_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "artifact_name", + "type": "Mapped[str]", + "default": "mapped_column(String(200))" + }, + { + "name": "relative_path", + "type": "Mapped[str]", + "default": "mapped_column(String(400))" + }, + { + "name": "artifact_sha256", + "type": "Mapped[str]", + "default": "mapped_column(String(64))" + }, + { + "name": "artifact_bytes", + "type": "Mapped[int]", + "default": "mapped_column(BigInteger, default=0)" + }, + { + "name": "artifact_kind", + "type": "Mapped[str]", + "default": "mapped_column(String(40))" + }, + { + "name": "source_sha256", + "type": "Mapped[str]", + "default": "mapped_column(String(64))" + }, + { + "name": "source_label", + "type": "Mapped[str]", + "default": "mapped_column(String(200))" + }, + { + "name": "recorded_by", + "type": "Mapped[str]", + "default": "mapped_column(String(128))" + }, + { + "name": "recorded_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True))" + } + ], + "line": 96, + "doc": "Append-only acceptance record for one artifact produced by one claimed job." + }, + { + "name": "ArtifactStore", + "bases": [], + "fields": [ + { + "name": "root", + "type": "Path", + "default": "" + } + ], + "line": 119, + "doc": "A configured artifact root. Every published path must resolve inside it." + }, + { + "name": "SourceBinding", + "bases": [], + "fields": [ + { + "name": "sha256", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + } + ], + "line": 141, + "doc": "The synthetic or real source a derivative was computed from." + }, + { + "name": "ArtifactProposal", + "bases": [], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "kind", + "type": "str", + "default": "" + }, + { + "name": "content", + "type": "bytes", + "default": "" + }, + { + "name": "source", + "type": "SourceBinding", + "default": "" + } + ], + "line": 149, + "doc": "Caller-supplied intent. The hash is recomputed and never taken from here." + }, + { + "name": "PreparedArtifact", + "bases": [], + "fields": [ + { + "name": "store", + "type": "ArtifactStore", + "default": "" + }, + { + "name": "staging_path", + "type": "Path", + "default": "" + }, + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "kind", + "type": "str", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "" + }, + { + "name": "size", + "type": "int", + "default": "" + }, + { + "name": "source", + "type": "SourceBinding", + "default": "" + } + ], + "line": 159, + "doc": "A staged, hash-verified file that is not yet published or recorded." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/tasks/leased.py", + "sha256": "eef2a9e339274c1caccde7cb3295a9d5bd88da6561090cbfc0a6bf10c8d29e1d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/tasks/registry.py", + "sha256": "96bf04036bdc4be3b9097d7bc85f447105fd5d82e8ef548cd3d88354f7b3fce8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/tasks/worker.py", + "sha256": "106d83f412c66d939e5d9a55276b51020c078ee89763135dc53f7c02ae20f76f", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "DATABASE_URL", + "default": "", + "line": 34 + }, + { + "variable": "TOWNLIGHT_CORE_TASK_HANDLER_MODULES", + "default": "", + "line": 37 + } + ] + }, + { + "source": "installed-owned-source/townlight_core/testing/__init__.py", + "sha256": "359cfd4ae5b7324db08f496a0ee5043456f1ce60a4ae34fa75761a8790b88d50", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/testing/mock_city.py", + "sha256": "c1bac5478d09e0958115da8d4f55f4d5211ec1531062e76829381f5a6c47e389", + "routes": [], + "models": [ + { + "name": "MockCityVendorContract", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "vendor_name", + "type": "str", + "default": "" + }, + { + "name": "interface_status", + "type": "str", + "default": "" + }, + { + "name": "method", + "type": "str", + "default": "" + }, + { + "name": "path", + "type": "str", + "default": "" + }, + { + "name": "auth_method", + "type": "str", + "default": "" + }, + { + "name": "delta_query_param", + "type": "str", + "default": "" + }, + { + "name": "sample_payload", + "type": "dict[str, Any]", + "default": "" + }, + { + "name": "notes", + "type": "str", + "default": "" + } + ], + "line": 90, + "doc": "" + }, + { + "name": "MockCityIdpContract", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "interface_status", + "type": "str", + "default": "" + }, + { + "name": "issuer", + "type": "str", + "default": "" + }, + { + "name": "audience", + "type": "str", + "default": "" + }, + { + "name": "authorization_url", + "type": "str", + "default": "" + }, + { + "name": "token_url", + "type": "str", + "default": "" + }, + { + "name": "jwks_path", + "type": "str", + "default": "" + }, + { + "name": "role_claims", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "algorithms", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "client_id", + "type": "str", + "default": "" + }, + { + "name": "redirect_uri", + "type": "str", + "default": "" + }, + { + "name": "staff_subject", + "type": "str", + "default": "" + }, + { + "name": "staff_email", + "type": "str", + "default": "" + }, + { + "name": "staff_roles", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "notes", + "type": "str", + "default": "" + } + ], + "line": 116, + "doc": "" + }, + { + "name": "MockCityBackupRetentionContract", + "bases": [], + "fields": [ + { + "name": "city", + "type": "str", + "default": "" + }, + { + "name": "interface_status", + "type": "str", + "default": "" + }, + { + "name": "backup_scope", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "restore_proof_required", + "type": "bool", + "default": "" + }, + { + "name": "manifest_required_fields", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "retention_years", + "type": "int", + "default": "" + }, + { + "name": "restore_test_interval_days", + "type": "int", + "default": "" + }, + { + "name": "off_host_storage", + "type": "str", + "default": "" + }, + { + "name": "encryption_at_rest_required", + "type": "bool", + "default": "" + }, + { + "name": "immutable_retention_required", + "type": "bool", + "default": "" + }, + { + "name": "legal_hold_supported", + "type": "bool", + "default": "" + }, + { + "name": "approval_artifact", + "type": "str", + "default": "" + }, + { + "name": "notes", + "type": "str", + "default": "" + } + ], + "line": 154, + "doc": "" + }, + { + "name": "MockCityContractCheck", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "ok", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "normalized_external_meeting_id", + "type": "str | None", + "default": "None" + }, + { + "name": "delta_request_url", + "type": "str | None", + "default": "None" + } + ], + "line": 188, + "doc": "" + }, + { + "name": "MockCityIdpCheck", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "ok", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "auth_method", + "type": "str | None", + "default": "None" + }, + { + "name": "subject", + "type": "str | None", + "default": "None" + }, + { + "name": "roles", + "type": "tuple[str, ...]", + "default": "()" + } + ], + "line": 208, + "doc": "" + }, + { + "name": "MockCityBackupRetentionCheck", + "bases": [], + "fields": [ + { + "name": "city", + "type": "str", + "default": "" + }, + { + "name": "ok", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "checked_fields", + "type": "tuple[str, ...]", + "default": "()" + } + ], + "line": 230, + "doc": "" + }, + { + "name": "DemoTownFixtureContract", + "bases": [], + "fields": [ + { + "name": "schema_version", + "type": "str", + "default": "" + }, + { + "name": "fixture_id", + "type": "str", + "default": "" + }, + { + "name": "fixture_version", + "type": "str", + "default": "" + }, + { + "name": "deterministic_seed", + "type": "str", + "default": "" + }, + { + "name": "generated_at", + "type": "str", + "default": "" + }, + { + "name": "municipality", + "type": "dict[str, Any]", + "default": "" + }, + { + "name": "sources", + "type": "tuple[dict[str, Any], ...]", + "default": "" + }, + { + "name": "records", + "type": "tuple[dict[str, Any], ...]", + "default": "" + }, + { + "name": "requests", + "type": "tuple[dict[str, Any], ...]", + "default": "" + }, + { + "name": "expected", + "type": "dict[str, Any]", + "default": "" + } + ], + "line": 248, + "doc": "Versioned, deterministic and independently authored municipal demo data." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/verification/__init__.py", + "sha256": "79e2b135ad90bfad95db77a54f7d2c65d96eb13bb8ad1ed0a35e3655dc03a0e7", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_core/verification/browser_evidence.py", + "sha256": "493219d45f5c50d5c514a4ea9534ccfab35979d0c58a577a2e9afd01328c7fe1", + "routes": [], + "models": [ + { + "name": "BrowserReleaseEvidenceResult", + "bases": [], + "fields": [ + { + "name": "version", + "type": "str", + "default": "" + }, + { + "name": "reviewed_at", + "type": "str", + "default": "" + }, + { + "name": "page", + "type": "Path", + "default": "" + }, + { + "name": "screenshots", + "type": "dict[str, Path]", + "default": "" + } + ], + "line": 23, + "doc": "" + } + ], + "configuration": [] + } + ], + "bridge": [ + { + "source": "installed-owned-source/townlight_runtime/services.py", + "sha256": "5dfb0f58ea1f94185081426a3734905c78624d7bcd5407fd2c4e0fa1fb054a6b", + "routes": [ + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "runtime_health", + "signature": "", + "returns": "", + "line": 439, + "doc": "", + "decorator": "app.get('/health')", + "errors": [] + }, + { + "method": "GET", + "path": "/modules", + "router": "app", + "prefix_resolved": true, + "name": "runtime_health", + "signature": "", + "returns": "", + "line": 439, + "doc": "", + "decorator": "app.get('/modules')", + "errors": [] + }, + { + "method": "GET", + "path": "/ready", + "router": "app", + "prefix_resolved": true, + "name": "domain_ready", + "signature": "", + "returns": "", + "line": 444, + "doc": "", + "decorator": "app.get('/ready')", + "errors": [] + } + ], + "models": [], + "configuration": [ + { + "variable": "TOWNLIGHT_PROFILE_ROOT", + "default": "", + "line": 56 + }, + { + "variable": "TOWNLIGHT_DATA_DIR", + "default": "", + "line": 61 + }, + { + "variable": "LOCALAPPDATA", + "default": "", + "line": 64 + }, + { + "variable": "DATABASE_URL", + "default": "", + "line": 148 + }, + { + "variable": "TOWNLIGHT_RUNTIME_HOST", + "default": "DEFAULT_HOST", + "line": 479 + }, + { + "variable": "TESTING", + "default": "", + "line": 113 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "''", + "line": 240 + }, + { + "variable": "DATABASE_URL", + "default": "", + "line": 300 + }, + { + "variable": "TOWNLIGHT_RUNTIME_PORT", + "default": "str(DEFAULT_PORT)", + "line": 482 + } + ] + } + ] + }, + "records": { + "package": "app", + "source": [ + { + "source": "installed-owned-source/app/__init__.py", + "sha256": "faef907da0d1b1e4b467dc711514a24f6112ff32809ee7e7e6065c684ab7f2b9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/admin/__init__.py", + "sha256": "5724a9ba19246885896a1603eecc360d7cb5b5cc6c745f635553158f7c46431d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/admin/router.py", + "sha256": "daea85a6114138f50a2a3da4bff8736c1140174599440b07cac35aee27694b7d", + "routes": [ + { + "method": "GET", + "path": "/admin/status", + "router": "router", + "prefix_resolved": true, + "name": "system_status", + "signature": "request: Request, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 53, + "doc": "", + "decorator": "router.get('/status', response_model=SystemStatus)", + "errors": [] + }, + { + "method": "GET", + "path": "/admin/users", + "router": "router", + "prefix_resolved": true, + "name": "list_users", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 100, + "doc": "List all users. Admin only.", + "decorator": "router.get('/users', response_model=list[UserRead])", + "errors": [] + }, + { + "method": "POST", + "path": "/admin/users", + "router": "router", + "prefix_resolved": true, + "name": "create_user", + "signature": "body: AdminUserCreateRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 127, + "doc": "Create a new user. Admin only.", + "decorator": "router.post('/users', response_model=AdminUserCreateResponse, status_code=201)", + "errors": [ + "_HTTPException(status_code=422, detail=f'Invalid role: {body.role}')", + "_HTTPException(status_code=400, detail=str(e))" + ] + }, + { + "method": "PATCH", + "path": "/admin/users/{user_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_user", + "signature": "user_id: uuid.UUID, body: UserUpdateRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 178, + "doc": "Update user fields. Admin only.\n\nGuards against self-demotion: admins cannot change their own role.", + "decorator": "router.patch('/users/{user_id}', response_model=AdminUserCreateResponse)", + "errors": [ + "HTTPException(status_code=404, detail='User not found')", + "HTTPException(status_code=400, detail='Cannot change your own role. Another admin must do this.')", + "HTTPException(status_code=400, detail='Cannot deactivate your own account.')", + "HTTPException(status_code=422, detail=f'Invalid role: {body.role}')" + ] + }, + { + "method": "GET", + "path": "/admin/models", + "router": "router", + "prefix_resolved": true, + "name": "list_models", + "signature": "user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 239, + "doc": "", + "decorator": "router.get('/models', response_model=OllamaStatus)", + "errors": [] + }, + { + "method": "GET", + "path": "/admin/models/registry", + "router": "router", + "prefix_resolved": true, + "name": "list_model_registry", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 265, + "doc": "", + "decorator": "router.get('/models/registry', response_model=list[ModelRegistryRead])", + "errors": [] + }, + { + "method": "POST", + "path": "/admin/models/registry", + "router": "router", + "prefix_resolved": true, + "name": "register_model", + "signature": "data: ModelRegistryCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 276, + "doc": "", + "decorator": "router.post('/models/registry', response_model=ModelRegistryRead, status_code=201)", + "errors": [] + }, + { + "method": "PATCH", + "path": "/admin/models/registry/{model_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_model_registry", + "signature": "model_id: int, data: ModelRegistryUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 305, + "doc": "", + "decorator": "router.patch('/models/registry/{model_id}', response_model=ModelRegistryRead)", + "errors": [ + "HTTPException(status_code=404, detail='Model not found')" + ] + }, + { + "method": "DELETE", + "path": "/admin/models/registry/{model_id}", + "router": "router", + "prefix_resolved": true, + "name": "delete_model_registry", + "signature": "model_id: int, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 330, + "doc": "", + "decorator": "router.delete('/models/registry/{model_id}', status_code=204)", + "errors": [ + "HTTPException(status_code=404, detail='Model not found')" + ] + }, + { + "method": "GET", + "path": "/admin/fee-schedules", + "router": "router", + "prefix_resolved": true, + "name": "list_fee_schedules", + "signature": "jurisdiction: str | None=None, limit: int=50, offset: int=0, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 354, + "doc": "List all fee schedules. Admin only.", + "decorator": "router.get('/fee-schedules', response_model=list[FeeScheduleRead])", + "errors": [] + }, + { + "method": "POST", + "path": "/admin/fee-schedules", + "router": "router", + "prefix_resolved": true, + "name": "create_fee_schedule", + "signature": "data: FeeScheduleCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 371, + "doc": "Create a new fee schedule. Admin only.", + "decorator": "router.post('/fee-schedules', response_model=FeeScheduleRead, status_code=201)", + "errors": [] + }, + { + "method": "PATCH", + "path": "/admin/fee-schedules/{schedule_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_fee_schedule", + "signature": "schedule_id: uuid.UUID, data: FeeScheduleUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 398, + "doc": "Update a fee schedule. Admin only.", + "decorator": "router.patch('/fee-schedules/{schedule_id}', response_model=FeeScheduleRead)", + "errors": [ + "HTTPException(status_code=404, detail='Fee schedule not found')" + ] + }, + { + "method": "DELETE", + "path": "/admin/fee-schedules/{schedule_id}", + "router": "router", + "prefix_resolved": true, + "name": "delete_fee_schedule", + "signature": "schedule_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 424, + "doc": "Delete a fee schedule. Admin only.", + "decorator": "router.delete('/fee-schedules/{schedule_id}', status_code=204)", + "errors": [ + "HTTPException(status_code=404, detail='Fee schedule not found')" + ] + }, + { + "method": "GET", + "path": "/admin/coverage-gaps", + "router": "router", + "prefix_resolved": true, + "name": "get_coverage_gaps", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 454, + "doc": "Identify coverage gaps across jurisdictions, departments, and exemption categories.\n\nReturns:\n- Jurisdictions (state codes) that have no exemption rules\n- Departments with no assigned staff users\n- Exemption categories without any active rules", + "decorator": "router.get('/coverage-gaps', response_model=CoverageGapResponse)", + "errors": [] + } + ], + "models": [ + { + "name": "SystemStatus", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "version", + "type": "str", + "default": "" + }, + { + "name": "database", + "type": "str", + "default": "" + }, + { + "name": "ollama", + "type": "str", + "default": "" + }, + { + "name": "redis", + "type": "str", + "default": "" + }, + { + "name": "user_count", + "type": "int", + "default": "" + }, + { + "name": "audit_log_count", + "type": "int", + "default": "" + }, + { + "name": "suite_session", + "type": "dict | None", + "default": "None" + } + ], + "line": 31, + "doc": "" + }, + { + "name": "OllamaModelInfo", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "size", + "type": "int | None", + "default": "None" + }, + { + "name": "details", + "type": "dict | None", + "default": "None" + } + ], + "line": 41, + "doc": "" + }, + { + "name": "OllamaStatus", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "models", + "type": "list[OllamaModelInfo]", + "default": "" + } + ], + "line": 47, + "doc": "" + }, + { + "name": "AdminUserCreateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "email", + "type": "str", + "default": "" + }, + { + "name": "password", + "type": "str", + "default": "" + }, + { + "name": "full_name", + "type": "str", + "default": "''" + }, + { + "name": "role", + "type": "str", + "default": "'staff'" + } + ], + "line": 109, + "doc": "" + }, + { + "name": "AdminUserCreateResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "email", + "type": "str", + "default": "" + }, + { + "name": "full_name", + "type": "str", + "default": "" + }, + { + "name": "role", + "type": "str", + "default": "" + }, + { + "name": "is_active", + "type": "bool", + "default": "" + } + ], + "line": 116, + "doc": "" + }, + { + "name": "UserUpdateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "full_name", + "type": "str | None", + "default": "None" + }, + { + "name": "role", + "type": "str | None", + "default": "None" + }, + { + "name": "department_id", + "type": "uuid.UUID | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool | None", + "default": "None" + } + ], + "line": 170, + "doc": "" + }, + { + "name": "CoverageGapResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "jurisdictions_without_rules", + "type": "list[str]", + "default": "" + }, + { + "name": "departments_without_staff", + "type": "list[dict]", + "default": "" + }, + { + "name": "uncovered_categories", + "type": "list[str]", + "default": "" + }, + { + "name": "total_gaps", + "type": "int", + "default": "" + } + ], + "line": 446, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/analytics/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/analytics/router.py", + "sha256": "a82bc140c0e152301bc9583a8a291974876f068eb3a4fac1b342056ecb217316", + "routes": [ + { + "method": "GET", + "path": "/analytics/operational", + "router": "router", + "prefix_resolved": false, + "name": "get_operational_metrics", + "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 33, + "doc": "", + "decorator": "router.get('/analytics/operational', response_model=OperationalMetrics)", + "errors": [] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/audit/__init__.py", + "sha256": "35d25b33770f3cd458121ab4d8a6cdb87c32e7b8282bb674c8bf93bca6a5d82d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/audit/logger.py", + "sha256": "1ad570f68753023d56827f8fa672822e50e234d32259b218682b815ee02cd0e8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/audit/middleware.py", + "sha256": "c9283a66fbe43933edf30895e9b242380a99769127bd6536937dd56652e01a96", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/audit/router.py", + "sha256": "fc933066a2355e924c0f7c359d9249591c0f8024eadc455246b4b0b536f7d67f", + "routes": [ + { + "method": "GET", + "path": "/audit/logs", + "router": "router", + "prefix_resolved": true, + "name": "list_audit_logs", + "signature": "query: AuditLogQuery=Depends(), session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 16, + "doc": "", + "decorator": "router.get('/logs', response_model=list[AuditLogRead])", + "errors": [] + }, + { + "method": "GET", + "path": "/audit/verify", + "router": "router", + "prefix_resolved": true, + "name": "verify_audit_chain", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 40, + "doc": "", + "decorator": "router.get('/verify', response_model=AuditChainVerification)", + "errors": [] + }, + { + "method": "GET", + "path": "/audit/export", + "router": "router", + "prefix_resolved": true, + "name": "export_audit_logs", + "signature": "format: str='json', start_date: str | None=None, end_date: str | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 51, + "doc": "", + "decorator": "router.get('/export')", + "errors": [] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/__init__.py", + "sha256": "40ae31146583108d88187effd6cdc081314021177425b6bdb1cb7b72530d5c4b", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/backend.py", + "sha256": "5a91017634252d0e8c959fa1ec1ae2163b118a4901ecc0bb1233448e8ca498bb", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/department_authority.py", + "sha256": "f234cf04a5755dc3c0bd76230ef5145d4e7d26876c21b6776924ed95ea3e80eb", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/dependencies.py", + "sha256": "28390a14cf9b4550ed09772d0f8c922e4e27cfb75639dd7d853dbeea1e28433d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/desktop_session.py", + "sha256": "ce8ff9e910ca8b7f36d8c8616a65d593d48fba3588538edfa6731ea6ada8a36b", + "routes": [], + "models": [ + { + "name": "NativeDesktopPrincipal", + "bases": [], + "fields": [ + { + "name": "email", + "type": "str", + "default": "" + }, + { + "name": "display_name", + "type": "str", + "default": "" + }, + { + "name": "role", + "type": "str", + "default": "" + }, + { + "name": "expires_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 39, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/manager.py", + "sha256": "337f7d5b6d89973c352259c21512da56e6308a6e3e6967f035a31916b52c2bbb", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/native_identity.py", + "sha256": "3d2536b13f38c52d93c4ab54887bf232a3b9181fe1b485165e1fd6a81fe687d0", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/router.py", + "sha256": "9574ed42379df9ef05d9c13409c01f715538e00bb9e3c884b884cd2c1c8495fc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/auth/suite_session.py", + "sha256": "126a453ff01029cfe7abbbb5a3ecbf6c3ba562957ce929eb7854ff682576d071", + "routes": [], + "models": [ + { + "name": "SuiteSessionUser", + "bases": [], + "fields": [ + { + "name": "email", + "type": "str", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "must_change_password", + "type": "bool", + "default": "False" + } + ], + "line": 180, + "doc": "" + }, + { + "name": "SuiteSession", + "bases": [], + "fields": [ + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "session_id", + "type": "str", + "default": "" + } + ], + "line": 187, + "doc": "" + }, + { + "name": "Principal", + "bases": [], + "fields": [ + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "session_id", + "type": "str", + "default": "" + } + ], + "line": 85, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/catalog/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/catalog/loader.py", + "sha256": "8ec0239d327824d28d18425904c64ef2bbfc2d04c65a4c5deb64904d5354912d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/catalog/router.py", + "sha256": "8720ef17e4106e738c2ed3672af4051dfe36b617a9da8eae8fa54a9c23de13d8", + "routes": [ + { + "method": "GET", + "path": "/catalog/domains", + "router": "router", + "prefix_resolved": false, + "name": "list_domains", + "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 12, + "doc": "", + "decorator": "router.get('/catalog/domains')", + "errors": [] + }, + { + "method": "GET", + "path": "/catalog/systems", + "router": "router", + "prefix_resolved": false, + "name": "list_systems", + "signature": "domain: str | None=None, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 16, + "doc": "", + "decorator": "router.get('/catalog/systems')", + "errors": [] + }, + { + "method": "GET", + "path": "/catalog/connectors", + "router": "router", + "prefix_resolved": false, + "name": "list_connectors", + "signature": "domain: str, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 20, + "doc": "", + "decorator": "router.get('/catalog/connectors')", + "errors": [] + }, + { + "method": "POST", + "path": "/catalog/load", + "router": "router", + "prefix_resolved": false, + "name": "trigger_catalog_load", + "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 24, + "doc": "", + "decorator": "router.post('/catalog/load', status_code=200)", + "errors": [ + "HTTPException(409, 'Catalog missing, changed or incomplete; existing data preserved. Review a new catalog version.')" + ] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/city_profile/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/city_profile/router.py", + "sha256": "e0b9d83c16dcb8e6ad6b2ca3bd2c4300ff0aa9ff89609a7f5bd7cc5dde835682", + "routes": [ + { + "method": "GET", + "path": "/city-profile", + "router": "router", + "prefix_resolved": false, + "name": "get_city_profile", + "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 32, + "doc": "", + "decorator": "router.get('/city-profile', response_model=CityProfileRead | None)", + "errors": [] + }, + { + "method": "POST", + "path": "/city-profile", + "router": "router", + "prefix_resolved": false, + "name": "create_city_profile", + "signature": "data: CityProfileCreate, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 42, + "doc": "", + "decorator": "router.post('/city-profile', response_model=CityProfileRead, status_code=201)", + "errors": [ + "HTTPException(409, 'City profile already exists. Use PATCH to update.')" + ] + }, + { + "method": "PATCH", + "path": "/city-profile", + "router": "router", + "prefix_resolved": false, + "name": "update_city_profile", + "signature": "data: CityProfileUpdate, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 76, + "doc": "", + "decorator": "router.patch('/city-profile', response_model=CityProfileRead)", + "errors": [ + "HTTPException(404, 'No city profile exists. Use POST to create one.')" + ] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/config.py", + "sha256": "52725fbeb02c75717ae638e8d0cdf2d527656fb8bac5b5b5572d48d6e794a1c5", + "routes": [], + "models": [ + { + "name": "Settings", + "bases": [ + "BaseSettings" + ], + "fields": [ + { + "name": "database_url", + "type": "str", + "default": "'postgresql+asyncpg://townlight_records:townlight_records@postgres:5432/townlight_records'" + }, + { + "name": "jwt_secret", + "type": "str", + "default": "'CHANGE-ME'" + }, + { + "name": "jwt_secret_file", + "type": "str", + "default": "'/run/secrets/jwt_secret'" + }, + { + "name": "jwt_lifetime_seconds", + "type": "int", + "default": "3600" + }, + { + "name": "first_admin_email", + "type": "str", + "default": "'admin@example.gov'" + }, + { + "name": "first_admin_password", + "type": "str", + "default": "'CHANGE-ME'" + }, + { + "name": "first_admin_password_file", + "type": "str", + "default": "'/run/secrets/first_admin_password'" + }, + { + "name": "ollama_base_url", + "type": "str", + "default": "'http://ollama:11434'" + }, + { + "name": "redis_url", + "type": "str", + "default": "'redis://redis:6379/0'" + }, + { + "name": "audit_retention_days", + "type": "int", + "default": "1095" + }, + { + "name": "cors_origins", + "type": "list[str]", + "default": "['http://localhost:8080']" + }, + { + "name": "embedding_model", + "type": "str", + "default": "'nomic-embed-text'" + }, + { + "name": "chat_model", + "type": "str", + "default": "'gemma4:e4b'" + }, + { + "name": "vision_model", + "type": "str", + "default": "'gemma4:e4b'" + }, + { + "name": "smtp_host", + "type": "str", + "default": "''" + }, + { + "name": "smtp_port", + "type": "int", + "default": "587" + }, + { + "name": "smtp_username", + "type": "str", + "default": "''" + }, + { + "name": "smtp_password", + "type": "str", + "default": "''" + }, + { + "name": "smtp_from_email", + "type": "str", + "default": "'noreply@townlight_records.local'" + }, + { + "name": "smtp_use_tls", + "type": "bool", + "default": "True" + }, + { + "name": "connector_host_allowlist", + "type": "Annotated[list[str], NoDecode]", + "default": "[]" + }, + { + "name": "portal_mode", + "type": "Literal['public', 'private']", + "default": "'private'" + }, + { + "name": "encryption_key", + "type": "str", + "default": "'CHANGE-ME-generate-with-fernet-generate-key'" + }, + { + "name": "testing", + "type": "bool", + "default": "False" + }, + { + "name": "authority_scope_id", + "type": "str", + "default": "''" + } + ], + "line": 24, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/connectors/__init__.py", + "sha256": "858f35a785e1714492e27337991099f9891ab9e0b6325427213d0458b7e7508f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/connectors/base.py", + "sha256": "61772e641cda2c08df5c95ce7cbefe725b550b1fd67f54cb550ea847c9927688", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/connectors/file_system.py", + "sha256": "d61c6ed4b906cb10697949ed9810ce14853301af1706cc02ba6605fec1d385a6", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/connectors/imap_email.py", + "sha256": "a6353f14d4f083e999e089bd8c536438a9355ac0bab5c94b03ab30f4f0ef084d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/connectors/manual_drop.py", + "sha256": "4130a495cb691d56d6c9cc493bf85edb520f86c89846a241ed216ca652b4d2ac", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/connectors/odbc.py", + "sha256": "636c23aa66537775c674efe095a1c9e27dc670a6370a742e325c1ea5039243db", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/connectors/rest_api.py", + "sha256": "52e26ea1923a25ed7704f090e37745be39a0fb80e38a4b5cdb315a08d16373f2", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/connectors/retry.py", + "sha256": "bba511cd51d7727835e24540b5c8c4660dbab43776d34cbaf2a618b207c36726", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/database.py", + "sha256": "cbf900a24999134b812e06749cd897a8f36e1885a05fb6b837363788ae2e990f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/datasources/__init__.py", + "sha256": "f8a2f02b77cc7a4a879305cceee97e5ee272213e93c635792e42a1c3e5afaa75", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/datasources/router.py", + "sha256": "67dc17fea9f4259bcf8c4f376c447bdcd775ae59fd6e805a981873fe87bf36c4", + "routes": [ + { + "method": "POST", + "path": "/datasources/", + "router": "router", + "prefix_resolved": true, + "name": "create_datasource", + "signature": "data: DataSourceCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 70, + "doc": "", + "decorator": "router.post('/', response_model=DataSourceAdminRead, status_code=201)", + "errors": [ + "HTTPException(status_code=409, detail='Name already taken')" + ] + }, + { + "method": "GET", + "path": "/datasources/", + "router": "router", + "prefix_resolved": true, + "name": "list_datasources", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 89, + "doc": "", + "decorator": "router.get('/', response_model=list[DataSourceRead])", + "errors": [] + }, + { + "method": "PATCH", + "path": "/datasources/{source_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_datasource", + "signature": "source_id: uuid.UUID, data: DataSourceUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 137, + "doc": "", + "decorator": "router.patch('/{source_id}', response_model=DataSourceAdminRead)", + "errors": [ + "HTTPException(status_code=404, detail='Data source not found')" + ] + }, + { + "method": "POST", + "path": "/datasources/{source_id}/ingest", + "router": "router", + "prefix_resolved": true, + "name": "trigger_ingestion", + "signature": "source_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 156, + "doc": "", + "decorator": "router.post('/{source_id}/ingest')", + "errors": [ + "HTTPException(status_code=404, detail='Data source not found')" + ] + }, + { + "method": "POST", + "path": "/datasources/upload", + "router": "router", + "prefix_resolved": true, + "name": "upload_file", + "signature": "file: UploadFile=File(...), session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 165, + "doc": "", + "decorator": "router.post('/upload')", + "errors": [ + "HTTPException(status_code=413, detail='File too large (max 100 MB)')" + ] + }, + { + "method": "POST", + "path": "/datasources/documents/{document_id}/re-ingest", + "router": "router", + "prefix_resolved": true, + "name": "re_ingest_document", + "signature": "document_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 201, + "doc": "Re-ingest a failed document. Resets status to pending and queues for processing.", + "decorator": "router.post('/documents/{document_id}/re-ingest')", + "errors": [ + "HTTPException(status_code=404, detail='Document not found')", + "HTTPException(status_code=400, detail=f'Can only re-ingest failed documents (current: {doc.ingestion_status.value})')" + ] + }, + { + "method": "GET", + "path": "/datasources/stats", + "router": "router", + "prefix_resolved": true, + "name": "ingestion_stats", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 236, + "doc": "", + "decorator": "router.get('/stats', response_model=IngestionStats)", + "errors": [] + }, + { + "method": "POST", + "path": "/datasources/test-connection", + "router": "router", + "prefix_resolved": true, + "name": "test_connection", + "signature": "body: TestConnectionRequest, user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 277, + "doc": "Test connectivity to a data source without persisting anything.\n\nThis endpoint validates the connection parameters and attempts a test\nconnection. Credentials are NOT persisted, NOT logged, and NOT returned.", + "decorator": "router.post('/test-connection', response_model=TestConnectionResponse)", + "errors": [] + } + ], + "models": [ + { + "name": "TestConnectionRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_type", + "type": "str", + "default": "" + }, + { + "name": "host", + "type": "str | None", + "default": "None" + }, + { + "name": "port", + "type": "int | None", + "default": "None" + }, + { + "name": "path", + "type": "str | None", + "default": "None" + }, + { + "name": "username", + "type": "str | None", + "default": "None" + }, + { + "name": "password", + "type": "str | None", + "default": "None" + }, + { + "name": "rest_api_config", + "type": "dict[str, Any] | None", + "default": "None" + }, + { + "name": "odbc_config", + "type": "dict[str, Any] | None", + "default": "None" + } + ], + "line": 250, + "doc": "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." + }, + { + "name": "TestConnectionResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "success", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "latency_ms", + "type": "int | None", + "default": "None" + }, + { + "name": "status", + "type": "str | None", + "default": "None" + }, + { + "name": "warning", + "type": "str | None", + "default": "None" + }, + { + "name": "differing_keys", + "type": "list[str] | None", + "default": "None" + } + ], + "line": 267, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/datasources/sync_failures_router.py", + "sha256": "6d942272770c5968245a2c2455883971eef01afd28c3fb6620efcf435ae0daa5", + "routes": [ + { + "method": "GET", + "path": "/datasources/{source_id}/sync-failures", + "router": "router", + "prefix_resolved": true, + "name": "list_sync_failures", + "signature": "source_id: uuid.UUID, status: Optional[str]=Query(None, description='Filter by status'), limit: int=Query(50, ge=1, le=500), offset: int=Query(0, ge=0), db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 26, + "doc": "", + "decorator": "router.get('/{source_id}/sync-failures', response_model=list[SyncFailureRead])", + "errors": [] + }, + { + "method": "POST", + "path": "/datasources/{source_id}/sync-failures/{failure_id}/retry", + "router": "router", + "prefix_resolved": true, + "name": "retry_sync_failure", + "signature": "source_id: uuid.UUID, failure_id: uuid.UUID, db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 43, + "doc": "", + "decorator": "router.post('/{source_id}/sync-failures/{failure_id}/retry')", + "errors": [ + "HTTPException(status_code=404, detail='Sync failure not found')" + ] + }, + { + "method": "POST", + "path": "/datasources/{source_id}/sync-failures/{failure_id}/dismiss", + "router": "router", + "prefix_resolved": true, + "name": "dismiss_sync_failure", + "signature": "source_id: uuid.UUID, failure_id: uuid.UUID, db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 59, + "doc": "", + "decorator": "router.post('/{source_id}/sync-failures/{failure_id}/dismiss')", + "errors": [ + "HTTPException(status_code=404, detail='Sync failure not found')" + ] + }, + { + "method": "POST", + "path": "/datasources/{source_id}/sync-failures/retry-all", + "router": "router", + "prefix_resolved": true, + "name": "retry_all_sync_failures", + "signature": "source_id: uuid.UUID, status: str=Query(..., description='Status to reset \u2014 required'), db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 76, + "doc": "", + "decorator": "router.post('/{source_id}/sync-failures/retry-all')", + "errors": [] + }, + { + "method": "POST", + "path": "/datasources/{source_id}/sync-failures/dismiss-all", + "router": "router", + "prefix_resolved": true, + "name": "dismiss_all_sync_failures", + "signature": "source_id: uuid.UUID, status: str=Query(..., description='Status to dismiss \u2014 required'), db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 97, + "doc": "", + "decorator": "router.post('/{source_id}/sync-failures/dismiss-all')", + "errors": [] + }, + { + "method": "POST", + "path": "/datasources/{source_id}/unpause", + "router": "router", + "prefix_resolved": true, + "name": "unpause_source", + "signature": "source_id: uuid.UUID, db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 120, + "doc": "", + "decorator": "router.post('/{source_id}/unpause')", + "errors": [ + "HTTPException(status_code=404, detail='Data source not found')" + ] + }, + { + "method": "GET", + "path": "/datasources/{source_id}/sync-run-log", + "router": "router", + "prefix_resolved": true, + "name": "get_sync_run_log", + "signature": "source_id: uuid.UUID, limit: int=Query(20, ge=1, le=100), db: AsyncSession=Depends(get_async_session), current_user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 137, + "doc": "", + "decorator": "router.get('/{source_id}/sync-run-log', response_model=list[SyncRunLogRead])", + "errors": [] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/departments/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/departments/router.py", + "sha256": "1c5f50b50572ecd7003903f2d3e9433027c86ebffe5a44d821b2e5ed05f0a39d", + "routes": [ + { + "method": "POST", + "path": "/departments/", + "router": "router", + "prefix_resolved": true, + "name": "create_department", + "signature": "data: DepartmentCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 18, + "doc": "", + "decorator": "router.post('/', response_model=DepartmentRead, status_code=201)", + "errors": [ + "HTTPException(status_code=409, detail='Department code already exists')" + ] + }, + { + "method": "GET", + "path": "/departments/", + "router": "router", + "prefix_resolved": true, + "name": "list_departments", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 43, + "doc": "", + "decorator": "router.get('/', response_model=list[DepartmentRead])", + "errors": [] + }, + { + "method": "GET", + "path": "/departments/{dept_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_department", + "signature": "dept_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 54, + "doc": "", + "decorator": "router.get('/{dept_id}', response_model=DepartmentRead)", + "errors": [ + "HTTPException(status_code=404, detail='Department not found')" + ] + }, + { + "method": "PATCH", + "path": "/departments/{dept_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_department", + "signature": "dept_id: uuid.UUID, data: DepartmentUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 66, + "doc": "", + "decorator": "router.patch('/{dept_id}', response_model=DepartmentRead)", + "errors": [ + "HTTPException(status_code=404, detail='Department not found')", + "HTTPException(status_code=409, detail='Department code already exists')" + ] + }, + { + "method": "DELETE", + "path": "/departments/{dept_id}", + "router": "router", + "prefix_resolved": true, + "name": "delete_department", + "signature": "dept_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 100, + "doc": "", + "decorator": "router.delete('/{dept_id}', status_code=204)", + "errors": [ + "HTTPException(status_code=404, detail='Department not found')", + "HTTPException(status_code=409, detail=f'Cannot delete department with {user_count} assigned users')" + ] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/__init__.py", + "sha256": "707138dfa41f7f4e91957a523e3c3394ce52803778c5b278b3cc77d4a5b1c30f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/projection.py", + "sha256": "5267b17ae6be18258ea0e225ffb0d53c56aeaf674d9426856b8db804f801008c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/records.py", + "sha256": "407b2ca9974caa761c00daee3b585ca915c2fe649a69a0dd58f42342b39821d1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/router.py", + "sha256": "7c02e0a222c36aecb84b105a918309a811f40249c3f55756d87cfa2646c4ef1b", + "routes": [ + { + "method": "GET", + "path": "/desktop/v1/public/records-state", + "router": "router", + "prefix_resolved": true, + "name": "public_records_state", + "signature": "request: Request, session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 134, + "doc": "", + "decorator": "router.get('/public/records-state', dependencies=[Depends(native_public_shell)], response_model=RecordsStateRead)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/public/requests", + "router": "router", + "prefix_resolved": true, + "name": "public_records_intake", + "signature": "data: PublicIntake, request: Request, session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 144, + "doc": "", + "decorator": "router.post('/public/requests', dependencies=[Depends(native_public_shell)])", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/public/lookup", + "router": "router", + "prefix_resolved": true, + "name": "public_records_lookup", + "signature": "data: PublicLookup, request: Request, session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 153, + "doc": "", + "decorator": "router.post('/public/lookup', dependencies=[Depends(native_public_shell)])", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/public/messages", + "router": "router", + "prefix_resolved": true, + "name": "public_records_message", + "signature": "data: PublicMessage, request: Request, session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 160, + "doc": "", + "decorator": "router.post('/public/messages', dependencies=[Depends(native_public_shell)])", + "errors": [ + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/permitting-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_permitting_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 204, + "doc": "", + "decorator": "router.post('/permitting-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/permitting-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_permitting_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 213, + "doc": "", + "decorator": "router.post('/requests/{request_id}/permitting-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Reviewed Permitting copy not found or no longer permitted.')", + "HTTPException(409, 'Permitting source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_inspections_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 239, + "doc": "", + "decorator": "router.post('/inspections-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/inspections-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_inspections_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 248, + "doc": "", + "decorator": "router.post('/requests/{request_id}/inspections-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Reviewed Inspections copy not found or no longer permitted.')", + "HTTPException(409, 'Inspections source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/planning-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_planning_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 274, + "doc": "", + "decorator": "router.post('/planning-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/planning-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_planning_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 283, + "doc": "", + "decorator": "router.post('/requests/{request_id}/planning-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Permitted Planning source not found.')", + "HTTPException(409, 'Planning source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_zoning_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 310, + "doc": "", + "decorator": "router.post('/zoning-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/zoning-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_zoning_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 319, + "doc": "", + "decorator": "router.post('/requests/{request_id}/zoning-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Permitted Zoning source not found.')", + "HTTPException(409, 'Zoning source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/records-state", + "router": "router", + "prefix_resolved": true, + "name": "get_native_records_state", + "signature": "session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 346, + "doc": "", + "decorator": "router.get('/records-state', response_model=RecordsStateRead)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_meetings_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 355, + "doc": "", + "decorator": "router.post('/meetings-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/meetings-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_meetings_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 364, + "doc": "", + "decorator": "router.post('/requests/{request_id}/meetings-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Permitted Meetings source not found.')", + "HTTPException(409, 'Meetings source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/code-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_code_sources", + "signature": "data: CodeSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 389, + "doc": "", + "decorator": "router.post('/code-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/code-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_code_source", + "signature": "request_id: uuid.UUID, data: CodeSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 398, + "doc": "", + "decorator": "router.post('/requests/{request_id}/code-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Permitted Code source not found.')", + "HTTPException(409, 'Code source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/notifications/{notification_id}/sent", + "router": "router", + "prefix_resolved": true, + "name": "mark_native_notification_sent", + "signature": "notification_id: uuid.UUID, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 423, + "doc": "", + "decorator": "router.post('/notifications/{notification_id}/sent', response_model=RecordsStateRead)", + "errors": [ + "HTTPException(404, 'Records notification not found.')", + "HTTPException(400, 'This local notification is already marked sent.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/documents", + "router": "router", + "prefix_resolved": true, + "name": "attach_native_document", + "signature": "request_id: uuid.UUID, data: AttachDocument, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 443, + "doc": "", + "decorator": "router.post('/requests/{request_id}/documents', response_model=RecordsOperationRead)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/documents/{attachment_id}/release-copy", + "router": "router", + "prefix_resolved": true, + "name": "attach_native_release_copy", + "signature": "request_id: uuid.UUID, attachment_id: uuid.UUID, data: AttachReleaseCopy, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 453, + "doc": "", + "decorator": "router.post('/requests/{request_id}/documents/{attachment_id}/release-copy', response_model=RecordsOperationRead)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/artifacts", + "router": "router", + "prefix_resolved": true, + "name": "prepare_native_artifact", + "signature": "request_id: uuid.UUID, data: PrepareArtifact, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 463, + "doc": "", + "decorator": "router.post('/requests/{request_id}/artifacts', response_model=ArtifactPlan)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/artifacts/{artifact_id}/complete", + "router": "router", + "prefix_resolved": true, + "name": "complete_native_artifact", + "signature": "request_id: uuid.UUID, artifact_id: uuid.UUID, data: CompleteArtifact, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 481, + "doc": "", + "decorator": "router.post('/requests/{request_id}/artifacts/{artifact_id}/complete', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests", + "router": "router", + "prefix_resolved": true, + "name": "create_native_request", + "signature": "data: StaffRecordsIntake, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 500, + "doc": "", + "decorator": "router.post('/requests', response_model=NativeRequestRead, status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/requests/{request_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_native_request", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 521, + "doc": "", + "decorator": "router.get('/requests/{request_id}', response_model=NativeRequestRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/requests/{request_id}/view", + "router": "router", + "prefix_resolved": true, + "name": "get_native_request_view", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 537, + "doc": "", + "decorator": "router.get('/requests/{request_id}/view', response_model=RecordsView)", + "errors": [ + "HTTPException(404, 'Records request not found.')" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/requests/{request_id}/draft-context", + "router": "router", + "prefix_resolved": true, + "name": "native_draft_context", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 549, + "doc": "", + "decorator": "router.get('/requests/{request_id}/draft-context')", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/generated-draft", + "router": "router", + "prefix_resolved": true, + "name": "native_generated_draft", + "signature": "request_id: uuid.UUID, data: GeneratedDraft, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 575, + "doc": "", + "decorator": "router.post('/requests/{request_id}/generated-draft', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(409, 'The draft changed during generation. Refresh before generating again.')", + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/actions", + "router": "router", + "prefix_resolved": true, + "name": "native_request_operation", + "signature": "request_id: uuid.UUID, command: RecordsCommand, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 605, + "doc": "", + "decorator": "router.post('/requests/{request_id}/actions', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(400, str(error))" + ] + } + ], + "models": [ + { + "name": "MeetingsSearch", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 38, + "doc": "" + }, + { + "name": "MeetingsSourceSelection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=200)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + } + ], + "line": 43, + "doc": "" + }, + { + "name": "CodeSearch", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "as_of", + "type": "date | None", + "default": "None" + } + ], + "line": 49, + "doc": "" + }, + { + "name": "CodeSourceSelection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=200)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + }, + { + "name": "as_of", + "type": "date | None", + "default": "None" + } + ], + "line": 55, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/schemas.py", + "sha256": "753dd5474d532912bc50118fe9add74613cbc3b17a062dd93681309ac590926d", + "routes": [], + "models": [ + { + "name": "StaffRecordsIntake", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "requester", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "summary", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "deadline", + "type": "str", + "default": "" + }, + { + "name": "deadlineBasis", + "type": "str", + "default": "''" + } + ], + "line": 10, + "doc": "Existing native create-records-request input; no caller-supplied actor." + }, + { + "name": "NativeRequestRead", + "bases": [ + "RequestRead" + ], + "fields": [ + { + "name": "desktop_id", + "type": "str | None", + "default": "" + }, + { + "name": "public_tracking_number", + "type": "str | None", + "default": "" + }, + { + "name": "submitted_via", + "type": "str", + "default": "" + }, + { + "name": "deadline_label", + "type": "str", + "default": "" + }, + { + "name": "deadline_basis", + "type": "str", + "default": "" + }, + { + "name": "deadline_reviewed_at", + "type": "datetime | None", + "default": "" + } + ], + "line": 28, + "doc": "" + }, + { + "name": "AssignmentPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "assignedTo", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 41, + "doc": "" + }, + { + "name": "DeadlinePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "deadline", + "type": "str", + "default": "" + }, + { + "name": "deadlineBasis", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 45, + "doc": "" + }, + { + "name": "CalculateDeadlinePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "deadlineReceivedDate", + "type": "str", + "default": "" + }, + { + "name": "deadlineRuleName", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "deadlineDayCount", + "type": "str", + "default": "" + }, + { + "name": "deadlineDayType", + "type": "str", + "default": "" + }, + { + "name": "deadlineBasis", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 52, + "doc": "" + }, + { + "name": "ClarificationPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "clarificationNote", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 77, + "doc": "" + }, + { + "name": "MessagePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "requestMessageBody", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 81, + "doc": "" + }, + { + "name": "SearchNotePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "sourceNote", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "citation", + "type": "str", + "default": "''" + } + ], + "line": 85, + "doc": "" + }, + { + "name": "SearchReceiptPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "searchQuery", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchLocations", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchResultTitle", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchResultCitation", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchResultSummary", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchResultStatus", + "type": "str", + "default": "''" + }, + { + "name": "searchReviewer", + "type": "str", + "default": "''" + } + ], + "line": 90, + "doc": "" + }, + { + "name": "ExemptionNotePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "exemptionNote", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 100, + "doc": "" + }, + { + "name": "ExemptionDecisionPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "exemptionSource", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "exemptionKind", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "exemptionFinding", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "exemptionDecision", + "type": "Literal['release', 'redact', 'exempt']", + "default": "" + }, + { + "name": "exemptionBasis", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "exemptionReviewer", + "type": "str", + "default": "''" + } + ], + "line": 104, + "doc": "" + }, + { + "name": "FeeEstimatePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "feeEstimate", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 118, + "doc": "" + }, + { + "name": "FeeLinePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "feeLineDescription", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "feeScheduleBasis", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "feeLineAmount", + "type": "str", + "default": "" + } + ], + "line": 122, + "doc": "" + }, + { + "name": "FeeWaiverPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "feeWaiverReason", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 140, + "doc": "" + }, + { + "name": "DraftPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "responseDraft", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "citation", + "type": "str", + "default": "''" + } + ], + "line": 144, + "doc": "" + }, + { + "name": "ApprovalPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "approvalNote", + "type": "str", + "default": "''" + } + ], + "line": 149, + "doc": "" + }, + { + "name": "AssignCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['assign-records-request']", + "default": "" + }, + { + "name": "payload", + "type": "AssignmentPayload", + "default": "" + } + ], + "line": 153, + "doc": "" + }, + { + "name": "DeadlineCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['set-records-deadline']", + "default": "" + }, + { + "name": "payload", + "type": "DeadlinePayload", + "default": "" + } + ], + "line": 158, + "doc": "" + }, + { + "name": "CalculateDeadlineCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['calculate-records-deadline']", + "default": "" + }, + { + "name": "payload", + "type": "CalculateDeadlinePayload", + "default": "" + } + ], + "line": 163, + "doc": "" + }, + { + "name": "ClarificationCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['request-records-clarification']", + "default": "" + }, + { + "name": "payload", + "type": "ClarificationPayload", + "default": "" + } + ], + "line": 168, + "doc": "" + }, + { + "name": "MessageCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['add-records-message']", + "default": "" + }, + { + "name": "payload", + "type": "MessagePayload", + "default": "" + } + ], + "line": 173, + "doc": "" + }, + { + "name": "SearchNoteCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['record-records-search']", + "default": "" + }, + { + "name": "payload", + "type": "SearchNotePayload", + "default": "" + } + ], + "line": 178, + "doc": "" + }, + { + "name": "SearchReceiptCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['record-records-search-session']", + "default": "" + }, + { + "name": "payload", + "type": "SearchReceiptPayload", + "default": "" + } + ], + "line": 183, + "doc": "" + }, + { + "name": "ExemptionNoteCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['add-records-exemption-review']", + "default": "" + }, + { + "name": "payload", + "type": "ExemptionNotePayload", + "default": "" + } + ], + "line": 188, + "doc": "" + }, + { + "name": "ExemptionDecisionCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['add-records-exemption-decision']", + "default": "" + }, + { + "name": "payload", + "type": "ExemptionDecisionPayload", + "default": "" + } + ], + "line": 193, + "doc": "" + }, + { + "name": "FeeEstimateCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['estimate-records-fee']", + "default": "" + }, + { + "name": "payload", + "type": "FeeEstimatePayload", + "default": "" + } + ], + "line": 198, + "doc": "" + }, + { + "name": "FeeLineCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['add-records-fee-line']", + "default": "" + }, + { + "name": "payload", + "type": "FeeLinePayload", + "default": "" + } + ], + "line": 203, + "doc": "" + }, + { + "name": "FeeWaiverCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['waive-records-fee']", + "default": "" + }, + { + "name": "payload", + "type": "FeeWaiverPayload", + "default": "" + } + ], + "line": 208, + "doc": "" + }, + { + "name": "DraftCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['draft-records-response']", + "default": "" + }, + { + "name": "payload", + "type": "DraftPayload", + "default": "" + } + ], + "line": 213, + "doc": "" + }, + { + "name": "ApprovalCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['approve-records-response']", + "default": "" + }, + { + "name": "payload", + "type": "ApprovalPayload", + "default": "Field(default_factory=ApprovalPayload)" + } + ], + "line": 218, + "doc": "" + }, + { + "name": "FinishCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['fulfill-records-request', 'close-records-request']", + "default": "" + }, + { + "name": "payload", + "type": "NativePayload", + "default": "Field(default_factory=NativePayload)" + } + ], + "line": 223, + "doc": "" + }, + { + "name": "TimelineView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "note", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 241, + "doc": "" + }, + { + "name": "PublicStatusView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 249, + "doc": "" + }, + { + "name": "MessageView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "author", + "type": "str", + "default": "" + }, + { + "name": "author_role", + "type": "str", + "default": "" + }, + { + "name": "body", + "type": "str", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 257, + "doc": "" + }, + { + "name": "FeeLineView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "schedule_basis", + "type": "str", + "default": "" + }, + { + "name": "amount_cents", + "type": "int", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 266, + "doc": "" + }, + { + "name": "ExemptionDecisionView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "source", + "type": "str", + "default": "" + }, + { + "name": "kind", + "type": "str", + "default": "" + }, + { + "name": "finding", + "type": "str", + "default": "" + }, + { + "name": "decision", + "type": "Literal['release', 'redact', 'exempt']", + "default": "" + }, + { + "name": "basis", + "type": "str", + "default": "" + }, + { + "name": "reviewer", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 274, + "doc": "" + }, + { + "name": "SearchResultView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + } + ], + "line": 285, + "doc": "" + }, + { + "name": "SearchReceiptView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "query", + "type": "str", + "default": "" + }, + { + "name": "locations", + "type": "str", + "default": "" + }, + { + "name": "reviewer", + "type": "str", + "default": "" + }, + { + "name": "results", + "type": "list[SearchResultView]", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 293, + "doc": "" + }, + { + "name": "RecordsView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "request_id", + "type": "str", + "default": "" + }, + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "public_tracking_number", + "type": "str", + "default": "" + }, + { + "name": "requester", + "type": "str", + "default": "" + }, + { + "name": "requester_contact", + "type": "str", + "default": "" + }, + { + "name": "submitted_via", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "deadline", + "type": "str", + "default": "" + }, + { + "name": "deadline_basis", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "assigned_to", + "type": "str", + "default": "" + }, + { + "name": "clarification_notes", + "type": "list[str]", + "default": "" + }, + { + "name": "search_notes", + "type": "list[str]", + "default": "" + }, + { + "name": "search_sessions", + "type": "list[SearchReceiptView]", + "default": "" + }, + { + "name": "exemption_reviews", + "type": "list[str]", + "default": "" + }, + { + "name": "exemption_decisions", + "type": "list[ExemptionDecisionView]", + "default": "" + }, + { + "name": "fee_estimate", + "type": "str", + "default": "" + }, + { + "name": "fee_line_items", + "type": "list[FeeLineView]", + "default": "" + }, + { + "name": "fee_waiver_reason", + "type": "str", + "default": "" + }, + { + "name": "citations", + "type": "list[str]", + "default": "" + }, + { + "name": "response_draft", + "type": "str", + "default": "" + }, + { + "name": "approval_notes", + "type": "list[str]", + "default": "" + }, + { + "name": "exports", + "type": "list[str]", + "default": "" + }, + { + "name": "documents", + "type": "list['RecordsDocumentView']", + "default": "Field(default_factory=list)" + }, + { + "name": "release_packages", + "type": "list['ReleasePackageView']", + "default": "Field(default_factory=list)" + }, + { + "name": "timeline", + "type": "list[TimelineView]", + "default": "" + }, + { + "name": "public_status_events", + "type": "list[PublicStatusView]", + "default": "" + }, + { + "name": "messages", + "type": "list[MessageView]", + "default": "" + }, + { + "name": "deadline_reviewed_at_unix_seconds", + "type": "int | None", + "default": "" + }, + { + "name": "approved_at_unix_seconds", + "type": "int | None", + "default": "" + }, + { + "name": "fulfilled_at_unix_seconds", + "type": "int | None", + "default": "" + }, + { + "name": "closed_at_unix_seconds", + "type": "int | None", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 302, + "doc": "" + }, + { + "name": "RecordsOperationRead", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "request", + "type": "RecordsView", + "default": "" + } + ], + "line": 339, + "doc": "" + }, + { + "name": "RecordsStateRead", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "demo_fixture", + "type": "dict | None", + "default": "None" + }, + { + "name": "records_requests", + "type": "list[RecordsView]", + "default": "" + }, + { + "name": "notification_events", + "type": "list['NotificationView']", + "default": "Field(default_factory=list)" + }, + { + "name": "publication_events", + "type": "list['PublicationView']", + "default": "Field(default_factory=list)" + }, + { + "name": "audit_entries", + "type": "list['AuditView']", + "default": "Field(default_factory=list)" + } + ], + "line": 345, + "doc": "" + }, + { + "name": "ManagedFileReceipt", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "original_path", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "stored_path", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "file_name", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + }, + { + "name": "size_bytes", + "type": "int", + "default": "Field(ge=0, le=2147483647, strict=True)" + } + ], + "line": 353, + "doc": "" + }, + { + "name": "AttachDocument", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "citation", + "type": "str", + "default": "''" + }, + { + "name": "file", + "type": "ManagedFileReceipt", + "default": "" + } + ], + "line": 361, + "doc": "" + }, + { + "name": "AttachReleaseCopy", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "status", + "type": "Literal['release-ready copy', 'redacted copy']", + "default": "" + }, + { + "name": "note", + "type": "str", + "default": "''" + }, + { + "name": "added_by", + "type": "str", + "default": "''" + }, + { + "name": "file", + "type": "ManagedFileReceipt", + "default": "" + } + ], + "line": 367, + "doc": "" + }, + { + "name": "RecordsDocumentView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "attachment_id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "original_path", + "type": "str", + "default": "" + }, + { + "name": "stored_path", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "" + }, + { + "name": "size_bytes", + "type": "int", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "added_by", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + }, + { + "name": "release_original_path", + "type": "str", + "default": "''" + }, + { + "name": "release_stored_path", + "type": "str", + "default": "''" + }, + { + "name": "release_file_name", + "type": "str", + "default": "''" + }, + { + "name": "release_sha256", + "type": "str", + "default": "''" + }, + { + "name": "release_size_bytes", + "type": "int", + "default": "0" + }, + { + "name": "release_status", + "type": "str", + "default": "''" + }, + { + "name": "release_note", + "type": "str", + "default": "''" + }, + { + "name": "release_added_by", + "type": "str", + "default": "''" + }, + { + "name": "release_added_at_unix_seconds", + "type": "int | None", + "default": "None" + } + ], + "line": 374, + "doc": "" + }, + { + "name": "ReleasePackageView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "export_path", + "type": "str", + "default": "" + }, + { + "name": "package_hash", + "type": "str", + "default": "" + }, + { + "name": "document_count", + "type": "int", + "default": "" + }, + { + "name": "release_artifact_count", + "type": "int", + "default": "" + }, + { + "name": "search_session_count", + "type": "int", + "default": "" + }, + { + "name": "release_count", + "type": "int", + "default": "" + }, + { + "name": "redacted_count", + "type": "int", + "default": "" + }, + { + "name": "exempt_count", + "type": "int", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 397, + "doc": "" + }, + { + "name": "PrepareArtifact", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "kind", + "type": "Literal['response', 'release-package']", + "default": "" + } + ], + "line": 410, + "doc": "" + }, + { + "name": "ArtifactPlan", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "artifact_id", + "type": "str", + "default": "" + }, + { + "name": "file_name", + "type": "str", + "default": "" + }, + { + "name": "content", + "type": "str", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 414, + "doc": "" + }, + { + "name": "CompleteArtifact", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "export_path", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 422, + "doc": "" + }, + { + "name": "PublicIntake", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "requester", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "requesterContact", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "summary", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "deadline", + "type": "str", + "default": "''" + } + ], + "line": 426, + "doc": "" + }, + { + "name": "PublicLookup", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "trackingNumber", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "requesterContact", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 433, + "doc": "" + }, + { + "name": "PublicMessage", + "bases": [ + "PublicLookup" + ], + "fields": [ + { + "name": "publicRequestMessage", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 438, + "doc": "" + }, + { + "name": "GeneratedDraft", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "model", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "previous_response_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + } + ], + "line": 442, + "doc": "" + }, + { + "name": "NotificationView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "notification_id", + "type": "str", + "default": "" + }, + { + "name": "module_id", + "type": "str", + "default": "" + }, + { + "name": "record_id", + "type": "str", + "default": "" + }, + { + "name": "audience", + "type": "str", + "default": "" + }, + { + "name": "channel", + "type": "str", + "default": "" + }, + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "body", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + }, + { + "name": "sent_at_unix_seconds", + "type": "int | None", + "default": "" + } + ], + "line": 448, + "doc": "" + }, + { + "name": "PublicationView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "source_module", + "type": "str", + "default": "" + }, + { + "name": "source_record_id", + "type": "str", + "default": "" + }, + { + "name": "record_type", + "type": "str", + "default": "" + }, + { + "name": "public_payload", + "type": "str", + "default": "" + }, + { + "name": "payload_hash", + "type": "str", + "default": "" + }, + { + "name": "published_at_unix_seconds", + "type": "int", + "default": "" + }, + { + "name": "retracted_at_unix_seconds", + "type": "int | None", + "default": "None" + }, + { + "name": "retracted_by", + "type": "str", + "default": "''" + } + ], + "line": 462, + "doc": "" + }, + { + "name": "AuditView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "module_id", + "type": "str", + "default": "" + }, + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + }, + { + "name": "previous_hash", + "type": "str", + "default": "" + }, + { + "name": "entry_hash", + "type": "str", + "default": "" + } + ], + "line": 474, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/station.py", + "sha256": "2f53398b6a897f804419ea5025895bb7dc468d8891dc553b20bb14cb5d0a8084", + "routes": [ + { + "method": "GET", + "path": "/station/context", + "router": "router", + "prefix_resolved": false, + "name": "context", + "signature": "request: Request, capability: Literal['capture', 'read'], proof: str | None=Header(default=None, alias='X-Townlight-Session'), session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 43, + "doc": "", + "decorator": "router.get('/station/context')", + "errors": [ + "HTTPException(403, 'This staff role cannot perform this Station operation')", + "HTTPException(401, str(exc))" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/station-recordings", + "router": "router", + "prefix_resolved": false, + "name": "attach", + "signature": "request_id: UUID, data: Selection, request: Request, actor=Depends(station_actor), session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 79, + "doc": "", + "decorator": "router.post('/requests/{request_id}/station-recordings', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found')", + "HTTPException(409, str(exc))", + "HTTPException(422, 'Station evidence not attached; existing evidence preserved')", + "HTTPException(response.status_code, 'Station denied this recording')", + "HTTPException(409, 'Station recording is incomplete or changed; refresh selection')" + ] + } + ], + "models": [ + { + "name": "Selection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "recording_id", + "type": "UUID", + "default": "" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + } + ], + "line": 61, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_STATION_URL", + "default": "''", + "line": 33 + } + ] + }, + { + "source": "installed-owned-source/app/documents/__init__.py", + "sha256": "2795a0001b651166674cb0b501f64e0030e84816d5b4335f3189529510e2b10b", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/documents/router.py", + "sha256": "12c9facd2481a2294883f665516bd5e0bf3a487ee76c7eb747eb4b95aa80fefe", + "routes": [ + { + "method": "GET", + "path": "/documents/", + "router": "router", + "prefix_resolved": true, + "name": "list_documents", + "signature": "source_id: uuid.UUID | None=None, status: IngestionStatus | None=None, limit: int=Query(default=50, le=500), offset: int=0, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 31, + "doc": "", + "decorator": "router.get('/', response_model=list[DocumentRead])", + "errors": [] + }, + { + "method": "GET", + "path": "/documents/{document_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_document", + "signature": "document_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 47, + "doc": "", + "decorator": "router.get('/{document_id}', response_model=DocumentRead)", + "errors": [ + "HTTPException(status_code=404, detail='Document not found')" + ] + }, + { + "method": "GET", + "path": "/documents/{document_id}/chunks", + "router": "router", + "prefix_resolved": true, + "name": "list_chunks", + "signature": "document_id: uuid.UUID, limit: int=Query(default=50, le=500), offset: int=0, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 57, + "doc": "", + "decorator": "router.get('/{document_id}/chunks', response_model=list[DocumentChunkRead])", + "errors": [ + "HTTPException(status_code=404, detail='Document not found')" + ] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/exemptions/__init__.py", + "sha256": "2fd238ebecb0a427697f59094dad0d088962ebe3029a8a540d14957160714341", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/exemptions/engine.py", + "sha256": "56001a7259c4ca1a206ee528ceced69bd2764534133db61b9fcf5d01a26a8253", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/exemptions/llm_reviewer.py", + "sha256": "ab13ae2f8dde8c66debff2f9276787887524f7bf785833fcddc569816b1be8b4", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/exemptions/patterns.py", + "sha256": "364df5cffdccda747ecbf9d69775f0cce92610c6b253b5b78b91a0ac409ef9eb", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/exemptions/router.py", + "sha256": "4c35393f13a282194f4225b02e7b6d233b6e9b979371d6e318c7e5ed1df97dca", + "routes": [ + { + "method": "POST", + "path": "/exemptions/rules/", + "router": "router", + "prefix_resolved": true, + "name": "create_rule", + "signature": "data: ExemptionRuleCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 34, + "doc": "", + "decorator": "router.post('/rules/', response_model=ExemptionRuleRead, status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/exemptions/rules/", + "router": "router", + "prefix_resolved": true, + "name": "list_rules", + "signature": "state_code: str | None=None, enabled: bool | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 61, + "doc": "", + "decorator": "router.get('/rules/', response_model=list[ExemptionRuleRead])", + "errors": [] + }, + { + "method": "PATCH", + "path": "/exemptions/rules/{rule_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_rule", + "signature": "rule_id: uuid.UUID, data: ExemptionRuleUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 77, + "doc": "", + "decorator": "router.patch('/rules/{rule_id}', response_model=ExemptionRuleRead)", + "errors": [ + "HTTPException(status_code=404, detail='Rule not found')" + ] + }, + { + "method": "GET", + "path": "/exemptions/rules/{rule_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "get_rule_history", + "signature": "rule_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 109, + "doc": "Get audit history for an exemption rule.", + "decorator": "router.get('/rules/{rule_id}/history')", + "errors": [ + "HTTPException(status_code=404, detail='Rule not found')" + ] + }, + { + "method": "POST", + "path": "/exemptions/rules/{rule_id}/test", + "router": "router", + "prefix_resolved": true, + "name": "test_rule", + "signature": "rule_id: uuid.UUID, body: RuleTestRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 162, + "doc": "Test a rule against sample text. Returns match results.\n\nUses the `regex` library with timeout=2s to prevent ReDoS on\nadmin-entered patterns.", + "decorator": "router.post('/rules/{rule_id}/test', response_model=RuleTestResponse)", + "errors": [ + "HTTPException(status_code=404, detail='Rule not found')", + "HTTPException(status_code=422, detail=f'Invalid regex pattern: {e}')", + "HTTPException(status_code=408, detail='Regex execution timed out (possible catastrophic backtracking)')", + "HTTPException(status_code=400, detail='LLM-based rules cannot be tested with sample text \u2014 they require full document context.')" + ] + }, + { + "method": "POST", + "path": "/exemptions/scan/{request_id}", + "router": "router", + "prefix_resolved": true, + "name": "scan_for_exemptions", + "signature": "request_id: uuid.UUID, state_code: str=Query(default='CO', pattern='^[A-Z]{2}$'), use_llm: bool=False, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 228, + "doc": "Scan all documents attached to a request for exemptions.", + "decorator": "router.post('/scan/{request_id}')", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=422, detail=f'Scan incomplete: {exc}')" + ] + }, + { + "method": "GET", + "path": "/exemptions/flags/{request_id}", + "router": "router", + "prefix_resolved": true, + "name": "list_flags", + "signature": "request_id: uuid.UUID, status: FlagStatus | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 300, + "doc": "", + "decorator": "router.get('/flags/{request_id}', response_model=list[ExemptionFlagRead])", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "PATCH", + "path": "/exemptions/flags/{flag_id}", + "router": "router", + "prefix_resolved": true, + "name": "review_flag", + "signature": "flag_id: uuid.UUID, data: ExemptionFlagReview, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 321, + "doc": "", + "decorator": "router.patch('/flags/{flag_id}', response_model=ExemptionFlagRead)", + "errors": [ + "HTTPException(status_code=404, detail='Flag not found')", + "HTTPException(status_code=400, detail='Status must be accepted, rejected, or reviewed')" + ] + }, + { + "method": "GET", + "path": "/exemptions/dashboard/accuracy", + "router": "router", + "prefix_resolved": true, + "name": "exemption_accuracy", + "signature": "department_id: uuid.UUID | None=None, date_from: datetime | None=None, date_to: datetime | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 365, + "doc": "Acceptance/rejection rates by category, optionally filtered by department.", + "decorator": "router.get('/dashboard/accuracy', response_model=list[ExemptionAccuracyReport])", + "errors": [] + }, + { + "method": "GET", + "path": "/exemptions/dashboard/export", + "router": "router", + "prefix_resolved": true, + "name": "export_flag_data", + "signature": "format: str='json', date_from: datetime | None=None, date_to: datetime | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 423, + "doc": "Export exemption flag data as JSON or CSV.", + "decorator": "router.get('/dashboard/export')", + "errors": [] + }, + { + "method": "GET", + "path": "/exemptions/dashboard", + "router": "router", + "prefix_resolved": true, + "name": "exemption_dashboard", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 480, + "doc": "", + "decorator": "router.get('/dashboard', response_model=ExemptionDashboard)", + "errors": [] + }, + { + "method": "GET", + "path": "/exemptions/templates/", + "router": "router", + "prefix_resolved": true, + "name": "list_templates", + "signature": "template_type: str | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 519, + "doc": "", + "decorator": "router.get('/templates/', response_model=list[DisclosureTemplateRead])", + "errors": [] + }, + { + "method": "POST", + "path": "/exemptions/templates/", + "router": "router", + "prefix_resolved": true, + "name": "create_template", + "signature": "data: DisclosureTemplateCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 532, + "doc": "", + "decorator": "router.post('/templates/', response_model=DisclosureTemplateRead, status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/exemptions/templates/{template_id}/render", + "router": "router", + "prefix_resolved": true, + "name": "render_template", + "signature": "template_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 556, + "doc": "Render a template with city profile variables substituted.", + "decorator": "router.get('/templates/{template_id}/render', response_model=DisclosureTemplateRendered)", + "errors": [ + "HTTPException(status_code=404, detail='Template not found')" + ] + }, + { + "method": "PUT", + "path": "/exemptions/templates/{template_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_template", + "signature": "template_id: uuid.UUID, data: DisclosureTemplateUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 609, + "doc": "", + "decorator": "router.put('/templates/{template_id}', response_model=DisclosureTemplateRead)", + "errors": [ + "HTTPException(status_code=404, detail='Template not found')" + ] + } + ], + "models": [ + { + "name": "RuleTestRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "sample_text", + "type": "str", + "default": "" + } + ], + "line": 144, + "doc": "" + }, + { + "name": "RuleTestMatch", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "matched_text", + "type": "str", + "default": "" + }, + { + "name": "start", + "type": "int", + "default": "" + }, + { + "name": "end", + "type": "int", + "default": "" + } + ], + "line": 148, + "doc": "" + }, + { + "name": "RuleTestResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "rule_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "rule_type", + "type": "str", + "default": "" + }, + { + "name": "matched", + "type": "bool", + "default": "" + }, + { + "name": "matches", + "type": "list[RuleTestMatch]", + "default": "" + } + ], + "line": 154, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/ingestion/__init__.py", + "sha256": "b9960370edcad325db1bbc1a812416b99100a86c1db220b67a69e46f503ec5ad", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/ingestion/cron_utils.py", + "sha256": "63ca640af21a0a25da5e49ff745ffecb800dd18f4dd9e4ba886b123855334876", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/ingestion/scheduler.py", + "sha256": "cf90a00bb1eafc4e3327499461afbab3bc2202a726b5871551fc8a5c1638e734", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/ingestion/sync_runner.py", + "sha256": "0cab2a9f8b4caf7f199796d9c748fc165a04ec95f6181960ef84f74956fb9488", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/ingestion/tasks.py", + "sha256": "fb9dabc97a0ea8d8ddbceec5a2a98ef5cdbafb92eee41ecb702b4cb7860bddd9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/llm/__init__.py", + "sha256": "0411eee4d07aefa5002fbec9e0d426ee45fd2f9e589b56803b1668f6493d51e5", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/llm/client.py", + "sha256": "8504ba9c8ee46c902b4a6d9004dccce92f66f20b388c8a55484bb8324169ded1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/llm/context_manager.py", + "sha256": "aec2aac65a8e04a4a754ff44a6c4b37afdbf46a24156d5092c98f57aea436cc0", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/main.py", + "sha256": "abb959c23054e8fdd12fb4918ea6c1149ef3cc7b1fee268697baf36f07af9fc2", + "routes": [ + { + "method": "GET", + "path": "/config/portal-mode", + "router": "app", + "prefix_resolved": true, + "name": "get_portal_mode", + "signature": "", + "returns": "PortalModeResponse", + "line": 210, + "doc": "", + "decorator": "app.get('/config/portal-mode', tags=['public'], response_model=PortalModeResponse, summary=\"Get the deployment's current portal posture.\")", + "errors": [] + }, + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "health", + "signature": "", + "returns": "", + "line": 266, + "doc": "", + "decorator": "app.get('/health')", + "errors": [] + } + ], + "models": [ + { + "name": "PortalModeResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "mode", + "type": "Literal['public', 'private']", + "default": "Field(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.')" + } + ], + "line": 17, + "doc": "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." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/__init__.py", + "sha256": "85380f990a3bf800137f3e67775ba042f57a8a6b54d304845f43e1cb2a0b80c5", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/audit.py", + "sha256": "df56686024ce0b50fc6ffe0fe20d4775314cd3bd60302ae85d8b9f860ca053bb", + "routes": [], + "models": [ + { + "name": "AuditLog", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[int]", + "default": "mapped_column(primary_key=True, autoincrement=True)" + }, + { + "name": "prev_hash", + "type": "Mapped[str]", + "default": "mapped_column(String(64), default='0' * 64)" + }, + { + "name": "entry_hash", + "type": "Mapped[str]", + "default": "mapped_column(String(64), index=True)" + }, + { + "name": "timestamp", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now(), index=True)" + }, + { + "name": "user_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(UUID(as_uuid=True), nullable=True, index=True)" + }, + { + "name": "action", + "type": "Mapped[str]", + "default": "mapped_column(String(100), index=True)" + }, + { + "name": "resource_type", + "type": "Mapped[str]", + "default": "mapped_column(String(100), index=True)" + }, + { + "name": "resource_id", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255), nullable=True)" + }, + { + "name": "details", + "type": "Mapped[dict | None]", + "default": "mapped_column(JSONB, nullable=True)" + }, + { + "name": "ai_generated", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=False)" + } + ], + "line": 11, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/city_profile.py", + "sha256": "cc91186429d3a0afe01cd36ec8dd97bda3aa99e6297d25aeeae81fafcc31fe04", + "routes": [], + "models": [ + { + "name": "CityProfile", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "city_name", + "type": "Mapped[str]", + "default": "mapped_column(String(200))" + }, + { + "name": "state", + "type": "Mapped[str | None]", + "default": "mapped_column(String(2))" + }, + { + "name": "county", + "type": "Mapped[str | None]", + "default": "mapped_column(String(200))" + }, + { + "name": "population_band", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50))" + }, + { + "name": "email_platform", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50))" + }, + { + "name": "has_dedicated_it", + "type": "Mapped[bool | None]", + "default": "mapped_column(Boolean)" + }, + { + "name": "monthly_request_volume", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20))" + }, + { + "name": "onboarding_status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), default='not_started')" + }, + { + "name": "profile_data", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, default=dict)" + }, + { + "name": "gap_map", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, default=dict)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "updated_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())" + }, + { + "name": "updated_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + } + ], + "line": 9, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/connectors.py", + "sha256": "bd21d54690bdd9298d218ac973f29a2f14e2a4e59898784208d8f714ed33b032", + "routes": [], + "models": [ + { + "name": "SystemCatalog", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[int]", + "default": "mapped_column(Integer, primary_key=True, autoincrement=True)" + }, + { + "name": "domain", + "type": "Mapped[str]", + "default": "mapped_column(String(100))" + }, + { + "name": "function", + "type": "Mapped[str]", + "default": "mapped_column(String(200))" + }, + { + "name": "vendor_name", + "type": "Mapped[str]", + "default": "mapped_column(String(200))" + }, + { + "name": "vendor_version", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50))" + }, + { + "name": "access_protocol", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "data_shape", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "common_record_types", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, default=list)" + }, + { + "name": "redaction_tier", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=1)" + }, + { + "name": "discovery_hints", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, default=dict)" + }, + { + "name": "connector_template_id", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer)" + }, + { + "name": "catalog_version", + "type": "Mapped[str]", + "default": "mapped_column(String(20))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 8, + "doc": "" + }, + { + "name": "ConnectorTemplate", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[int]", + "default": "mapped_column(Integer, primary_key=True, autoincrement=True)" + }, + { + "name": "vendor_name", + "type": "Mapped[str]", + "default": "mapped_column(String(200))" + }, + { + "name": "protocol", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "auth_method", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "config_schema", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, default=dict)" + }, + { + "name": "default_sync_schedule", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50))" + }, + { + "name": "default_rate_limit", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer)" + }, + { + "name": "redaction_tier", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=1)" + }, + { + "name": "setup_instructions", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "catalog_version", + "type": "Mapped[str]", + "default": "mapped_column(String(20))" + } + ], + "line": 28, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/departments.py", + "sha256": "95df980295f111a89ec3197370eb7ebe5a67881871a9016ce9bee7a2741ed173", + "routes": [], + "models": [ + { + "name": "Department", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "name", + "type": "Mapped[str]", + "default": "mapped_column(String(200))" + }, + { + "name": "code", + "type": "Mapped[str]", + "default": "mapped_column(String(20), unique=True)" + }, + { + "name": "contact_email", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 8, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/document.py", + "sha256": "bcde5a7d50bc74ef2bb6d078e210366ca78b2c2ae9cc072ff72c6f727d9c78a7", + "routes": [], + "models": [ + { + "name": "DataSource", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "name", + "type": "Mapped[str]", + "default": "mapped_column(String(255), unique=True)" + }, + { + "name": "source_type", + "type": "Mapped[SourceType]", + "default": "mapped_column(Enum(SourceType, name='source_type', create_type=False, values_callable=lambda e: [m.value for m in e]))" + }, + { + "name": "connection_config", + "type": "Mapped[dict]", + "default": "mapped_column(EncryptedJSONB, default=dict)" + }, + { + "name": "is_active", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=True)" + }, + { + "name": "created_by", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "last_ingestion_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "discovered_source_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(nullable=True)" + }, + { + "name": "connector_template_id", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "sync_schedule", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50), nullable=True)" + }, + { + "name": "schedule_enabled", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=True, server_default='true')" + }, + { + "name": "last_sync_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "last_sync_cursor", + "type": "Mapped[str | None]", + "default": "mapped_column(String, nullable=True)" + }, + { + "name": "last_sync_status", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "consecutive_failure_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0, server_default='0')" + }, + { + "name": "last_error_message", + "type": "Mapped[str | None]", + "default": "mapped_column(String(500), nullable=True)" + }, + { + "name": "last_error_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "sync_paused", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=False, server_default='false')" + }, + { + "name": "sync_paused_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "sync_paused_reason", + "type": "Mapped[str | None]", + "default": "mapped_column(String(200), nullable=True)" + }, + { + "name": "retry_batch_size", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "retry_time_limit_seconds", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "health_status", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "schema_hash", + "type": "Mapped[str | None]", + "default": "mapped_column(String(64), nullable=True)" + } + ], + "line": 72, + "doc": "" + }, + { + "name": "Document", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "source_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('data_sources.id'), index=True)" + }, + { + "name": "source_path", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "filename", + "type": "Mapped[str]", + "default": "mapped_column(String(500))" + }, + { + "name": "file_type", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "file_hash", + "type": "Mapped[str]", + "default": "mapped_column(String(64), index=True)" + }, + { + "name": "file_size", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "ingestion_status", + "type": "Mapped[IngestionStatus]", + "default": "mapped_column(Enum(IngestionStatus, name='ingestion_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=IngestionStatus.PENDING)" + }, + { + "name": "ingestion_error", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "chunk_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "ingested_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "metadata_", + "type": "Mapped[dict | None]", + "default": "mapped_column('metadata', JSONB, nullable=True)" + }, + { + "name": "connector_type", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "updated_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "display_name", + "type": "Mapped[str | None]", + "default": "mapped_column(String(500), nullable=True)" + }, + { + "name": "department_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(nullable=True)" + }, + { + "name": "redaction_status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), server_default='none')" + }, + { + "name": "derivative_path", + "type": "Mapped[str | None]", + "default": "mapped_column(String(1000), nullable=True)" + }, + { + "name": "original_locked", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, server_default='false')" + } + ], + "line": 110, + "doc": "" + }, + { + "name": "DocumentChunk", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "document_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('documents.id', ondelete='CASCADE'), index=True)" + }, + { + "name": "chunk_index", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "content_text", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "embedding", + "type": "Mapped[list | None]", + "default": "mapped_column(Vector(768), nullable=True)" + }, + { + "name": "token_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "page_number", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + } + ], + "line": 140, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/exemption.py", + "sha256": "19c6c9f126eb03fd77139619f1e2a6c6af89d67af7e90d2139644dc909e9f7e3", + "routes": [], + "models": [ + { + "name": "ExemptionRule", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "state_code", + "type": "Mapped[str]", + "default": "mapped_column(String(2), index=True)" + }, + { + "name": "category", + "type": "Mapped[str]", + "default": "mapped_column(String(100), index=True)" + }, + { + "name": "rule_type", + "type": "Mapped[RuleType]", + "default": "mapped_column(Enum(RuleType, name='rule_type', create_type=False, values_callable=lambda e: [m.value for m in e]))" + }, + { + "name": "rule_definition", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "description", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "enabled", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=True)" + }, + { + "name": "version", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=1)" + }, + { + "name": "created_by", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 25, + "doc": "" + }, + { + "name": "ExemptionFlag", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "chunk_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('document_chunks.id'), index=True)" + }, + { + "name": "rule_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('exemption_rules.id'), nullable=True, index=True)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('records_requests.id'), index=True)" + }, + { + "name": "category", + "type": "Mapped[str]", + "default": "mapped_column(String(100))" + }, + { + "name": "matched_text", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "confidence", + "type": "Mapped[float]", + "default": "mapped_column(Float, default=1.0)" + }, + { + "name": "status", + "type": "Mapped[FlagStatus]", + "default": "mapped_column(Enum(FlagStatus, name='flag_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=FlagStatus.FLAGGED)" + }, + { + "name": "reviewed_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=True)" + }, + { + "name": "reviewed_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "review_reason", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "review_note", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "detection_tier", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "detection_method", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50), nullable=True)" + }, + { + "name": "auto_detected", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, server_default='false')" + } + ], + "line": 42, + "doc": "" + }, + { + "name": "DisclosureTemplate", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "template_type", + "type": "Mapped[str]", + "default": "mapped_column(String(100))" + }, + { + "name": "state_code", + "type": "Mapped[str | None]", + "default": "mapped_column(String(2), nullable=True)" + }, + { + "name": "content", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "version", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=1)" + }, + { + "name": "updated_by", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + }, + { + "name": "updated_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 68, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/fees.py", + "sha256": "8b6cc691265769ccd53ba6376b96c584c0a9d2bb6e55fe79a276ea1265ed2a7d", + "routes": [], + "models": [ + { + "name": "FeeSchedule", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "jurisdiction", + "type": "Mapped[str]", + "default": "mapped_column(String(100))" + }, + { + "name": "fee_type", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "amount", + "type": "Mapped[float]", + "default": "mapped_column(Numeric(10, 2))" + }, + { + "name": "description", + "type": "Mapped[str | None]", + "default": "mapped_column(String(500))" + }, + { + "name": "effective_date", + "type": "Mapped[date]", + "default": "mapped_column(Date)" + }, + { + "name": "created_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 8, + "doc": "" + }, + { + "name": "FeeWaiver", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'))" + }, + { + "name": "waiver_type", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "reason", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), default='pending')" + }, + { + "name": "requested_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "reviewed_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'), nullable=True)" + }, + { + "name": "review_notes", + "type": "Mapped[str | None]", + "default": "mapped_column(String(2000), nullable=True)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "reviewed_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + } + ], + "line": 25, + "doc": "" + }, + { + "name": "FeeLineItem", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'))" + }, + { + "name": "fee_schedule_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('fee_schedules.id', ondelete='SET NULL'))" + }, + { + "name": "description", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "quantity", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=1)" + }, + { + "name": "unit_price", + "type": "Mapped[float]", + "default": "mapped_column(Numeric(21, 2))" + }, + { + "name": "total", + "type": "Mapped[float]", + "default": "mapped_column(Numeric(21, 2))" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), default='estimated')" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "position", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer)" + }, + { + "name": "schedule_basis", + "type": "Mapped[str]", + "default": "mapped_column(Text, server_default='')" + } + ], + "line": 50, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/notifications.py", + "sha256": "f42e1facfadb8d4538b89f85a213142efc18e17be2bde95ac665b94d5704ad8c", + "routes": [], + "models": [ + { + "name": "NotificationTemplate", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "event_type", + "type": "Mapped[str]", + "default": "mapped_column(String(50), unique=True)" + }, + { + "name": "channel", + "type": "Mapped[str]", + "default": "mapped_column(String(20))" + }, + { + "name": "subject_template", + "type": "Mapped[str]", + "default": "mapped_column(String(500))" + }, + { + "name": "body_template", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "is_active", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=True)" + }, + { + "name": "created_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 8, + "doc": "" + }, + { + "name": "NotificationLog", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "template_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('notification_templates.id', ondelete='SET NULL'))" + }, + { + "name": "recipient_email", + "type": "Mapped[str]", + "default": "mapped_column(String(255))" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='SET NULL'))" + }, + { + "name": "channel", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "subject", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "body", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), default='queued')" + }, + { + "name": "sent_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True))" + }, + { + "name": "error_message", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "module_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "audience", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + } + ], + "line": 25, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/records_artifacts.py", + "sha256": "bb3c7d9b5e796686c3731db8577009d00378a14feec56f8d46360bd8660d3130", + "routes": [], + "models": [ + { + "name": "RequestArtifact", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id'), index=True)" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "position", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer)" + }, + { + "name": "kind", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "content", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "sha256", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "response_sha256", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "export_path", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, unique=True)" + }, + { + "name": "actor_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('users.id'))" + }, + { + "name": "document_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "release_artifact_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "search_session_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "release_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "redacted_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "exempt_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "completed_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True))" + } + ], + "line": 9, + "doc": "" + }, + { + "name": "RequestPublication", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id'), index=True)" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "payload", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "payload_hash", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "actor_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('users.id'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 31, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/records_evidence.py", + "sha256": "acadc29d3b93a2432c2c752b05f9c61e649c7d94fe29948b8dab4c46ffd421dd", + "routes": [], + "models": [ + { + "name": "RequestEvidenceNote", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + }, + { + "name": "kind", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "position", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "content", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "actor_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 16, + "doc": "" + }, + { + "name": "RequestExemptionDecision", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + }, + { + "name": "flag_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('exemption_flags.id'))" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "position", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "source", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "kind", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "finding", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "decision", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "basis", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "reviewer_label", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "actor_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 34, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/records_files.py", + "sha256": "8bceb23febbb492b13035ea12a9219d32741d397668d920a52b31f0e323b15f7", + "routes": [], + "models": [ + { + "name": "RequestFileEvidence", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('request_documents.id'), primary_key=True)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id'), index=True)" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "position", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "title", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "original_path", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "citation", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "added_by", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 12, + "doc": "" + }, + { + "name": "RequestReleaseCopy", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id'), index=True)" + }, + { + "name": "attachment_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('request_file_evidence.id'), index=True)" + }, + { + "name": "original_path", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "stored_path", + "type": "Mapped[str]", + "default": "mapped_column(Text, unique=True)" + }, + { + "name": "file_name", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "sha256", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "size_bytes", + "type": "Mapped[int]", + "default": "mapped_column(BigInteger)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "note", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "added_by", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "actor_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('users.id'))" + }, + { + "name": "position", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 26, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/request.py", + "sha256": "f88185889b139ac38de9a0d77449db246b22fef58f1743d25c7d2116c718ae76", + "routes": [], + "models": [ + { + "name": "RecordsRequest", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "requester_name", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "requester_email", + "type": "Mapped[str | None]", + "default": "mapped_column(String(320), nullable=True)" + }, + { + "name": "date_received", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "statutory_deadline", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "description", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "status", + "type": "Mapped[RequestStatus]", + "default": "mapped_column(Enum(RequestStatus, name='request_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=RequestStatus.RECEIVED)" + }, + { + "name": "assigned_to", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=True)" + }, + { + "name": "created_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "response_draft", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "review_notes", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "requester_phone", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50), nullable=True)" + }, + { + "name": "requester_type", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "scope_assessment", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "department_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(nullable=True)" + }, + { + "name": "estimated_fee", + "type": "Mapped[float | None]", + "default": "mapped_column(Numeric(21, 2), nullable=True)" + }, + { + "name": "fee_status", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "fee_waiver_requested", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, server_default='false')" + }, + { + "name": "priority", + "type": "Mapped[str]", + "default": "mapped_column(String(20), server_default='normal')" + }, + { + "name": "closed_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "closure_reason", + "type": "Mapped[str | None]", + "default": "mapped_column(String(500), nullable=True)" + }, + { + "name": "desktop_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, unique=True, nullable=True)" + }, + { + "name": "public_tracking_number", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, unique=True, nullable=True)" + }, + { + "name": "requester_contact", + "type": "Mapped[str]", + "default": "mapped_column(Text, server_default='')" + }, + { + "name": "submitted_via", + "type": "Mapped[str]", + "default": "mapped_column(Text, server_default='')" + }, + { + "name": "deadline_label", + "type": "Mapped[str]", + "default": "mapped_column(Text, server_default='')" + }, + { + "name": "deadline_basis", + "type": "Mapped[str]", + "default": "mapped_column(Text, server_default='')" + }, + { + "name": "deadline_reviewed_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True))" + }, + { + "name": "display_status", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "assigned_label", + "type": "Mapped[str]", + "default": "mapped_column(Text, server_default='')" + }, + { + "name": "fee_estimate_text", + "type": "Mapped[str]", + "default": "mapped_column(Text, server_default='')" + }, + { + "name": "fee_waiver_reason", + "type": "Mapped[str]", + "default": "mapped_column(Text, server_default='')" + }, + { + "name": "approved_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True))" + }, + { + "name": "approved_response_sha256", + "type": "Mapped[str | None]", + "default": "mapped_column(String(64))" + }, + { + "name": "fulfilled_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True))" + } + ], + "line": 31, + "doc": "" + }, + { + "name": "RequestDocument", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('records_requests.id'), index=True)" + }, + { + "name": "document_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('documents.id'), index=True)" + }, + { + "name": "relevance_note", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "exemption_flags", + "type": "Mapped[dict | None]", + "default": "mapped_column(JSONB, nullable=True)" + }, + { + "name": "inclusion_status", + "type": "Mapped[InclusionStatus]", + "default": "mapped_column(Enum(InclusionStatus, name='inclusion_status', create_type=False, values_callable=lambda e: [m.value for m in e]), default=InclusionStatus.PENDING)" + }, + { + "name": "attached_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "attached_by", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + } + ], + "line": 80, + "doc": "" + }, + { + "name": "DocumentCache", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "document_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('documents.id'), index=True)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('records_requests.id'), index=True)" + }, + { + "name": "cached_file_path", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "file_size", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "cached_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 96, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/request_workflow.py", + "sha256": "cc297a448c7f2de9ef1e31d7d94d24494efeeac7165f1d466e94aecfb7807b64", + "routes": [], + "models": [ + { + "name": "RequestTimeline", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + }, + { + "name": "event_type", + "type": "Mapped[str]", + "default": "mapped_column(String(50))" + }, + { + "name": "actor_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "actor_role", + "type": "Mapped[str | None]", + "default": "mapped_column(String(50))" + }, + { + "name": "description", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "internal_note", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "actor_label", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "position", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer)" + } + ], + "line": 8, + "doc": "" + }, + { + "name": "RequestPublicStatus", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "label", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "summary", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "position", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer)" + } + ], + "line": 34, + "doc": "" + }, + { + "name": "RequestMessage", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + }, + { + "name": "sender_type", + "type": "Mapped[str]", + "default": "mapped_column(String(20))" + }, + { + "name": "sender_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "message_text", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "is_internal", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, default=False)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "sender_label", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "position", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer)" + } + ], + "line": 51, + "doc": "" + }, + { + "name": "ResponseLetter", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(primary_key=True, default=uuid.uuid4)" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('records_requests.id', ondelete='CASCADE'), index=True)" + }, + { + "name": "template_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('disclosure_templates.id', ondelete='SET NULL'))" + }, + { + "name": "generated_content", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "edited_content", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), default='draft')" + }, + { + "name": "generated_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "approved_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('users.id', ondelete='SET NULL'))" + }, + { + "name": "sent_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 72, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/search.py", + "sha256": "e1f7499d2042fcae621e817878b1cf12bd53e5b55ebbaae33d8c24e29de275c9", + "routes": [], + "models": [ + { + "name": "SearchSession", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "user_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'), index=True)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + } + ], + "line": 11, + "doc": "" + }, + { + "name": "SearchQuery", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "session_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('search_sessions.id'), index=True)" + }, + { + "name": "query_text", + "type": "Mapped[str]", + "default": "mapped_column(Text)" + }, + { + "name": "filters", + "type": "Mapped[dict | None]", + "default": "mapped_column(JSONB, nullable=True)" + }, + { + "name": "results_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "synthesized_answer", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "request_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('records_requests.id'), index=True)" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "position", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer)" + }, + { + "name": "locations", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "reviewer_label", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + } + ], + "line": 19, + "doc": "" + }, + { + "name": "SearchResult", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "query_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('search_queries.id'), index=True)" + }, + { + "name": "chunk_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('document_chunks.id'), index=True)" + }, + { + "name": "similarity_score", + "type": "Mapped[float | None]", + "default": "mapped_column(Float)" + }, + { + "name": "rank", + "type": "Mapped[int]", + "default": "mapped_column(Integer)" + }, + { + "name": "normalized_score", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "legacy_id", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "title", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "citation", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "summary", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "review_status", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + } + ], + "line": 38, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/service_account.py", + "sha256": "594cbd1dfeea0bf026341f1a427f4e96a362f75c11a7cc0df7fb7e3a8363a311", + "routes": [], + "models": [ + { + "name": "ServiceAccount", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "name", + "type": "Mapped[str]", + "default": "mapped_column(String(255), unique=True)" + }, + { + "name": "api_key_hash", + "type": "Mapped[str]", + "default": "mapped_column(String(255))" + }, + { + "name": "role", + "type": "Mapped[UserRole]", + "default": "mapped_column(Enum(UserRole, name='user_role', create_type=False, values_callable=lambda e: [m.value for m in e]), default=UserRole.READ_ONLY)" + }, + { + "name": "created_by", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'))" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "is_active", + "type": "Mapped[bool]", + "default": "mapped_column(default=True)" + } + ], + "line": 11, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/sync_failure.py", + "sha256": "d31b87435c855f632b9b6d746eeec477d4f3811a95017401d0b1c3db4d506eb0", + "routes": [], + "models": [ + { + "name": "SyncFailure", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "source_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('data_sources.id', ondelete='CASCADE'), nullable=False)" + }, + { + "name": "source_path", + "type": "Mapped[str]", + "default": "mapped_column(Text, nullable=False)" + }, + { + "name": "error_message", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + }, + { + "name": "error_class", + "type": "Mapped[str | None]", + "default": "mapped_column(String(200), nullable=True)" + }, + { + "name": "http_status_code", + "type": "Mapped[int | None]", + "default": "mapped_column(Integer, nullable=True)" + }, + { + "name": "retry_count", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0, nullable=False)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(20), nullable=False, default='retrying')" + }, + { + "name": "first_failed_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())" + }, + { + "name": "last_retried_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "resolved_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "dismissed_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "dismissed_by", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=True)" + } + ], + "line": 15, + "doc": "" + }, + { + "name": "SyncRunLog", + "bases": [ + "Base" + ], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)" + }, + { + "name": "source_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), ForeignKey('data_sources.id', ondelete='CASCADE'), nullable=False)" + }, + { + "name": "started_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())" + }, + { + "name": "finished_at", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "status", + "type": "Mapped[str | None]", + "default": "mapped_column(String(20), nullable=True)" + }, + { + "name": "records_attempted", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "records_succeeded", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "records_failed", + "type": "Mapped[int]", + "default": "mapped_column(Integer, default=0)" + }, + { + "name": "error_summary", + "type": "Mapped[str | None]", + "default": "mapped_column(Text, nullable=True)" + } + ], + "line": 47, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/models/user.py", + "sha256": "39603bc8063007391d478b52165d2ae8d4bf0c5f1a1d7f716b78ff94754b2c82", + "routes": [], + "models": [ + { + "name": "User", + "bases": [ + "SQLAlchemyBaseUserTableUUID", + "Base" + ], + "fields": [ + { + "name": "full_name", + "type": "Mapped[str]", + "default": "mapped_column(default='')" + }, + { + "name": "role", + "type": "Mapped[UserRole]", + "default": "mapped_column(Enum(UserRole, name='user_role', create_type=False, values_callable=lambda e: [m.value for m in e]), default=UserRole.STAFF)" + }, + { + "name": "created_at", + "type": "Mapped[datetime]", + "default": "mapped_column(DateTime(timezone=True), server_default=func.now())" + }, + { + "name": "last_login", + "type": "Mapped[datetime | None]", + "default": "mapped_column(DateTime(timezone=True), nullable=True)" + }, + { + "name": "must_change_password", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, nullable=False, default=False, server_default='false')" + }, + { + "name": "department_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('departments.id'), nullable=True)" + } + ], + "line": 23, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/notifications/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/notifications/router.py", + "sha256": "ac77bd461ee941a84117eb93935464dc2c908ba96c3e2c613d80bd28088d5009", + "routes": [ + { + "method": "GET", + "path": "/notifications/templates", + "router": "router", + "prefix_resolved": false, + "name": "list_templates", + "signature": "session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 22, + "doc": "List all notification templates.", + "decorator": "router.get('/notifications/templates', response_model=list[NotificationTemplateRead])", + "errors": [] + }, + { + "method": "POST", + "path": "/notifications/templates", + "router": "router", + "prefix_resolved": false, + "name": "create_template", + "signature": "payload: NotificationTemplateCreate, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 38, + "doc": "Create a new notification template (admin only).", + "decorator": "router.post('/notifications/templates', response_model=NotificationTemplateRead, status_code=201)", + "errors": [ + "HTTPException(status_code=409, detail=f\"Template for event_type '{payload.event_type}' already exists\")" + ] + }, + { + "method": "PATCH", + "path": "/notifications/templates/{template_id}", + "router": "router", + "prefix_resolved": false, + "name": "update_template", + "signature": "template_id: uuid.UUID, payload: NotificationTemplateUpdate, session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 83, + "doc": "Update a notification template (admin only).", + "decorator": "router.patch('/notifications/templates/{template_id}', response_model=NotificationTemplateRead)", + "errors": [ + "HTTPException(status_code=404, detail='Template not found')", + "HTTPException(status_code=400, detail='No fields to update')" + ] + }, + { + "method": "GET", + "path": "/notifications/log", + "router": "router", + "prefix_resolved": false, + "name": "list_notification_log", + "signature": "limit: int=Query(default=50, le=200), request_id: uuid.UUID | None=Query(default=None), session: AsyncSession=Depends(get_async_session), user=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 116, + "doc": "List recent notification log entries.", + "decorator": "router.get('/notifications/log', response_model=list[NotificationLogRead])", + "errors": [] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/notifications/service.py", + "sha256": "0672a6a7a60bc09c4b1bfe29d7046f93fef36ea48b09a2ff3b898bdf66ad0965", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/notifications/smtp_delivery.py", + "sha256": "4dc26331949c01537173b6bb5c91d5f4d23419e73e46d1600fe289053904e544", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/notifications/sync_notifications.py", + "sha256": "8dee67dcfacd3182afbba6a1ed874e7029a0f2a7aef5a619fcec353dc569b778", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/onboarding/__init__.py", + "sha256": "410f27365a45a5cad7e8a8b23a63e6312fcc6ba18b9f3cfb8ecf782940f7fc49", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/onboarding/router.py", + "sha256": "fd107d538b24379eb31a08e39927eec2486df5d383c20b6f23af9adbb3299ff4", + "routes": [ + { + "method": "POST", + "path": "/onboarding/interview", + "router": "router", + "prefix_resolved": true, + "name": "get_next_question", + "signature": "body: InterviewRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 113, + "doc": "Generate the next onboarding question and persist the last answer.", + "decorator": "router.post('/interview', response_model=InterviewResponse)", + "errors": [] + } + ], + "models": [ + { + "name": "InterviewRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "last_answer", + "type": "str | None", + "default": "None" + }, + { + "name": "last_field", + "type": "str | None", + "default": "None" + }, + { + "name": "skipped_fields", + "type": "list[str] | None", + "default": "None" + } + ], + "line": 63, + "doc": "" + }, + { + "name": "InterviewResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "question", + "type": "str", + "default": "" + }, + { + "name": "target_field", + "type": "str | None", + "default": "" + }, + { + "name": "all_complete", + "type": "bool", + "default": "" + }, + { + "name": "completed_fields", + "type": "list[str]", + "default": "" + }, + { + "name": "onboarding_status", + "type": "str", + "default": "" + }, + { + "name": "skipped_fields", + "type": "list[str]", + "default": "" + } + ], + "line": 73, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/public/__init__.py", + "sha256": "9b2399a19ebba72002567e091d5d5bc56a158640e121328fa89365823d0607f9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/public/router.py", + "sha256": "1b688edd6b2ed2334bd6c113c4c30e47748ce98bc12c6c70e716f81b8acc23ea", + "routes": [ + { + "method": "POST", + "path": "/requests", + "router": "router", + "prefix_resolved": false, + "name": "submit_public_request", + "signature": "body: PublicRequestSubmitBody, user: User=Depends(_require_public_role), session: AsyncSession=Depends(get_async_session)", + "returns": "PublicRequestSubmitResponse", + "line": 115, + "doc": "Create a records request on behalf of the signed-in PUBLIC user.\n\nThe request lands in :class:`RequestStatus.RECEIVED` with\n``created_by`` = the authenticated resident's id. ``requester_name``\nand ``requester_email`` are copied from the user record so staff\nreviewers see the submitter's registered identity verbatim. An audit\nlog entry is written with ``action=\"public.requests.create\"`` for\nfull traceability.", + "decorator": "router.post('/requests', response_model=PublicRequestSubmitResponse, status_code=status.HTTP_201_CREATED, summary='Submit a records request as an authenticated resident.')", + "errors": [] + } + ], + "models": [ + { + "name": "PublicRequestSubmitBody", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "description", + "type": "str", + "default": "Field(min_length=10, max_length=10000, description='Plain-language description of the records being requested. At least 10 characters; the staff reviewer reads this verbatim.')" + }, + { + "name": "phone", + "type": "str | None", + "default": "Field(default=None, max_length=50, description='Optional contact phone number.')" + } + ], + "line": 47, + "doc": "Minimal public submission payload.\n\nThe authenticated ``UserRole.PUBLIC`` user's ``full_name`` and ``email``\nare reused for ``requester_name`` / ``requester_email`` (they already\nown that identity via self-registration). Only the free-form\ndescription and optional phone are collected here." + }, + { + "name": "PublicRequestSubmitResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "request_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "status", + "type": "RequestStatus", + "default": "" + }, + { + "name": "submitted_at", + "type": "datetime", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + } + ], + "line": 71, + "doc": "What the resident sees after submitting.\n\nThe tracking id is the database UUID of the request \u2014 the resident\ncan reference it when contacting the records office. Expanded\ntrack-my-request functionality (status page, timeline view,\ndownloads) is explicitly out of T5D scope." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/__init__.py", + "sha256": "10f4a38349943e0adc86d6b60e935616b29948f77c0a1c4ea7c3ccf94b70f2e3", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/artifacts.py", + "sha256": "e557ecc8cfd265bfcb76b4b06de38fcaf6eb75ed3dbba6d21fe65f481bbbf8a1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/deadline_check.py", + "sha256": "d5d734204bf8ef783d8d619b07df8884ab3cf2987bffcf57daa6d55a3431eb5a", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/files.py", + "sha256": "f5c2703a70c076b963f1116a0779d354479c65cb734bc921a4197c72694c8eec", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/meeting_sources.py", + "sha256": "5694a2e0b345cf684261ef54cc205e5ec1aaeb0125c2c77c0c4a1cf2899feb79", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/native_public.py", + "sha256": "0f9995ccc14fd61e49f51474fc2fcbcc52696b9102c1bd65b227fe135ea5e6cc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/planning_sources.py", + "sha256": "b62831d83e129a974bec04ee10fd71cfd15c8940f5c5c4dd11794b8f51cbd8d8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/router.py", + "sha256": "f29526862e9e3adae5cb288a59644fa9d10f0e62fdb0e41602286d715c529199", + "routes": [ + { + "method": "POST", + "path": "/requests/", + "router": "router", + "prefix_resolved": true, + "name": "create_request", + "signature": "data: RequestCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 85, + "doc": "", + "decorator": "router.post('/', response_model=RequestRead, status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/requests/", + "router": "router", + "prefix_resolved": true, + "name": "list_requests", + "signature": "status: RequestStatus | None=None, assigned_to: uuid.UUID | None=None, limit: int=50, offset: int=0, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.LIAISON))", + "returns": "", + "line": 104, + "doc": "", + "decorator": "router.get('/', response_model=list[RequestRead])", + "errors": [] + }, + { + "method": "GET", + "path": "/requests/stats", + "router": "router", + "prefix_resolved": true, + "name": "request_stats", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.LIAISON))", + "returns": "", + "line": 136, + "doc": "", + "decorator": "router.get('/stats', response_model=RequestStats)", + "errors": [] + }, + { + "method": "GET", + "path": "/requests/{request_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_request", + "signature": "request_id: uuid.UUID, request: Request, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.LIAISON))", + "returns": "", + "line": 189, + "doc": "", + "decorator": "router.get('/{request_id}', response_model=RequestRead)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "PATCH", + "path": "/requests/{request_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_request", + "signature": "request_id: uuid.UUID, data: RequestUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 211, + "doc": "", + "decorator": "router.patch('/{request_id}', response_model=RequestRead)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=400, detail=f'Cannot transition from {req.status.value} to {data.status.value}')" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/documents", + "router": "router", + "prefix_resolved": true, + "name": "attach_document", + "signature": "request_id: uuid.UUID, data: RequestDocumentAdd, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 275, + "doc": "", + "decorator": "router.post('/{request_id}/documents', response_model=RequestDocumentRead, status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=404, detail='Document not found')", + "HTTPException(status_code=409, detail='Document already attached')" + ] + }, + { + "method": "GET", + "path": "/requests/{request_id}/documents", + "router": "router", + "prefix_resolved": true, + "name": "list_attached_documents", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 342, + "doc": "", + "decorator": "router.get('/{request_id}/documents', response_model=list[RequestDocumentRead])", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "DELETE", + "path": "/requests/{request_id}/documents/{doc_id}", + "router": "router", + "prefix_resolved": true, + "name": "remove_document", + "signature": "request_id: uuid.UUID, doc_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 363, + "doc": "", + "decorator": "router.delete('/{request_id}/documents/{doc_id}', status_code=204)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=404, detail='Attachment not found')" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/submit-review", + "router": "router", + "prefix_resolved": true, + "name": "submit_for_review", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 395, + "doc": "", + "decorator": "router.post('/{request_id}/submit-review', response_model=RequestRead)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=400, detail=f'Cannot submit for review from status {req.status.value}')" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/ready-for-release", + "router": "router", + "prefix_resolved": true, + "name": "mark_ready_for_release", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.REVIEWER))", + "returns": "", + "line": 437, + "doc": "", + "decorator": "router.post('/{request_id}/ready-for-release', response_model=RequestRead)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=400, detail=f\"Can only mark ready for release from 'in_review' status, current: {req.status.value}\")" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/approve", + "router": "router", + "prefix_resolved": true, + "name": "approve_request", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.REVIEWER))", + "returns": "", + "line": 481, + "doc": "", + "decorator": "router.post('/{request_id}/approve', response_model=RequestRead)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=400, detail=f\"Can only approve from 'drafted' or 'ready_for_release' status, current: {req.status.value}\")" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/reject", + "router": "router", + "prefix_resolved": true, + "name": "reject_request", + "signature": "request_id: uuid.UUID, reason: str='', session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.REVIEWER))", + "returns": "", + "line": 525, + "doc": "", + "decorator": "router.post('/{request_id}/reject', response_model=RequestRead)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=400, detail=\"Can only reject from 'in_review' status\")" + ] + }, + { + "method": "GET", + "path": "/requests/{request_id}/timeline", + "router": "router", + "prefix_resolved": true, + "name": "get_timeline", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 571, + "doc": "", + "decorator": "router.get('/{request_id}/timeline', response_model=list[TimelineEventRead])", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/timeline", + "router": "router", + "prefix_resolved": true, + "name": "add_timeline_event", + "signature": "request_id: uuid.UUID, event: TimelineEventCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 590, + "doc": "", + "decorator": "router.post('/{request_id}/timeline', response_model=TimelineEventRead, status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "GET", + "path": "/requests/{request_id}/messages", + "router": "router", + "prefix_resolved": true, + "name": "get_messages", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 622, + "doc": "", + "decorator": "router.get('/{request_id}/messages', response_model=list[MessageRead])", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/messages", + "router": "router", + "prefix_resolved": true, + "name": "add_message", + "signature": "request_id: uuid.UUID, msg: MessageCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 641, + "doc": "", + "decorator": "router.post('/{request_id}/messages', response_model=MessageRead, status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "GET", + "path": "/requests/{request_id}/fees", + "router": "router", + "prefix_resolved": true, + "name": "get_fees", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 672, + "doc": "", + "decorator": "router.get('/{request_id}/fees', response_model=list[FeeLineItemRead])", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/fees", + "router": "router", + "prefix_resolved": true, + "name": "add_fee", + "signature": "request_id: uuid.UUID, fee: FeeLineItemCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 692, + "doc": "", + "decorator": "router.post('/{request_id}/fees', response_model=FeeLineItemRead, status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/estimate-fees", + "router": "router", + "prefix_resolved": true, + "name": "estimate_fees", + "signature": "request_id: uuid.UUID, body: FeeEstimateRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 748, + "doc": "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.", + "decorator": "router.post('/{request_id}/estimate-fees', response_model=FeeEstimateResponse)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=404, detail='Fee schedule not found')" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/fee-waiver", + "router": "router", + "prefix_resolved": true, + "name": "create_fee_waiver", + "signature": "request_id: uuid.UUID, body: FeeWaiverCreateRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 803, + "doc": "Request a fee waiver for this records request.", + "decorator": "router.post('/{request_id}/fee-waiver', response_model=FeeWaiverReadResponse, status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=422, detail=f'Invalid waiver_type: {body.waiver_type}')" + ] + }, + { + "method": "PATCH", + "path": "/requests/{request_id}/fee-waiver/{waiver_id}", + "router": "router", + "prefix_resolved": true, + "name": "review_fee_waiver", + "signature": "request_id: uuid.UUID, waiver_id: uuid.UUID, body: FeeWaiverReviewRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.REVIEWER))", + "returns": "", + "line": 848, + "doc": "Approve or deny a fee waiver. Reviewer/Admin only.", + "decorator": "router.patch('/{request_id}/fee-waiver/{waiver_id}', response_model=FeeWaiverReadResponse)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=404, detail='Fee waiver not found')", + "HTTPException(status_code=422, detail=\"Status must be 'approved' or 'denied'\")" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/response-letter", + "router": "router", + "prefix_resolved": true, + "name": "generate_response_letter", + "signature": "request_id: uuid.UUID, data: ResponseLetterCreate | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 1138, + "doc": "Generate a draft response letter for a records request.\n\nAttempts LLM generation via Ollama first; falls back to a structured\ntemplate if the LLM is unavailable.", + "decorator": "router.post('/{request_id}/response-letter', response_model=ResponseLetterRead, status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')" + ] + }, + { + "method": "GET", + "path": "/requests/{request_id}/response-letter", + "router": "router", + "prefix_resolved": true, + "name": "get_response_letter", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 1203, + "doc": "Get the latest response letter for a request.", + "decorator": "router.get('/{request_id}/response-letter', response_model=ResponseLetterRead)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=404, detail='No response letter found for this request')" + ] + }, + { + "method": "PATCH", + "path": "/requests/{request_id}/response-letter/{letter_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_response_letter", + "signature": "request_id: uuid.UUID, letter_id: uuid.UUID, data: ResponseLetterUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 1232, + "doc": "Update a response letter's edited content or status.\n\nStatus changes to 'approved' require REVIEWER role.", + "decorator": "router.patch('/{request_id}/response-letter/{letter_id}', response_model=ResponseLetterRead)", + "errors": [ + "HTTPException(status_code=404, detail='Request not found')", + "HTTPException(status_code=404, detail='Response letter not found')", + "HTTPException(status_code=400, detail='Invalid status. Must be draft, approved, or sent')", + "HTTPException(status_code=403, detail='Only reviewers or admins can approve response letters')" + ] + } + ], + "models": [ + { + "name": "FeeEstimateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "page_count", + "type": "int", + "default": "" + }, + { + "name": "fee_schedule_id", + "type": "uuid.UUID", + "default": "" + } + ], + "line": 734, + "doc": "" + }, + { + "name": "FeeEstimateResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "page_count", + "type": "int", + "default": "" + }, + { + "name": "unit_price", + "type": "float", + "default": "" + }, + { + "name": "total", + "type": "float", + "default": "" + }, + { + "name": "fee_type", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + } + ], + "line": 739, + "doc": "" + }, + { + "name": "FeeWaiverCreateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "waiver_type", + "type": "str", + "default": "" + }, + { + "name": "reason", + "type": "str", + "default": "" + } + ], + "line": 780, + "doc": "" + }, + { + "name": "FeeWaiverReadResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "request_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "waiver_type", + "type": "str", + "default": "" + }, + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "review_notes", + "type": "str | None", + "default": "None" + }, + { + "name": "created_at", + "type": "str", + "default": "" + } + ], + "line": 785, + "doc": "" + }, + { + "name": "FeeWaiverReviewRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "review_notes", + "type": "str | None", + "default": "None" + } + ], + "line": 797, + "doc": "" + } + ], + "configuration": [ + { + "variable": "LLM_MODEL", + "default": "", + "line": 992 + } + ] + }, + { + "source": "installed-owned-source/app/requests/service.py", + "sha256": "117aa98e60d09824799b2696dfce65d9ade7d60b58a35df3e8664add3cccca66", + "routes": [], + "models": [ + { + "name": "RequestIntake", + "bases": [], + "fields": [ + { + "name": "requester_name", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "requester_email", + "type": "str | None", + "default": "None" + }, + { + "name": "requester_phone", + "type": "str | None", + "default": "None" + }, + { + "name": "requester_type", + "type": "str | None", + "default": "None" + }, + { + "name": "statutory_deadline", + "type": "datetime | None", + "default": "None" + }, + { + "name": "priority", + "type": "str", + "default": "'normal'" + }, + { + "name": "scope_assessment", + "type": "str | None", + "default": "None" + }, + { + "name": "department_id", + "type": "uuid.UUID | None", + "default": "None" + } + ], + "line": 19, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/requests/workflow.py", + "sha256": "3d0ec7c9e4dd987beab5c1ca89f7b4c8e45f0a24075b64ce7694be50a901a72b", + "routes": [], + "models": [ + { + "name": "RecordsActor", + "bases": [], + "fields": [ + { + "name": "user", + "type": "User", + "default": "" + }, + { + "name": "role", + "type": "str", + "default": "" + } + ], + "line": 25, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/__init__.py", + "sha256": "7cd5688441a82abcca61eda136c29d767a8043bb0a3f7d9f0696a6443f675372", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/analytics.py", + "sha256": "1b2f2d7507f1057d010c203ec7c7fa6037d7adfd1e5be4b7323402dca5693a69", + "routes": [], + "models": [ + { + "name": "OperationalMetrics", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "average_response_time_days", + "type": "float | None", + "default": "" + }, + { + "name": "median_response_time_days", + "type": "float | None", + "default": "" + }, + { + "name": "requests_by_status", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "requests_by_department", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "deadline_compliance_rate", + "type": "float", + "default": "" + }, + { + "name": "total_open", + "type": "int", + "default": "" + }, + { + "name": "total_closed", + "type": "int", + "default": "" + }, + { + "name": "total_overdue", + "type": "int", + "default": "" + }, + { + "name": "clarification_frequency", + "type": "float", + "default": "" + }, + { + "name": "top_request_topics", + "type": "list[str]", + "default": "" + } + ], + "line": 4, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/audit.py", + "sha256": "95b0e336b85ffdb37079359ab68aa04b9ed974e964dc9a943cbef132f99e327d", + "routes": [], + "models": [ + { + "name": "AuditLogRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "int", + "default": "" + }, + { + "name": "prev_hash", + "type": "str", + "default": "" + }, + { + "name": "entry_hash", + "type": "str", + "default": "" + }, + { + "name": "timestamp", + "type": "datetime", + "default": "" + }, + { + "name": "user_id", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "resource_type", + "type": "str", + "default": "" + }, + { + "name": "resource_id", + "type": "str | None", + "default": "" + }, + { + "name": "details", + "type": "dict | None", + "default": "" + }, + { + "name": "ai_generated", + "type": "bool", + "default": "" + } + ], + "line": 7, + "doc": "" + }, + { + "name": "AuditLogQuery", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "action", + "type": "str | None", + "default": "None" + }, + { + "name": "resource_type", + "type": "str | None", + "default": "None" + }, + { + "name": "user_id", + "type": "uuid.UUID | None", + "default": "None" + }, + { + "name": "start_date", + "type": "datetime | None", + "default": "None" + }, + { + "name": "end_date", + "type": "datetime | None", + "default": "None" + }, + { + "name": "limit", + "type": "int", + "default": "Field(default=50, le=200)" + }, + { + "name": "offset", + "type": "int", + "default": "0" + } + ], + "line": 22, + "doc": "" + }, + { + "name": "AuditChainVerification", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "is_valid", + "type": "bool", + "default": "" + }, + { + "name": "entries_checked", + "type": "int", + "default": "" + }, + { + "name": "error_message", + "type": "str", + "default": "" + } + ], + "line": 32, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/city_profile.py", + "sha256": "b3187fb30ee67b36d4eb2794c2e36b31a49f01b9ad53b0db1a0d9bf87b2c2b2d", + "routes": [], + "models": [ + { + "name": "CityProfileCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "city_name", + "type": "str", + "default": "" + }, + { + "name": "state", + "type": "str | None", + "default": "None" + }, + { + "name": "county", + "type": "str | None", + "default": "None" + }, + { + "name": "population_band", + "type": "str | None", + "default": "None" + }, + { + "name": "email_platform", + "type": "str | None", + "default": "None" + }, + { + "name": "has_dedicated_it", + "type": "bool | None", + "default": "None" + }, + { + "name": "monthly_request_volume", + "type": "str | None", + "default": "None" + }, + { + "name": "profile_data", + "type": "dict", + "default": "{}" + }, + { + "name": "gap_map", + "type": "dict", + "default": "{}" + } + ], + "line": 7, + "doc": "" + }, + { + "name": "CityProfileRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "city_name", + "type": "str", + "default": "" + }, + { + "name": "state", + "type": "str | None", + "default": "" + }, + { + "name": "county", + "type": "str | None", + "default": "" + }, + { + "name": "population_band", + "type": "str | None", + "default": "" + }, + { + "name": "email_platform", + "type": "str | None", + "default": "" + }, + { + "name": "has_dedicated_it", + "type": "bool | None", + "default": "" + }, + { + "name": "monthly_request_volume", + "type": "str | None", + "default": "" + }, + { + "name": "onboarding_status", + "type": "str", + "default": "" + }, + { + "name": "profile_data", + "type": "dict", + "default": "" + }, + { + "name": "gap_map", + "type": "dict", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + } + ], + "line": 23, + "doc": "" + }, + { + "name": "CityProfileUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "city_name", + "type": "str | None", + "default": "None" + }, + { + "name": "state", + "type": "str | None", + "default": "None" + }, + { + "name": "county", + "type": "str | None", + "default": "None" + }, + { + "name": "population_band", + "type": "str | None", + "default": "None" + }, + { + "name": "email_platform", + "type": "str | None", + "default": "None" + }, + { + "name": "has_dedicated_it", + "type": "bool | None", + "default": "None" + }, + { + "name": "monthly_request_volume", + "type": "str | None", + "default": "None" + }, + { + "name": "onboarding_status", + "type": "str | None", + "default": "None" + }, + { + "name": "profile_data", + "type": "dict | None", + "default": "None" + }, + { + "name": "gap_map", + "type": "dict | None", + "default": "None" + } + ], + "line": 42, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/connectors/__init__.py", + "sha256": "bc0d25288808206c0bad0ff842e9e68f6aa298f194cec977e540cc20438d79ec", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/connectors/odbc.py", + "sha256": "d21cc39b1dc8567b6615bf14c3ff1a44c43cbedd851ce27acfe52e92015ede65", + "routes": [], + "models": [ + { + "name": "ODBCConfig", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "connector_type", + "type": "Literal['odbc']", + "default": "'odbc'" + }, + { + "name": "connection_string", + "type": "str", + "default": "" + }, + { + "name": "table_name", + "type": "str", + "default": "" + }, + { + "name": "pk_column", + "type": "str", + "default": "" + }, + { + "name": "modified_column", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "columns", + "type": "Optional[list[str]]", + "default": "None" + }, + { + "name": "batch_size", + "type": "int", + "default": "Field(default=500, ge=1, le=10000)" + }, + { + "name": "max_row_bytes", + "type": "int", + "default": "Field(default=10485760, ge=1)" + } + ], + "line": 17, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/connectors/rest_api.py", + "sha256": "a14767ee188a3ff4ca34b54f73f5c6059a146628d559de016402e3b3cf04793b", + "routes": [], + "models": [ + { + "name": "RestApiConfig", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "connector_type", + "type": "Literal['rest_api']", + "default": "'rest_api'" + }, + { + "name": "base_url", + "type": "AnyHttpUrl", + "default": "" + }, + { + "name": "endpoint_path", + "type": "str", + "default": "Field(default='/', description='Path appended to base_url')" + }, + { + "name": "auth_method", + "type": "Literal['none', 'api_key', 'bearer', 'oauth2', 'basic']", + "default": "" + }, + { + "name": "api_key", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "key_location", + "type": "Literal['header', 'query']", + "default": "'header'" + }, + { + "name": "key_header", + "type": "str", + "default": "'X-API-Key'" + }, + { + "name": "token", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "client_id", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "client_secret", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "token_url", + "type": "Optional[AnyHttpUrl]", + "default": "None" + }, + { + "name": "username", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "password", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "pagination_style", + "type": "Literal['none', 'page', 'offset', 'cursor']", + "default": "'none'" + }, + { + "name": "page_param", + "type": "str", + "default": "'page'" + }, + { + "name": "offset_param", + "type": "str", + "default": "'offset'" + }, + { + "name": "limit_param", + "type": "str", + "default": "'limit'" + }, + { + "name": "page_size", + "type": "int", + "default": "Field(default=100, ge=1, le=10000)" + }, + { + "name": "cursor_field", + "type": "str", + "default": "'next'" + }, + { + "name": "response_format", + "type": "Literal['json', 'xml', 'csv']", + "default": "'json'" + }, + { + "name": "results_field", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "data_key", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "id_field", + "type": "str", + "default": "'id'" + }, + { + "name": "envelope_excludes", + "type": "list[str]", + "default": "[]" + }, + { + "name": "since_field", + "type": "Optional[str]", + "default": "None" + }, + { + "name": "since_format", + "type": "str", + "default": "'%Y-%m-%dT%H:%M:%SZ'" + }, + { + "name": "max_records", + "type": "int", + "default": "Field(default=10000, ge=1)" + }, + { + "name": "max_response_bytes", + "type": "int", + "default": "Field(default=52428800, ge=1)" + } + ], + "line": 5, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/department.py", + "sha256": "5e45ab7a46abbb6a40e6c7d22b928aa65bdc0fabab5a424ee988fd31ec672c30", + "routes": [], + "models": [ + { + "name": "DepartmentCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "code", + "type": "str", + "default": "" + }, + { + "name": "contact_email", + "type": "str | None", + "default": "None" + } + ], + "line": 6, + "doc": "" + }, + { + "name": "DepartmentRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "code", + "type": "str", + "default": "" + }, + { + "name": "contact_email", + "type": "str | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 12, + "doc": "" + }, + { + "name": "DepartmentUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str | None", + "default": "None" + }, + { + "name": "code", + "type": "str | None", + "default": "None" + }, + { + "name": "contact_email", + "type": "str | None", + "default": "None" + } + ], + "line": 21, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/document.py", + "sha256": "139e5160eac328e5d5499c935a2ee4bbc8a7eee5a24cfe1fc7e08b1aca0fbc8a", + "routes": [], + "models": [ + { + "name": "DataSourceCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "source_type", + "type": "SourceType", + "default": "" + }, + { + "name": "connection_config", + "type": "dict", + "default": "{}" + }, + { + "name": "sync_schedule", + "type": "str | None", + "default": "None" + }, + { + "name": "schedule_enabled", + "type": "bool", + "default": "True" + } + ], + "line": 7, + "doc": "" + }, + { + "name": "DataSourceRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "source_type", + "type": "SourceType", + "default": "" + }, + { + "name": "sync_schedule", + "type": "str | None", + "default": "None" + }, + { + "name": "schedule_enabled", + "type": "bool", + "default": "True" + }, + { + "name": "next_sync_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool", + "default": "" + }, + { + "name": "created_by", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "last_ingestion_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "last_sync_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "last_sync_status", + "type": "str | None", + "default": "None" + }, + { + "name": "last_error_message", + "type": "str | None", + "default": "None" + }, + { + "name": "consecutive_failure_count", + "type": "int", + "default": "0" + }, + { + "name": "sync_paused", + "type": "bool", + "default": "False" + }, + { + "name": "health_status", + "type": "str", + "default": "'healthy'" + }, + { + "name": "active_failure_count", + "type": "int", + "default": "0" + }, + { + "name": "connector_type", + "type": "str | None", + "default": "None" + }, + { + "name": "updated_at", + "type": "datetime | None", + "default": "None" + } + ], + "line": 23, + "doc": "Redacted datasource shape \u2014 safe for non-admin roles. connection_config omitted." + }, + { + "name": "DataSourceAdminRead", + "bases": [ + "DataSourceRead" + ], + "fields": [ + { + "name": "connection_config", + "type": "dict", + "default": "" + } + ], + "line": 52, + "doc": "Full datasource shape including connection_config. Returned only by admin-gated endpoints." + }, + { + "name": "DataSourceUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str | None", + "default": "None" + }, + { + "name": "connection_config", + "type": "dict | None", + "default": "None" + }, + { + "name": "sync_schedule", + "type": "str | None", + "default": "None" + }, + { + "name": "schedule_enabled", + "type": "bool | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool | None", + "default": "None" + } + ], + "line": 57, + "doc": "" + }, + { + "name": "DocumentRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "source_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "source_path", + "type": "str", + "default": "" + }, + { + "name": "filename", + "type": "str", + "default": "" + }, + { + "name": "file_type", + "type": "str", + "default": "" + }, + { + "name": "file_hash", + "type": "str", + "default": "" + }, + { + "name": "file_size", + "type": "int", + "default": "" + }, + { + "name": "ingestion_status", + "type": "IngestionStatus", + "default": "" + }, + { + "name": "ingestion_error", + "type": "str | None", + "default": "" + }, + { + "name": "chunk_count", + "type": "int", + "default": "" + }, + { + "name": "ingested_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "connector_type", + "type": "str | None", + "default": "None" + }, + { + "name": "updated_at", + "type": "datetime | None", + "default": "None" + } + ], + "line": 73, + "doc": "" + }, + { + "name": "DocumentChunkRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "document_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "chunk_index", + "type": "int", + "default": "" + }, + { + "name": "content_text", + "type": "str", + "default": "" + }, + { + "name": "token_count", + "type": "int", + "default": "" + }, + { + "name": "page_number", + "type": "int | None", + "default": "" + } + ], + "line": 90, + "doc": "" + }, + { + "name": "IngestionStats", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "total_sources", + "type": "int", + "default": "" + }, + { + "name": "active_sources", + "type": "int", + "default": "" + }, + { + "name": "total_documents", + "type": "int", + "default": "" + }, + { + "name": "documents_by_status", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "total_chunks", + "type": "int", + "default": "" + } + ], + "line": 100, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/exemption.py", + "sha256": "7cd5c0e1d1c2eaca8dace50b570ac06832765cbb3c3df148b84d3a12188f4664", + "routes": [], + "models": [ + { + "name": "ExemptionRuleCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "state_code", + "type": "str", + "default": "" + }, + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "rule_type", + "type": "RuleType", + "default": "" + }, + { + "name": "rule_definition", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str | None", + "default": "None" + }, + { + "name": "enabled", + "type": "bool", + "default": "True" + } + ], + "line": 8, + "doc": "" + }, + { + "name": "ExemptionRuleRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "state_code", + "type": "str", + "default": "" + }, + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "rule_type", + "type": "RuleType", + "default": "" + }, + { + "name": "rule_definition", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str | None", + "default": "" + }, + { + "name": "enabled", + "type": "bool", + "default": "" + }, + { + "name": "version", + "type": "int", + "default": "1" + }, + { + "name": "created_by", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 17, + "doc": "" + }, + { + "name": "ExemptionRuleUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "rule_definition", + "type": "str | None", + "default": "None" + }, + { + "name": "description", + "type": "str | None", + "default": "None" + }, + { + "name": "enabled", + "type": "bool | None", + "default": "None" + } + ], + "line": 31, + "doc": "" + }, + { + "name": "ExemptionFlagRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "chunk_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "rule_id", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "request_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "matched_text", + "type": "str | None", + "default": "" + }, + { + "name": "confidence", + "type": "float", + "default": "" + }, + { + "name": "status", + "type": "FlagStatus", + "default": "" + }, + { + "name": "reviewed_by", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "reviewed_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "review_reason", + "type": "str | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 37, + "doc": "" + }, + { + "name": "ExemptionFlagReview", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "status", + "type": "FlagStatus", + "default": "" + }, + { + "name": "review_reason", + "type": "str | None", + "default": "None" + } + ], + "line": 53, + "doc": "" + }, + { + "name": "DisclosureTemplateCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "template_type", + "type": "str", + "default": "" + }, + { + "name": "state_code", + "type": "str | None", + "default": "None" + }, + { + "name": "content", + "type": "str", + "default": "" + } + ], + "line": 58, + "doc": "" + }, + { + "name": "DisclosureTemplateRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "template_type", + "type": "str", + "default": "" + }, + { + "name": "state_code", + "type": "str | None", + "default": "" + }, + { + "name": "content", + "type": "str", + "default": "" + }, + { + "name": "version", + "type": "int", + "default": "" + }, + { + "name": "updated_by", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + } + ], + "line": 64, + "doc": "" + }, + { + "name": "ExemptionDashboard", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "total_flags", + "type": "int", + "default": "" + }, + { + "name": "by_status", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "by_category", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "acceptance_rate", + "type": "float", + "default": "" + }, + { + "name": "total_rules", + "type": "int", + "default": "" + }, + { + "name": "active_rules", + "type": "int", + "default": "" + } + ], + "line": 75, + "doc": "" + }, + { + "name": "ExemptionAccuracyReport", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "category", + "type": "str", + "default": "" + }, + { + "name": "total_flags", + "type": "int", + "default": "" + }, + { + "name": "accepted", + "type": "int", + "default": "" + }, + { + "name": "rejected", + "type": "int", + "default": "" + }, + { + "name": "pending", + "type": "int", + "default": "" + }, + { + "name": "acceptance_rate", + "type": "float", + "default": "" + } + ], + "line": 84, + "doc": "" + }, + { + "name": "DisclosureTemplateRendered", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "template_type", + "type": "str", + "default": "" + }, + { + "name": "rendered_content", + "type": "str", + "default": "" + }, + { + "name": "has_unresolved_variables", + "type": "bool", + "default": "" + } + ], + "line": 93, + "doc": "" + }, + { + "name": "DisclosureTemplateUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "content", + "type": "str | None", + "default": "None" + }, + { + "name": "state_code", + "type": "str | None", + "default": "None" + } + ], + "line": 100, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/fee_schedule.py", + "sha256": "132fca7b2f2484f924464e8c01bec43674d8a6fc579202849cf73e43630adf70", + "routes": [], + "models": [ + { + "name": "FeeScheduleCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "jurisdiction", + "type": "str", + "default": "" + }, + { + "name": "fee_type", + "type": "str", + "default": "" + }, + { + "name": "amount", + "type": "float", + "default": "" + }, + { + "name": "description", + "type": "str | None", + "default": "None" + }, + { + "name": "effective_date", + "type": "date | None", + "default": "None" + } + ], + "line": 6, + "doc": "" + }, + { + "name": "FeeScheduleRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "jurisdiction", + "type": "str", + "default": "" + }, + { + "name": "fee_type", + "type": "str", + "default": "" + }, + { + "name": "amount", + "type": "float", + "default": "" + }, + { + "name": "description", + "type": "str | None", + "default": "" + }, + { + "name": "effective_date", + "type": "date | None", + "default": "" + }, + { + "name": "created_by", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 14, + "doc": "" + }, + { + "name": "FeeScheduleUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "fee_type", + "type": "str | None", + "default": "None" + }, + { + "name": "amount", + "type": "float | None", + "default": "None" + }, + { + "name": "description", + "type": "str | None", + "default": "None" + }, + { + "name": "effective_date", + "type": "date | None", + "default": "None" + } + ], + "line": 26, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/notifications.py", + "sha256": "61d74c4b0977679c0739a374997ae5d49792d47f0f469baf6c422b77fd993fa3", + "routes": [], + "models": [ + { + "name": "NotificationTemplateCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "event_type", + "type": "str", + "default": "" + }, + { + "name": "channel", + "type": "str", + "default": "'email'" + }, + { + "name": "subject_template", + "type": "str", + "default": "" + }, + { + "name": "body_template", + "type": "str", + "default": "" + } + ], + "line": 7, + "doc": "" + }, + { + "name": "NotificationTemplateRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "event_type", + "type": "str", + "default": "" + }, + { + "name": "channel", + "type": "str", + "default": "" + }, + { + "name": "subject_template", + "type": "str", + "default": "" + }, + { + "name": "body_template", + "type": "str", + "default": "" + }, + { + "name": "is_active", + "type": "bool", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 14, + "doc": "" + }, + { + "name": "NotificationTemplateUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "subject_template", + "type": "str | None", + "default": "None" + }, + { + "name": "body_template", + "type": "str | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool | None", + "default": "None" + } + ], + "line": 26, + "doc": "" + }, + { + "name": "NotificationLogRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "template_id", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "recipient_email", + "type": "str", + "default": "" + }, + { + "name": "request_id", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "channel", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "sent_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "error_message", + "type": "str | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 32, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/request.py", + "sha256": "7c632f8eaaa7198a74edf0860e25fcf2ef3fa8c8a5eb15fd55f633089787b8cd", + "routes": [], + "models": [ + { + "name": "RequestCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "requester_name", + "type": "str", + "default": "Field(..., max_length=255)" + }, + { + "name": "requester_email", + "type": "str | None", + "default": "Field(None, max_length=255)" + }, + { + "name": "requester_phone", + "type": "str | None", + "default": "Field(None, max_length=50)" + }, + { + "name": "requester_type", + "type": "str | None", + "default": "Field(None, max_length=100)" + }, + { + "name": "description", + "type": "str", + "default": "Field(..., max_length=10000)" + }, + { + "name": "statutory_deadline", + "type": "datetime | None", + "default": "None" + }, + { + "name": "priority", + "type": "str", + "default": "'normal'" + }, + { + "name": "scope_assessment", + "type": "str | None", + "default": "Field(None, pattern='^(narrow|moderate|broad)$')" + }, + { + "name": "department_id", + "type": "uuid.UUID | None", + "default": "None" + } + ], + "line": 8, + "doc": "" + }, + { + "name": "RequestRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "requester_name", + "type": "str", + "default": "" + }, + { + "name": "requester_email", + "type": "str | None", + "default": "" + }, + { + "name": "requester_phone", + "type": "str | None", + "default": "None" + }, + { + "name": "requester_type", + "type": "str | None", + "default": "None" + }, + { + "name": "date_received", + "type": "datetime", + "default": "" + }, + { + "name": "statutory_deadline", + "type": "datetime | None", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "RequestStatus", + "default": "" + }, + { + "name": "assigned_to", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "created_by", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "response_draft", + "type": "str | None", + "default": "" + }, + { + "name": "review_notes", + "type": "str | None", + "default": "" + }, + { + "name": "department_id", + "type": "uuid.UUID | None", + "default": "None" + }, + { + "name": "estimated_fee", + "type": "float | None", + "default": "None" + }, + { + "name": "fee_status", + "type": "str | None", + "default": "None" + }, + { + "name": "fee_waiver_requested", + "type": "bool", + "default": "False" + }, + { + "name": "priority", + "type": "str", + "default": "'normal'" + }, + { + "name": "scope_assessment", + "type": "str | None", + "default": "None" + }, + { + "name": "closed_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "closure_reason", + "type": "str | None", + "default": "None" + } + ], + "line": 20, + "doc": "" + }, + { + "name": "RequestUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "description", + "type": "str | None", + "default": "None" + }, + { + "name": "status", + "type": "RequestStatus | None", + "default": "None" + }, + { + "name": "assigned_to", + "type": "uuid.UUID | None", + "default": "None" + }, + { + "name": "response_draft", + "type": "str | None", + "default": "None" + }, + { + "name": "statutory_deadline", + "type": "datetime | None", + "default": "None" + }, + { + "name": "scope_assessment", + "type": "str | None", + "default": "None" + } + ], + "line": 47, + "doc": "" + }, + { + "name": "RequestDocumentAdd", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "document_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "relevance_note", + "type": "str | None", + "default": "None" + } + ], + "line": 56, + "doc": "" + }, + { + "name": "RequestDocumentRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "request_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "document_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "relevance_note", + "type": "str | None", + "default": "" + }, + { + "name": "exemption_flags", + "type": "dict | None", + "default": "" + }, + { + "name": "inclusion_status", + "type": "InclusionStatus", + "default": "" + }, + { + "name": "attached_at", + "type": "datetime", + "default": "" + }, + { + "name": "attached_by", + "type": "uuid.UUID", + "default": "" + } + ], + "line": 61, + "doc": "" + }, + { + "name": "RequestStats", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "total_requests", + "type": "int", + "default": "" + }, + { + "name": "by_status", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "approaching_deadline", + "type": "int", + "default": "" + }, + { + "name": "overdue", + "type": "int", + "default": "" + } + ], + "line": 74, + "doc": "" + }, + { + "name": "TimelineEventCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "event_type", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "internal_note", + "type": "str | None", + "default": "None" + } + ], + "line": 81, + "doc": "" + }, + { + "name": "TimelineEventRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "request_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "event_type", + "type": "str", + "default": "" + }, + { + "name": "actor_id", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "actor_role", + "type": "str | None", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "internal_note", + "type": "str | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 87, + "doc": "" + }, + { + "name": "MessageCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "message_text", + "type": "str", + "default": "" + }, + { + "name": "is_internal", + "type": "bool", + "default": "False" + } + ], + "line": 99, + "doc": "" + }, + { + "name": "MessageRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "request_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "sender_type", + "type": "str", + "default": "" + }, + { + "name": "sender_id", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "message_text", + "type": "str", + "default": "" + }, + { + "name": "is_internal", + "type": "bool", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 104, + "doc": "" + }, + { + "name": "FeeLineItemCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "quantity", + "type": "int", + "default": "1" + }, + { + "name": "unit_price", + "type": "float", + "default": "" + }, + { + "name": "fee_schedule_id", + "type": "uuid.UUID | None", + "default": "None" + } + ], + "line": 115, + "doc": "" + }, + { + "name": "FeeLineItemRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "request_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "fee_schedule_id", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "quantity", + "type": "int", + "default": "" + }, + { + "name": "unit_price", + "type": "float", + "default": "" + }, + { + "name": "total", + "type": "float", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 122, + "doc": "" + }, + { + "name": "ResponseLetterCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "template_id", + "type": "uuid.UUID | None", + "default": "None" + } + ], + "line": 138, + "doc": "" + }, + { + "name": "ResponseLetterRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "request_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "template_id", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "generated_content", + "type": "str", + "default": "" + }, + { + "name": "edited_content", + "type": "str | None", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "generated_by", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "approved_by", + "type": "uuid.UUID | None", + "default": "" + }, + { + "name": "sent_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 142, + "doc": "" + }, + { + "name": "ResponseLetterUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "edited_content", + "type": "str | None", + "default": "None" + }, + { + "name": "status", + "type": "str | None", + "default": "None" + } + ], + "line": 156, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/search.py", + "sha256": "13a5c1913290f2d1b4c9447c3b3d4d1046038e146c2b11a97a03e1bb895b3015", + "routes": [], + "models": [ + { + "name": "SearchRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "query", + "type": "str", + "default": "" + }, + { + "name": "session_id", + "type": "uuid.UUID | None", + "default": "None" + }, + { + "name": "filters", + "type": "dict | None", + "default": "None" + }, + { + "name": "limit", + "type": "int", + "default": "Field(default=10, le=50)" + }, + { + "name": "synthesize", + "type": "bool", + "default": "False" + } + ], + "line": 6, + "doc": "" + }, + { + "name": "SearchResultItem", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "chunk_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "document_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "filename", + "type": "str", + "default": "" + }, + { + "name": "file_type", + "type": "str", + "default": "" + }, + { + "name": "source_path", + "type": "str", + "default": "" + }, + { + "name": "page_number", + "type": "int | None", + "default": "" + }, + { + "name": "content_text", + "type": "str", + "default": "" + }, + { + "name": "similarity_score", + "type": "float", + "default": "" + }, + { + "name": "rank", + "type": "int", + "default": "" + } + ], + "line": 14, + "doc": "" + }, + { + "name": "SearchResponse", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "query_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "session_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "query_text", + "type": "str", + "default": "" + }, + { + "name": "results", + "type": "list[SearchResultItem]", + "default": "" + }, + { + "name": "results_count", + "type": "int", + "default": "" + }, + { + "name": "synthesized_answer", + "type": "str | None", + "default": "None" + }, + { + "name": "ai_generated", + "type": "bool", + "default": "False" + } + ], + "line": 28, + "doc": "" + }, + { + "name": "SearchSessionRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "user_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "queries", + "type": "list[dict]", + "default": "[]" + } + ], + "line": 38, + "doc": "" + }, + { + "name": "SearchFilterOptions", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "file_types", + "type": "list[str]", + "default": "" + }, + { + "name": "source_names", + "type": "list[str]", + "default": "" + }, + { + "name": "departments", + "type": "list[dict]", + "default": "[]" + }, + { + "name": "date_range", + "type": "dict | None", + "default": "None" + } + ], + "line": 47, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/service_account.py", + "sha256": "998b5de7ba31a8800d2feb6379c5eaa00747bccd23c05ce99863a42b0951a37f", + "routes": [], + "models": [ + { + "name": "ServiceAccountCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "role", + "type": "UserRole", + "default": "UserRole.READ_ONLY" + } + ], + "line": 9, + "doc": "" + }, + { + "name": "ServiceAccountRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "role", + "type": "UserRole", + "default": "" + }, + { + "name": "created_by", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "is_active", + "type": "bool", + "default": "" + } + ], + "line": 14, + "doc": "" + }, + { + "name": "ServiceAccountCreated", + "bases": [ + "ServiceAccountRead" + ], + "fields": [ + { + "name": "api_key", + "type": "str", + "default": "" + } + ], + "line": 25, + "doc": "Returned only on creation \u2014 includes the plaintext API key (shown once)." + }, + { + "name": "ServiceAccountUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "role", + "type": "UserRole | None", + "default": "None" + }, + { + "name": "is_active", + "type": "bool | None", + "default": "None" + } + ], + "line": 30, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/sync_failure.py", + "sha256": "7d0f1052aba113868dc3439ef78b85b8d9941cf243eb7224ca12e1d9019f9971", + "routes": [], + "models": [ + { + "name": "SyncFailureRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "source_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "source_path", + "type": "str", + "default": "" + }, + { + "name": "error_message", + "type": "str | None", + "default": "" + }, + { + "name": "error_class", + "type": "str | None", + "default": "" + }, + { + "name": "http_status_code", + "type": "int | None", + "default": "" + }, + { + "name": "retry_count", + "type": "int", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "first_failed_at", + "type": "datetime", + "default": "" + }, + { + "name": "last_retried_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "dismissed_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "dismissed_by", + "type": "uuid.UUID | None", + "default": "" + } + ], + "line": 8, + "doc": "" + }, + { + "name": "SyncRunLogRead", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "source_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "started_at", + "type": "datetime", + "default": "" + }, + { + "name": "finished_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "status", + "type": "str | None", + "default": "" + }, + { + "name": "records_attempted", + "type": "int", + "default": "" + }, + { + "name": "records_succeeded", + "type": "int", + "default": "" + }, + { + "name": "records_failed", + "type": "int", + "default": "" + }, + { + "name": "error_summary", + "type": "str | None", + "default": "" + } + ], + "line": 24, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/schemas/user.py", + "sha256": "95cee0fce572e5c68f21453c6d2ae145f4a44a7aa9e3b7a3e1d6393eebf5bf06", + "routes": [], + "models": [ + { + "name": "UserRead", + "bases": [ + "schemas.BaseUser[uuid.UUID]" + ], + "fields": [ + { + "name": "full_name", + "type": "str", + "default": "" + }, + { + "name": "role", + "type": "UserRole", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "last_login", + "type": "datetime | None", + "default": "" + }, + { + "name": "must_change_password", + "type": "bool", + "default": "False" + }, + { + "name": "department_id", + "type": "uuid.UUID | None", + "default": "None" + } + ], + "line": 10, + "doc": "" + }, + { + "name": "UserCreate", + "bases": [ + "schemas.BaseUserCreate" + ], + "fields": [ + { + "name": "full_name", + "type": "str", + "default": "''" + }, + { + "name": "role", + "type": "UserRole", + "default": "UserRole.PUBLIC" + } + ], + "line": 19, + "doc": "Self-registration schema for the public ``/auth/register`` endpoint.\n\nRole is forced server-side, never honored from the request payload:\n* In ``PORTAL_MODE=public``: role \u2192 ``UserRole.PUBLIC`` (residents who\n register via the public surface get the minimal public role, never\n STAFF).\n* In ``PORTAL_MODE=private``: ``/auth/register`` is not mounted at all,\n so this schema is unreachable in private mode. The fallback value here\n matches the private-mode non-assignability posture (PUBLIC, not STAFF)\n \u2014 which also corrects a pre-existing bug where self-register was\n silently forced to STAFF regardless of caller intent.\n\nAdmin-driven user creation (including explicit STAFF/REVIEWER/LIAISON/\nREAD_ONLY assignments) goes through ``/admin/users`` via\n:class:`AdminUserCreate`." + }, + { + "name": "AdminUserCreate", + "bases": [ + "schemas.BaseUserCreate" + ], + "fields": [ + { + "name": "full_name", + "type": "str", + "default": "''" + }, + { + "name": "role", + "type": "UserRole", + "default": "UserRole.STAFF" + }, + { + "name": "department_id", + "type": "uuid.UUID | None", + "default": "None" + } + ], + "line": 54, + "doc": "Schema for admin-only user creation endpoint. Role IS caller-supplied." + }, + { + "name": "UserUpdate", + "bases": [ + "schemas.BaseUserUpdate" + ], + "fields": [ + { + "name": "full_name", + "type": "str | None", + "default": "None" + }, + { + "name": "role", + "type": "UserRole | None", + "default": "None" + } + ], + "line": 61, + "doc": "" + }, + { + "name": "UserSelfUpdate", + "bases": [ + "schemas.BaseUserUpdate" + ], + "fields": [ + { + "name": "full_name", + "type": "str | None", + "default": "None" + } + ], + "line": 66, + "doc": "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}." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/search/__init__.py", + "sha256": "6d5a53e92963972bce100511001cfc78b65a347390a47b4273c0c62f7a88ccc9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/search/engine.py", + "sha256": "ff3c9ca2fba3293400ed1d5f4056e5a47a8673f443061b703abdace1e309d454", + "routes": [], + "models": [ + { + "name": "SearchHit", + "bases": [], + "fields": [ + { + "name": "chunk_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "document_id", + "type": "uuid.UUID", + "default": "" + }, + { + "name": "filename", + "type": "str", + "default": "" + }, + { + "name": "file_type", + "type": "str", + "default": "" + }, + { + "name": "source_path", + "type": "str", + "default": "" + }, + { + "name": "page_number", + "type": "int | None", + "default": "" + }, + { + "name": "content_text", + "type": "str", + "default": "" + }, + { + "name": "similarity_score", + "type": "float", + "default": "" + }, + { + "name": "rank", + "type": "int", + "default": "" + } + ], + "line": 13, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/search/router.py", + "sha256": "904441f2323a86199c42d647e5935c4f78bbb973c5c20a9b35e1bcc929691891", + "routes": [ + { + "method": "POST", + "path": "/search/query", + "router": "router", + "prefix_resolved": true, + "name": "execute_search", + "signature": "req: SearchRequest, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.LIAISON))", + "returns": "", + "line": 28, + "doc": "Execute a hybrid search query. Optionally synthesize an LLM answer.", + "decorator": "router.post('/query', response_model=SearchResponse)", + "errors": [ + "HTTPException(status_code=404, detail='Search session not found')" + ] + }, + { + "method": "GET", + "path": "/search/sessions", + "router": "router", + "prefix_resolved": true, + "name": "list_sessions", + "signature": "limit: int=20, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 141, + "doc": "List the current user's search sessions.", + "decorator": "router.get('/sessions', response_model=list[SearchSessionRead])", + "errors": [] + }, + { + "method": "GET", + "path": "/search/sessions/{session_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_session", + "signature": "session_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 191, + "doc": "Get a search session with its query history.", + "decorator": "router.get('/sessions/{session_id}', response_model=SearchSessionRead)", + "errors": [ + "HTTPException(status_code=404, detail='Search session not found')" + ] + }, + { + "method": "GET", + "path": "/search/filters", + "router": "router", + "prefix_resolved": true, + "name": "get_filter_options", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 226, + "doc": "Get available filter values for search.", + "decorator": "router.get('/filters', response_model=SearchFilterOptions)", + "errors": [] + }, + { + "method": "GET", + "path": "/search/export", + "router": "router", + "prefix_resolved": true, + "name": "export_search_results", + "signature": "query: str, format: str='csv', department_id: str | None=None, file_type: str | None=None, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.STAFF))", + "returns": "", + "line": 270, + "doc": "Export search results as CSV. Runs a search and streams the results.", + "decorator": "router.get('/export')", + "errors": [] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/search/synthesizer.py", + "sha256": "427e73f0cf9752fb347f7769751e7e14a522fcc6bebeb1b785440ad0f5b7e254", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/security/__init__.py", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/security/at_rest.py", + "sha256": "ae75ffc5d633a6d99180bb61e0d01f2084af917565f67cfc5a5ab1d0a055b554", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/security/host_validator.py", + "sha256": "2890b06c3440118166ca36640d0d7d06b81224eb3e540e021721712fe3c967a8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/seed/__init__.py", + "sha256": "94373caf66af4bff649d9b77dee25b4a9f03f57ba8cc507c02f889baa1d48575", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/seed/first_boot.py", + "sha256": "88b0f011853f6f60f7d488bfebe0dde96209a8d3243a08b731e4a6f682bab40b", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/service_accounts/__init__.py", + "sha256": "724c131242497b5d06cb96ed27573bdd2de4f098babe79129e6f1e20d9a5b76b", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/service_accounts/router.py", + "sha256": "c6632fc265846154c9a537070390de2c47c3d2d92c78e6fb8fb352f32ad3bf30", + "routes": [ + { + "method": "POST", + "path": "/service-accounts/", + "router": "router", + "prefix_resolved": true, + "name": "create_service_account", + "signature": "data: ServiceAccountCreate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 29, + "doc": "", + "decorator": "router.post('/', response_model=ServiceAccountCreated, status_code=201)", + "errors": [ + "HTTPException(status_code=409, detail='Name already taken')" + ] + }, + { + "method": "GET", + "path": "/service-accounts/", + "router": "router", + "prefix_resolved": true, + "name": "list_service_accounts", + "signature": "session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 72, + "doc": "", + "decorator": "router.get('/', response_model=list[ServiceAccountRead])", + "errors": [] + }, + { + "method": "PATCH", + "path": "/service-accounts/{account_id}", + "router": "router", + "prefix_resolved": true, + "name": "update_service_account", + "signature": "account_id: uuid.UUID, data: ServiceAccountUpdate, session: AsyncSession=Depends(get_async_session), user: User=Depends(require_role(UserRole.ADMIN))", + "returns": "", + "line": 81, + "doc": "", + "decorator": "router.patch('/{account_id}', response_model=ServiceAccountRead)", + "errors": [ + "HTTPException(status_code=404, detail='Service account not found')" + ] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/worker.py", + "sha256": "6b33f496ba32184cc049e6cc5c6398c2e42f1b30c51bea52ae67e768da880829", + "routes": [], + "models": [], + "configuration": [] + } + ], + "bridge": [ + { + "source": "installed-owned-source/app/desktop_bridge/__init__.py", + "sha256": "707138dfa41f7f4e91957a523e3c3394ce52803778c5b278b3cc77d4a5b1c30f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/projection.py", + "sha256": "5267b17ae6be18258ea0e225ffb0d53c56aeaf674d9426856b8db804f801008c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/records.py", + "sha256": "407b2ca9974caa761c00daee3b585ca915c2fe649a69a0dd58f42342b39821d1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/router.py", + "sha256": "7c02e0a222c36aecb84b105a918309a811f40249c3f55756d87cfa2646c4ef1b", + "routes": [ + { + "method": "GET", + "path": "/desktop/v1/public/records-state", + "router": "router", + "prefix_resolved": true, + "name": "public_records_state", + "signature": "request: Request, session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 134, + "doc": "", + "decorator": "router.get('/public/records-state', dependencies=[Depends(native_public_shell)], response_model=RecordsStateRead)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/public/requests", + "router": "router", + "prefix_resolved": true, + "name": "public_records_intake", + "signature": "data: PublicIntake, request: Request, session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 144, + "doc": "", + "decorator": "router.post('/public/requests', dependencies=[Depends(native_public_shell)])", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/public/lookup", + "router": "router", + "prefix_resolved": true, + "name": "public_records_lookup", + "signature": "data: PublicLookup, request: Request, session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 153, + "doc": "", + "decorator": "router.post('/public/lookup', dependencies=[Depends(native_public_shell)])", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/public/messages", + "router": "router", + "prefix_resolved": true, + "name": "public_records_message", + "signature": "data: PublicMessage, request: Request, session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 160, + "doc": "", + "decorator": "router.post('/public/messages', dependencies=[Depends(native_public_shell)])", + "errors": [ + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/permitting-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_permitting_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 204, + "doc": "", + "decorator": "router.post('/permitting-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/permitting-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_permitting_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 213, + "doc": "", + "decorator": "router.post('/requests/{request_id}/permitting-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Reviewed Permitting copy not found or no longer permitted.')", + "HTTPException(409, 'Permitting source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_inspections_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 239, + "doc": "", + "decorator": "router.post('/inspections-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/inspections-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_inspections_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 248, + "doc": "", + "decorator": "router.post('/requests/{request_id}/inspections-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Reviewed Inspections copy not found or no longer permitted.')", + "HTTPException(409, 'Inspections source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/planning-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_planning_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 274, + "doc": "", + "decorator": "router.post('/planning-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/planning-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_planning_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 283, + "doc": "", + "decorator": "router.post('/requests/{request_id}/planning-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Permitted Planning source not found.')", + "HTTPException(409, 'Planning source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_zoning_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 310, + "doc": "", + "decorator": "router.post('/zoning-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/zoning-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_zoning_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 319, + "doc": "", + "decorator": "router.post('/requests/{request_id}/zoning-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Permitted Zoning source not found.')", + "HTTPException(409, 'Zoning source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/records-state", + "router": "router", + "prefix_resolved": true, + "name": "get_native_records_state", + "signature": "session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 346, + "doc": "", + "decorator": "router.get('/records-state', response_model=RecordsStateRead)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_meetings_sources", + "signature": "data: MeetingsSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 355, + "doc": "", + "decorator": "router.post('/meetings-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/meetings-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_meetings_source", + "signature": "request_id: uuid.UUID, data: MeetingsSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 364, + "doc": "", + "decorator": "router.post('/requests/{request_id}/meetings-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Permitted Meetings source not found.')", + "HTTPException(409, 'Meetings source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/code-sources/search", + "router": "router", + "prefix_resolved": true, + "name": "search_code_sources", + "signature": "data: CodeSearch, request: Request, actor: User=Depends(native_records_user)", + "returns": "", + "line": 389, + "doc": "", + "decorator": "router.post('/code-sources/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/code-sources", + "router": "router", + "prefix_resolved": true, + "name": "attach_code_source", + "signature": "request_id: uuid.UUID, data: CodeSourceSelection, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 398, + "doc": "", + "decorator": "router.post('/requests/{request_id}/code-sources', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(404, 'Permitted Code source not found.')", + "HTTPException(409, 'Code source changed; search again before attaching.')", + "HTTPException(422, 'Source attachment not confirmed; existing evidence retained.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/notifications/{notification_id}/sent", + "router": "router", + "prefix_resolved": true, + "name": "mark_native_notification_sent", + "signature": "notification_id: uuid.UUID, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 423, + "doc": "", + "decorator": "router.post('/notifications/{notification_id}/sent', response_model=RecordsStateRead)", + "errors": [ + "HTTPException(404, 'Records notification not found.')", + "HTTPException(400, 'This local notification is already marked sent.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/documents", + "router": "router", + "prefix_resolved": true, + "name": "attach_native_document", + "signature": "request_id: uuid.UUID, data: AttachDocument, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 443, + "doc": "", + "decorator": "router.post('/requests/{request_id}/documents', response_model=RecordsOperationRead)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/documents/{attachment_id}/release-copy", + "router": "router", + "prefix_resolved": true, + "name": "attach_native_release_copy", + "signature": "request_id: uuid.UUID, attachment_id: uuid.UUID, data: AttachReleaseCopy, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 453, + "doc": "", + "decorator": "router.post('/requests/{request_id}/documents/{attachment_id}/release-copy', response_model=RecordsOperationRead)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/artifacts", + "router": "router", + "prefix_resolved": true, + "name": "prepare_native_artifact", + "signature": "request_id: uuid.UUID, data: PrepareArtifact, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 463, + "doc": "", + "decorator": "router.post('/requests/{request_id}/artifacts', response_model=ArtifactPlan)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/artifacts/{artifact_id}/complete", + "router": "router", + "prefix_resolved": true, + "name": "complete_native_artifact", + "signature": "request_id: uuid.UUID, artifact_id: uuid.UUID, data: CompleteArtifact, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 481, + "doc": "", + "decorator": "router.post('/requests/{request_id}/artifacts/{artifact_id}/complete', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests", + "router": "router", + "prefix_resolved": true, + "name": "create_native_request", + "signature": "data: StaffRecordsIntake, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 500, + "doc": "", + "decorator": "router.post('/requests', response_model=NativeRequestRead, status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/requests/{request_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_native_request", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 521, + "doc": "", + "decorator": "router.get('/requests/{request_id}', response_model=NativeRequestRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/requests/{request_id}/view", + "router": "router", + "prefix_resolved": true, + "name": "get_native_request_view", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 537, + "doc": "", + "decorator": "router.get('/requests/{request_id}/view', response_model=RecordsView)", + "errors": [ + "HTTPException(404, 'Records request not found.')" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/requests/{request_id}/draft-context", + "router": "router", + "prefix_resolved": true, + "name": "native_draft_context", + "signature": "request_id: uuid.UUID, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 549, + "doc": "", + "decorator": "router.get('/requests/{request_id}/draft-context')", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/generated-draft", + "router": "router", + "prefix_resolved": true, + "name": "native_generated_draft", + "signature": "request_id: uuid.UUID, data: GeneratedDraft, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 575, + "doc": "", + "decorator": "router.post('/requests/{request_id}/generated-draft', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(409, 'The draft changed during generation. Refresh before generating again.')", + "HTTPException(400, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/requests/{request_id}/actions", + "router": "router", + "prefix_resolved": true, + "name": "native_request_operation", + "signature": "request_id: uuid.UUID, command: RecordsCommand, request: Request, session: AsyncSession=Depends(get_async_session), actor: User=Depends(native_records_user)", + "returns": "", + "line": 605, + "doc": "", + "decorator": "router.post('/requests/{request_id}/actions', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found.')", + "HTTPException(400, str(error))" + ] + } + ], + "models": [ + { + "name": "MeetingsSearch", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 38, + "doc": "" + }, + { + "name": "MeetingsSourceSelection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=200)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + } + ], + "line": 43, + "doc": "" + }, + { + "name": "CodeSearch", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "as_of", + "type": "date | None", + "default": "None" + } + ], + "line": 49, + "doc": "" + }, + { + "name": "CodeSourceSelection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=200)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + }, + { + "name": "as_of", + "type": "date | None", + "default": "None" + } + ], + "line": 55, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/schemas.py", + "sha256": "753dd5474d532912bc50118fe9add74613cbc3b17a062dd93681309ac590926d", + "routes": [], + "models": [ + { + "name": "StaffRecordsIntake", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "requester", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "summary", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "deadline", + "type": "str", + "default": "" + }, + { + "name": "deadlineBasis", + "type": "str", + "default": "''" + } + ], + "line": 10, + "doc": "Existing native create-records-request input; no caller-supplied actor." + }, + { + "name": "NativeRequestRead", + "bases": [ + "RequestRead" + ], + "fields": [ + { + "name": "desktop_id", + "type": "str | None", + "default": "" + }, + { + "name": "public_tracking_number", + "type": "str | None", + "default": "" + }, + { + "name": "submitted_via", + "type": "str", + "default": "" + }, + { + "name": "deadline_label", + "type": "str", + "default": "" + }, + { + "name": "deadline_basis", + "type": "str", + "default": "" + }, + { + "name": "deadline_reviewed_at", + "type": "datetime | None", + "default": "" + } + ], + "line": 28, + "doc": "" + }, + { + "name": "AssignmentPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "assignedTo", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 41, + "doc": "" + }, + { + "name": "DeadlinePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "deadline", + "type": "str", + "default": "" + }, + { + "name": "deadlineBasis", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 45, + "doc": "" + }, + { + "name": "CalculateDeadlinePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "deadlineReceivedDate", + "type": "str", + "default": "" + }, + { + "name": "deadlineRuleName", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "deadlineDayCount", + "type": "str", + "default": "" + }, + { + "name": "deadlineDayType", + "type": "str", + "default": "" + }, + { + "name": "deadlineBasis", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 52, + "doc": "" + }, + { + "name": "ClarificationPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "clarificationNote", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 77, + "doc": "" + }, + { + "name": "MessagePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "requestMessageBody", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 81, + "doc": "" + }, + { + "name": "SearchNotePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "sourceNote", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "citation", + "type": "str", + "default": "''" + } + ], + "line": 85, + "doc": "" + }, + { + "name": "SearchReceiptPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "searchQuery", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchLocations", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchResultTitle", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchResultCitation", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchResultSummary", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "searchResultStatus", + "type": "str", + "default": "''" + }, + { + "name": "searchReviewer", + "type": "str", + "default": "''" + } + ], + "line": 90, + "doc": "" + }, + { + "name": "ExemptionNotePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "exemptionNote", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 100, + "doc": "" + }, + { + "name": "ExemptionDecisionPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "exemptionSource", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "exemptionKind", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "exemptionFinding", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "exemptionDecision", + "type": "Literal['release', 'redact', 'exempt']", + "default": "" + }, + { + "name": "exemptionBasis", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "exemptionReviewer", + "type": "str", + "default": "''" + } + ], + "line": 104, + "doc": "" + }, + { + "name": "FeeEstimatePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "feeEstimate", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 118, + "doc": "" + }, + { + "name": "FeeLinePayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "feeLineDescription", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "feeScheduleBasis", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "feeLineAmount", + "type": "str", + "default": "" + } + ], + "line": 122, + "doc": "" + }, + { + "name": "FeeWaiverPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "feeWaiverReason", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 140, + "doc": "" + }, + { + "name": "DraftPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "responseDraft", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "citation", + "type": "str", + "default": "''" + } + ], + "line": 144, + "doc": "" + }, + { + "name": "ApprovalPayload", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "approvalNote", + "type": "str", + "default": "''" + } + ], + "line": 149, + "doc": "" + }, + { + "name": "AssignCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['assign-records-request']", + "default": "" + }, + { + "name": "payload", + "type": "AssignmentPayload", + "default": "" + } + ], + "line": 153, + "doc": "" + }, + { + "name": "DeadlineCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['set-records-deadline']", + "default": "" + }, + { + "name": "payload", + "type": "DeadlinePayload", + "default": "" + } + ], + "line": 158, + "doc": "" + }, + { + "name": "CalculateDeadlineCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['calculate-records-deadline']", + "default": "" + }, + { + "name": "payload", + "type": "CalculateDeadlinePayload", + "default": "" + } + ], + "line": 163, + "doc": "" + }, + { + "name": "ClarificationCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['request-records-clarification']", + "default": "" + }, + { + "name": "payload", + "type": "ClarificationPayload", + "default": "" + } + ], + "line": 168, + "doc": "" + }, + { + "name": "MessageCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['add-records-message']", + "default": "" + }, + { + "name": "payload", + "type": "MessagePayload", + "default": "" + } + ], + "line": 173, + "doc": "" + }, + { + "name": "SearchNoteCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['record-records-search']", + "default": "" + }, + { + "name": "payload", + "type": "SearchNotePayload", + "default": "" + } + ], + "line": 178, + "doc": "" + }, + { + "name": "SearchReceiptCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['record-records-search-session']", + "default": "" + }, + { + "name": "payload", + "type": "SearchReceiptPayload", + "default": "" + } + ], + "line": 183, + "doc": "" + }, + { + "name": "ExemptionNoteCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['add-records-exemption-review']", + "default": "" + }, + { + "name": "payload", + "type": "ExemptionNotePayload", + "default": "" + } + ], + "line": 188, + "doc": "" + }, + { + "name": "ExemptionDecisionCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['add-records-exemption-decision']", + "default": "" + }, + { + "name": "payload", + "type": "ExemptionDecisionPayload", + "default": "" + } + ], + "line": 193, + "doc": "" + }, + { + "name": "FeeEstimateCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['estimate-records-fee']", + "default": "" + }, + { + "name": "payload", + "type": "FeeEstimatePayload", + "default": "" + } + ], + "line": 198, + "doc": "" + }, + { + "name": "FeeLineCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['add-records-fee-line']", + "default": "" + }, + { + "name": "payload", + "type": "FeeLinePayload", + "default": "" + } + ], + "line": 203, + "doc": "" + }, + { + "name": "FeeWaiverCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['waive-records-fee']", + "default": "" + }, + { + "name": "payload", + "type": "FeeWaiverPayload", + "default": "" + } + ], + "line": 208, + "doc": "" + }, + { + "name": "DraftCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['draft-records-response']", + "default": "" + }, + { + "name": "payload", + "type": "DraftPayload", + "default": "" + } + ], + "line": 213, + "doc": "" + }, + { + "name": "ApprovalCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['approve-records-response']", + "default": "" + }, + { + "name": "payload", + "type": "ApprovalPayload", + "default": "Field(default_factory=ApprovalPayload)" + } + ], + "line": 218, + "doc": "" + }, + { + "name": "FinishCommand", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "action", + "type": "Literal['fulfill-records-request', 'close-records-request']", + "default": "" + }, + { + "name": "payload", + "type": "NativePayload", + "default": "Field(default_factory=NativePayload)" + } + ], + "line": 223, + "doc": "" + }, + { + "name": "TimelineView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "note", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 241, + "doc": "" + }, + { + "name": "PublicStatusView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 249, + "doc": "" + }, + { + "name": "MessageView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "author", + "type": "str", + "default": "" + }, + { + "name": "author_role", + "type": "str", + "default": "" + }, + { + "name": "body", + "type": "str", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 257, + "doc": "" + }, + { + "name": "FeeLineView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "schedule_basis", + "type": "str", + "default": "" + }, + { + "name": "amount_cents", + "type": "int", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 266, + "doc": "" + }, + { + "name": "ExemptionDecisionView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "source", + "type": "str", + "default": "" + }, + { + "name": "kind", + "type": "str", + "default": "" + }, + { + "name": "finding", + "type": "str", + "default": "" + }, + { + "name": "decision", + "type": "Literal['release', 'redact', 'exempt']", + "default": "" + }, + { + "name": "basis", + "type": "str", + "default": "" + }, + { + "name": "reviewer", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 274, + "doc": "" + }, + { + "name": "SearchResultView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + } + ], + "line": 285, + "doc": "" + }, + { + "name": "SearchReceiptView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "query", + "type": "str", + "default": "" + }, + { + "name": "locations", + "type": "str", + "default": "" + }, + { + "name": "reviewer", + "type": "str", + "default": "" + }, + { + "name": "results", + "type": "list[SearchResultView]", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 293, + "doc": "" + }, + { + "name": "RecordsView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "request_id", + "type": "str", + "default": "" + }, + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "public_tracking_number", + "type": "str", + "default": "" + }, + { + "name": "requester", + "type": "str", + "default": "" + }, + { + "name": "requester_contact", + "type": "str", + "default": "" + }, + { + "name": "submitted_via", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "deadline", + "type": "str", + "default": "" + }, + { + "name": "deadline_basis", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "assigned_to", + "type": "str", + "default": "" + }, + { + "name": "clarification_notes", + "type": "list[str]", + "default": "" + }, + { + "name": "search_notes", + "type": "list[str]", + "default": "" + }, + { + "name": "search_sessions", + "type": "list[SearchReceiptView]", + "default": "" + }, + { + "name": "exemption_reviews", + "type": "list[str]", + "default": "" + }, + { + "name": "exemption_decisions", + "type": "list[ExemptionDecisionView]", + "default": "" + }, + { + "name": "fee_estimate", + "type": "str", + "default": "" + }, + { + "name": "fee_line_items", + "type": "list[FeeLineView]", + "default": "" + }, + { + "name": "fee_waiver_reason", + "type": "str", + "default": "" + }, + { + "name": "citations", + "type": "list[str]", + "default": "" + }, + { + "name": "response_draft", + "type": "str", + "default": "" + }, + { + "name": "approval_notes", + "type": "list[str]", + "default": "" + }, + { + "name": "exports", + "type": "list[str]", + "default": "" + }, + { + "name": "documents", + "type": "list['RecordsDocumentView']", + "default": "Field(default_factory=list)" + }, + { + "name": "release_packages", + "type": "list['ReleasePackageView']", + "default": "Field(default_factory=list)" + }, + { + "name": "timeline", + "type": "list[TimelineView]", + "default": "" + }, + { + "name": "public_status_events", + "type": "list[PublicStatusView]", + "default": "" + }, + { + "name": "messages", + "type": "list[MessageView]", + "default": "" + }, + { + "name": "deadline_reviewed_at_unix_seconds", + "type": "int | None", + "default": "" + }, + { + "name": "approved_at_unix_seconds", + "type": "int | None", + "default": "" + }, + { + "name": "fulfilled_at_unix_seconds", + "type": "int | None", + "default": "" + }, + { + "name": "closed_at_unix_seconds", + "type": "int | None", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 302, + "doc": "" + }, + { + "name": "RecordsOperationRead", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "request", + "type": "RecordsView", + "default": "" + } + ], + "line": 339, + "doc": "" + }, + { + "name": "RecordsStateRead", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "demo_fixture", + "type": "dict | None", + "default": "None" + }, + { + "name": "records_requests", + "type": "list[RecordsView]", + "default": "" + }, + { + "name": "notification_events", + "type": "list['NotificationView']", + "default": "Field(default_factory=list)" + }, + { + "name": "publication_events", + "type": "list['PublicationView']", + "default": "Field(default_factory=list)" + }, + { + "name": "audit_entries", + "type": "list['AuditView']", + "default": "Field(default_factory=list)" + } + ], + "line": 345, + "doc": "" + }, + { + "name": "ManagedFileReceipt", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "original_path", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "stored_path", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "file_name", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + }, + { + "name": "size_bytes", + "type": "int", + "default": "Field(ge=0, le=2147483647, strict=True)" + } + ], + "line": 353, + "doc": "" + }, + { + "name": "AttachDocument", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "citation", + "type": "str", + "default": "''" + }, + { + "name": "file", + "type": "ManagedFileReceipt", + "default": "" + } + ], + "line": 361, + "doc": "" + }, + { + "name": "AttachReleaseCopy", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "status", + "type": "Literal['release-ready copy', 'redacted copy']", + "default": "" + }, + { + "name": "note", + "type": "str", + "default": "''" + }, + { + "name": "added_by", + "type": "str", + "default": "''" + }, + { + "name": "file", + "type": "ManagedFileReceipt", + "default": "" + } + ], + "line": 367, + "doc": "" + }, + { + "name": "RecordsDocumentView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "attachment_id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "original_path", + "type": "str", + "default": "" + }, + { + "name": "stored_path", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "" + }, + { + "name": "size_bytes", + "type": "int", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "added_by", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + }, + { + "name": "release_original_path", + "type": "str", + "default": "''" + }, + { + "name": "release_stored_path", + "type": "str", + "default": "''" + }, + { + "name": "release_file_name", + "type": "str", + "default": "''" + }, + { + "name": "release_sha256", + "type": "str", + "default": "''" + }, + { + "name": "release_size_bytes", + "type": "int", + "default": "0" + }, + { + "name": "release_status", + "type": "str", + "default": "''" + }, + { + "name": "release_note", + "type": "str", + "default": "''" + }, + { + "name": "release_added_by", + "type": "str", + "default": "''" + }, + { + "name": "release_added_at_unix_seconds", + "type": "int | None", + "default": "None" + } + ], + "line": 374, + "doc": "" + }, + { + "name": "ReleasePackageView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "export_path", + "type": "str", + "default": "" + }, + { + "name": "package_hash", + "type": "str", + "default": "" + }, + { + "name": "document_count", + "type": "int", + "default": "" + }, + { + "name": "release_artifact_count", + "type": "int", + "default": "" + }, + { + "name": "search_session_count", + "type": "int", + "default": "" + }, + { + "name": "release_count", + "type": "int", + "default": "" + }, + { + "name": "redacted_count", + "type": "int", + "default": "" + }, + { + "name": "exempt_count", + "type": "int", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 397, + "doc": "" + }, + { + "name": "PrepareArtifact", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "kind", + "type": "Literal['response', 'release-package']", + "default": "" + } + ], + "line": 410, + "doc": "" + }, + { + "name": "ArtifactPlan", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "artifact_id", + "type": "str", + "default": "" + }, + { + "name": "file_name", + "type": "str", + "default": "" + }, + { + "name": "content", + "type": "str", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + } + ], + "line": 414, + "doc": "" + }, + { + "name": "CompleteArtifact", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "export_path", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 422, + "doc": "" + }, + { + "name": "PublicIntake", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "requester", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "requesterContact", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "summary", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "deadline", + "type": "str", + "default": "''" + } + ], + "line": 426, + "doc": "" + }, + { + "name": "PublicLookup", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "trackingNumber", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "requesterContact", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 433, + "doc": "" + }, + { + "name": "PublicMessage", + "bases": [ + "PublicLookup" + ], + "fields": [ + { + "name": "publicRequestMessage", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 438, + "doc": "" + }, + { + "name": "GeneratedDraft", + "bases": [ + "NativePayload" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "model", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "previous_response_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + } + ], + "line": 442, + "doc": "" + }, + { + "name": "NotificationView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "notification_id", + "type": "str", + "default": "" + }, + { + "name": "module_id", + "type": "str", + "default": "" + }, + { + "name": "record_id", + "type": "str", + "default": "" + }, + { + "name": "audience", + "type": "str", + "default": "" + }, + { + "name": "channel", + "type": "str", + "default": "" + }, + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "body", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + }, + { + "name": "sent_at_unix_seconds", + "type": "int | None", + "default": "" + } + ], + "line": 448, + "doc": "" + }, + { + "name": "PublicationView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "source_module", + "type": "str", + "default": "" + }, + { + "name": "source_record_id", + "type": "str", + "default": "" + }, + { + "name": "record_type", + "type": "str", + "default": "" + }, + { + "name": "public_payload", + "type": "str", + "default": "" + }, + { + "name": "payload_hash", + "type": "str", + "default": "" + }, + { + "name": "published_at_unix_seconds", + "type": "int", + "default": "" + }, + { + "name": "retracted_at_unix_seconds", + "type": "int | None", + "default": "None" + }, + { + "name": "retracted_by", + "type": "str", + "default": "''" + } + ], + "line": 462, + "doc": "" + }, + { + "name": "AuditView", + "bases": [ + "NativeView" + ], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "module_id", + "type": "str", + "default": "" + }, + { + "name": "action", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "created_at_unix_seconds", + "type": "int", + "default": "" + }, + { + "name": "previous_hash", + "type": "str", + "default": "" + }, + { + "name": "entry_hash", + "type": "str", + "default": "" + } + ], + "line": 474, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/app/desktop_bridge/station.py", + "sha256": "2f53398b6a897f804419ea5025895bb7dc468d8891dc553b20bb14cb5d0a8084", + "routes": [ + { + "method": "GET", + "path": "/station/context", + "router": "router", + "prefix_resolved": false, + "name": "context", + "signature": "request: Request, capability: Literal['capture', 'read'], proof: str | None=Header(default=None, alias='X-Townlight-Session'), session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 43, + "doc": "", + "decorator": "router.get('/station/context')", + "errors": [ + "HTTPException(403, 'This staff role cannot perform this Station operation')", + "HTTPException(401, str(exc))" + ] + }, + { + "method": "POST", + "path": "/requests/{request_id}/station-recordings", + "router": "router", + "prefix_resolved": false, + "name": "attach", + "signature": "request_id: UUID, data: Selection, request: Request, actor=Depends(station_actor), session: AsyncSession=Depends(get_async_session)", + "returns": "", + "line": 79, + "doc": "", + "decorator": "router.post('/requests/{request_id}/station-recordings', response_model=RecordsOperationRead)", + "errors": [ + "HTTPException(404, 'Records request not found')", + "HTTPException(409, str(exc))", + "HTTPException(422, 'Station evidence not attached; existing evidence preserved')", + "HTTPException(response.status_code, 'Station denied this recording')", + "HTTPException(409, 'Station recording is incomplete or changed; refresh selection')" + ] + } + ], + "models": [ + { + "name": "Selection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "recording_id", + "type": "UUID", + "default": "" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + } + ], + "line": 61, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_STATION_URL", + "default": "''", + "line": 33 + } + ] + } + ] + }, + "meetings": { + "package": "townlight_meetings", + "source": [ + { + "source": "installed-owned-source/townlight_meetings/__init__.py", + "sha256": "e8c6f4d348bc657f507a748a9f941317ea223f13facbc6f71d5777872d472564", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/agenda_intake.py", + "sha256": "efe504bf430447fdd19ee39fbeace4c03365c6bd5f967f29bba40bd3dd48cfd2", + "routes": [], + "models": [ + { + "name": "AgendaIntakeItem", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "department_name", + "type": "str", + "default": "" + }, + { + "name": "submitted_by", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "readiness_status", + "type": "str", + "default": "" + }, + { + "name": "source_references", + "type": "list[dict]", + "default": "" + }, + { + "name": "reviewer", + "type": "str | None", + "default": "" + }, + { + "name": "review_notes", + "type": "str | None", + "default": "" + }, + { + "name": "promoted_agenda_item_id", + "type": "str | None", + "default": "" + }, + { + "name": "promoted_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "promotion_audit_hash", + "type": "str | None", + "default": "" + }, + { + "name": "last_audit_hash", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + } + ], + "line": 51, + "doc": "Department-submitted item waiting for staff readiness review." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/agenda_lifecycle.py", + "sha256": "e1e3fb531ca432cbc94bb258454776b8f97112077c5bbcd7d015a6f82f751a14", + "routes": [], + "models": [ + { + "name": "TransitionResult", + "bases": [], + "fields": [ + { + "name": "allowed", + "type": "bool", + "default": "" + }, + { + "name": "http_status", + "type": "int", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "audit_entry", + "type": "dict[str, object]", + "default": "" + } + ], + "line": 39, + "doc": "" + }, + { + "name": "AgendaItemRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "department_name", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "'DRAFTED'" + }, + { + "name": "audit_entries", + "type": "list[dict[str, object]]", + "default": "field(default_factory=list)" + }, + { + "name": "meeting_id", + "type": "str | None", + "default": "None" + } + ], + "line": 48, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/cc7_completeness.py", + "sha256": "683d4ba8f4bf4a047e0e3d87725497f30da5210c4496e4586eecc20b1784a468", + "routes": [], + "models": [ + { + "name": "ApiCategory", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + }, + { + "name": "paths", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "protected", + "type": "bool", + "default": "" + }, + { + "name": "auth_scope", + "type": "str", + "default": "'staff-only'" + } + ], + "line": 12, + "doc": "" + }, + { + "name": "FrontendPage", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + }, + { + "name": "surface", + "type": "str", + "default": "" + }, + { + "name": "evidence_states", + "type": "tuple[str, ...]", + "default": "REQUIRED_VIEW_STATES" + } + ], + "line": 21, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/connector_import_sync.py", + "sha256": "1d30954f15c9b6d8a9afb5ef9392b4a7475bfd7d926b040707380a7005b8f96e", + "routes": [], + "models": [ + { + "name": "ImportAttempt", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "payload_path", + "type": "Path", + "default": "" + }, + { + "name": "ok", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "normalized", + "type": "dict[str, Any] | None", + "default": "None" + } + ], + "line": 14, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/connectors.py", + "sha256": "31c19cd11f63ae32db9b51f0da57ac5cc8b637a63a16c6b1287c10a7d5afda9d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/demo_seed.py", + "sha256": "d983fb6b80310ce84a0c703f55b5b35e5ecb73f8b5f0c407bab1f9edf27f5cbb", + "routes": [], + "models": [ + { + "name": "DemoSeedSummary", + "bases": [ + "TypedDict" + ], + "fields": [ + { + "name": "city", + "type": "str", + "default": "" + }, + { + "name": "meeting_body_count", + "type": "int", + "default": "" + }, + { + "name": "meeting_count", + "type": "int", + "default": "" + }, + { + "name": "agenda_intake_count", + "type": "int", + "default": "" + }, + { + "name": "packet_count", + "type": "int", + "default": "" + }, + { + "name": "notice_count", + "type": "int", + "default": "" + }, + { + "name": "motion_count", + "type": "int", + "default": "" + }, + { + "name": "minutes_draft_count", + "type": "int", + "default": "" + }, + { + "name": "public_record_count", + "type": "int", + "default": "" + }, + { + "name": "primary_meeting_id", + "type": "str", + "default": "" + } + ], + "line": 35, + "doc": "Counts and representative ids produced by the demo seed." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/desktop_delivery.py", + "sha256": "cbb7f44aee90b9ea16c60c1f64efffa8bb7204765d49a5ce80fe52e2670d384e", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/integration_contracts.py", + "sha256": "3899a7aad3af2464ab35d15fee07b952e130cb207a36d1a07dfb6986c67bd805", + "routes": [], + "models": [ + { + "name": "IntegrationCheck", + "bases": [], + "fields": [ + { + "name": "contract_id", + "type": "str", + "default": "" + }, + { + "name": "scenario", + "type": "str", + "default": "" + }, + { + "name": "ok", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 17, + "doc": "A no-network adversarial check for one integration contract." + }, + { + "name": "IntegrationContract", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "IntegrationStatus", + "default": "" + }, + { + "name": "mode", + "type": "str", + "default": "" + }, + { + "name": "proof_model", + "type": "Literal['live_wire_validation', 'in_process_boundary_validation']", + "default": "" + }, + { + "name": "dependent_module_required", + "type": "bool", + "default": "" + }, + { + "name": "network_calls", + "type": "bool", + "default": "" + }, + { + "name": "contract_artifact", + "type": "str", + "default": "" + }, + { + "name": "supported_operations", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "absent_dependency_behavior", + "type": "str", + "default": "" + }, + { + "name": "operator_fix", + "type": "str", + "default": "" + }, + { + "name": "adversarial_scenarios", + "type": "tuple[str, ...]", + "default": "" + } + ], + "line": 37, + "doc": "Operator-facing contract for an integration that may not exist yet." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/main.py", + "sha256": "d224d17b9869739b6faaddcd7213e202f8b710f72cda402479c0c6a84e737285", + "routes": [ + { + "method": "GET", + "path": "/", + "router": "app", + "prefix_resolved": true, + "name": "root", + "signature": "", + "returns": "dict[str, str]", + "line": 492, + "doc": "Describe what the runtime foundation currently provides.", + "decorator": "app.get('/')", + "errors": [] + }, + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "health", + "signature": "", + "returns": "dict[str, str]", + "line": 550, + "doc": "Provide a simple operational health check for IT staff.", + "decorator": "app.get('/health')", + "errors": [] + }, + { + "method": "GET", + "path": "/favicon.ico", + "router": "app", + "prefix_resolved": true, + "name": "favicon", + "signature": "", + "returns": "Response", + "line": 561, + "doc": "Return an empty public favicon response so browser QA stays console-clean.", + "decorator": "app.get('/favicon.ico', response_class=Response)", + "errors": [] + }, + { + "method": "GET", + "path": "/staff", + "router": "app", + "prefix_resolved": true, + "name": "staff_dashboard", + "signature": "", + "returns": "str", + "line": 567, + "doc": "Render the staff-facing workflow foundation.", + "decorator": "app.get('/staff', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/public", + "router": "app", + "prefix_resolved": true, + "name": "public_portal", + "signature": "", + "returns": "str", + "line": 617, + "doc": "Render the resident-facing public portal shell.", + "decorator": "app.get('/public', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/staff/session", + "router": "app", + "prefix_resolved": true, + "name": "staff_session", + "signature": "request: Request", + "returns": "dict[str, object]", + "line": 623, + "doc": "Describe the current staff access mode for the browser workflow shell.", + "decorator": "app.get('/staff/session')", + "errors": [ + "HTTPException(status_code=401, detail={'message': 'Staff authentication is required.', 'fix': f'The default {STAFF_AUTH_MODE_ENV_VAR}={STAFF_PROTECTED_MODE} denies anonymous staff writes. Configure bearer, trusted-header, or OIDC staff auth, or explicitly set {STAFF_AUTH_MODE_ENV_VAR}={STAFF_OPEN_MODE} only for local rehearsal.'}, headers={'WWW-Authenticate': 'Bearer'})", + "HTTPException(status_code=500, detail={'message': 'Staff session principal is missing.', 'fix': 'Retry the request with a configured bearer token or review staff auth middleware setup.'})" + ] + }, + { + "method": "GET", + "path": "/staff/login", + "router": "app", + "prefix_resolved": true, + "name": "staff_login", + "signature": "request: Request", + "returns": "RedirectResponse", + "line": 705, + "doc": "Start the municipal OIDC browser sign-in flow for staff users.", + "decorator": "app.get('/staff/login')", + "errors": [ + "HTTPException(status_code=400, detail={'message': 'OIDC browser sign-in is available only when staff auth mode is oidc.', 'fix': f'Set {STAFF_AUTH_MODE_ENV_VAR}={STAFF_OIDC_MODE} before using /staff/login.'})", + "HTTPException(status_code=503, detail={'message': 'OIDC browser sign-in is not fully configured.', 'fix': _oidc_browser_login_fix(missing)})" + ] + }, + { + "method": "GET", + "path": "/staff/oidc/callback", + "router": "app", + "prefix_resolved": true, + "name": "staff_oidc_callback", + "signature": "request: Request", + "returns": "RedirectResponse", + "line": 763, + "doc": "Complete the OIDC authorization-code callback and issue a staff session cookie.", + "decorator": "app.get('/staff/oidc/callback')", + "errors": [ + "HTTPException(status_code=400, detail={'message': 'OIDC callback received while staff auth mode is not oidc.', 'fix': f'Set {STAFF_AUTH_MODE_ENV_VAR}={STAFF_OIDC_MODE}, then restart sign-in from /staff/login.'})", + "HTTPException(status_code=400, detail={'message': 'OIDC provider returned a sign-in error.', 'fix': f\"Review the provider response '{callback_error}', then restart sign-in from /staff/login.\"})", + "HTTPException(status_code=400, detail={'message': 'OIDC sign-in state did not match.', 'fix': 'Restart sign-in from /staff/login. If this repeats, confirm cookies are allowed for the CivicMeetings host.'})", + "HTTPException(status_code=400, detail={'message': 'OIDC sign-in PKCE verifier is missing.', 'fix': 'Restart sign-in from /staff/login. If this repeats, confirm cookies are allowed for the CivicMeetings host.'})", + "HTTPException(status_code=400, detail={'message': 'OIDC callback did not include an authorization code.', 'fix': 'Restart sign-in from /staff/login and confirm the provider uses authorization-code flow.'})", + "HTTPException(status_code=503, detail={'message': 'OIDC browser sign-in is not fully configured.', 'fix': _oidc_browser_login_fix(missing)})", + "HTTPException(status_code=502, detail={'message': 'OIDC token response did not include an ID token or access token.', 'fix': 'Confirm the provider app registration issues an ID token or API access token for CivicMeetings.'})" + ] + }, + { + "method": "GET", + "path": "/staff/logout", + "router": "app", + "prefix_resolved": true, + "name": "staff_logout", + "signature": "request: Request", + "returns": "RedirectResponse", + "line": 861, + "doc": "Clear the local CivicMeetings staff browser session.", + "decorator": "app.get('/staff/logout')", + "errors": [] + }, + { + "method": "POST", + "path": "/staff/logout", + "router": "app", + "prefix_resolved": true, + "name": "staff_logout", + "signature": "request: Request", + "returns": "RedirectResponse", + "line": 861, + "doc": "Clear the local CivicMeetings staff browser session.", + "decorator": "app.post('/staff/logout')", + "errors": [] + }, + { + "method": "GET", + "path": "/staff/auth-readiness", + "router": "app", + "prefix_resolved": true, + "name": "staff_auth_readiness", + "signature": "", + "returns": "dict[str, object]", + "line": 873, + "doc": "Report whether the current staff auth mode is configured for safe use.", + "decorator": "app.get('/staff/auth-readiness')", + "errors": [] + }, + { + "method": "GET", + "path": "/admin/config", + "router": "app", + "prefix_resolved": true, + "name": "admin_config", + "signature": "", + "returns": "dict[str, object]", + "line": 935, + "doc": "Describe CC-7 runtime coverage and staff-auth configuration posture.", + "decorator": "app.get('/admin/config')", + "errors": [] + }, + { + "method": "GET", + "path": "/integrations/readiness", + "router": "app", + "prefix_resolved": true, + "name": "integrations_readiness", + "signature": "", + "returns": "dict[str, object]", + "line": 968, + "doc": "Report live or in-process integration boundary contracts.", + "decorator": "app.get('/integrations/readiness')", + "errors": [] + }, + { + "method": "GET", + "path": "/admin/prompts", + "router": "app", + "prefix_resolved": true, + "name": "admin_prompts", + "signature": "", + "returns": "dict[str, object]", + "line": 975, + "doc": "List prompt-library definitions and public approval gates for admins.", + "decorator": "app.get('/admin/prompts')", + "errors": [] + }, + { + "method": "POST", + "path": "/agenda-items", + "router": "app", + "prefix_resolved": true, + "name": "create_agenda_item", + "signature": "payload: AgendaItemCreate", + "returns": "dict[str, str]", + "line": 1009, + "doc": "Create a draft agenda item for lifecycle enforcement.", + "decorator": "app.post('/agenda-items', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/agenda-items/{item_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_agenda_item", + "signature": "item_id: str", + "returns": "dict[str, str]", + "line": 1018, + "doc": "Return the current agenda item state.", + "decorator": "app.get('/agenda-items/{item_id}')", + "errors": [ + "HTTPException(status_code=404, detail='Agenda item not found.')" + ] + }, + { + "method": "POST", + "path": "/agenda-items/{item_id}/transitions", + "router": "app", + "prefix_resolved": true, + "name": "transition_agenda_item", + "signature": "item_id: str, payload: AgendaItemTransitionRequest", + "returns": "dict[str, str]", + "line": 1027, + "doc": "Apply a canonical agenda item lifecycle transition.", + "decorator": "app.post('/agenda-items/{item_id}/transitions')", + "errors": [ + "HTTPException(status_code=404, detail='Agenda item not found.')", + "HTTPException(status_code=result.http_status, detail={'message': result.message, 'fix': result.fix, 'current_status': item.status, 'requested_status': payload.to_status})" + ] + }, + { + "method": "GET", + "path": "/agenda-items/{item_id}/audit", + "router": "app", + "prefix_resolved": true, + "name": "get_agenda_item_audit", + "signature": "item_id: str", + "returns": "dict[str, list[dict[str, object]]]", + "line": 1058, + "doc": "Return lifecycle audit entries for an agenda item.", + "decorator": "app.get('/agenda-items/{item_id}/audit')", + "errors": [ + "HTTPException(status_code=404, detail='Agenda item not found.')" + ] + }, + { + "method": "POST", + "path": "/agenda-intake", + "router": "app", + "prefix_resolved": true, + "name": "submit_agenda_intake_item", + "signature": "payload: AgendaIntakeCreate", + "returns": "dict", + "line": 1067, + "doc": "Submit a department agenda item into the database-backed staff queue.", + "decorator": "app.post('/agenda-intake', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/agenda-intake", + "router": "app", + "prefix_resolved": true, + "name": "list_agenda_intake_items", + "signature": "readiness_status: str | None=None", + "returns": "dict[str, list[dict]]", + "line": 1080, + "doc": "List department-submitted agenda intake items awaiting staff review.", + "decorator": "app.get('/agenda-intake')", + "errors": [] + }, + { + "method": "POST", + "path": "/agenda-intake/{item_id}/review", + "router": "app", + "prefix_resolved": true, + "name": "review_agenda_intake_item", + "signature": "item_id: str, payload: AgendaIntakeReviewRequest", + "returns": "dict", + "line": 1093, + "doc": "Record clerk readiness review for an intake queue item.", + "decorator": "app.post('/agenda-intake/{item_id}/review')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Agenda intake item not found.', 'fix': 'Submit the agenda item into the intake queue before review.'})" + ] + }, + { + "method": "POST", + "path": "/agenda-intake/{item_id}/promote", + "router": "app", + "prefix_resolved": true, + "name": "promote_agenda_intake_item", + "signature": "item_id: str, payload: AgendaIntakePromoteRequest, response: Response", + "returns": "dict", + "line": 1116, + "doc": "Promote a clerk-ready intake item into the canonical agenda lifecycle.", + "decorator": "app.post('/agenda-intake/{item_id}/promote', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Agenda intake item not found.', 'fix': 'Submit the agenda item into intake, then complete clerk review before promotion.'})", + "HTTPException(status_code=409, detail={'message': 'Agenda intake item is not ready for agenda promotion.', 'current_readiness_status': intake_item.readiness_status, 'fix': 'Mark the item ready in the clerk review queue, then promote it to agenda work.'})", + "HTTPException(status_code=404, detail={'message': 'Agenda intake item disappeared during promotion.', 'fix': 'Reload the intake queue and retry promotion from the current record.'})", + "HTTPException(status_code=500, detail={'message': 'Agenda item promotion could not complete its lifecycle transitions.', 'fix': 'Retry promotion after confirming the agenda lifecycle service is available.'})" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/staff-reports", + "router": "app", + "prefix_resolved": true, + "name": "create_staff_report", + "signature": "meeting_id: str, payload: StaffReportCreate", + "returns": "dict[str, object]", + "line": 1193, + "doc": "Normalize a staff report into the clerk-visible agenda intake trail.", + "decorator": "app.post('/meetings/{meeting_id}/staff-reports', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/staff-reports", + "router": "app", + "prefix_resolved": true, + "name": "list_staff_reports", + "signature": "meeting_id: str", + "returns": "dict[str, object]", + "line": 1222, + "doc": "List staff report records linked to a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/staff-reports')", + "errors": [] + }, + { + "method": "POST", + "path": "/meeting-bodies", + "router": "app", + "prefix_resolved": true, + "name": "create_meeting_body", + "signature": "payload: MeetingBodyCreate", + "returns": "dict[str, str | bool]", + "line": 1246, + "doc": "Create a municipal meeting body for staff calendar workflows.", + "decorator": "app.post('/meeting-bodies', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/meeting-bodies", + "router": "app", + "prefix_resolved": true, + "name": "list_meeting_bodies", + "signature": "active_only: bool=False", + "returns": "dict[str, int | list[dict[str, str | bool]]]", + "line": 1257, + "doc": "List municipal meeting bodies for staff setup and scheduling clients.", + "decorator": "app.get('/meeting-bodies')", + "errors": [] + }, + { + "method": "GET", + "path": "/meeting-bodies/{body_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_meeting_body", + "signature": "body_id: str", + "returns": "dict[str, str | bool]", + "line": 1268, + "doc": "Return one municipal meeting body.", + "decorator": "app.get('/meeting-bodies/{body_id}')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting body not found.')" + ] + }, + { + "method": "PATCH", + "path": "/meeting-bodies/{body_id}", + "router": "app", + "prefix_resolved": true, + "name": "update_meeting_body", + "signature": "body_id: str, payload: MeetingBodyUpdate", + "returns": "dict[str, str | bool]", + "line": 1278, + "doc": "Update a municipal meeting body without losing its record identity.", + "decorator": "app.patch('/meeting-bodies/{body_id}')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting body not found.')" + ] + }, + { + "method": "DELETE", + "path": "/meeting-bodies/{body_id}", + "router": "app", + "prefix_resolved": true, + "name": "deactivate_meeting_body", + "signature": "body_id: str", + "returns": "dict[str, str | bool]", + "line": 1296, + "doc": "Deactivate a meeting body instead of hard-deleting legal history.", + "decorator": "app.delete('/meeting-bodies/{body_id}')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting body not found.')" + ] + }, + { + "method": "POST", + "path": "/meetings", + "router": "app", + "prefix_resolved": true, + "name": "create_meeting", + "signature": "payload: MeetingCreate", + "returns": "dict[str, str]", + "line": 1306, + "doc": "Create a scheduled meeting for lifecycle enforcement.", + "decorator": "app.post('/meetings', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/meetings", + "router": "app", + "prefix_resolved": true, + "name": "list_meetings", + "signature": "", + "returns": "dict[str, int | list[dict[str, str | None]]]", + "line": 1322, + "doc": "List meetings for staff calendar and dashboard clients.", + "decorator": "app.get('/meetings')", + "errors": [] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_meeting", + "signature": "meeting_id: str", + "returns": "dict[str, str]", + "line": 1329, + "doc": "Return the current meeting state.", + "decorator": "app.get('/meetings/{meeting_id}')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "PATCH", + "path": "/meetings/{meeting_id}", + "router": "app", + "prefix_resolved": true, + "name": "update_meeting_schedule", + "signature": "meeting_id: str, payload: MeetingUpdate", + "returns": "dict[str, str]", + "line": 1338, + "doc": "Edit staff scheduling fields before the public meeting is locked.", + "decorator": "app.patch('/meetings/{meeting_id}')", + "errors": [ + "HTTPException(status_code=422, detail={'message': 'Meeting update did not include any schedule fields.', 'fix': 'Send at least one of title, meeting_type, scheduled_start, meeting_body_id, or location.'})", + "HTTPException(status_code=404, detail='Meeting not found.')", + "HTTPException(status_code=409, detail={'message': exc.message, 'fix': exc.fix})" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/transitions", + "router": "app", + "prefix_resolved": true, + "name": "transition_meeting", + "signature": "meeting_id: str, payload: MeetingTransitionRequest", + "returns": "dict[str, str]", + "line": 1391, + "doc": "Apply a canonical meeting lifecycle transition.", + "decorator": "app.post('/meetings/{meeting_id}/transitions')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')", + "HTTPException(status_code=result.http_status, detail={'message': result.message, 'fix': result.fix, 'current_status': meeting.status, 'requested_status': payload.to_status})" + ] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/audit", + "router": "app", + "prefix_resolved": true, + "name": "get_meeting_audit", + "signature": "meeting_id: str", + "returns": "dict[str, list[dict[str, object]]]", + "line": 1424, + "doc": "Return lifecycle audit entries for a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/audit')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/packet-snapshots", + "router": "app", + "prefix_resolved": true, + "name": "create_packet_snapshot", + "signature": "meeting_id: str, payload: PacketSnapshotCreate", + "returns": "dict", + "line": 1433, + "doc": "Create an immutable packet snapshot version for a meeting.", + "decorator": "app.post('/meetings/{meeting_id}/packet-snapshots', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/packet-snapshots", + "router": "app", + "prefix_resolved": true, + "name": "list_packet_snapshots", + "signature": "meeting_id: str", + "returns": "dict[str, list[dict]]", + "line": 1449, + "doc": "Return packet snapshot versions for a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/packet-snapshots')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/packet-assemblies", + "router": "app", + "prefix_resolved": true, + "name": "create_packet_assembly_record", + "signature": "meeting_id: str, payload: PacketAssemblyCreate", + "returns": "dict", + "line": 1463, + "doc": "Create a persisted packet assembly record tied to a packet snapshot.", + "decorator": "app.post('/meetings/{meeting_id}/packet-assemblies', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/packet-assemblies", + "router": "app", + "prefix_resolved": true, + "name": "list_packet_assembly_records", + "signature": "meeting_id: str", + "returns": "dict[str, list[dict]]", + "line": 1489, + "doc": "List persisted packet assembly records for a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/packet-assemblies')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "POST", + "path": "/packet-assemblies/{record_id}/finalize", + "router": "app", + "prefix_resolved": true, + "name": "finalize_packet_assembly_record", + "signature": "record_id: str, payload: PacketAssemblyFinalizeRequest", + "returns": "dict", + "line": 1503, + "doc": "Finalize a persisted packet assembly record.", + "decorator": "app.post('/packet-assemblies/{record_id}/finalize')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Packet assembly record not found.', 'fix': 'Create the packet assembly record before finalizing it.'})" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/export-bundle", + "router": "app", + "prefix_resolved": true, + "name": "create_packet_export_bundle", + "signature": "meeting_id: str, payload: PacketExportCreate", + "returns": "dict", + "line": 1524, + "doc": "Create a records-ready packet export bundle with manifest, checksums, and audit.", + "decorator": "app.post('/meetings/{meeting_id}/export-bundle', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')", + "HTTPException(status_code=error.http_status, detail=error.public_dict())" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/notices/check", + "router": "app", + "prefix_resolved": true, + "name": "check_notice_compliance", + "signature": "meeting_id: str, payload: NoticeComplianceRequest", + "returns": "dict", + "line": 1559, + "doc": "Check public notice compliance without posting.", + "decorator": "app.post('/meetings/{meeting_id}/notices/check')", + "errors": [ + "HTTPException(status_code=result.http_status, detail={'message': 'Notice is not ready for public posting. Review the warnings and fix each item.', 'warnings': result.warnings})" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/notice-checklists", + "router": "app", + "prefix_resolved": true, + "name": "create_notice_checklist_record", + "signature": "meeting_id: str, payload: NoticeChecklistCreate", + "returns": "dict", + "line": 1577, + "doc": "Persist a notice compliance checklist record for staff review.", + "decorator": "app.post('/meetings/{meeting_id}/notice-checklists', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/notice-checklists", + "router": "app", + "prefix_resolved": true, + "name": "list_notice_checklist_records", + "signature": "meeting_id: str", + "returns": "dict[str, list[dict]]", + "line": 1599, + "doc": "List persisted notice checklist records for a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/notice-checklists')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "POST", + "path": "/notice-checklists/{record_id}/posting-proof", + "router": "app", + "prefix_resolved": true, + "name": "attach_notice_posting_proof", + "signature": "record_id: str, payload: NoticePostingProofCreate", + "returns": "dict", + "line": 1613, + "doc": "Attach posting proof metadata to a persisted notice checklist record.", + "decorator": "app.post('/notice-checklists/{record_id}/posting-proof')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Notice checklist record not found.', 'fix': 'Create the notice checklist record before attaching posting proof.'})" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/notices/post", + "router": "app", + "prefix_resolved": true, + "name": "post_notice", + "signature": "meeting_id: str, payload: NoticeComplianceRequest", + "returns": "dict", + "line": 1635, + "doc": "Post a public notice after deadline and human-approval checks pass.", + "decorator": "app.post('/meetings/{meeting_id}/notices/post', status_code=201)", + "errors": [ + "HTTPException(status_code=result.http_status, detail={'message': 'Notice cannot be posted publicly. Review the warnings and fix each item.', 'warnings': result.warnings})" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/motions", + "router": "app", + "prefix_resolved": true, + "name": "capture_motion", + "signature": "meeting_id: str, payload: MotionCreate", + "returns": "dict", + "line": 1653, + "doc": "Capture an immutable motion for a meeting.", + "decorator": "app.post('/meetings/{meeting_id}/motions', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/motions", + "router": "app", + "prefix_resolved": true, + "name": "list_motions", + "signature": "meeting_id: str", + "returns": "dict[str, list[dict]]", + "line": 1668, + "doc": "List captured motions and correction records for a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/motions')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "PUT", + "path": "/motions/{motion_id}", + "router": "app", + "prefix_resolved": true, + "name": "reject_motion_mutation", + "signature": "motion_id: str", + "returns": "None", + "line": 1683, + "doc": "Reject edits to captured motions; corrections must be append-only.", + "decorator": "app.put('/motions/{motion_id}')", + "errors": [ + "HTTPException(status_code=409, detail={'message': 'Captured motions are immutable.', 'fix': 'Use POST /motions/{motion_id}/corrections to add a correction record that references the original motion.'})", + "HTTPException(status_code=404, detail='Motion not found.')" + ] + }, + { + "method": "PATCH", + "path": "/motions/{motion_id}", + "router": "app", + "prefix_resolved": true, + "name": "reject_motion_mutation", + "signature": "motion_id: str", + "returns": "None", + "line": 1683, + "doc": "Reject edits to captured motions; corrections must be append-only.", + "decorator": "app.patch('/motions/{motion_id}')", + "errors": [ + "HTTPException(status_code=409, detail={'message': 'Captured motions are immutable.', 'fix': 'Use POST /motions/{motion_id}/corrections to add a correction record that references the original motion.'})", + "HTTPException(status_code=404, detail='Motion not found.')" + ] + }, + { + "method": "POST", + "path": "/motions/{motion_id}/corrections", + "router": "app", + "prefix_resolved": true, + "name": "correct_motion", + "signature": "motion_id: str, payload: MotionCorrectionCreate", + "returns": "dict", + "line": 1697, + "doc": "Create an append-only correction record for a captured motion.", + "decorator": "app.post('/motions/{motion_id}/corrections', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Motion not found.')" + ] + }, + { + "method": "POST", + "path": "/motions/{motion_id}/votes", + "router": "app", + "prefix_resolved": true, + "name": "capture_vote", + "signature": "motion_id: str, payload: VoteCreate", + "returns": "dict", + "line": 1711, + "doc": "Capture an immutable vote for a motion.", + "decorator": "app.post('/motions/{motion_id}/votes', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Motion not found.')" + ] + }, + { + "method": "GET", + "path": "/motions/{motion_id}/votes", + "router": "app", + "prefix_resolved": true, + "name": "list_votes", + "signature": "motion_id: str", + "returns": "dict[str, list[dict]]", + "line": 1728, + "doc": "List captured votes and correction records for a motion.", + "decorator": "app.get('/motions/{motion_id}/votes')", + "errors": [ + "HTTPException(status_code=404, detail='Motion not found.')" + ] + }, + { + "method": "PUT", + "path": "/votes/{vote_id}", + "router": "app", + "prefix_resolved": true, + "name": "reject_vote_mutation", + "signature": "vote_id: str", + "returns": "None", + "line": 1743, + "doc": "Reject edits to captured votes; corrections must be append-only.", + "decorator": "app.put('/votes/{vote_id}')", + "errors": [ + "HTTPException(status_code=409, detail={'message': 'Captured votes are immutable.', 'fix': 'Use POST /votes/{vote_id}/corrections to add a correction record that references the original vote.'})", + "HTTPException(status_code=404, detail='Vote not found.')" + ] + }, + { + "method": "PATCH", + "path": "/votes/{vote_id}", + "router": "app", + "prefix_resolved": true, + "name": "reject_vote_mutation", + "signature": "vote_id: str", + "returns": "None", + "line": 1743, + "doc": "Reject edits to captured votes; corrections must be append-only.", + "decorator": "app.patch('/votes/{vote_id}')", + "errors": [ + "HTTPException(status_code=409, detail={'message': 'Captured votes are immutable.', 'fix': 'Use POST /votes/{vote_id}/corrections to add a correction record that references the original vote.'})", + "HTTPException(status_code=404, detail='Vote not found.')" + ] + }, + { + "method": "POST", + "path": "/votes/{vote_id}/corrections", + "router": "app", + "prefix_resolved": true, + "name": "correct_vote", + "signature": "vote_id: str, payload: VoteCorrectionCreate", + "returns": "dict", + "line": 1757, + "doc": "Create an append-only correction record for a captured vote.", + "decorator": "app.post('/votes/{vote_id}/corrections', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Vote not found.')" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/action-items", + "router": "app", + "prefix_resolved": true, + "name": "create_action_item", + "signature": "meeting_id: str, payload: ActionItemCreate", + "returns": "dict", + "line": 1771, + "doc": "Create an action item linked to a meeting outcome.", + "decorator": "app.post('/meetings/{meeting_id}/action-items', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')", + "HTTPException(status_code=422, detail={'message': 'Action items must reference a captured meeting outcome.', 'fix': 'Capture the related motion first, then send its id as source_motion_id.'})", + "HTTPException(status_code=404, detail='Source motion not found.')", + "HTTPException(status_code=422, detail={'message': 'Action item source motion belongs to a different meeting.', 'fix': 'Use a motion captured for this meeting as source_motion_id.'})" + ] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/action-items", + "router": "app", + "prefix_resolved": true, + "name": "list_action_items", + "signature": "meeting_id: str", + "returns": "dict[str, list[dict]]", + "line": 1809, + "doc": "List action items linked to a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/action-items')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/ordinance-resolution-handoff", + "router": "app", + "prefix_resolved": true, + "name": "create_ordinance_resolution_handoff", + "signature": "meeting_id: str, payload: OrdinanceResolutionHandoffCreate", + "returns": "dict[str, object]", + "line": 2063, + "doc": "Create a code-drafting handoff from adopted meeting action.", + "decorator": "app.post('/meetings/{meeting_id}/ordinance-resolution-handoff', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Source motion not found.')", + "HTTPException(status_code=422, detail={'message': 'Ordinance or resolution source motion belongs to a different meeting.', 'fix': 'Use a motion captured for this meeting, then retry the handoff.'})" + ] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/ordinance-resolution-handoff", + "router": "app", + "prefix_resolved": true, + "name": "list_ordinance_resolution_handoffs", + "signature": "meeting_id: str", + "returns": "dict[str, object]", + "line": 2112, + "doc": "List ordinance and resolution handoffs for a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/ordinance-resolution-handoff')", + "errors": [] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/ordinance-resolution-handoff/retry", + "router": "app", + "prefix_resolved": true, + "name": "retry_ordinance_resolution_handoff", + "signature": "meeting_id: str, payload: OrdinanceResolutionHandoffRetry | None=None", + "returns": "dict[str, object]", + "line": 2125, + "doc": "Retry TownlightCode emission for failed or unconfigured ordinance handoffs.", + "decorator": "app.post('/meetings/{meeting_id}/ordinance-resolution-handoff/retry')", + "errors": [ + "HTTPException(status_code=404, detail='Handoff not found.')" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/minutes/drafts", + "router": "app", + "prefix_resolved": true, + "name": "create_minutes_draft", + "signature": "meeting_id: str, payload: MinutesDraftCreate", + "returns": "dict", + "line": 2159, + "doc": "Create a cited minutes draft from staff-provided sentence text.", + "decorator": "app.post('/meetings/{meeting_id}/minutes/drafts', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')", + "HTTPException(status_code=422, detail={'message': result.message, 'fix': result.fix})" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/minutes/ai-assist", + "router": "app", + "prefix_resolved": true, + "name": "create_minutes_ai_assist", + "signature": "meeting_id: str, payload: MinutesAiAssistCreate", + "returns": "dict", + "line": 2197, + "doc": "Generate an optional Ollama-assisted cited minutes draft.", + "decorator": "app.post('/meetings/{meeting_id}/minutes/ai-assist', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')", + "HTTPException(status_code=422, detail={'message': result.message, 'fix': result.fix})", + "HTTPException(status_code=503, detail=_minutes_ai_unavailable_detail(str(exc)))" + ] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/minutes/drafts", + "router": "app", + "prefix_resolved": true, + "name": "list_minutes_drafts", + "signature": "meeting_id: str", + "returns": "dict[str, list[dict]]", + "line": 2243, + "doc": "List citation-gated minutes drafts for a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/minutes/drafts')", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')" + ] + }, + { + "method": "POST", + "path": "/minutes/{minute_id}/post", + "router": "app", + "prefix_resolved": true, + "name": "reject_automatic_minutes_posting", + "signature": "minute_id: str", + "returns": "None", + "line": 2257, + "doc": "Reject automatic public posting of AI-drafted minutes.", + "decorator": "app.post('/minutes/{minute_id}/post')", + "errors": [ + "HTTPException(status_code=409, detail={'message': 'AI-drafted minutes cannot be posted automatically.', 'fix': 'Review, cite-check, and adopt minutes through a human approval workflow before public posting.'})", + "HTTPException(status_code=404, detail='Minutes draft not found.')" + ] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/transcripts", + "router": "app", + "prefix_resolved": true, + "name": "create_transcript_record", + "signature": "meeting_id: str, payload: TranscriptCreate", + "returns": "dict[str, object]", + "line": 2271, + "doc": "Capture transcript material for clerk review before public release.", + "decorator": "app.post('/meetings/{meeting_id}/transcripts', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/meetings/{meeting_id}/transcripts", + "router": "app", + "prefix_resolved": true, + "name": "list_transcript_records", + "signature": "meeting_id: str", + "returns": "dict[str, object]", + "line": 2295, + "doc": "List transcript records queued for a meeting.", + "decorator": "app.get('/meetings/{meeting_id}/transcripts')", + "errors": [] + }, + { + "method": "POST", + "path": "/meetings/{meeting_id}/public-record", + "router": "app", + "prefix_resolved": true, + "name": "publish_public_record", + "signature": "meeting_id: str, payload: PublicMeetingRecordCreate", + "returns": "dict", + "line": 2309, + "doc": "Create a public or restricted archive record for a meeting.", + "decorator": "app.post('/meetings/{meeting_id}/public-record', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Meeting not found.')", + "HTTPException(status_code=404, detail={'message': 'Meeting not found in the public archive database.', 'fix': 'Point TOWNLIGHT_MEETINGS_PUBLIC_ARCHIVE_DB_URL at the same database as TOWNLIGHT_MEETINGS_MEETING_DB_URL so published records reference real meetings.'})" + ] + }, + { + "method": "POST", + "path": "/imports/{connector_name}/meetings", + "router": "app", + "prefix_resolved": true, + "name": "import_connector_meeting", + "signature": "connector_name: str, payload: dict", + "returns": "dict", + "line": 2347, + "doc": "Import a local connector export payload without outbound network calls.", + "decorator": "app.post('/imports/{connector_name}/meetings', status_code=201)", + "errors": [ + "HTTPException(status_code=status_code, detail=error.public_dict())" + ] + }, + { + "method": "POST", + "path": "/vendor-live-sync/sources", + "router": "app", + "prefix_resolved": true, + "name": "create_vendor_live_sync_source", + "signature": "payload: VendorSyncSourceCreate", + "returns": "dict", + "line": 2365, + "doc": "Create a durable vendor live-sync source record without contacting the vendor.", + "decorator": "app.post('/vendor-live-sync/sources', status_code=201)", + "errors": [ + "HTTPException(status_code=422, detail=error.public_dict())" + ] + }, + { + "method": "GET", + "path": "/vendor-live-sync/sources", + "router": "app", + "prefix_resolved": true, + "name": "list_vendor_live_sync_sources", + "signature": "", + "returns": "dict[str, object]", + "line": 2386, + "doc": "List persisted vendor live-sync source health without contacting vendors.", + "decorator": "app.get('/vendor-live-sync/sources')", + "errors": [] + }, + { + "method": "POST", + "path": "/vendor-live-sync/sources/{source_id}/cursor-reset", + "router": "app", + "prefix_resolved": true, + "name": "reset_vendor_live_sync_cursor", + "signature": "source_id: str, payload: VendorSyncCursorReset", + "returns": "dict[str, object]", + "line": 2398, + "doc": "Clear or move a vendor delta cursor without contacting the vendor network.", + "decorator": "app.post('/vendor-live-sync/sources/{source_id}/cursor-reset')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Vendor live-sync source not found.', 'fix': 'Create the source with POST /vendor-live-sync/sources before resetting its cursor.'})" + ] + }, + { + "method": "POST", + "path": "/vendor-live-sync/sources/{source_id}/run-log", + "router": "app", + "prefix_resolved": true, + "name": "record_vendor_live_sync_run", + "signature": "source_id: str, payload: VendorSyncRunRecordCreate", + "returns": "dict", + "line": 2431, + "doc": "Record one vendor sync run outcome without starting a vendor pull.", + "decorator": "app.post('/vendor-live-sync/sources/{source_id}/run-log', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Vendor live-sync source not found.', 'fix': 'Create the source with POST /vendor-live-sync/sources before recording a run outcome.'})" + ] + }, + { + "method": "GET", + "path": "/vendor-live-sync/sources/{source_id}/run-log", + "router": "app", + "prefix_resolved": true, + "name": "list_vendor_live_sync_runs", + "signature": "source_id: str", + "returns": "dict[str, object]", + "line": 2463, + "doc": "Return persisted run history for one vendor source without contacting vendors.", + "decorator": "app.get('/vendor-live-sync/sources/{source_id}/run-log')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Vendor live-sync source not found.', 'fix': 'Create the source with POST /vendor-live-sync/sources before viewing run history.'})" + ] + }, + { + "method": "GET", + "path": "/public/meetings", + "router": "app", + "prefix_resolved": true, + "name": "public_meetings", + "signature": "", + "returns": "dict[str, int | list[dict]]", + "line": 2484, + "doc": "Return public meeting calendar records only.", + "decorator": "app.get('/public/meetings')", + "errors": [] + }, + { + "method": "GET", + "path": "/public/meetings/{record_id}", + "router": "app", + "prefix_resolved": true, + "name": "public_meeting_detail", + "signature": "record_id: str", + "returns": "dict", + "line": 2494, + "doc": "Return one public meeting record without revealing restricted records.", + "decorator": "app.get('/public/meetings/{record_id}')", + "errors": [ + "HTTPException(status_code=404, detail='Public meeting record not found.')" + ] + }, + { + "method": "GET", + "path": "/public/meetings/{record_id}/{document_kind}.txt", + "router": "app", + "prefix_resolved": true, + "name": "public_meeting_download", + "signature": "record_id: str, document_kind: str", + "returns": "Response", + "line": 2503, + "doc": "Download one public-safe agenda, packet, or adopted-minutes text file.", + "decorator": "app.get('/public/meetings/{record_id}/{document_kind}.txt')", + "errors": [ + "HTTPException(status_code=404, detail='Public meeting record not found.')", + "HTTPException(status_code=404, detail={'message': 'Public meeting document not found.', 'fix': 'Use agenda.txt, packet.txt, or minutes.txt from the public meeting detail response.'})" + ] + }, + { + "method": "POST", + "path": "/public/meetings/{record_id}/comments", + "router": "app", + "prefix_resolved": true, + "name": "submit_public_comment", + "signature": "record_id: str, payload: PublicCommentCreate", + "returns": "dict", + "line": 2530, + "doc": "Accept a resident comment only for public records with comment intake enabled.", + "decorator": "app.post('/public/meetings/{record_id}/comments', status_code=201)", + "errors": [ + "HTTPException(status_code=404, detail='Public meeting record not found.')", + "HTTPException(status_code=409, detail={'message': 'Public comment intake is closed for this meeting record.', 'fix': 'Contact the clerk for the official comment method or check the posted agenda for comment instructions.'})" + ] + }, + { + "method": "GET", + "path": "/public/meetings/{record_id}/comments", + "router": "app", + "prefix_resolved": true, + "name": "list_public_comments", + "signature": "record_id: str", + "returns": "dict[str, int | list[dict]]", + "line": 2557, + "doc": "List resident comments collected for a public record.", + "decorator": "app.get('/public/meetings/{record_id}/comments')", + "errors": [ + "HTTPException(status_code=404, detail='Public meeting record not found.')" + ] + }, + { + "method": "GET", + "path": "/public-comments/review-queue", + "router": "app", + "prefix_resolved": true, + "name": "list_public_comment_review_queue", + "signature": "", + "returns": "dict[str, object]", + "line": 2567, + "doc": "List resident comments awaiting staff review across public records.", + "decorator": "app.get('/public-comments/review-queue')", + "errors": [] + }, + { + "method": "GET", + "path": "/public/archive/search", + "router": "app", + "prefix_resolved": true, + "name": "public_archive_search", + "signature": "q: str, credentials: HTTPAuthorizationCredentials | None=Depends(_archive_search_bearer)", + "returns": "dict[str, int | list[dict]]", + "line": 2580, + "doc": "Search public archives with permission-aware closed-session filtering.", + "decorator": "app.get('/public/archive/search')", + "errors": [] + } + ], + "models": [ + { + "name": "AgendaItemCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "department_name", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 238, + "doc": "" + }, + { + "name": "AgendaItemTransitionRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "to_status", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 243, + "doc": "" + }, + { + "name": "AgendaIntakeCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "department_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "submitted_by", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "summary", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_references", + "type": "list[dict]", + "default": "Field(min_length=1)" + } + ], + "line": 248, + "doc": "" + }, + { + "name": "AgendaIntakeReviewRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "reviewer", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "ready", + "type": "bool", + "default": "" + }, + { + "name": "notes", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 256, + "doc": "" + }, + { + "name": "AgendaIntakePromoteRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "reviewer", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "notes", + "type": "str", + "default": "Field(default='Promoted to agenda lifecycle.', min_length=1)" + } + ], + "line": 262, + "doc": "" + }, + { + "name": "StaffReportCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "department_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "author", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "summary", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_references", + "type": "list[dict]", + "default": "Field(min_length=1)" + }, + { + "name": "agenda_item_id", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "legal_reviewer", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 267, + "doc": "" + }, + { + "name": "MeetingCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "meeting_type", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "scheduled_start", + "type": "str | None", + "default": "None" + }, + { + "name": "meeting_body_id", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "location", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 277, + "doc": "" + }, + { + "name": "MeetingUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "meeting_type", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "scheduled_start", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "meeting_body_id", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "location", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(default='clerk@example.gov', min_length=1)" + } + ], + "line": 285, + "doc": "" + }, + { + "name": "MeetingBodyCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "body_type", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "is_active", + "type": "bool", + "default": "True" + } + ], + "line": 294, + "doc": "" + }, + { + "name": "MeetingBodyUpdate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "name", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "body_type", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "is_active", + "type": "bool | None", + "default": "None" + } + ], + "line": 300, + "doc": "" + }, + { + "name": "MeetingTransitionRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "to_status", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "statutory_basis", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 306, + "doc": "" + }, + { + "name": "PacketSnapshotCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "agenda_item_ids", + "type": "list[str]", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 312, + "doc": "" + }, + { + "name": "PacketAssemblyCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "agenda_item_ids", + "type": "list[str]", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_references", + "type": "list[dict]", + "default": "Field(min_length=1)" + }, + { + "name": "citations", + "type": "list[dict]", + "default": "Field(min_length=1)" + } + ], + "line": 317, + "doc": "" + }, + { + "name": "PacketAssemblyFinalizeRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 325, + "doc": "" + }, + { + "name": "PacketSourceCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "kind", + "type": "str", + "default": "Field(default='document', min_length=1)" + }, + { + "name": "source_system", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "source_path", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "checksum", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "sensitivity_label", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "citation_label", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 329, + "doc": "" + }, + { + "name": "PacketExportCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "bundle_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "sources", + "type": "list[PacketSourceCreate]", + "default": "Field(min_length=1)" + }, + { + "name": "public_bundle", + "type": "bool", + "default": "True" + } + ], + "line": 340, + "doc": "" + }, + { + "name": "NoticeComplianceRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "notice_type", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "posted_at", + "type": "datetime", + "default": "" + }, + { + "name": "minimum_notice_hours", + "type": "int", + "default": "Field(gt=0)" + }, + { + "name": "statutory_basis", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "approved_by", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 347, + "doc": "" + }, + { + "name": "NoticeChecklistCreate", + "bases": [ + "NoticeComplianceRequest" + ], + "fields": [ + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 355, + "doc": "" + }, + { + "name": "NoticePostingProofCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "posting_proof", + "type": "dict", + "default": "Field(min_length=1)" + } + ], + "line": 359, + "doc": "" + }, + { + "name": "MotionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "agenda_item_id", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "seconded_by", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 364, + "doc": "" + }, + { + "name": "MotionCorrectionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 371, + "doc": "" + }, + { + "name": "VoteCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "voter_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "vote", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 377, + "doc": "" + }, + { + "name": "VoteCorrectionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "vote", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 383, + "doc": "" + }, + { + "name": "ActionItemCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "description", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "source_motion_id", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 389, + "doc": "" + }, + { + "name": "SourceMaterialCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 396, + "doc": "" + }, + { + "name": "MinutesSentenceCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "citations", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 402, + "doc": "" + }, + { + "name": "MinutesDraftCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "model", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "prompt_version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "human_approver", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_materials", + "type": "list[SourceMaterialCreate]", + "default": "Field(min_length=1)" + }, + { + "name": "sentences", + "type": "list[MinutesSentenceCreate]", + "default": "Field(min_length=1)" + } + ], + "line": 407, + "doc": "" + }, + { + "name": "MinutesAiAssistCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "model", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "prompt_version", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "human_approver", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_materials", + "type": "list[SourceMaterialCreate]", + "default": "Field(min_length=1)" + }, + { + "name": "instruction", + "type": "str", + "default": "Field(default='Draft concise meeting minutes from the cited source material.', min_length=1)" + } + ], + "line": 415, + "doc": "" + }, + { + "name": "TranscriptCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "transcript_text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "public_release_requested", + "type": "bool", + "default": "False" + }, + { + "name": "closed_session", + "type": "bool", + "default": "False" + } + ], + "line": 426, + "doc": "" + }, + { + "name": "OrdinanceResolutionHandoffCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "item_type", + "type": "str", + "default": "Field(pattern='^(ordinance|resolution)$')" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "legal_reviewer", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_motion_id", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "ordinance_number", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "resolution_number", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "source_references", + "type": "list[dict]", + "default": "Field(default_factory=list)" + }, + { + "name": "affected_sections", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "source_document_url", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "source_document_hash", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 434, + "doc": "" + }, + { + "name": "OrdinanceResolutionHandoffRetry", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "handoff_id", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 449, + "doc": "" + }, + { + "name": "PublicMeetingRecordCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "visibility", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "posted_agenda", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "posted_packet", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "approved_minutes", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "public_comment_enabled", + "type": "bool", + "default": "False" + }, + { + "name": "plain_language_summary", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "minutes_adopted_at", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "minutes_signed_by", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + }, + { + "name": "closed_session_notes", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 453, + "doc": "" + }, + { + "name": "PublicCommentCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "commenter_name", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "comment", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 466, + "doc": "" + }, + { + "name": "VendorSyncSourceCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_url", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "auth_method", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 471, + "doc": "" + }, + { + "name": "VendorSyncRunRecordCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "records_discovered", + "type": "int", + "default": "Field(ge=0)" + }, + { + "name": "records_succeeded", + "type": "int", + "default": "Field(ge=0)" + }, + { + "name": "records_failed", + "type": "int", + "default": "Field(ge=0)" + }, + { + "name": "retries_attempted", + "type": "int", + "default": "Field(default=0, ge=0)" + }, + { + "name": "error_summary", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 478, + "doc": "" + }, + { + "name": "VendorSyncCursorReset", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "cursor_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=8, max_length=500)" + } + ], + "line": 486, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_MEETINGS_EXPORT_ROOT", + "default": "'exports'", + "line": 3457 + }, + { + "variable": "TOWNLIGHT_MEETINGS_AGENDA_INTAKE_DB_URL", + "default": "", + "line": 3463 + }, + { + "variable": "TOWNLIGHT_MEETINGS_AGENDA_ITEM_DB_URL", + "default": "", + "line": 3472 + }, + { + "variable": "TOWNLIGHT_MEETINGS_PACKET_ASSEMBLY_DB_URL", + "default": "", + "line": 3483 + }, + { + "variable": "TOWNLIGHT_MEETINGS_NOTICE_CHECKLIST_DB_URL", + "default": "", + "line": 3492 + }, + { + "variable": "TOWNLIGHT_MEETINGS_MEETING_BODY_DB_URL", + "default": "", + "line": 3501 + }, + { + "variable": "TOWNLIGHT_MEETINGS_MEETING_DB_URL", + "default": "", + "line": 3510 + }, + { + "variable": "TOWNLIGHT_MEETINGS_VENDOR_SYNC_DB_URL", + "default": "", + "line": 3521 + }, + { + "variable": "TOWNLIGHT_MEETINGS_MOTION_VOTE_DB_URL", + "default": "", + "line": 3530 + }, + { + "variable": "TOWNLIGHT_MEETINGS_MINUTES_DB_URL", + "default": "", + "line": 3541 + }, + { + "variable": "TOWNLIGHT_MEETINGS_PUBLIC_ARCHIVE_DB_URL", + "default": "", + "line": 3552 + }, + { + "variable": "TOWNLIGHT_MEETINGS_PUBLIC_ARCHIVE_DB_URL", + "default": "", + "line": 3563 + } + ] + }, + { + "source": "installed-owned-source/townlight_meetings/meeting_body.py", + "sha256": "21085a87b167afb85ddd1e20f561695f580f1e20e8259bc8586e29f5f40cc079", + "routes": [], + "models": [ + { + "name": "MeetingBodyRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "UUID", + "default": "" + }, + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "body_type", + "type": "str", + "default": "" + }, + { + "name": "is_active", + "type": "bool", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + } + ], + "line": 29, + "doc": "One municipal body that can own public meetings." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/meeting_lifecycle.py", + "sha256": "3eb5fdb3d1a259a6841280fca6ce1c1c56317ff8f79de39022e8b5e35fd9115e", + "routes": [], + "models": [ + { + "name": "TransitionResult", + "bases": [], + "fields": [ + { + "name": "allowed", + "type": "bool", + "default": "" + }, + { + "name": "http_status", + "type": "int", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "audit_entry", + "type": "dict[str, object]", + "default": "" + } + ], + "line": 74, + "doc": "" + }, + { + "name": "MeetingRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "meeting_type", + "type": "str", + "default": "" + }, + { + "name": "scheduled_start", + "type": "datetime | None", + "default": "None" + }, + { + "name": "meeting_body_id", + "type": "str | None", + "default": "None" + }, + { + "name": "location", + "type": "str | None", + "default": "None" + }, + { + "name": "status", + "type": "str", + "default": "'SCHEDULED'" + }, + { + "name": "audit_entries", + "type": "list[dict[str, object]]", + "default": "field(default_factory=list)" + } + ], + "line": 83, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/__init__.py", + "sha256": "dd0a9b788de59eae83bec1152f0508532d3921e8bec7f175ba85f7caa5acc64f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/env.py", + "sha256": "9b3b3726c41218c534b726516d30de7dce83cc3d8b2f5d02f561ae3460807d5f", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "DATABASE_URL", + "default": "", + "line": 24 + } + ] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/guards.py", + "sha256": "5dfcd955681e2467f4ae52ebfe04cf3b5892c9aa68adeae3cb5a999c15ceb69e", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/__init__.py", + "sha256": "e08e35c06b073f92af22b7b5bb564ea2b9caaf2295b68e9c6c5ec175605dcc96", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0001_schema.py", + "sha256": "21441c137f2570d037447bb832d9a8223dcba7ee16e4e7cd7a974d81f1824028", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0002_agenda_intake_queue.py", + "sha256": "e23ff5cf9360ab9657e183970c1e36d67111ebf57d5ab1025f9c820eb81f51b3", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0003_packet_assembly_records.py", + "sha256": "28b2b1adc000bbbfd1d537df7abfed94c1a3120f9755542718c05478e96968cc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0004_notice_checklist_records.py", + "sha256": "a9759ee9a869cbae969e7f371800a296c53f2787ff6654dcb347c18117ce5fcf", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0005_meeting_records.py", + "sha256": "48d3c089a65d4733c164215ec9a18c153b20226f11d9cf06db0ec19d578ec4ea", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0006_agenda_item_lifecycle_records.py", + "sha256": "b030e37ee25d963ada7b51f907c28dbdd77949f2d9882dedf27ea5dc2cfdf32a", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0007_meeting_schedule_fields.py", + "sha256": "e19e655c7fdbf347a85c22be379b2a537e8075a53748facd55f0856bf93ab598", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0008_agenda_intake_promotion.py", + "sha256": "56d0019f2c413c731a09c8dae9150c4d2cd4ccf7b3911786d6e833b9d965dcc0", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0009_vendor_sync_persistence.py", + "sha256": "83df336d1ba176f5e5ef4c01485b013dd5686e5cbb1c8ca935dd5bb1336b641d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0010_vendor_sync_cursor.py", + "sha256": "860c440f1696e8094d466c8b634b330416a7e0c0616a660820a1463542f6931b", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0011_data_model_completion.py", + "sha256": "ee830e52b4fd24d37f234ad928b4beda378ef5267a35542739477a46e7b6a93e", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0012_action_item_actor.py", + "sha256": "d7a9b4c893b3387ff7557015213cdc6dda893881998071e74b82cf15be2a986c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0013_minutes_model_posted.py", + "sha256": "908d75f2a666d4a2837823ff48b94cdc0394227d91b48c46deb6efcc9a69e962", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0014_public_meeting_records.py", + "sha256": "f92409988f5893fcc0da7dcaa5fa083e20b7c42056681c54e9ae8152b6bf1331", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0015_capture_seq.py", + "sha256": "092e93ad53ec9ee047bf4d0d634933f5d735c2b3fa46a1de1e13f1dc11408ff1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0016_archive_indexes.py", + "sha256": "3d91062951e78685411983f45ea206ab436b6fadb20627a79624880def896742", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0017_meeting_authority.py", + "sha256": "73c6266df0dd33b74223133a2a00d045112a1996ffc38025d3aa8ba7831f1082", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0018_agenda_authority.py", + "sha256": "7dc3993bf51db8239270fd53a651b98ebbff0dbfce56ccbb73414ac9bbac2464", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0019_minutes_decisions.py", + "sha256": "5f088e0026bef9f492cac6a4c4a6c16ee81409d6447b1ab1ee19c037cd56d9cc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0020_delivery_history.py", + "sha256": "92a6779b59cb3228b3bbd963a9c4cef921163cbd07473381f015dbf474ba4005", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/migrations/versions/townlight_meetings_0021_sources_archive.py", + "sha256": "3220a0e7992d865b5a1f5a9bb71cb85722336f276fc974c13939d81fbfc1b29c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/minutes.py", + "sha256": "d4d890d0c9faaa3fdd51643a156e5f6a29274f436eba858db63746ad0ebb1ea3", + "routes": [], + "models": [ + { + "name": "MinutesProvenance", + "bases": [], + "fields": [ + { + "name": "model", + "type": "str", + "default": "" + }, + { + "name": "prompt_version", + "type": "str", + "default": "" + }, + { + "name": "data_sources", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "human_approver", + "type": "str", + "default": "" + } + ], + "line": 26, + "doc": "" + }, + { + "name": "MinutesDraft", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "sentences", + "type": "tuple[MinutesSentence, ...]", + "default": "" + }, + { + "name": "source_materials", + "type": "tuple[SourceMaterial, ...]", + "default": "" + }, + { + "name": "provenance", + "type": "MinutesProvenance", + "default": "" + }, + { + "name": "adopted", + "type": "bool", + "default": "False" + }, + { + "name": "posted", + "type": "bool", + "default": "False" + }, + { + "name": "signed_by", + "type": "str | None", + "default": "None" + }, + { + "name": "decision_history", + "type": "tuple[dict, ...]", + "default": "()" + } + ], + "line": 42, + "doc": "" + }, + { + "name": "MinutesValidationError", + "bases": [], + "fields": [ + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 71, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/mock_city_environment.py", + "sha256": "6df0969766b42257f372e2babf23675b50aead141a1c91e3e9b95237074f084f", + "routes": [], + "models": [ + { + "name": "MockCityHostileFixture", + "bases": [], + "fields": [ + { + "name": "area", + "type": "HostileArea", + "default": "" + }, + { + "name": "scenario", + "type": "str", + "default": "" + }, + { + "name": "target", + "type": "str", + "default": "" + }, + { + "name": "trigger", + "type": "str", + "default": "" + }, + { + "name": "expected_behavior", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "sample", + "type": "dict[str, Any]", + "default": "" + } + ], + "line": 47, + "doc": "Secret-free adversarial fixture for the mock-city hostile-mode toggle." + }, + { + "name": "MockCityHostileCheck", + "bases": [], + "fields": [ + { + "name": "area", + "type": "HostileArea", + "default": "" + }, + { + "name": "scenario", + "type": "str", + "default": "" + }, + { + "name": "target", + "type": "str", + "default": "" + }, + { + "name": "ok", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 71, + "doc": "Conformance result for a hostile-mode mock-city fixture." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/models.py", + "sha256": "ffc262c2381523ee111259d53bc402938781de926624ca2c791f2ca23bb8072c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/motion_vote.py", + "sha256": "8bc167f9e1ab291f7ee8a616f54786bf4baa686849deac1db33884d5a6d5eaef", + "routes": [], + "models": [ + { + "name": "MotionRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "text", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "agenda_item_id", + "type": "str | None", + "default": "None" + }, + { + "name": "seconded_by", + "type": "str | None", + "default": "None" + }, + { + "name": "correction_of_id", + "type": "str | None", + "default": "None" + }, + { + "name": "correction_reason", + "type": "str | None", + "default": "None" + }, + { + "name": "captured", + "type": "bool", + "default": "True" + } + ], + "line": 17, + "doc": "" + }, + { + "name": "VoteRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "motion_id", + "type": "str", + "default": "" + }, + { + "name": "voter_name", + "type": "str", + "default": "" + }, + { + "name": "vote", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "correction_of_id", + "type": "str | None", + "default": "None" + }, + { + "name": "correction_reason", + "type": "str | None", + "default": "None" + }, + { + "name": "captured", + "type": "bool", + "default": "True" + } + ], + "line": 43, + "doc": "" + }, + { + "name": "ActionItemRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "None" + }, + { + "name": "source_motion_id", + "type": "str | None", + "default": "None" + }, + { + "name": "status", + "type": "str", + "default": "'OPEN'" + } + ], + "line": 67, + "doc": "" + }, + { + "name": "MeetingOutcomeSummary", + "bases": [], + "fields": [ + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "motion_id", + "type": "str", + "default": "" + }, + { + "name": "text", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "vote_count", + "type": "int", + "default": "" + }, + { + "name": "action_item_count", + "type": "int", + "default": "" + } + ], + "line": 89, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/notice_checklist.py", + "sha256": "093031a3501ad47e35075e5350f20a3cf5ad8f7d29aa9298ea654edcbd253f71", + "routes": [], + "models": [ + { + "name": "NoticeChecklistRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "notice_type", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "compliant", + "type": "bool", + "default": "" + }, + { + "name": "http_status", + "type": "int", + "default": "" + }, + { + "name": "warnings", + "type": "list[dict]", + "default": "" + }, + { + "name": "deadline_at", + "type": "datetime", + "default": "" + }, + { + "name": "posted_at", + "type": "datetime", + "default": "" + }, + { + "name": "minimum_notice_hours", + "type": "int", + "default": "" + }, + { + "name": "statutory_basis", + "type": "str | None", + "default": "" + }, + { + "name": "approved_by", + "type": "str | None", + "default": "" + }, + { + "name": "posting_proof", + "type": "dict | None", + "default": "" + }, + { + "name": "last_audit_hash", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + }, + { + "name": "audit_entries", + "type": "list[dict]", + "default": "" + } + ], + "line": 50, + "doc": "Persisted notice compliance check and optional posting proof." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/oidc_auth.py", + "sha256": "3c9ae9b5d1f664d4372048c6e708cc77589cceb071d3e15cab8b90cf76926120", + "routes": [], + "models": [ + { + "name": "OidcStaffAuthConfig", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "issuer", + "type": "str", + "default": "" + }, + { + "name": "audience", + "type": "str", + "default": "" + }, + { + "name": "jwks_url", + "type": "str | None", + "default": "" + }, + { + "name": "jwks_json", + "type": "str | None", + "default": "" + }, + { + "name": "role_claims", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "algorithms", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "authorization_url", + "type": "str | None", + "default": "" + }, + { + "name": "token_url", + "type": "str | None", + "default": "" + }, + { + "name": "client_id", + "type": "str | None", + "default": "" + }, + { + "name": "client_secret", + "type": "str | None", + "default": "" + }, + { + "name": "redirect_uri", + "type": "str | None", + "default": "" + }, + { + "name": "session_cookie_secret", + "type": "str | None", + "default": "" + } + ], + "line": 21, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/packet_assembly.py", + "sha256": "5edc8d3316a5eb4965b8bcbd94468fb70ef5050ed75811facccc560cec6a4791", + "routes": [], + "models": [ + { + "name": "PacketAssemblyRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "packet_snapshot_id", + "type": "str", + "default": "" + }, + { + "name": "packet_version", + "type": "int", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "agenda_item_ids", + "type": "list[str]", + "default": "" + }, + { + "name": "source_references", + "type": "list[dict]", + "default": "" + }, + { + "name": "citations", + "type": "list[dict]", + "default": "" + }, + { + "name": "finalized_by", + "type": "str | None", + "default": "" + }, + { + "name": "finalized_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "last_audit_hash", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + }, + { + "name": "snapshot_content", + "type": "list[dict]", + "default": "" + }, + { + "name": "delivery_history", + "type": "list[dict]", + "default": "" + }, + { + "name": "audit_entries", + "type": "list[dict]", + "default": "" + } + ], + "line": 51, + "doc": "One persisted packet assembly draft or finalized packet record." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/packet_notice.py", + "sha256": "826b46e12dc114c10b25838bd68bc2d668dc5bdfa2e74bfafc841b6fddff3ffc", + "routes": [], + "models": [ + { + "name": "PacketSource", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "kind", + "type": "str", + "default": "'document'" + }, + { + "name": "source_system", + "type": "str | None", + "default": "None" + }, + { + "name": "source_path", + "type": "str | None", + "default": "None" + }, + { + "name": "checksum", + "type": "str | None", + "default": "None" + }, + { + "name": "sensitivity_label", + "type": "str | None", + "default": "None" + }, + { + "name": "citation_label", + "type": "str | None", + "default": "None" + } + ], + "line": 58, + "doc": "Source material included in an exported packet bundle." + }, + { + "name": "PacketSnapshot", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "version", + "type": "int", + "default": "" + }, + { + "name": "agenda_item_ids", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 92, + "doc": "" + }, + { + "name": "PacketExportResult", + "bases": [], + "fields": [ + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "bundle_path", + "type": "str", + "default": "" + }, + { + "name": "manifest_path", + "type": "str", + "default": "" + }, + { + "name": "checksums_path", + "type": "str", + "default": "" + }, + { + "name": "townlight_core_version", + "type": "str", + "default": "" + }, + { + "name": "packet_version", + "type": "int", + "default": "" + }, + { + "name": "audit_hash", + "type": "str", + "default": "" + }, + { + "name": "generated_files", + "type": "tuple[str, ...]", + "default": "" + } + ], + "line": 112, + "doc": "Result of creating a records-ready packet export bundle." + }, + { + "name": "NoticeComplianceResult", + "bases": [], + "fields": [ + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "notice_type", + "type": "str", + "default": "" + }, + { + "name": "scheduled_start", + "type": "datetime", + "default": "" + }, + { + "name": "posted_at", + "type": "datetime", + "default": "" + }, + { + "name": "minimum_notice_hours", + "type": "int", + "default": "" + }, + { + "name": "deadline_at", + "type": "datetime", + "default": "" + }, + { + "name": "statutory_basis", + "type": "str | None", + "default": "" + }, + { + "name": "approved_by", + "type": "str | None", + "default": "" + }, + { + "name": "compliant", + "type": "bool", + "default": "" + }, + { + "name": "http_status", + "type": "int", + "default": "" + }, + { + "name": "warnings", + "type": "list[dict[str, str]]", + "default": "" + } + ], + "line": 343, + "doc": "" + }, + { + "name": "PostedNotice", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "result", + "type": "NoticeComplianceResult", + "default": "" + } + ], + "line": 372, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/prompt_evals.py", + "sha256": "0c47c06b36500ae63a0ad9dda52edd4baadd8688010714701b6228d6ccca21bd", + "routes": [], + "models": [ + { + "name": "PromptEvalResult", + "bases": [], + "fields": [ + { + "name": "prompt_reference", + "type": "str", + "default": "" + }, + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "offline", + "type": "bool", + "default": "" + }, + { + "name": "passed", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + } + ], + "line": 17, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_CORE_LLM_PROVIDER", + "default": "''", + "line": 128 + }, + { + "variable": "TOWNLIGHT_MEETINGS_EVAL_OFFLINE", + "default": "", + "line": 129 + } + ] + }, + { + "source": "installed-owned-source/townlight_meetings/prompt_library.py", + "sha256": "433e349bb9c768d37359bae0a68c89715337da8f363ddaec5a62f37bddd563d9", + "routes": [], + "models": [ + { + "name": "PromptEvaluation", + "bases": [], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "required_phrases", + "type": "tuple[str, ...]", + "default": "" + } + ], + "line": 34, + "doc": "" + }, + { + "name": "PromptDefinition", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "version", + "type": "str", + "default": "" + }, + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "purpose", + "type": "str", + "default": "" + }, + { + "name": "required_variables", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "system_prompt", + "type": "str", + "default": "" + }, + { + "name": "template", + "type": "str", + "default": "" + }, + { + "name": "evaluations", + "type": "tuple[PromptEvaluation, ...]", + "default": "" + }, + { + "name": "public_facing", + "type": "bool", + "default": "False" + }, + { + "name": "approval_required", + "type": "str | None", + "default": "None" + } + ], + "line": 40, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/public_archive.py", + "sha256": "389d714ee91ef1c4b0cbf49d960894bba49787232a29537ddaebcb9eecbe06b9", + "routes": [], + "models": [ + { + "name": "PublicMeetingRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "meeting_id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "" + }, + { + "name": "posted_agenda", + "type": "str", + "default": "" + }, + { + "name": "posted_packet", + "type": "str", + "default": "" + }, + { + "name": "approved_minutes", + "type": "str", + "default": "" + }, + { + "name": "public_comment_enabled", + "type": "bool", + "default": "False" + }, + { + "name": "plain_language_summary", + "type": "str | None", + "default": "None" + }, + { + "name": "agenda_download_url", + "type": "str | None", + "default": "None" + }, + { + "name": "packet_download_url", + "type": "str | None", + "default": "None" + }, + { + "name": "minutes_download_url", + "type": "str | None", + "default": "None" + }, + { + "name": "minutes_adopted_at", + "type": "str | None", + "default": "None" + }, + { + "name": "minutes_signed_by", + "type": "str | None", + "default": "None" + }, + { + "name": "closed_session_notes", + "type": "str | None", + "default": "None" + }, + { + "name": "audit_entries", + "type": "list[dict]", + "default": "field(default_factory=list)" + } + ], + "line": 27, + "doc": "" + }, + { + "name": "PublicCommentRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "public_record_id", + "type": "str", + "default": "" + }, + { + "name": "commenter_name", + "type": "str", + "default": "" + }, + { + "name": "comment", + "type": "str", + "default": "" + }, + { + "name": "submitted_at", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "'RECEIVED'" + } + ], + "line": 69, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/public_ui.py", + "sha256": "4359447b52c4499727fa1d62f385e778154a4243af716cd2fb828e30af6f5db0", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/records_sources.py", + "sha256": "843b4808e4a335ab05a7801a33a3a5750dc49ce84d7e71961841e91e7532598f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/staff_ui.py", + "sha256": "158329afdeafeb52619ae70bb78cdc731a1cc65f21b31494e3cafd2884b5bdb3", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/suite_session_compat.py", + "sha256": "6b7cfc7719b722eb7da68fa137c3996d64f237d313ef925ba340f6c39d74474e", + "routes": [], + "models": [ + { + "name": "SuiteSessionPrincipal", + "bases": [], + "fields": [ + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "session_id", + "type": "str", + "default": "" + } + ], + "line": 28, + "doc": "Validated TownlightCore suite session principal." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/transcripts.py", + "sha256": "33d5b6f97ce58b6f645e0c236a53a855c358d01db06ee048ec9c90100474bc98", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/vendor_delta.py", + "sha256": "cebd1ffb95726fd5beb874fbfd9726555681e6c35be7957b97dda26a69898cd3", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/vendor_live_sync.py", + "sha256": "0a5048436302ad12e21d822952705ae754ed0ca7a76a7ea9080b292cc2489ab5", + "routes": [], + "models": [ + { + "name": "LiveSyncCheck", + "bases": [], + "fields": [ + { + "name": "status", + "type": "Literal['PASS', 'FAIL']", + "default": "" + }, + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 49, + "doc": "" + }, + { + "name": "VendorLiveSyncConfig", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "source_url", + "type": "str", + "default": "" + }, + { + "name": "auth_method", + "type": "AuthMethod", + "default": "" + } + ], + "line": 57, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/vendor_network_sync.py", + "sha256": "cf3a9c14de83f76b8deb87aabfaeb43e93bca98f26a65183f1dd4001a3df91e1", + "routes": [], + "models": [ + { + "name": "VendorNetworkSyncAttempt", + "bases": [], + "fields": [ + { + "name": "ok", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "external_meeting_id", + "type": "str | None", + "default": "None" + }, + { + "name": "error_class", + "type": "str | None", + "default": "None" + } + ], + "line": 31, + "doc": "" + }, + { + "name": "VendorNetworkSyncReport", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "network_calls", + "type": "bool", + "default": "" + }, + { + "name": "records_discovered", + "type": "int", + "default": "" + }, + { + "name": "records_succeeded", + "type": "int", + "default": "" + }, + { + "name": "records_failed", + "type": "int", + "default": "" + }, + { + "name": "run_status", + "type": "str | None", + "default": "" + }, + { + "name": "source_health_status", + "type": "str | None", + "default": "" + }, + { + "name": "delta_request_url", + "type": "str | None", + "default": "" + }, + { + "name": "cursor_param", + "type": "str | None", + "default": "" + }, + { + "name": "cursor_value", + "type": "str | None", + "default": "" + }, + { + "name": "cursor_advanced_at", + "type": "str | None", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "attempts", + "type": "list[VendorNetworkSyncAttempt]", + "default": "" + } + ], + "line": 40, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/vendor_sync_persistence.py", + "sha256": "f719849f9cd2e1c667bc61f501dc281bf0efe26646e230b0b5b786afcb082d9b", + "routes": [], + "models": [ + { + "name": "VendorSyncSourceRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "source_name", + "type": "str", + "default": "" + }, + { + "name": "source_url", + "type": "str", + "default": "" + }, + { + "name": "auth_method", + "type": "str", + "default": "" + }, + { + "name": "consecutive_failure_count", + "type": "int", + "default": "" + }, + { + "name": "active_failure_count", + "type": "int", + "default": "" + }, + { + "name": "sync_paused", + "type": "bool", + "default": "" + }, + { + "name": "sync_paused_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "sync_paused_reason", + "type": "str | None", + "default": "" + }, + { + "name": "last_sync_status", + "type": "str | None", + "default": "" + }, + { + "name": "last_error_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "last_success_cursor_at", + "type": "datetime | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + } + ], + "line": 81, + "doc": "" + }, + { + "name": "VendorSyncRunRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "records_discovered", + "type": "int", + "default": "" + }, + { + "name": "records_succeeded", + "type": "int", + "default": "" + }, + { + "name": "records_failed", + "type": "int", + "default": "" + }, + { + "name": "retries_attempted", + "type": "int", + "default": "" + }, + { + "name": "error_summary", + "type": "str | None", + "default": "" + }, + { + "name": "started_at", + "type": "datetime", + "default": "" + }, + { + "name": "finished_at", + "type": "datetime", + "default": "" + } + ], + "line": 140, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_meetings/worker.py", + "sha256": "6e0aa475591252a06401a613e85d402c8981bdaaf23b460f30b442efbdd43a9b", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "TOWNLIGHT_MEETINGS_REDIS_URL", + "default": "'redis://redis:6379/0'", + "line": 46 + } + ] + } + ], + "bridge": [ + { + "source": "installed-owned-source/townlight_runtime/meetings_bridge.py", + "sha256": "37ea43e633b55e9428e928143e5da0d41a7a5906673b8cc54b40fa4d1748fa52", + "routes": [ + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/stages", + "router": "router", + "prefix_resolved": true, + "name": "record_meeting_stage", + "signature": "meeting_id: UUID, data: MeetingStageInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 106, + "doc": "", + "decorator": "router.post('/meetings/{meeting_id}/stages')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings", + "router": "router", + "prefix_resolved": true, + "name": "create_meeting", + "signature": "data: MeetingInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 128, + "doc": "", + "decorator": "router.post('/meetings', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/meetings/meetings/{meeting_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_meeting", + "signature": "meeting_id: UUID, actor_id: str=Depends(actor)", + "returns": "", + "line": 136, + "doc": "", + "decorator": "router.get('/meetings/{meeting_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/agenda-items", + "router": "router", + "prefix_resolved": true, + "name": "create_agenda_item", + "signature": "data: AgendaInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 141, + "doc": "", + "decorator": "router.post('/agenda-items', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/meetings/agenda-items/{item_id}", + "router": "router", + "prefix_resolved": true, + "name": "get_agenda_item", + "signature": "item_id: UUID, actor_id: str=Depends(actor)", + "returns": "", + "line": 148, + "doc": "", + "decorator": "router.get('/agenda-items/{item_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/agenda-items/{item_id}/reviews", + "router": "router", + "prefix_resolved": true, + "name": "record_agenda_review", + "signature": "item_id: UUID, data: AgendaReviewInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 164, + "doc": "", + "decorator": "router.post('/agenda-items/{item_id}/reviews')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/agenda-items/{item_id}/meeting", + "router": "router", + "prefix_resolved": true, + "name": "assign_agenda", + "signature": "item_id: UUID, data: AgendaAssignment, actor_id: str=Depends(actor)", + "returns": "", + "line": 170, + "doc": "", + "decorator": "router.post('/agenda-items/{item_id}/meeting')", + "errors": [ + "HTTPException(409, str(error))" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/meetings/notices/{notice_id}/template", + "router": "router", + "prefix_resolved": true, + "name": "notice_template", + "signature": "notice_id: UUID, actor_id: str=Depends(actor)", + "returns": "", + "line": 249, + "doc": "", + "decorator": "router.get('/notices/{notice_id}/template')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/notices/{notice_id}/document", + "router": "router", + "prefix_resolved": true, + "name": "notice_document", + "signature": "notice_id: UUID, data: NoticeDocumentInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 264, + "doc": "", + "decorator": "router.post('/notices/{notice_id}/document')", + "errors": [ + "HTTPException(404, 'Notice not found.')", + "HTTPException(422, 'Notice delivery not confirmed; existing documents were retained.')", + "HTTPException(503, 'Notice history write not confirmed; read saved work before retrying.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/notice-checks", + "router": "router", + "prefix_resolved": true, + "name": "check_notice", + "signature": "meeting_id: UUID, data: NoticeInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 278, + "doc": "", + "decorator": "router.post('/meetings/{meeting_id}/notice-checks', status_code=201)", + "errors": [ + "HTTPException(422, 'A scheduled start is needed to calculate a notice deadline.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/notices/{notice_id}/proof", + "router": "router", + "prefix_resolved": true, + "name": "record_notice_proof", + "signature": "notice_id: UUID, data: NoticeProofInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 295, + "doc": "", + "decorator": "router.post('/notices/{notice_id}/proof')", + "errors": [ + "HTTPException(422, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/transcripts", + "router": "router", + "prefix_resolved": true, + "name": "capture_transcript", + "signature": "meeting_id: UUID, data: TranscriptInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 332, + "doc": "", + "decorator": "router.post('/meetings/{meeting_id}/transcripts', status_code=201)", + "errors": [ + "HTTPException(422, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/action-items", + "router": "router", + "prefix_resolved": true, + "name": "capture_action_item", + "signature": "meeting_id: UUID, data: ActionItemInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 344, + "doc": "", + "decorator": "router.post('/meetings/{meeting_id}/action-items', status_code=201)", + "errors": [ + "HTTPException(422, 'Motion belongs to another meeting.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/archive", + "router": "router", + "prefix_resolved": true, + "name": "archive_meeting", + "signature": "meeting_id: UUID, data: ArchiveInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 356, + "doc": "", + "decorator": "router.post('/meetings/{meeting_id}/archive', status_code=201)", + "errors": [ + "HTTPException(422, 'Packet belongs to another meeting.')", + "HTTPException(422, 'Minutes belong to another meeting.')" + ] + }, + { + "method": "GET", + "path": "/public/meetings", + "router": "public_router", + "prefix_resolved": true, + "name": "public_archive_index", + "signature": "q: str=''", + "returns": "", + "line": 399, + "doc": "", + "decorator": "public_router.get('', response_class=HTMLResponse, dependencies=[Depends(public_active)])", + "errors": [] + }, + { + "method": "GET", + "path": "/public/meetings/{record_id}", + "router": "public_router", + "prefix_resolved": true, + "name": "public_archive_detail", + "signature": "record_id: UUID", + "returns": "", + "line": 407, + "doc": "", + "decorator": "public_router.get('/{record_id}', response_class=HTMLResponse, dependencies=[Depends(public_active)])", + "errors": [] + }, + { + "method": "GET", + "path": "/public/meetings/{record_id}/{kind}.txt", + "router": "public_router", + "prefix_resolved": true, + "name": "public_archive_download", + "signature": "record_id: UUID, kind: Literal['agenda', 'packet', 'minutes']", + "returns": "", + "line": 417, + "doc": "", + "decorator": "public_router.get('/{record_id}/{kind}.txt', dependencies=[Depends(public_active)])", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/packet-snapshots", + "router": "router", + "prefix_resolved": true, + "name": "capture_packet", + "signature": "meeting_id: UUID, data: PacketInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 441, + "doc": "", + "decorator": "router.post('/meetings/{meeting_id}/packet-snapshots', status_code=201)", + "errors": [ + "HTTPException(422, str(error))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/packets/{packet_id}/deliver", + "router": "router", + "prefix_resolved": true, + "name": "export_packet", + "signature": "packet_id: UUID, actor_id: str=Depends(actor)", + "returns": "", + "line": 462, + "doc": "", + "decorator": "router.post('/packets/{packet_id}/deliver')", + "errors": [ + "HTTPException(404, 'Packet not found.')", + "HTTPException(422, str(error))", + "HTTPException(503, 'Packet delivery not confirmed. Inspect saved work before retrying.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/minutes/{draft_id}/decisions", + "router": "router", + "prefix_resolved": true, + "name": "decide_minutes", + "signature": "draft_id: UUID, data: MinutesDecision, actor_id: str=Depends(actor)", + "returns": "", + "line": 475, + "doc": "", + "decorator": "router.post('/minutes/{draft_id}/decisions')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/motions", + "router": "router", + "prefix_resolved": true, + "name": "capture_motion", + "signature": "meeting_id: UUID, data: MotionInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 498, + "doc": "", + "decorator": "router.post('/meetings/{meeting_id}/motions', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/motions/{motion_id}/corrections", + "router": "router", + "prefix_resolved": true, + "name": "correct_motion", + "signature": "motion_id: UUID, data: MotionCorrection, actor_id: str=Depends(actor)", + "returns": "", + "line": 505, + "doc": "", + "decorator": "router.post('/motions/{motion_id}/corrections', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/motions/{motion_id}/votes", + "router": "router", + "prefix_resolved": true, + "name": "capture_vote", + "signature": "motion_id: UUID, data: VoteInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 511, + "doc": "", + "decorator": "router.post('/motions/{motion_id}/votes', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/votes/{vote_id}/corrections", + "router": "router", + "prefix_resolved": true, + "name": "correct_vote", + "signature": "vote_id: UUID, data: VoteCorrection, actor_id: str=Depends(actor)", + "returns": "", + "line": 517, + "doc": "", + "decorator": "router.post('/votes/{vote_id}/corrections', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/minutes/drafts", + "router": "router", + "prefix_resolved": true, + "name": "create_minutes", + "signature": "meeting_id: UUID, data: DraftInput, actor_id: str=Depends(actor)", + "returns": "", + "line": 523, + "doc": "", + "decorator": "router.post('/meetings/{meeting_id}/minutes/drafts', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/meetings/meetings/{meeting_id}/proceedings", + "router": "router", + "prefix_resolved": true, + "name": "proceedings", + "signature": "meeting_id: UUID, actor_id: str=Depends(actor)", + "returns": "", + "line": 532, + "doc": "", + "decorator": "router.get('/meetings/{meeting_id}/proceedings')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/meetings/station/catalog", + "router": "router", + "prefix_resolved": true, + "name": "station_catalog", + "signature": "actor_id: str=Depends(actor)", + "returns": "", + "line": 552, + "doc": "Authorized name-based operator selection from canonical Meetings data.", + "decorator": "router.get('/station/catalog')", + "errors": [] + } + ], + "models": [ + { + "name": "MeetingInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "scheduled_start", + "type": "AwareDatetime", + "default": "" + }, + { + "name": "location", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "meeting_type", + "type": "Literal['regular', 'special', 'emergency', 'closed_session', 'executive']", + "default": "'regular'" + } + ], + "line": 83, + "doc": "" + }, + { + "name": "AgendaInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "department_name", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + } + ], + "line": 91, + "doc": "" + }, + { + "name": "MeetingStageInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "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']", + "default": "" + }, + { + "name": "statutory_basis", + "type": "str | None", + "default": "None" + } + ], + "line": 97, + "doc": "" + }, + { + "name": "AgendaReviewInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "to_status", + "type": "Literal['DRAFTED', 'SUBMITTED', 'DEPT_APPROVED', 'LEGAL_REVIEWED', 'CLERK_ACCEPTED', 'ON_AGENDA', 'IN_PACKET', 'POSTED', 'HEARD', 'DISPOSED', 'ARCHIVED']", + "default": "" + } + ], + "line": 152, + "doc": "" + }, + { + "name": "AgendaAssignment", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "meeting_id", + "type": "UUID", + "default": "" + } + ], + "line": 158, + "doc": "" + }, + { + "name": "MotionInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "seconded_by", + "type": "str | None", + "default": "Field(default=None, min_length=1)" + } + ], + "line": 178, + "doc": "" + }, + { + "name": "MotionCorrection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 184, + "doc": "" + }, + { + "name": "VoteInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "voter_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "vote", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 190, + "doc": "" + }, + { + "name": "VoteCorrection", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "vote", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 196, + "doc": "" + }, + { + "name": "SourceInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 202, + "doc": "" + }, + { + "name": "SentenceInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "citations", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 209, + "doc": "" + }, + { + "name": "DraftInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_materials", + "type": "list[SourceInput]", + "default": "Field(default_factory=list)" + }, + { + "name": "sentences", + "type": "list[SentenceInput]", + "default": "Field(min_length=1)" + } + ], + "line": 215, + "doc": "" + }, + { + "name": "MinutesDecision", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "action", + "type": "Literal['post', 'adopt', 'sign']", + "default": "" + }, + { + "name": "note", + "type": "str", + "default": "''" + } + ], + "line": 221, + "doc": "" + }, + { + "name": "NoticeInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "notice_type", + "type": "Literal['regular', 'special', 'emergency', 'closed_session', 'executive']", + "default": "" + }, + { + "name": "posted_at", + "type": "AwareDatetime", + "default": "" + }, + { + "name": "minimum_notice_hours", + "type": "int", + "default": "Field(ge=0)" + }, + { + "name": "statutory_basis", + "type": "str | None", + "default": "None" + }, + { + "name": "approved_by", + "type": "str | None", + "default": "None" + } + ], + "line": 227, + "doc": "" + }, + { + "name": "NoticeProofInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "location", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "note", + "type": "str", + "default": "''" + }, + { + "name": "document_delivery_id", + "type": "str | None", + "default": "None" + } + ], + "line": 236, + "doc": "" + }, + { + "name": "NoticeDocumentInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "text", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 243, + "doc": "" + }, + { + "name": "PacketInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "agenda_item_ids", + "type": "list[UUID]", + "default": "" + }, + { + "name": "source_files", + "type": "list['ManagedSource']", + "default": "Field(default_factory=list)" + } + ], + "line": 303, + "doc": "" + }, + { + "name": "TranscriptInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "transcript_text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "correction_of_id", + "type": "UUID | None", + "default": "None" + } + ], + "line": 309, + "doc": "" + }, + { + "name": "ActionItemInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "description", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "None" + }, + { + "name": "source_motion_id", + "type": "UUID | None", + "default": "None" + } + ], + "line": 316, + "doc": "" + }, + { + "name": "ArchiveInput", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "visibility", + "type": "Literal['public', 'closed_session']", + "default": "" + }, + { + "name": "packet_id", + "type": "UUID | None", + "default": "None" + }, + { + "name": "minutes_id", + "type": "UUID | None", + "default": "None" + }, + { + "name": "plain_language_summary", + "type": "str", + "default": "''" + } + ], + "line": 323, + "doc": "" + }, + { + "name": "ManagedSource", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "original_path", + "type": "str", + "default": "" + }, + { + "name": "stored_path", + "type": "str", + "default": "" + }, + { + "name": "file_name", + "type": "str", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + }, + { + "name": "size_bytes", + "type": "int", + "default": "Field(ge=0)" + } + ], + "line": 424, + "doc": "" + } + ], + "configuration": [ + { + "variable": "DATABASE_URL", + "default": "''", + "line": 38 + }, + { + "variable": "TOWNLIGHT_PROFILE_ROOT", + "default": "", + "line": 434 + } + ] + } + ] + }, + "code": { + "package": "townlight_code", + "source": [ + { + "source": "installed-owned-source/townlight_code/__init__.py", + "sha256": "22abb4eaa2a94737461591a5b6f494bf7c4ad481b476fc3cf020fa090c97bcd8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/ai_answer.py", + "sha256": "0d82f0c105e1b8102e0b640b97de85f95f79695cc6903008d56245ed79e6568d", + "routes": [], + "models": [ + { + "name": "LocalLLMConfig", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "base_url", + "type": "str", + "default": "" + }, + { + "name": "model", + "type": "str", + "default": "" + }, + { + "name": "timeout_seconds", + "type": "float", + "default": "" + } + ], + "line": 18, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_CODE_OLLAMA_URL", + "default": "''", + "line": 28 + }, + { + "variable": "TOWNLIGHT_CODE_OLLAMA_TIMEOUT_SECONDS", + "default": "'20'", + "line": 35 + }, + { + "variable": "TOWNLIGHT_CODE_AI_MODE", + "default": "''", + "line": 27 + }, + { + "variable": "TOWNLIGHT_CODE_OLLAMA_MODEL", + "default": "'gemma4:e4b'", + "line": 34 + } + ] + }, + { + "source": "installed-owned-source/townlight_code/citation_contract.py", + "sha256": "58e2cc3b8e05987a801a94c174ad34a8a7af18f684d367b08f097ab420ff3e37", + "routes": [], + "models": [ + { + "name": "CitationRefusal", + "bases": [], + "fields": [ + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "refusal_type", + "type": "str", + "default": "" + } + ], + "line": 10, + "doc": "Structured refusal object for unsafe citation requests." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/codifier_sync.py", + "sha256": "9c8b9635a2534eaccd3f80cc0b2a9b5c4751830a9d99796bb125e773778bd57f", + "routes": [], + "models": [ + { + "name": "CodifierDeltaPlan", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "request_url", + "type": "str", + "default": "" + }, + { + "name": "delta_enabled", + "type": "bool", + "default": "" + }, + { + "name": "cursor_param", + "type": "str | None", + "default": "" + }, + { + "name": "cursor_value", + "type": "str | None", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 56, + "doc": "Operator-visible planned codifier request." + }, + { + "name": "CodifierSyncSource", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "source_name", + "type": "str", + "default": "" + }, + { + "name": "source_url", + "type": "str", + "default": "" + }, + { + "name": "sync_schedule", + "type": "str", + "default": "" + }, + { + "name": "allowlisted_hosts", + "type": "tuple[str, ...]", + "default": "()" + }, + { + "name": "last_successful_sync_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "last_attempted_sync_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "last_import_job_id", + "type": "str | None", + "default": "None" + }, + { + "name": "next_sync_at_recorded", + "type": "datetime | None", + "default": "None" + }, + { + "name": "host_validation", + "type": "dict[str, Any]", + "default": "field(default_factory=dict)" + }, + { + "name": "delta_plan_history", + "type": "list[dict[str, Any]]", + "default": "field(default_factory=list)" + }, + { + "name": "state", + "type": "SyncCircuitState", + "default": "field(default_factory=lambda: SyncCircuitState(connector='codifier'))" + } + ], + "line": 80, + "doc": "Configured codifier sync source backed by a registered TownlightCode source." + }, + { + "name": "CodifierSyncRun", + "bases": [], + "fields": [ + { + "name": "source", + "type": "CodifierSyncSource", + "default": "" + }, + { + "name": "job_payload", + "type": "dict[str, Any]", + "default": "" + }, + { + "name": "delta_plan", + "type": "CodifierDeltaPlan", + "default": "" + } + ], + "line": 103, + "doc": "Result of one local codifier sync run." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/import_connectors.py", + "sha256": "bf4013448af2bd851642baefdbd1abcd212dd7b5b3c0e91d5811414c85e792f0", + "routes": [], + "models": [ + { + "name": "ImportJob", + "bases": [], + "fields": [ + { + "name": "job_id", + "type": "str", + "default": "" + }, + { + "name": "connector_type", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "'pending'" + }, + { + "name": "retry_of", + "type": "str | None", + "default": "None" + }, + { + "name": "counts", + "type": "dict[str, int]", + "default": "field(default_factory=dict)" + }, + { + "name": "provenance", + "type": "dict[str, Any]", + "default": "field(default_factory=dict)" + }, + { + "name": "failure", + "type": "dict[str, str] | None", + "default": "None" + }, + { + "name": "source_id", + "type": "str | None", + "default": "None" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + }, + { + "name": "completed_at", + "type": "datetime | None", + "default": "None" + } + ], + "line": 54, + "doc": "Auditable local import job record." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/main.py", + "sha256": "930e05298b82f10ec0338040770d8af83aa56a9d43016908931ab8f796e63f48", + "routes": [ + { + "method": "GET", + "path": "/", + "router": "app", + "prefix_resolved": true, + "name": "root", + "signature": "", + "returns": "dict[str, str]", + "line": 786, + "doc": "Describe the current shipped runtime boundary.", + "decorator": "app.get('/')", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code", + "router": "app", + "prefix_resolved": true, + "name": "public_lookup_home", + "signature": "", + "returns": "str", + "line": 834, + "doc": "Render the resident-facing public code lookup home page.", + "decorator": "app.get('/townlight_code', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/app", + "router": "app", + "prefix_resolved": true, + "name": "townlight_code_frontend_app", + "signature": "", + "returns": "Response", + "line": 845, + "doc": "Serve the React/Vite TownlightCode frontend when built.", + "decorator": "app.get('/townlight_code/app')", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/app/", + "router": "app", + "prefix_resolved": true, + "name": "townlight_code_frontend_app", + "signature": "", + "returns": "Response", + "line": 845, + "doc": "Serve the React/Vite TownlightCode frontend when built.", + "decorator": "app.get('/townlight_code/app/')", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/search", + "router": "app", + "prefix_resolved": true, + "name": "public_lookup_search", + "signature": "q: str=''", + "returns": "str", + "line": 858, + "doc": "Render public search results, empty states, or refusal states.", + "decorator": "app.get('/townlight_code/search', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/answer", + "router": "app", + "prefix_resolved": true, + "name": "public_lookup_answer", + "signature": "q: str='', section_number: str | None=None, as_of: date | None=None", + "returns": "str", + "line": 878, + "doc": "Render a resident-facing cited answer for one adopted section.", + "decorator": "app.get('/townlight_code/answer', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/sections/{section_ref}", + "router": "app", + "prefix_resolved": true, + "name": "public_section_detail", + "signature": "section_ref: str, as_of: date | None=None", + "returns": "str", + "line": 901, + "doc": "Render a public section detail page with citation and warning context.", + "decorator": "app.get('/townlight_code/sections/{section_ref}', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/sections/{section_ref}/export", + "router": "app", + "prefix_resolved": true, + "name": "public_section_export", + "signature": "section_ref: str, as_of: date | None=None", + "returns": "str", + "line": 937, + "doc": "Render an accessible records-ready export page for a section.", + "decorator": "app.get('/townlight_code/sections/{section_ref}/export', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/staff/sources", + "router": "app", + "prefix_resolved": true, + "name": "staff_source_workspace", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "HTMLResponse", + "line": 953, + "doc": "Render the staff source registry workspace.", + "decorator": "app.get('/staff/sources', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/staff/code", + "router": "app", + "prefix_resolved": true, + "name": "staff_code_workspace", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "HTMLResponse", + "line": 970, + "doc": "Render the staff code lifecycle workspace.", + "decorator": "app.get('/staff/code', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/staff/sync", + "router": "app", + "prefix_resolved": true, + "name": "staff_sync_workspace", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "HTMLResponse", + "line": 983, + "doc": "Render the staff codifier sync health workspace.", + "decorator": "app.get('/staff/sync', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/staff/imports", + "router": "app", + "prefix_resolved": true, + "name": "staff_import_ledger", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "HTMLResponse", + "line": 1000, + "doc": "Render the staff import job and provenance ledger.", + "decorator": "app.get('/staff/imports', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "health", + "signature": "", + "returns": "dict[str, str]", + "line": 1013, + "doc": "Provide a simple operational health check for IT staff.", + "decorator": "app.get('/health')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/operational-state", + "router": "app", + "prefix_resolved": true, + "name": "get_staff_operational_state", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1024, + "doc": "Return current operational readiness state for staff operators.", + "decorator": "app.get('/api/v1/townlight_code/staff/operational-state')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sources/catalog", + "router": "app", + "prefix_resolved": true, + "name": "source_registry_catalog", + "signature": "", + "returns": "dict[str, Any]", + "line": 1036, + "doc": "Expose allowed source registry vocabulary for staff integration clients.", + "decorator": "app.get('/api/v1/townlight_code/sources/catalog')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/sources", + "router": "app", + "prefix_resolved": true, + "name": "create_source", + "signature": "request: SourceCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1050, + "doc": "Register a municipal code source without importing its contents yet.", + "decorator": "app.post('/api/v1/townlight_code/sources', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sources", + "router": "app", + "prefix_resolved": true, + "name": "list_public_sources", + "signature": "", + "returns": "dict[str, Any]", + "line": 1068, + "doc": "List public-visible sources without exposing staff-only notes.", + "decorator": "app.get('/api/v1/townlight_code/sources')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sources/{source_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_public_source", + "signature": "source_id: str", + "returns": "dict[str, Any]", + "line": 1079, + "doc": "Read a public source record without leaking staff-only notes.", + "decorator": "app.get('/api/v1/townlight_code/sources/{source_id}')", + "errors": [ + "HTTPException(status_code=404, detail={'message': f\"Source '{source_id}' is not public-visible.\", 'fix': 'Use the staff source endpoint if you are authorized to view it.'})" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/sources", + "router": "app", + "prefix_resolved": true, + "name": "list_staff_sources", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1097, + "doc": "List all registered sources for staff workflows.", + "decorator": "app.get('/api/v1/townlight_code/staff/sources')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/sources/{source_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_staff_source", + "signature": "source_id: str, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1112, + "doc": "Read a staff source record including staff-only notes.", + "decorator": "app.get('/api/v1/townlight_code/staff/sources/{source_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/sources/{source_id}/transitions", + "router": "app", + "prefix_resolved": true, + "name": "transition_source", + "signature": "source_id: str, request: SourceTransitionRequest, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1127, + "doc": "Transition a source through the official registry lifecycle.", + "decorator": "app.post('/api/v1/townlight_code/sources/{source_id}/transitions')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/titles", + "router": "app", + "prefix_resolved": true, + "name": "create_title", + "signature": "request: TitleCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1148, + "doc": "Create a municipal code title container.", + "decorator": "app.post('/api/v1/townlight_code/titles', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/chapters", + "router": "app", + "prefix_resolved": true, + "name": "create_chapter", + "signature": "request: ChapterCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1163, + "doc": "Create a municipal code chapter under a title.", + "decorator": "app.post('/api/v1/townlight_code/chapters', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/sections", + "router": "app", + "prefix_resolved": true, + "name": "create_section", + "signature": "request: SectionCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1178, + "doc": "Create a code section or subsection without generating answers.", + "decorator": "app.post('/api/v1/townlight_code/sections', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/sections/{section_id}/versions", + "router": "app", + "prefix_resolved": true, + "name": "create_section_version", + "signature": "section_id: str, request: SectionVersionCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1193, + "doc": "Create an immutable section version for adopted, pending, or retired text.", + "decorator": "app.post('/api/v1/townlight_code/sections/{section_id}/versions', status_code=201)", + "errors": [ + "HTTPException(status_code=422, detail={'message': 'Path section_id must match request body section_id.', 'fix': 'Use the same section_id in the URL and JSON body.'})", + "HTTPException(status_code=409, detail={'message': f\"Source '{source.source_id}' is {source.status} and cannot back section text.\", 'fix': 'Use an active source or refresh the source registry record first.'})", + "HTTPException(status_code=409, detail={'message': 'Adopted section versions require an active public-visible source.', 'fix': 'Activate an official source in the registry before marking text as adopted law.'})", + "HTTPException(status_code=404, detail={'message': f\"Source '{data['source_id']}' was not found for this section version.\", 'fix': 'Register the source before adding section text from it.'})" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sections/lookup", + "router": "app", + "prefix_resolved": true, + "name": "lookup_section", + "signature": "section_number: str, as_of: date | None=None", + "returns": "dict[str, Any]", + "line": 1244, + "doc": "Lookup adopted section text by current flag or effective date.", + "decorator": "app.get('/api/v1/townlight_code/sections/lookup')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/sections/resolve", + "router": "app", + "prefix_resolved": true, + "name": "resolve_section", + "signature": "request: SectionResolveRequest", + "returns": "dict[str, Any]", + "line": 1255, + "doc": "Resolve adopted code context for downstream Townlight module clients.", + "decorator": "app.post('/api/v1/townlight_code/sections/resolve')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sections/{section_id}/history", + "router": "app", + "prefix_resolved": true, + "name": "section_history", + "signature": "section_id: str", + "returns": "dict[str, Any]", + "line": 1354, + "doc": "Return immutable amendment/version history for a section.", + "decorator": "app.get('/api/v1/townlight_code/sections/{section_id}/history')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sections/{section_id}/permalink", + "router": "app", + "prefix_resolved": true, + "name": "section_permalink", + "signature": "section_id: str", + "returns": "dict[str, Any]", + "line": 1363, + "doc": "Return the stable public-facing permalink for a section.", + "decorator": "app.get('/api/v1/townlight_code/sections/{section_id}/permalink')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/search", + "router": "app", + "prefix_resolved": true, + "name": "search_sections", + "signature": "q: str", + "returns": "dict[str, Any]", + "line": 1372, + "doc": "Search public-visible code sections and related public materials.", + "decorator": "app.get('/api/v1/townlight_code/search')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/popular-questions", + "router": "app", + "prefix_resolved": true, + "name": "list_popular_questions", + "signature": "", + "returns": "dict[str, Any]", + "line": 1381, + "doc": "List staff-approved public popular questions as navigation aids.", + "decorator": "app.get('/api/v1/townlight_code/popular-questions')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/popular-questions", + "router": "app", + "prefix_resolved": true, + "name": "create_popular_question", + "signature": "request: PopularQuestionCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1403, + "doc": "Create a staff-approved public popular question tied to cited adopted code.", + "decorator": "app.post('/api/v1/townlight_code/staff/popular-questions', status_code=201)", + "errors": [ + "HTTPException(status_code=422, detail={'message': 'Popular questions cannot ask TownlightCode for a legal determination.', 'fix': \"Rewrite the question as a navigation prompt, such as 'Where do I read the backyard chicken permit rule?'\"})", + "HTTPException(status_code=409, detail={'message': citation_payload.get('reason', 'Citation could not be built.'), 'fix': citation_payload.get('fix', 'Attach the question to cited adopted code.')})" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sections/{section_number}/related", + "router": "app", + "prefix_resolved": true, + "name": "related_materials", + "signature": "section_number: str", + "returns": "dict[str, Any]", + "line": 1453, + "doc": "List explicit public related materials for one adopted section.", + "decorator": "app.get('/api/v1/townlight_code/sections/{section_number}/related')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/citations/build", + "router": "app", + "prefix_resolved": true, + "name": "build_citation", + "signature": "section_number: str, as_of: date | None=None", + "returns": "dict[str, Any]", + "line": 1466, + "doc": "Build a deterministic citation object or a structured refusal.", + "decorator": "app.get('/api/v1/townlight_code/citations/build')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sections/{section_ref}/export", + "router": "app", + "prefix_resolved": true, + "name": "export_section", + "signature": "section_ref: str, as_of: date | None=None", + "returns": "dict[str, Any]", + "line": 1472, + "doc": "Return a records-ready section export with citation and source provenance.", + "decorator": "app.get('/api/v1/townlight_code/sections/{section_ref}/export')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/questions/answer", + "router": "app", + "prefix_resolved": true, + "name": "answer_question", + "signature": "request: QuestionAnswerRequest", + "returns": "dict[str, Any]", + "line": 1478, + "doc": "Answer code questions only when an adopted section citation grounds them.", + "decorator": "app.post('/api/v1/townlight_code/questions/answer')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/sections/{section_id}/notes", + "router": "app", + "prefix_resolved": true, + "name": "create_interpretation_note", + "signature": "section_id: str, request: InterpretationNoteCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1494, + "doc": "Create a staff-only interpretation note without exposing it publicly.", + "decorator": "app.post('/api/v1/townlight_code/staff/sections/{section_id}/notes', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/sections/{section_id}/notes", + "router": "app", + "prefix_resolved": true, + "name": "list_interpretation_notes", + "signature": "section_id: str, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1517, + "doc": "List staff-only interpretation notes for authorized staff clients.", + "decorator": "app.get('/api/v1/townlight_code/staff/sections/{section_id}/notes')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/audit-events", + "router": "app", + "prefix_resolved": true, + "name": "list_staff_audit_events", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1532, + "doc": "List staff workbench audit events for authorized staff clients.", + "decorator": "app.get('/api/v1/townlight_code/staff/audit-events')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/imports/local-bundle", + "router": "app", + "prefix_resolved": true, + "name": "create_local_import_job", + "signature": "request: ImportBundleCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1548, + "doc": "Import a local codifier/file-drop fixture without outbound network calls.", + "decorator": "app.post('/api/v1/townlight_code/staff/imports/local-bundle', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/imports/shared-pdf", + "router": "app", + "prefix_resolved": true, + "name": "create_shared_pdf_import_job", + "signature": "request: SharedPdfImportCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1560, + "doc": "Ingest a municipal code PDF through TownlightCore, then structure it for TownlightCode.", + "decorator": "app.post('/api/v1/townlight_code/staff/imports/shared-pdf', status_code=201)", + "errors": [ + "HTTPException(status_code=409, detail={'message': 'Shared PDF ingestion requires a durable PostgreSQL runtime.', 'fix': 'Set TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL or DATABASE_URL to the TownlightCode PostgreSQL DSN.'})" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/imports", + "router": "app", + "prefix_resolved": true, + "name": "list_import_jobs", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1594, + "doc": "List local import jobs and their visible success/failure states.", + "decorator": "app.get('/api/v1/townlight_code/staff/imports')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/imports/{job_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_import_job", + "signature": "job_id: str, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1604, + "doc": "Read a local import job, including actionable failure details.", + "decorator": "app.get('/api/v1/townlight_code/staff/imports/{job_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/imports/{job_id}/retry", + "router": "app", + "prefix_resolved": true, + "name": "retry_import_job", + "signature": "job_id: str, request: ImportBundleCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1619, + "doc": "Retry a failed import job with a corrected local bundle.", + "decorator": "app.post('/api/v1/townlight_code/staff/imports/{job_id}/retry', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/imports/{job_id}/provenance", + "router": "app", + "prefix_resolved": true, + "name": "get_import_provenance", + "signature": "job_id: str, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1635, + "doc": "Return a provenance report for a local import job.", + "decorator": "app.get('/api/v1/townlight_code/staff/imports/{job_id}/provenance')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/imports/{job_id}/tree", + "router": "app", + "prefix_resolved": true, + "name": "get_imported_tree", + "signature": "job_id: str, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1650, + "doc": "Show imported title/chapter/section/version tree for staff verification.", + "decorator": "app.get('/api/v1/townlight_code/staff/imports/{job_id}/tree')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/sync/codifier-sources", + "router": "app", + "prefix_resolved": true, + "name": "configure_codifier_sync_source", + "signature": "request: CodifierSyncConfigureRequest, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1673, + "doc": "Enable staff-controlled codifier sync readiness for an official source.", + "decorator": "app.post('/api/v1/townlight_code/staff/sync/codifier-sources', status_code=201)", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/staff/sync/codifier-sources", + "router": "app", + "prefix_resolved": true, + "name": "list_codifier_sync_sources", + "signature": "x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1694, + "doc": "List codifier sync readiness and circuit health for staff.", + "decorator": "app.get('/api/v1/townlight_code/staff/sync/codifier-sources')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/sync/codifier-sources/{source_id}/run", + "router": "app", + "prefix_resolved": true, + "name": "run_codifier_sync_source", + "signature": "source_id: str, request: CodifierSyncRunRequest, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1709, + "doc": "Run one staff-controlled codifier sync using an already fetched local payload.", + "decorator": "app.post('/api/v1/townlight_code/staff/sync/codifier-sources/{source_id}/run', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/townlight_meetings/ordinance-events", + "router": "app", + "prefix_resolved": true, + "name": "create_townlight_meetings_ordinance_event", + "signature": "request: TownlightMeetingsOrdinanceEventCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None), x_townlight_code_intake_auth: str | None=Header(default=None, alias=TOWNLIGHT_CODE_INTAKE_AUTH_HEADER), authorization: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1730, + "doc": "Receive TownlightMeetings ordinance/adoption events without codifying them.", + "decorator": "app.post('/api/v1/townlight_code/staff/townlight_meetings/ordinance-events', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/townlight_meetings/ordinance-events/{event_id}/resolve", + "router": "app", + "prefix_resolved": true, + "name": "resolve_townlight_meetings_ordinance_event", + "signature": "event_id: str, request: TownlightMeetingsOrdinanceEventResolve, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None), x_townlight_code_intake_auth: str | None=Header(default=None, alias=TOWNLIGHT_CODE_INTAKE_AUTH_HEADER), authorization: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1756, + "doc": "Mark a TownlightMeetings handoff codified after staff creates the adopted code version.", + "decorator": "app.post('/api/v1/townlight_code/staff/townlight_meetings/ordinance-events/{event_id}/resolve')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/sections/{section_id}/summaries", + "router": "app", + "prefix_resolved": true, + "name": "create_plain_language_summary", + "signature": "section_id: str, request: PlainLanguageSummaryCreate, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1806, + "doc": "Create a staff-drafted plain-language summary tied to adopted code text.", + "decorator": "app.post('/api/v1/townlight_code/staff/sections/{section_id}/summaries', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/summaries/{summary_id}/approve", + "router": "app", + "prefix_resolved": true, + "name": "approve_plain_language_summary", + "signature": "summary_id: str, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1841, + "doc": "Approve a plain-language summary for public display after staff review.", + "decorator": "app.post('/api/v1/townlight_code/staff/summaries/{summary_id}/approve')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_code/sections/{section_id}/summaries", + "router": "app", + "prefix_resolved": true, + "name": "list_public_plain_language_summaries", + "signature": "section_id: str", + "returns": "dict[str, Any]", + "line": 1866, + "doc": "List public approved summaries while keeping authoritative code visible.", + "decorator": "app.get('/api/v1/townlight_code/sections/{section_id}/summaries')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_code/staff/questions/answer", + "router": "app", + "prefix_resolved": true, + "name": "answer_staff_question", + "signature": "request: QuestionAnswerRequest, x_townlight_code_role: str | None=Header(default=None), x_townlight_code_actor: str | None=Header(default=None)", + "returns": "dict[str, Any]", + "line": 1895, + "doc": "Answer staff questions with staff-only notes kept out of public responses.", + "decorator": "app.post('/api/v1/townlight_code/staff/questions/answer')", + "errors": [] + } + ], + "models": [ + { + "name": "SourceCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str | None", + "default": "None" + }, + { + "name": "name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "publisher", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_type", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_category", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_url", + "type": "str | None", + "default": "None" + }, + { + "name": "file_reference", + "type": "str | None", + "default": "None" + }, + { + "name": "retrieved_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "retrieval_method", + "type": "str | None", + "default": "None" + }, + { + "name": "checksum", + "type": "str | None", + "default": "None" + }, + { + "name": "source_owner", + "type": "str | None", + "default": "None" + }, + { + "name": "is_official", + "type": "bool", + "default": "True" + }, + { + "name": "official_status_note", + "type": "str | None", + "default": "None" + }, + { + "name": "status", + "type": "str", + "default": "'draft'" + }, + { + "name": "staff_notes", + "type": "str | None", + "default": "None" + } + ], + "line": 286, + "doc": "Request body for registering an official or explicitly labeled source." + }, + { + "name": "SourceTransitionRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "to_status", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 308, + "doc": "Request body for source-state changes." + }, + { + "name": "TitleCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title_id", + "type": "str | None", + "default": "None" + }, + { + "name": "title_number", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "title_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "sort_order", + "type": "int", + "default": "0" + } + ], + "line": 318, + "doc": "Request body for creating a code title." + }, + { + "name": "ChapterCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "chapter_id", + "type": "str | None", + "default": "None" + }, + { + "name": "title_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "chapter_number", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "chapter_name", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "sort_order", + "type": "int", + "default": "0" + } + ], + "line": 329, + "doc": "Request body for creating a code chapter." + }, + { + "name": "SectionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "section_id", + "type": "str | None", + "default": "None" + }, + { + "name": "chapter_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "section_number", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "section_heading", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "parent_section_id", + "type": "str | None", + "default": "None" + }, + { + "name": "sort_order", + "type": "int", + "default": "0" + }, + { + "name": "administrative_regulation_refs", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "resolution_refs", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "policy_refs", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "approved_summary_refs", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 341, + "doc": "Request body for creating a code section or subsection." + }, + { + "name": "SectionVersionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "version_id", + "type": "str | None", + "default": "None" + }, + { + "name": "section_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "version_label", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "body", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "effective_start", + "type": "date", + "default": "" + }, + { + "name": "effective_end", + "type": "date | None", + "default": "None" + }, + { + "name": "status", + "type": "str", + "default": "'draft'" + }, + { + "name": "is_current", + "type": "bool", + "default": "False" + }, + { + "name": "adoption_event_id", + "type": "str | None", + "default": "None" + }, + { + "name": "amendment_event_id", + "type": "str | None", + "default": "None" + }, + { + "name": "amendment_summary", + "type": "str | None", + "default": "None" + }, + { + "name": "prior_version_id", + "type": "str | None", + "default": "None" + } + ], + "line": 358, + "doc": "Request body for adding an immutable section version." + }, + { + "name": "QuestionAnswerRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "question", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "section_number", + "type": "str | None", + "default": "None" + }, + { + "name": "as_of", + "type": "date | None", + "default": "None" + } + ], + "line": 378, + "doc": "Request body for citation-grounded code Q&A." + }, + { + "name": "SectionResolveRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "consumer_module", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "section_number", + "type": "str | None", + "default": "None" + }, + { + "name": "query", + "type": "str | None", + "default": "None" + }, + { + "name": "as_of", + "type": "date | None", + "default": "None" + } + ], + "line": 388, + "doc": "Request body for downstream module section-resolution clients." + }, + { + "name": "PopularQuestionCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "question_id", + "type": "str | None", + "default": "None" + }, + { + "name": "question_text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "section_number", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "answer_excerpt", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "audience", + "type": "str", + "default": "'public'" + }, + { + "name": "status", + "type": "str", + "default": "'approved'" + }, + { + "name": "is_popular", + "type": "bool", + "default": "True" + } + ], + "line": 399, + "doc": "Request body for a staff-approved public popular-question navigation aid." + }, + { + "name": "InterpretationNoteCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "note_id", + "type": "str | None", + "default": "None" + }, + { + "name": "note_text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "status", + "type": "str", + "default": "'draft'" + } + ], + "line": 413, + "doc": "Request body for staff-only interpretation notes." + }, + { + "name": "PlainLanguageSummaryCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "summary_id", + "type": "str | None", + "default": "None" + }, + { + "name": "section_version_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "summary_text", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "language_code", + "type": "str", + "default": "'en'" + }, + { + "name": "status", + "type": "str", + "default": "'draft'" + } + ], + "line": 423, + "doc": "Request body for staff-drafted plain-language summaries." + }, + { + "name": "TownlightMeetingsOrdinanceEventCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "event_id", + "type": "str | None", + "default": "None" + }, + { + "name": "external_event_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "townlight_meetings_meeting_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "townlight_meetings_agenda_item_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "ordinance_number", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "status", + "type": "str", + "default": "'pending'" + }, + { + "name": "affected_sections", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "source_document_url", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source_document_hash", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "ordinance_text", + "type": "str", + "default": "''" + }, + { + "name": "adopted_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "failure_reason", + "type": "str | None", + "default": "None" + } + ], + "line": 435, + "doc": "Request body for TownlightMeetings ordinance/adoption handoff intake." + }, + { + "name": "TownlightMeetingsOrdinanceEventResolve", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "section_version_id", + "type": "str", + "default": "Field(min_length=1)" + } + ], + "line": 455, + "doc": "Request body for resolving a handoff after staff codifies the amendment." + }, + { + "name": "ImportBundleCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "job_id", + "type": "str | None", + "default": "None" + }, + { + "name": "connector_type", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "source", + "type": "SourceCreate", + "default": "" + }, + { + "name": "sources", + "type": "list[SourceCreate]", + "default": "Field(default_factory=list)" + }, + { + "name": "titles", + "type": "list[TitleCreate]", + "default": "Field(default_factory=list)" + }, + { + "name": "chapters", + "type": "list[ChapterCreate]", + "default": "Field(default_factory=list)" + }, + { + "name": "sections", + "type": "list[SectionCreate]", + "default": "Field(default_factory=list)" + }, + { + "name": "versions", + "type": "list[SectionVersionCreate]", + "default": "Field(default_factory=list)" + }, + { + "name": "provenance", + "type": "dict[str, Any]", + "default": "Field(default_factory=dict)" + } + ], + "line": 463, + "doc": "Request body for local fixture/file-drop import jobs." + }, + { + "name": "SharedPdfImportCreate", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "pdf_path", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "force_reingest", + "type": "bool", + "default": "False" + } + ], + "line": 479, + "doc": "Request body for TownlightCore shared PDF ingestion into TownlightCode." + }, + { + "name": "CodifierSyncConfigureRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "sync_schedule", + "type": "str", + "default": "Field(min_length=1)" + }, + { + "name": "allowlisted_hosts", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 488, + "doc": "Request body for enabling staff-controlled codifier sync readiness." + }, + { + "name": "CodifierSyncRunRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "payload", + "type": "ImportBundleCreate", + "default": "" + }, + { + "name": "changed_since", + "type": "datetime | None", + "default": "None" + } + ], + "line": 498, + "doc": "Request body for a local codifier sync run." + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 1988 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 1999 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 2010 + }, + { + "variable": "TOWNLIGHT_CODE_DEMO_ACTOR", + "default": "'demo-seed@portland.example.gov'", + "line": 2062 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 173 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 201 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 224 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 252 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 1567 + }, + { + "variable": "DATABASE_URL", + "default": "", + "line": 1567 + }, + { + "variable": "TOWNLIGHT_CODE_SOURCE_REGISTRY_DB_URL", + "default": "", + "line": 2020 + }, + { + "variable": "TOWNLIGHT_CODE_DEMO_SEED", + "default": "''", + "line": 2056 + } + ] + }, + { + "source": "installed-owned-source/townlight_code/migrations/__init__.py", + "sha256": "4c8b91a2b40fe7951bf11bd74070344c9967b0feb5170a68d490305dc8333b8e", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/env.py", + "sha256": "5526b8ac01c1bc652c77861bb77209503668127d5c9a8d810dda351dff7a158e", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "DATABASE_URL", + "default": "", + "line": 24 + } + ] + }, + { + "source": "installed-owned-source/townlight_code/migrations/guards.py", + "sha256": "110cca437db7e2507374b9e0d9d32739dbdbaf57c664ac89d8a4c56472c05d7f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/__init__.py", + "sha256": "74446fe86c7d899c1e4942b131ef47880cbb716011970d702ac78799902cc7ac", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0001_schema.py", + "sha256": "3361408fb75b2330c3dffa4c343bffa39ec96cb41b25d7c3e980f3efea69a950", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0002_source_registry_records.py", + "sha256": "a237d274d614a260242b2eee1661845fa96476445a8496c1fc2e8ff773fcc85c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0003_popular_question_records.py", + "sha256": "d973ad1e13a5b84cc4bcc19d9977d9532d09388451c3872549180fa02ecfe609", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0004_section_lifecycle_records.py", + "sha256": "e11d0b3c4d08f32c00e513bbf336bf9f3ee2459c929aca0fed7c2158b688299f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0005_staff_summary_records.py", + "sha256": "04d9a42402dbf503f9988dc07c4fe264390470d798d8e2d51983a1d7b8a5e601", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0006_ordinance_handoff_records.py", + "sha256": "bd2c85f222a0d4946298bdb580a36af174be378fbb3bdf62641457b87d5499fa", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0007_import_job_records.py", + "sha256": "d965ccf019d4059fe56ffd234955f45193d51d52a38b20fa1ba66e809493cb67", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0008_codifier_sync.py", + "sha256": "10b417a95e25d79ea3cc48fb3feedec0eea878f9580eba0b3c9e0b9413886366", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0009_operational_state.py", + "sha256": "5ff5a28d099a69b55c121fbf6ff9336cb8dee51e385966900510aba5df9a7540", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0010_handoff_resolution.py", + "sha256": "ed20579ff39863de49bd01a97a47b77d84b380f54f0aba7473c1aad360b11b4a", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0011_semantic_search.py", + "sha256": "4bf32028058db6ff90c19e2cf891886fef6d4e958ed7e72165e9a224ebd1b19d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/migrations/versions/townlight_code_0012_drop_local_search.py", + "sha256": "6ac60feecb72efbe78a788066ac58d790f6e6c460f4a71eea6ecf6cf30a6570d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/mock_city_environment.py", + "sha256": "91c1e1089e2956417fd520725847950c544166f0a93f2a0a63b7c1a9859c1189", + "routes": [], + "models": [ + { + "name": "MockCityCodifierContract", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "publisher", + "type": "str", + "default": "" + }, + { + "name": "source_type", + "type": "str", + "default": "" + }, + { + "name": "interface_status", + "type": "str", + "default": "" + }, + { + "name": "source_url", + "type": "str", + "default": "" + }, + { + "name": "retrieval_method", + "type": "str", + "default": "" + }, + { + "name": "auth_method", + "type": "str", + "default": "" + }, + { + "name": "delta_query_param", + "type": "str", + "default": "" + }, + { + "name": "sample_file", + "type": "str", + "default": "" + }, + { + "name": "source_owner", + "type": "str", + "default": "'City Clerk'" + } + ], + "line": 31, + "doc": "A public, secret-free contract for one municipal-code source interface." + }, + { + "name": "MockCityCodeCheck", + "bases": [], + "fields": [ + { + "name": "connector", + "type": "str", + "default": "" + }, + { + "name": "ok", + "type": "bool", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "source_id", + "type": "str | None", + "default": "None" + }, + { + "name": "import_job_id", + "type": "str | None", + "default": "None" + }, + { + "name": "delta_request_url", + "type": "str | None", + "default": "None" + }, + { + "name": "checked_sections", + "type": "tuple[str, ...]", + "default": "()" + } + ], + "line": 66, + "doc": "Result for one mock-city codifier contract check." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/models.py", + "sha256": "15f328be4b05481401d8ccd296110136ef98e98634fe59af1c2aa729340e8e4f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/operational_readiness.py", + "sha256": "002130b66583a7645218e271d515ca6b9295f7a8fe19ee9e85e6e52adacc07a9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/operational_state.py", + "sha256": "6d73c3201fc449de9bf6678d129184533323960f82ccb0a5c0f6dcb147421b0f", + "routes": [], + "models": [ + { + "name": "OperationalStateRecord", + "bases": [], + "fields": [ + { + "name": "record_id", + "type": "str", + "default": "" + }, + { + "name": "lane", + "type": "str", + "default": "" + }, + { + "name": "record_type", + "type": "str", + "default": "" + }, + { + "name": "subject_id", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "'system'" + }, + { + "name": "attempt_count", + "type": "int", + "default": "0" + }, + { + "name": "next_attempt_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "cursor_key", + "type": "str | None", + "default": "None" + }, + { + "name": "cursor_value", + "type": "str | None", + "default": "None" + }, + { + "name": "replay_of", + "type": "str | None", + "default": "None" + }, + { + "name": "payload_hash", + "type": "str | None", + "default": "None" + }, + { + "name": "details", + "type": "dict[str, Any]", + "default": "field(default_factory=dict)" + }, + { + "name": "failure", + "type": "dict[str, Any] | None", + "default": "None" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 20, + "doc": "One operator-visible operational state record." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/ordinance_handoff.py", + "sha256": "5e98eefc3e510efaf0d5973927aa3506f8b652d319320f745a831bef0cb5897b", + "routes": [], + "models": [ + { + "name": "OrdinanceEvent", + "bases": [], + "fields": [ + { + "name": "event_id", + "type": "str", + "default": "" + }, + { + "name": "external_event_id", + "type": "str", + "default": "" + }, + { + "name": "townlight_meetings_meeting_id", + "type": "str", + "default": "" + }, + { + "name": "townlight_meetings_agenda_item_id", + "type": "str", + "default": "" + }, + { + "name": "ordinance_number", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "affected_sections", + "type": "list[str]", + "default": "" + }, + { + "name": "source_document_url", + "type": "str", + "default": "" + }, + { + "name": "source_document_hash", + "type": "str", + "default": "" + }, + { + "name": "ordinance_text", + "type": "str", + "default": "''" + }, + { + "name": "adopted_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "failure_reason", + "type": "str | None", + "default": "None" + }, + { + "name": "resolved_section_version_id", + "type": "str | None", + "default": "None" + }, + { + "name": "resolved_by", + "type": "str | None", + "default": "None" + }, + { + "name": "resolved_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "created_by", + "type": "str", + "default": "'unknown'" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 39, + "doc": "" + }, + { + "name": "HandoffAuditEvent", + "bases": [], + "fields": [ + { + "name": "event_id", + "type": "str", + "default": "" + }, + { + "name": "event_type", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "target_id", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 69, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/plain_language.py", + "sha256": "074b7aae42a3c4ee7ae5e64726a5fbbe151039cb51467f89f47b977e93e9b2bd", + "routes": [], + "models": [ + { + "name": "PlainLanguageSummary", + "bases": [], + "fields": [ + { + "name": "summary_id", + "type": "str", + "default": "" + }, + { + "name": "section_id", + "type": "str", + "default": "" + }, + { + "name": "section_version_id", + "type": "str", + "default": "" + }, + { + "name": "summary_text", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "language_code", + "type": "str", + "default": "'en'" + }, + { + "name": "created_by", + "type": "str", + "default": "'unknown'" + }, + { + "name": "approved_by", + "type": "str | None", + "default": "None" + }, + { + "name": "approved_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 31, + "doc": "" + }, + { + "name": "SummaryAuditEvent", + "bases": [], + "fields": [ + { + "name": "event_id", + "type": "str", + "default": "" + }, + { + "name": "event_type", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "section_id", + "type": "str", + "default": "" + }, + { + "name": "target_id", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 49, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/public_discovery.py", + "sha256": "f87497befbd3f75db94c4db0f36fb04fc1a34af8eba73a425ff49edb8dfc20ae", + "routes": [], + "models": [ + { + "name": "PopularQuestion", + "bases": [], + "fields": [ + { + "name": "question_id", + "type": "str", + "default": "" + }, + { + "name": "question_text", + "type": "str", + "default": "" + }, + { + "name": "section_id", + "type": "str", + "default": "" + }, + { + "name": "section_number", + "type": "str", + "default": "" + }, + { + "name": "section_heading", + "type": "str", + "default": "" + }, + { + "name": "answer_excerpt", + "type": "str", + "default": "" + }, + { + "name": "citation_payload", + "type": "dict[str, Any]", + "default": "" + }, + { + "name": "audience", + "type": "str", + "default": "'public'" + }, + { + "name": "status", + "type": "str", + "default": "'draft'" + }, + { + "name": "is_popular", + "type": "bool", + "default": "True" + }, + { + "name": "approved_by", + "type": "str | None", + "default": "None" + }, + { + "name": "approved_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 34, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/public_exports.py", + "sha256": "2d413d312f8baf1e790bb4205ad93ac25928f1afefa3aca1898d91092085bcc4", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/public_lookup.py", + "sha256": "a3c62b6aaa3de1ef98ac824fd5806e61bd444ae61241e2a19f0f7dff3a3cca79", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/qa_harness.py", + "sha256": "bc040cb0c4ff124f13a63e10fbcb26d478a06da5364e7fa18d177b40af269797", + "routes": [], + "models": [ + { + "name": "QuestionRequestContext", + "bases": [], + "fields": [ + { + "name": "question", + "type": "str", + "default": "" + }, + { + "name": "section_number", + "type": "str | None", + "default": "None" + }, + { + "name": "as_of", + "type": "date | None", + "default": "None" + } + ], + "line": 37, + "doc": "Normalized input for deterministic question answering." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/real_municipal_fixtures.py", + "sha256": "a88b400d5b5bb8d6a74ec8a29d793c3e51ab94226e0f0b8abbde7030f667280a", + "routes": [], + "models": [ + { + "name": "PortlandSectionFixture", + "bases": [], + "fields": [ + { + "name": "section_id", + "type": "str", + "default": "" + }, + { + "name": "section_number", + "type": "str", + "default": "" + }, + { + "name": "heading", + "type": "str", + "default": "" + }, + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "source_url", + "type": "str", + "default": "" + }, + { + "name": "file_reference", + "type": "str", + "default": "" + }, + { + "name": "body", + "type": "str", + "default": "" + }, + { + "name": "effective_start", + "type": "str", + "default": "" + }, + { + "name": "adoption_event_id", + "type": "str | None", + "default": "None" + } + ], + "line": 22, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/section_lifecycle.py", + "sha256": "34096b4ca4fa8f65628d33761609044f29a03bf0d89a5da09085440e56d149f2", + "routes": [], + "models": [ + { + "name": "CodeTitle", + "bases": [], + "fields": [ + { + "name": "title_id", + "type": "str", + "default": "" + }, + { + "name": "title_number", + "type": "str", + "default": "" + }, + { + "name": "title_name", + "type": "str", + "default": "" + }, + { + "name": "sort_order", + "type": "int", + "default": "0" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 42, + "doc": "" + }, + { + "name": "CodeChapter", + "bases": [], + "fields": [ + { + "name": "chapter_id", + "type": "str", + "default": "" + }, + { + "name": "title_id", + "type": "str", + "default": "" + }, + { + "name": "chapter_number", + "type": "str", + "default": "" + }, + { + "name": "chapter_name", + "type": "str", + "default": "" + }, + { + "name": "sort_order", + "type": "int", + "default": "0" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 51, + "doc": "" + }, + { + "name": "CodeSection", + "bases": [], + "fields": [ + { + "name": "section_id", + "type": "str", + "default": "" + }, + { + "name": "chapter_id", + "type": "str", + "default": "" + }, + { + "name": "section_number", + "type": "str", + "default": "" + }, + { + "name": "section_heading", + "type": "str", + "default": "" + }, + { + "name": "parent_section_id", + "type": "str | None", + "default": "None" + }, + { + "name": "sort_order", + "type": "int", + "default": "0" + }, + { + "name": "administrative_regulation_refs", + "type": "list[str]", + "default": "field(default_factory=list)" + }, + { + "name": "resolution_refs", + "type": "list[str]", + "default": "field(default_factory=list)" + }, + { + "name": "policy_refs", + "type": "list[str]", + "default": "field(default_factory=list)" + }, + { + "name": "approved_summary_refs", + "type": "list[str]", + "default": "field(default_factory=list)" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 61, + "doc": "" + }, + { + "name": "SectionVersion", + "bases": [], + "fields": [ + { + "name": "version_id", + "type": "str", + "default": "" + }, + { + "name": "section_id", + "type": "str", + "default": "" + }, + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "version_label", + "type": "str", + "default": "" + }, + { + "name": "body", + "type": "str", + "default": "" + }, + { + "name": "effective_start", + "type": "date", + "default": "" + }, + { + "name": "effective_end", + "type": "date | None", + "default": "None" + }, + { + "name": "status", + "type": "str", + "default": "'draft'" + }, + { + "name": "is_current", + "type": "bool", + "default": "False" + }, + { + "name": "adoption_event_id", + "type": "str | None", + "default": "None" + }, + { + "name": "amendment_event_id", + "type": "str | None", + "default": "None" + }, + { + "name": "amendment_summary", + "type": "str | None", + "default": "None" + }, + { + "name": "prior_version_id", + "type": "str | None", + "default": "None" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 76, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_CODE_SEMANTIC_SCORE_FLOOR", + "default": "", + "line": 929 + } + ] + }, + { + "source": "installed-owned-source/townlight_code/semantic_search.py", + "sha256": "85de9cb0b861a7551a701bd4082ec3343728831c8bf20e45d90719db60f8b78c", + "routes": [], + "models": [ + { + "name": "SemanticDocument", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "version_id", + "type": "str", + "default": "" + }, + { + "name": "text", + "type": "str", + "default": "" + } + ], + "line": 24, + "doc": "" + }, + { + "name": "EmbeddingConfig", + "bases": [], + "fields": [ + { + "name": "mode", + "type": "str", + "default": "" + }, + { + "name": "base_url", + "type": "str", + "default": "" + }, + { + "name": "model", + "type": "str", + "default": "" + }, + { + "name": "timeout_seconds", + "type": "float", + "default": "" + } + ], + "line": 31, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_CODE_OLLAMA_EMBEDDING_MODEL", + "default": "DEFAULT_EMBEDDING_MODEL", + "line": 49 + }, + { + "variable": "TOWNLIGHT_CODE_OLLAMA_EMBEDDING_URL", + "default": "", + "line": 45 + }, + { + "variable": "TOWNLIGHT_CODE_OLLAMA_URL", + "default": "", + "line": 46 + }, + { + "variable": "OLLAMA_BASE_URL", + "default": "", + "line": 47 + }, + { + "variable": "TOWNLIGHT_CODE_OLLAMA_EMBEDDING_TIMEOUT_SECONDS", + "default": "'30'", + "line": 50 + }, + { + "variable": "TOWNLIGHT_CODE_EMBEDDING_MODE", + "default": "''", + "line": 40 + } + ] + }, + { + "source": "installed-owned-source/townlight_code/shared_ingestion.py", + "sha256": "caf8ec1c4d1da5a485ec96d0ae04e800e29f02fe1a71809cbebe0718c574f987", + "routes": [], + "models": [ + { + "name": "SharedIngestionImport", + "bases": [], + "fields": [ + { + "name": "payload", + "type": "dict[str, Any]", + "default": "" + }, + { + "name": "proof", + "type": "dict[str, Any]", + "default": "" + } + ], + "line": 65, + "doc": "A TownlightCore-ingested document plus a TownlightCode local-bundle payload." + } + ], + "configuration": [ + { + "variable": "DATABASE_URL", + "default": "", + "line": 172 + }, + { + "variable": "TOWNLIGHT_CODE_SHARED_INGEST_CHUNK_SIZE", + "default": "'500'", + "line": 88 + }, + { + "variable": "TOWNLIGHT_CODE_SHARED_INGEST_CHUNK_OVERLAP", + "default": "'50'", + "line": 89 + }, + { + "variable": "TOWNLIGHT_CODE_SHARED_INGEST_ALLOWED_DIRS", + "default": "", + "line": 252 + }, + { + "variable": "TOWNLIGHT_CODE_SHARED_INGEST_ALLOWED_DIR", + "default": "", + "line": 252 + } + ] + }, + { + "source": "installed-owned-source/townlight_code/source_registry.py", + "sha256": "292e2286802f36458a7468b749f81ff82277cc5f404fbf7b0ac7dd88f5d79651", + "routes": [], + "models": [ + { + "name": "CodeSource", + "bases": [], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "publisher", + "type": "str", + "default": "" + }, + { + "name": "source_type", + "type": "str", + "default": "" + }, + { + "name": "source_category", + "type": "str", + "default": "" + }, + { + "name": "source_url", + "type": "str | None", + "default": "None" + }, + { + "name": "file_reference", + "type": "str | None", + "default": "None" + }, + { + "name": "retrieved_at", + "type": "datetime | None", + "default": "None" + }, + { + "name": "retrieval_method", + "type": "str | None", + "default": "None" + }, + { + "name": "checksum", + "type": "str | None", + "default": "None" + }, + { + "name": "source_owner", + "type": "str | None", + "default": "None" + }, + { + "name": "is_official", + "type": "bool", + "default": "True" + }, + { + "name": "official_status_note", + "type": "str | None", + "default": "None" + }, + { + "name": "status", + "type": "str", + "default": "'draft'" + }, + { + "name": "staff_notes", + "type": "str | None", + "default": "None" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 74, + "doc": "Runtime representation of an official or explicitly non-official source." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/staff_code.py", + "sha256": "90b3d8ac3c6eb0c65831b47d8f6fa63ce3ac3d2350442c0913e15f7a768e317d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/staff_imports.py", + "sha256": "f5ccf4e1d8d24bd23b62f922013f0f8eb2a8b633737b0a1134002ea0ea51e8df", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/staff_sources.py", + "sha256": "b7d00f3e051f131fde7142426b911e4484076987e4711685d18cf85dcee15412", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/staff_sync.py", + "sha256": "92361f57357bd12e22dff589a6f2353de3602947ed739b8738d8479e2462791d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/staff_workbench.py", + "sha256": "13893408816cb0794c266c78d78e30e8182171b92830e757353001afea4f79fd", + "routes": [], + "models": [ + { + "name": "InterpretationNote", + "bases": [], + "fields": [ + { + "name": "note_id", + "type": "str", + "default": "" + }, + { + "name": "section_id", + "type": "str", + "default": "" + }, + { + "name": "note_text", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "'staff_only'" + }, + { + "name": "created_by", + "type": "str", + "default": "'unknown'" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 31, + "doc": "" + }, + { + "name": "AuditEvent", + "bases": [], + "fields": [ + { + "name": "event_id", + "type": "str", + "default": "" + }, + { + "name": "event_type", + "type": "str", + "default": "" + }, + { + "name": "actor", + "type": "str", + "default": "" + }, + { + "name": "section_id", + "type": "str | None", + "default": "None" + }, + { + "name": "target_id", + "type": "str | None", + "default": "None" + }, + { + "name": "created_at", + "type": "datetime", + "default": "field(default_factory=lambda: datetime.now(UTC))" + } + ], + "line": 42, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_code/suite_session_auth.py", + "sha256": "b30a449b95838c04098d33373f3b6b030539b7a8ea2a998210333b314f9f4582", + "routes": [], + "models": [ + { + "name": "SuiteSessionPrincipal", + "bases": [], + "fields": [ + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "roles", + "type": "frozenset[str]", + "default": "" + }, + { + "name": "session_id", + "type": "str", + "default": "" + } + ], + "line": 32, + "doc": "Validated TownlightCore suite-session identity." + } + ], + "configuration": [] + } + ], + "bridge": [ + { + "source": "installed-owned-source/townlight_runtime/code_bridge.py", + "sha256": "901f1473aa6f4db4b089925a2fec17e963cef7a27c6bf885099a362df1fe15e9", + "routes": [ + { + "method": "POST", + "path": "/desktop/v1/code/imports", + "router": "router", + "prefix_resolved": true, + "name": "imports", + "signature": "data: code.ImportBundleCreate, actor_id: str=Depends(actor)", + "returns": "", + "line": 46, + "doc": "", + "decorator": "router.post('/imports')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/sources", + "router": "router", + "prefix_resolved": true, + "name": "sources", + "signature": "actor_id: str=Depends(actor)", + "returns": "", + "line": 55, + "doc": "", + "decorator": "router.get('/sources')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/workspace", + "router": "router", + "prefix_resolved": true, + "name": "workspace", + "signature": "actor_id: str=Depends(actor)", + "returns": "", + "line": 60, + "doc": "", + "decorator": "router.get('/workspace')", + "errors": [ + "HTTPException(503, 'Townlight Code persistence unavailable.')" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/code/lookup", + "router": "router", + "prefix_resolved": true, + "name": "lookup", + "signature": "section_number: str, as_of: date | None=None, actor_id: str=Depends(actor)", + "returns": "", + "line": 68, + "doc": "", + "decorator": "router.get('/lookup')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/sections/{section_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "section_history", + "signature": "section_id: str, actor_id: str=Depends(actor)", + "returns": "", + "line": 77, + "doc": "", + "decorator": "router.get('/sections/{section_id}/history')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/citation", + "router": "router", + "prefix_resolved": true, + "name": "citation", + "signature": "section_number: str, as_of: date | None=None, actor_id: str=Depends(actor)", + "returns": "", + "line": 82, + "doc": "", + "decorator": "router.get('/citation')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/search", + "router": "router", + "prefix_resolved": true, + "name": "search", + "signature": "q: str, actor_id: str=Depends(actor)", + "returns": "", + "line": 89, + "doc": "", + "decorator": "router.get('/search')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/imports", + "router": "router", + "prefix_resolved": true, + "name": "list_imports", + "signature": "actor_id: str=Depends(actor)", + "returns": "", + "line": 100, + "doc": "", + "decorator": "router.get('/imports')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/imports/{job_id}/tree", + "router": "router", + "prefix_resolved": true, + "name": "import_tree", + "signature": "job_id: str, actor_id: str=Depends(actor)", + "returns": "", + "line": 105, + "doc": "", + "decorator": "router.get('/imports/{job_id}/tree')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/imports/{job_id}/provenance", + "router": "router", + "prefix_resolved": true, + "name": "import_provenance", + "signature": "job_id: str, actor_id: str=Depends(actor)", + "returns": "", + "line": 110, + "doc": "", + "decorator": "router.get('/imports/{job_id}/provenance')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/export", + "router": "router", + "prefix_resolved": true, + "name": "export_section", + "signature": "section_ref: str, as_of: date | None=None, actor_id: str=Depends(actor)", + "returns": "", + "line": 115, + "doc": "", + "decorator": "router.get('/export')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/code/questions", + "router": "router", + "prefix_resolved": true, + "name": "questions", + "signature": "data: code.QuestionAnswerRequest, actor_id: str=Depends(actor)", + "returns": "", + "line": 120, + "doc": "", + "decorator": "router.post('/questions')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/code/sections/{section_id}/notes", + "router": "router", + "prefix_resolved": true, + "name": "create_note", + "signature": "section_id: str, data: code.InterpretationNoteCreate, actor_id: str=Depends(actor)", + "returns": "", + "line": 125, + "doc": "", + "decorator": "router.post('/sections/{section_id}/notes')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/sections/{section_id}/notes", + "router": "router", + "prefix_resolved": true, + "name": "list_notes", + "signature": "section_id: str, actor_id: str=Depends(actor)", + "returns": "", + "line": 130, + "doc": "", + "decorator": "router.get('/sections/{section_id}/notes')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/code/sections/{section_id}/summaries", + "router": "router", + "prefix_resolved": true, + "name": "create_summary", + "signature": "section_id: str, data: code.PlainLanguageSummaryCreate, actor_id: str=Depends(actor)", + "returns": "", + "line": 135, + "doc": "", + "decorator": "router.post('/sections/{section_id}/summaries')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/code/summaries/{summary_id}/approve", + "router": "router", + "prefix_resolved": true, + "name": "approve_summary", + "signature": "summary_id: str, actor_id: str=Depends(actor)", + "returns": "", + "line": 140, + "doc": "", + "decorator": "router.post('/summaries/{summary_id}/approve')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/sections/{section_id}/summaries", + "router": "router", + "prefix_resolved": true, + "name": "list_summaries", + "signature": "section_id: str, actor_id: str=Depends(actor)", + "returns": "", + "line": 145, + "doc": "", + "decorator": "router.get('/sections/{section_id}/summaries')", + "errors": [] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_runtime/code_public.py", + "sha256": "0fe956329a96e54e138b669d4ab4f69ab0d6f489b647a115cfd126cfa58742a5", + "routes": [ + { + "method": "GET", + "path": "/townlight_code", + "router": "router", + "prefix_resolved": true, + "name": "home", + "signature": "", + "returns": "", + "line": 66, + "doc": "", + "decorator": "router.get('', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/search", + "router": "router", + "prefix_resolved": true, + "name": "search", + "signature": "q: str=''", + "returns": "", + "line": 71, + "doc": "", + "decorator": "router.get('/search', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/answer", + "router": "router", + "prefix_resolved": true, + "name": "answer", + "signature": "q: str='', section_number: str | None=None, as_of: date | None=None", + "returns": "", + "line": 80, + "doc": "", + "decorator": "router.get('/answer', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_code/sections/{section_ref}", + "router": "router", + "prefix_resolved": true, + "name": "detail", + "signature": "section_ref: str, as_of: date | None=None", + "returns": "HTMLResponse", + "line": 91, + "doc": "", + "decorator": "router.get('/sections/{section_ref}', response_class=HTMLResponse)", + "errors": [ + "HTTPException(503, 'Service unavailable')" + ] + }, + { + "method": "GET", + "path": "/townlight_code/sections/{section_ref}/export", + "router": "router", + "prefix_resolved": true, + "name": "export", + "signature": "section_ref: str, as_of: date | None=None", + "returns": "HTMLResponse", + "line": 109, + "doc": "", + "decorator": "router.get('/sections/{section_ref}/export', response_class=HTMLResponse)", + "errors": [ + "HTTPException(503, 'Service unavailable')" + ] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_runtime/code_meetings_bridge.py", + "sha256": "831045dc48508e866472a9ff6d9d837e8eed0a46c91c8f93b41eec526650c7c5", + "routes": [ + { + "method": "GET", + "path": "/desktop/v1/code/connections", + "router": "code_router", + "prefix_resolved": true, + "name": "list_connections", + "signature": "actor=Depends(code_actor)", + "returns": "", + "line": 87, + "doc": "", + "decorator": "code_router.get('/connections')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/code/connections/{connection_id}", + "router": "code_router", + "prefix_resolved": true, + "name": "get_connection", + "signature": "connection_id: Key, actor=Depends(code_actor)", + "returns": "", + "line": 92, + "doc": "", + "decorator": "code_router.get('/connections/{connection_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/code/connections", + "router": "code_router", + "prefix_resolved": true, + "name": "create_connection", + "signature": "payload: Proposal, actor=Depends(code_actor)", + "returns": "", + "line": 97, + "doc": "", + "decorator": "code_router.post('/connections')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/code/connections/{connection_id}/closeout", + "router": "code_router", + "prefix_resolved": true, + "name": "closeout_connection", + "signature": "connection_id: Key, payload: Closeout, actor=Depends(code_actor)", + "returns": "", + "line": 104, + "doc": "", + "decorator": "code_router.post('/connections/{connection_id}/closeout')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/meetings/code-connections", + "router": "meetings_router", + "prefix_resolved": true, + "name": "list_code_connections", + "signature": "actor=Depends(meeting_actor)", + "returns": "", + "line": 111, + "doc": "", + "decorator": "meetings_router.get('/code-connections')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/meetings/code-connections/{connection_id}", + "router": "meetings_router", + "prefix_resolved": true, + "name": "get_code_connection", + "signature": "connection_id: Key, actor=Depends(meeting_actor)", + "returns": "", + "line": 116, + "doc": "", + "decorator": "meetings_router.get('/code-connections/{connection_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/meetings/code-connections/{connection_id}/decisions", + "router": "meetings_router", + "prefix_resolved": true, + "name": "record_decision", + "signature": "connection_id: Key, payload: Decision, actor=Depends(meeting_actor)", + "returns": "", + "line": 121, + "doc": "", + "decorator": "meetings_router.post('/code-connections/{connection_id}/decisions')", + "errors": [] + } + ], + "models": [ + { + "name": "Proposal", + "bases": [ + "_Strict" + ], + "fields": [ + { + "name": "id", + "type": "Key", + "default": "" + }, + { + "name": "version_id", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "meeting_id", + "type": "UUID", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "ordinance_number", + "type": "str", + "default": "Field(min_length=1, max_length=120)" + }, + { + "name": "proposed_text", + "type": "str", + "default": "Field(min_length=1, max_length=1000000)" + }, + { + "name": "supersedes_id", + "type": "Key | None", + "default": "None" + }, + { + "name": "reconciliation_note", + "type": "str | None", + "default": "None" + } + ], + "line": 26, + "doc": "" + }, + { + "name": "Decision", + "bases": [ + "_Strict" + ], + "fields": [ + { + "name": "id", + "type": "Key", + "default": "" + }, + { + "name": "outcome", + "type": "Literal['adopted', 'not_adopted', 'deferred', 'withdrawn']", + "default": "" + }, + { + "name": "decided_at", + "type": "AwareDatetime | None", + "default": "None" + }, + { + "name": "decision_text", + "type": "str", + "default": "Field(min_length=1, max_length=1000000)" + }, + { + "name": "supporting_references", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "supersedes_decision_id", + "type": "Key | None", + "default": "None" + }, + { + "name": "reconciliation_note", + "type": "str | None", + "default": "None" + } + ], + "line": 37, + "doc": "" + }, + { + "name": "Closeout", + "bases": [ + "_Strict" + ], + "fields": [ + { + "name": "decision_id", + "type": "Key", + "default": "" + }, + { + "name": "version_id", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "version_label", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "body", + "type": "str", + "default": "Field(min_length=1, max_length=1000000)" + }, + { + "name": "effective_start", + "type": "date", + "default": "" + }, + { + "name": "effective_end", + "type": "date | None", + "default": "None" + }, + { + "name": "is_current", + "type": "bool", + "default": "" + }, + { + "name": "reconciliation_note", + "type": "str | None", + "default": "None" + } + ], + "line": 47, + "doc": "" + } + ], + "configuration": [] + } + ] + }, + "zoning": { + "package": "townlight_zoning", + "source": [ + { + "source": "installed-owned-source/townlight_zoning/__init__.py", + "sha256": "528eaa60c6814c1cf2b3ceb5a510c059380c37670f48928c27a02d765a2d4d15", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/cited_questions.py", + "sha256": "7a154dd540eae464090b4c12e6e0c1ca263670525df6a7328d317b0dd1e79a43", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/cited_rules.py", + "sha256": "4fb421ff3cd9e27be7689de75711bba8d1cd3ede304547868c204cf7a0daa43a", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/connected_sources.py", + "sha256": "68ad55c71b897eca689a6d028f4aee115dc5ca4b5ef005613385f9588387715b", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/discretionary.py", + "sha256": "919a5a573109fc76840290b4656e8fc63be91cdd10a6b3ff21fd106b52218ca5", + "routes": [], + "models": [ + { + "name": "Unavailable", + "bases": [], + "fields": [ + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "review_required", + "type": "bool", + "default": "True" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 45, + "doc": "An explicit refusal: the sources do not support an answer." + }, + { + "name": "NonconformityFlag", + "bases": [], + "fields": [ + { + "name": "observed", + "type": "str", + "default": "" + }, + { + "name": "standard", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "basis", + "type": "str", + "default": "" + }, + { + "name": "review_required", + "type": "bool", + "default": "True" + }, + { + "name": "determination_made", + "type": "bool", + "default": "False" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 55, + "doc": "A REVIEW flag raised from existing parcel/rule data. Never a finding." + }, + { + "name": "ProcessExplanation", + "bases": [], + "fields": [ + { + "name": "process", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + }, + { + "name": "what", + "type": "str", + "default": "" + }, + { + "name": "standard_citation", + "type": "str", + "default": "" + }, + { + "name": "needs", + "type": "list", + "default": "" + }, + { + "name": "review", + "type": "list", + "default": "" + }, + { + "name": "source_citation", + "type": "dict", + "default": "field(default_factory=dict)" + }, + { + "name": "standards", + "type": "list", + "default": "field(default_factory=list)" + }, + { + "name": "flags", + "type": "list", + "default": "field(default_factory=list)" + }, + { + "name": "review_required", + "type": "bool", + "default": "True" + }, + { + "name": "determination_made", + "type": "bool", + "default": "False" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + }, + { + "name": "as_of", + "type": "str | None", + "default": "None" + } + ], + "line": 68, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/geo_import.py", + "sha256": "e49824301593f8c06dd6bc64832542721d7b1763d745deb7ba531f7b894cc4a0", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/geo_spatial.py", + "sha256": "dfe4c88a940a20825c5c493babacb0cb0a96a70cb31a831c3ff1ecb4b77ebc13", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/geo_validate.py", + "sha256": "65b4a2b84722be8c25decfaeb80c6177ff30588259379927e853f7727d767178", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/integration_mocks.py", + "sha256": "ed14fba1a58020377ebee28c20ef042f5b50126ca2351efb73e46d7a2d80982c", + "routes": [], + "models": [ + { + "name": "IntegrationError", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "code", + "type": "str", + "default": "" + } + ], + "line": 27, + "doc": "" + }, + { + "name": "IntegrationResult", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "records", + "type": "tuple[dict[str, Any], ...]", + "default": "" + }, + { + "name": "source", + "type": "str", + "default": "" + }, + { + "name": "warnings", + "type": "tuple[str, ...]", + "default": "()" + }, + { + "name": "stale", + "type": "bool", + "default": "False" + } + ], + "line": 35, + "doc": "" + }, + { + "name": "LocalIntegrationAdapter", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "dependency", + "type": "str | None", + "default": "None" + } + ], + "line": 43, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/main.py", + "sha256": "cdbc4bd6f20650c08ca4a81c7e9d2fc7c85e0896bbd3d1c4e982dfe178c7bb93", + "routes": [ + { + "method": "GET", + "path": "/", + "router": "app", + "prefix_resolved": true, + "name": "root", + "signature": "", + "returns": "dict[str, str]", + "line": 74, + "doc": "Return current product state without overstating unshipped behavior.", + "decorator": "app.get('/')", + "errors": [] + }, + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "health", + "signature": "", + "returns": "dict[str, str]", + "line": 92, + "doc": "Return dependency/version health for deployment smoke checks.", + "decorator": "app.get('/health')", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_zoning", + "router": "app", + "prefix_resolved": true, + "name": "public_townlight_zoning_page", + "signature": "", + "returns": "str", + "line": 104, + "doc": "Return the accessible public sample UI.", + "decorator": "app.get('/townlight_zoning', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_zoning/staff", + "router": "app", + "prefix_resolved": true, + "name": "staff_townlight_zoning_page", + "signature": "", + "returns": "str", + "line": 111, + "doc": "Return the staff workflow shell without exposing staff data in HTML.", + "decorator": "app.get('/townlight_zoning/staff', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/parcels/lookup", + "router": "app", + "prefix_resolved": true, + "name": "parcel_lookup", + "signature": "request: ParcelLookupRequest", + "returns": "dict[str, object]", + "line": 220, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/parcels/lookup')", + "errors": [ + "HTTPException(status_code=422, detail={'message': 'Provide either parcel_number or address.', 'fix': \"Send parcel_number '100-200-300' or address '123 Main St', or load local parcel records into TOWNLIGHT_ZONING_PARCEL_RULE_DB_URL.\"})", + "HTTPException(status_code=404, detail={'message': result.message, 'fix': result.fix})" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/rules/use", + "router": "app", + "prefix_resolved": true, + "name": "use_rule_lookup", + "signature": "request: UseRuleLookupRequest", + "returns": "dict[str, str]", + "line": 246, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/rules/use')", + "errors": [ + "HTTPException(status_code=404, detail={'message': result.message, 'fix': result.fix})" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/rules/dimensional", + "router": "app", + "prefix_resolved": true, + "name": "dimensional_rule_lookup", + "signature": "request: DimensionalRuleLookupRequest", + "returns": "dict[str, str]", + "line": 261, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/rules/dimensional')", + "errors": [ + "HTTPException(status_code=404, detail={'message': result.message, 'fix': result.fix})" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/standards/process-explanation", + "router": "app", + "prefix_resolved": true, + "name": "discretionary_explanation", + "signature": "request: DiscretionaryExplanationRequest", + "returns": "dict[str, object]", + "line": 283, + "doc": "Explain the variance/CUP process a question is about, with citations.\n\nReturns an explicit ``unavailable`` payload when the loaded rule dataset cannot\nsupport an answer; never a guessed standard, and never a determination.", + "decorator": "app.post('/api/v1/townlight_zoning/standards/process-explanation')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/questions/answer", + "router": "app", + "prefix_resolved": true, + "name": "zone_question_answer", + "signature": "request: ZoneQuestionRequest", + "returns": "dict[str, object]", + "line": 353, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/questions/answer')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/planner-review/classify", + "router": "app", + "prefix_resolved": true, + "name": "planner_review_classify", + "signature": "request: PlannerReviewRequest", + "returns": "dict[str, str]", + "line": 378, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/planner-review/classify')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_zoning/staff/precedents/{precedent_id}", + "router": "app", + "prefix_resolved": true, + "name": "staff_precedent", + "signature": "precedent_id: str, _principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", + "returns": "dict[str, str]", + "line": 384, + "doc": "", + "decorator": "app.get('/api/v1/townlight_zoning/staff/precedents/{precedent_id}')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Staff precedent not found.', 'fix': \"Try precedent_id 'historic-adu'.\"})" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/staff/questions/answer", + "router": "app", + "prefix_resolved": true, + "name": "staff_question_answer", + "signature": "request: StaffQuestionAnswerRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", + "returns": "dict[str, object]", + "line": 402, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/staff/questions/answer')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/staff/ambiguity-reviews", + "router": "app", + "prefix_resolved": true, + "name": "create_ambiguity_review", + "signature": "request: AmbiguityReviewCreateRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", + "returns": "dict[str, object]", + "line": 415, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/staff/ambiguity-reviews')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_zoning/staff/ambiguity-reviews", + "router": "app", + "prefix_resolved": true, + "name": "list_ambiguity_reviews", + "signature": "_principal: Annotated[StaffPrincipal, Depends(_require_staff_access)], status: str | None=None", + "returns": "dict[str, object]", + "line": 429, + "doc": "", + "decorator": "app.get('/api/v1/townlight_zoning/staff/ambiguity-reviews')", + "errors": [] + }, + { + "method": "PATCH", + "path": "/api/v1/townlight_zoning/staff/ambiguity-reviews/{item_id}", + "router": "app", + "prefix_resolved": true, + "name": "update_ambiguity_review", + "signature": "item_id: str, request: AmbiguityReviewUpdateRequest, _principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", + "returns": "dict[str, object]", + "line": 443, + "doc": "", + "decorator": "app.patch('/api/v1/townlight_zoning/staff/ambiguity-reviews/{item_id}')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Ambiguity review item was not found.', 'fix': 'List staff ambiguity reviews and retry with an existing item id.'})", + "HTTPException(status_code=422, detail={'message': 'Ambiguity review update is invalid.', 'fix': str(exc)})" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_zoning/staff/questions/analytics", + "router": "app", + "prefix_resolved": true, + "name": "staff_question_analytics", + "signature": "_principal: Annotated[StaffPrincipal, Depends(_require_staff_access)], high_volume_threshold: int=2", + "returns": "dict[str, object]", + "line": 472, + "doc": "", + "decorator": "app.get('/api/v1/townlight_zoning/staff/questions/analytics')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/staff/reports/outline", + "router": "app", + "prefix_resolved": true, + "name": "staff_report_outline", + "signature": "request: StaffReportOutlineRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", + "returns": "dict[str, object]", + "line": 496, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/staff/reports/outline')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_zoning/staff/flagged-answers", + "router": "app", + "prefix_resolved": true, + "name": "create_flagged_answer_review", + "signature": "request: FlaggedAnswerCreateRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", + "returns": "dict[str, object]", + "line": 520, + "doc": "", + "decorator": "app.post('/api/v1/townlight_zoning/staff/flagged-answers')", + "errors": [] + }, + { + "method": "PATCH", + "path": "/api/v1/townlight_zoning/staff/flagged-answers/{review_id}/improve", + "router": "app", + "prefix_resolved": true, + "name": "improve_flagged_answer_review", + "signature": "review_id: str, request: FlaggedAnswerImproveRequest, principal: Annotated[StaffPrincipal, Depends(_require_staff_access)]", + "returns": "dict[str, object]", + "line": 536, + "doc": "", + "decorator": "app.patch('/api/v1/townlight_zoning/staff/flagged-answers/{review_id}/improve')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Flagged answer review was not found.', 'fix': 'Create or list the flagged answer review before submitting improvements.'})" + ] + } + ], + "models": [ + { + "name": "StaffPrincipal", + "bases": [], + "fields": [ + { + "name": "subject", + "type": "str", + "default": "" + }, + { + "name": "roles", + "type": "tuple[str, ...]", + "default": "" + } + ], + "line": 68, + "doc": "" + }, + { + "name": "ParcelLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "parcel_number", + "type": "str | None", + "default": "Field(default=None)" + }, + { + "name": "address", + "type": "str | None", + "default": "Field(default=None)" + } + ], + "line": 117, + "doc": "" + }, + { + "name": "UseRuleLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "use", + "type": "str", + "default": "" + } + ], + "line": 122, + "doc": "" + }, + { + "name": "DimensionalRuleLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "rule_type", + "type": "str", + "default": "" + } + ], + "line": 127, + "doc": "" + }, + { + "name": "ZoneQuestionRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "question", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + } + ], + "line": 132, + "doc": "" + }, + { + "name": "PlannerReviewRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "question", + "type": "str", + "default": "" + } + ], + "line": 137, + "doc": "" + }, + { + "name": "StaffQuestionAnswerRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "question", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + } + ], + "line": 141, + "doc": "" + }, + { + "name": "AmbiguityReviewCreateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "question", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + } + ], + "line": 146, + "doc": "" + }, + { + "name": "AmbiguityReviewUpdateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "status", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "Field(default=None, max_length=255)" + }, + { + "name": "resolution", + "type": "str | None", + "default": "Field(default=None, max_length=1000)" + } + ], + "line": 152, + "doc": "" + }, + { + "name": "StaffReportOutlineRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "question_ids", + "type": "list[str]", + "default": "Field(default_factory=list)" + }, + { + "name": "queue_item_ids", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 158, + "doc": "" + }, + { + "name": "FlaggedAnswerCreateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "question", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "original_answer", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "flag_reason", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "citations", + "type": "list[str]", + "default": "Field(default_factory=list)" + } + ], + "line": 164, + "doc": "" + }, + { + "name": "FlaggedAnswerImproveRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "improved_answer", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "improvement_notes", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + } + ], + "line": 172, + "doc": "" + }, + { + "name": "DiscretionaryExplanationRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "process_section", + "type": "str", + "default": "Field(default='', max_length=255)" + }, + { + "name": "question", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "zone_code", + "type": "str", + "default": "Field(default='', max_length=20)" + }, + { + "name": "rule_types", + "type": "list[str]", + "default": "Field(default_factory=list, max_length=12)" + }, + { + "name": "observed", + "type": "dict[str, str]", + "default": "Field(default_factory=dict)" + } + ], + "line": 274, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_ZONING_PARCEL_RULE_DB_URL", + "default": "", + "line": 559 + } + ] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/__init__.py", + "sha256": "38cbccb2471a214eac40f174b618d28d0367c43a0e66d3eb5807dad737142765", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/env.py", + "sha256": "3baae8fbf8726f8811647eb75d257e310d2d9660b0150833f17220dd8fa431ba", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "DATABASE_URL", + "default": "", + "line": 22 + } + ] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/guards.py", + "sha256": "9346e9812f238cfee1bdd21f5487fb5c51ee4cabeda45da9aaed6ac2db9b5f7c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/versions/__init__.py", + "sha256": "a1087a2a3cedf40641ab02c8e97838630305726600105ad59e30727b61a2f95d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/versions/townlight_zoning_0001_schema.py", + "sha256": "0a6985e6fda034f4e654e63f2cb47610bf2af75dd028fc8f43473604550a2a18", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/versions/townlight_zoning_0002_parcel_rule_lookup_records.py", + "sha256": "8a473e69469f9fdbca5adefcdb7e9a41d50850f1a7460381691da5a4f137314d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/versions/townlight_zoning_0003_question_ledger.py", + "sha256": "fd654ca0d15832acb727b88ece26acce25cb45da1ff8b438152ad7c766df0abc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/versions/townlight_zoning_0004_staff_workflows.py", + "sha256": "3c0a145ff691077453b65413f2f08a6b7107a55f3ff21c072a8bc3788028b952", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/versions/townlight_zoning_0005_geo_import.py", + "sha256": "8d4c34c15197ddc856c712d7fb8f9005cb553a2befd38a093a2c952a321d20ce", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/migrations/versions/townlight_zoning_0006_cited_questions.py", + "sha256": "65b8c591b5adf3f0022720a2c4e780c818f0f4b5b51db83b81cab78edb2a1f9d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/models.py", + "sha256": "206d16a1b4aa343eceee7bb25bdf39411f2b57e947a98a8be45607664635aba9", + "routes": [], + "models": [ + { + "name": "TimestampMixin", + "bases": [], + "fields": [ + { + "name": "created_at", + "type": "Mapped[object]", + "default": "mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())" + }, + { + "name": "updated_at", + "type": "Mapped[object]", + "default": "mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())" + } + ], + "line": 12, + "doc": "" + }, + { + "name": "IdMixin", + "bases": [], + "fields": [ + { + "name": "id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(UUID(as_uuid=True), primary_key=True, server_default=text('gen_random_uuid()'))" + } + ], + "line": 21, + "doc": "" + }, + { + "name": "Zone", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "code", + "type": "Mapped[str]", + "default": "mapped_column(String(80), nullable=False)" + }, + { + "name": "name", + "type": "Mapped[str]", + "default": "mapped_column(String(255), nullable=False)" + }, + { + "name": "description", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "jurisdiction", + "type": "Mapped[str]", + "default": "mapped_column(String(255), nullable=False)" + }, + { + "name": "source_section_ref", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + }, + { + "name": "is_active", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, nullable=False, server_default=text('true'))" + } + ], + "line": 27, + "doc": "" + }, + { + "name": "Overlay", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "code", + "type": "Mapped[str]", + "default": "mapped_column(String(80), nullable=False)" + }, + { + "name": "name", + "type": "Mapped[str]", + "default": "mapped_column(String(255), nullable=False)" + }, + { + "name": "description", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "source_section_ref", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + }, + { + "name": "is_active", + "type": "Mapped[bool]", + "default": "mapped_column(Boolean, nullable=False, server_default=text('true'))" + } + ], + "line": 39, + "doc": "" + }, + { + "name": "Parcel", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "parcel_number", + "type": "Mapped[str]", + "default": "mapped_column(String(120), nullable=False)" + }, + { + "name": "address", + "type": "Mapped[str]", + "default": "mapped_column(String(500), nullable=False)" + }, + { + "name": "zone_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('townlight_zoning.zones.id'), nullable=False)" + }, + { + "name": "overlay_payload", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'[]'::jsonb\"))" + }, + { + "name": "geometry_ref", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "source_payload", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'{}'::jsonb\"))" + } + ], + "line": 50, + "doc": "" + }, + { + "name": "UseCategory", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "code", + "type": "Mapped[str]", + "default": "mapped_column(String(120), nullable=False)" + }, + { + "name": "label", + "type": "Mapped[str]", + "default": "mapped_column(String(255), nullable=False)" + }, + { + "name": "description", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + } + ], + "line": 62, + "doc": "" + }, + { + "name": "UseRule", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "zone_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('townlight_zoning.zones.id'), nullable=False)" + }, + { + "name": "use_category_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('townlight_zoning.use_categories.id'), nullable=False)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(80), nullable=False)" + }, + { + "name": "review_path", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + }, + { + "name": "source_section_ref", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + }, + { + "name": "conditions", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'[]'::jsonb\"))" + } + ], + "line": 71, + "doc": "" + }, + { + "name": "DimensionalRule", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "zone_id", + "type": "Mapped[uuid.UUID]", + "default": "mapped_column(ForeignKey('townlight_zoning.zones.id'), nullable=False)" + }, + { + "name": "rule_type", + "type": "Mapped[str]", + "default": "mapped_column(String(120), nullable=False)" + }, + { + "name": "value_text", + "type": "Mapped[str]", + "default": "mapped_column(String(255), nullable=False)" + }, + { + "name": "source_section_ref", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + }, + { + "name": "applies_to", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + } + ], + "line": 85, + "doc": "" + }, + { + "name": "Citation", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "source_section_ref", + "type": "Mapped[str]", + "default": "mapped_column(String(255), nullable=False)" + }, + { + "name": "citation_text", + "type": "Mapped[str]", + "default": "mapped_column(String(500), nullable=False)" + }, + { + "name": "url", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "retrieved_at", + "type": "Mapped[object | None]", + "default": "mapped_column(DateTime(timezone=True))" + } + ], + "line": 96, + "doc": "" + }, + { + "name": "Precedent", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "title", + "type": "Mapped[str]", + "default": "mapped_column(String(500), nullable=False)" + }, + { + "name": "body", + "type": "Mapped[str]", + "default": "mapped_column(Text, nullable=False)" + }, + { + "name": "visibility", + "type": "Mapped[str]", + "default": "mapped_column(String(80), nullable=False)" + }, + { + "name": "source_ref", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + }, + { + "name": "tags", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'[]'::jsonb\"))" + } + ], + "line": 106, + "doc": "" + }, + { + "name": "InterpretationNote", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "zone_id", + "type": "Mapped[uuid.UUID | None]", + "default": "mapped_column(ForeignKey('townlight_zoning.zones.id'))" + }, + { + "name": "note_text", + "type": "Mapped[str]", + "default": "mapped_column(Text, nullable=False)" + }, + { + "name": "visibility", + "type": "Mapped[str]", + "default": "mapped_column(String(80), nullable=False)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(80), nullable=False)" + } + ], + "line": 117, + "doc": "" + }, + { + "name": "ZoneQuestion", + "bases": [ + "IdMixin", + "TimestampMixin", + "Base" + ], + "fields": [ + { + "name": "__table_args__", + "type": "ClassVar[dict]", + "default": "{'schema': 'townlight_zoning'}" + }, + { + "name": "question_text", + "type": "Mapped[str]", + "default": "mapped_column(Text, nullable=False)" + }, + { + "name": "audience", + "type": "Mapped[str]", + "default": "mapped_column(String(80), nullable=False)" + }, + { + "name": "status", + "type": "Mapped[str]", + "default": "mapped_column(String(80), nullable=False)" + }, + { + "name": "answer_text", + "type": "Mapped[str | None]", + "default": "mapped_column(Text)" + }, + { + "name": "citation_payload", + "type": "Mapped[dict]", + "default": "mapped_column(JSONB, nullable=False, server_default=text(\"'[]'::jsonb\"))" + }, + { + "name": "escalation_reason", + "type": "Mapped[str | None]", + "default": "mapped_column(String(255))" + } + ], + "line": 127, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/parcel_lookup.py", + "sha256": "3629424d9af4d5ac514f285835f9b8179c1cf6ceb22d586576603a270edb5671", + "routes": [], + "models": [ + { + "name": "ParcelLookupResult", + "bases": [], + "fields": [ + { + "name": "parcel_number", + "type": "str", + "default": "" + }, + { + "name": "address", + "type": "str", + "default": "" + }, + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "zone_name", + "type": "str", + "default": "" + }, + { + "name": "overlays", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "constraints", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "source", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "" + } + ], + "line": 12, + "doc": "" + }, + { + "name": "ParcelLookupError", + "bases": [], + "fields": [ + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 24, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/public_ui.py", + "sha256": "75d1542af38b920b5a4527da79af374ade3abf03d7a78f5d9ad2b075790681a5", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/qa.py", + "sha256": "374b232775a482a3a02ce283d047652e0c188f7f856e0046e465d663ef863315", + "routes": [], + "models": [ + { + "name": "ZoneAnswer", + "bases": [], + "fields": [ + { + "name": "answer", + "type": "str", + "default": "" + }, + { + "name": "citations", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "confidence", + "type": "str", + "default": "" + }, + { + "name": "next_step", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 16, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/question_ledger.py", + "sha256": "0fca91aa0a7338771f760fe9032da442023c3407584d0ee0c621ce0290a65e7b", + "routes": [], + "models": [ + { + "name": "ZoneQuestionLedgerRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "question_text", + "type": "str", + "default": "" + }, + { + "name": "audience", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "answer_text", + "type": "str | None", + "default": "" + }, + { + "name": "citation_payload", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "" + }, + { + "name": "escalation_reason", + "type": "str | None", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + } + ], + "line": 32, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/rule_lookup.py", + "sha256": "5c53135c7a413e0eecf663061593945c56330eae6a96808d61d69bd4e6d996a2", + "routes": [], + "models": [ + { + "name": "UseRuleResult", + "bases": [], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "use", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "review_path", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 14, + "doc": "" + }, + { + "name": "DimensionalRuleResult", + "bases": [], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "rule_type", + "type": "str", + "default": "" + }, + { + "name": "value", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 24, + "doc": "" + }, + { + "name": "RuleLookupError", + "bases": [], + "fields": [ + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + } + ], + "line": 33, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/staff_context.py", + "sha256": "50784c2b595741098e2de9d9ad90a7957607ae09839afe6167af13e38037c91c", + "routes": [], + "models": [ + { + "name": "EscalationResult", + "bases": [], + "fields": [ + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "next_step", + "type": "str", + "default": "" + } + ], + "line": 9, + "doc": "" + }, + { + "name": "StaffPrecedent", + "bases": [], + "fields": [ + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "'staff_only'" + } + ], + "line": 16, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/staff_ui.py", + "sha256": "69448abc334931b5f19168fdffbef81497e250dd61f1912811d4ebdb28ee0b25", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_zoning/staff_workflows.py", + "sha256": "27cf6da89c7a1472b23cbcace93adb63a0384be443b95228c882eb3bfb0ed642", + "routes": [], + "models": [ + { + "name": "CodeCrossReference", + "bases": [], + "fields": [ + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "source", + "type": "str", + "default": "" + }, + { + "name": "relevance", + "type": "str", + "default": "" + } + ], + "line": 80, + "doc": "" + }, + { + "name": "StaffQuestionRecord", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "question_text", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "answer_text", + "type": "str", + "default": "" + }, + { + "name": "citations", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "code_cross_references", + "type": "tuple[CodeCrossReference, ...]", + "default": "" + }, + { + "name": "created_by", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "STAFF_VISIBILITY" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 87, + "doc": "" + }, + { + "name": "AmbiguityReviewItem", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "question_text", + "type": "str", + "default": "" + }, + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "" + }, + { + "name": "resolution", + "type": "str | None", + "default": "" + }, + { + "name": "source_question_id", + "type": "str | None", + "default": "" + }, + { + "name": "created_by", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "STAFF_VISIBILITY" + } + ], + "line": 102, + "doc": "" + }, + { + "name": "HighVolumeQuestion", + "bases": [], + "fields": [ + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "question_text", + "type": "str", + "default": "" + }, + { + "name": "count", + "type": "int", + "default": "" + }, + { + "name": "statuses", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "latest_question_id", + "type": "str", + "default": "" + } + ], + "line": 118, + "doc": "" + }, + { + "name": "StaffQuestionAnalytics", + "bases": [], + "fields": [ + { + "name": "total_questions", + "type": "int", + "default": "" + }, + { + "name": "by_status", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "high_volume_questions", + "type": "tuple[HighVolumeQuestion, ...]", + "default": "" + }, + { + "name": "generated_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "STAFF_VISIBILITY" + } + ], + "line": 127, + "doc": "" + }, + { + "name": "StaffReportOutline", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "sections", + "type": "tuple[dict[str, object], ...]", + "default": "" + }, + { + "name": "source_question_ids", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "source_queue_item_ids", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "created_by", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "STAFF_VISIBILITY" + }, + { + "name": "disclaimer", + "type": "str", + "default": "'Draft staff outline only; verify citations before publication.'" + } + ], + "line": 136, + "doc": "" + }, + { + "name": "FlaggedAnswerReview", + "bases": [], + "fields": [ + { + "name": "id", + "type": "str", + "default": "" + }, + { + "name": "zone_code", + "type": "str", + "default": "" + }, + { + "name": "question_text", + "type": "str", + "default": "" + }, + { + "name": "original_answer", + "type": "str", + "default": "" + }, + { + "name": "flag_reason", + "type": "str", + "default": "" + }, + { + "name": "citations", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "improved_answer", + "type": "str | None", + "default": "" + }, + { + "name": "improvement_notes", + "type": "str | None", + "default": "" + }, + { + "name": "reviewed_by", + "type": "str | None", + "default": "" + }, + { + "name": "created_by", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "STAFF_VISIBILITY" + } + ], + "line": 149, + "doc": "" + } + ], + "configuration": [] + } + ], + "bridge": [ + { + "source": "installed-owned-source/townlight_runtime/zoning_bridge.py", + "sha256": "eb80d79ffc4fc736789aab4f3d3b75a4d9d01101d6414a69a29053c7d5f90505", + "routes": [ + { + "method": "POST", + "path": "/desktop/v1/zoning/imports", + "router": "router", + "prefix_resolved": true, + "name": "imports", + "signature": "payload: dict, actor_id: str=Depends(actor)", + "returns": "", + "line": 68, + "doc": "", + "decorator": "router.post('/imports')", + "errors": [ + "HTTPException(422, detail)", + "HTTPException(503, 'Zoning persistence unavailable.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/parcels/lookup", + "router": "router", + "prefix_resolved": true, + "name": "parcel_lookup", + "signature": "body: _ParcelLookupIn, _actor: str=Depends(actor)", + "returns": "", + "line": 91, + "doc": "", + "decorator": "router.post('/parcels/lookup')", + "errors": [ + "HTTPException(503, 'Townlight Code database/schema is not ready; no determination.')", + "HTTPException(503, 'Zoning persistence unavailable.')" + ] + }, + { + "method": "GET", + "path": "/desktop/v1/zoning/questions/{question_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "question_history", + "signature": "question_id: UUID, actor_id=Depends(actor), provider=Depends(meeting_provider)", + "returns": "", + "line": 209, + "doc": "", + "decorator": "router.get('/questions/{question_id}/history')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/meetings/search", + "router": "router", + "prefix_resolved": true, + "name": "search_meetings", + "signature": "p: MeetingSearch, actor_id=Depends(actor), provider=Depends(meeting_provider)", + "returns": "", + "line": 216, + "doc": "", + "decorator": "router.post('/meetings/search')", + "errors": [ + "HTTPException(status_code=503, detail='Meeting search unavailable')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/questions/{question_id}/meetings", + "router": "router", + "prefix_resolved": true, + "name": "link_meeting", + "signature": "question_id: UUID, p: MeetingLink, actor_id=Depends(actor), provider=Depends(meeting_provider)", + "returns": "", + "line": 242, + "doc": "", + "decorator": "router.post('/questions/{question_id}/meetings')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/questions/{question_id}/snapshots", + "router": "router", + "prefix_resolved": true, + "name": "create_snapshot", + "signature": "question_id: UUID, p: SourceSnapshot, actor_id=Depends(actor), provider=Depends(meeting_provider)", + "returns": "", + "line": 259, + "doc": "", + "decorator": "router.post('/questions/{question_id}/snapshots')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/rules", + "router": "router", + "prefix_resolved": true, + "name": "create_rule", + "signature": "p: Rule, actor_id=Depends(actor)", + "returns": "", + "line": 291, + "doc": "", + "decorator": "router.post('/rules')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/questions", + "router": "router", + "prefix_resolved": true, + "name": "create_question", + "signature": "p: Question, actor_id=Depends(actor)", + "returns": "", + "line": 300, + "doc": "", + "decorator": "router.post('/questions')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/zoning/workspace", + "router": "router", + "prefix_resolved": true, + "name": "get_workspace", + "signature": "actor_id=Depends(actor)", + "returns": "", + "line": 313, + "doc": "", + "decorator": "router.get('/workspace')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/questions/{question_id}/reviews", + "router": "router", + "prefix_resolved": true, + "name": "create_review", + "signature": "question_id: UUID, p: Review, actor_id=Depends(actor)", + "returns": "", + "line": 318, + "doc": "", + "decorator": "router.post('/questions/{question_id}/reviews')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/outlines", + "router": "router", + "prefix_resolved": true, + "name": "create_outline", + "signature": "p: Outline, actor_id=Depends(actor)", + "returns": "", + "line": 325, + "doc": "", + "decorator": "router.post('/outlines')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/code-context", + "router": "router", + "prefix_resolved": true, + "name": "create_code_context", + "signature": "p: CodeContext, actor_id=Depends(actor)", + "returns": "", + "line": 332, + "doc": "", + "decorator": "router.post('/code-context')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/zoning/standards/process-explanation", + "router": "router", + "prefix_resolved": true, + "name": "standards_explanation", + "signature": "p: StandardsExplanation, actor_id=Depends(actor)", + "returns": "", + "line": 373, + "doc": "Cited variance/CUP/nonconformity process; never a determination.", + "decorator": "router.post('/standards/process-explanation')", + "errors": [ + "HTTPException(422, f\"Unknown rule type '{rule_type}'.\")" + ] + }, + { + "method": "POST", + "path": "/townlight_zoning/questions", + "router": "public_router", + "prefix_resolved": true, + "name": "public_question", + "signature": "p: Question", + "returns": "", + "line": 423, + "doc": "", + "decorator": "public_router.post('/questions', dependencies=[Depends(public_active)])", + "errors": [] + }, + { + "method": "POST", + "path": "/townlight_zoning/parcels/lookup", + "router": "public_router", + "prefix_resolved": true, + "name": "public_parcel_lookup", + "signature": "p: _ParcelLookupIn", + "returns": "", + "line": 434, + "doc": "", + "decorator": "public_router.post('/parcels/lookup', dependencies=[Depends(public_active)])", + "errors": [] + } + ], + "models": [ + { + "name": "_ParcelLookupIn", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "jurisdiction", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 60, + "doc": "" + }, + { + "name": "Question", + "bases": [ + "Strict" + ], + "fields": [ + { + "name": "jurisdiction", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "question", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "kind", + "type": "Literal['use', 'dimension']", + "default": "" + }, + { + "name": "key", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "audience", + "type": "Literal['resident', 'staff']", + "default": "'resident'" + } + ], + "line": 150, + "doc": "" + }, + { + "name": "Rule", + "bases": [ + "Strict" + ], + "fields": [ + { + "name": "jurisdiction", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "zone_code", + "type": "str", + "default": "Field(..., min_length=1, max_length=80)" + }, + { + "name": "key", + "type": "str", + "default": "Field(..., min_length=1, max_length=120)" + }, + { + "name": "section_number", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "kind", + "type": "Literal['use', 'dimension']", + "default": "" + }, + { + "name": "value", + "type": "str", + "default": "Field(..., min_length=1, max_length=255)" + }, + { + "name": "overlay_code", + "type": "str | None", + "default": "Field(default=None, max_length=255)" + } + ], + "line": 159, + "doc": "" + }, + { + "name": "Review", + "bases": [ + "Strict" + ], + "fields": [ + { + "name": "answer", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "notes", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "queue_status", + "type": "Literal['open', 'in_review', 'resolved', 'closed']", + "default": "'resolved'" + } + ], + "line": 169, + "doc": "" + }, + { + "name": "Outline", + "bases": [ + "Strict" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "question_ids", + "type": "list[UUID]", + "default": "Field(min_length=1, max_length=50)" + } + ], + "line": 175, + "doc": "" + }, + { + "name": "CodeContext", + "bases": [ + "Strict" + ], + "fields": [ + { + "name": "section_number", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "as_of", + "type": "date | None", + "default": "None" + } + ], + "line": 180, + "doc": "" + }, + { + "name": "MeetingSearch", + "bases": [ + "Strict" + ], + "fields": [ + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 185, + "doc": "" + }, + { + "name": "MeetingLink", + "bases": [ + "Strict" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=200)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + }, + { + "name": "relation", + "type": "Literal['hearing', 'context', 'precedent']", + "default": "" + } + ], + "line": 189, + "doc": "" + }, + { + "name": "SourceSnapshot", + "bases": [ + "Strict" + ], + "fields": [ + { + "name": "visibility", + "type": "Literal['public', 'staff_only']", + "default": "" + }, + { + "name": "meeting_event_ids", + "type": "list[UUID]", + "default": "Field(default_factory=list, max_length=50)" + } + ], + "line": 195, + "doc": "" + }, + { + "name": "StandardsExplanation", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "question", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "process_section", + "type": "str", + "default": "Field(default='', max_length=255)" + }, + { + "name": "zone_code", + "type": "str", + "default": "Field(default='', max_length=40)" + }, + { + "name": "rule_types", + "type": "list[str]", + "default": "Field(default_factory=list, max_length=10)" + }, + { + "name": "observed", + "type": "dict[str, str]", + "default": "Field(default_factory=dict)" + } + ], + "line": 342, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_ZONING_PARCEL_RULE_DB_URL", + "default": "", + "line": 359 + } + ] + } + ] + }, + "planning": { + "package": "townlight_planning", + "source": [ + { + "source": "installed-owned-source/townlight_planning/__init__.py", + "sha256": "d6a014eba48a6bdcdaea2a444cfcaa743cd2ba33cec6d63ea5e450266ad71c82", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/connections.py", + "sha256": "649c8474e787fca1e30a11f153d2f776283204b5dc8053b7e88fbc325cdcf944", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/consistency.py", + "sha256": "d18ef439391d859f0d1a020356edaf91d2441333eacf36036d03d1b7ea467210", + "routes": [], + "models": [ + { + "name": "ConsistencyCheck", + "bases": [], + "fields": [ + { + "name": "policy_id", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "factors", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "staff_next_step", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 11, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/integration_mocks.py", + "sha256": "09c350c13fe4e14c3f385549021f57c09341c8dbe110b18e6e4739cf70ac6254", + "routes": [], + "models": [ + { + "name": "IntegrationError", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "message", + "type": "str", + "default": "" + }, + { + "name": "fix", + "type": "str", + "default": "" + }, + { + "name": "code", + "type": "str", + "default": "" + } + ], + "line": 18, + "doc": "" + }, + { + "name": "IntegrationResult", + "bases": [], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "" + }, + { + "name": "records", + "type": "tuple[dict[str, Any], ...]", + "default": "" + }, + { + "name": "source", + "type": "str", + "default": "" + }, + { + "name": "warnings", + "type": "tuple[str, ...]", + "default": "()" + } + ], + "line": 26, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/main.py", + "sha256": "34aaae27da4bc8f34570849cc446a134efb78c004294425ac62ef2c80abb1adf", + "routes": [ + { + "method": "GET", + "path": "/", + "router": "app", + "prefix_resolved": true, + "name": "root", + "signature": "", + "returns": "dict[str, str]", + "line": 129, + "doc": "Return current product state without overstating unshipped behavior.", + "decorator": "app.get('/')", + "errors": [] + }, + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "health", + "signature": "", + "returns": "dict[str, str]", + "line": 147, + "doc": "Return dependency/version health for deployment smoke checks.", + "decorator": "app.get('/health')", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_planning", + "router": "app", + "prefix_resolved": true, + "name": "public_townlight_planning_page", + "signature": "q: str='', goal: str='', topic: str='', plan_type: str='', clear: str='', neighborhood: str=''", + "returns": "str", + "line": 193, + "doc": "Explore the adopted plan sources this deployment actually holds.\n\nPublic readers get only adopted, effective, public municipal revisions. When\nno plan database is configured the page says so instead of showing sample text.", + "decorator": "app.get('/townlight_planning', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/public/plan-explore", + "router": "app", + "prefix_resolved": true, + "name": "public_plan_explore", + "signature": "q: str='', goal: str='', topic: str='', plan_type: str='', neighborhood: str=''", + "returns": "dict[str, object]", + "line": 220, + "doc": "The same persisted-source exploration as the page, as JSON.", + "decorator": "app.get('/api/v1/townlight_planning/public/plan-explore')", + "errors": [ + "HTTPException(503, 'No plan source database is configured for this deployment.')" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/public/policy/{revision_id}/{policy_id}", + "router": "app", + "prefix_resolved": true, + "name": "public_policy_citation", + "signature": "revision_id: str, policy_id: str", + "returns": "dict[str, object]", + "line": 237, + "doc": "One cited policy for a public reader, or a refusal.\n\nA staff-only, pending, superseded or non-effective revision is refused here by\nthe service; naming its id does not reach it.", + "decorator": "app.get('/api/v1/townlight_planning/public/policy/{revision_id}/{policy_id}')", + "errors": [ + "HTTPException(503, 'No plan source database is configured for this deployment.')", + "HTTPException(404, str(exc))" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/policies/lookup", + "router": "app", + "prefix_resolved": true, + "name": "policy_lookup", + "signature": "request: PolicyLookupRequest, is_staff=Depends(audience)", + "returns": "dict[str, object]", + "line": 256, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/policies/lookup')", + "errors": [ + "HTTPException(404, 'No supported adopted policy found; inspect imported sources.')" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/policies/ingest", + "router": "app", + "prefix_resolved": true, + "name": "ingest_policy", + "signature": "request: PolicyIngestRequest, x_townlight_planning_role: Annotated[str | None, Header()]=None, x_townlight_planning_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 270, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/policies/ingest')", + "errors": [ + "HTTPException(409, detail={'message': 'Metadata-only ingestion cannot establish plan provenance.', 'fix': 'Use POST /api/v1/townlight_planning/source-imports with a staff-verified source bundle.'})" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/plans/navigator", + "router": "app", + "prefix_resolved": true, + "name": "plans_navigator", + "signature": "plan_type: str | None=None, is_staff=Depends(audience)", + "returns": "dict[str, object]", + "line": 283, + "doc": "", + "decorator": "app.get('/api/v1/townlight_planning/plans/navigator')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/questions/answer", + "router": "app", + "prefix_resolved": true, + "name": "plan_question_answer", + "signature": "request: PlanQuestionRequest, is_staff=Depends(audience)", + "returns": "dict[str, object]", + "line": 292, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/questions/answer')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/plans/synthesis", + "router": "app", + "prefix_resolved": true, + "name": "plan_synthesis", + "signature": "request: PlanSynthesisRequest, is_staff=Depends(audience)", + "returns": "dict[str, object]", + "line": 306, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/plans/synthesis')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/context/townlight_meetings", + "router": "app", + "prefix_resolved": true, + "name": "townlight_meetings_context", + "signature": "request: TownlightMeetingsContextRequest, is_staff=Depends(audience)", + "returns": "dict[str, object]", + "line": 314, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/context/townlight_meetings')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/integrations/mock", + "router": "app", + "prefix_resolved": true, + "name": "integration_mock", + "signature": "request: IntegrationMockRequest", + "returns": "dict[str, object]", + "line": 328, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/integrations/mock')", + "errors": [ + "HTTPException(status_code=422, detail={'message': result.message, 'fix': result.fix, 'code': result.code, 'provider': result.provider})" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/context/zoning", + "router": "app", + "prefix_resolved": true, + "name": "zoning_policy_context", + "signature": "request: ZoningPolicyContextRequest, is_staff=Depends(audience)", + "returns": "dict[str, object]", + "line": 349, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/context/zoning')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/consistency/check", + "router": "app", + "prefix_resolved": true, + "name": "consistency_check", + "signature": "request: ConsistencyRequest, is_staff=Depends(audience)", + "returns": "dict[str, object]", + "line": 378, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/consistency/check')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/staff-analysis/draft", + "router": "app", + "prefix_resolved": true, + "name": "staff_analysis", + "signature": "request: StaffAnalysisRequest, x_townlight_planning_role: Annotated[str | None, Header()]=None, x_townlight_planning_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 392, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/staff-analysis/draft')", + "errors": [ + "HTTPException(404, 'No supported adopted policy found.')" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/staff-analysis/{analysis_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_staff_analysis", + "signature": "analysis_id: str, native_request: Request, x_townlight_planning_role: Annotated[str | None, Header()]=None, x_townlight_planning_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 419, + "doc": "", + "decorator": "app.get('/api/v1/townlight_planning/staff-analysis/{analysis_id}')", + "errors": [ + "HTTPException(status_code=503, detail={'message': 'Townlight Planning policy persistence is not configured.', 'fix': 'Set TOWNLIGHT_PLANNING_POLICY_DB_URL to retrieve persisted staff-analysis records.'})", + "HTTPException(status_code=404, detail={'message': 'Staff-analysis record not found.', 'fix': 'Use an analysis_id returned by POST /api/v1/townlight_planning/staff-analysis/draft.'})" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/export", + "router": "app", + "prefix_resolved": true, + "name": "policy_export", + "signature": "request: PolicyExportRequest, native_request: Request, is_staff=Depends(audience)", + "returns": "dict[str, object]", + "line": 451, + "doc": "", + "decorator": "app.post('/api/v1/townlight_planning/export')", + "errors": [ + "HTTPException(403, 'Staff authentication is required to export analysis snapshots.')", + "HTTPException(422, 'Select a reviewed immutable snapshot; a policy ID alone is not an export.')", + "HTTPException(404, 'Snapshot not found.')" + ] + } + ], + "models": [ + { + "name": "PolicyLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "topic", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "plan_type", + "type": "str", + "default": "Field(default='comprehensive', min_length=1, max_length=120)" + } + ], + "line": 64, + "doc": "" + }, + { + "name": "ZoningPolicyContextRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "topic", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "zone_code", + "type": "str | None", + "default": "Field(default=None, max_length=80)" + }, + { + "name": "use", + "type": "str | None", + "default": "Field(default=None, max_length=160)" + }, + { + "name": "parcel_number", + "type": "str | None", + "default": "Field(default=None, max_length=120)" + }, + { + "name": "address", + "type": "str | None", + "default": "Field(default=None, max_length=500)" + }, + { + "name": "plan_type", + "type": "str", + "default": "Field(default='comprehensive', min_length=1, max_length=120)" + }, + { + "name": "townlight_zoning_context_id", + "type": "str | None", + "default": "Field(default=None, max_length=160)" + } + ], + "line": 69, + "doc": "" + }, + { + "name": "ConsistencyRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "proposal", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + }, + { + "name": "policy_id", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + } + ], + "line": 79, + "doc": "" + }, + { + "name": "StaffAnalysisRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "project_name", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "proposal", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + }, + { + "name": "policy_id", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + } + ], + "line": 84, + "doc": "" + }, + { + "name": "PolicyExportRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "policy_id", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + }, + { + "name": "format", + "type": "str", + "default": "Field(default='markdown', min_length=1, max_length=40)" + }, + { + "name": "snapshot_id", + "type": "str | None", + "default": "Field(default=None, min_length=36, max_length=36)" + } + ], + "line": 90, + "doc": "" + }, + { + "name": "PolicyIngestRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "topic_key", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + }, + { + "name": "policy_id", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + }, + { + "name": "plan_type", + "type": "str", + "default": "Field(min_length=1, max_length=120)" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "citation", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "excerpt", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + }, + { + "name": "relevance", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "adoption_status", + "type": "str", + "default": "Field(default='adopted', min_length=1, max_length=80)" + }, + { + "name": "source_document", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 97, + "doc": "" + }, + { + "name": "PlanQuestionRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "question", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "plan_type", + "type": "str", + "default": "Field(default='comprehensive', min_length=1, max_length=120)" + } + ], + "line": 109, + "doc": "" + }, + { + "name": "PlanSynthesisRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "topic", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 114, + "doc": "" + }, + { + "name": "TownlightMeetingsContextRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "agenda_item", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "topic", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 118, + "doc": "" + }, + { + "name": "IntegrationMockRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "provider", + "type": "str", + "default": "Field(min_length=1, max_length=120)" + }, + { + "name": "payload", + "type": "dict[str, object]", + "default": "Field(default_factory=dict)" + } + ], + "line": 123, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_PLANNING_POLICY_DB_URL", + "default": "", + "line": 469 + }, + { + "variable": "TOWNLIGHT_PLANNING_DEMO_MODE", + "default": "", + "line": 496 + } + ] + }, + { + "source": "installed-owned-source/townlight_planning/migrations/__init__.py", + "sha256": "daf5e64cefda400a5db1023d952e41bef6f7954db19406d63ea84770c82dccd9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/migrations/__main__.py", + "sha256": "321e543984ca92e2540d1f4d9eca54658dc608987b95bc5abc61b651b4305fd6", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "TOWNLIGHT_PLANNING_POLICY_DB_URL", + "default": "", + "line": 7 + } + ] + }, + { + "source": "installed-owned-source/townlight_planning/migrations/env.py", + "sha256": "832a41b6c40d14da47178b486650eba98bff574a66652e3b614cc782db04f8df", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/migrations/versions/townlight_planning_0001_sources.py", + "sha256": "807e5a18d1fa295d482f3963f7799f244f046ab98297bfc33cbd17131fb44d17", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/migrations/versions/townlight_planning_0002_workflows.py", + "sha256": "7c6fcdfe4a1fa33c9289cef975a25f4b0f6746471c380226c14520f8a5f09dbf", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/migrations/versions/townlight_planning_0003_municipal.py", + "sha256": "64735db3119b22b54a232e0a4486657a91b5304e4a253b14ce7cae1acb204681", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/migrations/versions/townlight_planning_0004_neighborhoods.py", + "sha256": "006f8f8f9859da76189efee9035d1f89c65e0b27172b5df9e316e1aa173434f8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/municipal.py", + "sha256": "dbd5bd841f3f90d2ab7256eafb30ed8b7ba6036bd3921e23595d7df6715b8555", + "routes": [], + "models": [ + { + "name": "Measurement", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "recorded_on", + "type": "date", + "default": "" + }, + { + "name": "value", + "type": "Decimal", + "default": "Field(allow_inf_nan=False)" + }, + { + "name": "evidence", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + } + ], + "line": 41, + "doc": "" + }, + { + "name": "Milestone", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "due_on", + "type": "date", + "default": "" + }, + { + "name": "completed_on", + "type": "date | None", + "default": "None" + }, + { + "name": "evidence", + "type": "str", + "default": "Field(default='', max_length=2000)" + } + ], + "line": 53, + "doc": "" + }, + { + "name": "InitiativeInput", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "expected_revision", + "type": "str | None", + "default": "Field(default=None, min_length=36, max_length=36)" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "policy", + "type": "PolicySelection", + "default": "" + }, + { + "name": "responsible_staff", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "target", + "type": "Decimal", + "default": "Field(allow_inf_nan=False)" + }, + { + "name": "unit", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "due_on", + "type": "date", + "default": "" + }, + { + "name": "status", + "type": "Literal['planned', 'active', 'completed', 'cancelled']", + "default": "'planned'" + }, + { + "name": "milestones", + "type": "list[Milestone]", + "default": "Field(default_factory=list, max_length=100)" + }, + { + "name": "measurements", + "type": "list[Measurement]", + "default": "Field(default_factory=list, max_length=1000)" + }, + { + "name": "note", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + } + ], + "line": 66, + "doc": "" + }, + { + "name": "AmendmentInput", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "expected_revision", + "type": "str | None", + "default": "Field(default=None, min_length=36, max_length=36)" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "policy", + "type": "PolicySelection", + "default": "" + }, + { + "name": "proposal", + "type": "str", + "default": "Field(min_length=1, max_length=20000)" + }, + { + "name": "responsible_staff", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "status", + "type": "Literal['draft', 'review', 'adopted', 'withdrawn']", + "default": "'draft'" + }, + { + "name": "review_note", + "type": "str", + "default": "Field(default='', max_length=5000)" + }, + { + "name": "adoption_revision", + "type": "str | None", + "default": "Field(default=None, min_length=36, max_length=36)" + }, + { + "name": "note", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + } + ], + "line": 90, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/municipal_api.py", + "sha256": "b71876bd1b6f354f7a9ad8d06f19d8ae7c071a0315f19421d3ff4df07bb8dc1f", + "routes": [ + { + "method": "POST", + "path": "/api/v1/townlight_planning/initiatives", + "router": "router", + "prefix_resolved": true, + "name": "create_initiative", + "signature": "data: InitiativeInput, actor=Depends(staff), repo=Depends(municipal)", + "returns": "", + "line": 17, + "doc": "", + "decorator": "router.post('/initiatives', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/initiatives/{item_id}/revisions", + "router": "router", + "prefix_resolved": true, + "name": "update_initiative", + "signature": "item_id: str, data: InitiativeInput, actor=Depends(staff), repo=Depends(municipal)", + "returns": "", + "line": 22, + "doc": "", + "decorator": "router.post('/initiatives/{item_id}/revisions')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/amendments", + "router": "router", + "prefix_resolved": true, + "name": "create_amendment", + "signature": "data: AmendmentInput, actor=Depends(staff), repo=Depends(municipal)", + "returns": "", + "line": 29, + "doc": "", + "decorator": "router.post('/amendments', status_code=201)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/amendments/{item_id}/revisions", + "router": "router", + "prefix_resolved": true, + "name": "update_amendment", + "signature": "item_id: str, data: AmendmentInput, actor=Depends(staff), repo=Depends(municipal)", + "returns": "", + "line": 34, + "doc": "", + "decorator": "router.post('/amendments/{item_id}/revisions')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/municipal-work/{item_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "history", + "signature": "item_id: str, actor=Depends(staff), repo=Depends(municipal)", + "returns": "", + "line": 41, + "doc": "", + "decorator": "router.get('/municipal-work/{item_id}/history')", + "errors": [ + "HTTPException(404, 'Municipal workflow not found')" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/progress/targets", + "router": "router", + "prefix_resolved": true, + "name": "progress", + "signature": "policy_id: str | None=None, offset: int=Query(0, ge=0, le=100000), limit: int=Query(50, ge=1, le=100), actor=Depends(staff), repo=Depends(municipal)", + "returns": "", + "line": 49, + "doc": "", + "decorator": "router.get('/progress/targets')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/amendments/history", + "router": "router", + "prefix_resolved": true, + "name": "amendments", + "signature": "plan_type: str | None=None, offset: int=Query(0, ge=0, le=100000), limit: int=Query(50, ge=1, le=100), actor=Depends(staff), repo=Depends(municipal)", + "returns": "", + "line": 60, + "doc": "", + "decorator": "router.get('/amendments/history')", + "errors": [] + } + ], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/persistence.py", + "sha256": "30d920165ab9b4f9675a0d61dd887587823b6c075ef160e3a56670db95d2cc7e", + "routes": [], + "models": [ + { + "name": "StoredStaffAnalysis", + "bases": [], + "fields": [ + { + "name": "analysis_id", + "type": "str", + "default": "" + }, + { + "name": "project_name", + "type": "str", + "default": "" + }, + { + "name": "proposal", + "type": "str", + "default": "" + }, + { + "name": "policy_id", + "type": "str", + "default": "" + }, + { + "name": "heading", + "type": "str", + "default": "" + }, + { + "name": "bullets", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "citations", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "review_required", + "type": "bool", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 51, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/plan_workflows.py", + "sha256": "e69084e3608fa33bbc6ab140d4570efa3850cb04317000b407c5a5f5ca635115", + "routes": [], + "models": [ + { + "name": "PlanPolicyIngestRecord", + "bases": [], + "fields": [ + { + "name": "topic_key", + "type": "str", + "default": "" + }, + { + "name": "policy", + "type": "PlanPolicy", + "default": "" + }, + { + "name": "adoption_status", + "type": "PlanStatus", + "default": "" + }, + { + "name": "source_document", + "type": "str", + "default": "" + } + ], + "line": 14, + "doc": "" + }, + { + "name": "PlanQuestionAnswer", + "bases": [], + "fields": [ + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "answer", + "type": "str", + "default": "" + }, + { + "name": "citations", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "source_policy_ids", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "review_required", + "type": "bool", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 22, + "doc": "" + }, + { + "name": "PlanAmendment", + "bases": [], + "fields": [ + { + "name": "amendment_id", + "type": "str", + "default": "" + }, + { + "name": "plan_type", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "adoption_status", + "type": "PlanStatus", + "default": "" + }, + { + "name": "adopted_date", + "type": "str | None", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + } + ], + "line": 32, + "doc": "" + }, + { + "name": "ProgressTarget", + "bases": [], + "fields": [ + { + "name": "target_id", + "type": "str", + "default": "" + }, + { + "name": "policy_id", + "type": "str", + "default": "" + }, + { + "name": "metric", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "evidence", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + } + ], + "line": 43, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/policy_lookup.py", + "sha256": "eef53ba621332d75f069f00ddcac34c19bca42d469a697fd22555eb3d11c68b2", + "routes": [], + "models": [ + { + "name": "PlanPolicy", + "bases": [], + "fields": [ + { + "name": "policy_id", + "type": "str", + "default": "" + }, + { + "name": "plan_type", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "excerpt", + "type": "str", + "default": "" + }, + { + "name": "relevance", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 16, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/policy_service.py", + "sha256": "c5e5461fadea4b32cba43366e1c9795ecb4cd8212db30734f5eadd24a9144808", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/public_explore.py", + "sha256": "c5cbb2de92661538857e52b25f2e0bc4e7cd4f5c9d91eb0fa7d0518b28374720", + "routes": [], + "models": [ + { + "name": "Exploration", + "bases": [], + "fields": [ + { + "name": "query", + "type": "str", + "default": "''" + }, + { + "name": "plan_type", + "type": "str", + "default": "''" + }, + { + "name": "goal", + "type": "str", + "default": "''" + }, + { + "name": "topic", + "type": "str", + "default": "''" + }, + { + "name": "neighborhood", + "type": "str", + "default": "''" + }, + { + "name": "plans", + "type": "list", + "default": "field(default_factory=list)" + }, + { + "name": "total", + "type": "int", + "default": "0" + }, + { + "name": "review_required", + "type": "bool", + "default": "True" + }, + { + "name": "disclaimer", + "type": "str", + "default": "''" + }, + { + "name": "empty_reason", + "type": "str | None", + "default": "None" + }, + { + "name": "facets", + "type": "dict", + "default": "field(default_factory=dict)" + } + ], + "line": 34, + "doc": "One exploration request and what the persisted sources support for it." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/public_explore_ui.py", + "sha256": "bd137701e16391a4ee820c4c88b5db583944491d5fc487ff7580b1083e944e5d", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/public_ui.py", + "sha256": "8551ce36f854a4a7fc4573a20b73dbb0b6f01d7b60b7267d8c73b5f21f246ccc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/records_export.py", + "sha256": "6894fb9450f5d0177ebf86babcd489be1a789a714ce2c3c825c7afd5ed51bb23", + "routes": [], + "models": [ + { + "name": "PolicyExport", + "bases": [], + "fields": [ + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "policy_id", + "type": "str", + "default": "" + }, + { + "name": "format", + "type": "str", + "default": "" + }, + { + "name": "checklist", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "retention_note", + "type": "str", + "default": "" + } + ], + "line": 11, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/source_api.py", + "sha256": "4af39debaf4f9cbb219c294ddfeaea642495d45e492e62852049372e296f1df4", + "routes": [ + { + "method": "POST", + "path": "/api/v1/townlight_planning/source-imports", + "router": "router", + "prefix_resolved": true, + "name": "import_sources", + "signature": "request: ImportRequest, actor: str=Depends(staff), repo=Depends(repository)", + "returns": "", + "line": 51, + "doc": "", + "decorator": "router.post('/source-imports')", + "errors": [ + "HTTPException(409, str(exc))" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/source-plans/{plan_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "source_history", + "signature": "plan_id: str, _actor=Depends(staff), repo=Depends(repository)", + "returns": "", + "line": 63, + "doc": "", + "decorator": "router.get('/source-plans/{plan_id}/history')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/source-revisions/{revision_id}", + "router": "router", + "prefix_resolved": true, + "name": "source_revision", + "signature": "revision_id: str, _actor=Depends(staff), repo=Depends(repository)", + "returns": "", + "line": 68, + "doc": "", + "decorator": "router.get('/source-revisions/{revision_id}')", + "errors": [ + "HTTPException(404, 'Planning source revision not found.')" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/source-revisions/{revision_id}/documents/{document_id}", + "router": "router", + "prefix_resolved": true, + "name": "source_document", + "signature": "revision_id: str, document_id: str, _actor=Depends(staff), repo=Depends(repository)", + "returns": "", + "line": 76, + "doc": "", + "decorator": "router.get('/source-revisions/{revision_id}/documents/{document_id}')", + "errors": [ + "HTTPException(404, 'Planning source document not found.')" + ] + } + ], + "models": [ + { + "name": "ImportRequest", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "bundle", + "type": "PlanBundle", + "default": "" + }, + { + "name": "expected_previous_revision", + "type": "str | None", + "default": "Field(default=None, min_length=36, max_length=36)" + } + ], + "line": 45, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_PLANNING_POLICY_DB_URL", + "default": "", + "line": 31 + } + ] + }, + { + "source": "installed-owned-source/townlight_planning/source_bundle.py", + "sha256": "f6547516067e27697dfcd6ba80de6e2ca03d1473370209aa354a5bf95b7db98a", + "routes": [], + "models": [ + { + "name": "SourceDocument", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "document_id", + "type": "str", + "default": "Field(min_length=1, max_length=160, pattern='^[A-Za-z0-9][A-Za-z0-9._:-]*$')" + }, + { + "name": "filename", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "media_type", + "type": "Literal['text/plain', 'text/markdown', 'application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document']", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + }, + { + "name": "content_base64", + "type": "str", + "default": "Field(min_length=1, max_length=14000000)" + } + ], + "line": 18, + "doc": "" + }, + { + "name": "SourcePolicy", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "policy_id", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + }, + { + "name": "document_id", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + }, + { + "name": "goal", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "objective", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "topic_key", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + }, + { + "name": "neighborhoods", + "type": "list[str]", + "default": "Field(default_factory=list, max_length=100)" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "citation", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "anchor", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "excerpt", + "type": "str", + "default": "Field(min_length=1, max_length=20000)" + }, + { + "name": "relevance", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "staff_verified", + "type": "Literal[True]", + "default": "" + } + ], + "line": 62, + "doc": "" + }, + { + "name": "AdoptionEvidence", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "kind", + "type": "Literal['manual-record', 'meeting-reference', 'source-document']", + "default": "" + }, + { + "name": "reference", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "document_id", + "type": "str | None", + "default": "Field(default=None, min_length=1, max_length=160)" + }, + { + "name": "note", + "type": "str", + "default": "Field(min_length=1, max_length=4000)" + } + ], + "line": 77, + "doc": "" + }, + { + "name": "PlanBundle", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "schema_version", + "type": "Literal[1]", + "default": "1" + }, + { + "name": "plan_id", + "type": "str", + "default": "Field(min_length=1, max_length=160, pattern='^[A-Za-z0-9][A-Za-z0-9._:-]*$')" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "jurisdiction", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "plan_type", + "type": "PlanType", + "default": "" + }, + { + "name": "status", + "type": "Literal['pending', 'adopted', 'superseded']", + "default": "" + }, + { + "name": "visibility", + "type": "Literal['staff', 'public']", + "default": "'staff'" + }, + { + "name": "dataset_kind", + "type": "Literal['municipal', 'demo']", + "default": "'municipal'" + }, + { + "name": "source_date", + "type": "date", + "default": "" + }, + { + "name": "adopted_on", + "type": "date | None", + "default": "None" + }, + { + "name": "effective_on", + "type": "date | None", + "default": "None" + }, + { + "name": "change_note", + "type": "str", + "default": "Field(min_length=1, max_length=4000)" + }, + { + "name": "reviewer_label", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "documents", + "type": "list[SourceDocument]", + "default": "Field(min_length=1, max_length=20)" + }, + { + "name": "policies", + "type": "list[SourcePolicy]", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "adoption_evidence", + "type": "list[AdoptionEvidence]", + "default": "Field(default_factory=list, max_length=100)" + } + ], + "line": 84, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/source_schema.py", + "sha256": "1c429c22247cda2aaec5abe6807639177f035cae843993666dbf8b2824bbdbf1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/source_store.py", + "sha256": "97022c50baa5b7e81bcc12fccd6c2e429af35f163680542cbf99b65722905d82", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/staff_analysis.py", + "sha256": "71ab2f06804f1c01678f708c60a27714d7bd9b14444e1d2c8546cedb8ac1bd69", + "routes": [], + "models": [ + { + "name": "StaffAnalysisDraft", + "bases": [], + "fields": [ + { + "name": "project_name", + "type": "str", + "default": "" + }, + { + "name": "heading", + "type": "str", + "default": "" + }, + { + "name": "bullets", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "citations", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "review_required", + "type": "bool", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 12, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/workflow_api.py", + "sha256": "6a48664442a3a8bae19a8cea7676e91f53ca3360f65e912dec666504862e792b", + "routes": [ + { + "method": "POST", + "path": "/api/v1/townlight_planning/analyses", + "router": "router", + "prefix_resolved": true, + "name": "create_analysis", + "signature": "data: AnalysisInput, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 45, + "doc": "", + "decorator": "router.post('/analyses')", + "errors": [ + "HTTPException(422, 'New analyses have no previous revision.')" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/analyses/{analysis_id}/revisions", + "router": "router", + "prefix_resolved": true, + "name": "revise_analysis", + "signature": "analysis_id: str, data: AnalysisInput, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 52, + "doc": "", + "decorator": "router.post('/analyses/{analysis_id}/revisions')", + "errors": [ + "HTTPException(422, 'Supply the analysis previous revision.')" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/analyses/{analysis_id}", + "router": "router", + "prefix_resolved": true, + "name": "read_analysis", + "signature": "analysis_id: str, revision_id: str | None=None, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 59, + "doc": "", + "decorator": "router.get('/analyses/{analysis_id}')", + "errors": [ + "HTTPException(404, 'Analysis not found.')" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/analyses/{analysis_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "analysis_history", + "signature": "analysis_id: str, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 67, + "doc": "", + "decorator": "router.get('/analyses/{analysis_id}/history')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/analyses/{analysis_id}/snapshots", + "router": "router", + "prefix_resolved": true, + "name": "create_snapshot", + "signature": "analysis_id: str, data: SnapshotInput, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 77, + "doc": "", + "decorator": "router.post('/analyses/{analysis_id}/snapshots')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/snapshots/{snapshot_id}", + "router": "router", + "prefix_resolved": true, + "name": "read_snapshot", + "signature": "snapshot_id: str, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 82, + "doc": "", + "decorator": "router.get('/snapshots/{snapshot_id}')", + "errors": [ + "HTTPException(404, 'Snapshot not found.')" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/snapshots/{snapshot_id}/export", + "router": "router", + "prefix_resolved": true, + "name": "export_snapshot", + "signature": "snapshot_id: str, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 90, + "doc": "", + "decorator": "router.get('/snapshots/{snapshot_id}/export')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/snapshots/{snapshot_id}/access-advice", + "router": "router", + "prefix_resolved": true, + "name": "access_advice", + "signature": "snapshot_id: str, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 98, + "doc": "", + "decorator": "router.post('/snapshots/{snapshot_id}/access-advice')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/policies/search", + "router": "router", + "prefix_resolved": true, + "name": "search_policies", + "signature": "data: SearchInput, is_staff=Depends(audience), sources=Depends(repository)", + "returns": "", + "line": 108, + "doc": "", + "decorator": "router.post('/policies/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_planning/connections/search", + "router": "router", + "prefix_resolved": true, + "name": "search_connections", + "signature": "data: ConnectionSearch, actor=Depends(staff), repo=Depends(workflows)", + "returns": "", + "line": 118, + "doc": "", + "decorator": "router.post('/connections/search')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_planning/policy-sources/{revision_id}/documents/{document_id}", + "router": "router", + "prefix_resolved": true, + "name": "public_original", + "signature": "revision_id: str, document_id: str, sources=Depends(repository)", + "returns": "", + "line": 123, + "doc": "", + "decorator": "router.get('/policy-sources/{revision_id}/documents/{document_id}')", + "errors": [ + "HTTPException(404, 'Public policy source unavailable.')", + "HTTPException(404, 'Public policy document not found.')" + ] + } + ], + "models": [ + { + "name": "SnapshotInput", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "expected_revision", + "type": "str", + "default": "Field(min_length=36, max_length=36)" + }, + { + "name": "visibility", + "type": "Literal['staff_only', 'public']", + "default": "'staff_only'" + } + ], + "line": 71, + "doc": "" + }, + { + "name": "SearchInput", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "plan_type", + "type": "str | None", + "default": "Field(default=None, max_length=40)" + } + ], + "line": 102, + "doc": "" + }, + { + "name": "ConnectionSearch", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['meetings', 'zoning']", + "default": "" + }, + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 112, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/workflow_models.py", + "sha256": "d22e978fe778d7f4fdc3989a043370d9f6966b1e4920ed2c75698c73a8ee4e04", + "routes": [], + "models": [ + { + "name": "PolicySelection", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "plan_id", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + }, + { + "name": "revision_id", + "type": "str", + "default": "Field(min_length=36, max_length=36)" + }, + { + "name": "policy_id", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + } + ], + "line": 7, + "doc": "" + }, + { + "name": "LinkedSource", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['meetings', 'zoning']", + "default": "" + }, + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=200)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + }, + { + "name": "relation", + "type": "Literal['adoption-evidence', 'hearing', 'context', 'precedent']", + "default": "" + } + ], + "line": 13, + "doc": "" + }, + { + "name": "Consideration", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "policy", + "type": "PolicySelection", + "default": "" + }, + { + "name": "stance", + "type": "Literal['supporting', 'conflicting', 'uncertain']", + "default": "" + }, + { + "name": "note", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + } + ], + "line": 20, + "doc": "" + }, + { + "name": "AnalysisInput", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "expected_previous_revision", + "type": "str | None", + "default": "Field(default=None, min_length=36, max_length=36)" + }, + { + "name": "project_name", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "proposal", + "type": "str", + "default": "Field(min_length=1, max_length=10000)" + }, + { + "name": "selected_policies", + "type": "list[PolicySelection]", + "default": "Field(min_length=1, max_length=50)" + }, + { + "name": "considerations", + "type": "list[Consideration]", + "default": "Field(default_factory=list, max_length=100)" + }, + { + "name": "analysis_text", + "type": "str", + "default": "Field(default='', max_length=50000)" + }, + { + "name": "public_summary", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "staff_notes", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "audience", + "type": "Literal['staff', 'public']", + "default": "'staff'" + }, + { + "name": "review_state", + "type": "Literal['draft', 'reviewed']", + "default": "'draft'" + }, + { + "name": "reviewer_label", + "type": "str", + "default": "Field(default='', max_length=255)" + }, + { + "name": "reviewed_on", + "type": "date | None", + "default": "None" + }, + { + "name": "review_notes", + "type": "str", + "default": "Field(default='', max_length=5000)" + }, + { + "name": "linked_sources", + "type": "list[LinkedSource]", + "default": "Field(default_factory=list, max_length=50)" + } + ], + "line": 26, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/workflow_schema.py", + "sha256": "11d864214fabc6d509351fdc7f3e3eb90a910a5db1a137f84a7a8efca5d0002e", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_planning/workflow_store.py", + "sha256": "4d4fec6d6c876997726ff1d8f2ff39302f44228fae748edc013739267d210741", + "routes": [], + "models": [], + "configuration": [] + } + ], + "bridge": [ + { + "source": "installed-owned-source/townlight_runtime/planning_bridge.py", + "sha256": "74a855b995b7f323873b9c788cd15bd4b0ebe3fc1c53879596e1b5043c2825bb", + "routes": [ + { + "method": "POST", + "path": "/desktop/v1/planning/imports/preview", + "router": "router", + "prefix_resolved": true, + "name": "preview_import", + "signature": "body: Import, identity=Depends(actor)", + "returns": "", + "line": 80, + "doc": "", + "decorator": "router.post('/imports/preview')", + "errors": [ + "HTTPException(422, 'Invalid source bundle; verify metadata, excerpts, anchors and original hashes.')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/imports", + "router": "router", + "prefix_resolved": true, + "name": "import_source", + "signature": "request: Request, body: Import, identity=Depends(actor)", + "returns": "", + "line": 89, + "doc": "", + "decorator": "router.post('/imports')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/sources", + "router": "router", + "prefix_resolved": true, + "name": "source_list", + "signature": "request: Request, limit: int=Query(50, ge=1, le=100), offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 98, + "doc": "", + "decorator": "router.get('/sources')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/sources/{plan_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "source_history", + "signature": "request: Request, plan_id: str, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 104, + "doc": "", + "decorator": "router.get('/sources/{plan_id}/history')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/revisions/{revision_id}", + "router": "router", + "prefix_resolved": true, + "name": "revision", + "signature": "request: Request, revision_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 109, + "doc": "", + "decorator": "router.get('/revisions/{revision_id}')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/revisions/{revision_id}/documents/{document_id}", + "router": "router", + "prefix_resolved": true, + "name": "staff_original", + "signature": "request: Request, revision_id: UUID, document_id: str, identity=Depends(actor)", + "returns": "", + "line": 127, + "doc": "", + "decorator": "router.get('/revisions/{revision_id}/documents/{document_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/policies/search", + "router": "router", + "prefix_resolved": true, + "name": "policies", + "signature": "request: Request, body: Search, identity=Depends(actor)", + "returns": "", + "line": 137, + "doc": "", + "decorator": "router.post('/policies/search')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/analyses", + "router": "router", + "prefix_resolved": true, + "name": "analyses", + "signature": "request: Request, limit: int=Query(50, ge=1, le=100), offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 142, + "doc": "", + "decorator": "router.get('/analyses')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/analyses", + "router": "router", + "prefix_resolved": true, + "name": "create_analysis", + "signature": "request: Request, body: dict, identity=Depends(actor)", + "returns": "", + "line": 155, + "doc": "", + "decorator": "router.post('/analyses')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/analyses/{analysis_id}/revisions", + "router": "router", + "prefix_resolved": true, + "name": "revise_analysis", + "signature": "request: Request, analysis_id: UUID, body: dict, identity=Depends(actor)", + "returns": "", + "line": 165, + "doc": "", + "decorator": "router.post('/analyses/{analysis_id}/revisions')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/analyses/{analysis_id}", + "router": "router", + "prefix_resolved": true, + "name": "analysis", + "signature": "request: Request, analysis_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 175, + "doc": "", + "decorator": "router.get('/analyses/{analysis_id}')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/analyses/{analysis_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "analysis_history", + "signature": "request: Request, analysis_id: UUID, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 180, + "doc": "", + "decorator": "router.get('/analyses/{analysis_id}/history')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/analyses/{analysis_id}/snapshot-preview", + "router": "router", + "prefix_resolved": true, + "name": "preview_snapshot", + "signature": "request: Request, analysis_id: UUID, body: Snapshot, identity=Depends(actor)", + "returns": "", + "line": 190, + "doc": "", + "decorator": "router.post('/analyses/{analysis_id}/snapshot-preview')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/analyses/{analysis_id}/snapshots", + "router": "router", + "prefix_resolved": true, + "name": "snapshot", + "signature": "request: Request, analysis_id: UUID, body: Snapshot, identity=Depends(actor)", + "returns": "", + "line": 195, + "doc": "", + "decorator": "router.post('/analyses/{analysis_id}/snapshots')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/snapshots", + "router": "router", + "prefix_resolved": true, + "name": "snapshots", + "signature": "request: Request, limit: int=Query(50, ge=1, le=100), offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 200, + "doc": "", + "decorator": "router.get('/snapshots')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/snapshots/{snapshot_id}", + "router": "router", + "prefix_resolved": true, + "name": "document", + "signature": "request: Request, snapshot_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 206, + "doc": "", + "decorator": "router.get('/snapshots/{snapshot_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/snapshots/{snapshot_id}/access-advice", + "router": "router", + "prefix_resolved": true, + "name": "access_advice", + "signature": "request: Request, snapshot_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 211, + "doc": "", + "decorator": "router.post('/snapshots/{snapshot_id}/access-advice')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/connections/search", + "router": "router", + "prefix_resolved": true, + "name": "connections", + "signature": "request: Request, body: ConnectionSearch, identity=Depends(actor)", + "returns": "", + "line": 221, + "doc": "", + "decorator": "router.post('/connections/search')", + "errors": [] + }, + { + "method": "POST", + "path": "/townlight_planning/policies/search", + "router": "public_router", + "prefix_resolved": true, + "name": "public_policies", + "signature": "request: Request, body: Search", + "returns": "", + "line": 226, + "doc": "", + "decorator": "public_router.post('/policies/search', dependencies=[Depends(available)])", + "errors": [] + }, + { + "method": "POST", + "path": "/townlight_planning/plan-explore", + "router": "public_router", + "prefix_resolved": true, + "name": "public_plan_explore", + "signature": "request: Request, body: PublicExplore", + "returns": "", + "line": 238, + "doc": "Topic/goal/plan-type exploration over adopted public plan sources only.", + "decorator": "public_router.post('/plan-explore', dependencies=[Depends(available)])", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_planning/snapshots", + "router": "public_router", + "prefix_resolved": true, + "name": "public_snapshots", + "signature": "request: Request, limit: int=Query(50, ge=1, le=100), offset: int=Query(0, ge=0, le=100000)", + "returns": "", + "line": 254, + "doc": "", + "decorator": "public_router.get('/snapshots', dependencies=[Depends(available)])", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_planning/snapshots/{snapshot_id}", + "router": "public_router", + "prefix_resolved": true, + "name": "public_document", + "signature": "request: Request, snapshot_id: UUID", + "returns": "", + "line": 260, + "doc": "", + "decorator": "public_router.get('/snapshots/{snapshot_id}', dependencies=[Depends(available)])", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_planning/revisions/{revision_id}/documents/{document_id}", + "router": "public_router", + "prefix_resolved": true, + "name": "public_original", + "signature": "request: Request, revision_id: UUID, document_id: str", + "returns": "", + "line": 265, + "doc": "", + "decorator": "public_router.get('/revisions/{revision_id}/documents/{document_id}', dependencies=[Depends(available)])", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/progress/targets", + "router": "router", + "prefix_resolved": true, + "name": "municipal_progress", + "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 270, + "doc": "", + "decorator": "router.get('/progress/targets')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/amendments/history", + "router": "router", + "prefix_resolved": true, + "name": "municipal_amendments", + "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 275, + "doc": "", + "decorator": "router.get('/amendments/history')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/planning/municipal-work/{item_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "municipal_history", + "signature": "request: Request, item_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 280, + "doc": "", + "decorator": "router.get('/municipal-work/{item_id}/history')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/initiatives", + "router": "router", + "prefix_resolved": true, + "name": "create_initiative", + "signature": "request: Request, body: InitiativeInput, identity=Depends(actor)", + "returns": "", + "line": 285, + "doc": "", + "decorator": "router.post('/initiatives')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/initiatives/{item_id}/revisions", + "router": "router", + "prefix_resolved": true, + "name": "update_initiative", + "signature": "request: Request, item_id: UUID, body: InitiativeInput, identity=Depends(actor)", + "returns": "", + "line": 290, + "doc": "", + "decorator": "router.post('/initiatives/{item_id}/revisions')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/amendments", + "router": "router", + "prefix_resolved": true, + "name": "create_amendment", + "signature": "request: Request, body: AmendmentInput, identity=Depends(actor)", + "returns": "", + "line": 295, + "doc": "", + "decorator": "router.post('/amendments')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/planning/amendments/{item_id}/revisions", + "router": "router", + "prefix_resolved": true, + "name": "update_amendment", + "signature": "request: Request, item_id: UUID, body: AmendmentInput, identity=Depends(actor)", + "returns": "", + "line": 300, + "doc": "", + "decorator": "router.post('/amendments/{item_id}/revisions')", + "errors": [] + } + ], + "models": [ + { + "name": "Import", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "bundle", + "type": "dict", + "default": "" + }, + { + "name": "expected_previous_revision", + "type": "str | None", + "default": "Field(default=None, min_length=36, max_length=36)" + } + ], + "line": 74, + "doc": "" + }, + { + "name": "Search", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "plan_type", + "type": "str | None", + "default": "Field(default=None, max_length=40)" + } + ], + "line": 131, + "doc": "" + }, + { + "name": "Snapshot", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "expected_revision", + "type": "UUID", + "default": "" + }, + { + "name": "visibility", + "type": "Literal['staff_only', 'public']", + "default": "" + } + ], + "line": 184, + "doc": "" + }, + { + "name": "ConnectionSearch", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['meetings', 'zoning']", + "default": "" + }, + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 215, + "doc": "" + }, + { + "name": "PublicExplore", + "bases": [ + "BundleModel" + ], + "fields": [ + { + "name": "goal", + "type": "str", + "default": "Field(default='', max_length=500)" + }, + { + "name": "topic", + "type": "str", + "default": "Field(default='', max_length=160)" + }, + { + "name": "neighborhood", + "type": "str", + "default": "Field(default='', max_length=255)" + }, + { + "name": "plan_type", + "type": "str", + "default": "Field(default='', max_length=120)" + } + ], + "line": 230, + "doc": "" + } + ], + "configuration": [] + } + ] + }, + "permitting": { + "package": "townlight_permitting", + "source": [ + { + "source": "installed-owned-source/townlight_permitting/__init__.py", + "sha256": "a5b97430c7d8d5cfff984857fe16a7c72868d652340640cb9bdcdfe39ddb209c", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/connections.py", + "sha256": "4159a4eb4a407bebbefeb49bb760788cff3ac51a45c34af094d3be4b5a746798", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/intake_review.py", + "sha256": "694f531a12e56c283579e92f85651d08da776e916021ab19f4d7108c3120b41d", + "routes": [], + "models": [ + { + "name": "IntakeReadiness", + "bases": [], + "fields": [ + { + "name": "project_type", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "missing_or_unclear", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "next_step", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 11, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/integration_mocks.py", + "sha256": "d1f1b614d502ada64a87d879703e9afa72402b69e8df5a1cf25cbd78f783e111", + "routes": [], + "models": [ + { + "name": "IntegrationMockResult", + "bases": [], + "fields": [ + { + "name": "scenario", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "review_required", + "type": "bool", + "default": "" + }, + { + "name": "findings", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "boundary", + "type": "str", + "default": "" + } + ], + "line": 10, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/main.py", + "sha256": "d1186d8d291225cfff5dc66e40ab435d899d8a059506a6be6f3b413b7a5c8b90", + "routes": [ + { + "method": "GET", + "path": "/", + "router": "app", + "prefix_resolved": true, + "name": "root", + "signature": "", + "returns": "dict[str, str]", + "line": 104, + "doc": "Return current product state without overstating unshipped behavior.", + "decorator": "app.get('/')", + "errors": [] + }, + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "health", + "signature": "", + "returns": "dict[str, str]", + "line": 124, + "doc": "Return dependency/version health for deployment smoke checks.", + "decorator": "app.get('/health')", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_permitting", + "router": "app", + "prefix_resolved": true, + "name": "public_townlight_permitting_page", + "signature": "", + "returns": "str", + "line": 163, + "doc": "Return the public sample permit pre-application UI.", + "decorator": "app.get('/townlight_permitting', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/requirements/lookup", + "router": "app", + "prefix_resolved": true, + "name": "requirement_lookup", + "signature": "request: RequirementLookupRequest", + "returns": "dict[str, object]", + "line": 170, + "doc": "", + "decorator": "app.post('/api/v1/townlight_permitting/requirements/lookup')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/intake/review", + "router": "app", + "prefix_resolved": true, + "name": "intake_review", + "signature": "request: IntakeReviewRequest, x_townlight_permitting_role: Annotated[str | None, Header()]=None, x_townlight_permitting_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 179, + "doc": "", + "decorator": "app.post('/api/v1/townlight_permitting/intake/review')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/pathway/explain", + "router": "app", + "prefix_resolved": true, + "name": "pathway_explain", + "signature": "request: PathwayRequest", + "returns": "dict[str, object]", + "line": 305, + "doc": "Cited likely pathway/attachments/timeline/explainer, no model call.", + "decorator": "app.post('/api/v1/townlight_permitting/pathway/explain')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/pathway/explain-assisted", + "router": "app", + "prefix_resolved": true, + "name": "pathway_explain_assisted", + "signature": "request: PathwayRequest", + "returns": "dict[str, object]", + "line": 319, + "doc": "Same, plus an actual configured-provider call; `assistance` says what ran.", + "decorator": "app.post('/api/v1/townlight_permitting/pathway/explain-assisted')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/context/development-review", + "router": "app", + "prefix_resolved": true, + "name": "development_review_context", + "signature": "request: DevelopmentReviewContextRequest", + "returns": "dict[str, object]", + "line": 339, + "doc": "", + "decorator": "app.post('/api/v1/townlight_permitting/context/development-review')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/integrations/mock/development-review", + "router": "app", + "prefix_resolved": true, + "name": "integration_mock_development_review", + "signature": "request: IntegrationMockRequest", + "returns": "dict[str, object]", + "line": 372, + "doc": "", + "decorator": "app.post('/api/v1/townlight_permitting/integrations/mock/development-review')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_permitting/intake/{intake_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_intake_review", + "signature": "intake_id: str, x_townlight_permitting_role: Annotated[str | None, Header()]=None, x_townlight_permitting_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 384, + "doc": "", + "decorator": "app.get('/api/v1/townlight_permitting/intake/{intake_id}')", + "errors": [ + "HTTPException(status_code=503, detail={'message': 'Townlight Permitting intake persistence is not configured.', 'fix': 'Set TOWNLIGHT_PERMITTING_INTAKE_DB_URL to retrieve persisted intake review records.'})", + "HTTPException(status_code=404, detail={'message': 'Permit intake record not found.', 'fix': 'Use an intake_id returned by POST /api/v1/townlight_permitting/intake/review.'})" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/submittal/outline", + "router": "app", + "prefix_resolved": true, + "name": "submittal_outline", + "signature": "request: SubmittalOutlineRequest", + "returns": "dict[str, object]", + "line": 411, + "doc": "", + "decorator": "app.post('/api/v1/townlight_permitting/submittal/outline')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/export", + "router": "app", + "prefix_resolved": true, + "name": "permit_export", + "signature": "request: PermitExportRequest", + "returns": "dict[str, object]", + "line": 421, + "doc": "", + "decorator": "app.post('/api/v1/townlight_permitting/export')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_permitting/staff/reviews", + "router": "app", + "prefix_resolved": true, + "name": "create_staff_review", + "signature": "request: StaffReviewCreateRequest, x_townlight_permitting_role: Annotated[str | None, Header()]=None, x_townlight_permitting_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 431, + "doc": "", + "decorator": "app.post('/api/v1/townlight_permitting/staff/reviews')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_permitting/staff/reviews", + "router": "app", + "prefix_resolved": true, + "name": "list_staff_reviews", + "signature": "status: str | None=None, x_townlight_permitting_role: Annotated[str | None, Header()]=None, x_townlight_permitting_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 449, + "doc": "", + "decorator": "app.get('/api/v1/townlight_permitting/staff/reviews')", + "errors": [] + }, + { + "method": "PATCH", + "path": "/api/v1/townlight_permitting/staff/reviews/{review_id}", + "router": "app", + "prefix_resolved": true, + "name": "update_staff_review", + "signature": "review_id: str, request: StaffReviewUpdateRequest, x_townlight_permitting_role: Annotated[str | None, Header()]=None, x_townlight_permitting_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 466, + "doc": "", + "decorator": "app.patch('/api/v1/townlight_permitting/staff/reviews/{review_id}')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Townlight Permitting staff review item was not found.', 'fix': 'List staff reviews and retry with an existing review_id.'})", + "HTTPException(status_code=422, detail={'message': 'Staff review update is invalid.', 'fix': str(exc)})" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_permitting/staff/reviews/summary", + "router": "app", + "prefix_resolved": true, + "name": "staff_review_summary", + "signature": "x_townlight_permitting_role: Annotated[str | None, Header()]=None, x_townlight_permitting_staff_key: Annotated[str | None, Header()]=None", + "returns": "dict[str, object]", + "line": 498, + "doc": "", + "decorator": "app.get('/api/v1/townlight_permitting/staff/reviews/summary')", + "errors": [] + } + ], + "models": [ + { + "name": "RequirementLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "location_context", + "type": "str", + "default": "Field(default='', max_length=500)" + } + ], + "line": 45, + "doc": "" + }, + { + "name": "IntakeReviewRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "proposal", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + }, + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + } + ], + "line": 50, + "doc": "" + }, + { + "name": "DevelopmentReviewContextRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "proposal", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + }, + { + "name": "location_context", + "type": "str", + "default": "Field(default='', max_length=500)" + }, + { + "name": "zoning_context_id", + "type": "str | None", + "default": "Field(default=None, max_length=160)" + }, + { + "name": "code_context_id", + "type": "str | None", + "default": "Field(default=None, max_length=160)" + } + ], + "line": 55, + "doc": "" + }, + { + "name": "SubmittalOutlineRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "project_name", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "proposal", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + }, + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + } + ], + "line": 65, + "doc": "" + }, + { + "name": "PermitExportRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "format", + "type": "str", + "default": "Field(default='markdown', min_length=1, max_length=40)" + } + ], + "line": 71, + "doc": "" + }, + { + "name": "StaffReviewCreateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "proposal", + "type": "str", + "default": "Field(min_length=1, max_length=5000)" + }, + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "intake_id", + "type": "str | None", + "default": "Field(default=None, max_length=36)" + } + ], + "line": 77, + "doc": "" + }, + { + "name": "StaffReviewUpdateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "status", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "Field(default=None, max_length=255)" + }, + { + "name": "resolution", + "type": "str | None", + "default": "Field(default=None, max_length=2000)" + } + ], + "line": 84, + "doc": "" + }, + { + "name": "PathwayRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "proposal", + "type": "str", + "default": "Field(default='', max_length=5000)" + }, + { + "name": "location_context", + "type": "str", + "default": "Field(default='', max_length=500)" + }, + { + "name": "use_model_assistance", + "type": "bool", + "default": "Field(default=False)" + } + ], + "line": 90, + "doc": "" + }, + { + "name": "IntegrationMockRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "scenario", + "type": "str", + "default": "Field(default='development-review-context', max_length=160)" + } + ], + "line": 97, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_PERMITTING_INTAKE_DB_URL", + "default": "", + "line": 508 + }, + { + "variable": "TOWNLIGHT_PERMITTING_LLM_MODEL", + "default": "", + "line": 233 + }, + { + "variable": "TOWNLIGHT_PERMITTING_LLM_PROVIDER", + "default": "''", + "line": 218 + } + ] + }, + { + "source": "installed-owned-source/townlight_permitting/migrations/__init__.py", + "sha256": "01c6b95137260717ee792116a0479392b3f2da330542c55dbd181c4a93d404a3", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/migrations/env.py", + "sha256": "91715ad26e140d1b25b30ad38b3418d36ea63da4a195348aa5fe621c99edbe5e", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/migrations/versions/townlight_permitting_0001_connected.py", + "sha256": "e3fc90959836887334b429888407537140fa2d119c202886b63c538feb4e9360", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/pathway.py", + "sha256": "b1e311809d61f4efab043c681efa9d711d5bf4bf76b5f33f808c1769e3687d08", + "routes": [], + "models": [ + { + "name": "AssistantProvider", + "bases": [ + "Protocol" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + } + ], + "line": 74, + "doc": "Structural type of the townlight_core LLM provider used for the explainer." + }, + { + "name": "PathwayStage", + "bases": [], + "fields": [ + { + "name": "key", + "type": "str", + "default": "" + }, + { + "name": "label", + "type": "str", + "default": "" + }, + { + "name": "source_id", + "type": "str", + "default": "" + }, + { + "name": "typical_time", + "type": "str", + "default": "" + } + ], + "line": 91, + "doc": "A cited step in the pre-application pathway.\n\n``source_id`` is resolved through the configured public source providers;\nthe displayed citation and text are copied from the resolved source so the\npathway can never show a citation that does not exist." + }, + { + "name": "Pathway", + "bases": [], + "fields": [ + { + "name": "project_type", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "stages", + "type": "tuple[PathwayStage, ...]", + "default": "" + }, + { + "name": "attachments_citation", + "type": "str", + "default": "" + }, + { + "name": "attachments", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "note", + "type": "str", + "default": "''" + } + ], + "line": 106, + "doc": "" + }, + { + "name": "PathwayExplanation", + "bases": [], + "fields": [ + { + "name": "project_type", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "likely_permits", + "type": "list[dict[str, str]]", + "default": "field(default_factory=list)" + }, + { + "name": "attachments", + "type": "list[dict[str, str]]", + "default": "field(default_factory=list)" + }, + { + "name": "timeline", + "type": "list[dict[str, str]]", + "default": "field(default_factory=list)" + }, + { + "name": "unavailable", + "type": "list[dict[str, str]]", + "default": "field(default_factory=list)" + }, + { + "name": "fee", + "type": "dict[str, object]", + "default": "field(default_factory=dict)" + }, + { + "name": "resident_explanation", + "type": "str", + "default": "''" + }, + { + "name": "assistance", + "type": "dict[str, object]", + "default": "field(default_factory=dict)" + }, + { + "name": "review_required", + "type": "bool", + "default": "True" + }, + { + "name": "determination_made", + "type": "bool", + "default": "False" + }, + { + "name": "citations", + "type": "list[str]", + "default": "field(default_factory=list)" + }, + { + "name": "boundary", + "type": "str", + "default": "BOUNDARY" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 132, + "doc": "Assembled, citation-checked pre-application explanation." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/persistence.py", + "sha256": "cea7301cde02497e65601351e58100b3211cf79e85e3036f251107f7d21fe95b", + "routes": [], + "models": [ + { + "name": "StoredIntakeReview", + "bases": [], + "fields": [ + { + "name": "intake_id", + "type": "str", + "default": "" + }, + { + "name": "project_type", + "type": "str", + "default": "" + }, + { + "name": "proposal", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "missing_or_unclear", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "next_step", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 72, + "doc": "" + }, + { + "name": "StaffReviewQueueItem", + "bases": [], + "fields": [ + { + "name": "review_id", + "type": "str", + "default": "" + }, + { + "name": "intake_id", + "type": "str | None", + "default": "" + }, + { + "name": "project_type", + "type": "str", + "default": "" + }, + { + "name": "proposal", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "" + }, + { + "name": "resolution", + "type": "str | None", + "default": "" + }, + { + "name": "created_by", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "'staff_only'" + } + ], + "line": 84, + "doc": "" + }, + { + "name": "StaffReviewSummary", + "bases": [], + "fields": [ + { + "name": "total_items", + "type": "int", + "default": "" + }, + { + "name": "by_status", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "open_items", + "type": "int", + "default": "" + }, + { + "name": "generated_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "'staff_only'" + } + ], + "line": 100, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/public_ui.py", + "sha256": "0f06685bd18b171987cc08413bc930112f400a03468c0f27e98badba6b732f29", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/records_export.py", + "sha256": "231801e8bd30b92f0fe6aeb0a8f2aed2d5097acae5f2cc5eda2e18f9c9a1fae8", + "routes": [], + "models": [ + { + "name": "PermitExport", + "bases": [], + "fields": [ + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "project_type", + "type": "str", + "default": "" + }, + { + "name": "format", + "type": "str", + "default": "" + }, + { + "name": "checklist", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "retention_note", + "type": "str", + "default": "" + } + ], + "line": 11, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/requirement_lookup.py", + "sha256": "f9a1fbd111096e7d4c00cc6cb7f25b9cf91af522f26c743f86234a0ecffe783c", + "routes": [], + "models": [ + { + "name": "PermitRequirement", + "bases": [], + "fields": [ + { + "name": "requirement_id", + "type": "str", + "default": "" + }, + { + "name": "project_type", + "type": "str", + "default": "" + }, + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "citation", + "type": "str", + "default": "" + }, + { + "name": "required_materials", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "staff_note", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 16, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/sources.py", + "sha256": "8e26b8c98635689f985e14d57a0137f6538145c50414da918ba0cb41a7f489a3", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/submittal_outline.py", + "sha256": "f6465de3058d51bb47b7d278e10b67a2ac1ac46aeefa2563eabd041dcb54aae1", + "routes": [], + "models": [ + { + "name": "SubmittalOutline", + "bases": [], + "fields": [ + { + "name": "project_name", + "type": "str", + "default": "" + }, + { + "name": "heading", + "type": "str", + "default": "" + }, + { + "name": "required_materials", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "applicant_message", + "type": "str", + "default": "" + }, + { + "name": "review_required", + "type": "bool", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 12, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/workflow_models.py", + "sha256": "3d09f3ae137c5c48091e22a60a3e732ea3ec299236778d377df55807bb8bbfdd", + "routes": [], + "models": [ + { + "name": "Material", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "material_id", + "type": "str", + "default": "Field(pattern='^[a-zA-Z0-9_-]{1,80}$')" + }, + { + "name": "description", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "citation", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + } + ], + "line": 20, + "doc": "" + }, + { + "name": "PathwayStep", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "step", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "citation", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "typical_time", + "type": "str", + "default": "Field(default='', max_length=1000)" + } + ], + "line": 26, + "doc": "" + }, + { + "name": "SourceLink", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['code', 'zoning']", + "default": "" + }, + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[a-f0-9]{64}$')" + } + ], + "line": 32, + "doc": "" + }, + { + "name": "RequirementBundle", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "requirement_id", + "type": "str", + "default": "Field(pattern='^[a-zA-Z0-9_-]{1,100}$')" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "jurisdiction", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=255)" + }, + { + "name": "source_reference", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "source_date", + "type": "date", + "default": "" + }, + { + "name": "effective_on", + "type": "date", + "default": "" + }, + { + "name": "dataset_kind", + "type": "Literal['municipal', 'fictional']", + "default": "" + }, + { + "name": "filename", + "type": "str", + "default": "Field(pattern='^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,150}$')" + }, + { + "name": "content_base64", + "type": "str", + "default": "Field(min_length=1, max_length=14000000)" + }, + { + "name": "sha256", + "type": "str", + "default": "Field(pattern='^[a-f0-9]{64}$')" + }, + { + "name": "materials", + "type": "list[Material]", + "default": "Field(min_length=1, max_length=100)" + }, + { + "name": "pathway", + "type": "list[PathwayStep]", + "default": "Field(default_factory=list, max_length=100)" + }, + { + "name": "fee_link", + "type": "SourceLink | None", + "default": "None" + }, + { + "name": "staff_note", + "type": "str", + "default": "Field(default='', max_length=4000)" + }, + { + "name": "change_note", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + } + ], + "line": 38, + "doc": "" + }, + { + "name": "MaterialReview", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "material_id", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "status", + "type": "Literal['not_reviewed', 'provided', 'missing', 'unclear']", + "default": "'not_reviewed'" + }, + { + "name": "note", + "type": "str", + "default": "Field(default='', max_length=2000)" + } + ], + "line": 70, + "doc": "" + }, + { + "name": "IntakeInput", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "expected_revision", + "type": "UUID | None", + "default": "None" + }, + { + "name": "project_name", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "project_description", + "type": "str", + "default": "Field(min_length=1, max_length=10000)" + }, + { + "name": "location", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "applicant_contact", + "type": "str", + "default": "Field(default='', max_length=2000)" + }, + { + "name": "requirement_revision", + "type": "UUID", + "default": "" + }, + { + "name": "materials", + "type": "list[MaterialReview]", + "default": "Field(min_length=1, max_length=100)" + }, + { + "name": "linked_sources", + "type": "list[SourceLink]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "staff_notes", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "assigned_to", + "type": "str", + "default": "Field(default='', max_length=255)" + }, + { + "name": "review_state", + "type": "Literal['draft', 'follow_up', 'reviewed']", + "default": "'draft'" + }, + { + "name": "review_notes", + "type": "str", + "default": "Field(default='', max_length=4000)" + }, + { + "name": "public_summary", + "type": "str", + "default": "Field(default='', max_length=10000)" + } + ], + "line": 76, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/workflow_schema.py", + "sha256": "07dfc3dfafd5131ffee8b087add38fd7ebf446c2cf104100920636e732aaee59", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_permitting/workflow_store.py", + "sha256": "c3415dd94aaed609a593d28b60d0719f2dc1a504a5f15391d9708714038ea259", + "routes": [], + "models": [], + "configuration": [] + } + ], + "bridge": [ + { + "source": "installed-owned-source/townlight_runtime/permitting_bridge.py", + "sha256": "786abd0dfc18ed0ce7ada70fcd120f96795d8e1ee46f38ca0770a8217b4d6e1d", + "routes": [ + { + "method": "POST", + "path": "/desktop/v1/permitting/requirements", + "router": "router", + "prefix_resolved": true, + "name": "import_requirements", + "signature": "request: Request, body: Import, identity=Depends(actor)", + "returns": "", + "line": 85, + "doc": "", + "decorator": "router.post('/requirements')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/permitting/requirements", + "router": "router", + "prefix_resolved": true, + "name": "requirements", + "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 91, + "doc": "", + "decorator": "router.get('/requirements')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/permitting/requirements/{revision_id}", + "router": "router", + "prefix_resolved": true, + "name": "requirement", + "signature": "request: Request, revision_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 96, + "doc": "", + "decorator": "router.get('/requirements/{revision_id}')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/permitting/cases", + "router": "router", + "prefix_resolved": true, + "name": "cases", + "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 101, + "doc": "", + "decorator": "router.get('/cases')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/permitting/cases", + "router": "router", + "prefix_resolved": true, + "name": "create_case", + "signature": "request: Request, body: IntakeInput, identity=Depends(actor)", + "returns": "", + "line": 106, + "doc": "", + "decorator": "router.post('/cases')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/permitting/cases/{case_id}", + "router": "router", + "prefix_resolved": true, + "name": "case", + "signature": "request: Request, case_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 111, + "doc": "", + "decorator": "router.get('/cases/{case_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/permitting/cases/{case_id}/revisions", + "router": "router", + "prefix_resolved": true, + "name": "revise", + "signature": "request: Request, case_id: UUID, body: IntakeInput, identity=Depends(actor)", + "returns": "", + "line": 116, + "doc": "", + "decorator": "router.post('/cases/{case_id}/revisions')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/permitting/cases/{case_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "history", + "signature": "request: Request, case_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 121, + "doc": "", + "decorator": "router.get('/cases/{case_id}/history')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/permitting/cases/{case_id}/packets", + "router": "router", + "prefix_resolved": true, + "name": "packet", + "signature": "request: Request, case_id: UUID, body: Packet, identity=Depends(actor)", + "returns": "", + "line": 131, + "doc": "", + "decorator": "router.post('/cases/{case_id}/packets')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/permitting/packets/{packet_id}", + "router": "router", + "prefix_resolved": true, + "name": "document", + "signature": "request: Request, packet_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 136, + "doc": "", + "decorator": "router.get('/packets/{packet_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/permitting/pathway", + "router": "router", + "prefix_resolved": true, + "name": "pathway", + "signature": "request: Request, body: Pathway, identity=Depends(actor)", + "returns": "", + "line": 149, + "doc": "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.", + "decorator": "router.post('/pathway')", + "errors": [ + "HTTPException(503, f'Configured public permit sources unavailable: {exc}')" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/permitting/connections/search", + "router": "router", + "prefix_resolved": true, + "name": "connections", + "signature": "request: Request, body: Search, identity=Depends(actor)", + "returns": "", + "line": 199, + "doc": "", + "decorator": "router.post('/connections/search')", + "errors": [] + } + ], + "models": [ + { + "name": "Import", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "bundle", + "type": "RequirementBundle", + "default": "" + }, + { + "name": "expected_revision", + "type": "UUID | None", + "default": "None" + } + ], + "line": 79, + "doc": "" + }, + { + "name": "Packet", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "expected_revision", + "type": "UUID", + "default": "" + }, + { + "name": "visibility", + "type": "Literal['staff_only', 'records_copy']", + "default": "" + } + ], + "line": 125, + "doc": "" + }, + { + "name": "Pathway", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "project_type", + "type": "str", + "default": "Field(min_length=1, max_length=120)" + }, + { + "name": "proposal", + "type": "str", + "default": "Field(default='', max_length=4000)" + }, + { + "name": "location_context", + "type": "str", + "default": "Field(default='', max_length=1000)" + }, + { + "name": "requirement_revision", + "type": "UUID | None", + "default": "None" + }, + { + "name": "fee_link", + "type": "SourceLink | None", + "default": "None" + } + ], + "line": 140, + "doc": "" + }, + { + "name": "Search", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['code', 'zoning']", + "default": "" + }, + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 193, + "doc": "" + } + ], + "configuration": [] + } + ] + }, + "inspections": { + "package": "townlight_inspections", + "source": [ + { + "source": "installed-owned-source/townlight_inspections/__init__.py", + "sha256": "eff685acecf3985653f811403aaabc6862d52ce7e343c38aa5242f40d4266c47", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/_whistle_driver.py", + "sha256": "90ce9276c7d1de4d3259a2c00ff581e5d55d28dd8da913ed7b8bd2d7c89a5264", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/adapters.py", + "sha256": "ab76d8c1a8b57167acf759390b49a3941f04b4483a606be2abbae69f4f8165db", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/case_lookup.py", + "sha256": "b68030ecdf6a7f83ed35aec636afcb70c5ce247a40ed7d60a3283655bfdb3214", + "routes": [], + "models": [ + { + "name": "RepeatCaseResult", + "bases": [], + "fields": [ + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "violation_type", + "type": "str", + "default": "" + }, + { + "name": "repeat_case_count", + "type": "int", + "default": "" + }, + { + "name": "related_case_ids", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "staff_note", + "type": "str", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 15, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/connections.py", + "sha256": "82221673e19e1bd48215cfc9dbeab837070cd9a6bdd3f3cf57cf3034f3ac3bef", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/integration_mocks.py", + "sha256": "dfc700d977badb104db5abddded3120b1bff99445a6bbf18f7a6925c9087c797", + "routes": [], + "models": [ + { + "name": "IntegrationMockResult", + "bases": [], + "fields": [ + { + "name": "scenario", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "review_required", + "type": "bool", + "default": "" + }, + { + "name": "findings", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "boundary", + "type": "str", + "default": "" + } + ], + "line": 10, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/main.py", + "sha256": "16306b47d0e6e526176c050b2eb2edb6a047edea3bb5f313df48c026a81cc53e", + "routes": [ + { + "method": "GET", + "path": "/", + "router": "app", + "prefix_resolved": true, + "name": "root", + "signature": "", + "returns": "dict[str, str]", + "line": 130, + "doc": "Return current product state without overstating unshipped behavior.", + "decorator": "app.get('/')", + "errors": [] + }, + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "health", + "signature": "", + "returns": "dict[str, str]", + "line": 150, + "doc": "Return dependency/version health for deployment smoke checks.", + "decorator": "app.get('/health')", + "errors": [] + }, + { + "method": "GET", + "path": "/townlight_inspections", + "router": "app", + "prefix_resolved": true, + "name": "public_townlight_inspections_page", + "signature": "", + "returns": "str", + "line": 162, + "doc": "Return the public sample inspection support UI.", + "decorator": "app.get('/townlight_inspections', response_class=HTMLResponse)", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/cases/repeat-lookup", + "router": "app", + "prefix_resolved": true, + "name": "repeat_case_lookup", + "signature": "request: RepeatCaseLookupRequest", + "returns": "dict[str, object]", + "line": 169, + "doc": "", + "decorator": "app.post('/api/v1/townlight_inspections/cases/repeat-lookup')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/reports/draft", + "router": "app", + "prefix_resolved": true, + "name": "inspection_report_draft", + "signature": "request: ReportDraftRequest", + "returns": "dict[str, object]", + "line": 178, + "doc": "", + "decorator": "app.post('/api/v1/townlight_inspections/reports/draft')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_inspections/reports/{report_id}", + "router": "app", + "prefix_resolved": true, + "name": "get_inspection_report", + "signature": "report_id: str", + "returns": "dict[str, object]", + "line": 215, + "doc": "", + "decorator": "app.get('/api/v1/townlight_inspections/reports/{report_id}')", + "errors": [ + "HTTPException(status_code=503, detail={'message': 'Townlight Inspections case persistence is not configured.', 'fix': 'Set TOWNLIGHT_INSPECTIONS_CASE_DB_URL to retrieve persisted inspection report records.'})", + "HTTPException(status_code=404, detail={'message': 'Inspection report record not found.', 'fix': 'Use a report_id returned by POST /api/v1/townlight_inspections/reports/draft.'})" + ] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/evidence/retain", + "router": "app", + "prefix_resolved": true, + "name": "retain_evidence_route", + "signature": "request: EvidenceRetainRequest", + "returns": "dict[str, object]", + "line": 291, + "doc": "Retain original evidence bytes (photos, documents and raw audio) with hashes.", + "decorator": "app.post('/api/v1/townlight_inspections/evidence/retain')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/media/analyse", + "router": "app", + "prefix_resolved": true, + "name": "media_analyse", + "signature": "request: MediaAnalysisRequest", + "returns": "dict[str, object]", + "line": 307, + "doc": "Draft-only analysis of retained media; inspector review always required.", + "decorator": "app.post('/api/v1/townlight_inspections/media/analyse')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/notices/draft", + "router": "app", + "prefix_resolved": true, + "name": "notice_draft", + "signature": "request: NoticeDraftRequest", + "returns": "dict[str, object]", + "line": 325, + "doc": "", + "decorator": "app.post('/api/v1/townlight_inspections/notices/draft')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/context/inspection-review", + "router": "app", + "prefix_resolved": true, + "name": "inspection_review_context", + "signature": "request: InspectionContextRequest", + "returns": "dict[str, object]", + "line": 336, + "doc": "", + "decorator": "app.post('/api/v1/townlight_inspections/context/inspection-review')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/integrations/mock/inspection-context", + "router": "app", + "prefix_resolved": true, + "name": "integration_mock_inspection_context", + "signature": "request: IntegrationMockRequest", + "returns": "dict[str, object]", + "line": 365, + "doc": "", + "decorator": "app.post('/api/v1/townlight_inspections/integrations/mock/inspection-context')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/export", + "router": "app", + "prefix_resolved": true, + "name": "inspection_export", + "signature": "request: InspectionExportRequest", + "returns": "dict[str, object]", + "line": 377, + "doc": "", + "decorator": "app.post('/api/v1/townlight_inspections/export')", + "errors": [] + }, + { + "method": "POST", + "path": "/api/v1/townlight_inspections/staff/reviews", + "router": "app", + "prefix_resolved": true, + "name": "create_staff_review", + "signature": "request: StaffReviewCreateRequest, _staff_principal: object=Depends(_require_staff_key)", + "returns": "dict[str, object]", + "line": 387, + "doc": "", + "decorator": "app.post('/api/v1/townlight_inspections/staff/reviews')", + "errors": [] + }, + { + "method": "GET", + "path": "/api/v1/townlight_inspections/staff/reviews", + "router": "app", + "prefix_resolved": true, + "name": "list_staff_reviews", + "signature": "status: str | None=None, _staff_principal: object=Depends(_require_staff_key)", + "returns": "dict[str, object]", + "line": 403, + "doc": "", + "decorator": "app.get('/api/v1/townlight_inspections/staff/reviews')", + "errors": [] + }, + { + "method": "PATCH", + "path": "/api/v1/townlight_inspections/staff/reviews/{review_id}", + "router": "app", + "prefix_resolved": true, + "name": "update_staff_review", + "signature": "review_id: str, request: StaffReviewUpdateRequest, _staff_principal: object=Depends(_require_staff_key)", + "returns": "dict[str, object]", + "line": 418, + "doc": "", + "decorator": "app.patch('/api/v1/townlight_inspections/staff/reviews/{review_id}')", + "errors": [ + "HTTPException(status_code=404, detail={'message': 'Townlight Inspections staff review item was not found.', 'fix': 'List staff reviews and retry with an existing review_id.'})", + "HTTPException(status_code=422, detail={'message': 'Staff review update is invalid.', 'fix': str(exc)})" + ] + }, + { + "method": "GET", + "path": "/api/v1/townlight_inspections/staff/reviews/summary", + "router": "app", + "prefix_resolved": true, + "name": "staff_review_summary", + "signature": "_staff_principal: object=Depends(_require_staff_key)", + "returns": "dict[str, object]", + "line": 448, + "doc": "", + "decorator": "app.get('/api/v1/townlight_inspections/staff/reviews/summary')", + "errors": [] + } + ], + "models": [ + { + "name": "RepeatCaseLookupRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "violation_type", + "type": "str", + "default": "''" + } + ], + "line": 50, + "doc": "" + }, + { + "name": "ReportDraftRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "inspection_id", + "type": "str", + "default": "" + }, + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "inspector_notes", + "type": "str", + "default": "" + }, + { + "name": "photo_observations", + "type": "list[str]", + "default": "[]" + }, + { + "name": "voice_notes", + "type": "str", + "default": "''" + }, + { + "name": "analysis", + "type": "AnalysisRecord | None", + "default": "None" + } + ], + "line": 55, + "doc": "" + }, + { + "name": "NoticeDraftRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "case_id", + "type": "str", + "default": "" + }, + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "violation_type", + "type": "str", + "default": "" + }, + { + "name": "observations", + "type": "list[str]", + "default": "" + } + ], + "line": 64, + "doc": "" + }, + { + "name": "InspectionExportRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "case_id", + "type": "str", + "default": "" + }, + { + "name": "format", + "type": "str", + "default": "'markdown'" + } + ], + "line": 71, + "doc": "" + }, + { + "name": "InspectionContextRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "inspection_id", + "type": "str", + "default": "" + }, + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "violation_type", + "type": "str", + "default": "" + }, + { + "name": "code_context_id", + "type": "str", + "default": "''" + }, + { + "name": "case_context_id", + "type": "str", + "default": "''" + }, + { + "name": "source_date_status", + "type": "str", + "default": "'current'" + } + ], + "line": 77, + "doc": "" + }, + { + "name": "IntegrationMockRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "scenario", + "type": "str", + "default": "'inspection-context'" + }, + { + "name": "role", + "type": "str", + "default": "'staff'" + }, + { + "name": "code_context_id", + "type": "str", + "default": "''" + }, + { + "name": "case_context_id", + "type": "str", + "default": "''" + }, + { + "name": "official_finding", + "type": "bool", + "default": "False" + }, + { + "name": "citation_issued", + "type": "bool", + "default": "False" + }, + { + "name": "fine_amount", + "type": "str | None", + "default": "None" + }, + { + "name": "photo_analysis_source", + "type": "str", + "default": "'inspector_observation'" + }, + { + "name": "source_date_status", + "type": "str", + "default": "'current'" + } + ], + "line": 86, + "doc": "" + }, + { + "name": "EvidenceItemRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "filename", + "type": "str", + "default": "" + }, + { + "name": "media_type", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "''" + }, + { + "name": "content_base64", + "type": "str", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "" + } + ], + "line": 98, + "doc": "" + }, + { + "name": "EvidenceRetainRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "items", + "type": "list[EvidenceItemRequest]", + "default": "" + } + ], + "line": 106, + "doc": "" + }, + { + "name": "MediaAnalysisRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "items", + "type": "list[EvidenceItemRequest]", + "default": "" + }, + { + "name": "code_links", + "type": "list[dict[str, str]]", + "default": "[]" + }, + { + "name": "inspector_supplied_text", + "type": "str", + "default": "''" + } + ], + "line": 110, + "doc": "" + }, + { + "name": "StaffReviewCreateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "inspection_id", + "type": "str", + "default": "" + }, + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "report_id", + "type": "str | None", + "default": "None" + } + ], + "line": 116, + "doc": "" + }, + { + "name": "StaffReviewUpdateRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "None" + }, + { + "name": "resolution", + "type": "str | None", + "default": "None" + } + ], + "line": 123, + "doc": "" + } + ], + "configuration": [ + { + "variable": "TOWNLIGHT_INSPECTIONS_CASE_DB_URL", + "default": "", + "line": 456 + } + ] + }, + { + "source": "installed-owned-source/townlight_inspections/media_analysis.py", + "sha256": "be51101ee98596bca3055f99136531e3a76e28f2dc584148cf26098d75a94c5a", + "routes": [], + "models": [ + { + "name": "RetainedEvidence", + "bases": [], + "fields": [ + { + "name": "filename", + "type": "str", + "default": "" + }, + { + "name": "media_type", + "type": "str", + "default": "" + }, + { + "name": "description", + "type": "str", + "default": "" + }, + { + "name": "size_bytes", + "type": "int", + "default": "" + }, + { + "name": "sha256", + "type": "str", + "default": "" + }, + { + "name": "raw", + "type": "bytes", + "default": "field(repr=False)" + } + ], + "line": 55, + "doc": "Original evidence bytes with their verified digest and provenance." + }, + { + "name": "VisionProvider", + "bases": [ + "Protocol" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + }, + { + "name": "supports_images", + "type": "bool", + "default": "" + } + ], + "line": 110, + "doc": "The owned townlight_core provider shape (multimodal generate)." + }, + { + "name": "TranscriptionProvider", + "bases": [ + "Protocol" + ], + "fields": [ + { + "name": "name", + "type": "str", + "default": "" + } + ], + "line": 121, + "doc": "Adapter that turns retained audio bytes into text." + }, + { + "name": "MediaAnalysis", + "bases": [], + "fields": [ + { + "name": "draft_observations", + "type": "list[dict[str, Any]]", + "default": "field(default_factory=list)" + }, + { + "name": "cited_sections", + "type": "list[dict[str, str]]", + "default": "field(default_factory=list)" + }, + { + "name": "unavailable", + "type": "list[dict[str, str]]", + "default": "field(default_factory=list)" + }, + { + "name": "retained", + "type": "list[dict[str, Any]]", + "default": "field(default_factory=list)" + }, + { + "name": "runtime", + "type": "dict[str, Any]", + "default": "field(default_factory=dict)" + }, + { + "name": "review_required", + "type": "bool", + "default": "True" + }, + { + "name": "determination_made", + "type": "bool", + "default": "False" + }, + { + "name": "boundary", + "type": "str", + "default": "BOUNDARY" + } + ], + "line": 139, + "doc": "Result of a draft-only analysis pass." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/migrations/__init__.py", + "sha256": "e18fc02330135cd7d0dd678a3e17f9e81966a9e187c3ed0ec002439fa8d3bbb1", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/migrations/env.py", + "sha256": "9612897b28e02e86d1fa5b9ed48d951b76bb5a87151112d0c1cdbe10a0d343e3", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/migrations/versions/townlight_inspections_0001_connected.py", + "sha256": "0e71ed311993f45634eb42ba22f5c2b2c4a3854639b221857af76f826d1b68de", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/notice_draft.py", + "sha256": "ef44c7d6bcf131bc703f6d0282510fe8a49cc6b5988f6252d01353e15551a2f6", + "routes": [], + "models": [ + { + "name": "NoticeDraft", + "bases": [], + "fields": [ + { + "name": "case_id", + "type": "str", + "default": "" + }, + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "heading", + "type": "str", + "default": "" + }, + { + "name": "draft_body", + "type": "str", + "default": "" + }, + { + "name": "required_staff_actions", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 11, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/persistence.py", + "sha256": "a4c75976a7fe2cc25d2c9a9074eee1a2870eb47bcf6890564d2fb31b113579e3", + "routes": [], + "models": [ + { + "name": "StoredInspectionReport", + "bases": [], + "fields": [ + { + "name": "report_id", + "type": "str", + "default": "" + }, + { + "name": "inspection_id", + "type": "str", + "default": "" + }, + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "observation_bullets", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "inspector_review_required", + "type": "bool", + "default": "" + }, + { + "name": "disclaimer", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + } + ], + "line": 70, + "doc": "" + }, + { + "name": "StaffReviewQueueItem", + "bases": [], + "fields": [ + { + "name": "review_id", + "type": "str", + "default": "" + }, + { + "name": "report_id", + "type": "str | None", + "default": "" + }, + { + "name": "inspection_id", + "type": "str", + "default": "" + }, + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "status", + "type": "str", + "default": "" + }, + { + "name": "reason", + "type": "str", + "default": "" + }, + { + "name": "assigned_to", + "type": "str | None", + "default": "" + }, + { + "name": "resolution", + "type": "str | None", + "default": "" + }, + { + "name": "created_by", + "type": "str", + "default": "" + }, + { + "name": "created_at", + "type": "datetime", + "default": "" + }, + { + "name": "updated_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "'staff_only'" + } + ], + "line": 82, + "doc": "" + }, + { + "name": "StaffReviewSummary", + "bases": [], + "fields": [ + { + "name": "total_items", + "type": "int", + "default": "" + }, + { + "name": "by_status", + "type": "dict[str, int]", + "default": "" + }, + { + "name": "open_items", + "type": "int", + "default": "" + }, + { + "name": "generated_at", + "type": "datetime", + "default": "" + }, + { + "name": "visibility", + "type": "str", + "default": "'staff_only'" + } + ], + "line": 98, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/public_ui.py", + "sha256": "c14bd5b3d45dc1434edeffb931cd6abb8804bff675989769c8eb89c85a46f965", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/records_export.py", + "sha256": "6adcb9a04cbff7d9d455f41598a0bdb1dfd736aa13f439a61f1e2ed98f8b49bb", + "routes": [], + "models": [ + { + "name": "InspectionExport", + "bases": [], + "fields": [ + { + "name": "title", + "type": "str", + "default": "" + }, + { + "name": "case_id", + "type": "str", + "default": "" + }, + { + "name": "format", + "type": "str", + "default": "" + }, + { + "name": "checklist", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "retention_note", + "type": "str", + "default": "" + } + ], + "line": 9, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/report_draft.py", + "sha256": "40faeb3103ac9ba5ae45fd74136d5cff0a96c5fa73acb96f4a16a34d1cb7ebd5", + "routes": [], + "models": [ + { + "name": "InspectionReportDraft", + "bases": [], + "fields": [ + { + "name": "inspection_id", + "type": "str", + "default": "" + }, + { + "name": "property_reference", + "type": "str", + "default": "" + }, + { + "name": "summary", + "type": "str", + "default": "" + }, + { + "name": "observation_bullets", + "type": "tuple[str, ...]", + "default": "" + }, + { + "name": "inspector_review_required", + "type": "bool", + "default": "" + }, + { + "name": "cited_sections", + "type": "tuple[str, ...]", + "default": "()" + }, + { + "name": "disclaimer", + "type": "str", + "default": "DISCLAIMER" + } + ], + "line": 11, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/transcription.py", + "sha256": "0289536c591fa63b6bfa25512444c4a36edc1f160a93d195d3e5aea9e718289f", + "routes": [], + "models": [], + "configuration": [ + { + "variable": "TOWNLIGHT_INSPECTIONS_FFMPEG", + "default": "", + "line": 53 + }, + { + "variable": "TOWNLIGHT_INSPECTIONS_TEXTFLOWKIT_PYTHON", + "default": "", + "line": 49 + } + ] + }, + { + "source": "installed-owned-source/townlight_inspections/workflow_models.py", + "sha256": "7f61e6c7bde5b79202b562d9183c5558d5504fe19eda9ed8fe52541d92152377", + "routes": [], + "models": [ + { + "name": "AnalysisObservation", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "source", + "type": "str", + "default": "Field(min_length=1, max_length=64)" + }, + { + "name": "filename", + "type": "str", + "default": "Field(default='', max_length=160)" + }, + { + "name": "media_type", + "type": "str", + "default": "Field(default='', max_length=80)" + }, + { + "name": "text", + "type": "str", + "default": "Field(min_length=1, max_length=4000)" + }, + { + "name": "adapter", + "type": "str", + "default": "Field(default='', max_length=120)" + }, + { + "name": "citation_source_ids", + "type": "list[str]", + "default": "Field(default_factory=list, max_length=30)" + } + ], + "line": 23, + "doc": "One draft observation, named with the adapter that actually produced it." + }, + { + "name": "CitedSection", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "citation", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "title", + "type": "str", + "default": "Field(default='', max_length=500)" + }, + { + "name": "version", + "type": "str", + "default": "Field(default='', max_length=80)" + } + ], + "line": 40, + "doc": "One resolved public Code section; never a caller-supplied quotation." + }, + { + "name": "AnalysisRecord", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "observations", + "type": "list[AnalysisObservation]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "cited_sections", + "type": "list[CitedSection]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "unavailable", + "type": "list[str]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "runtime", + "type": "dict", + "default": "Field(default_factory=dict)" + }, + { + "name": "review_required", + "type": "bool", + "default": "True" + } + ], + "line": 49, + "doc": "The adapter output that accompanies a saved inspection draft." + }, + { + "name": "AnalysisRecord", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "observations", + "type": "list[AnalysisObservation]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "cited_sections", + "type": "list[CitedSection]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "unavailable", + "type": "list[str]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "runtime", + "type": "dict", + "default": "Field(default_factory=dict)" + }, + { + "name": "review_required", + "type": "bool", + "default": "True" + } + ], + "line": 74, + "doc": "The adapter output that accompanies a saved inspection draft." + }, + { + "name": "Evidence", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "filename", + "type": "str", + "default": "Field(pattern='^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,150}$')" + }, + { + "name": "description", + "type": "str", + "default": "Field(min_length=1, max_length=2000)" + }, + { + "name": "media_type", + "type": "Literal['text/plain', 'image/jpeg', 'image/png', 'image/webp', 'application/pdf', 'audio/webm', 'audio/ogg', 'audio/wav', 'audio/mpeg', 'audio/mp4']", + "default": "" + }, + { + "name": "content_base64", + "type": "str", + "default": "Field(min_length=1, max_length=14000000)" + }, + { + "name": "sha256", + "type": "str", + "default": "Field(pattern='^[a-f0-9]{64}$')" + } + ], + "line": 118, + "doc": "" + }, + { + "name": "SourceLink", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['code']", + "default": "'code'" + }, + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[a-f0-9]{64}$')" + } + ], + "line": 138, + "doc": "" + }, + { + "name": "InspectionInput", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "expected_revision", + "type": "UUID | None", + "default": "None" + }, + { + "name": "title", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "property_reference", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + }, + { + "name": "inspection_reference", + "type": "str", + "default": "Field(min_length=1, max_length=160)" + }, + { + "name": "dataset_kind", + "type": "Literal['municipal', 'fictional']", + "default": "" + }, + { + "name": "inspector_notes", + "type": "str", + "default": "Field(min_length=1, max_length=10000)" + }, + { + "name": "photo_observations", + "type": "list[str]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "voice_notes", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "evidence", + "type": "list[Evidence]", + "default": "Field(default_factory=list, max_length=10)" + }, + { + "name": "linked_sources", + "type": "list[SourceLink]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "assigned_to", + "type": "str", + "default": "Field(default='', max_length=255)" + }, + { + "name": "staff_notes", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "notice_draft", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "review_state", + "type": "Literal['draft', 'follow_up', 'reviewed']", + "default": "'draft'" + }, + { + "name": "review_notes", + "type": "str", + "default": "Field(default='', max_length=4000)" + }, + { + "name": "public_summary", + "type": "str", + "default": "Field(default='', max_length=10000)" + }, + { + "name": "analysis", + "type": "AnalysisRecord | None", + "default": "None" + } + ], + "line": 144, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/workflow_schema.py", + "sha256": "2f8638e3319939ce8b3f7b0b1ef59013f3344b8bcaf9be7d1ad6f3bd4b30ac68", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_inspections/workflow_store.py", + "sha256": "df4ff48879d5f8fe31d71a410a99ed8c359676ab05a267db65e1468cb4764146", + "routes": [], + "models": [], + "configuration": [] + } + ], + "bridge": [ + { + "source": "installed-owned-source/townlight_runtime/inspections_bridge.py", + "sha256": "b7429c3ab988005a198795d6f1dfc3f785c7f96f61410903f8cb0ad38c6f512c", + "routes": [ + { + "method": "POST", + "path": "/desktop/v1/inspections/repeat-cases", + "router": "router", + "prefix_resolved": true, + "name": "repeat_cases", + "signature": "request: Request, body: RepeatLookup, identity=Depends(actor)", + "returns": "", + "line": 93, + "doc": "", + "decorator": "router.post('/repeat-cases')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections/notice-draft", + "router": "router", + "prefix_resolved": true, + "name": "notice", + "signature": "request: Request, body: InspectionInput, identity=Depends(actor)", + "returns": "", + "line": 98, + "doc": "", + "decorator": "router.post('/notice-draft')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/inspections/cases", + "router": "router", + "prefix_resolved": true, + "name": "cases", + "signature": "request: Request, offset: int=Query(0, ge=0, le=100000), identity=Depends(actor)", + "returns": "", + "line": 105, + "doc": "", + "decorator": "router.get('/cases')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections/cases", + "router": "router", + "prefix_resolved": true, + "name": "create_case", + "signature": "request: Request, body: InspectionInput, identity=Depends(actor)", + "returns": "", + "line": 110, + "doc": "", + "decorator": "router.post('/cases')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/inspections/cases/{case_id}", + "router": "router", + "prefix_resolved": true, + "name": "case", + "signature": "request: Request, case_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 115, + "doc": "", + "decorator": "router.get('/cases/{case_id}')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections/cases/{case_id}/revisions", + "router": "router", + "prefix_resolved": true, + "name": "revise", + "signature": "request: Request, case_id: UUID, body: InspectionInput, identity=Depends(actor)", + "returns": "", + "line": 120, + "doc": "", + "decorator": "router.post('/cases/{case_id}/revisions')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/inspections/cases/{case_id}/history", + "router": "router", + "prefix_resolved": true, + "name": "history", + "signature": "request: Request, case_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 125, + "doc": "", + "decorator": "router.get('/cases/{case_id}/history')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections/cases/{case_id}/packets", + "router": "router", + "prefix_resolved": true, + "name": "packet", + "signature": "request: Request, case_id: UUID, body: Packet, identity=Depends(actor)", + "returns": "", + "line": 135, + "doc": "", + "decorator": "router.post('/cases/{case_id}/packets')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/inspections/packets/{packet_id}", + "router": "router", + "prefix_resolved": true, + "name": "document", + "signature": "request: Request, packet_id: UUID, identity=Depends(actor)", + "returns": "", + "line": 140, + "doc": "", + "decorator": "router.get('/packets/{packet_id}')", + "errors": [] + }, + { + "method": "GET", + "path": "/desktop/v1/inspections/evidence/supported-types", + "router": "router", + "prefix_resolved": true, + "name": "supported_types", + "signature": "identity=Depends(actor)", + "returns": "", + "line": 179, + "doc": "The media types this deployment's product model actually accepts.", + "decorator": "router.get('/evidence/supported-types')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections/evidence/retain", + "router": "router", + "prefix_resolved": true, + "name": "retain", + "signature": "request: Request, body: EvidenceItems, identity=Depends(actor)", + "returns": "", + "line": 188, + "doc": "", + "decorator": "router.post('/evidence/retain')", + "errors": [] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections/media/analyse", + "router": "router", + "prefix_resolved": true, + "name": "media_analyse", + "signature": "request: Request, body: MediaAnalysis, identity=Depends(actor)", + "returns": "", + "line": 199, + "doc": "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.", + "decorator": "router.post('/media/analyse')", + "errors": [ + "HTTPException(503, str(exc))" + ] + }, + { + "method": "POST", + "path": "/desktop/v1/inspections/connections/search", + "router": "router", + "prefix_resolved": true, + "name": "connections", + "signature": "request: Request, body: Search, identity=Depends(actor)", + "returns": "", + "line": 234, + "doc": "", + "decorator": "router.post('/connections/search')", + "errors": [] + } + ], + "models": [ + { + "name": "RepeatLookup", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "property_reference", + "type": "str", + "default": "Field(min_length=1, max_length=1000)" + } + ], + "line": 88, + "doc": "" + }, + { + "name": "Packet", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "expected_revision", + "type": "UUID", + "default": "" + }, + { + "name": "visibility", + "type": "Literal['staff_only', 'records_copy']", + "default": "" + } + ], + "line": 129, + "doc": "" + }, + { + "name": "EvidenceItem", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "filename", + "type": "str", + "default": "Field(min_length=1, max_length=151)" + }, + { + "name": "media_type", + "type": "str", + "default": "Field(min_length=1, max_length=80)" + }, + { + "name": "description", + "type": "str", + "default": "Field(default='', max_length=2000)" + }, + { + "name": "content_base64", + "type": "str", + "default": "Field(min_length=1, max_length=14000000)" + }, + { + "name": "sha256", + "type": "str", + "default": "Field(pattern='^[a-f0-9]{64}$')" + } + ], + "line": 144, + "doc": "" + }, + { + "name": "EvidenceItems", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "items", + "type": "list[EvidenceItem]", + "default": "Field(min_length=1, max_length=10)" + } + ], + "line": 152, + "doc": "" + }, + { + "name": "CodeLink", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['code']", + "default": "'code'" + }, + { + "name": "source_id", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[a-f0-9]{64}$')" + } + ], + "line": 156, + "doc": "" + }, + { + "name": "MediaAnalysis", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "items", + "type": "list[EvidenceItem]", + "default": "Field(min_length=1, max_length=10)" + }, + { + "name": "code_links", + "type": "list[CodeLink]", + "default": "Field(default_factory=list, max_length=30)" + }, + { + "name": "inspector_supplied_text", + "type": "str", + "default": "Field(default='', max_length=10000)" + } + ], + "line": 162, + "doc": "" + }, + { + "name": "Search", + "bases": [ + "Model" + ], + "fields": [ + { + "name": "provider", + "type": "Literal['code']", + "default": "" + }, + { + "name": "query", + "type": "str", + "default": "Field(min_length=1, max_length=500)" + } + ], + "line": 228, + "doc": "" + } + ], + "configuration": [] + } + ] + }, + "station": { + "package": "townlight_station", + "source": [ + { + "source": "installed-owned-source/townlight_station/__init__.py", + "sha256": "0e4ae6948a7b82358592fa123efcb0f2f19edd0322d93e8077da9db1dcde1ccc", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/air.py", + "sha256": "501f3ab5cd85ef7409e692496b8ab8146c3f894a0c3c963fb40d44a71088a97f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/airplay.py", + "sha256": "49efe58ba56e37260c24e9ac329f942f6520c3f16d341b0d4ece803750ce0988", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/api.py", + "sha256": "ac098e06290f5888924bb7a211a3925107161c9e01634f998f7303f05a854b18", + "routes": [ + { + "method": "GET", + "path": "/health", + "router": "app", + "prefix_resolved": true, + "name": "health", + "signature": "", + "returns": "", + "line": 79, + "doc": "", + "decorator": "app.get('/health')", + "errors": [] + }, + { + "method": "GET", + "path": "/v1/identity", + "router": "app", + "prefix_resolved": true, + "name": "identity", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 84, + "doc": "", + "decorator": "app.get('/v1/identity')", + "errors": [] + }, + { + "method": "POST", + "path": "/v1/recordings", + "router": "app", + "prefix_resolved": true, + "name": "capture", + "signature": "data: Capture, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 89, + "doc": "", + "decorator": "app.post('/v1/recordings', status_code=202)", + "errors": [ + "HTTPException(422, 'Select one recorded file or live input; live input preserves embedded captions')", + "HTTPException(422, 'Configured live input not found')", + "HTTPException(422, 'Source file missing or exceeds configured limit')", + "HTTPException(422, 'Caption sidecar missing or too large')", + "HTTPException(409, 'Agenda item does not belong to this meeting')", + "HTTPException(409, 'Station is busy; live recording must start immediately')", + "HTTPException(429, 'Station queue is full; no capture accepted')", + "HTTPException(409, 'Idempotency key already describes different source evidence')" + ] + }, + { + "method": "GET", + "path": "/v1/recordings/{identity}", + "router": "app", + "prefix_resolved": true, + "name": "get_record", + "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 187, + "doc": "", + "decorator": "app.get('/v1/recordings/{identity}')", + "errors": [] + }, + { + "method": "GET", + "path": "/v1/recordings/{identity}/content", + "router": "app", + "prefix_resolved": true, + "name": "content", + "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 191, + "doc": "", + "decorator": "app.get('/v1/recordings/{identity}/content')", + "errors": [ + "HTTPException(409, 'Recording is not complete')", + "HTTPException(409, 'Recording integrity failure')" + ] + }, + { + "method": "POST", + "path": "/v1/recordings/{identity}/retry", + "router": "app", + "prefix_resolved": true, + "name": "retry", + "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 202, + "doc": "", + "decorator": "app.post('/v1/recordings/{identity}/retry', status_code=202)", + "errors": [ + "HTTPException(404, 'Recording not found')", + "HTTPException(409, 'Only failed/interrupted recordings can be retried')", + "HTTPException(409, 'A live gap cannot be retried; start a new recording')" + ] + }, + { + "method": "GET", + "path": "/v1/live-sources", + "router": "app", + "prefix_resolved": true, + "name": "live_sources", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 215, + "doc": "", + "decorator": "app.get('/v1/live-sources')", + "errors": [] + }, + { + "method": "GET", + "path": "/v1/recordings", + "router": "app", + "prefix_resolved": true, + "name": "list_records", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 220, + "doc": "", + "decorator": "app.get('/v1/recordings')", + "errors": [] + }, + { + "method": "POST", + "path": "/v1/recordings/{identity}/stop", + "router": "app", + "prefix_resolved": true, + "name": "stop_live", + "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 226, + "doc": "", + "decorator": "app.post('/v1/recordings/{identity}/stop', status_code=202)", + "errors": [ + "HTTPException(404, 'Recording not found')", + "HTTPException(409, 'This recording is not live')", + "HTTPException(409, 'Recording already ended')" + ] + } + ], + "models": [ + { + "name": "Capture", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "meeting_id", + "type": "UUID", + "default": "" + }, + { + "name": "agenda_ids", + "type": "list[UUID]", + "default": "Field(default_factory=list, max_length=100)" + }, + { + "name": "source_file", + "type": "str | None", + "default": "Field(default=None, pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}$')" + }, + { + "name": "live_source_id", + "type": "str | None", + "default": "Field(default=None, pattern='^[A-Za-z0-9_-]{1,64}$')" + }, + { + "name": "captions_file", + "type": "str | None", + "default": "Field(default=None, pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}\\\\.srt$')" + }, + { + "name": "idempotency_key", + "type": "str", + "default": "Field(min_length=1, max_length=100)" + } + ], + "line": 34, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/boundary.py", + "sha256": "e3b39156fb3fd3e0c4ff1dc9370ce133b9163ee689eeb4be0f5e235833e5336e", + "routes": [], + "models": [ + { + "name": "Settings", + "bases": [], + "fields": [ + { + "name": "data", + "type": "Path", + "default": "" + }, + { + "name": "database_url", + "type": "str", + "default": "" + }, + { + "name": "suite_url", + "type": "str", + "default": "" + }, + { + "name": "media_source", + "type": "Path", + "default": "" + }, + { + "name": "media_python", + "type": "Path", + "default": "" + }, + { + "name": "media_runtime", + "type": "Path", + "default": "" + }, + { + "name": "ffprobe", + "type": "Path", + "default": "" + }, + { + "name": "max_seconds", + "type": "int", + "default": "7200" + }, + { + "name": "max_bytes", + "type": "int", + "default": "2147483647" + }, + { + "name": "width", + "type": "int", + "default": "1920" + }, + { + "name": "height", + "type": "int", + "default": "1080" + }, + { + "name": "fps", + "type": "int", + "default": "30" + }, + { + "name": "bitrate_kbps", + "type": "int", + "default": "6000" + } + ], + "line": 45, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/cli.py", + "sha256": "ffbd1fc7ce709ff255d4b5f190fda532d395c9febddf5c281fdff3345f19a9c9", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/live.py", + "sha256": "a35de110d5dbfdcf0b98425baf4b664fc4d0324c640c737086936dbe17adc829", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/media_job.py", + "sha256": "15237eaa872c9772c548aaf57dced25ec51a343489b894a462d95de19507e59b", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/operations.py", + "sha256": "69019673d277ee4850d4dd1789e0576b6883d684b0f1ead2be9f965cfdf7b7d2", + "routes": [ + { + "method": "POST", + "path": "/v1/schedules", + "router": "app", + "prefix_resolved": true, + "name": "create_schedule", + "signature": "data: ScheduleRequest, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 106, + "doc": "", + "decorator": "app.post('/v1/schedules', status_code=202)", + "errors": [ + "HTTPException(422, 'Select one recorded file or live input; live input preserves embedded captions')", + "HTTPException(422, 'Configured live input not found')", + "HTTPException(422, 'Source file missing from managed ingest')", + "HTTPException(422, 'Caption sidecar missing from managed ingest')", + "HTTPException(409, 'Agenda item does not belong to this meeting')" + ] + }, + { + "method": "GET", + "path": "/v1/schedules", + "router": "app", + "prefix_resolved": true, + "name": "list_schedules", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 143, + "doc": "", + "decorator": "app.get('/v1/schedules')", + "errors": [] + }, + { + "method": "POST", + "path": "/v1/schedules/{identity}/cancel", + "router": "app", + "prefix_resolved": true, + "name": "cancel_schedule", + "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 151, + "doc": "", + "decorator": "app.post('/v1/schedules/{identity}/cancel', status_code=202)", + "errors": [ + "HTTPException(409, 'Only a schedule that has not started can be cancelled')" + ] + }, + { + "method": "POST", + "path": "/v1/playouts", + "router": "app", + "prefix_resolved": true, + "name": "create_playout", + "signature": "data: PlayoutRequest, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 163, + "doc": "", + "decorator": "app.post('/v1/playouts', status_code=202)", + "errors": [ + "HTTPException(404, 'Recording not found')", + "HTTPException(409, 'Only a complete, verified recording can be committed to air')" + ] + }, + { + "method": "GET", + "path": "/v1/playouts", + "router": "app", + "prefix_resolved": true, + "name": "list_playouts", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 187, + "doc": "", + "decorator": "app.get('/v1/playouts')", + "errors": [] + }, + { + "method": "GET", + "path": "/v1/playouts/{identity}", + "router": "app", + "prefix_resolved": true, + "name": "get_playout", + "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 194, + "doc": "", + "decorator": "app.get('/v1/playouts/{identity}')", + "errors": [ + "HTTPException(404, 'Playout not found')" + ] + }, + { + "method": "GET", + "path": "/v1/on-air", + "router": "app", + "prefix_resolved": true, + "name": "on_air", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 203, + "doc": "", + "decorator": "app.get('/v1/on-air')", + "errors": [] + }, + { + "method": "POST", + "path": "/v1/on-air/live", + "router": "app", + "prefix_resolved": true, + "name": "live_override", + "signature": "data: LiveOverrideRequest, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 215, + "doc": "Put a configured live input on air, in place of the scheduled program.", + "decorator": "app.post('/v1/on-air/live', status_code=202)", + "errors": [ + "HTTPException(422, 'Configured live input not found')" + ] + }, + { + "method": "POST", + "path": "/v1/on-air/return-to-schedule", + "router": "app", + "prefix_resolved": true, + "name": "return_to_schedule", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 232, + "doc": "", + "decorator": "app.post('/v1/on-air/return-to-schedule', status_code=202)", + "errors": [] + }, + { + "method": "POST", + "path": "/v1/playouts/{identity}/approve", + "router": "app", + "prefix_resolved": true, + "name": "approve", + "signature": "identity: UUID, data: ApprovalRequest, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 243, + "doc": "", + "decorator": "app.post('/v1/playouts/{identity}/approve', status_code=202)", + "errors": [ + "HTTPException(409, 'Only a rendered playout can be approved for public playback')" + ] + }, + { + "method": "POST", + "path": "/v1/playouts/{identity}/publish", + "router": "app", + "prefix_resolved": true, + "name": "publish", + "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 256, + "doc": "", + "decorator": "app.post('/v1/playouts/{identity}/publish', status_code=202)", + "errors": [ + "HTTPException(404, 'Playout not found')", + "HTTPException(409, 'Explicit staff approval is required before public playback')" + ] + }, + { + "method": "GET", + "path": "/v1/public/playback/{identity}", + "router": "app", + "prefix_resolved": true, + "name": "public_playback", + "signature": "identity: UUID", + "returns": "", + "line": 285, + "doc": "", + "decorator": "app.get('/v1/public/playback/{identity}')", + "errors": [ + "HTTPException(404, 'Playback not found')", + "HTTPException(409, 'Playback integrity failure')" + ] + }, + { + "method": "GET", + "path": "/v1/public/playback/{identity}/captions", + "router": "app", + "prefix_resolved": true, + "name": "public_captions", + "signature": "identity: UUID", + "returns": "", + "line": 301, + "doc": "", + "decorator": "app.get('/v1/public/playback/{identity}/captions')", + "errors": [ + "HTTPException(404, 'Captions not found')", + "HTTPException(409, 'Caption integrity failure')" + ] + }, + { + "method": "GET", + "path": "/v1/public/playback/{identity}/program", + "router": "app", + "prefix_resolved": true, + "name": "public_program", + "signature": "identity: UUID", + "returns": "", + "line": 315, + "doc": "", + "decorator": "app.get('/v1/public/playback/{identity}/program')", + "errors": [ + "HTTPException(404, 'Playback not found')", + "HTTPException(409, 'Playback integrity failure')" + ] + } + ], + "models": [ + { + "name": "ScheduleRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "meeting_id", + "type": "UUID", + "default": "" + }, + { + "name": "agenda_ids", + "type": "list[UUID]", + "default": "Field(default_factory=list, max_length=100)" + }, + { + "name": "source_file", + "type": "str | None", + "default": "Field(default=None, pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}$')" + }, + { + "name": "live_source_id", + "type": "str | None", + "default": "Field(default=None, pattern='^[A-Za-z0-9_-]{1,64}$')" + }, + { + "name": "captions_file", + "type": "str | None", + "default": "Field(default=None, pattern='^[A-Za-z0-9][A-Za-z0-9_.-]{0,180}\\\\.srt$')" + }, + { + "name": "start_at", + "type": "datetime", + "default": "" + }, + { + "name": "idempotency_key", + "type": "str", + "default": "Field(min_length=1, max_length=100)" + } + ], + "line": 58, + "doc": "" + }, + { + "name": "PlayoutRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "recording_id", + "type": "UUID", + "default": "" + }, + { + "name": "mode", + "type": "str", + "default": "Field(pattern='^(dry-run|commit)$')" + }, + { + "name": "idempotency_key", + "type": "str", + "default": "Field(min_length=1, max_length=100)" + } + ], + "line": 69, + "doc": "" + }, + { + "name": "ApprovalRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "note", + "type": "str", + "default": "Field(min_length=3, max_length=500)" + } + ], + "line": 76, + "doc": "" + }, + { + "name": "LiveOverrideRequest", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "live_source_id", + "type": "str", + "default": "Field(pattern='^[A-Za-z0-9_-]{1,64}$')" + }, + { + "name": "reason", + "type": "str", + "default": "Field(min_length=3, max_length=200)" + } + ], + "line": 81, + "doc": "An on-air override naming an administrator-configured live input." + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/operator.py", + "sha256": "6471894a1240b611a2bf006867ce79848630f6dc69270e29e54b71dbb26f3837", + "routes": [ + { + "method": "POST", + "path": "/v1/operator-ticket", + "router": "app", + "prefix_resolved": true, + "name": "issue", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 51, + "doc": "", + "decorator": "app.post('/v1/operator-ticket')", + "errors": [ + "HTTPException(429, 'Too many outstanding operator launches')" + ] + }, + { + "method": "POST", + "path": "/operator/session", + "router": "app", + "prefix_resolved": true, + "name": "exchange", + "signature": "data: Ticket, request: Request", + "returns": "", + "line": 60, + "doc": "", + "decorator": "app.post('/operator/session')", + "errors": [ + "HTTPException(401, 'Launch link expired or already used; reopen Station from the signed-in staff session')", + "HTTPException(429, 'Operator session capacity reached')" + ] + }, + { + "method": "POST", + "path": "/operator/logout", + "router": "app", + "prefix_resolved": true, + "name": "logout", + "signature": "request: Request", + "returns": "", + "line": 75, + "doc": "", + "decorator": "app.post('/operator/logout')", + "errors": [] + }, + { + "method": "GET", + "path": "/operator/catalog", + "router": "app", + "prefix_resolved": true, + "name": "catalog", + "signature": "proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 82, + "doc": "", + "decorator": "app.get('/operator/catalog')", + "errors": [] + }, + { + "method": "GET", + "path": "/operator/meeting/{identity}", + "router": "app", + "prefix_resolved": true, + "name": "meeting", + "signature": "identity: UUID, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 102, + "doc": "", + "decorator": "app.get('/operator/meeting/{identity}')", + "errors": [] + }, + { + "method": "POST", + "path": "/operator/handoff", + "router": "app", + "prefix_resolved": true, + "name": "handoff", + "signature": "data: Handoff, proof: str | None=Header(default=None, alias='X-Townlight-Session')", + "returns": "", + "line": 106, + "doc": "", + "decorator": "app.post('/operator/handoff')", + "errors": [ + "HTTPException(result.status_code if result.status_code in (401, 403, 404, 409, 422) else 503, 'Records did not accept the recording. Check your Records role and request, then retry.')", + "HTTPException(503, 'Records unavailable. Retry safely; existing attachments are preserved.')" + ] + }, + { + "method": "GET", + "path": "/", + "router": "app", + "prefix_resolved": true, + "name": "page", + "signature": "", + "returns": "", + "line": 124, + "doc": "", + "decorator": "app.get('/')", + "errors": [] + }, + { + "method": "GET", + "path": "/operator.js", + "router": "app", + "prefix_resolved": true, + "name": "script", + "signature": "", + "returns": "", + "line": 128, + "doc": "", + "decorator": "app.get('/operator.js')", + "errors": [] + }, + { + "method": "GET", + "path": "/operator.css", + "router": "app", + "prefix_resolved": true, + "name": "style", + "signature": "", + "returns": "", + "line": 132, + "doc": "", + "decorator": "app.get('/operator.css')", + "errors": [] + } + ], + "models": [ + { + "name": "Ticket", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "ticket", + "type": "str", + "default": "Field(min_length=32, max_length=128)" + } + ], + "line": 13, + "doc": "" + }, + { + "name": "Handoff", + "bases": [ + "BaseModel" + ], + "fields": [ + { + "name": "request_id", + "type": "UUID", + "default": "" + }, + { + "name": "recording_id", + "type": "UUID", + "default": "" + }, + { + "name": "expected_sha256", + "type": "str", + "default": "Field(pattern='^[0-9a-f]{64}$')" + } + ], + "line": 18, + "doc": "" + } + ], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/packaging.py", + "sha256": "e4b1cbdfaab908f44d8acafb0e024fa99439a66eaedfaeb2655a63293b626e82", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/store.py", + "sha256": "d9aca0003057897a435c7c310559620f727a1703d625bd87af5c7c505d7e3fbd", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/vod_job.py", + "sha256": "dfb3669fa0331fdb481cf765825e67cdf8432ed8c40eff9b5f2b7b34f42648f8", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/windows_service.py", + "sha256": "ed2c3b73b8033413b2d28700a686ee6f71f01db11b3d95c4a2d2109d340c782f", + "routes": [], + "models": [], + "configuration": [] + }, + { + "source": "installed-owned-source/townlight_station/worker.py", + "sha256": "f026f53950f3e7dc881831ad1c15818caf5fed27cb2f01fd3ebb0992121be2a1", + "routes": [], + "models": [], + "configuration": [] + } + ], + "bridge": [] + } + } +} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 8ec3c9c..c52be20 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.

    civiccore 1.3.0.dev1AGPL-3.0-onlyPrivate beta · Windows fresh-install scope
    For IT administrators and platform maintainers

    What the workflow delivers

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

    Connected evidence

    All products use selected Core contracts. Core does not create unrestricted access between products. Notice and Access are supporting components, rather than additional products in this nine-product beta.

    Know the beta boundary

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

    Architecture

    Where the evidence goes

    Townlight Core architecture and evidence flow

    All products use selected Core contracts. Core does not create unrestricted access between products. Notice and Access are supporting components, rather than additional products in this nine-product beta.

    Evidence rather than promises

    Selected staff workflows passed.

    The signed private candidate passed normal first-run and selected synthetic workflows in a fresh Windows Sandbox profile. This is not a claim that every screen, vendor, upgrade or city equipment configuration has been certified.

    Read the exact acceptance and limits →

    Ready to evaluate?

    Begin with the manual and the identified private candidate from the beta coordinator. Configure the chosen test site and have its staff review source applicability and run the existing workflows.

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

    A shared foundation for accountable municipal work.

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

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

    What the workflow delivers

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

    Connected evidence

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

    Know the beta boundary

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

    Architecture

    Where the evidence goes

    Townlight Core architecture and evidence flow

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

    Evidence rather than promises

    Candidate installed acceptance remains pending.

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

    Read the exact acceptance and limits →

    Ready to evaluate?

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

    \ No newline at end of file diff --git a/docs/job-artifacts.md b/docs/job-artifacts.md index 365c72e..cb2b60b 100644 --- a/docs/job-artifacts.md +++ b/docs/job-artifacts.md @@ -1,6 +1,6 @@ # Claim-bound ingest and media artifacts -`civiccore.tasks.artifacts` is the shared answer to one question: *may this derived file +`townlight_core.tasks.artifacts` is the shared answer to one question: *may this derived file become durable, and does the job that produced it still own the work?* It is the executable part of the `C1.jobs` adapter gap ("consumers must enforce claim-bound artifact receipts"), built on the queue contract in [job-leases.md](job-leases.md). It is **not** a media @@ -63,7 +63,7 @@ symlink-privilege case) cover identity binding, every refusal reason, traversal path refusal, idempotency, name conflict, staging cleanup and tamper detection. Real PostgreSQL acceptance (`work/beta-foundations/core-job-adapters-01/harness.py`, 9/9 -checks, 0 skips, head `civiccore_0009_job_artifacts`): a claimed synthetic job publishes +checks, 0 skips, head `townlight_core_0009_job_artifacts`): a claimed synthetic job publishes three derived artifacts (chunked text, chunks JSON, and metadata measured from a stdlib-generated 0.25 s WAV), bound to the job identity, claim token, recorder and source hashes. Expired-lease, superseded-token, cancelled and unattributed acceptances are refused diff --git a/docs/job-leases.md b/docs/job-leases.md index f67233c..e2c008c 100644 --- a/docs/job-leases.md +++ b/docs/job-leases.md @@ -2,7 +2,7 @@ The existing Core PostgreSQL queue is extended rather than replaced. The lease/claim pattern is adapted from TownReporter's `src/lib/news/jobs.ts` at the inspected donor baseline `ab9984bce2e5806c021ebb7435642b2c0fa98b08`. It does not transplant the newsroom application or model/provider routing. -Apply Core migrations through `civiccore_0005_job_leases`. Enqueue serializes idempotency admission and rejects a reused key with different module/type/payload/audit subject. Claims have a random token and deadline. Expired work is reclaimed with a new token, with a bounded failed-attempt count. Completion, failure and heartbeat require current unexpired ownership. Cancellation records its actor and fences further results. +Apply Core migrations through `townlight_core_0005_job_leases`. Enqueue serializes idempotency admission and rejects a reused key with different module/type/payload/audit subject. Claims have a random token and deadline. Expired work is reclaimed with a new token, with a bounded failed-attempt count. Completion, failure and heartbeat require current unexpired ownership. Cancellation records its actor and fences further results. Existing same-session `claim_next_local_task` then complete/fail calls retain compatibility through the token captured in that session. A different session must explicitly carry the claim token. A caller cannot acquire authority by simply reloading a task row. Applications must authorize queue operations before invoking the library, including module/department scope for cancellation. @@ -10,6 +10,6 @@ The CLI uses `run_leased_task`: it commits the claim before execution, renews it A fenced job result is not an exactly-once promise for external side effects. Handlers must use an idempotent artifact/operation receipt and verify their current claim before authoritative writes. Native child termination and media/provider containment are the handler's responsibility; this queue does not falsely certify external cleanup. Consumer transcription/extraction adapters and their acceptance remain work. -Claim-bound **artifact acceptance** now exists as `civiccore.tasks.artifacts` (migration `civiccore_0009_job_artifacts`): a derived file is published only inside a configured store root, only for the job identity and live claim token carried by the claimed envelope, with a computed and re-verified sha256 and an attributed append-only receipt. `civiccore.platform.task_queue.require_active_claim` is the read-only fence it calls before the authoritative write. See [job-artifacts.md](job-artifacts.md) and [ADR-0010](adr/ADR-0010-claim-bound-artifacts.md). It adds no transcription, OCR, transcoding, embedding or provider call; consumer adapters, large-original storage and retention/redaction remain work. +Claim-bound **artifact acceptance** now exists as `townlight_core.tasks.artifacts` (migration `townlight_core_0009_job_artifacts`): a derived file is published only inside a configured store root, only for the job identity and live claim token carried by the claimed envelope, with a computed and re-verified sha256 and an attributed append-only receipt. `townlight_core.platform.task_queue.require_active_claim` is the read-only fence it calls before the authoritative write. See [job-artifacts.md](job-artifacts.md) and [ADR-0010](adr/ADR-0010-claim-bound-artifacts.md). It adds no transcription, OCR, transcoding, embedding or provider call; consumer adapters, large-original storage and retention/redaction remain work. Verified on actual isolated PostgreSQL: concurrent duplicate submission, changed-payload rejection, expired-claim recovery, stale success/failure rejection, heartbeat preservation beyond one lease, attributed cancellation, bounded timeout and same-session compatibility. No installed job worker was changed. diff --git a/docs/module-inventory.md b/docs/module-inventory.md index 1c4232e..0b73ba4 100644 --- a/docs/module-inventory.md +++ b/docs/module-inventory.md @@ -4,7 +4,7 @@ Status: private beta candidate (Core 1.3.0.dev1 source). Not released, not insta packaged. See [ADR-0008](adr/ADR-0008-beta-module-inventory.md) for the decision record and `outputs/beta-plan/core-module-inventory-01/` for executed evidence. -`civiccore.platform.inventory` records what one deployment scope *declares* it has installed and +`townlight_core.platform.inventory` records what one deployment scope *declares* it has installed and enabled, and derives deterministic suggestions from those declarations. It is the installed-module half of CORE-08 / `C1.catalog.modules`. @@ -14,13 +14,13 @@ half of CORE-08 / `C1.catalog.modules`. endpoint. There is no network call anywhere in this module. * **Not an installer.** No package is downloaded, installed, enabled, disabled, repaired or uninstalled here, and no runtime action is triggered. -* **Not the municipal systems catalog.** `civiccore.catalog` describes *vendor systems* (domains, +* **Not the municipal systems catalog.** `townlight_core.catalog` describes *vendor systems* (domains, vendors, protocol templates). This module describes *Townlight module packages*. A catalog row never implies a module is installed, and an inventory row never implies a vendor is connected. The two do not share tables or rows. * **Not a second resolver.** Admission, minimum Core version, dependency minimums, transitive blocking and required cycles all come from - `civiccore.platform.modules.build_module_registry`. This module only stores declarations and + `townlight_core.platform.modules.build_module_registry`. This module only stores declarations and asks that resolver what they admit. * **Not proof.** A recommendation is advice over declared metadata. It does not prove a package is present, running, healthy or licensed. @@ -28,7 +28,7 @@ half of CORE-08 / `C1.catalog.modules`. ## Public surface ```python -from civiccore.platform import ( +from townlight_core.platform import ( ModuleInventory, ModuleInventoryEntry, ModuleRecommendation, record_inventory, current_inventory, inventory_revision, inventory_history, require_installed, module_recommendations, @@ -36,8 +36,8 @@ from civiccore.platform import ( ) ``` -Import these from `civiccore.platform` (as with `civiccore.catalog` and -`civiccore.exemptions.history`), not from the package root. +Import these from `townlight_core.platform` (as with `townlight_core.catalog` and +`townlight_core.exemptions.history`), not from the package root. ### Declaring an inventory @@ -47,7 +47,7 @@ outcome = await record_inventory( ModuleInventory( scope_id="city-a", # caller-supplied deployment scope revision=1, # next revision; append-only - civiccore_version="1.3.0.dev1", + townlight_core_version="1.3.0.dev1", entries=[ModuleInventoryEntry(module_id="records", version="1.8.0", enabled=True, manifest=manifest)], ), @@ -76,7 +76,7 @@ declared and compatible"), and plain `operator_action` copy. | `install` | The package was handed in as available, is not declared installed, and every required dependency would be satisfied. | | `enable` | Declared installed but switched off, and turning it on would be admitted. | | `resolve-dependency` | A required module dependency is missing, below its minimum version, blocked, or cyclically required. | -| `upgrade-core` | The module needs a newer CivicCore than this deployment declares. | +| `upgrade-core` | The module needs a newer Townlight Core than this deployment declares. | | `not-supported` | The module does not support the declared install profile (e.g. `windows_local`). | A module that is installed, enabled and admitted produces **no** recommendation. Silence is not @@ -106,12 +106,12 @@ history cannot be rewritten even outside this library. ## Persistence -Migration `civiccore_0007_module_inventory` (down_revision `civiccore_0006_rule_history`) adds, +Migration `townlight_core_0007_module_inventory` (down_revision `townlight_core_0006_rule_history`) adds, additively: -* `civiccore_module_inventory` — one row per `(scope_id, revision)`: profile, declared - CivicCore version, content SHA-256, recorder, time. -* `civiccore_module_inventory_entries` — one row per declared module: version, enabled flag and +* `townlight_core_module_inventory` — one row per `(scope_id, revision)`: profile, declared + Townlight Core version, content SHA-256, recorder, time. +* `townlight_core_module_inventory_entries` — one row per declared module: version, enabled flag and the full manifest as `jsonb`, keyed `(scope_id, revision, module_id)` with a composite foreign key to the header. diff --git a/docs/ops/README.md b/docs/ops/README.md new file mode 100644 index 0000000..56f6dc4 --- /dev/null +++ b/docs/ops/README.md @@ -0,0 +1,18 @@ +# Core operations documentation and historical evidence + +The current candidate is `townlight-core` 1.3.0.dev2 with principal import +`townlight_core`. Its README, user manual and governing `AGENTS.md` describe +current source and fresh-install boundaries. Signed Windows installed acceptance +for the coordinated naming, Access and Notice candidate remains pending. + +The CO-3 ledger, CO-4 report, CO-7 freeze readiness and CO-9 release/audit reports +are historical records for their identified releases. Their original filenames, +organization/package identities, commands, URLs and receipt hashes are preserved. +The historical provenance policy and release recovery status likewise describe +their dated release lines. They do not certify this renamed candidate or provide +current installation commands. The dated municipal ingestion proof under +`../qa/` remains an original proof for its own inputs. + +Historical records are exempt from the current naming exception registry; that +exemption does not authorize old current package/import names or product titles. +Do not relabel a historical artifact to satisfy a current dependency or gate. diff --git a/docs/ops/cleanroom-harness.md b/docs/ops/cleanroom-harness.md index e0e721b..01e9b3e 100644 --- a/docs/ops/cleanroom-harness.md +++ b/docs/ops/cleanroom-harness.md @@ -1,4 +1,4 @@ - + # Townlight Core Cleanroom Harness @@ -22,7 +22,7 @@ then runs an offline smoke with Docker networking disabled. From a fresh clone: ```bash -bash scripts/run-civiccore-cleanroom.sh +bash scripts/run-townlight_core-cleanroom.sh ``` The host must have Docker and a usable Python interpreter on `PATH`. The @@ -33,13 +33,13 @@ comparison. The script defaults to two runs so auditors can compare stable manifests: ```bash -CLEANROOM_RUN_COUNT=2 bash scripts/run-civiccore-cleanroom.sh +CLEANROOM_RUN_COUNT=2 bash scripts/run-townlight_core-cleanroom.sh ``` Evidence is written to: ```text -docs/evidence/co6-civiccore-cleanroom-/ +docs/evidence/co6-townlight_core-cleanroom-/ ``` ## Pinned Inputs @@ -74,9 +74,9 @@ runs pass when those stable manifest hashes match. Network is allowed only for provisioning and verification endpoints: -- `https://github.com/CivicSuite/civiccore.git` -- `https://github.com/CivicSuite/civiccore/releases/download/v0.22.1/*` -- `https://api.github.com/repos/CivicSuite/civiccore/*` +- `https://github.com/Townlight/townlight_core.git` +- `https://github.com/Townlight/townlight_core/releases/download/v0.22.1/*` +- `https://api.github.com/repos/Townlight/townlight_core/*` - `https://github.com/sigstore/cosign/releases/download/v3.0.6/cosign-linux-amd64` - `https://pypi.org/*` - `https://files.pythonhosted.org/*` diff --git a/docs/ops/release-attestation.schema.json b/docs/ops/release-attestation.schema.json index fc34910..0e4bae3 100644 --- a/docs/ops/release-attestation.schema.json +++ b/docs/ops/release-attestation.schema.json @@ -1,14 +1,14 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://civicsuite.dev/schemas/release-attestation.v1.json", - "title": "CivicSuite Release Attestation", + "$id": "https://townlight.dev/schemas/release-attestation.v1.json", + "title": "Townlight Release Attestation", "type": "object", "additionalProperties": false, "required": ["schema_version", "subject", "build", "artifacts", "evidence_bundles"], "properties": { "schema_version": { "const": 1, - "description": "Versioned CivicSuite release-attestation contract." + "description": "Versioned Townlight release-attestation contract." }, "subject": { "type": "object", diff --git a/docs/ops/release-signing.md b/docs/ops/release-signing.md index 4c323e7..f49bced 100644 --- a/docs/ops/release-signing.md +++ b/docs/ops/release-signing.md @@ -1,8 +1,8 @@ # Release Signing and Provenance Townlight Core is the canonical home for Townlight release-provenance gate logic. -Downstream modules should call `python -m civiccore.release_provenance` or a -thin local wrapper around `civiccore.release_provenance.main()`. +Downstream modules should call `python -m townlight_core.release_provenance` or a +thin local wrapper around `townlight_core.release_provenance.main()`. Release provenance is a pre-flight gate, not post-publication forensics. A failing gate produces no release assets. There is no dev-process exemption, no @@ -25,7 +25,7 @@ The acceptable release shape is: `docs/ops/release-attestation.schema.json`. 4. Serialize the attestation canonically with sorted JSON object keys, no extra whitespace, and UTF-8 bytes. In Python, use - `civiccore.release_provenance.canonical_json_bytes()`. + `townlight_core.release_provenance.canonical_json_bytes()`. 5. Sign the attestation with keyless Sigstore/cosign from GitHub Actions OIDC. 6. Run the adversarial fixture suite before checking the real release: @@ -37,7 +37,7 @@ The acceptable release shape is: ```bash python scripts/verify-release-provenance.py vX.Y.Z \ - --repo CivicSuite/civiccore \ + --repo Townlight/townlight_core \ --attestation release-attestation.json \ --bundle release-attestation.json.bundle \ --artifacts-dir dist \ @@ -50,7 +50,7 @@ The acceptable release shape is: The exact Sigstore certificate identity must be pinned per repo and per tag: ```text -https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vX.Y.Z +https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vX.Y.Z ``` Do not replace this with an org-wide or repo-wide wildcard. A wildcard requires @@ -87,12 +87,12 @@ For online verification, download the release assets and run: ```bash cosign verify-blob release-attestation.json \ --bundle release-attestation.json.bundle \ - --certificate-identity "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vX.Y.Z" \ + --certificate-identity "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vX.Y.Z" \ --certificate-oidc-issuer https://token.actions.githubusercontent.com sha256sum -c SHA256SUMS.txt python scripts/verify-release-provenance.py vX.Y.Z \ - --repo CivicSuite/civiccore \ + --repo Townlight/townlight_core \ --attestation release-attestation.json \ --bundle release-attestation.json.bundle \ --artifacts-dir . @@ -130,7 +130,7 @@ review environment cannot validate the bundle, the auditor treats that as offline reviewer can distinguish "signature invalid" from "reviewer lacks the required trust-root material." -## CivicCore v0.22.0 Historical Defect Statement +## Townlight Core v0.22.0 Historical Defect Statement Historical pre-baseline artifact: `v0.22.0` @@ -148,7 +148,7 @@ Reproducer after the new model is active: ```bash python scripts/verify-release-provenance.py v0.22.0 \ - --repo CivicSuite/civiccore \ + --repo Townlight/townlight_core \ --attestation release-attestation.json \ --bundle release-attestation.json.bundle \ --artifacts-dir . @@ -184,10 +184,10 @@ instead of inventing a false path. The strengthened gate surfaced an org-wide historical provenance baseline problem during the synthetic development phase: all 119 checked historical -CivicSuite release tags failed under the earlier tag-signature bar, split +Townlight release tags failed under the earlier tag-signature bar, split between lightweight tags and unsigned annotated tag objects. That finding is now understood as evidence that GitHub-native tags cannot carry the trust -burden for CivicSuite. +burden for Townlight. Historical releases are disclosed honestly rather than mass-deleted. The new baseline begins with releases that include Sigstore-signed release attestations @@ -227,9 +227,9 @@ actual file. The historical provenance disclosure is operative policy as of 2026-05-05 and lives at `docs/ops/historical-provenance.md`. -The policy names `civiccore v0.22.1`, released 2026-05-05 at 16:23:36Z, as the -first attested CivicCore baseline release and links the live release -attestation, CivicCore Tier 1 retrofit ledger, and CO-4 cross-module retrofit +The policy names `townlight_core v0.22.1`, released 2026-05-05 at 16:23:36Z, as the +first attested Townlight Core baseline release and links the live release +attestation, Townlight Core Tier 1 retrofit ledger, and CO-4 cross-module retrofit report. Do not change the baseline release, edit historical public release notes, or diff --git a/docs/ops/sigstore-release-workflow-draft.yml b/docs/ops/sigstore-release-workflow-draft.yml index a4c5422..02faff7 100644 --- a/docs/ops/sigstore-release-workflow-draft.yml +++ b/docs/ops/sigstore-release-workflow-draft.yml @@ -5,7 +5,7 @@ # 1. build release artifacts # 2. generate release-attestation.json using canonical JSON # 3. sign the attestation with keyless Sigstore/cosign from this workflow -# 4. run the CivicCore provenance gate against fixtures and the prospective tag +# 4. run the TownlightCore provenance gate against fixtures and the prospective tag # 5. publish only after the preflight gate passes name: release-with-sigstore-attestation diff --git a/docs/process/5-lens-self-audit.md b/docs/process/5-lens-self-audit.md index 68c3e34..2728d35 100644 --- a/docs/process/5-lens-self-audit.md +++ b/docs/process/5-lens-self-audit.md @@ -1,13 +1,13 @@ # 5-lens self-audit (before every push) -This is the implementation-side counterpart to the verification-side audit protocol at `C:\Users\scott\OneDrive\Desktop\Claude\CIVICSUITE_AUDIT_PROTOCOL.md`. The verification protocol governs how the auditing agent (Claude) audits work that has already landed. This document governs how the implementing agent (Codex) audits its own work *before* a push, so the verification turn finds less to fix. +This is the implementation-side counterpart to the verification-side audit protocol at `C:\Users\scott\OneDrive\Desktop\Claude\TOWNLIGHT_AUDIT_PROTOCOL.md`. The verification protocol governs how the auditing agent (Claude) audits work that has already landed. This document governs how the implementing agent (Codex) audits its own work *before* a push, so the verification turn finds less to fix. Both Codex and Claude read this file. The rule body, the artifact-state checklist, and the report format below are shared. The implementing-agent-side discipline (chat-promise rejection) and the verifier-side discipline (mandatory 10-section output) live in their respective files. ## Roles in this project - **Implementing agent:** Codex. Writes code, docs, status artifacts across 26 module repos. Runs this 5-lens self-audit before every push. -- **Auditing agent:** Claude. Verifies Codex's claims against actual artifacts. Produces the mandatory 10-section output defined in `CIVICSUITE_AUDIT_PROTOCOL.md`. +- **Auditing agent:** Claude. Verifies Codex's claims against actual artifacts. Produces the mandatory 10-section output defined in `TOWNLIGHT_AUDIT_PROTOCOL.md`. ## The rule @@ -27,30 +27,30 @@ Each lens is *hostile* — assume the diff lies until evidence proves otherwise. 2. **UX.** For any user-visible string, message, label, or workflow change: read it cold as if you'd never seen the feature. Does it make sense to a first-time operator? Does it match the copy in adjacent module READMEs (terminology, voice, formality)? Does an error path have a "Next step" line? Does the install script's "Generated secrets visible via docker exec env" warning actually appear in the doc's table of contents? Hostile means: assume the user is confused until the copy proves it doesn't confuse them. -3. **Tests.** For any logic / data-flow / public-interface change: is there a test? Does it run? Does it lock the behavior, or does it merely *exercise* the code path? Does it actually execute in CI, or does it skip? CivicSuite-specific: does the test cover the LIVE-STATE classification path AND the SHAPE-GUARD negative-assertion path? Hostile means: a green check is not a real assertion; "passes" is not "covers." Skip predicates lie by default — verify they don't apply. +3. **Tests.** For any logic / data-flow / public-interface change: is there a test? Does it run? Does it lock the behavior, or does it merely *exercise* the code path? Does it actually execute in CI, or does it skip? Townlight-specific: does the test cover the LIVE-STATE classification path AND the SHAPE-GUARD negative-assertion path? Hostile means: a green check is not a real assertion; "passes" is not "covers." Skip predicates lie by default — verify they don't apply. -4. **Docs.** For every code change: did the umbrella CHANGELOG move with it? The per-module CHANGELOG? The `.agent-workflows/HANDOFF_.md` (per-module if applicable, umbrella always)? The umbrella PR body? The `docs/release-recovery-status.md`? The audit punchlist row in `audit-civicsuite-2026-05-09/sprint-punchlist.md`? Hostile means: a doc that's silent about a change you just made is wrong, not "OK because the code is right." +4. **Docs.** For every code change: did the umbrella CHANGELOG move with it? The per-module CHANGELOG? The `.agent-workflows/HANDOFF_.md` (per-module if applicable, umbrella always)? The umbrella PR body? The `docs/release-recovery-status.md`? The audit punchlist row in `audit-townlight-2026-05-09/sprint-punchlist.md`? Hostile means: a doc that's silent about a change you just made is wrong, not "OK because the code is right." 5. **QA.** Read the final state, not the diff. Open the changed files as the next agent walking in cold. Are there contradictions across files? Does the umbrella CHANGELOG say one thing while the module CHANGELOG says another? Does the audit punchlist top-totals row reconcile with the row count? Are status words used per the audit protocol (`Closed` / `Implemented` / `Open` / `Deferred by Scott` / `Blocked`, never `done` / `ready` / `taggable` / `shippable`)? Does `verify-suite-state.py --remote-only` show what the CHANGELOG claims? Hostile means: assume drift until cross-file reading proves there is none. ## Artifact-state checklist -This is the specific drift that has bitten CivicSuite most. Run every item before push. +This is the specific drift that has bitten Townlight most. Run every item before push. -- [ ] Audit punchlist (`audit-civicsuite-2026-05-09/sprint-punchlist.md`) top-totals row matches the actual row count by severity. Every `[x]` row has a `Cross-ref: ` AND a proof citation (commit SHA, PR number, file path, or verifier output). +- [ ] Audit punchlist (`audit-townlight-2026-05-09/sprint-punchlist.md`) top-totals row matches the actual row count by severity. Every `[x]` row has a `Cross-ref: ` AND a proof citation (commit SHA, PR number, file path, or verifier output). - [ ] No row says `(this commit)` — replace with the actual SHA before pushing. - [ ] Umbrella PR body matches branch state: no stale `N of M` counts, no checkbox left unchecked for an item now Closed, no missing run IDs. Has `release-tag` label if and only if the PR includes truth artifacts (spec, verifier, modules.json, CHANGELOG, release-recovery-status, downstream-pins). - [ ] Umbrella CHANGELOG matches what shipped — no "All exit criteria met" if there was a carve-out, no stale test counts. Per-module CHANGELOG also updated for module-level changes. -- [ ] `.agent-workflows/HANDOFF_.md` names the current branch, current HEAD, current PR, current tag (if any), and the CivicSuite-wide verifier output (`VERIFY-SUITE-STATE: PASSED` or named failures). +- [ ] `.agent-workflows/HANDOFF_.md` names the current branch, current HEAD, current PR, current tag (if any), and the Townlight-wide verifier output (`VERIFY-SUITE-STATE: PASSED` or named failures). - [ ] Verification log on tag candidates: no "Ready to tag" claim without the tag-blocking gates Closed with proof. The release-lockstep-gate green status is captured. - [ ] Status words: no `done`, `green`, `ready`, `taggable`, `shippable`, `complete` unless the release gate actually supports them (`VERIFY-SUITE-STATE: PASSED` + `release-lockstep-gate` green + release object exists with all artifacts). - [ ] Working tree clean except intentional/declared uncommitted work. The pre-existing dirty `installer/dist/` and `installer/generated/` files predate the recovery sweep — state this explicitly in the report rather than silently accepting them. - [ ] Cleanroom claims qualified: CI cleanroom skips are CI-only; local cleanroom skips are local-only; never collapse them. - [ ] Whole-PR diff scope check: `git diff --name-status main..HEAD` must contain only the slice's intended file set. `git status --short` is not sufficient; sibling commits can land unrelated files. - [ ] Non-ASCII scan on every new/modified durable doc: em-dashes, arrows, section signs should be ASCII unless intentional. Run `LC_ALL=C.UTF-8 grep -P '[^\x00-\x7F]' ` before push. -- [ ] **SHA citations are full-length.** Every SHA256 citation is exactly 64 hex characters; every SHA1 citation is exactly 40. Run `grep -E '[a-f0-9]{56,63}\b' ` and inspect any hits as candidates for truncation. Origin receipt: CivicClerk B1 handoff 2026-05-10 required PR #119 to correct. +- [ ] **SHA citations are full-length.** Every SHA256 citation is exactly 64 hex characters; every SHA1 citation is exactly 40. Run `grep -E '[a-f0-9]{56,63}\b' ` and inspect any hits as candidates for truncation. Origin receipt: Townlight Meetings B1 handoff 2026-05-10 required PR #119 to correct. - [ ] **release-lockstep-gate alignment.** If the umbrella PR has the `release-tag` label, verify every required truth artifact path appears in `gh pr diff `: spec §18 truth table, `scripts/verify-suite-state.py` (if version constants changed), `installer/modules.json`, `CHANGELOG.md`, `docs/release-recovery-status.md`, `docs/release-lockstep/downstream-pins.md`. Origin receipt: release-lockstep-gate exists because Sprint A landed 7 false v1.0 tags that bypassed truth coordination. -- [ ] **Tag-move record present if any tag moves happened.** Completion handoff includes a tag-move table (Tag / Initial SHA / Final SHA / Moves / Notes) for every tag that moved during the sprint. Origin receipt: CivicRecords AI v1.5.0 — 4 tag moves recorded. +- [ ] **Tag-move record present if any tag moves happened.** Completion handoff includes a tag-move table (Tag / Initial SHA / Final SHA / Moves / Notes) for every tag that moved during the sprint. Origin receipt: Townlight Records v1.5.0 — 4 tag moves recorded. ## Post-push SHA-propagation step @@ -96,7 +96,7 @@ Artifact-state: [pass | findings: ...] Post-push propagation: [pass | findings: ...] ``` -If any lens has findings, fix before push. If after a push Claude (auditor) still finds drift, that is direct evidence this rule isn't sticking; Claude's directive will add a new artifact-state check to this document or a new entry to section 22 of `CIVICSUITE_AUDIT_PROTOCOL.md`. +If any lens has findings, fix before push. If after a push Claude (auditor) still finds drift, that is direct evidence this rule isn't sticking; Claude's directive will add a new artifact-state check to this document or a new entry to section 22 of `TOWNLIGHT_AUDIT_PROTOCOL.md`. ## Chat-promise rejection @@ -104,7 +104,7 @@ A chat-side promise ("I will keep this in mind") is not a behavior change. The b ## Cross-references -- `C:\Users\scott\OneDrive\Desktop\Claude\CIVICSUITE_AUDIT_PROTOCOL.md` — the verification-side audit protocol (Claude reads this). The mandatory 10-section output shape and the verifier's evidence-pass rules live there. Section 21 ("Implementation-side rule pointer") and section 22 ("Known drift patterns") pair with this document. -- `C:\Users\scott\OneDrive\Desktop\Claude\CIVICSUITE_AUDIT_GATE.md` — the short mandatory gate Claude reads every turn. +- `C:\Users\scott\OneDrive\Desktop\Claude\TOWNLIGHT_AUDIT_PROTOCOL.md` — the verification-side audit protocol (Claude reads this). The mandatory 10-section output shape and the verifier's evidence-pass rules live there. Section 21 ("Implementation-side rule pointer") and section 22 ("Known drift patterns") pair with this document. +- `C:\Users\scott\OneDrive\Desktop\Claude\TOWNLIGHT_AUDIT_GATE.md` — the short mandatory gate Claude reads every turn. - `~/.codex/skills/project-control-plane/SKILL.md` — Codex's skill that points at this file as the before-every-push discipline. - `C:\Users\scott\OneDrive\Desktop\Claude\agentic-pipeline\` — the agentic-pipeline plugin. v0.2 governs execution (4-phase module-release). v0.3 governs audit handoff (this document + the protocol + the gate). diff --git a/docs/rule-history.md b/docs/rule-history.md index f247500..0b0cef7 100644 --- a/docs/rule-history.md +++ b/docs/rule-history.md @@ -2,17 +2,17 @@ `exemption_rules` holds a consumer's *working* rules. It can be edited, disabled or renumbered, so it cannot prove which cited text produced a past suggestion. Core therefore -keeps a separate append-only history in `civiccore_rule_versions`, added by -`civiccore_0006_rule_history`. See [ADR-0006](adr/ADR-0006-rule-version-history.md). +keeps a separate append-only history in `townlight_core_rule_versions`, added by +`townlight_core_0006_rule_history`. See [ADR-0006](adr/ADR-0006-rule-version-history.md). -Apply Core migrations through `civiccore_0006_rule_history`. The migration is additive: no +Apply Core migrations through `townlight_core_0006_rule_history`. The migration is additive: no existing table, row or column is altered, so a consumer that never calls the history API keeps its current behaviour. ## Writing ```python -from civiccore.exemptions.history import record_rule_version +from townlight_core.exemptions.history import record_rule_version outcome = await record_rule_version( session, @@ -60,12 +60,12 @@ row that belongs to another jurisdiction. Retrieval never falls back to the work an edited working row cannot masquerade as a cited version. `current_rules(session, state_code, rule_ids=None)` returns only the latest version of each -rule as `civiccore.exemptions.Rule`, ordered by `(category, rule_id)`, ready for -`civiccore.exemptions.evaluate`. A superseded definition is never evaluated as current. +rule as `townlight_core.exemptions.Rule`, ordered by `(category, rule_id)`, ready for +`townlight_core.exemptions.evaluate`. A superseded definition is never evaluated as current. ## Database guarantees -Triggers refuse UPDATE and DELETE on `civiccore_rule_versions`, and refuse an insert that +Triggers refuse UPDATE and DELETE on `townlight_core_rule_versions`, and refuse an insert that binds an existing rule id to a second jurisdiction. Rollback of the migration is a no-op on purpose: deleting cited history would destroy provenance. Recover through backup/restore. diff --git a/docs/scaffold.md b/docs/scaffold.md index 807adc6..ac38c17 100644 --- a/docs/scaffold.md +++ b/docs/scaffold.md @@ -1,5 +1,5 @@ -# `civiccore.scaffold` +# `townlight_core.scaffold` The generator that turns one validated module id into a working Townlight module skeleton. ADR-0007 records the contract; ADR-0003 remains the historical deferral. @@ -8,8 +8,8 @@ ADR-0007 records the contract; ADR-0003 remains the historical deferral. | Path (inside the new project directory) | Purpose | | --- | --- | -| `pyproject.toml` | AGPL-3.0-only module package with a `civiccore>=` floor. | -| `src//manifest.json` | Validates through `civiccore.platform.ModuleManifest`. | +| `pyproject.toml` | AGPL-3.0-only module package with a `townlight_core>=` floor. | +| `src//manifest.json` | Validates through `townlight_core.platform.ModuleManifest`. | | `src//manifest.py` | `load_manifest()` — typed access, validated on load. | | `src//app.py` | Minimal FastAPI staff surface using Core bearer auth. | | `migrations/env.py` | Alembic env owning only the module schema; creates the schema before configuring the context. | @@ -20,8 +20,8 @@ ADR-0007 records the contract; ADR-0003 remains the historical deferral. ## CLI ``` -python -m civiccore.scaffold plan notes --name "Notes" --description "..." # JSON plan -python -m civiccore.scaffold generate notes --name "Notes" --description "..." --target ./modules +python -m townlight_core.scaffold plan notes --name "Notes" --description "..." # JSON plan +python -m townlight_core.scaffold generate notes --name "Notes" --description "..." --target ./modules ``` `generate` refuses an existing directory, an unsafe module id, or a non-directory target and @@ -39,7 +39,7 @@ token and no insecure fallback. `work/beta-foundations/scaffold-01/pg-acceptance/harness.py` starts one disposable, owned PostgreSQL 17 cluster, applies Core's real chain with -`civiccore.migrations.runner.upgrade_to_head` (head `civiccore_0006_rule_history`), then runs +`townlight_core.migrations.runner.upgrade_to_head` (head `townlight_core_0006_rule_history`), then runs the generated module's own chain from `migrations/`. It asserts the module stamps `civicnotes_0001_baseline`, creates only schema `civicnotes`, leaves every Core table and the Core revision untouched, is idempotent on re-run, survives a cluster stop/start, and diff --git a/pyproject.toml b/pyproject.toml index cceb796..f0c8f23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,8 +3,8 @@ requires = ["setuptools>=77.0.3", "wheel"] build-backend = "setuptools.build_meta" [project] -name = "civiccore" -version = "1.3.0.dev1" +name = "townlight-core" +version = "1.3.0.dev2" description = "Townlight shared platform package - migrations, shared SQLAlchemy base, LLM abstraction, audit/provenance, document ingestion, ingest and connector contracts, connector sync primitives, connector delta planning, reusable mock-city proof contracts, connector security helpers, startup config validation helpers, schedule validation helpers, encrypted config primitives, notice helpers, onboarding profile helpers, search access helpers, small auth helpers, manifests, exports, city profile primitives, and Windows-local module/runtime contracts" readme = "README.md" requires-python = ">=3.11" @@ -12,7 +12,7 @@ license = "AGPL-3.0-only" license-files = ["LICENSE", "LICENSE-CODE", "LICENSE-DOCS"] authors = [ { name = "Scott Converse" }, - { name = "CivicSuite contributors" }, + { name = "Townlight contributors" }, ] keywords = [ "civic-tech", @@ -23,7 +23,7 @@ keywords = [ "self-hosted", "local-llm", "ollama", - "civicsuite", + "townlight", ] classifiers = [ "Development Status :: 4 - Beta", @@ -36,10 +36,10 @@ classifiers = [ "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Libraries :: Application Frameworks", ] -# Dep pins below mirror civicrecords-ai/backend/pyproject.toml exactly for the -# subsystems CivicCore extracts (auth, audit, LLM, ingest, search, connectors, +# Dep pins below mirror townlight_records/backend/pyproject.toml exactly for the +# subsystems TownlightCore extracts (auth, audit, LLM, ingest, search, connectors, # notifications, onboarding, exemptions, verification, models, migrations, -# scaffold). civicrecords-ai pins requires-python = ">=3.12"; CivicCore widens +# scaffold). townlight_records pins requires-python = ">=3.12"; TownlightCore widens # to ">=3.11" because it is a shared library and must support modules that # may not have moved to 3.12 yet. dependencies = [ @@ -99,10 +99,10 @@ Issues = "https://github.com/townlight/core/issues" [tool.setuptools.packages.find] where = ["."] -include = ["civiccore*"] +include = ["townlight_core*"] [tool.setuptools.package-data] -civiccore = ["migrations/alembic.ini"] +townlight_core = ["migrations/alembic.ini"] [tool.pytest.ini_options] asyncio_mode = "auto" diff --git a/scripts/build-release-attestation.py b/scripts/build-release-attestation.py index c5127a0..5f1979d 100644 --- a/scripts/build-release-attestation.py +++ b/scripts/build-release-attestation.py @@ -3,7 +3,7 @@ import argparse from pathlib import Path -from civiccore.release_provenance import build_release_attestation, canonical_json_bytes +from townlight_core.release_provenance import build_release_attestation, canonical_json_bytes def main() -> int: diff --git a/scripts/check-tier1-ledger.py b/scripts/check-tier1-ledger.py index a8e68e6..45e919e 100644 --- a/scripts/check-tier1-ledger.py +++ b/scripts/check-tier1-ledger.py @@ -44,8 +44,9 @@ def _entry_tags(entries: list[dict[str, Any]]) -> list[str]: def validate_ledger(ledger: dict[str, Any]) -> list[dict[str, Any]]: if ledger.get("schema_version") != 1: raise LedgerError("schema_version must be 1") + # This immutable historical ledger retains its original organization/name. if ledger.get("repo") != "CivicSuite/civiccore": - raise LedgerError("repo must be CivicSuite/civiccore") + raise LedgerError("historical ledger identity does not match its original repository") if ledger.get("baseline_tag") != "v0.22.1": raise LedgerError("baseline_tag must be v0.22.1") @@ -138,7 +139,7 @@ def main(argv: list[str] | None = None) -> int: type=Path, default=Path("docs/ops/civiccore-tier1-retrofit-ledger.json"), ) - parser.add_argument("--repo", default="CivicSuite/civiccore") + parser.add_argument("--repo", default="townlight/core") parser.add_argument( "--live", action="store_true", diff --git a/scripts/cleanroom/civiccore-cleanroom-runner.sh b/scripts/cleanroom/townlight_core-cleanroom-runner.sh old mode 100755 new mode 100644 similarity index 90% rename from scripts/cleanroom/civiccore-cleanroom-runner.sh rename to scripts/cleanroom/townlight_core-cleanroom-runner.sh index f24bb5d..d144244 --- a/scripts/cleanroom/civiccore-cleanroom-runner.sh +++ b/scripts/cleanroom/townlight_core-cleanroom-runner.sh @@ -5,7 +5,7 @@ MODE="${1:-online}" EVIDENCE_DIR="${CLEANROOM_EVIDENCE_DIR:-/evidence}" RUN_LABEL="${CLEANROOM_RUN_LABEL:-cleanroom}" RELEASE_TAG="${CLEANROOM_RELEASE_TAG:-v0.22.1}" -RELEASE_BASE_URL="https://github.com/CivicSuite/civiccore/releases/download/${RELEASE_TAG}" +RELEASE_BASE_URL="https://github.com/townlight/core/releases/download/${RELEASE_TAG}" OIDC_ISSUER="https://token.actions.githubusercontent.com" WORKFLOW_IDENTITY="https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/${RELEASE_TAG}" @@ -67,8 +67,8 @@ metadata.update( "updated_at_utc": datetime.now(UTC).isoformat().replace("+00:00", "Z"), "platform": platform.platform(), "python": platform.python_version(), - "target_commit": os.environ["CIVICCORE_COMMIT"], - "repo_url": os.environ.get("CIVICCORE_REPO_URL", ""), + "target_commit": os.environ["TOWNLIGHT_CORE_COMMIT"], + "repo_url": os.environ.get("TOWNLIGHT_CORE_REPO_URL", ""), } ) metadata_path.write_text(json.dumps(metadata, indent=2, sort_keys=True) + "\n", encoding="utf-8") @@ -114,18 +114,18 @@ offline() { export MODE RUN_LABEL EVIDENCE_DIR write_run_metadata run_step "offline-runtime-smoke" python - <<'PY' -import civiccore +import townlight_core import tomllib from pathlib import Path project = tomllib.loads(Path("pyproject.toml").read_text(encoding="utf-8")) -assert civiccore.__version__ == project["project"]["version"] -assert callable(civiccore.validate_manifest) -assert callable(civiccore.import_meeting_payload) -assert callable(civiccore.plan_vendor_delta_request) -assert callable(civiccore.validate_cron_expression) -assert callable(civiccore.compute_onboarding_status) -assert callable(civiccore.verify_persisted_audit_chain) +assert townlight_core.__version__ == project["project"]["version"] +assert callable(townlight_core.validate_manifest) +assert callable(townlight_core.import_meeting_payload) +assert callable(townlight_core.plan_vendor_delta_request) +assert callable(townlight_core.validate_cron_expression) +assert callable(townlight_core.compute_onboarding_status) +assert callable(townlight_core.verify_persisted_audit_chain) print("offline runtime smoke OK") PY run_step "offline-release-provenance-fixtures" \ @@ -176,8 +176,8 @@ manifest = { "result": "PASS", "target": { "repo": "CivicSuite/civiccore", - "repo_url": os.environ.get("CIVICCORE_REPO_URL", ""), - "commit": os.environ["CIVICCORE_COMMIT"], + "repo_url": os.environ.get("TOWNLIGHT_CORE_REPO_URL", ""), + "commit": os.environ["TOWNLIGHT_CORE_COMMIT"], }, "container": { "base_image": os.environ["CLEANROOM_BASE_IMAGE"], @@ -196,8 +196,8 @@ manifest = { }, "network": { "allowed_during_provisioning_and_verification": [ - "https://github.com/CivicSuite/civiccore.git", - "https://github.com/CivicSuite/civiccore/releases/download/v0.22.1/*", + "https://github.com/townlight/core.git", + "https://github.com/townlight/core/releases/download/v0.22.1/*", "https://api.github.com/repos/CivicSuite/civiccore/*", "https://github.com/sigstore/cosign/releases/download/v3.0.6/cosign-linux-amd64", "https://pypi.org/*", diff --git a/scripts/run-civiccore-cleanroom.sh b/scripts/run-townlight_core-cleanroom.sh old mode 100755 new mode 100644 similarity index 88% rename from scripts/run-civiccore-cleanroom.sh rename to scripts/run-townlight_core-cleanroom.sh index caeb447..0d76a0c --- a/scripts/run-civiccore-cleanroom.sh +++ b/scripts/run-townlight_core-cleanroom.sh @@ -7,13 +7,13 @@ cd "${REPO_ROOT}" TARGET_COMMIT="${1:-$(git rev-parse HEAD)}" TARGET_COMMIT="$(git rev-parse "${TARGET_COMMIT}^{commit}")" SHORT_SHA="${TARGET_COMMIT:0:12}" -EVIDENCE_ROOT="${2:-docs/evidence/co6-civiccore-cleanroom-${SHORT_SHA}}" +EVIDENCE_ROOT="${2:-docs/evidence/co6-townlight_core-cleanroom-${SHORT_SHA}}" RUN_COUNT="${CLEANROOM_RUN_COUNT:-2}" -IMAGE_TAG="civiccore-cleanroom:${SHORT_SHA}" -REPO_URL="${CIVICCORE_REPO_URL:-https://github.com/CivicSuite/civiccore.git}" +IMAGE_TAG="townlight_core-cleanroom:${SHORT_SHA}" +REPO_URL="${TOWNLIGHT_CORE_REPO_URL:-https://github.com/townlight/core.git}" if ! command -v docker >/dev/null 2>&1; then - echo "Docker is required to run the CivicCore cleanroom harness." >&2 + echo "Docker is required to run the TownlightCore cleanroom harness." >&2 exit 1 fi @@ -64,9 +64,9 @@ echo "Evidence root: ${EVIDENCE_ROOT}" echo "Run count: ${RUN_COUNT}" DOCKER_BUILDKIT=1 docker build --no-cache --pull --platform linux/amd64 \ - --build-arg "CIVICCORE_REPO_URL=${REPO_URL}" \ - --build-arg "CIVICCORE_COMMIT=${TARGET_COMMIT}" \ - -f cleanroom/civiccore.Dockerfile \ + --build-arg "TOWNLIGHT_CORE_REPO_URL=${REPO_URL}" \ + --build-arg "TOWNLIGHT_CORE_COMMIT=${TARGET_COMMIT}" \ + -f cleanroom/townlight_core.Dockerfile \ -t "${IMAGE_TAG}" \ . @@ -83,21 +83,21 @@ for idx in $(seq 1 "${RUN_COUNT}"); do echo "Running online cleanroom phase: ${label}" MSYS_NO_PATHCONV=1 docker run --rm --platform linux/amd64 --network bridge \ -e "CLEANROOM_RUN_LABEL=${label}" \ - -e "CIVICCORE_COMMIT=${TARGET_COMMIT}" \ + -e "TOWNLIGHT_CORE_COMMIT=${TARGET_COMMIT}" \ -v "${evidence_mount}:/evidence" \ "${IMAGE_TAG}" online echo "Running offline cleanroom phase: ${label}" MSYS_NO_PATHCONV=1 docker run --rm --platform linux/amd64 --network none \ -e "CLEANROOM_RUN_LABEL=${label}" \ - -e "CIVICCORE_COMMIT=${TARGET_COMMIT}" \ + -e "TOWNLIGHT_CORE_COMMIT=${TARGET_COMMIT}" \ -v "${evidence_mount}:/evidence" \ "${IMAGE_TAG}" offline echo "Finalizing cleanroom evidence: ${label}" MSYS_NO_PATHCONV=1 docker run --rm --platform linux/amd64 --network none \ -e "CLEANROOM_RUN_LABEL=${label}" \ - -e "CIVICCORE_COMMIT=${TARGET_COMMIT}" \ + -e "TOWNLIGHT_CORE_COMMIT=${TARGET_COMMIT}" \ -v "${evidence_mount}:/evidence" \ "${IMAGE_TAG}" finalize done @@ -158,7 +158,7 @@ comparison = { ) summary = [ - "# CO-6 CivicCore Cleanroom Harness Evidence", + "# CO-6 TownlightCore Cleanroom Harness Evidence", "", f"Target commit: `{target_commit}`", f"Run count: {run_count}", diff --git a/scripts/verify-release-provenance.py b/scripts/verify-release-provenance.py index 7cc3f37..8f46b0b 100644 --- a/scripts/verify-release-provenance.py +++ b/scripts/verify-release-provenance.py @@ -5,7 +5,7 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[1])) -from civiccore.release_provenance import main +from townlight_core.release_provenance import main if __name__ == "__main__": diff --git a/scripts/verify-release.sh b/scripts/verify-release.sh index 716f787..158738c 100644 --- a/scripts/verify-release.sh +++ b/scripts/verify-release.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash -# civiccore/scripts/verify-release.sh - civiccore release gate. +# townlight_core/scripts/verify-release.sh - townlight_core release gate. # -# Read-only verification of civiccore's pre-push readiness. Checks: +# Read-only verification of townlight_core's pre-push readiness. Checks: # 1. Test suite (pytest tests/) # 2. Lint (ruff check .) -# 3. Version lockstep between pyproject.toml and civiccore/__init__.py +# 3. Version lockstep between pyproject.toml and townlight_core/__init__.py # 4. Required Rule 9 doc artifacts present on disk # 5. Build artifacts (sdist + wheel via python -m build) # 6. Fresh virtualenv install from the built wheel, exact version check, @@ -66,7 +66,7 @@ dump_failure_diagnostics() { echo "" else echo "## docker compose" - echo "No compose file present; CivicCore release verification is package-only." + echo "No compose file present; TownlightCore release verification is package-only." echo "" fi echo "============================================" @@ -74,7 +74,7 @@ dump_failure_diagnostics() { } info "0. release verification environment" -RELEASE_VENV="$(mktemp -d "${TMPDIR:-/tmp}/civiccore-release-env-XXXXXX")" +RELEASE_VENV="$(mktemp -d "${TMPDIR:-/tmp}/townlight_core-release-env-XXXXXX")" if "${PYTHON_CMD[@]}" -m venv "$RELEASE_VENV"; then VENV_PYTHON="$RELEASE_VENV/bin/python" if [ ! -x "$VENV_PYTHON" ] && [ -x "$RELEASE_VENV/Scripts/python.exe" ]; then @@ -111,17 +111,17 @@ else fail "ruff reported issues" fi -# --- 3. version lockstep (pyproject.toml <-> civiccore/__init__.py) --------- +# --- 3. version lockstep (pyproject.toml <-> townlight_core/__init__.py) --------- info "3. version lockstep" PY_VER=$(grep -oE '^version[[:space:]]*=[[:space:]]*"[^"]+"' pyproject.toml 2>/dev/null \ | head -1 \ | sed -E 's/^version[[:space:]]*=[[:space:]]*"([^"]+)"/\1/' || true) -INIT_VER=$(grep -oE '__version__[[:space:]]*=[[:space:]]*"[^"]+"' civiccore/__init__.py 2>/dev/null \ +INIT_VER=$(grep -oE '__version__[[:space:]]*=[[:space:]]*"[^"]+"' townlight_core/__init__.py 2>/dev/null \ | head -1 \ | sed -E 's/.*"([^"]+)"/\1/' || true) printf ' pyproject.toml %s\n' "${PY_VER:-}" -printf ' civiccore/__init__.py %s\n' "${INIT_VER:-}" +printf ' townlight_core/__init__.py %s\n' "${INIT_VER:-}" if [ -n "$PY_VER" ] && [ -n "$INIT_VER" ] && [ "$PY_VER" = "$INIT_VER" ]; then pass "two surfaces agree on $PY_VER" @@ -172,13 +172,13 @@ from pathlib import Path def main() -> int: - wheels = sorted(glob.glob("dist/civiccore-*.whl")) + wheels = sorted(glob.glob("dist/townlight_core-*.whl")) if not wheels: print("missing built wheel in dist/", file=sys.stderr) return 1 wheel_path = Path(wheels[0]).resolve() - temp_dir = Path(tempfile.mkdtemp(prefix="civiccore-release-")) + temp_dir = Path(tempfile.mkdtemp(prefix="townlight_core-release-")) try: builder = venv.EnvBuilder(with_pip=True) @@ -206,42 +206,42 @@ def main() -> int: "from pathlib import Path; " "import re; " "from importlib.metadata import version; " - "import civiccore; " - "from civiccore.migrations.runner import upgrade_to_head; " + "import townlight_core; " + "from townlight_core.migrations.runner import upgrade_to_head; " "pyproject = Path('pyproject.toml').read_text(encoding='utf-8'); " "match = re.search(r'^version\\s*=\\s*\"([^\"]+)\"', pyproject, re.MULTILINE); " "assert match, 'pyproject.toml version missing'; " "expected_version = match.group(1); " - "assert version('civiccore') == expected_version; " - "assert civiccore.__version__ == expected_version; " + "assert version('townlight_core') == expected_version; " + "assert townlight_core.__version__ == expected_version; " "assert callable(upgrade_to_head); " - "assert callable(civiccore.validate_manifest); " - "assert callable(civiccore.ingest_file); " - "assert callable(civiccore.ingest_bytes); " - "assert callable(civiccore.register_handler); " - "assert civiccore.Document; " - "assert civiccore.DocumentChunk; " - "assert civiccore.DataSource; " - "assert callable(civiccore.import_meeting_payload); " - "assert callable(civiccore.plan_vendor_delta_request); " - "assert callable(civiccore.build_deadline_plan); " - "assert callable(civiccore.evaluate_notice_compliance); " - "assert callable(civiccore.validate_cron_expression); " - "assert callable(civiccore.compute_next_sync_at); " - "assert callable(civiccore.compute_onboarding_status); " - "assert callable(civiccore.next_profile_prompt); " - "assert civiccore.AuditHashChain; " - "assert civiccore.PersistedAuditLogEntry; " - "assert callable(civiccore.compute_persisted_audit_hash); " - "assert callable(civiccore.verify_persisted_audit_chain); " - "assert civiccore.SyncCircuitState; " - "assert civiccore.SyncRunResult; " - "assert civiccore.SyncSourceStatus; " - "assert callable(civiccore.apply_sync_run_result); " - "assert callable(civiccore.build_sync_source_status); " - "assert callable(civiccore.with_http_retry); " - "assert civiccore.CityProfile; " - "assert callable(civiccore.reciprocal_rank_fusion); " + "assert callable(townlight_core.validate_manifest); " + "assert callable(townlight_core.ingest_file); " + "assert callable(townlight_core.ingest_bytes); " + "assert callable(townlight_core.register_handler); " + "assert townlight_core.Document; " + "assert townlight_core.DocumentChunk; " + "assert townlight_core.DataSource; " + "assert callable(townlight_core.import_meeting_payload); " + "assert callable(townlight_core.plan_vendor_delta_request); " + "assert callable(townlight_core.build_deadline_plan); " + "assert callable(townlight_core.evaluate_notice_compliance); " + "assert callable(townlight_core.validate_cron_expression); " + "assert callable(townlight_core.compute_next_sync_at); " + "assert callable(townlight_core.compute_onboarding_status); " + "assert callable(townlight_core.next_profile_prompt); " + "assert townlight_core.AuditHashChain; " + "assert townlight_core.PersistedAuditLogEntry; " + "assert callable(townlight_core.compute_persisted_audit_hash); " + "assert callable(townlight_core.verify_persisted_audit_chain); " + "assert townlight_core.SyncCircuitState; " + "assert townlight_core.SyncRunResult; " + "assert townlight_core.SyncSourceStatus; " + "assert callable(townlight_core.apply_sync_run_result); " + "assert callable(townlight_core.build_sync_source_status); " + "assert callable(townlight_core.with_http_retry); " + "assert townlight_core.CityProfile; " + "assert callable(townlight_core.reciprocal_rank_fusion); " "print('fresh-venv import smoke OK')" ), ], diff --git a/tests/fixtures/release_provenance/00_known_good_sigstore_attestation.json b/tests/fixtures/release_provenance/00_known_good_sigstore_attestation.json index 643f8f8..29ce6de 100644 --- a/tests/fixtures/release_provenance/00_known_good_sigstore_attestation.json +++ b/tests/fixtures/release_provenance/00_known_good_sigstore_attestation.json @@ -18,7 +18,7 @@ "attestation": { "schema_version": 1, "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-good", "tag_ref_type": "commit", "tag_ref_sha": "commit-good", @@ -26,25 +26,25 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-good", + "workflow_identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-good", "workflow_path": ".github/workflows/release.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://token.actions.githubusercontent.com" }, "artifacts": [ { - "name": "civiccore-0.22.0-py3-none-any.whl", + "name": "townlight_core-0.22.0-py3-none-any.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b" } ], "evidence_bundles": [] }, "artifact_payloads": [ - {"name": "civiccore-0.22.0-py3-none-any.whl", "content": "wheel bytes"} + {"name": "townlight_core-0.22.0-py3-none-any.whl", "content": "wheel bytes"} ], "sigstore": { "verified": true, - "identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-good", + "identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-good", "issuer": "https://token.actions.githubusercontent.com" } } diff --git a/tests/fixtures/release_provenance/10_missing_attestation_schema.json b/tests/fixtures/release_provenance/10_missing_attestation_schema.json index 0ae2de4..018d871 100644 --- a/tests/fixtures/release_provenance/10_missing_attestation_schema.json +++ b/tests/fixtures/release_provenance/10_missing_attestation_schema.json @@ -16,7 +16,7 @@ }, "attestation": { "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-missing-schema", "tag_ref_type": "commit", "tag_ref_sha": "commit-good", @@ -24,17 +24,17 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-missing-schema", + "workflow_identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-missing-schema", "workflow_path": ".github/workflows/release.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://token.actions.githubusercontent.com" }, - "artifacts": [{"name": "civiccore-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] + "artifacts": [{"name": "townlight_core-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] }, - "artifact_payloads": [{"name": "civiccore-0.22.0.whl", "content": "wheel bytes"}], + "artifact_payloads": [{"name": "townlight_core-0.22.0.whl", "content": "wheel bytes"}], "sigstore": { "verified": true, - "identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-missing-schema", + "identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-missing-schema", "issuer": "https://token.actions.githubusercontent.com" } } diff --git a/tests/fixtures/release_provenance/20_wrong_workflow_identity.json b/tests/fixtures/release_provenance/20_wrong_workflow_identity.json index 854c2c1..aa226e8 100644 --- a/tests/fixtures/release_provenance/20_wrong_workflow_identity.json +++ b/tests/fixtures/release_provenance/20_wrong_workflow_identity.json @@ -17,7 +17,7 @@ "attestation": { "schema_version": 1, "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-wrong-identity", "tag_ref_type": "commit", "tag_ref_sha": "commit-good", @@ -25,17 +25,17 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/other-module/.github/workflows/release.yml@refs/tags/vfixture-wrong-identity", + "workflow_identity": "https://github.com/Townlight/other-module/.github/workflows/release.yml@refs/tags/vfixture-wrong-identity", "workflow_path": ".github/workflows/release.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://token.actions.githubusercontent.com" }, - "artifacts": [{"name": "civiccore-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] + "artifacts": [{"name": "townlight_core-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] }, - "artifact_payloads": [{"name": "civiccore-0.22.0.whl", "content": "wheel bytes"}], + "artifact_payloads": [{"name": "townlight_core-0.22.0.whl", "content": "wheel bytes"}], "sigstore": { "verified": true, - "identity": "https://github.com/CivicSuite/other-module/.github/workflows/release.yml@refs/tags/vfixture-wrong-identity", + "identity": "https://github.com/Townlight/other-module/.github/workflows/release.yml@refs/tags/vfixture-wrong-identity", "issuer": "https://token.actions.githubusercontent.com" } } diff --git a/tests/fixtures/release_provenance/30_mismatched_artifact_hash.json b/tests/fixtures/release_provenance/30_mismatched_artifact_hash.json index e328d61..cb97d75 100644 --- a/tests/fixtures/release_provenance/30_mismatched_artifact_hash.json +++ b/tests/fixtures/release_provenance/30_mismatched_artifact_hash.json @@ -17,7 +17,7 @@ "attestation": { "schema_version": 1, "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-bad-hash", "tag_ref_type": "commit", "tag_ref_sha": "commit-good", @@ -25,17 +25,17 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-bad-hash", + "workflow_identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-bad-hash", "workflow_path": ".github/workflows/release.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://token.actions.githubusercontent.com" }, - "artifacts": [{"name": "civiccore-0.22.0.whl", "sha256": "c90a090615d6c77dfdc45a02d9d18c7cebe71c0d2213efbc7dd50f7e9ea2dbd5"}] + "artifacts": [{"name": "townlight_core-0.22.0.whl", "sha256": "c90a090615d6c77dfdc45a02d9d18c7cebe71c0d2213efbc7dd50f7e9ea2dbd5"}] }, - "artifact_payloads": [{"name": "civiccore-0.22.0.whl", "content": "wheel bytes"}], + "artifact_payloads": [{"name": "townlight_core-0.22.0.whl", "content": "wheel bytes"}], "sigstore": { "verified": true, - "identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-bad-hash", + "identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-bad-hash", "issuer": "https://token.actions.githubusercontent.com" } } diff --git a/tests/fixtures/release_provenance/40_unexpected_oidc_issuer.json b/tests/fixtures/release_provenance/40_unexpected_oidc_issuer.json index c6f9b06..359cc77 100644 --- a/tests/fixtures/release_provenance/40_unexpected_oidc_issuer.json +++ b/tests/fixtures/release_provenance/40_unexpected_oidc_issuer.json @@ -17,7 +17,7 @@ "attestation": { "schema_version": 1, "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-wrong-issuer", "tag_ref_type": "commit", "tag_ref_sha": "commit-good", @@ -25,17 +25,17 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-wrong-issuer", + "workflow_identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-wrong-issuer", "workflow_path": ".github/workflows/release.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://issuer.example.invalid" }, - "artifacts": [{"name": "civiccore-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] + "artifacts": [{"name": "townlight_core-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] }, - "artifact_payloads": [{"name": "civiccore-0.22.0.whl", "content": "wheel bytes"}], + "artifact_payloads": [{"name": "townlight_core-0.22.0.whl", "content": "wheel bytes"}], "sigstore": { "verified": true, - "identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-wrong-issuer", + "identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-wrong-issuer", "issuer": "https://issuer.example.invalid" } } diff --git a/tests/fixtures/release_provenance/50_transparency_log_unavailable.json b/tests/fixtures/release_provenance/50_transparency_log_unavailable.json index c66e328..b88278b 100644 --- a/tests/fixtures/release_provenance/50_transparency_log_unavailable.json +++ b/tests/fixtures/release_provenance/50_transparency_log_unavailable.json @@ -17,7 +17,7 @@ "attestation": { "schema_version": 1, "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-rekor-offline", "tag_ref_type": "commit", "tag_ref_sha": "commit-good", @@ -25,17 +25,17 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-rekor-offline", + "workflow_identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-rekor-offline", "workflow_path": ".github/workflows/release.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://token.actions.githubusercontent.com" }, - "artifacts": [{"name": "civiccore-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] + "artifacts": [{"name": "townlight_core-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] }, - "artifact_payloads": [{"name": "civiccore-0.22.0.whl", "content": "wheel bytes"}], + "artifact_payloads": [{"name": "townlight_core-0.22.0.whl", "content": "wheel bytes"}], "sigstore": { "availability": "offline", - "identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-rekor-offline", + "identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-rekor-offline", "issuer": "https://token.actions.githubusercontent.com" } } diff --git a/tests/fixtures/release_provenance/60_tag_target_mismatch.json b/tests/fixtures/release_provenance/60_tag_target_mismatch.json index 1dfb6a3..41b499d 100644 --- a/tests/fixtures/release_provenance/60_tag_target_mismatch.json +++ b/tests/fixtures/release_provenance/60_tag_target_mismatch.json @@ -17,7 +17,7 @@ "attestation": { "schema_version": 1, "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-target-mismatch", "tag_ref_type": "commit", "tag_ref_sha": "commit-real", @@ -25,17 +25,17 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-target-mismatch", + "workflow_identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-target-mismatch", "workflow_path": ".github/workflows/release.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://token.actions.githubusercontent.com" }, - "artifacts": [{"name": "civiccore-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] + "artifacts": [{"name": "townlight_core-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] }, - "artifact_payloads": [{"name": "civiccore-0.22.0.whl", "content": "wheel bytes"}], + "artifact_payloads": [{"name": "townlight_core-0.22.0.whl", "content": "wheel bytes"}], "sigstore": { "verified": true, - "identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-target-mismatch", + "identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-target-mismatch", "issuer": "https://token.actions.githubusercontent.com" } } diff --git a/tests/fixtures/release_provenance/70_workflow_rename_identity_drift.json b/tests/fixtures/release_provenance/70_workflow_rename_identity_drift.json index a8ab95b..72c0d3e 100644 --- a/tests/fixtures/release_provenance/70_workflow_rename_identity_drift.json +++ b/tests/fixtures/release_provenance/70_workflow_rename_identity_drift.json @@ -17,7 +17,7 @@ "attestation": { "schema_version": 1, "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-renamed-workflow", "tag_ref_type": "commit", "tag_ref_sha": "commit-good", @@ -25,17 +25,17 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release-renamed.yml@refs/tags/vfixture-renamed-workflow", + "workflow_identity": "https://github.com/Townlight/townlight_core/.github/workflows/release-renamed.yml@refs/tags/vfixture-renamed-workflow", "workflow_path": ".github/workflows/release-renamed.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://token.actions.githubusercontent.com" }, - "artifacts": [{"name": "civiccore-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] + "artifacts": [{"name": "townlight_core-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] }, - "artifact_payloads": [{"name": "civiccore-0.22.0.whl", "content": "wheel bytes"}], + "artifact_payloads": [{"name": "townlight_core-0.22.0.whl", "content": "wheel bytes"}], "sigstore": { "verified": true, - "identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release-renamed.yml@refs/tags/vfixture-renamed-workflow", + "identity": "https://github.com/Townlight/townlight_core/.github/workflows/release-renamed.yml@refs/tags/vfixture-renamed-workflow", "issuer": "https://token.actions.githubusercontent.com" } } diff --git a/tests/fixtures/release_provenance/80_trust_root_rotation.json b/tests/fixtures/release_provenance/80_trust_root_rotation.json index 8dea388..fc5f017 100644 --- a/tests/fixtures/release_provenance/80_trust_root_rotation.json +++ b/tests/fixtures/release_provenance/80_trust_root_rotation.json @@ -17,7 +17,7 @@ "attestation": { "schema_version": 1, "subject": { - "repo": "CivicSuite/civiccore", + "repo": "Townlight/townlight_core", "tag": "vfixture-root-rotation", "tag_ref_type": "commit", "tag_ref_sha": "commit-good", @@ -25,17 +25,17 @@ "target_tree": "tree-good" }, "build": { - "workflow_identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-root-rotation", + "workflow_identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-root-rotation", "workflow_path": ".github/workflows/release.yml", "workflow_run_id": "123456789", "oidc_issuer": "https://token.actions.githubusercontent.com" }, - "artifacts": [{"name": "civiccore-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] + "artifacts": [{"name": "townlight_core-0.22.0.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b"}] }, - "artifact_payloads": [{"name": "civiccore-0.22.0.whl", "content": "wheel bytes"}], + "artifact_payloads": [{"name": "townlight_core-0.22.0.whl", "content": "wheel bytes"}], "sigstore": { "trust_root_status": "rotated", - "identity": "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/vfixture-root-rotation", + "identity": "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/vfixture-root-rotation", "issuer": "https://token.actions.githubusercontent.com" } } diff --git a/tests/test_audit_primitives.py b/tests/test_audit_primitives.py index e57dbff..cf4a08b 100644 --- a/tests/test_audit_primitives.py +++ b/tests/test_audit_primitives.py @@ -6,7 +6,7 @@ import pytest -from civiccore.audit import ( +from townlight_core.audit import ( AuditActor, AuditEvent, AuditHashChain, diff --git a/tests/test_auth_bearer.py b/tests/test_auth_bearer.py index 28a83b2..a562f71 100644 --- a/tests/test_auth_bearer.py +++ b/tests/test_auth_bearer.py @@ -4,7 +4,7 @@ from fastapi import HTTPException from fastapi.security import HTTPAuthorizationCredentials -from civiccore.auth import ( +from townlight_core.auth import ( AuthenticatedPrincipal, authorize_bearer_roles, enforce_trusted_proxy_source, @@ -135,9 +135,9 @@ def test_authorize_bearer_roles_returns_principal_for_allowed_token( def test_resolve_optional_bearer_roles_allows_anonymous_callers_without_config() -> None: principal = resolve_optional_bearer_roles( None, - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="archive search staff access", - token_roles_env_var="CIVICCLERK_AUTH_TOKEN_ROLES", + token_roles_env_var="TOWNLIGHT_MEETINGS_AUTH_TOKEN_ROLES", allowed_roles={"archive_reader"}, ) @@ -148,15 +148,15 @@ def test_resolve_optional_bearer_roles_returns_principal_for_configured_staff_to monkeypatch: pytest.MonkeyPatch, ) -> None: monkeypatch.setenv( - "CIVICCLERK_AUTH_TOKEN_ROLES", + "TOWNLIGHT_MEETINGS_AUTH_TOKEN_ROLES", '{"staff-token": ["archive_reader", "clerk_admin"]}', ) principal = resolve_optional_bearer_roles( HTTPAuthorizationCredentials(scheme="Bearer", credentials="staff-token"), - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="archive search staff access", - token_roles_env_var="CIVICCLERK_AUTH_TOKEN_ROLES", + token_roles_env_var="TOWNLIGHT_MEETINGS_AUTH_TOKEN_ROLES", allowed_roles={"archive_reader"}, ) @@ -168,16 +168,16 @@ def test_resolve_optional_bearer_roles_rejects_present_token_without_allowed_rol monkeypatch: pytest.MonkeyPatch, ) -> None: monkeypatch.setenv( - "CIVICCLERK_AUTH_TOKEN_ROLES", + "TOWNLIGHT_MEETINGS_AUTH_TOKEN_ROLES", '{"staff-token": ["meeting_editor"]}', ) with pytest.raises(HTTPException) as exc_info: resolve_optional_bearer_roles( HTTPAuthorizationCredentials(scheme="Bearer", credentials="staff-token"), - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="archive search staff access", - token_roles_env_var="CIVICCLERK_AUTH_TOKEN_ROLES", + token_roles_env_var="TOWNLIGHT_MEETINGS_AUTH_TOKEN_ROLES", allowed_roles={"archive_reader"}, ) @@ -198,7 +198,7 @@ def test_authorize_trusted_header_roles_requires_principal_header() -> None: with pytest.raises(HTTPException) as exc_info: authorize_trusted_header_roles( {"X-Civic-Roles": "clerk_admin"}, - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", principal_header_name="X-Civic-Principal", roles_header_name="X-Civic-Roles", @@ -209,7 +209,7 @@ def test_authorize_trusted_header_roles_requires_principal_header() -> None: assert exc_info.value.status_code == 401 assert exc_info.value.detail["message"] == "Trusted identity header missing." assert "X-Civic-Principal" in exc_info.value.detail["fix"] - assert "CivicClerk" in exc_info.value.detail["fix"] + assert "TownlightMeetings" in exc_info.value.detail["fix"] assert "staff workflow access" in exc_info.value.detail["fix"] @@ -217,7 +217,7 @@ def test_authorize_trusted_header_roles_requires_role_header() -> None: with pytest.raises(HTTPException) as exc_info: authorize_trusted_header_roles( {"X-Civic-Principal": "clerk@example.gov"}, - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", principal_header_name="X-Civic-Principal", roles_header_name="X-Civic-Roles", @@ -228,7 +228,7 @@ def test_authorize_trusted_header_roles_requires_role_header() -> None: assert exc_info.value.status_code == 401 assert exc_info.value.detail["message"] == "Trusted role header missing." assert "X-Civic-Roles" in exc_info.value.detail["fix"] - assert "CivicClerk" in exc_info.value.detail["fix"] + assert "TownlightMeetings" in exc_info.value.detail["fix"] assert "staff workflow access" in exc_info.value.detail["fix"] @@ -239,7 +239,7 @@ def test_authorize_trusted_header_roles_rejects_underprivileged_identity() -> No "X-Civic-Principal": "clerk@example.gov", "X-Civic-Roles": "records_viewer", }, - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", principal_header_name="X-Civic-Principal", roles_header_name="X-Civic-Roles", @@ -252,7 +252,7 @@ def test_authorize_trusted_header_roles_rejects_underprivileged_identity() -> No assert exc_info.value.detail["required_roles"] == ["clerk_admin", "meeting_editor"] assert "principal" not in exc_info.value.detail assert "principal_roles" not in exc_info.value.detail - assert "CivicClerk" in exc_info.value.detail["fix"] + assert "TownlightMeetings" in exc_info.value.detail["fix"] assert "staff workflow access" in exc_info.value.detail["fix"] @@ -262,7 +262,7 @@ def test_authorize_trusted_header_roles_returns_principal() -> None: "X-Civic-Principal": "clerk@example.gov", "X-Civic-Roles": "meeting_editor, clerk_admin", }, - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", principal_header_name="X-Civic-Principal", roles_header_name="X-Civic-Roles", @@ -281,7 +281,7 @@ def test_authorize_trusted_header_roles_returns_principal() -> None: def test_resolve_optional_trusted_header_roles_allows_anonymous_callers() -> None: principal = resolve_optional_trusted_header_roles( {}, - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", principal_header_name="X-Civic-Principal", roles_header_name="X-Civic-Roles", @@ -298,7 +298,7 @@ def test_resolve_optional_trusted_header_roles_returns_principal_when_present() "X-Civic-Principal": "clerk@example.gov", "X-Civic-Roles": "clerk_admin", }, - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", principal_header_name="X-Civic-Principal", roles_header_name="X-Civic-Roles", @@ -371,15 +371,15 @@ def test_enforce_trusted_proxy_source_requires_allowlist() -> None: with pytest.raises(HTTPException) as exc_info: enforce_trusted_proxy_source( "127.0.0.1", - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", config=config, - trusted_proxy_env_var="CIVICCLERK_STAFF_SSO_TRUSTED_PROXIES", + trusted_proxy_env_var="TOWNLIGHT_MEETINGS_STAFF_SSO_TRUSTED_PROXIES", ) assert exc_info.value.status_code == 503 assert exc_info.value.detail["message"] == "Trusted-header proxy allowlist is missing." - assert "CIVICCLERK_STAFF_SSO_TRUSTED_PROXIES" in exc_info.value.detail["fix"] + assert "TOWNLIGHT_MEETINGS_STAFF_SSO_TRUSTED_PROXIES" in exc_info.value.detail["fix"] def test_enforce_trusted_proxy_source_rejects_invalid_allowlist() -> None: @@ -393,10 +393,10 @@ def test_enforce_trusted_proxy_source_rejects_invalid_allowlist() -> None: with pytest.raises(HTTPException) as exc_info: enforce_trusted_proxy_source( "127.0.0.1", - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", config=config, - trusted_proxy_env_var="CIVICCLERK_STAFF_SSO_TRUSTED_PROXIES", + trusted_proxy_env_var="TOWNLIGHT_MEETINGS_STAFF_SSO_TRUSTED_PROXIES", ) assert exc_info.value.status_code == 503 @@ -415,10 +415,10 @@ def test_enforce_trusted_proxy_source_rejects_untrusted_host() -> None: with pytest.raises(HTTPException) as exc_info: enforce_trusted_proxy_source( "203.0.113.22", - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", config=config, - trusted_proxy_env_var="CIVICCLERK_STAFF_SSO_TRUSTED_PROXIES", + trusted_proxy_env_var="TOWNLIGHT_MEETINGS_STAFF_SSO_TRUSTED_PROXIES", ) assert exc_info.value.status_code == 403 @@ -439,10 +439,10 @@ def test_enforce_trusted_proxy_source_accepts_allowed_host() -> None: enforce_trusted_proxy_source( "10.20.30.40", - service_name="CivicClerk", + service_name="TownlightMeetings", feature_name="staff workflow access", config=config, - trusted_proxy_env_var="CIVICCLERK_STAFF_SSO_TRUSTED_PROXIES", + trusted_proxy_env_var="TOWNLIGHT_MEETINGS_STAFF_SSO_TRUSTED_PROXIES", ) @@ -507,7 +507,7 @@ def fake_compare_digest(left: bytes, right: bytes) -> bool: return False monkeypatch.setenv("CIVIC_TEST_STAFF_API_KEY", "secret") - monkeypatch.setattr("civiccore.auth.staff_key.hmac.compare_digest", fake_compare_digest) + monkeypatch.setattr("townlight_core.auth.staff_key.hmac.compare_digest", fake_compare_digest) dependency = staff_key_gate("CIVIC_TEST_STAFF_API_KEY", "X-CivicTest-Staff-Key") with pytest.raises(HTTPException): diff --git a/tests/test_auth_suite_session.py b/tests/test_auth_suite_session.py index 815a8cf..8303249 100644 --- a/tests/test_auth_suite_session.py +++ b/tests/test_auth_suite_session.py @@ -1,4 +1,4 @@ -"""Contract tests for CivicCore-owned suite staff session tokens.""" +"""Contract tests for TownlightCore-owned suite staff session tokens.""" from __future__ import annotations @@ -6,8 +6,8 @@ import pytest -import civiccore.auth.suite_session as suite_session_module -from civiccore.auth.suite_session import ( +import townlight_core.auth.suite_session as suite_session_module +from townlight_core.auth.suite_session import ( SuiteSessionConfigError, SuiteSessionPrincipal, issue_suite_session_token, @@ -19,7 +19,7 @@ def test_suite_session_token_validates_role_claims_and_rejects_revocation( monkeypatch: pytest.MonkeyPatch, ) -> None: - monkeypatch.setenv("CIVICCORE_SUITE_SESSION_SECRET", "test-secret-with-enough-entropy") + monkeypatch.setenv("TOWNLIGHT_CORE_SUITE_SESSION_SECRET", "test-secret-with-enough-entropy") expires_at = datetime.now(UTC) + timedelta(minutes=15) token = issue_suite_session_token( @@ -49,9 +49,9 @@ def test_suite_session_token_validates_role_claims_and_rejects_revocation( def test_suite_session_secret_is_required_with_actionable_error( monkeypatch: pytest.MonkeyPatch, ) -> None: - monkeypatch.delenv("CIVICCORE_SUITE_SESSION_SECRET", raising=False) + monkeypatch.delenv("TOWNLIGHT_CORE_SUITE_SESSION_SECRET", raising=False) - with pytest.raises(SuiteSessionConfigError, match="CIVICCORE_SUITE_SESSION_SECRET"): + with pytest.raises(SuiteSessionConfigError, match="TOWNLIGHT_CORE_SUITE_SESSION_SECRET"): issue_suite_session_token( subject="admin@example.gov", roles=frozenset({"records_admin"}), @@ -63,9 +63,9 @@ def test_suite_session_revocation_file_survives_process_local_cache_reset( monkeypatch: pytest.MonkeyPatch, tmp_path, ) -> None: - monkeypatch.setenv("CIVICCORE_SUITE_SESSION_SECRET", "test-secret-with-enough-entropy") + monkeypatch.setenv("TOWNLIGHT_CORE_SUITE_SESSION_SECRET", "test-secret-with-enough-entropy") revocation_path = tmp_path / "suite-session-revocations.json" - monkeypatch.setenv("CIVICCORE_SUITE_SESSION_REVOCATION_FILE", str(revocation_path)) + monkeypatch.setenv("TOWNLIGHT_CORE_SUITE_SESSION_REVOCATION_FILE", str(revocation_path)) token = issue_suite_session_token( subject="admin@example.gov", roles=frozenset({"records_admin"}), diff --git a/tests/test_baseline_idempotency.py b/tests/test_baseline_idempotency.py index 1febfd4..dade428 100644 --- a/tests/test_baseline_idempotency.py +++ b/tests/test_baseline_idempotency.py @@ -1,4 +1,4 @@ -"""Idempotency test for civiccore_0001_baseline_v1. Blocks Phase 1 Part A PR merge per ADR-0003 §5.""" +"""Idempotency test for townlight_core_0001_baseline_v1. Blocks Phase 1 Part A PR merge per ADR-0003 §5.""" from __future__ import annotations @@ -18,12 +18,12 @@ ) PostgresContainer = testcontainers.PostgresContainer -from civiccore.migrations.runner import current_revision, upgrade_to_head # noqa: E402 -from civiccore.migrations.versions.civiccore_0001_baseline_v1 import ( # noqa: E402 +from townlight_core.migrations.runner import current_revision, upgrade_to_head # noqa: E402 +from townlight_core.migrations.versions.townlight_core_0001_baseline_v1 import ( # noqa: E402 _SHARED_TABLE_ORDER, ) -EXPECTED_HEAD = "civiccore_0009_job_artifacts" +EXPECTED_HEAD = "townlight_core_0009" def _docker_available() -> bool: @@ -46,7 +46,7 @@ def _docker_available() -> bool: def pg_container(): """Ephemeral Postgres 17 + pgvector container shared across this module's tests. - Uses the same ``pgvector/pgvector:pg17`` image as CivicRecords' docker-compose + Uses the same ``pgvector/pgvector:pg17`` image as TownlightRecords' docker-compose stack so the extension stanza in the baseline migration (``CREATE EXTENSION IF NOT EXISTS vector``) can succeed. Plain ``postgres:17`` lacks the pgvector control file and would fail the ``document_chunks`` table DDL. @@ -135,10 +135,10 @@ def test_baseline_runs_clean_on_empty_db(engine, pg_container): def test_baseline_is_idempotent(engine, pg_container): """Re-running the baseline against an already-populated DB is a no-op. - Proves the ``idempotent_*`` op wrappers (see ``civiccore.migrations.guards``) + Proves the ``idempotent_*`` op wrappers (see ``townlight_core.migrations.guards``) skip existing objects rather than destructively recreating them — which - is what makes the extracted civiccore baseline safe to ship alongside - already-deployed civicrecords databases (ADR-0003 §3). + is what makes the extracted townlight_core baseline safe to ship alongside + already-deployed townlight_records databases (ADR-0003 §3). """ with _database_url_env(pg_container): upgrade_to_head() diff --git a/tests/test_city_profile.py b/tests/test_city_profile.py index 0ae9c7f..a4c9f7f 100644 --- a/tests/test_city_profile.py +++ b/tests/test_city_profile.py @@ -5,7 +5,7 @@ import pytest from pydantic import ValidationError -from civiccore.city_profile import ( +from townlight_core.city_profile import ( CityProfile, DeploymentProfile, ModuleEnablement, @@ -35,7 +35,7 @@ def valid_payload() -> dict: {"name": "permits", "enabled": False, "settings": {"pilot": True}}, ], "default_llm_provider": "ollama", - "file_drop_roots": ["C:/civiccore/dropbox"], + "file_drop_roots": ["C:/townlight_core/dropbox"], "public_contact": { "email": "info@example.gov", "phone": "555-0100", @@ -50,7 +50,7 @@ def test_load_valid_json_profile(tmp_path): assert profile.city_name == "Sampleville" assert profile.timezone == "America/Denver" assert profile.departments[0].slug == "city-clerk" - assert profile.file_drop_roots[0].as_posix().endswith("civiccore/dropbox") + assert profile.file_drop_roots[0].as_posix().endswith("townlight_core/dropbox") assert profile.public_contact["email"] == "info@example.gov" diff --git a/tests/test_cleanroom_harness.py b/tests/test_cleanroom_harness.py index d5f6ecd..a6d4343 100644 --- a/tests/test_cleanroom_harness.py +++ b/tests/test_cleanroom_harness.py @@ -15,17 +15,17 @@ def read(path: str) -> str: def test_cleanroom_dockerfile_pins_base_image_and_cosign() -> None: - dockerfile = read("cleanroom/civiccore.Dockerfile") + dockerfile = read("cleanroom/townlight_core.Dockerfile") assert "python:3.13-slim-bookworm@sha256:bb73517d48bd32016e15eade0c009b2724ec3a025a9975b5cd9b251d0dcadb33" in dockerfile assert "ARG COSIGN_VERSION=v3.0.6" in dockerfile assert "ARG COSIGN_SHA256=c956e5dfcac53d52bcf058360d579472f0c1d2d9b69f55209e256fe7783f4c74" in dockerfile assert "git fetch --depth 1 origin" in dockerfile - assert 'test "$(git rev-parse HEAD)" = "${CIVICCORE_COMMIT}"' in dockerfile + assert 'test "$(git rev-parse HEAD)" = "${TOWNLIGHT_CORE_COMMIT}"' in dockerfile def test_cleanroom_runner_executes_required_verification_paths() -> None: - runner = read("scripts/cleanroom/civiccore-cleanroom-runner.sh") + runner = read("scripts/cleanroom/townlight_core-cleanroom-runner.sh") assert "bash scripts/verify-release.sh" in runner assert "python scripts/verify-release-provenance.py --fixtures-dir tests/fixtures/release_provenance" in runner @@ -37,7 +37,7 @@ def test_cleanroom_runner_executes_required_verification_paths() -> None: def test_cleanroom_orchestrator_uses_no_cache_two_runs_and_offline_network() -> None: - orchestrator = read("scripts/run-civiccore-cleanroom.sh") + orchestrator = read("scripts/run-townlight_core-cleanroom.sh") assert "docker build --no-cache --pull --platform linux/amd64" in orchestrator assert "RUN_COUNT=\"${CLEANROOM_RUN_COUNT:-2}\"" in orchestrator @@ -53,7 +53,7 @@ def test_cleanroom_ci_uploads_evidence_artifact() -> None: assert "TARGET_COMMIT" in workflow assert "github.event.pull_request.head.sha" in workflow assert "fetch-depth: 0" in workflow - assert "bash scripts/run-civiccore-cleanroom.sh" in workflow + assert "bash scripts/run-townlight_core-cleanroom.sh" in workflow assert "actions/upload-artifact" in workflow assert "CLEANROOM_RUN_COUNT: \"2\"" in workflow @@ -62,7 +62,7 @@ def test_cleanroom_ci_uploads_evidence_artifact() -> None: def test_offline_smoke_requires_candidate_version( tmp_path: Path, runtime_version: str ) -> None: - runner = read("scripts/cleanroom/civiccore-cleanroom-runner.sh") + runner = read("scripts/cleanroom/townlight_core-cleanroom-runner.sh") marker = 'run_step "offline-runtime-smoke" python - <<\'PY\'\n' smoke = runner.split(marker, 1)[1].split("\nPY", 1)[0] (tmp_path / "pyproject.toml").write_text( @@ -76,7 +76,7 @@ def test_offline_smoke_requires_candidate_version( "compute_onboarding_status", "verify_persisted_audit_chain", ) - (tmp_path / "civiccore.py").write_text( + (tmp_path / "townlight_core.py").write_text( f"__version__ = {runtime_version!r}\n" + "".join(f"def {name}(): pass\n" for name in exports), encoding="utf-8", diff --git a/tests/test_connector_delta.py b/tests/test_connector_delta.py index 06d8365..05d3742 100644 --- a/tests/test_connector_delta.py +++ b/tests/test_connector_delta.py @@ -2,7 +2,7 @@ from datetime import UTC, datetime -from civiccore.connectors import plan_vendor_delta_request +from townlight_core.connectors import plan_vendor_delta_request def test_delta_request_plans_connector_specific_cursor_query() -> None: diff --git a/tests/test_connector_imports.py b/tests/test_connector_imports.py index 0ab0f67..cbd4556 100644 --- a/tests/test_connector_imports.py +++ b/tests/test_connector_imports.py @@ -4,7 +4,7 @@ import pytest -from civiccore.connectors import ( +from townlight_core.connectors import ( ConnectorImportError, ImportedAgendaItem, SUPPORTED_CONNECTORS, diff --git a/tests/test_connector_manifest.py b/tests/test_connector_manifest.py index 6f10a5a..761dd92 100644 --- a/tests/test_connector_manifest.py +++ b/tests/test_connector_manifest.py @@ -4,7 +4,7 @@ import pytest -from civiccore.connectors import ( +from townlight_core.connectors import ( ExportManifest, ImportManifest, ManifestFile, @@ -24,9 +24,9 @@ def test_validate_csv_import_manifest_with_file_checksum(tmp_path) -> None: source.write_bytes(payload) manifest = ImportManifest( - module_name="civicrecords", + module_name="townlight_records", module_version="1.2.3", - civiccore_version="0.3.0", + townlight_core_version="0.3.0", purpose="csv_import", source_files=[ ManifestFile(path="imports/people.csv", byte_size=len(payload), sha256=_sha256(payload)) @@ -48,9 +48,9 @@ def test_validate_geojson_and_file_drop_import_purposes(tmp_path) -> None: (tmp_path / "permit.pdf").write_bytes(document) geojson_manifest = { - "module_name": "civiczone", + "module_name": "townlight_zoning", "module_version": "0.3.0", - "civiccore_version": "0.3.0", + "townlight_core_version": "0.3.0", "purpose": "geojson_import", "source_files": [ { @@ -62,9 +62,9 @@ def test_validate_geojson_and_file_drop_import_purposes(tmp_path) -> None: "limitations": ["Offline GeoJSON import only."], } file_drop_manifest = { - "module_name": "civicrecords", + "module_name": "townlight_records", "module_version": "0.3.0", - "civiccore_version": "0.3.0", + "townlight_core_version": "0.3.0", "purpose": "file_drop_import", "source_files": [ {"path": "permit.pdf", "byte_size": len(document), "sha256": _sha256(document)} @@ -82,9 +82,9 @@ def test_validate_static_export_manifest_with_generated_file(tmp_path) -> None: export.write_bytes(content) manifest = { - "module_name": "civicrecords", + "module_name": "townlight_records", "module_version": "0.3.0", - "civiccore_version": "0.3.0", + "townlight_core_version": "0.3.0", "purpose": "static_export_bundle", "generated_files": [ {"path": "cases.csv", "byte_size": len(content), "sha256": _sha256(content)} @@ -104,9 +104,9 @@ def test_manifest_detects_checksum_size_missing_and_version_mismatch(tmp_path) - file_path.write_bytes(data) manifest = { - "module_name": "civicrecords", + "module_name": "townlight_records", "module_version": "0.3.0", - "civiccore_version": "0.3.0", + "townlight_core_version": "0.3.0", "purpose": "csv_import", "source_files": [{"path": "data.csv", "byte_size": len(data), "sha256": _sha256(data)}], "limitations": ["Offline import only."], @@ -122,7 +122,7 @@ def test_manifest_detects_checksum_size_missing_and_version_mismatch(tmp_path) - validate_manifest(manifest, base_path=tmp_path) with pytest.raises(ManifestValidationError, match="Townlight Core version mismatch"): - validate_manifest(manifest, expected_civiccore_version="9.9.9") + validate_manifest(manifest, expected_townlight_core_version="9.9.9") def test_manifest_models_do_not_expose_live_connector_runtime_behavior() -> None: diff --git a/tests/test_connector_sync.py b/tests/test_connector_sync.py index 63bdbb8..8d45fd7 100644 --- a/tests/test_connector_sync.py +++ b/tests/test_connector_sync.py @@ -5,7 +5,7 @@ import httpx import pytest -from civiccore.connectors import ( +from townlight_core.connectors import ( SyncCircuitPolicy, SyncCircuitState, SyncRetryExhausted, diff --git a/tests/test_demo_town_contract.py b/tests/test_demo_town_contract.py index f905452..397ad03 100644 --- a/tests/test_demo_town_contract.py +++ b/tests/test_demo_town_contract.py @@ -7,7 +7,7 @@ import pytest -from civiccore.testing import ( +from townlight_core.testing import ( DEMO_TOWN_CONTRACT_SCHEMA_VERSION, DEMO_TOWN_DEFAULT_SEED, DEMO_TOWN_FIXTURE_ID, @@ -54,7 +54,7 @@ def test_demo_town_contract_is_versioned_and_explicitly_fictional() -> None: assert manifest["schema_version"] == DEMO_TOWN_CONTRACT_SCHEMA_VERSION == "1.0.0" assert manifest["fixture_id"] == DEMO_TOWN_FIXTURE_ID - assert manifest["fixture_version"] == DEMO_TOWN_FIXTURE_VERSION == "1.0.0" + assert manifest["fixture_version"] == DEMO_TOWN_FIXTURE_VERSION == "1.0.1" assert manifest["deterministic_seed"] == DEMO_TOWN_DEFAULT_SEED assert manifest["generation_mode"] == DEMO_TOWN_GENERATION_MODE == "static-canonical-v1" assert manifest["municipality"] == { @@ -91,7 +91,7 @@ def test_demo_town_fixture_and_artifact_hashes_are_deterministic() -> None: assert first["fixture_sha256"] == _canonical_sha256(fixture_without_hash) assert first["fixture_sha256"] == DEMO_TOWN_FIXTURE_SHA256_V1 assert DEMO_TOWN_FIXTURE_SHA256_V1 == ( - "a9c242a3f2618a69d7effb1d0d17d2df06f6744c8c351bba4065d315c94575b4" + "d9aaa79403cfca2711e8031439fbab8bf9f70a20b8afc293faef8edd683ffbd6" ) assert len(first["fixture_sha256"]) == 64 diff --git a/tests/test_department_authority.py b/tests/test_department_authority.py index fa06755..4eed7c8 100644 --- a/tests/test_department_authority.py +++ b/tests/test_department_authority.py @@ -14,8 +14,8 @@ import pytest -from civiccore.auth import AuthenticatedPrincipal -from civiccore.auth.department_scope import ( +from townlight_core.auth import AuthenticatedPrincipal +from townlight_core.auth.department_scope import ( TRUSTED_AUTH_METHODS, AuthorityProvenanceError, DepartmentAccessDenied, @@ -27,7 +27,7 @@ scope_model_context_chunks, scope_search_results, ) -from civiccore.llm.context import assemble_context +from townlight_core.llm.context import assemble_context SCOPE = "city-a" OTHER_SCOPE = "city-b" @@ -344,7 +344,7 @@ def test_receipt_is_bounded_and_does_not_leak_the_subject(): def test_grant_writes_refuse_a_malformed_scope(scope): import asyncio - from civiccore.auth.department_scope import active_department_grants, record_department_grant + from townlight_core.auth.department_scope import active_department_grants, record_department_grant async def write(): # ``session=None`` is never touched: the scope is validated before any query. diff --git a/tests/test_department_authority_adr.py b/tests/test_department_authority_adr.py index 3b01937..ffc7fca 100644 --- a/tests/test_department_authority_adr.py +++ b/tests/test_department_authority_adr.py @@ -9,7 +9,7 @@ from pathlib import Path -import civiccore.auth.department_scope as authority +import townlight_core.auth.department_scope as authority REPO_ROOT = Path(__file__).resolve().parents[1] @@ -23,7 +23,7 @@ def test_authority_adr_records_the_trust_boundary_and_non_claims() -> None: assert "Implemented in the private beta candidate" in current assert "not released" in current # The trust boundary is the point of the ADR and must stay stated. - assert "civiccore_department_grant_events" in current + assert "civiccore_department_grant_events" in current # Dated ADR's original identity. assert "privil" in current.lower() # the escalation shape it prevents assert "active_department_grants" in current assert "deny by default" in current.lower() @@ -62,7 +62,7 @@ def test_authority_module_documents_the_non_claims_it_must_uphold() -> None: def test_authority_contract_is_importable_from_the_auth_namespace() -> None: - import civiccore.auth as auth + import townlight_core.auth as auth for name in ( "DepartmentAuthority", diff --git a/tests/test_exemption_evaluation.py b/tests/test_exemption_evaluation.py index b63da12..95b7eb9 100644 --- a/tests/test_exemption_evaluation.py +++ b/tests/test_exemption_evaluation.py @@ -1,6 +1,6 @@ from uuid import uuid4 import pytest -from civiccore.exemptions import ( +from townlight_core.exemptions import ( Rule, RuleEvaluationError, evaluate, diff --git a/tests/test_export_bundle.py b/tests/test_export_bundle.py index 2b048cf..d8ce75b 100644 --- a/tests/test_export_bundle.py +++ b/tests/test_export_bundle.py @@ -4,8 +4,8 @@ import pytest -from civiccore.connectors.manifest import ManifestValidationError -from civiccore.exports import ( +from townlight_core.connectors.manifest import ManifestValidationError +from townlight_core.exports import ( BundleFile, ExportBundle, build_sha256sums, @@ -21,7 +21,7 @@ def _make_bundle(tmp_path) -> ExportBundle: (reports / "summary.json").write_text('{"total":1}\n', encoding="utf-8") return ExportBundle( - module_name="civicrecords", + module_name="townlight_records", module_version="0.3.0", files=[ BundleFile.from_path(tmp_path, "reports/cases.csv"), diff --git a/tests/test_github_workflows.py b/tests/test_github_workflows.py index a88ca05..8921970 100644 --- a/tests/test_github_workflows.py +++ b/tests/test_github_workflows.py @@ -29,16 +29,16 @@ def test_release_workflow_uploads_explicit_downloaded_asset_files() -> None: publish_script = workflow["jobs"]["publish-release"]["steps"][0]["run"] assert release_tag["required"] is True - assert release_tag["default"] == "v1.2.1" + assert release_tag["default"] == "v1.3.0.dev2" assert "v*" in tag_triggers - assert "civiccore-*-freeze" in tag_triggers + assert "townlight_core-*-freeze" in tag_triggers assert workflow["jobs"]["cleanroom-rehearsal"]["if"] == "github.event_name == 'workflow_dispatch'" assert release_cleanroom["needs"] == ["create-draft-release"] assert workflow["jobs"]["publish-release"]["needs"] == ["release-cleanroom-rehearsal"] assert download_step["uses"] == "actions/download-artifact@v8" - assert download_step["with"]["name"] == "civiccore-dist" + assert download_step["with"]["name"] == "townlight_core-dist" assert download_step["with"]["path"] == "release-assets/" - assert "civiccore-*-freeze) latest_flag=(--latest=false)" in create_release_script + assert "townlight_core-*-freeze) latest_flag=(--latest=false)" in create_release_script assert "Cleanroom rehearsal: PASSED in workflow run ${WORKFLOW_RUN_ID}" in create_release_script assert "Verified clean install of ${WHEEL_URL} from cold caches" in create_release_script assert "docs/evidence/co8-civiccore-procurement-evidence-pack/index.md" in create_release_script @@ -53,10 +53,10 @@ def test_release_workflow_uploads_explicit_downloaded_asset_files() -> None: assert "gh release download" in release_cleanroom["steps"][3]["run"] assert "python -m pip install --no-cache-dir --force-reinstall" in release_cleanroom["steps"][4]["run"] assert "TESTING=1 python" in release_cleanroom["steps"][4]["run"] - assert "docker builder prune --all --force --filter \"label=civicsuite-cleanroom=1\"" in release_cleanroom["steps"][2]["run"] + assert "docker builder prune --all --force --filter \"label=townlight-cleanroom=1\"" in release_cleanroom["steps"][2]["run"] assert "system prune" not in release_cleanroom["steps"][2]["run"] assert "--draft=false" in publish_script - assert "civiccore-*-freeze) latest_flag=(--latest=false)" in publish_script + assert "townlight_core-*-freeze) latest_flag=(--latest=false)" in publish_script def test_ci_workflow_runs_full_release_verification_gate() -> None: diff --git a/tests/test_ingest_contracts.py b/tests/test_ingest_contracts.py index 844c248..6880094 100644 --- a/tests/test_ingest_contracts.py +++ b/tests/test_ingest_contracts.py @@ -2,7 +2,7 @@ from __future__ import annotations -from civiccore.ingest import ( +from townlight_core.ingest import ( CitedSentence, CitationValidationError, DiscoveredRecord, diff --git a/tests/test_ingest_pipeline.py b/tests/test_ingest_pipeline.py index 753832e..4860d1d 100644 --- a/tests/test_ingest_pipeline.py +++ b/tests/test_ingest_pipeline.py @@ -2,10 +2,10 @@ import pytest -from civiccore.ingest import embedder -from civiccore.ingest import ingest_bytes, register_handler -from civiccore.ingest.chunker import chunk_pages -from civiccore.ingest.parsers import detect_parser +from townlight_core.ingest import embedder +from townlight_core.ingest import ingest_bytes, register_handler +from townlight_core.ingest.chunker import chunk_pages +from townlight_core.ingest.parsers import detect_parser def test_shared_ingest_exports_pdf_parser_and_sentence_chunks() -> None: @@ -42,7 +42,7 @@ def parse(self, file_path: Path): # pragma: no cover - registry proof only register_handler(CustomParser()) - from civiccore.ingest.pipeline import _detect_handler + from townlight_core.ingest.pipeline import _detect_handler assert _detect_handler(Path("longmont.citycode")).__class__.__name__ == "CustomParser" @@ -64,7 +64,7 @@ class FakeDocument: async def fake_commit(): calls["committed"] = True - monkeypatch.setattr("civiccore.ingest.pipeline.ingest_file", fake_ingest_file) + monkeypatch.setattr("townlight_core.ingest.pipeline.ingest_file", fake_ingest_file) class FakeSession: commit = staticmethod(fake_commit) diff --git a/tests/test_job_artifacts.py b/tests/test_job_artifacts.py index 9c1bc26..964ab11 100644 --- a/tests/test_job_artifacts.py +++ b/tests/test_job_artifacts.py @@ -17,10 +17,10 @@ import pytest -import civiccore.tasks.artifacts as module -from civiccore.platform import LocalTaskEnvelope -from civiccore.platform.task_queue import StaleTaskClaim -from civiccore.tasks.artifacts import ( +import townlight_core.tasks.artifacts as module +from townlight_core.platform import LocalTaskEnvelope +from townlight_core.platform.task_queue import StaleTaskClaim +from townlight_core.tasks.artifacts import ( MAX_ARTIFACT_BYTES, REFUSAL_REASONS, ArtifactProposal, @@ -336,7 +336,7 @@ def test_unknown_refusal_reason_is_rejected() -> None: def test_artifact_namespace_is_importable_and_exported() -> None: - import civiccore.tasks as tasks + import townlight_core.tasks as tasks for name in ( "ArtifactProposal", diff --git a/tests/test_job_artifacts_adr.py b/tests/test_job_artifacts_adr.py index d8ad2df..1fa2b30 100644 --- a/tests/test_job_artifacts_adr.py +++ b/tests/test_job_artifacts_adr.py @@ -5,7 +5,7 @@ from pathlib import Path -import civiccore.tasks.artifacts as artifacts +import townlight_core.tasks.artifacts as artifacts REPO_ROOT = Path(__file__).resolve().parents[1] @@ -20,7 +20,7 @@ def test_artifact_adr_records_trust_boundary_and_non_claims() -> None: assert "not released" in current assert "claim_token" in current assert "StaleTaskClaim" in current - assert "civiccore_job_artifacts" in current + assert "civiccore_job_artifacts" in current # Dated ADR's original identity. assert "append-only" in current assert "restore-from-backup" in current assert "**no** transcription" in current @@ -73,7 +73,7 @@ def test_artifact_module_documents_the_non_claims_it_must_uphold() -> None: def test_artifact_contract_is_importable_from_the_tasks_namespace() -> None: - import civiccore.tasks as tasks + import townlight_core.tasks as tasks for name in ( "ArtifactProposal", @@ -94,11 +94,11 @@ def test_artifact_contract_is_importable_from_the_tasks_namespace() -> None: def test_queue_require_active_claim_is_exported_without_a_second_engine() -> None: - import civiccore.platform as platform + import townlight_core.platform as platform assert "require_active_claim" in platform.__all__ assert hasattr(platform, "require_active_claim") - source = (REPO_ROOT / "civiccore/platform/task_queue.py").read_text(encoding="utf-8") + source = (REPO_ROOT / "townlight_core/platform/task_queue.py").read_text(encoding="utf-8") # It must be a read-only fence over the existing ownership helper. assert "async def require_active_claim(" in source assert "row = await _owned_task(session, task_id, claim_token, now)" in source diff --git a/tests/test_llm_context.py b/tests/test_llm_context.py index 6717215..dd03d15 100644 --- a/tests/test_llm_context.py +++ b/tests/test_llm_context.py @@ -1,11 +1,11 @@ -"""Unit tests for civiccore.llm.context. +"""Unit tests for townlight_core.llm.context. Pure unit tests — no DB, no live providers, no skips. """ from __future__ import annotations -from civiccore.llm.context import ( +from townlight_core.llm.context import ( DEFAULT_CONTEXT_WINDOW, ContextBlock, TokenBudget, diff --git a/tests/test_llm_migration_0002.py b/tests/test_llm_migration_0002.py index dcc3ad4..105a391 100644 --- a/tests/test_llm_migration_0002.py +++ b/tests/test_llm_migration_0002.py @@ -1,4 +1,4 @@ -"""Tests for civiccore_0002_llm migration. +"""Tests for townlight_core_0002_llm migration. Validates: - New columns (template_name, consumer_app, is_override) exist after upgrade_to_head() @@ -23,15 +23,15 @@ ) PostgresContainer = testcontainers.PostgresContainer -import civiccore # noqa: E402 -from civiccore.migrations.runner import current_revision, upgrade_to_head # noqa: E402 -from civiccore.migrations.versions.civiccore_0001_baseline_v1 import ( # noqa: E402 +import townlight_core # noqa: E402 +from townlight_core.migrations.runner import current_revision, upgrade_to_head # noqa: E402 +from townlight_core.migrations.versions.townlight_core_0001_baseline_v1 import ( # noqa: E402 _SHARED_TABLE_ORDER, ) -EXPECTED_HEAD = "civiccore_0009_job_artifacts" +EXPECTED_HEAD = "townlight_core_0009" -_ALEMBIC_INI = Path(civiccore.__file__).parent / "migrations" / "alembic.ini" +_ALEMBIC_INI = Path(townlight_core.__file__).parent / "migrations" / "alembic.ini" def _docker_available() -> bool: @@ -119,7 +119,7 @@ def test_0002_prompt_templates_has_new_columns(engine, pg_container): """After upgrade_to_head(), prompt_templates has the Phase 2 override columns. Verifies: - - Current revision is the latest CivicCore head + - Current revision is the latest TownlightCore head - template_name column exists (renamed from name) - consumer_app column exists - is_override column exists @@ -160,11 +160,11 @@ def test_0002_prompt_templates_has_new_columns(engine, pg_container): def test_0002_upgrade_from_0001_baseline(pg_container): """Incremental upgrade from 0001 through 0002 transforms prompt_templates correctly. - Step 1: Apply only civiccore_0001_baseline_v1 — verify old schema shape (name column). + Step 1: Apply only townlight_core_0001_baseline_v1 — verify old schema shape (name column). Step 2: Apply upgrade_to_head() — verify 0002 shape plus any later head migrations. """ # Step 1: only 0001 applied - _upgrade_to_revision(pg_container, "civiccore_0001_baseline_v1") + _upgrade_to_revision(pg_container, "townlight_core_0001") url = pg_container.get_connection_url() eng = sa.create_engine(url, future=True) diff --git a/tests/test_llm_ollama_think.py b/tests/test_llm_ollama_think.py index 2e0b341..64010f8 100644 --- a/tests/test_llm_ollama_think.py +++ b/tests/test_llm_ollama_think.py @@ -12,7 +12,7 @@ import pytest import respx -from civiccore.llm.providers import OllamaConfig, OllamaProvider +from townlight_core.llm.providers import OllamaConfig, OllamaProvider @pytest.mark.asyncio @@ -41,7 +41,7 @@ async def test_think_level_string_is_sent(): def test_config_accepts_think_and_builds_provider(): - from civiccore.llm.factory import build_provider + from townlight_core.llm.factory import build_provider provider = build_provider("ollama", OllamaConfig(base_url="http://t", think=False)) assert isinstance(provider, OllamaProvider) diff --git a/tests/test_llm_providers.py b/tests/test_llm_providers.py index 0308f3f..f222cee 100644 --- a/tests/test_llm_providers.py +++ b/tests/test_llm_providers.py @@ -1,4 +1,4 @@ -"""Unit tests for civiccore.llm.providers. +"""Unit tests for townlight_core.llm.providers. No live HTTP, no real API keys. httpx-based providers are mocked with respx; optional-SDK providers (openai, anthropic) are mocked via unittest.mock. @@ -17,7 +17,7 @@ import pytest import respx -from civiccore.llm.providers import ( +from townlight_core.llm.providers import ( AnthropicProvider, LLMProvider, OllamaProvider, @@ -35,7 +35,7 @@ def test_three_builtin_providers_registered(): - """Importing civiccore.llm.providers must register all three built-ins.""" + """Importing townlight_core.llm.providers must register all three built-ins.""" assert {"ollama", "openai", "anthropic"}.issubset(set(list_providers())) @@ -74,11 +74,11 @@ def test_get_unknown_provider_raises(): def test_fourth_provider_extensibility(): - """Prove a fourth provider can be registered without editing civiccore source. + """Prove a fourth provider can be registered without editing townlight_core source. This test imports ONLY the public API (register_provider, list_providers, get_provider, LLMProvider) and demonstrates that a downstream consumer can - add their own provider with no civiccore source changes. + add their own provider with no townlight_core source changes. """ try: @@ -232,7 +232,7 @@ def test_openai_provider_raises_clear_error_without_sdk(monkeypatch): # fresh resolution path even if the SDK was already imported elsewhere. monkeypatch.delitem(sys.modules, "openai", raising=False) monkeypatch.setitem(sys.modules, "openai", None) - with pytest.raises(ImportError, match=r"civiccore\[openai\]"): + with pytest.raises(ImportError, match=r"townlight_core\[openai\]"): OpenAIProvider(api_key="dummy") @@ -243,7 +243,7 @@ def test_anthropic_provider_raises_clear_error_without_sdk(monkeypatch): monkeypatch.delitem(sys.modules, "anthropic", raising=False) monkeypatch.setitem(sys.modules, "anthropic", None) - with pytest.raises(ImportError, match=r"civiccore\[anthropic\]"): + with pytest.raises(ImportError, match=r"townlight_core\[anthropic\]"): AnthropicProvider(api_key="dummy") @@ -313,7 +313,7 @@ def test_supports_images_property(): def test_ollama_config_defaults(): """OllamaConfig builds with no fields supplied; sensible defaults.""" - from civiccore.llm.providers import OllamaConfig + from townlight_core.llm.providers import OllamaConfig cfg = OllamaConfig() assert cfg.base_url == "http://localhost:11434" assert cfg.default_model == "gemma4:e4b" @@ -321,7 +321,7 @@ def test_ollama_config_defaults(): def test_openai_config_requires_api_key(): """OpenAIConfig.api_key is required and must be non-empty.""" - from civiccore.llm.providers import OpenAIConfig + from townlight_core.llm.providers import OpenAIConfig from pydantic import ValidationError with pytest.raises(ValidationError): OpenAIConfig() # missing api_key @@ -331,7 +331,7 @@ def test_openai_config_requires_api_key(): def test_anthropic_config_requires_api_key_and_positive_max_tokens(): """AnthropicConfig validates api_key and max_tokens > 0.""" - from civiccore.llm.providers import AnthropicConfig + from townlight_core.llm.providers import AnthropicConfig from pydantic import ValidationError with pytest.raises(ValidationError): AnthropicConfig() # missing api_key @@ -342,8 +342,8 @@ def test_anthropic_config_requires_api_key_and_positive_max_tokens(): @pytest.mark.asyncio async def test_build_provider_validates_config_type(): """build_provider raises TypeError when given the wrong config schema.""" - from civiccore.llm.factory import build_provider - from civiccore.llm.providers import OpenAIConfig + from townlight_core.llm.factory import build_provider + from townlight_core.llm.providers import OpenAIConfig # Pass OpenAIConfig to ollama; should be rejected with pytest.raises(TypeError, match="ollama.*expects config type OllamaConfig"): build_provider("ollama", OpenAIConfig(api_key="k")) @@ -352,8 +352,8 @@ async def test_build_provider_validates_config_type(): @pytest.mark.asyncio async def test_build_provider_unknown_name_raises_key_error(): """build_provider raises KeyError naming available providers.""" - from civiccore.llm.factory import build_provider - from civiccore.llm.providers import OllamaConfig + from townlight_core.llm.factory import build_provider + from townlight_core.llm.providers import OllamaConfig with pytest.raises(KeyError, match="not registered"): build_provider("nonexistent_provider", OllamaConfig()) @@ -361,8 +361,8 @@ async def test_build_provider_unknown_name_raises_key_error(): @pytest.mark.asyncio async def test_build_provider_constructs_ollama_with_valid_config(): """build_provider with valid OllamaConfig returns a working provider instance.""" - from civiccore.llm.factory import build_provider - from civiccore.llm.providers import OllamaConfig, OllamaProvider + from townlight_core.llm.factory import build_provider + from townlight_core.llm.providers import OllamaConfig, OllamaProvider cfg = OllamaConfig(base_url="http://test:11434", default_model="custom") provider = build_provider("ollama", cfg) assert isinstance(provider, OllamaProvider) @@ -374,8 +374,8 @@ async def test_build_provider_constructs_ollama_with_valid_config(): @pytest.mark.asyncio async def test_build_provider_constructs_openai_with_valid_config(): """build_provider with valid OpenAIConfig returns OpenAIProvider.""" - from civiccore.llm.factory import build_provider - from civiccore.llm.providers import OpenAIConfig, OpenAIProvider + from townlight_core.llm.factory import build_provider + from townlight_core.llm.providers import OpenAIConfig, OpenAIProvider cfg = OpenAIConfig(api_key="dummy") provider = build_provider("openai", cfg) assert isinstance(provider, OpenAIProvider) @@ -385,8 +385,8 @@ async def test_build_provider_constructs_openai_with_valid_config(): @pytest.mark.asyncio async def test_build_provider_constructs_anthropic_with_valid_config(): """build_provider with valid AnthropicConfig returns AnthropicProvider.""" - from civiccore.llm.factory import build_provider - from civiccore.llm.providers import AnthropicConfig, AnthropicProvider + from townlight_core.llm.factory import build_provider + from townlight_core.llm.providers import AnthropicConfig, AnthropicProvider cfg = AnthropicConfig(api_key="dummy") provider = build_provider("anthropic", cfg) assert isinstance(provider, AnthropicProvider) diff --git a/tests/test_llm_public_api.py b/tests/test_llm_public_api.py index 7bc5093..990e310 100644 --- a/tests/test_llm_public_api.py +++ b/tests/test_llm_public_api.py @@ -1,22 +1,22 @@ -"""Smoke test: civiccore.llm public API is fully importable and complete. +"""Smoke test: townlight_core.llm public API is fully importable and complete. This test exists so that any future refactor that breaks a public symbol fails CI immediately. The list of expected public symbols is the contract -that downstream apps (records-ai, civicclerk) rely on. +that downstream apps (records-ai, townlight_meetings) rely on. """ from __future__ import annotations -def test_civiccore_llm_imports_cleanly(): - """Importing civiccore.llm must not error and must register built-in providers.""" - import civiccore.llm # noqa: F401 - from civiccore.llm.providers import PROVIDER_REGISTRY +def test_townlight_core_llm_imports_cleanly(): + """Importing townlight_core.llm must not error and must register built-in providers.""" + import townlight_core.llm # noqa: F401 + from townlight_core.llm.providers import PROVIDER_REGISTRY assert {"ollama", "openai", "anthropic"}.issubset(set(PROVIDER_REGISTRY.keys())) def test_public_api_surface_is_complete(): """All expected symbols are exposed at the package root.""" - import civiccore.llm as llm + import townlight_core.llm as llm expected = { # Providers "LLMProvider", "PROVIDER_REGISTRY", "register_provider", @@ -28,7 +28,7 @@ def test_public_api_surface_is_complete(): # Templates "PromptTemplate", "PromptTemplateCreate", "PromptTemplateRead", "RenderedPrompt", "render_template", "resolve_template", - "CIVICCORE_DEFAULT_APP", + "TOWNLIGHT_CORE_DEFAULT_APP", "PromptTemplateError", "PromptTemplateNotFoundError", "PromptTemplateRenderError", "OVERRIDE_REGISTRY", "register_template_override", @@ -49,7 +49,7 @@ def test_public_api_surface_is_complete(): "DEFAULT_MAX_ATTEMPTS", } missing = expected - set(dir(llm)) - assert not missing, f"Missing public symbols in civiccore.llm: {missing}" + assert not missing, f"Missing public symbols in townlight_core.llm: {missing}" def test_public_api_has_no_cost_tracking(): @@ -57,27 +57,27 @@ def test_public_api_has_no_cost_tracking(): Token budget is allowed (context-window math). Cost/dollar/spend is not. """ - import civiccore.llm as llm + import townlight_core.llm as llm forbidden_substrings = ("cost", "dollar", "spend", "billing", "budget_enforce") surface = " ".join(dir(llm)).lower() for sub in forbidden_substrings: # "budget" alone is fine (TokenBudget). Forbid the more loaded terms. assert sub not in surface, ( - f"Forbidden cost-tracking surface present in civiccore.llm: {sub}. " - "Per ADR-0004, no cost tracking in civiccore." + f"Forbidden cost-tracking surface present in townlight_core.llm: {sub}. " + "Per ADR-0004, no cost tracking in townlight_core." ) def test_public_api_no_live_provider_calls_at_import(): - """Importing civiccore.llm must not make any live HTTP/provider call. + """Importing townlight_core.llm must not make any live HTTP/provider call. This test is a smoke check that import time is purely registration — no network. (If this passed once, that's mostly proof; the test exists so any future code that adds an import-time call will be caught.) """ # If import-time made a real call, the import would slow drastically or - # fail without network. The previous test_civiccore_llm_imports_cleanly + # fail without network. The previous test_townlight_core_llm_imports_cleanly # would have flaked. This explicit test exists as a documentation hook. - import civiccore.llm # noqa: F401 + import townlight_core.llm # noqa: F401 # No assertion — successful import + the imports_cleanly test passing # is the assertion. diff --git a/tests/test_llm_registry_service.py b/tests/test_llm_registry_service.py index 8db4b76..77250cd 100644 --- a/tests/test_llm_registry_service.py +++ b/tests/test_llm_registry_service.py @@ -1,7 +1,7 @@ -"""Tests for civiccore.llm.registry.service and .router. +"""Tests for townlight_core.llm.registry.service and .router. Mirrors the testcontainer pattern from tests/test_llm_templates.py: -function-scoped Postgres container, schema upgraded to civiccore HEAD, +function-scoped Postgres container, schema upgraded to townlight_core HEAD, fresh AsyncSession per test for full isolation. Hard Rule 4a: no test.skip / xfail / inside-test importorskip. The Docker @@ -33,8 +33,8 @@ ) PostgresContainer = testcontainers.PostgresContainer -from civiccore.llm.context import DEFAULT_CONTEXT_WINDOW # noqa: E402 -from civiccore.llm.registry import ( # noqa: E402 +from townlight_core.llm.context import DEFAULT_CONTEXT_WINDOW # noqa: E402 +from townlight_core.llm.registry import ( # noqa: E402 MissingModelError, ModelRegistry, get_active_model, @@ -42,8 +42,8 @@ model_registry_router, require_active_model, ) -from civiccore.llm.registry.router import get_session # noqa: E402 -from civiccore.migrations.runner import upgrade_to_head # noqa: E402 +from townlight_core.llm.registry.router import get_session # noqa: E402 +from townlight_core.migrations.runner import upgrade_to_head # noqa: E402 # --------------------------------------------------------------------------- diff --git a/tests/test_llm_structured.py b/tests/test_llm_structured.py index 20fce95..310ee33 100644 --- a/tests/test_llm_structured.py +++ b/tests/test_llm_structured.py @@ -1,4 +1,4 @@ -"""Tests for civiccore.llm.structured.StructuredOutput. +"""Tests for townlight_core.llm.structured.StructuredOutput. All tests use a fake LLMProvider with canned responses - NO live provider calls, NO DB, NO network. @@ -10,8 +10,8 @@ import pytest from pydantic import BaseModel -from civiccore.llm.providers.base import LLMProvider -from civiccore.llm.structured import StructuredOutput, StructuredOutputFailure +from townlight_core.llm.providers.base import LLMProvider +from townlight_core.llm.structured import StructuredOutput, StructuredOutputFailure class _FakeProvider(LLMProvider): @@ -169,7 +169,7 @@ def test_structured_output_no_live_calls() -> None: this no-op test simply imports the helper module to confirm it loads without pulling in httpx-bound live clients at import time. """ - from civiccore.llm import structured as _structured # noqa: F401 + from townlight_core.llm import structured as _structured # noqa: F401 assert _structured.StructuredOutput is StructuredOutput assert _structured.StructuredOutputFailure is StructuredOutputFailure diff --git a/tests/test_llm_templates.py b/tests/test_llm_templates.py index e634f4d..47bb189 100644 --- a/tests/test_llm_templates.py +++ b/tests/test_llm_templates.py @@ -2,7 +2,7 @@ Engine tests are pure unit tests (no DB). Resolver tests use a fresh testcontainer Postgres per test (function scope) so each scenario starts from -an empty schema upgraded to civiccore HEAD — preventing cross-test bleed. +an empty schema upgraded to townlight_core HEAD — preventing cross-test bleed. Hard Rule 4a: no test.skip / xfail / inside-test importorskip. The Docker importorskip at module top is acceptable per the existing test_baseline_idempotency @@ -34,21 +34,21 @@ ) PostgresContainer = testcontainers.PostgresContainer -from civiccore.llm.templates.engine import RenderedPrompt, render_template # noqa: E402 -from civiccore.llm.templates.exceptions import ( # noqa: E402 +from townlight_core.llm.templates.engine import RenderedPrompt, render_template # noqa: E402 +from townlight_core.llm.templates.exceptions import ( # noqa: E402 PromptTemplateNotFoundError, PromptTemplateRenderError, ) -from civiccore.llm.templates.models import PromptTemplate # noqa: E402 -from civiccore.llm.templates.overrides import ( # noqa: E402 +from townlight_core.llm.templates.models import PromptTemplate # noqa: E402 +from townlight_core.llm.templates.overrides import ( # noqa: E402 register_template_override, unregister_template_override, ) -from civiccore.llm.templates.resolver import ( # noqa: E402 - CIVICCORE_DEFAULT_APP, +from townlight_core.llm.templates.resolver import ( # noqa: E402 + TOWNLIGHT_CORE_DEFAULT_APP, resolve_template, ) -from civiccore.migrations.runner import upgrade_to_head # noqa: E402 +from townlight_core.migrations.runner import upgrade_to_head # noqa: E402 # --------------------------------------------------------------------------- @@ -84,7 +84,7 @@ def _database_url_env(pg_container): def _make_template( *, template_name: str, - consumer_app: str = "civiccore", + consumer_app: str = "townlight_core", is_override: bool = False, version: int = 1, is_active: bool = True, @@ -126,7 +126,7 @@ def pg_container(): @pytest_asyncio.fixture(loop_scope="function") async def session(pg_container): - """AsyncSession against a fresh DB upgraded to civiccore HEAD.""" + """AsyncSession against a fresh DB upgraded to townlight_core HEAD.""" # 1. Upgrade schema via the runner (uses DATABASE_URL). with _database_url_env(pg_container): upgrade_to_head() @@ -158,7 +158,7 @@ def test_render_template_substitutes_system_and_user(): """$name and $msg substitute into both system_prompt and user_prompt_template.""" tmpl = _make_template( template_name="greet", - consumer_app="civiccore", + consumer_app="townlight_core", version=3, system_prompt="hi $name", user_prompt_template="say $msg", @@ -170,7 +170,7 @@ def test_render_template_substitutes_system_and_user(): assert result.system == "hi alice" assert result.user == "say hello" assert result.template_name == "greet" - assert result.consumer_app == "civiccore" + assert result.consumer_app == "townlight_core" assert result.version == 3 @@ -240,12 +240,12 @@ def test_render_template_does_not_collide_with_json_braces(): @pytest.mark.asyncio -async def test_resolver_returns_civiccore_default_when_only_default_exists(session): - """A civiccore default is returned when no app-specific override exists.""" +async def test_resolver_returns_townlight_core_default_when_only_default_exists(session): + """A townlight_core default is returned when no app-specific override exists.""" session.add( _make_template( template_name="t1", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, is_override=False, is_active=True, ) @@ -253,21 +253,21 @@ async def test_resolver_returns_civiccore_default_when_only_default_exists(sessi await session.commit() found = await resolve_template( - session, template_name="t1", consumer_app="civicrecords-ai" + session, template_name="t1", consumer_app="townlight_records" ) assert found.template_name == "t1" - assert found.consumer_app == CIVICCORE_DEFAULT_APP + assert found.consumer_app == TOWNLIGHT_CORE_DEFAULT_APP assert found.is_override is False @pytest.mark.asyncio -async def test_resolver_app_override_wins_over_civiccore_default(session): - """When an app override exists, it wins over the civiccore default.""" +async def test_resolver_app_override_wins_over_townlight_core_default(session): + """When an app override exists, it wins over the townlight_core default.""" session.add( _make_template( template_name="t2", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, is_override=False, system_prompt="DEFAULT system", ) @@ -275,7 +275,7 @@ async def test_resolver_app_override_wins_over_civiccore_default(session): session.add( _make_template( template_name="t2", - consumer_app="civicrecords-ai", + consumer_app="townlight_records", is_override=True, system_prompt="OVERRIDE system", ) @@ -283,37 +283,37 @@ async def test_resolver_app_override_wins_over_civiccore_default(session): await session.commit() found = await resolve_template( - session, template_name="t2", consumer_app="civicrecords-ai" + session, template_name="t2", consumer_app="townlight_records" ) - assert found.consumer_app == "civicrecords-ai" + assert found.consumer_app == "townlight_records" assert found.is_override is True assert found.system_prompt == "OVERRIDE system" @pytest.mark.asyncio -async def test_resolver_civiccore_app_skips_step1(session): - """When consumer_app == 'civiccore', step 1 (override lookup) is skipped. +async def test_resolver_townlight_core_app_skips_step1(session): + """When consumer_app == 'townlight_core', step 1 (override lookup) is skipped. - Even if a civiccore + is_override=True row exists (operator misconfiguration), - a consumer_app='civiccore' resolution returns the canonical default + Even if a townlight_core + is_override=True row exists (operator misconfiguration), + a consumer_app='townlight_core' resolution returns the canonical default (is_override=False) row. """ # Misplaced override row (same app as the default — operator slip). session.add( _make_template( template_name="t3", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, is_override=True, version=1, - system_prompt="WEIRD override-on-civiccore", + system_prompt="WEIRD override-on-townlight_core", ) ) # Canonical default. session.add( _make_template( template_name="t3", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, is_override=False, version=2, system_prompt="canonical default", @@ -322,7 +322,7 @@ async def test_resolver_civiccore_app_skips_step1(session): await session.commit() found = await resolve_template( - session, template_name="t3", consumer_app=CIVICCORE_DEFAULT_APP + session, template_name="t3", consumer_app=TOWNLIGHT_CORE_DEFAULT_APP ) assert found.is_override is False @@ -335,7 +335,7 @@ async def test_resolver_inactive_templates_ignored(session): session.add( _make_template( template_name="t4", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, is_active=False, ) ) @@ -343,7 +343,7 @@ async def test_resolver_inactive_templates_ignored(session): with pytest.raises(PromptTemplateNotFoundError): await resolve_template( - session, template_name="t4", consumer_app="civicrecords-ai" + session, template_name="t4", consumer_app="townlight_records" ) @@ -353,7 +353,7 @@ async def test_resolver_highest_version_wins(session): session.add( _make_template( template_name="t5", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, version=1, is_active=True, system_prompt="v1", @@ -362,7 +362,7 @@ async def test_resolver_highest_version_wins(session): session.add( _make_template( template_name="t5", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, version=2, is_active=True, system_prompt="v2", @@ -371,7 +371,7 @@ async def test_resolver_highest_version_wins(session): await session.commit() found = await resolve_template( - session, template_name="t5", consumer_app="civicrecords-ai" + session, template_name="t5", consumer_app="townlight_records" ) assert found.version == 2 @@ -384,7 +384,7 @@ async def test_resolver_inactive_higher_version_skipped_active_lower_returned(se session.add( _make_template( template_name="t6", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, version=1, is_active=True, system_prompt="v1-active", @@ -393,7 +393,7 @@ async def test_resolver_inactive_higher_version_skipped_active_lower_returned(se session.add( _make_template( template_name="t6", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, version=2, is_active=False, system_prompt="v2-inactive", @@ -402,7 +402,7 @@ async def test_resolver_inactive_higher_version_skipped_active_lower_returned(se await session.commit() found = await resolve_template( - session, template_name="t6", consumer_app="civicrecords-ai" + session, template_name="t6", consumer_app="townlight_records" ) assert found.version == 1 @@ -414,16 +414,16 @@ async def test_resolver_missing_template_raises_actionable_error(session): """Empty DB raises NotFound carrying both template_name and consumer_app.""" with pytest.raises(PromptTemplateNotFoundError) as excinfo: await resolve_template( - session, template_name="nope", consumer_app="civicrecords-ai" + session, template_name="nope", consumer_app="townlight_records" ) err = excinfo.value # Constructor exposes these attributes per the spec. assert err.template_name == "nope" - assert err.consumer_app == "civicrecords-ai" + assert err.consumer_app == "townlight_records" msg = str(err) assert "nope" in msg - assert "civicrecords-ai" in msg + assert "townlight_records" in msg def test_resolver_uses_template_name_not_old_name_column(): @@ -435,27 +435,27 @@ def test_resolver_uses_template_name_not_old_name_column(): @pytest.mark.asyncio async def test_resolver_uses_consumer_app_not_null_fallback(session): - """The civiccore default uses consumer_app='civiccore', NOT IS NULL. + """The townlight_core default uses consumer_app='townlight_core', NOT IS NULL. Per ADR-0004, the legacy IS NULL fallback is removed; the default tier - is keyed on the literal string 'civiccore'. + is keyed on the literal string 'townlight_core'. """ session.add( _make_template( template_name="t8", - consumer_app=CIVICCORE_DEFAULT_APP, # literal "civiccore" + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, # literal "townlight_core" is_override=False, is_active=True, ) ) await session.commit() - # Resolution from a different consumer_app finds the civiccore default. + # Resolution from a different consumer_app finds the townlight_core default. found = await resolve_template( - session, template_name="t8", consumer_app="civicrecords-ai" + session, template_name="t8", consumer_app="townlight_records" ) - assert found.consumer_app == CIVICCORE_DEFAULT_APP + assert found.consumer_app == TOWNLIGHT_CORE_DEFAULT_APP # Belt-and-suspenders: the column value is non-null. assert found.consumer_app is not None @@ -472,13 +472,13 @@ async def test_resolver_db_override_wins_over_code_override(session): # Register code override code_tmpl = _make_template( template_name="contested", - consumer_app="civicrecords-ai", + consumer_app="townlight_records", is_override=True, system_prompt="CODE OVERRIDE", user_prompt_template="from code", ) register_template_override( - consumer_app="civicrecords-ai", + consumer_app="townlight_records", template_name="contested", template=code_tmpl, ) @@ -486,7 +486,7 @@ async def test_resolver_db_override_wins_over_code_override(session): # Persist DB override (different prompt body) db_override = _make_template( template_name="contested", - consumer_app="civicrecords-ai", + consumer_app="townlight_records", is_override=True, is_active=True, system_prompt="DB OVERRIDE", @@ -498,76 +498,76 @@ async def test_resolver_db_override_wins_over_code_override(session): resolved = await resolve_template( session, template_name="contested", - consumer_app="civicrecords-ai", + consumer_app="townlight_records", ) assert resolved.system_prompt == "DB OVERRIDE" finally: unregister_template_override( - consumer_app="civicrecords-ai", template_name="contested" + consumer_app="townlight_records", template_name="contested" ) @pytest.mark.asyncio -async def test_resolver_code_override_wins_over_civiccore_default(session): - """No DB app override; code-level override beats civiccore default.""" +async def test_resolver_code_override_wins_over_townlight_core_default(session): + """No DB app override; code-level override beats townlight_core default.""" code_tmpl = _make_template( template_name="t1", - consumer_app="civicrecords-ai", + consumer_app="townlight_records", is_override=True, system_prompt="CODE OVERRIDE", user_prompt_template="x", ) register_template_override( - consumer_app="civicrecords-ai", + consumer_app="townlight_records", template_name="t1", template=code_tmpl, ) try: - # civiccore default in DB - civiccore_default = _make_template( + # townlight_core default in DB + townlight_core_default = _make_template( template_name="t1", - consumer_app="civiccore", + consumer_app="townlight_core", is_override=False, is_active=True, - system_prompt="CIVICCORE DEFAULT", + system_prompt="TOWNLIGHT_CORE DEFAULT", user_prompt_template="y", ) - session.add(civiccore_default) + session.add(townlight_core_default) await session.commit() resolved = await resolve_template( session, template_name="t1", - consumer_app="civicrecords-ai", + consumer_app="townlight_records", ) assert resolved.system_prompt == "CODE OVERRIDE" finally: unregister_template_override( - consumer_app="civicrecords-ai", template_name="t1" + consumer_app="townlight_records", template_name="t1" ) @pytest.mark.asyncio -async def test_resolver_civiccore_app_skips_code_override(session): - """consumer_app='civiccore' skips both step 1 (DB override) and step 2 - (code override). civiccore owns its own defaults.""" +async def test_resolver_townlight_core_app_skips_code_override(session): + """consumer_app='townlight_core' skips both step 1 (DB override) and step 2 + (code override). townlight_core owns its own defaults.""" code_tmpl = _make_template( template_name="t2", - consumer_app="civiccore", + consumer_app="townlight_core", system_prompt="CODE", user_prompt_template="x", ) - # Register a code override under civiccore (operator could theoretically - # do this; resolver must ignore it for consumer_app='civiccore' callers). + # Register a code override under townlight_core (operator could theoretically + # do this; resolver must ignore it for consumer_app='townlight_core' callers). register_template_override( - consumer_app="civiccore", + consumer_app="townlight_core", template_name="t2", template=code_tmpl, ) try: - # civiccore DB default + # townlight_core DB default db_default = _make_template( template_name="t2", - consumer_app="civiccore", + consumer_app="townlight_core", is_active=True, system_prompt="DB DEFAULT", user_prompt_template="y", @@ -575,13 +575,13 @@ async def test_resolver_civiccore_app_skips_code_override(session): session.add(db_default) await session.commit() resolved = await resolve_template( - session, template_name="t2", consumer_app="civiccore" + session, template_name="t2", consumer_app="townlight_core" ) - # Returns DB default; ignores any registered code override under civiccore + # Returns DB default; ignores any registered code override under townlight_core assert resolved.system_prompt == "DB DEFAULT" finally: unregister_template_override( - consumer_app="civiccore", template_name="t2" + consumer_app="townlight_core", template_name="t2" ) @@ -590,25 +590,25 @@ async def test_resolver_code_override_alone_is_resolvable(session): """No DB row at all; code override is the only source. Resolver returns it.""" code_tmpl = _make_template( template_name="solo", - consumer_app="civicrecords-ai", + consumer_app="townlight_records", is_override=True, system_prompt="ONLY IN CODE", user_prompt_template="x", ) register_template_override( - consumer_app="civicrecords-ai", + consumer_app="townlight_records", template_name="solo", template=code_tmpl, ) try: # Empty DB; only the code override exists. resolved = await resolve_template( - session, template_name="solo", consumer_app="civicrecords-ai" + session, template_name="solo", consumer_app="townlight_records" ) assert resolved.system_prompt == "ONLY IN CODE" finally: unregister_template_override( - consumer_app="civicrecords-ai", template_name="solo" + consumer_app="townlight_records", template_name="solo" ) @@ -623,7 +623,7 @@ async def test_resolver_then_render_e2e(session): session.add( _make_template( template_name="e2e", - consumer_app=CIVICCORE_DEFAULT_APP, + consumer_app=TOWNLIGHT_CORE_DEFAULT_APP, system_prompt="You are a $role.", user_prompt_template="Process this: $user_input", version=1, @@ -632,7 +632,7 @@ async def test_resolver_then_render_e2e(session): await session.commit() tmpl = await resolve_template( - session, template_name="e2e", consumer_app="civicrecords-ai" + session, template_name="e2e", consumer_app="townlight_records" ) rendered = render_template( tmpl, {"role": "summarizer", "user_input": "the meeting minutes"} @@ -641,5 +641,5 @@ async def test_resolver_then_render_e2e(session): assert rendered.system == "You are a summarizer." assert rendered.user == "Process this: the meeting minutes" assert rendered.template_name == "e2e" - assert rendered.consumer_app == CIVICCORE_DEFAULT_APP + assert rendered.consumer_app == TOWNLIGHT_CORE_DEFAULT_APP assert rendered.version == 1 diff --git a/tests/test_module_inventory.py b/tests/test_module_inventory.py index fc06253..cb761f4 100644 --- a/tests/test_module_inventory.py +++ b/tests/test_module_inventory.py @@ -12,8 +12,8 @@ import pytest -from civiccore.platform import ModuleManifest -from civiccore.platform.inventory import ( +from townlight_core.platform import ModuleManifest +from townlight_core.platform.inventory import ( InventoryConflictError, ModuleInventory, ModuleInventoryEntry, @@ -31,7 +31,7 @@ def manifest(name, *, version="1.0.0", **extra): name=name.title(), version=version, package_name=name, - civiccore_min_version="1.3.0", + townlight_core_min_version="1.3.0", **extra, ) @@ -44,7 +44,7 @@ def entry(item, *, enabled=True): def inventory(*entries, scope="city-a", revision=1, version="1.3.0"): return ModuleInventory( - scope_id=scope, revision=revision, civiccore_version=version, entries=list(entries) + scope_id=scope, revision=revision, townlight_core_version=version, entries=list(entries) ) @@ -139,7 +139,7 @@ def test_core_too_old_is_reported_as_upgrade_core_not_dependency(): item = inventory(entry(meeting), version="1.2.9") [recommendation] = module_recommendations(item) assert recommendation.action == "upgrade-core" - assert "CivicCore" in recommendation.operator_action + assert "TownlightCore" in recommendation.operator_action def test_profile_mismatch_is_reported_as_not_supported(): diff --git a/tests/test_module_inventory_adr.py b/tests/test_module_inventory_adr.py index 8ede5f6..d4038f4 100644 --- a/tests/test_module_inventory_adr.py +++ b/tests/test_module_inventory_adr.py @@ -10,7 +10,7 @@ from pathlib import Path -import civiccore.platform.inventory as inventory +import townlight_core.platform.inventory as inventory REPO_ROOT = Path(__file__).resolve().parents[1] @@ -26,7 +26,7 @@ def test_inventory_adr_records_contract_and_retains_historical_deferrals() -> No # The non-claims the contract must keep making. assert "No scanning, network access, package enumeration" in current assert "Advice separated from evidence" in current - assert "civiccore.catalog" in current + assert "civiccore.catalog" in current # Dated ADR's original identity. assert "build_module_registry" in current historical = (REPO_ROOT / "docs/adr/ADR-0001-defer-civiccore-catalog.md").read_text( @@ -46,14 +46,14 @@ def test_inventory_module_documents_the_non_claims_it_must_uphold() -> None: assert "never scans a machine" in docstring assert "exactly one module resolver" in docstring - assert "civiccore.platform.modules.build_module_registry" in docstring + assert "townlight_core.platform.modules.build_module_registry" in docstring assert "not installation evidence" in docstring assert "reference data about *vendor systems*" in docstring assert "caller-supplied" in docstring def test_inventory_contract_is_importable_from_the_platform_namespace() -> None: - import civiccore.platform as platform + import townlight_core.platform as platform for name in ( "ModuleInventory", diff --git a/tests/test_module_resolution.py b/tests/test_module_resolution.py index 37e708d..f6482e1 100644 --- a/tests/test_module_resolution.py +++ b/tests/test_module_resolution.py @@ -1,7 +1,7 @@ """Dependency admission must not enable a module whose prerequisites cannot run.""" import pytest -from civiccore.platform import ModuleManifest, build_module_registry +from townlight_core.platform import ModuleManifest, build_module_registry def module(name, **extra): @@ -10,7 +10,7 @@ def module(name, **extra): name=name, version="1.0.0", package_name=name, - civiccore_min_version="1.2.0", + townlight_core_min_version="1.2.0", **extra, ) @@ -18,7 +18,7 @@ def module(name, **extra): def resolve(*modules, version="1.3.0.dev1"): return { entry.module_id: entry - for entry in build_module_registry(list(modules), civiccore_version=version).entries + for entry in build_module_registry(list(modules), townlight_core_version=version).entries } diff --git a/tests/test_notifications_notice.py b/tests/test_notifications_notice.py index ccf7b63..d0d6f3b 100644 --- a/tests/test_notifications_notice.py +++ b/tests/test_notifications_notice.py @@ -2,7 +2,7 @@ from datetime import UTC, date, datetime -from civiccore.notifications import build_deadline_plan, evaluate_notice_compliance +from townlight_core.notifications import build_deadline_plan, evaluate_notice_compliance def test_build_deadline_plan_returns_publish_by_and_reminders() -> None: diff --git a/tests/test_onboarding_profile.py b/tests/test_onboarding_profile.py index 2ee1490..c060e93 100644 --- a/tests/test_onboarding_profile.py +++ b/tests/test_onboarding_profile.py @@ -1,6 +1,6 @@ from __future__ import annotations -from civiccore.onboarding import ( +from townlight_core.onboarding import ( DEFAULT_PROFILE_FIELDS, completed_profile_fields, compute_onboarding_status, diff --git a/tests/test_placeholder_adrs.py b/tests/test_placeholder_adrs.py index a31331d..130828a 100644 --- a/tests/test_placeholder_adrs.py +++ b/tests/test_placeholder_adrs.py @@ -2,19 +2,19 @@ from pathlib import Path -import civiccore.catalog -import civiccore.exemptions -import civiccore.scaffold +import townlight_core.catalog +import townlight_core.exemptions +import townlight_core.scaffold REPO_ROOT = Path(__file__).resolve().parents[1] HISTORICAL_DEFERRAL_ADRS = { - "civiccore.scaffold": REPO_ROOT / "docs/adr/ADR-0003-defer-civiccore-scaffold.md", + "townlight_core.scaffold": REPO_ROOT / "docs/adr/ADR-0003-defer-civiccore-scaffold.md", } RESUMPTION_ADRS = { - "civiccore.scaffold": REPO_ROOT / "docs/adr/ADR-0007-beta-module-scaffold.md", + "townlight_core.scaffold": REPO_ROOT / "docs/adr/ADR-0007-beta-module-scaffold.md", } @@ -22,11 +22,11 @@ def test_placeholder_namespaces_have_freeze_line_adrs() -> None: for namespace, path in HISTORICAL_DEFERRAL_ADRS.items(): text = path.read_text(encoding="utf-8") - assert namespace in text + assert namespace.replace("townlight_core", "civiccore") in text assert "Status: Accepted" in text assert "Explicit downstream consumption rule" in text assert "no module depends" in text - assert "versioned CivicCore release artifact" in text + assert "versioned CivicCore release artifact" in text # Exact historical decision. def test_placeholder_adr_index_lists_all_placeholder_namespaces() -> None: @@ -43,23 +43,23 @@ def test_scaffold_resumption_retains_historical_deferral_and_names_new_contract( historical = (REPO_ROOT / "docs/adr/ADR-0003-defer-civiccore-scaffold.md").read_text( encoding="utf-8" ) - current = RESUMPTION_ADRS["civiccore.scaffold"].read_text(encoding="utf-8") + current = RESUMPTION_ADRS["townlight_core.scaffold"].read_text(encoding="utf-8") assert "Status: Accepted" in historical assert "Defer" in historical assert "Supersedes: ADR-0003" in current assert "not released" in current assert "generate_module_project" in current - assert callable(civiccore.scaffold.generate_module_project) - assert callable(civiccore.scaffold.plan_module_project) - assert callable(civiccore.scaffold.main) + assert callable(townlight_core.scaffold.generate_module_project) + assert callable(townlight_core.scaffold.plan_module_project) + assert callable(townlight_core.scaffold.main) index = (REPO_ROOT / "docs/adr/index.md").read_text(encoding="utf-8") - assert RESUMPTION_ADRS["civiccore.scaffold"].name in index + assert RESUMPTION_ADRS["townlight_core.scaffold"].name in index def test_scaffold_package_still_withholds_downstream_dependency() -> None: - docstring = " ".join((civiccore.scaffold.__doc__ or "").split()) + docstring = " ".join((townlight_core.scaffold.__doc__ or "").split()) assert "ADR-0003-defer-civiccore-scaffold.md" in docstring assert "No downstream module may" in docstring @@ -74,5 +74,5 @@ def test_catalog_resumption_retains_historical_deferral_and_names_open_scope(): current = (REPO_ROOT / "docs/adr/ADR-0004-beta-shared-catalog.md").read_text(encoding="utf-8") assert "Status: Accepted" in historical assert "installed-module inventory" in current - assert callable(civiccore.catalog.import_catalog) - assert callable(civiccore.catalog.connectors_for) + assert callable(townlight_core.catalog.import_catalog) + assert callable(townlight_core.catalog.connectors_for) diff --git a/tests/test_platform_contracts.py b/tests/test_platform_contracts.py index fab10f6..7ada238 100644 --- a/tests/test_platform_contracts.py +++ b/tests/test_platform_contracts.py @@ -1,4 +1,4 @@ -"""Tests for CivicCore Windows-local platform contracts.""" +"""Tests for TownlightCore Windows-local platform contracts.""" from __future__ import annotations @@ -6,7 +6,7 @@ import pytest -from civiccore.platform import ( +from townlight_core.platform import ( BackupManifest, LocalRuntimeProfile, LocalTaskEnvelope, @@ -25,13 +25,13 @@ ) -def _module_manifest(module_id: str = "civicclerk", **overrides) -> ModuleManifest: +def _module_manifest(module_id: str = "townlight_meetings", **overrides) -> ModuleManifest: data = { "module_id": module_id, - "name": "CivicClerk", + "name": "TownlightMeetings", "version": "1.0.0", - "package_name": "civicclerk", - "civiccore_min_version": "1.2.0", + "package_name": "townlight_meetings", + "townlight_core_min_version": "1.2.0", "surfaces": ["staff", "admin"], "install_profiles": ["windows_local"], "permissions": [ @@ -69,15 +69,15 @@ def _module_manifest(module_id: str = "civicclerk", **overrides) -> ModuleManife "migrations": [ { "id": "initial-schema", - "description": "Create local CivicClerk tables.", - "owner_schema": "civicclerk", + "description": "Create local TownlightMeetings tables.", + "owner_schema": "townlight_meetings", } ], "backup_hooks": [ { "id": "module-data", "label": "Module data", - "includes": ["civicclerk/**"], + "includes": ["townlight_meetings/**"], } ], "model_requirements": [ @@ -124,28 +124,28 @@ def test_windows_manifest_rejects_docker_wsl_and_terminal_requirements() -> None def test_module_registry_blocks_missing_required_dependencies() -> None: manifest = _module_manifest( - dependencies=[{"module_id": "civicrecords-ai", "required": True}] + dependencies=[{"module_id": "townlight_records", "required": True}] ) registry = build_module_registry( [manifest], - civiccore_version="1.2.0", - selected_module_ids={"civicclerk"}, + townlight_core_version="1.2.0", + selected_module_ids={"townlight_meetings"}, ) entry = registry.entries[0] - assert registry.civiccore_locked is True + assert registry.townlight_core_locked is True assert entry.status == "blocked" assert entry.enabled is False - assert "civicrecords-ai" in (entry.reason or "") + assert "townlight_records" in (entry.reason or "") def test_module_registry_enables_valid_windows_local_module() -> None: manifest = _module_manifest() - registry = build_module_registry([manifest], civiccore_version="1.2.0") + registry = build_module_registry([manifest], townlight_core_version="1.2.0") - assert registry.enabled_module_ids == ["civicclerk"] + assert registry.enabled_module_ids == ["townlight_meetings"] assert registry.blocked_module_ids == [] assert registry.entries[0].manifest.routes[0].label == "Meetings & Notices" @@ -182,7 +182,7 @@ def test_local_task_retry_contract_has_no_external_runtime_assumption() -> None: now = datetime(2026, 6, 13, 12, 0, tzinfo=UTC) task = LocalTaskEnvelope( task_id="packet-export-1", - module_id="civicclerk", + module_id="townlight_meetings", task_type="packet_export", ) @@ -208,7 +208,7 @@ def test_local_task_exhaustion_is_blocking() -> None: now = datetime(2026, 6, 13, 12, 0, tzinfo=UTC) task = LocalTaskEnvelope( task_id="records-export-1", - module_id="civicrecords-ai", + module_id="townlight_records", task_type="records_export", attempt_count=1, ) @@ -228,8 +228,8 @@ def test_local_task_exhaustion_is_blocking() -> None: def test_backup_manifest_validates_hashes_and_restore_safety(tmp_path) -> None: data_root = tmp_path / "data" data_root.mkdir() - (data_root / "civicclerk").mkdir() - payload = data_root / "civicclerk" / "meetings.json" + (data_root / "townlight_meetings").mkdir() + payload = data_root / "townlight_meetings" / "meetings.json" payload.write_text('{"meeting":"Regular Council"}', encoding="utf-8") manifest = build_backup_manifest( @@ -237,8 +237,8 @@ def test_backup_manifest_validates_hashes_and_restore_safety(tmp_path) -> None: files=[payload], backup_id="backup-1", city_profile_id="sampleville", - civiccore_version="1.2.0", - module_id="civicclerk", + townlight_core_version="1.2.0", + module_id="townlight_meetings", ) assert isinstance(manifest, BackupManifest) @@ -254,16 +254,16 @@ def test_backup_manifest_validates_hashes_and_restore_safety(tmp_path) -> None: payload.write_text("tampered", encoding="utf-8") tampered = validate_backup_manifest(manifest, root=data_root) assert tampered.valid is False - assert tampered.hash_mismatches == ["civicclerk/meetings.json"] + assert tampered.hash_mismatches == ["townlight_meetings/meetings.json"] def test_restore_plan_blocks_overwrite_by_default(tmp_path) -> None: backup_root = tmp_path / "backup" restore_root = tmp_path / "restore" - (backup_root / "civiccode").mkdir(parents=True) - (restore_root / "civiccode").mkdir(parents=True) - source = backup_root / "civiccode" / "code.json" - target = restore_root / "civiccode" / "code.json" + (backup_root / "townlight_code").mkdir(parents=True) + (restore_root / "townlight_code").mkdir(parents=True) + source = backup_root / "townlight_code" / "code.json" + target = restore_root / "townlight_code" / "code.json" source.write_text('{"title":"Code"}', encoding="utf-8") target.write_text("existing", encoding="utf-8") @@ -272,8 +272,8 @@ def test_restore_plan_blocks_overwrite_by_default(tmp_path) -> None: files=[source], backup_id="backup-2", city_profile_id="sampleville", - civiccore_version="1.2.0", - module_id="civiccode", + townlight_core_version="1.2.0", + module_id="townlight_code", ) plan = plan_restore(manifest, backup_root=backup_root, restore_root=restore_root) @@ -282,7 +282,7 @@ def test_restore_plan_blocks_overwrite_by_default(tmp_path) -> None: def test_runtime_profile_and_action_result_are_local_first(tmp_path) -> None: - registry = build_module_registry([_module_manifest()], civiccore_version="1.2.0") + registry = build_module_registry([_module_manifest()], townlight_core_version="1.2.0") profile = LocalRuntimeProfile( profile_id="sampleville", @@ -296,9 +296,9 @@ def test_runtime_profile_and_action_result_are_local_first(tmp_path) -> None: action="first_run", status="succeeded", title="Setup complete", - message="CivicSuite is ready on this computer.", + message="Townlight is ready on this computer.", ) assert profile.local_only is True - assert profile.module_registry.enabled_module_ids == ["civicclerk"] + assert profile.module_registry.enabled_module_ids == ["townlight_meetings"] assert result.status == "succeeded" diff --git a/tests/test_platform_task_queue.py b/tests/test_platform_task_queue.py index 73072b8..cc18dd1 100644 --- a/tests/test_platform_task_queue.py +++ b/tests/test_platform_task_queue.py @@ -21,8 +21,8 @@ ) PostgresContainer = testcontainers.PostgresContainer -from civiccore.migrations.runner import upgrade_to_head # noqa: E402 -from civiccore.platform import ( # noqa: E402 +from townlight_core.migrations.runner import upgrade_to_head # noqa: E402 +from townlight_core.platform import ( # noqa: E402 LocalTask, LocalTaskEnvelope, TaskRetryPolicy, @@ -32,8 +32,8 @@ fail_local_task, run_one_local_task, ) -from civiccore.tasks import register_task_handler # noqa: E402 -from civiccore.tasks.worker import _run_worker # noqa: E402 +from townlight_core.tasks import register_task_handler # noqa: E402 +from townlight_core.tasks.worker import _run_worker # noqa: E402 def _docker_available() -> bool: @@ -98,7 +98,7 @@ async def session(session_factory): async def test_local_task_queue_enqueues_claims_and_completes(session) -> None: task = LocalTaskEnvelope( task_id="records-response-1", - module_id="civicrecords-ai", + module_id="townlight_records", task_type="records_response_export", payload={"request_id": "RR-1001"}, idempotency_key="RR-1001:response-export", @@ -124,7 +124,7 @@ async def test_local_task_queue_enqueues_claims_and_completes(session) -> None: async def test_local_task_queue_records_retry_state(session) -> None: task = LocalTaskEnvelope( task_id="records-search-1", - module_id="civicrecords-ai", + module_id="townlight_records", task_type="records_search_index", ) await enqueue_local_task(session, task) @@ -151,7 +151,7 @@ async def test_run_one_local_task_uses_registered_handler(session) -> None: session, LocalTaskEnvelope( task_id="records-review-1", - module_id="civicrecords-ai", + module_id="townlight_records", task_type="records_review_packet", ), ) @@ -197,7 +197,7 @@ async def handler(task: LocalTaskEnvelope) -> None: sess, LocalTaskEnvelope( task_id="records-worker-1", - module_id="civicrecords-ai", + module_id="townlight_records", task_type="records_worker_registry_probe", ), ) diff --git a/tests/test_provenance_contracts.py b/tests/test_provenance_contracts.py index e1c3160..51bf954 100644 --- a/tests/test_provenance_contracts.py +++ b/tests/test_provenance_contracts.py @@ -6,7 +6,7 @@ import pytest -from civiccore.provenance import ( +from townlight_core.provenance import ( CitationTarget, DocumentMetadata, ProvenanceBundle, diff --git a/tests/test_public_api_v03.py b/tests/test_public_api_v03.py index 707303f..883751b 100644 --- a/tests/test_public_api_v03.py +++ b/tests/test_public_api_v03.py @@ -1,10 +1,10 @@ -"""Smoke tests for the shipped CivicCore package-root surface.""" +"""Smoke tests for the shipped TownlightCore package-root surface.""" from __future__ import annotations def test_v03_public_api_symbols_import_from_package_root() -> None: - import civiccore + import townlight_core expected = { "AuditActor", @@ -141,16 +141,16 @@ def test_v03_public_api_symbols_import_from_package_root() -> None: "validate_windows_local_manifest", } - missing = expected - set(dir(civiccore)) + missing = expected - set(dir(townlight_core)) assert not missing, f"Missing shipped public symbols: {missing}" def test_v03_placeholder_modules_stay_out_of_root_surface() -> None: - import civiccore + import townlight_core not_yet_shipped = { "Auth", "ExemptionRuleEngine", } - assert not (not_yet_shipped & set(dir(civiccore))) + assert not (not_yet_shipped & set(dir(townlight_core))) diff --git a/tests/test_release_provenance.py b/tests/test_release_provenance.py index 62ec14d..f60af10 100644 --- a/tests/test_release_provenance.py +++ b/tests/test_release_provenance.py @@ -5,7 +5,7 @@ from pathlib import Path from typing import Any -from civiccore.release_provenance import ( +from townlight_core.release_provenance import ( GitHubProvenanceClient, build_release_attestation, canonical_json_bytes, @@ -44,11 +44,11 @@ def test_adversarial_release_provenance_fixtures_are_enforced() -> None: def test_release_attestation_builder_uses_exact_workflow_identity(tmp_path: Path) -> None: - artifact = tmp_path / "civiccore-0.22.1-py3-none-any.whl" + artifact = tmp_path / "townlight_core-0.22.1-py3-none-any.whl" artifact.write_text("wheel bytes", encoding="utf-8") attestation = build_release_attestation( - repo="CivicSuite/civiccore", + repo="Townlight/townlight_core", tag_name="v0.22.1", tag_ref_type="commit", tag_ref_sha="a" * 40, @@ -61,17 +61,17 @@ def test_release_attestation_builder_uses_exact_workflow_identity(tmp_path: Path assert attestation["schema_version"] == 1 assert ( attestation["build"]["workflow_identity"] - == "https://github.com/CivicSuite/civiccore/.github/workflows/release.yml@refs/tags/v0.22.1" + == "https://github.com/Townlight/townlight_core/.github/workflows/release.yml@refs/tags/v0.22.1" ) assert attestation["build"]["oidc_issuer"] == "https://token.actions.githubusercontent.com" assert attestation["artifacts"] == [ { - "name": "civiccore-0.22.1-py3-none-any.whl", + "name": "townlight_core-0.22.1-py3-none-any.whl", "sha256": "67c0d8f7de19e30c2d5891030a0b37cbfcdd240852b53055c0b28290ad52290b", } ] assert canonical_json_bytes(attestation).decode("utf-8").startswith( - '{"artifacts":[{"name":"civiccore-0.22.1-py3-none-any.whl"' + '{"artifacts":[{"name":"townlight_core-0.22.1-py3-none-any.whl"' ) @@ -99,10 +99,10 @@ def fake_urlopen(request: Any, timeout: int) -> FakeResponse: monkeypatch.setenv("GH_TOKEN", "token-for-test") monkeypatch.setattr("urllib.request.urlopen", fake_urlopen) - result = GitHubProvenanceClient().tag_ref("CivicSuite/civiccore", "v0.22.1") + result = GitHubProvenanceClient().tag_ref("Townlight/townlight_core", "v0.22.1") assert result["object"]["sha"] == "abc123" - assert captured["url"] == "https://api.github.com/repos/CivicSuite/civiccore/git/ref/tags/v0.22.1" + assert captured["url"] == "https://api.github.com/repos/Townlight/townlight_core/git/ref/tags/v0.22.1" assert captured["headers"]["Authorization"] == "Bearer token-for-test" - assert captured["headers"]["User-agent"] == "civiccore-release-provenance" + assert captured["headers"]["User-agent"] == "townlight_core-release-provenance" assert captured["timeout"] == 30 diff --git a/tests/test_rule_version_history.py b/tests/test_rule_version_history.py index dc7eb71..b25e5bf 100644 --- a/tests/test_rule_version_history.py +++ b/tests/test_rule_version_history.py @@ -13,8 +13,8 @@ import pytest from pydantic import ValidationError -from civiccore.exemptions import Rule, evaluate -from civiccore.exemptions.history import ( +from townlight_core.exemptions import Rule, evaluate +from townlight_core.exemptions.history import ( COVERAGE_DECLARATIONS, RuleHistoryError, RuleVersionInput, @@ -80,7 +80,7 @@ def test_rejects_unsupported_type_coverage_citation_and_pattern(changes): def test_incomplete_scan_error_is_not_converted_to_empty(): - from civiccore.exemptions import RuleEvaluationError + from townlight_core.exemptions import RuleEvaluationError with pytest.raises(ValidationError) as caught: RuleVersionInput.model_validate(payload(rule_type="regex", rule_definition="(a+)+$")) diff --git a/tests/test_scaffold.py b/tests/test_scaffold.py index d23696b..bd07425 100644 --- a/tests/test_scaffold.py +++ b/tests/test_scaffold.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: AGPL-3.0-only -"""Contract tests for ``civiccore.scaffold`` (ADR-0007). +"""Contract tests for ``townlight_core.scaffold`` (ADR-0007). These tests assert the properties the beta plan actually needs, not a framework: the generated project is a valid module by Core's own manifest contract, its code @@ -20,9 +20,9 @@ import pytest from pydantic import ValidationError -import civiccore.scaffold -from civiccore.platform import ModuleManifest, build_module_registry, validate_windows_local_manifest -from civiccore.scaffold import ( +import townlight_core.scaffold +from townlight_core.platform import ModuleManifest, build_module_registry, validate_windows_local_manifest +from townlight_core.scaffold import ( InvalidModuleSpecError, ModuleSpec, PathContainmentError, @@ -39,7 +39,7 @@ "name": "CivicNotes (synthetic)", "description": "Synthetic module used to prove the generator contract.", "version": "0.1.0", - "civiccore_min_version": "1.3.0.dev1", + "townlight_core_min_version": "1.3.0.dev1", "staff_roles": ("notes_editor",), "route_path": "/notes", } @@ -68,7 +68,7 @@ def test_spec_derives_every_identity_from_module_id() -> None: "civic notes", "civicnotes;rm -rf", "notes.exe", - "civiccore", + "townlight_core", "tests", "json", "import", @@ -82,7 +82,7 @@ def test_unsafe_or_reserved_module_ids_are_refused_not_sanitised(module_id: str) make_spec(module_id=module_id) with pytest.raises(InvalidModuleSpecError): - civiccore.scaffold.spec.assert_admissible_module_id(module_id) + townlight_core.scaffold.spec.assert_admissible_module_id(module_id) def test_plan_is_complete_and_pure(tmp_path: Path) -> None: @@ -124,12 +124,12 @@ def test_generated_manifest_is_valid_under_core_contracts() -> None: assert manifest.migrations[0].id == "civicnotes_0001_baseline" # Off by default; an operator selects it explicitly and then it resolves enabled. - default_registry = build_module_registry([payload], civiccore_version="1.3.0.dev1") + default_registry = build_module_registry([payload], townlight_core_version="1.3.0.dev1") assert default_registry.entries[0].status == "disabled" registry = build_module_registry( [payload], - civiccore_version="1.3.0.dev1", + townlight_core_version="1.3.0.dev1", selected_module_ids={"civicnotes"}, ) entry = registry.entries[0] @@ -151,7 +151,7 @@ def test_generated_sources_carry_agpl_spdx_and_no_secrets() -> None: pyproject = next(item.content for item in plan.files if item.relative_path == "pyproject.toml") assert 'license = "AGPL-3.0-only"' in pyproject - assert "civiccore>=" in pyproject + assert "townlight_core>=" in pyproject def test_generated_health_probe_is_the_only_unauthenticated_route() -> None: @@ -235,7 +235,7 @@ def test_generated_migration_owns_only_its_own_schema(tmp_path: Path) -> None: assert 'revision = "civicnotes_0001_baseline"' in baseline assert "down_revision = None" in baseline assert "CREATE SCHEMA IF NOT EXISTS civicnotes" in baseline - assert "civiccore" not in baseline.replace("civiccore.scaffold", "") + assert "townlight_core" not in baseline.replace("townlight_core.scaffold", "") assert "DROP TABLE" not in baseline.split("def downgrade")[0] assert "upgrade_to_head" in env_py # Alembic creates its version table in civicnotes before the baseline revision runs, @@ -291,7 +291,7 @@ def test_file_target_is_refused(tmp_path: Path) -> None: def test_planned_paths_are_contained_and_parent_traversal_is_refused(monkeypatch) -> None: - from civiccore.scaffold import project as project_module + from townlight_core.scaffold import project as project_module plan = plan_module_project(make_spec()) poisoned = type(plan)( @@ -333,7 +333,7 @@ def test_cli_reports_refusal_and_creates_project(tmp_path: Path) -> None: "-X", "utf8", "-m", - "civiccore.scaffold", + "townlight_core.scaffold", "generate", "civicnotes", "--name", @@ -362,7 +362,7 @@ def test_cli_reports_refusal_and_creates_project(tmp_path: Path) -> None: "-X", "utf8", "-m", - "civiccore.scaffold", + "townlight_core.scaffold", "generate", "../escape", "--name", diff --git a/tests/test_scheduling_cron.py b/tests/test_scheduling_cron.py index 5ce2053..ad430db 100644 --- a/tests/test_scheduling_cron.py +++ b/tests/test_scheduling_cron.py @@ -4,7 +4,7 @@ import pytest -from civiccore.scheduling import ( +from townlight_core.scheduling import ( UTC, compute_next_sync_at, min_interval_minutes, diff --git a/tests/test_search_helpers.py b/tests/test_search_helpers.py index 4b2541a..27d30ff 100644 --- a/tests/test_search_helpers.py +++ b/tests/test_search_helpers.py @@ -2,7 +2,7 @@ import uuid -from civiccore.search import ( +from townlight_core.search import ( access_level_allows, filter_records_by_access_level, normalize_access_value, diff --git a/tests/test_security_at_rest.py b/tests/test_security_at_rest.py index 8f80f1f..fff3d2d 100644 --- a/tests/test_security_at_rest.py +++ b/tests/test_security_at_rest.py @@ -3,7 +3,7 @@ import pytest from cryptography.fernet import Fernet -from civiccore.security import AtRestDecryptionError, decrypt_json, encrypt_json, is_encrypted +from townlight_core.security import AtRestDecryptionError, decrypt_json, encrypt_json, is_encrypted def test_encrypt_json_round_trips_dict_payload() -> None: diff --git a/tests/test_security_config_validation.py b/tests/test_security_config_validation.py index 89b7bbf..764ea2b 100644 --- a/tests/test_security_config_validation.py +++ b/tests/test_security_config_validation.py @@ -3,7 +3,7 @@ import pytest from cryptography.fernet import Fernet -from civiccore.security import ( +from townlight_core.security import ( ConfigValidationError, looks_like_placeholder, parse_csv_setting, diff --git a/tests/test_security_host_validation.py b/tests/test_security_host_validation.py index 84f15db..a865552 100644 --- a/tests/test_security_host_validation.py +++ b/tests/test_security_host_validation.py @@ -2,7 +2,7 @@ import pytest -from civiccore.security import ( +from townlight_core.security import ( BLOCK_REASON, extract_odbc_host, is_blocked_host, diff --git a/tests/test_smoke.py b/tests/test_smoke.py index db1eb16..a190da0 100644 --- a/tests/test_smoke.py +++ b/tests/test_smoke.py @@ -4,45 +4,45 @@ import tomllib -def test_import_civiccore() -> None: - import civiccore +def test_import_townlight_core() -> None: + import townlight_core - assert civiccore.__version__ == "1.3.0.dev1" - assert civiccore.roles_grant_access - assert civiccore.access_level_allows - assert civiccore.filter_records_by_access_level - assert civiccore.AuditHashChain - assert civiccore.PersistedAuditLogEntry - assert callable(civiccore.compute_persisted_audit_hash) - assert callable(civiccore.verify_persisted_audit_chain) - assert civiccore.SourceReference - assert civiccore.ExportManifest - assert civiccore.ExportBundle - assert civiccore.CityProfile - assert civiccore.reciprocal_rank_fusion - assert civiccore.import_meeting_payload - assert civiccore.DiscoveredRecord - assert civiccore.FetchedDocument - assert civiccore.SourceMaterial - assert civiccore.validate_cited_sentences - assert civiccore.build_deadline_plan - assert civiccore.evaluate_notice_compliance - assert civiccore.encrypt_json - assert civiccore.LocalTask - assert civiccore.enqueue_local_task - assert civiccore.claim_next_local_task - assert civiccore.run_one_local_task - assert civiccore.validate_url_host - assert civiccore.normalize_trusted_proxy_cidrs - assert civiccore.is_trusted_proxy_ip - assert civiccore.validate_cron_expression - assert civiccore.compute_next_sync_at + assert townlight_core.__version__ == "1.3.0.dev2" + assert townlight_core.roles_grant_access + assert townlight_core.access_level_allows + assert townlight_core.filter_records_by_access_level + assert townlight_core.AuditHashChain + assert townlight_core.PersistedAuditLogEntry + assert callable(townlight_core.compute_persisted_audit_hash) + assert callable(townlight_core.verify_persisted_audit_chain) + assert townlight_core.SourceReference + assert townlight_core.ExportManifest + assert townlight_core.ExportBundle + assert townlight_core.CityProfile + assert townlight_core.reciprocal_rank_fusion + assert townlight_core.import_meeting_payload + assert townlight_core.DiscoveredRecord + assert townlight_core.FetchedDocument + assert townlight_core.SourceMaterial + assert townlight_core.validate_cited_sentences + assert townlight_core.build_deadline_plan + assert townlight_core.evaluate_notice_compliance + assert townlight_core.encrypt_json + assert townlight_core.LocalTask + assert townlight_core.enqueue_local_task + assert townlight_core.claim_next_local_task + assert townlight_core.run_one_local_task + assert townlight_core.validate_url_host + assert townlight_core.normalize_trusted_proxy_cidrs + assert townlight_core.is_trusted_proxy_ip + assert townlight_core.validate_cron_expression + assert townlight_core.compute_next_sync_at def test_package_metadata_marks_v1_as_provisional_recovery_line() -> None: pyproject = tomllib.loads(Path("pyproject.toml").read_text(encoding="utf-8")) - assert pyproject["project"]["version"] == "1.3.0.dev1" + assert pyproject["project"]["version"] == "1.3.0.dev2" assert "Development Status :: 4 - Beta" in pyproject["project"]["classifiers"] assert "Development Status :: 5 - Production/Stable" not in pyproject["project"]["classifiers"] assert "Development Status :: 2 - Pre-Alpha" not in pyproject["project"]["classifiers"] diff --git a/tests/test_suite_session_negative_contract.py b/tests/test_suite_session_negative_contract.py index 8e83f09..48d41e8 100644 --- a/tests/test_suite_session_negative_contract.py +++ b/tests/test_suite_session_negative_contract.py @@ -1,4 +1,4 @@ -"""Negative contract tests for CivicCore-owned suite staff session tokens.""" +"""Negative contract tests for TownlightCore-owned suite staff session tokens.""" from __future__ import annotations @@ -10,12 +10,12 @@ def test_suite_session_rejects_expired_and_wrong_signature_tokens( monkeypatch: pytest.MonkeyPatch, ) -> None: - from civiccore.auth.suite_session import ( + from townlight_core.auth.suite_session import ( issue_suite_session_token, validate_suite_session_token, ) - monkeypatch.setenv("CIVICCORE_SUITE_SESSION_SECRET", "first-test-secret") + monkeypatch.setenv("TOWNLIGHT_CORE_SUITE_SESSION_SECRET", "first-test-secret") expired_token = issue_suite_session_token( subject="operator@example.gov", roles=frozenset({"records_admin"}), @@ -35,7 +35,7 @@ def test_suite_session_rejects_expired_and_wrong_signature_tokens( session_id="wrong-secret-session", expires_at=datetime.now(UTC) + timedelta(minutes=5), ) - monkeypatch.setenv("CIVICCORE_SUITE_SESSION_SECRET", "second-test-secret") + monkeypatch.setenv("TOWNLIGHT_CORE_SUITE_SESSION_SECRET", "second-test-secret") with pytest.raises(PermissionError, match="signature|invalid"): validate_suite_session_token( diff --git a/tests/test_testing_mock_city.py b/tests/test_testing_mock_city.py index 7ceeb9c..d3af709 100644 --- a/tests/test_testing_mock_city.py +++ b/tests/test_testing_mock_city.py @@ -2,7 +2,7 @@ import json -from civiccore.testing import ( +from townlight_core.testing import ( MOCK_CITY_NAME, assert_secret_free_report, mock_city_backup_retention_contract, diff --git a/tests/test_tier1_retrofit_ledger.py b/tests/test_tier1_retrofit_ledger.py index a929867..4fccddc 100644 --- a/tests/test_tier1_retrofit_ledger.py +++ b/tests/test_tier1_retrofit_ledger.py @@ -61,8 +61,8 @@ def test_live_parity_allows_new_post_baseline_releases_with_attestation_assets() entries = _ledger()["entries"] live_releases = {entry["tag"]: set(entry["release_assets"]) for entry in entries} live_releases["v1.0"] = { - "civiccore-1.0.0-py3-none-any.whl", - "civiccore-1.0.0.tar.gz", + "townlight_core-1.0.0-py3-none-any.whl", + "townlight_core-1.0.0.tar.gz", "SHA256SUMS.txt", "release-attestation.json", "release-attestation.json.bundle", @@ -75,7 +75,7 @@ def test_live_parity_rejects_unledgered_releases_without_attestation_assets() -> module = _ledger_check_module() entries = _ledger()["entries"] live_releases = {entry["tag"]: set(entry["release_assets"]) for entry in entries} - live_releases["v0.22.2"] = {"civiccore-0.22.2-py3-none-any.whl"} + live_releases["v0.22.2"] = {"townlight_core-0.22.2-py3-none-any.whl"} try: module.validate_live_release_parity(entries, live_releases) diff --git a/tests/test_verification_browser_evidence.py b/tests/test_verification_browser_evidence.py index 08dc4f9..de2ab11 100644 --- a/tests/test_verification_browser_evidence.py +++ b/tests/test_verification_browser_evidence.py @@ -5,7 +5,7 @@ import pytest -from civiccore.verification import ( +from townlight_core.verification import ( BrowserReleaseEvidenceResult, normalized_text_sha256, validate_release_browser_evidence, diff --git a/civiccore-ui/README.md b/townlight_core-ui/README.md similarity index 91% rename from civiccore-ui/README.md rename to townlight_core-ui/README.md index feac16f..4a8c5a5 100644 --- a/civiccore-ui/README.md +++ b/townlight_core-ui/README.md @@ -1,6 +1,6 @@ - + -# civiccore-ui — the Townlight design system +# townlight_core-ui — the Townlight design system The shared, versioned UI layer every Townlight module builds on. Three layers, each the single source of truth for its concern: @@ -25,7 +25,7 @@ redefines a `:root` custom property that `tokens.css` already owns. ## Consumption (offline binaries cannot `@import` at runtime) Consumers — the Tauri/WebView2 desktop app, the umbrella prototype — **vendor a -generated copy** of each file, pinned to a `civiccore` version, with a CI +generated copy** of each file, pinned to a `townlight_core` version, with a CI `--check` drift gate that fails the build if a vendored copy drifts from the source here. Any JS/JSON mirror is generated, never hand-maintained. This is the same idiom as the `source_commit` pins and the generated topology block. See the diff --git a/civiccore-ui/components/components-reference.html b/townlight_core-ui/components/components-reference.html similarity index 99% rename from civiccore-ui/components/components-reference.html rename to townlight_core-ui/components/components-reference.html index ce86f46..f6bac56 100644 --- a/civiccore-ui/components/components-reference.html +++ b/townlight_core-ui/components/components-reference.html @@ -4,7 +4,7 @@ Townlight — Component Reference - diff --git a/civiccore-ui/components/components.css b/townlight_core-ui/components/components.css similarity index 97% rename from civiccore-ui/components/components.css rename to townlight_core-ui/components/components.css index 2e83c62..74562ad 100644 --- a/civiccore-ui/components/components.css +++ b/townlight_core-ui/components/components.css @@ -1,15 +1,15 @@ /* ============================================================================= - CivicSuite component primitives — CANONICAL COMPONENT LAYER + Townlight component primitives — CANONICAL COMPONENT LAYER ----------------------------------------------------------------------------- Buttons, badges, status ribbon, tables, forms, alerts, first-run setup steps, empty states, and the audit drawer. Extracted faithfully from the canonical - prototype (docs/design/ui-ux-prototype/styles.css in the CivicSuite umbrella + prototype (docs/design/ui-ux-prototype/styles.css in the Townlight umbrella repo) — same class names, same behavior — so this file becomes the single source for component STRUCTURE the way tokens.css is the source for VALUES. - CONSUMPTION: consumes civiccore-ui/tokens/tokens.css (all colors/type/density + CONSUMPTION: consumes townlight_core-ui/tokens/tokens.css (all colors/type/density come from those custom properties). Load tokens.css first, then this file. - Offline consumers vendor a generated copy pinned to a civiccore version, with + Offline consumers vendor a generated copy pinned to a townlight_core version, with a CI --check drift gate (same idiom as tokens.css). AA: one correction vs the prototype at extraction time — .badge.gold uses diff --git a/civiccore-ui/shell/shell.css b/townlight_core-ui/shell/shell.css similarity index 98% rename from civiccore-ui/shell/shell.css rename to townlight_core-ui/shell/shell.css index 0699bc1..10f6221 100644 --- a/civiccore-ui/shell/shell.css +++ b/townlight_core-ui/shell/shell.css @@ -1,13 +1,13 @@ /* ============================================================================= - CivicSuite desktop shell chrome — CANONICAL SHELL LAYER + Townlight desktop shell chrome — CANONICAL SHELL LAYER ----------------------------------------------------------------------------- The app frame the six workflow modules render inside: brand block, topbar, surface switcher (staff / resident / admin), primary nav, main workspace, page header, letterhead, and the global search overlay. Extracted faithfully from the canonical prototype (docs/design/ui-ux-prototype/styles.css). - CONSUMPTION: consumes civiccore-ui/tokens/tokens.css and pairs with - civiccore-ui/components/components.css. Load tokens.css, then components.css, + CONSUMPTION: consumes townlight_core-ui/tokens/tokens.css and pairs with + townlight_core-ui/components/components.css. Load tokens.css, then components.css, then this file. Offline consumers vendor a generated copy, drift-gated in CI. ========================================================================== */ diff --git a/civiccore-ui/tokens/tokens-reference.html b/townlight_core-ui/tokens/tokens-reference.html similarity index 97% rename from civiccore-ui/tokens/tokens-reference.html rename to townlight_core-ui/tokens/tokens-reference.html index 2fd22dc..d82e8b1 100644 --- a/civiccore-ui/tokens/tokens-reference.html +++ b/townlight_core-ui/tokens/tokens-reference.html @@ -4,7 +4,7 @@ Townlight — Design Tokens Reference - @@ -79,7 +79,7 @@
    Townlight · Design System

    Design Tokens Reference

    -

    The visual reference for civiccore-ui/tokens/tokens.css — the suite's single token source. Every value here is rendered live from the token file. Contrast ratios are WCAG 2.x against the noted surface; AA requires 4.5:1 for normal text, 3:1 for large text and UI boundaries.

    +

    The visual reference for townlight_core-ui/tokens/tokens.css — the suite's single token source. Every value here is rendered live from the token file. Contrast ratios are WCAG 2.x against the noted surface; AA requires 4.5:1 for normal text, 3:1 for large text and UI boundaries.

    diff --git a/civiccore-ui/tokens/tokens.css b/townlight_core-ui/tokens/tokens.css similarity index 98% rename from civiccore-ui/tokens/tokens.css rename to townlight_core-ui/tokens/tokens.css index a61c660..6e62300 100644 --- a/civiccore-ui/tokens/tokens.css +++ b/townlight_core-ui/tokens/tokens.css @@ -1,5 +1,5 @@ /* ============================================================================= - CivicSuite design tokens — SINGLE SOURCE OF TRUTH + Townlight design tokens — SINGLE SOURCE OF TRUTH ----------------------------------------------------------------------------- Palette: light civic / navy / warm gold. "Modern public infrastructure." @@ -10,7 +10,7 @@ See docs/design/windows-desktop-design-control.md. CONSUMPTION (offline binaries cannot @import at runtime) - Consumers VENDOR a generated copy of this file, pinned to a civiccore + Consumers VENDOR a generated copy of this file, pinned to a townlight_core version, and a CI --check gate fails the build if the vendored copy drifts. - Desktop app (Tauri/WebView2): desktop/src/styles.css consumes a vendored copy. - Prototype (docs/design/ui-ux-prototype/styles.css) consumes a vendored copy. diff --git a/civiccore/__init__.py b/townlight_core/__init__.py similarity index 93% rename from civiccore/__init__.py rename to townlight_core/__init__.py index e52959d..aca3981 100644 --- a/civiccore/__init__.py +++ b/townlight_core/__init__.py @@ -16,9 +16,9 @@ from __future__ import annotations -__version__ = "1.3.0.dev1" +__version__ = "1.3.0.dev2" -from civiccore.audit import ( +from townlight_core.audit import ( AuditActor, AuditEvent, AuditHashChain, @@ -31,14 +31,14 @@ compute_persisted_audit_hash, verify_persisted_audit_chain, ) -from civiccore.city_profile import ( +from townlight_core.city_profile import ( CityProfile, DepartmentProfile, DeploymentProfile, ModuleEnablement, load_city_profile, ) -from civiccore.connectors import ( +from townlight_core.connectors import ( ConnectorImportError, ExportManifest, ImportedAgendaItem, @@ -67,14 +67,14 @@ validate_manifest, with_http_retry, ) -from civiccore.exports import ( +from townlight_core.exports import ( BundleFile, ExportBundle, build_sha256sums, validate_bundle, write_manifest, ) -from civiccore.ingest import ( +from townlight_core.ingest import ( CitedSentence, CitationValidationError, DataSource, @@ -95,7 +95,7 @@ register_handler, validate_cited_sentences, ) -from civiccore.notifications import ( +from townlight_core.notifications import ( DeadlinePlan, NoticeComplianceResult, NoticeComplianceWarning, @@ -103,7 +103,7 @@ build_deadline_plan, evaluate_notice_compliance, ) -from civiccore.onboarding import ( +from townlight_core.onboarding import ( DEFAULT_PROFILE_FIELDS, OnboardingField, OnboardingProgress, @@ -112,7 +112,7 @@ next_profile_prompt, parse_profile_answer, ) -from civiccore.platform import ( +from townlight_core.platform import ( WINDOWS_LOCAL_BLOCKED_RUNTIME_KINDS, BackupItem, BackupManifest, @@ -161,14 +161,14 @@ validate_backup_manifest, validate_windows_local_manifest, ) -from civiccore.provenance import ( +from townlight_core.provenance import ( CitationTarget, DocumentMetadata, ProvenanceBundle, SourceKind, SourceReference, ) -from civiccore.security import ( +from townlight_core.security import ( AtRestDecryptionError, ConfigValidationError, build_fernet, @@ -188,7 +188,7 @@ validate_secret_setting, validate_url_host, ) -from civiccore.search import ( +from townlight_core.search import ( access_level_allows, filter_records_by_access_level, normalize_access_value, @@ -199,13 +199,13 @@ roles_grant_access, search_text_matches_query, ) -from civiccore.scheduling import ( +from townlight_core.scheduling import ( UTC, compute_next_sync_at, min_interval_minutes, validate_cron_expression, ) -from civiccore.release_provenance import ( +from townlight_core.release_provenance import ( ATTESTATION_SCHEMA_VERSION, FixtureProvenanceClient, GitHubProvenanceClient, @@ -217,7 +217,7 @@ run_fixtures, verify_release_provenance, ) -from civiccore.verification import normalized_text_sha256, validate_release_browser_evidence +from townlight_core.verification import normalized_text_sha256, validate_release_browser_evidence __all__ = [ "__version__", diff --git a/civiccore/audit/__init__.py b/townlight_core/audit/__init__.py similarity index 100% rename from civiccore/audit/__init__.py rename to townlight_core/audit/__init__.py diff --git a/civiccore/audit/primitives.py b/townlight_core/audit/primitives.py similarity index 100% rename from civiccore/audit/primitives.py rename to townlight_core/audit/primitives.py diff --git a/civiccore/auth/__init__.py b/townlight_core/auth/__init__.py similarity index 83% rename from civiccore/auth/__init__.py rename to townlight_core/auth/__init__.py index 9c481b5..4771d69 100644 --- a/civiccore/auth/__init__.py +++ b/townlight_core/auth/__init__.py @@ -1,18 +1,18 @@ """Authentication helpers for Townlight FastAPI services. -``civiccore.auth`` verifies credentials (bearer tokens, trusted proxy headers, staff keys and -suite sessions). ``civiccore.auth.department_scope`` is the separate *authorization* contract: +``townlight_core.auth`` verifies credentials (bearer tokens, trusted proxy headers, staff keys and +suite sessions). ``townlight_core.auth.department_scope`` is the separate *authorization* contract: it consumes an already-authenticated principal and refuses by default unless a persisted, server-side department grant admits the request. """ -from civiccore.auth.bearer import ( +from townlight_core.auth.bearer import ( AuthenticatedPrincipal, authorize_bearer_roles, parse_token_role_map, resolve_optional_bearer_roles, ) -from civiccore.auth.department_scope import ( +from townlight_core.auth.department_scope import ( AuthorityProvenanceError, DepartmentAccessDenied, DepartmentAuthority, @@ -31,15 +31,15 @@ scope_search_results, TRUSTED_AUTH_METHODS, ) -from civiccore.auth.staff_key import staff_key_gate -from civiccore.auth.suite_session import ( +from townlight_core.auth.staff_key import staff_key_gate +from townlight_core.auth.suite_session import ( SuiteSessionConfigError, SuiteSessionPrincipal, issue_suite_session_token, revoke_suite_session, validate_suite_session_token, ) -from civiccore.auth.trusted_headers import ( +from townlight_core.auth.trusted_headers import ( authorize_trusted_header_roles, enforce_trusted_proxy_source, load_trusted_header_auth_config, diff --git a/civiccore/auth/bearer.py b/townlight_core/auth/bearer.py similarity index 100% rename from civiccore/auth/bearer.py rename to townlight_core/auth/bearer.py diff --git a/civiccore/auth/department_scope.py b/townlight_core/auth/department_scope.py similarity index 97% rename from civiccore/auth/department_scope.py rename to townlight_core/auth/department_scope.py index 208b2fd..562c3a4 100644 --- a/civiccore/auth/department_scope.py +++ b/townlight_core/auth/department_scope.py @@ -11,15 +11,15 @@ What this module is not ----------------------- It is not an identity provider and it does not authenticate anyone. Credential verification -stays in the shipped helpers (:mod:`civiccore.auth.bearer`, -:mod:`civiccore.auth.trusted_headers`, :mod:`civiccore.auth.staff_key`, -:mod:`civiccore.auth.suite_session`). This module consumes the *already authenticated* +stays in the shipped helpers (:mod:`townlight_core.auth.bearer`, +:mod:`townlight_core.auth.trusted_headers`, :mod:`townlight_core.auth.staff_key`, +:mod:`townlight_core.auth.suite_session`). This module consumes the *already authenticated* principal those helpers return. The trust boundary (read this before adding a caller) ---------------------------------------------------- The only admissible source of a department claim is the persisted, server-side grant ledger -``civiccore_department_grant_events`` read through :func:`active_department_grants` and keyed by +``townlight_core_department_grant_events`` read through :func:`active_department_grants` and keyed by ``(scope_id, subject, department_id)``. A department named in a request body, query string, cookie, HTTP header, environment variable, JWT custom claim or model output is **not** a grant: :func:`resolve_department_authority` has no parameter that accepts one, and @@ -60,7 +60,7 @@ from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession -from civiccore.search import normalize_access_values, roles_grant_access +from townlight_core.search import normalize_access_values, roles_grant_access __all__ = [ "DepartmentAuthorityError", @@ -84,7 +84,7 @@ "SCOPE_PATTERN", ] -GRANT_TABLE = "civiccore_department_grant_events" +GRANT_TABLE = "townlight_core_department_grant_events" #: Identity sources produced by a credential check inside the service or by a proxy that is #: verified separately (``enforce_trusted_proxy_source``). Anything else — including a raw @@ -465,7 +465,7 @@ async def _append_event( # Serialize per (scope, subject, department): sequence assignment must be total. await session.execute( text("SELECT pg_advisory_xact_lock(hashtextextended(:key, 0))"), - {"key": f"civiccore.department_authority:{scope_id}:{subject}:{department_id}"}, + {"key": f"townlight_core.department_authority:{scope_id}:{subject}:{department_id}"}, ) latest = ( ( @@ -696,7 +696,7 @@ def scope_model_context_chunks( """Return only chunk text the authority may send to a model. Chunks are ``(record, text)`` pairs. The returned list is the exact argument Core's existing - :func:`civiccore.llm.context.assemble_context` accepts as ``chunks``, so no second context + :func:`townlight_core.llm.context.assemble_context` accepts as ``chunks``, so no second context builder is introduced. """ diff --git a/civiccore/auth/staff_key.py b/townlight_core/auth/staff_key.py similarity index 97% rename from civiccore/auth/staff_key.py rename to townlight_core/auth/staff_key.py index 799c5fb..f9418ae 100644 --- a/civiccore/auth/staff_key.py +++ b/townlight_core/auth/staff_key.py @@ -9,7 +9,7 @@ from fastapi import Header, HTTPException -from civiccore.auth.bearer import AuthenticatedPrincipal +from townlight_core.auth.bearer import AuthenticatedPrincipal def _role_header_for_staff_key_header(header: str) -> str: diff --git a/civiccore/auth/suite_session.py b/townlight_core/auth/suite_session.py similarity index 98% rename from civiccore/auth/suite_session.py rename to townlight_core/auth/suite_session.py index 6e3b671..f39395f 100644 --- a/civiccore/auth/suite_session.py +++ b/townlight_core/auth/suite_session.py @@ -15,8 +15,8 @@ from typing import Any -_ENV_VAR = "CIVICCORE_SUITE_SESSION_SECRET" -_REVOCATION_FILE_ENV_VAR = "CIVICCORE_SUITE_SESSION_REVOCATION_FILE" +_ENV_VAR = "TOWNLIGHT_CORE_SUITE_SESSION_SECRET" +_REVOCATION_FILE_ENV_VAR = "TOWNLIGHT_CORE_SUITE_SESSION_REVOCATION_FILE" _DEFAULT_TOKEN_TTL = timedelta(minutes=15) _MIN_KEY_LENGTH = 16 _MAX_LOCAL_REVOCATIONS = 4096 diff --git a/civiccore/auth/trusted_headers.py b/townlight_core/auth/trusted_headers.py similarity index 98% rename from civiccore/auth/trusted_headers.py rename to townlight_core/auth/trusted_headers.py index 35255f3..3d8a52b 100644 --- a/civiccore/auth/trusted_headers.py +++ b/townlight_core/auth/trusted_headers.py @@ -9,8 +9,8 @@ from fastapi import HTTPException -from civiccore.auth.bearer import AuthenticatedPrincipal -from civiccore.security import is_trusted_proxy_ip, normalize_trusted_proxy_cidrs +from townlight_core.auth.bearer import AuthenticatedPrincipal +from townlight_core.security import is_trusted_proxy_ip, normalize_trusted_proxy_cidrs @dataclass(frozen=True) diff --git a/civiccore/catalog/__init__.py b/townlight_core/catalog/__init__.py similarity index 96% rename from civiccore/catalog/__init__.py rename to townlight_core/catalog/__init__.py index bfe734f..f181179 100644 --- a/civiccore/catalog/__init__.py +++ b/townlight_core/catalog/__init__.py @@ -98,7 +98,7 @@ async def import_catalog(session: AsyncSession, value: dict, *, actor_id: str) - prior = ( ( await session.execute( - text("SELECT source_sha256 FROM civiccore_catalog_imports WHERE version=:version"), + text("SELECT source_sha256 FROM townlight_core_catalog_imports WHERE version=:version"), {"version": bundle.catalog_version}, ) ) @@ -139,7 +139,7 @@ async def import_catalog(session: AsyncSession, value: dict, *, actor_id: str) - ) await session.execute( text( - "INSERT INTO civiccore_catalog_imports (version,source_sha256,entry_count,actor_id) VALUES (:version,:digest,:count,:actor)" + "INSERT INTO townlight_core_catalog_imports (version,source_sha256,entry_count,actor_id) VALUES (:version,:digest,:count,:actor)" ), { "version": bundle.catalog_version, diff --git a/civiccore/city_profile/__init__.py b/townlight_core/city_profile/__init__.py similarity index 100% rename from civiccore/city_profile/__init__.py rename to townlight_core/city_profile/__init__.py diff --git a/civiccore/city_profile/models.py b/townlight_core/city_profile/models.py similarity index 100% rename from civiccore/city_profile/models.py rename to townlight_core/city_profile/models.py diff --git a/civiccore/connectors/__init__.py b/townlight_core/connectors/__init__.py similarity index 88% rename from civiccore/connectors/__init__.py rename to townlight_core/connectors/__init__.py index 9d1305a..2ecb88b 100644 --- a/civiccore/connectors/__init__.py +++ b/townlight_core/connectors/__init__.py @@ -1,25 +1,25 @@ """Shared offline connector primitives for current Townlight consumers.""" -from civiccore.connectors.imports import ( +from townlight_core.connectors.imports import ( ConnectorImportError, ImportedAgendaItem, ImportedMeeting, SUPPORTED_CONNECTORS, import_meeting_payload, ) -from civiccore.connectors.delta import ( +from townlight_core.connectors.delta import ( DELTA_QUERY_PARAMS, VendorDeltaRequestPlan, plan_vendor_delta_request, ) -from civiccore.connectors.manifest import ( +from townlight_core.connectors.manifest import ( ExportManifest, ImportManifest, ManifestFile, ManifestValidationError, validate_manifest, ) -from civiccore.connectors.sync import ( +from townlight_core.connectors.sync import ( SyncCircuitPolicy, SyncCircuitState, SyncHealthStatus, diff --git a/civiccore/connectors/delta.py b/townlight_core/connectors/delta.py similarity index 100% rename from civiccore/connectors/delta.py rename to townlight_core/connectors/delta.py diff --git a/civiccore/connectors/imports.py b/townlight_core/connectors/imports.py similarity index 100% rename from civiccore/connectors/imports.py rename to townlight_core/connectors/imports.py diff --git a/civiccore/connectors/manifest.py b/townlight_core/connectors/manifest.py similarity index 94% rename from civiccore/connectors/manifest.py rename to townlight_core/connectors/manifest.py index 59b1810..32b17d5 100644 --- a/civiccore/connectors/manifest.py +++ b/townlight_core/connectors/manifest.py @@ -80,7 +80,7 @@ class _ManifestBase(BaseModel): manifest_version: str = "1.0" module_name: str module_version: str - civiccore_version: str + townlight_core_version: str purpose: ManifestPurpose source_files: list[ManifestFile] = Field(default_factory=list) generated_files: list[ManifestFile] = Field(default_factory=list) @@ -88,7 +88,7 @@ class _ManifestBase(BaseModel): model_config = ConfigDict(extra="forbid") - @field_validator("manifest_version", "module_name", "module_version", "civiccore_version") + @field_validator("manifest_version", "module_name", "module_version", "townlight_core_version") @classmethod def _validate_required_text(cls, value: str) -> str: return _clean_string(value, "required text field") @@ -190,7 +190,7 @@ def validate_manifest( manifest: str | Path | dict[str, Any] | ImportManifest | ExportManifest, *, base_path: str | Path | None = None, - expected_civiccore_version: str | None = None, + expected_townlight_core_version: str | None = None, ) -> ImportManifest | ExportManifest: """Validate a manifest payload and, when requested, its files on disk. @@ -198,7 +198,7 @@ def validate_manifest( manifest: Manifest model, mapping, JSON string path, or JSON Path. base_path: Optional directory used to verify file existence, byte sizes, and SHA-256 checksums. - expected_civiccore_version: Optional exact Townlight Core version to require. + expected_townlight_core_version: Optional exact Townlight Core version to require. Raises: ManifestValidationError: If schema validation or file verification fails. @@ -211,12 +211,12 @@ def validate_manifest( except ValidationError as exc: raise ManifestValidationError(str(exc)) from exc - if expected_civiccore_version is not None and ( - validated.civiccore_version != expected_civiccore_version + if expected_townlight_core_version is not None and ( + validated.townlight_core_version != expected_townlight_core_version ): raise ManifestValidationError( "Manifest Townlight Core version mismatch: " - f"expected {expected_civiccore_version}, got {validated.civiccore_version}" + f"expected {expected_townlight_core_version}, got {validated.townlight_core_version}" ) if base_path is not None: diff --git a/civiccore/connectors/sync.py b/townlight_core/connectors/sync.py similarity index 99% rename from civiccore/connectors/sync.py rename to townlight_core/connectors/sync.py index 934f4c0..5a7de93 100644 --- a/civiccore/connectors/sync.py +++ b/townlight_core/connectors/sync.py @@ -16,7 +16,7 @@ from typing import Literal, TypeVar import httpx -from civiccore.scheduling import compute_next_sync_at +from townlight_core.scheduling import compute_next_sync_at logger = logging.getLogger(__name__) diff --git a/townlight_core/db/__init__.py b/townlight_core/db/__init__.py new file mode 100644 index 0000000..867d9f1 --- /dev/null +++ b/townlight_core/db/__init__.py @@ -0,0 +1,18 @@ +""" +Shared SQLAlchemy declarative base for all townlight_core ORM models. + +All ORM models in townlight_core (and downstream consumers such as townlight_records) +should inherit from this ``Base`` class so that metadata is shared across the +same declarative registry. In Phase 2 Step 5, townlight_records will migrate its +own models to import and inherit from this Base rather than maintaining a +separate one. +""" + +from sqlalchemy.orm import DeclarativeBase + + +class Base(DeclarativeBase): + """Shared declarative base for all townlight_core ORM models.""" + + +__all__ = ["Base"] diff --git a/civiccore/exemptions/__init__.py b/townlight_core/exemptions/__init__.py similarity index 98% rename from civiccore/exemptions/__init__.py rename to townlight_core/exemptions/__init__.py index 329f9ba..163b3fe 100644 --- a/civiccore/exemptions/__init__.py +++ b/townlight_core/exemptions/__init__.py @@ -4,7 +4,7 @@ The caller owns authorization, rule selection and review. Jurisdiction completeness and legal correctness are not inferred from a match. -Citation and version retention live in :mod:`civiccore.exemptions.history`, which +Citation and version retention live in :mod:`townlight_core.exemptions.history`, which appends immutable cited rule versions and returns ``Rule`` objects for exactly the persisted version via ``RuleVersion.as_rule()``. That module adds history around this single evaluator; it is not a second rule engine and it never declares a diff --git a/civiccore/exemptions/history.py b/townlight_core/exemptions/history.py similarity index 97% rename from civiccore/exemptions/history.py rename to townlight_core/exemptions/history.py index 5d9e84c..1606eaa 100644 --- a/civiccore/exemptions/history.py +++ b/townlight_core/exemptions/history.py @@ -16,11 +16,11 @@ Relationship to the evaluator ----------------------------- -There is exactly one rule evaluation path: :func:`civiccore.exemptions.evaluate`. +There is exactly one rule evaluation path: :func:`townlight_core.exemptions.evaluate`. This module adds version history *around* it; :meth:`RuleVersion.as_rule` returns -the existing frozen :class:`civiccore.exemptions.Rule` so persisted history feeds +the existing frozen :class:`townlight_core.exemptions.Rule` so persisted history feeds that evaluator instead of a second, competing rule engine. Pattern admission at -write time reuses :func:`civiccore.exemptions.validate_rule_pattern`, which runs +write time reuses :func:`townlight_core.exemptions.validate_rule_pattern`, which runs the same shared scanner, so an invalid or catastrophic expression is refused before it can be stored as "reviewed". @@ -69,7 +69,7 @@ "TABLE", ] -TABLE = "civiccore_rule_versions" +TABLE = "townlight_core_rule_versions" COVERAGE_DECLARATIONS = ("synthetic-fixture", "tenant-supplied") @@ -255,7 +255,7 @@ async def record_rule_version( # they are writing the next version. await session.execute( text("SELECT pg_advisory_xact_lock(hashtextextended(:key, 0))"), - {"key": f"civiccore.rule_versions:{item.state_code}:{item.rule_id}"}, + {"key": f"townlight_core.rule_versions:{item.state_code}:{item.rule_id}"}, ) other_states = await _state_codes_for(session, item.rule_id) - {item.state_code} diff --git a/civiccore/exemptions/patterns.py b/townlight_core/exemptions/patterns.py similarity index 100% rename from civiccore/exemptions/patterns.py rename to townlight_core/exemptions/patterns.py diff --git a/civiccore/exports/__init__.py b/townlight_core/exports/__init__.py similarity index 86% rename from civiccore/exports/__init__.py rename to townlight_core/exports/__init__.py index 7d06f7c..db037b6 100644 --- a/civiccore/exports/__init__.py +++ b/townlight_core/exports/__init__.py @@ -1,6 +1,6 @@ """Offline static export bundle helpers for Townlight Core.""" -from civiccore.exports.bundle import ( +from townlight_core.exports.bundle import ( BundleFile, ExportBundle, build_sha256sums, diff --git a/civiccore/exports/bundle.py b/townlight_core/exports/bundle.py similarity index 96% rename from civiccore/exports/bundle.py rename to townlight_core/exports/bundle.py index 0582a5f..3d04261 100644 --- a/civiccore/exports/bundle.py +++ b/townlight_core/exports/bundle.py @@ -7,8 +7,8 @@ from pydantic import BaseModel, ConfigDict, Field, model_validator -from civiccore import __version__ as CIVICCORE_VERSION -from civiccore.connectors.manifest import ( +from townlight_core import __version__ as TOWNLIGHT_CORE_VERSION +from townlight_core.connectors.manifest import ( ExportManifest, ManifestFile, ManifestValidationError, @@ -56,7 +56,7 @@ class ExportBundle(BaseModel): module_name: str module_version: str - civiccore_version: str = CIVICCORE_VERSION + townlight_core_version: str = TOWNLIGHT_CORE_VERSION purpose: str = "static_export_bundle" files: list[BundleFile] = Field(default_factory=list) limitations: list[str] = Field(default_factory=list) @@ -77,7 +77,7 @@ def to_manifest(self) -> ExportManifest: return ExportManifest( module_name=self.module_name, module_version=self.module_version, - civiccore_version=self.civiccore_version, + townlight_core_version=self.townlight_core_version, purpose="static_export_bundle", source_files=[], generated_files=[ManifestFile.model_validate(file.model_dump()) for file in self.files], diff --git a/civiccore/ingest/__init__.py b/townlight_core/ingest/__init__.py similarity index 89% rename from civiccore/ingest/__init__.py rename to townlight_core/ingest/__init__.py index 173865c..0469baf 100644 --- a/civiccore/ingest/__init__.py +++ b/townlight_core/ingest/__init__.py @@ -5,7 +5,7 @@ module workflows that parse source files into sentence-aware vector chunks. """ -from civiccore.ingest.contracts import ( +from townlight_core.ingest.contracts import ( CitedSentence, CitationValidationError, DiscoveredRecord, @@ -15,14 +15,14 @@ SourceMaterial, validate_cited_sentences, ) -from civiccore.ingest.models import ( +from townlight_core.ingest.models import ( DataSource, Document, DocumentChunk, IngestionStatus, SourceType, ) -from civiccore.ingest.pipeline import ( +from townlight_core.ingest.pipeline import ( compute_file_hash, ingest_bytes, ingest_directory, diff --git a/civiccore/ingest/chunker.py b/townlight_core/ingest/chunker.py similarity index 100% rename from civiccore/ingest/chunker.py rename to townlight_core/ingest/chunker.py diff --git a/civiccore/ingest/contracts.py b/townlight_core/ingest/contracts.py similarity index 100% rename from civiccore/ingest/contracts.py rename to townlight_core/ingest/contracts.py diff --git a/civiccore/ingest/embedder.py b/townlight_core/ingest/embedder.py similarity index 96% rename from civiccore/ingest/embedder.py rename to townlight_core/ingest/embedder.py index 4164ea1..fad81ab 100644 --- a/civiccore/ingest/embedder.py +++ b/townlight_core/ingest/embedder.py @@ -4,7 +4,7 @@ import os -from civiccore.llm.providers import OllamaProvider +from townlight_core.llm.providers import OllamaProvider _providers: dict[str, OllamaProvider] = {} diff --git a/civiccore/ingest/llm_extractor.py b/townlight_core/ingest/llm_extractor.py similarity index 98% rename from civiccore/ingest/llm_extractor.py rename to townlight_core/ingest/llm_extractor.py index b13b55f..5f66784 100644 --- a/civiccore/ingest/llm_extractor.py +++ b/townlight_core/ingest/llm_extractor.py @@ -3,7 +3,7 @@ import os from pathlib import Path -from civiccore.llm.providers import OllamaProvider +from townlight_core.llm.providers import OllamaProvider logger = logging.getLogger(__name__) diff --git a/civiccore/ingest/models.py b/townlight_core/ingest/models.py similarity index 99% rename from civiccore/ingest/models.py rename to townlight_core/ingest/models.py index 4335163..15b9a66 100644 --- a/civiccore/ingest/models.py +++ b/townlight_core/ingest/models.py @@ -12,7 +12,7 @@ from sqlalchemy.dialects.postgresql import JSONB, UUID from sqlalchemy.orm import Mapped, mapped_column -from civiccore.db import Base +from townlight_core.db import Base class SourceType(str, enum.Enum): @@ -45,7 +45,7 @@ class DataSource(Base): ) connection_config: Mapped[dict[str, Any]] = mapped_column(JSONB, default=dict) is_active: Mapped[bool] = mapped_column(Boolean, default=True) - # The baseline migration owns the DB-level FK to users(id). CivicCore has no + # The baseline migration owns the DB-level FK to users(id). TownlightCore has no # User ORM model in this metadata registry, so an ORM ForeignKey would break # standalone ingestion sessions with NoReferencedTableError. created_by: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True)) diff --git a/civiccore/ingest/parsers/__init__.py b/townlight_core/ingest/parsers/__init__.py similarity index 54% rename from civiccore/ingest/parsers/__init__.py rename to townlight_core/ingest/parsers/__init__.py index f67c912..91f878f 100644 --- a/civiccore/ingest/parsers/__init__.py +++ b/townlight_core/ingest/parsers/__init__.py @@ -1,12 +1,12 @@ from pathlib import Path -from civiccore.ingest.parsers.base import BaseParser, ParseResult -from civiccore.ingest.parsers.csv_parser import CsvParser -from civiccore.ingest.parsers.docx import DocxParser -from civiccore.ingest.parsers.email import EmailParser -from civiccore.ingest.parsers.html import HtmlParser -from civiccore.ingest.parsers.pdf import PdfParser -from civiccore.ingest.parsers.text import TextParser -from civiccore.ingest.parsers.xlsx import XlsxParser +from townlight_core.ingest.parsers.base import BaseParser, ParseResult +from townlight_core.ingest.parsers.csv_parser import CsvParser +from townlight_core.ingest.parsers.docx import DocxParser +from townlight_core.ingest.parsers.email import EmailParser +from townlight_core.ingest.parsers.html import HtmlParser +from townlight_core.ingest.parsers.pdf import PdfParser +from townlight_core.ingest.parsers.text import TextParser +from townlight_core.ingest.parsers.xlsx import XlsxParser _PARSERS: list[BaseParser] = [PdfParser(), DocxParser(), XlsxParser(), CsvParser(), EmailParser(), HtmlParser(), TextParser()] IMAGE_EXTENSIONS = {".jpg", ".jpeg", ".png", ".tiff", ".tif", ".bmp"} diff --git a/civiccore/ingest/parsers/base.py b/townlight_core/ingest/parsers/base.py similarity index 100% rename from civiccore/ingest/parsers/base.py rename to townlight_core/ingest/parsers/base.py diff --git a/civiccore/ingest/parsers/csv_parser.py b/townlight_core/ingest/parsers/csv_parser.py similarity index 89% rename from civiccore/ingest/parsers/csv_parser.py rename to townlight_core/ingest/parsers/csv_parser.py index 3342f41..48edffe 100644 --- a/civiccore/ingest/parsers/csv_parser.py +++ b/townlight_core/ingest/parsers/csv_parser.py @@ -1,6 +1,6 @@ import csv from pathlib import Path -from civiccore.ingest.parsers.base import BaseParser, ParsedPage, ParseResult +from townlight_core.ingest.parsers.base import BaseParser, ParsedPage, ParseResult class CsvParser(BaseParser): supported_extensions = [".csv", ".tsv"] diff --git a/civiccore/ingest/parsers/docx.py b/townlight_core/ingest/parsers/docx.py similarity index 97% rename from civiccore/ingest/parsers/docx.py rename to townlight_core/ingest/parsers/docx.py index 0800e7e..82e9dcc 100644 --- a/civiccore/ingest/parsers/docx.py +++ b/townlight_core/ingest/parsers/docx.py @@ -5,7 +5,7 @@ from docx import Document as DocxDocument -from civiccore.ingest.parsers.base import BaseParser, ParsedPage, ParseResult +from townlight_core.ingest.parsers.base import BaseParser, ParsedPage, ParseResult logger = logging.getLogger(__name__) diff --git a/civiccore/ingest/parsers/email.py b/townlight_core/ingest/parsers/email.py similarity index 93% rename from civiccore/ingest/parsers/email.py rename to townlight_core/ingest/parsers/email.py index c118a29..781b799 100644 --- a/civiccore/ingest/parsers/email.py +++ b/townlight_core/ingest/parsers/email.py @@ -1,7 +1,7 @@ import email from email import policy from pathlib import Path -from civiccore.ingest.parsers.base import BaseParser, ParsedPage, ParseResult +from townlight_core.ingest.parsers.base import BaseParser, ParsedPage, ParseResult class EmailParser(BaseParser): supported_extensions = [".eml"] diff --git a/civiccore/ingest/parsers/html.py b/townlight_core/ingest/parsers/html.py similarity index 89% rename from civiccore/ingest/parsers/html.py rename to townlight_core/ingest/parsers/html.py index 7bcca42..6659819 100644 --- a/civiccore/ingest/parsers/html.py +++ b/townlight_core/ingest/parsers/html.py @@ -1,6 +1,6 @@ from pathlib import Path from bs4 import BeautifulSoup -from civiccore.ingest.parsers.base import BaseParser, ParsedPage, ParseResult +from townlight_core.ingest.parsers.base import BaseParser, ParsedPage, ParseResult class HtmlParser(BaseParser): supported_extensions = [".html", ".htm"] diff --git a/civiccore/ingest/parsers/pdf.py b/townlight_core/ingest/parsers/pdf.py similarity index 90% rename from civiccore/ingest/parsers/pdf.py rename to townlight_core/ingest/parsers/pdf.py index 2421b94..17872ff 100644 --- a/civiccore/ingest/parsers/pdf.py +++ b/townlight_core/ingest/parsers/pdf.py @@ -1,6 +1,6 @@ from pathlib import Path import pdfplumber -from civiccore.ingest.parsers.base import BaseParser, ParsedPage, ParseResult +from townlight_core.ingest.parsers.base import BaseParser, ParsedPage, ParseResult class PdfParser(BaseParser): supported_extensions = [".pdf"] diff --git a/civiccore/ingest/parsers/text.py b/townlight_core/ingest/parsers/text.py similarity index 85% rename from civiccore/ingest/parsers/text.py rename to townlight_core/ingest/parsers/text.py index 88d074d..a210abd 100644 --- a/civiccore/ingest/parsers/text.py +++ b/townlight_core/ingest/parsers/text.py @@ -1,5 +1,5 @@ from pathlib import Path -from civiccore.ingest.parsers.base import BaseParser, ParsedPage, ParseResult +from townlight_core.ingest.parsers.base import BaseParser, ParsedPage, ParseResult class TextParser(BaseParser): supported_extensions = [".txt", ".md", ".log", ".cfg", ".ini", ".json", ".xml", ".yaml", ".yml"] diff --git a/civiccore/ingest/parsers/xlsx.py b/townlight_core/ingest/parsers/xlsx.py similarity index 97% rename from civiccore/ingest/parsers/xlsx.py rename to townlight_core/ingest/parsers/xlsx.py index 9b9d377..413525e 100644 --- a/civiccore/ingest/parsers/xlsx.py +++ b/townlight_core/ingest/parsers/xlsx.py @@ -5,7 +5,7 @@ from openpyxl import load_workbook -from civiccore.ingest.parsers.base import BaseParser, ParsedPage, ParseResult +from townlight_core.ingest.parsers.base import BaseParser, ParsedPage, ParseResult logger = logging.getLogger(__name__) diff --git a/civiccore/ingest/pipeline.py b/townlight_core/ingest/pipeline.py similarity index 96% rename from civiccore/ingest/pipeline.py rename to townlight_core/ingest/pipeline.py index 103397f..644b561 100644 --- a/civiccore/ingest/pipeline.py +++ b/townlight_core/ingest/pipeline.py @@ -9,11 +9,11 @@ from sqlalchemy import select, delete from sqlalchemy.ext.asyncio import AsyncSession -from civiccore.ingest.chunker import chunk_pages -from civiccore.ingest.embedder import embed_batch -from civiccore.ingest.parsers import detect_parser, is_image_file -from civiccore.ingest.llm_extractor import extract_text_from_image, extract_text_from_scanned_pdf -from civiccore.ingest.models import Document, DocumentChunk, IngestionStatus +from townlight_core.ingest.chunker import chunk_pages +from townlight_core.ingest.embedder import embed_batch +from townlight_core.ingest.parsers import detect_parser, is_image_file +from townlight_core.ingest.llm_extractor import extract_text_from_image, extract_text_from_scanned_pdf +from townlight_core.ingest.models import Document, DocumentChunk, IngestionStatus class IngestHandler(Protocol): @@ -61,7 +61,7 @@ async def ingest_file( chunk_overlap: int = 50, embed_model: str = "nomic-embed-text", ) -> Document: - from civiccore.ingest.models import DataSource + from townlight_core.ingest.models import DataSource file_path = Path(file_path) file_hash = await asyncio.to_thread(compute_file_hash, file_path) @@ -337,7 +337,7 @@ async def ingest_directory( chunk_overlap: int = 50, embed_model: str = "nomic-embed-text", ) -> dict: - from civiccore.ingest.parsers import _PARSERS, IMAGE_EXTENSIONS + from townlight_core.ingest.parsers import _PARSERS, IMAGE_EXTENSIONS supported_extensions = set() for p in _PARSERS: diff --git a/civiccore/llm/__init__.py b/townlight_core/llm/__init__.py similarity index 86% rename from civiccore/llm/__init__.py rename to townlight_core/llm/__init__.py index fd01bf3..7e8d55e 100644 --- a/civiccore/llm/__init__.py +++ b/townlight_core/llm/__init__.py @@ -1,9 +1,9 @@ """Townlight Core LLM abstraction. -Public API entry point for downstream apps (records-ai, civicclerk). Exposes: +Public API entry point for downstream apps (records-ai, townlight_meetings). Exposes: - Provider abstraction (LLMProvider ABC, registry, built-in Ollama/OpenAI/Anthropic). -- Prompt template ORM, rendering, and 3-step override resolution (DB override → code-level override → civiccore default). +- Prompt template ORM, rendering, and 3-step override resolution (DB override → code-level override → townlight_core default). - Model registry ORM, Pydantic schemas, async service, and FastAPI admin router. - Token-budgeted context assembly and prompt-injection defense. - Structured-output helper (Pydantic-validated, retry-on-malformed). @@ -17,7 +17,7 @@ from __future__ import annotations # Providers (Step 3b) -from civiccore.llm.providers import ( +from townlight_core.llm.providers import ( PROVIDER_REGISTRY, AnthropicConfig, AnthropicProvider, @@ -32,11 +32,11 @@ ) # Provider factory (Step 3 audit fix — PROVIDER-CONFIG-001) -from civiccore.llm.factory import CONFIG_SCHEMAS, build_provider +from townlight_core.llm.factory import CONFIG_SCHEMAS, build_provider # Templates (Step 3a + 3c) -from civiccore.llm.templates import ( - CIVICCORE_DEFAULT_APP, +from townlight_core.llm.templates import ( + TOWNLIGHT_CORE_DEFAULT_APP, OVERRIDE_REGISTRY, PromptTemplate, PromptTemplateCreate, @@ -52,7 +52,7 @@ ) # Registry (Step 3a + 3d) -from civiccore.llm.registry import ( +from townlight_core.llm.registry import ( MissingModelError, ModelRegistry, ModelRegistryCreate, @@ -66,7 +66,7 @@ ) # Context utilities (Step 3d) -from civiccore.llm.context import ( +from townlight_core.llm.context import ( DEFAULT_CONTEXT_WINDOW, ContextBlock, TokenBudget, @@ -78,7 +78,7 @@ ) # Structured output (Step 3d) -from civiccore.llm.structured import ( +from townlight_core.llm.structured import ( DEFAULT_MAX_ATTEMPTS, StructuredOutput, StructuredOutputFailure, @@ -107,7 +107,7 @@ "RenderedPrompt", "render_template", "resolve_template", - "CIVICCORE_DEFAULT_APP", + "TOWNLIGHT_CORE_DEFAULT_APP", "PromptTemplateError", "PromptTemplateNotFoundError", "PromptTemplateRenderError", diff --git a/civiccore/llm/context.py b/townlight_core/llm/context.py similarity index 97% rename from civiccore/llm/context.py rename to townlight_core/llm/context.py index e229d19..a07bc44 100644 --- a/civiccore/llm/context.py +++ b/townlight_core/llm/context.py @@ -1,13 +1,13 @@ -"""Context manager for civiccore LLM services. +"""Context manager for townlight_core LLM services. -Civiccore port of records-ai's ``backend/app/llm/context_manager.py``. +Townlight Core context handling shared with Townlight Records. Covers token-budget math, prompt-injection defense, and prompt assembly -for any provider plugged into civiccore. +for any provider plugged into townlight_core. Adaptation notes (vs. records-ai): - ``get_active_model_context_window()`` is intentionally NOT ported here. Per ADR-0004, that lookup is a registry-service concern and lives in - ``civiccore/llm/registry/service.py``. This module stays free of DB + ``townlight_core/llm/registry/service.py``. This module stays free of DB imports and is safe to use in pure unit-test contexts. - ``count_tokens(text, model)`` is a thin, provider-aware wrapper around the chars/4 heuristic. A future v0.3.0 candidate is provider-specific diff --git a/civiccore/llm/factory.py b/townlight_core/llm/factory.py similarity index 93% rename from civiccore/llm/factory.py rename to townlight_core/llm/factory.py index 5094614..bc45818 100644 --- a/civiccore/llm/factory.py +++ b/townlight_core/llm/factory.py @@ -12,13 +12,13 @@ from pydantic import BaseModel -from civiccore.llm.providers.base import LLMProvider -from civiccore.llm.providers.config import ( +from townlight_core.llm.providers.base import LLMProvider +from townlight_core.llm.providers.config import ( AnthropicConfig, OllamaConfig, OpenAIConfig, ) -from civiccore.llm.providers.registry import PROVIDER_REGISTRY +from townlight_core.llm.providers.registry import PROVIDER_REGISTRY # Mapping of provider name -> expected Pydantic config schema. # Third-party providers registered via @register_provider can extend this map diff --git a/civiccore/llm/providers/__init__.py b/townlight_core/llm/providers/__init__.py similarity index 62% rename from civiccore/llm/providers/__init__.py rename to townlight_core/llm/providers/__init__.py index b6e70fa..4e568b5 100644 --- a/civiccore/llm/providers/__init__.py +++ b/townlight_core/llm/providers/__init__.py @@ -2,12 +2,12 @@ Importing this package triggers registration of three built-in providers: ollama, openai, anthropic. Consumers may register additional providers via -`@register_provider` without modifying civiccore source. +`@register_provider` without modifying townlight_core source. """ from __future__ import annotations -from civiccore.llm.providers.base import LLMProvider -from civiccore.llm.providers.registry import ( +from townlight_core.llm.providers.base import LLMProvider +from townlight_core.llm.providers.registry import ( PROVIDER_REGISTRY, get_provider, list_providers, @@ -16,11 +16,11 @@ # Trigger decorator-based registration of built-in providers. # Concrete classes are also re-exported below for explicit imports. -from civiccore.llm.providers.ollama import OllamaProvider # noqa: F401, E402 -from civiccore.llm.providers.openai import OpenAIProvider # noqa: F401, E402 -from civiccore.llm.providers.anthropic import AnthropicProvider # noqa: F401, E402 +from townlight_core.llm.providers.ollama import OllamaProvider # noqa: F401, E402 +from townlight_core.llm.providers.openai import OpenAIProvider # noqa: F401, E402 +from townlight_core.llm.providers.anthropic import AnthropicProvider # noqa: F401, E402 -from civiccore.llm.providers.config import ( +from townlight_core.llm.providers.config import ( AnthropicConfig, OllamaConfig, OpenAIConfig, diff --git a/civiccore/llm/providers/anthropic.py b/townlight_core/llm/providers/anthropic.py similarity index 90% rename from civiccore/llm/providers/anthropic.py rename to townlight_core/llm/providers/anthropic.py index cbebdf2..9119678 100644 --- a/civiccore/llm/providers/anthropic.py +++ b/townlight_core/llm/providers/anthropic.py @@ -1,8 +1,8 @@ -"""Anthropic provider for civiccore.llm. +"""Anthropic provider for townlight_core.llm. Concrete LLMProvider implementation backed by the official ``anthropic`` SDK, -which ships as an OPTIONAL extra (``pip install civiccore[anthropic]``). The -SDK is imported lazily inside ``__init__`` so that civiccore continues to +which ships as an OPTIONAL extra (``pip install townlight_core[anthropic]``). The +SDK is imported lazily inside ``__init__`` so that townlight_core continues to import cleanly when the extra is not installed; if a caller instantiates ``AnthropicProvider`` without the SDK present, a clear ``ImportError`` is raised directing them to install the extra. @@ -18,15 +18,15 @@ from __future__ import annotations -from civiccore.llm.providers.base import LLMProvider -from civiccore.llm.providers.registry import register_provider +from townlight_core.llm.providers.base import LLMProvider +from townlight_core.llm.providers.registry import register_provider @register_provider("anthropic") class AnthropicProvider(LLMProvider): """Anthropic API provider using the official anthropic SDK. - Requires the optional extra: pip install civiccore[anthropic]. + Requires the optional extra: pip install townlight_core[anthropic]. Default model: claude-haiku-4-5 (latest small/fast model). Embeddings are NOT supported — Anthropic does not ship a native embedding @@ -49,7 +49,7 @@ def __init__( except ImportError as e: raise ImportError( "anthropic SDK is required for AnthropicProvider. Install it: pip install anthropic " - "(or pip install 'civiccore[anthropic]' once civiccore is published to PyPI)." + "(or pip install 'townlight_core[anthropic]' once townlight_core is published to PyPI)." ) from e self._client = AsyncAnthropic(api_key=api_key) self.default_model = default_model diff --git a/civiccore/llm/providers/base.py b/townlight_core/llm/providers/base.py similarity index 93% rename from civiccore/llm/providers/base.py rename to townlight_core/llm/providers/base.py index 7b5f873..0acd884 100644 --- a/civiccore/llm/providers/base.py +++ b/townlight_core/llm/providers/base.py @@ -2,7 +2,7 @@ This module defines :class:`LLMProvider`, the abstract base class that every concrete LLM backend in Townlight must implement. The surface here is -deliberately narrow and was extracted in Phase 2 of the civiccore split from +deliberately narrow and was extracted in Phase 2 of the townlight_core split from the records-ai status quo: * :meth:`LLMProvider.generate` mirrors the call shape used by @@ -36,8 +36,8 @@ class LLMProvider(ABC): """Abstract base class for an LLM backend. Concrete implementations live alongside this module (e.g. - ``civiccore.llm.providers.anthropic``) and register themselves with the - decorator registry in :mod:`civiccore.llm.providers.registry`. + ``townlight_core.llm.providers.anthropic``) and register themselves with the + decorator registry in :mod:`townlight_core.llm.providers.registry`. """ @abstractmethod diff --git a/civiccore/llm/providers/config.py b/townlight_core/llm/providers/config.py similarity index 95% rename from civiccore/llm/providers/config.py rename to townlight_core/llm/providers/config.py index 03d4203..29426b1 100644 --- a/civiccore/llm/providers/config.py +++ b/townlight_core/llm/providers/config.py @@ -1,7 +1,7 @@ """Pydantic config schemas for built-in LLM providers (per ADR-0004 §6). Each schema declares the fields the provider needs and validates them at -startup (via `civiccore.llm.factory.build_provider`) rather than at first +startup (via `townlight_core.llm.factory.build_provider`) rather than at first generate() call. Misconfiguration surfaces immediately. """ from __future__ import annotations diff --git a/civiccore/llm/providers/ollama.py b/townlight_core/llm/providers/ollama.py similarity index 95% rename from civiccore/llm/providers/ollama.py rename to townlight_core/llm/providers/ollama.py index 1f925ba..0659213 100644 --- a/civiccore/llm/providers/ollama.py +++ b/townlight_core/llm/providers/ollama.py @@ -1,6 +1,6 @@ """Ollama local LLM runtime provider. -Uses httpx (already a civiccore dependency — no extra packages required) to +Uses httpx (already a townlight_core dependency — no extra packages required) to talk to a local Ollama daemon over its HTTP API. Default generation model is ``gemma4:e4b``, which matches the current @@ -16,8 +16,8 @@ import httpx -from civiccore.llm.providers.base import LLMProvider -from civiccore.llm.providers.registry import register_provider +from townlight_core.llm.providers.base import LLMProvider +from townlight_core.llm.providers.registry import register_provider @register_provider("ollama") diff --git a/civiccore/llm/providers/openai.py b/townlight_core/llm/providers/openai.py similarity index 89% rename from civiccore/llm/providers/openai.py rename to townlight_core/llm/providers/openai.py index 555fcfe..98bcd9f 100644 --- a/civiccore/llm/providers/openai.py +++ b/townlight_core/llm/providers/openai.py @@ -1,12 +1,12 @@ -"""OpenAI LLM provider for civiccore. +"""OpenAI LLM provider for townlight_core. This module implements :class:`OpenAIProvider`, a concrete -:class:`~civiccore.llm.providers.base.LLMProvider` backed by the official +:class:`~townlight_core.llm.providers.base.LLMProvider` backed by the official ``openai`` Python SDK. The ``openai`` SDK is an **optional extra**. Install with:: - pip install 'civiccore[openai]' + pip install 'townlight_core[openai]' The SDK import is performed lazily inside ``__init__`` so that this module (and therefore the provider registry decorator) can be imported cleanly even @@ -22,15 +22,15 @@ from __future__ import annotations -from civiccore.llm.providers.base import LLMProvider -from civiccore.llm.providers.registry import register_provider +from townlight_core.llm.providers.base import LLMProvider +from townlight_core.llm.providers.registry import register_provider @register_provider("openai") class OpenAIProvider(LLMProvider): """OpenAI API provider using the official openai SDK. - Requires the optional extra: ``pip install 'civiccore[openai]'``. + Requires the optional extra: ``pip install 'townlight_core[openai]'``. Default chat model: ``gpt-4o-mini``. Default embed model: ``text-embedding-3-small``. """ @@ -47,7 +47,7 @@ def __init__( except ImportError as e: raise ImportError( "openai SDK is required for OpenAIProvider. Install it: pip install openai " - "(or pip install 'civiccore[openai]' once civiccore is published to PyPI)." + "(or pip install 'townlight_core[openai]' once townlight_core is published to PyPI)." ) from e self._client = AsyncOpenAI(api_key=api_key) self.default_model = default_model diff --git a/civiccore/llm/providers/registry.py b/townlight_core/llm/providers/registry.py similarity index 95% rename from civiccore/llm/providers/registry.py rename to townlight_core/llm/providers/registry.py index f5fbcb4..9a877c1 100644 --- a/civiccore/llm/providers/registry.py +++ b/townlight_core/llm/providers/registry.py @@ -1,6 +1,6 @@ """In-process decorator registry for LLM providers. -Per ADR-0004 §6, civiccore uses a simple in-process decorator registry rather +Per ADR-0004 §6, townlight_core uses a simple in-process decorator registry rather than setuptools entry-points to discover :class:`LLMProvider` implementations. At one-process FastAPI scale (the records-ai deployment shape today), the entry-points machinery adds packaging-time and import-time overhead with no @@ -28,7 +28,7 @@ from typing import Callable -from civiccore.llm.providers.base import LLMProvider +from townlight_core.llm.providers.base import LLMProvider __all__ = [ "PROVIDER_REGISTRY", diff --git a/civiccore/llm/registry/__init__.py b/townlight_core/llm/registry/__init__.py similarity index 80% rename from civiccore/llm/registry/__init__.py rename to townlight_core/llm/registry/__init__.py index a0fb772..3368f1b 100644 --- a/civiccore/llm/registry/__init__.py +++ b/townlight_core/llm/registry/__init__.py @@ -1,5 +1,5 @@ """ -civiccore.llm.registry — ORM model, Pydantic schemas, service, and router. +townlight_core.llm.registry — ORM model, Pydantic schemas, service, and router. Public exports: @@ -15,14 +15,14 @@ - ``MissingModelError`` — Raised when a required active model is absent. """ -from civiccore.llm.registry.models import ModelRegistry -from civiccore.llm.registry.router import router as model_registry_router -from civiccore.llm.registry.schemas import ( +from townlight_core.llm.registry.models import ModelRegistry +from townlight_core.llm.registry.router import router as model_registry_router +from townlight_core.llm.registry.schemas import ( ModelRegistryCreate, ModelRegistryRead, ModelRegistryUpdate, ) -from civiccore.llm.registry.service import ( +from townlight_core.llm.registry.service import ( MissingModelError, ModelRegistryServiceError, get_active_model, diff --git a/civiccore/llm/registry/models.py b/townlight_core/llm/registry/models.py similarity index 98% rename from civiccore/llm/registry/models.py rename to townlight_core/llm/registry/models.py index f051233..a6342e6 100644 --- a/civiccore/llm/registry/models.py +++ b/townlight_core/llm/registry/models.py @@ -23,7 +23,7 @@ from sqlalchemy.dialects.postgresql import TIMESTAMP from sqlalchemy.orm import Mapped, mapped_column -from civiccore.db import Base +from townlight_core.db import Base class ModelRegistry(Base): diff --git a/civiccore/llm/registry/router.py b/townlight_core/llm/registry/router.py similarity index 94% rename from civiccore/llm/registry/router.py rename to townlight_core/llm/registry/router.py index 304bb06..b0519f8 100644 --- a/civiccore/llm/registry/router.py +++ b/townlight_core/llm/registry/router.py @@ -13,8 +13,8 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from civiccore.llm.registry.models import ModelRegistry -from civiccore.llm.registry.schemas import ( +from townlight_core.llm.registry.models import ModelRegistry +from townlight_core.llm.registry.schemas import ( ModelRegistryCreate, ModelRegistryRead, ModelRegistryUpdate, @@ -28,7 +28,7 @@ def _unconfigured_session_dependency() -> AsyncSession: ``app.dependency_overrides[get_session] = my_session_provider``. """ raise RuntimeError( - "civiccore.llm.registry.router.get_session has not been overridden. " + "townlight_core.llm.registry.router.get_session has not been overridden. " "Mount the router on your FastAPI app with a session dependency: " "`app.dependency_overrides[get_session] = your_session_provider`." ) diff --git a/civiccore/llm/registry/schemas.py b/townlight_core/llm/registry/schemas.py similarity index 100% rename from civiccore/llm/registry/schemas.py rename to townlight_core/llm/registry/schemas.py diff --git a/civiccore/llm/registry/service.py b/townlight_core/llm/registry/service.py similarity index 87% rename from civiccore/llm/registry/service.py rename to townlight_core/llm/registry/service.py index aea3872..ab32284 100644 --- a/civiccore/llm/registry/service.py +++ b/townlight_core/llm/registry/service.py @@ -1,8 +1,8 @@ -"""Service layer for the civiccore LLM model registry. +"""Service layer for the townlight_core LLM model registry. Library-friendly: callers pass an AsyncSession explicitly (no hardcoded -session_maker). Used by downstream apps (records-ai, civicclerk) and by -internal civiccore code that needs the active model's metadata. +session_maker). Used by downstream apps (records-ai, townlight_meetings) and by +internal townlight_core code that needs the active model's metadata. """ from __future__ import annotations @@ -11,8 +11,8 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from civiccore.llm.context import DEFAULT_CONTEXT_WINDOW -from civiccore.llm.registry.models import ModelRegistry +from townlight_core.llm.context import DEFAULT_CONTEXT_WINDOW +from townlight_core.llm.registry.models import ModelRegistry logger = logging.getLogger(__name__) diff --git a/civiccore/llm/structured.py b/townlight_core/llm/structured.py similarity index 98% rename from civiccore/llm/structured.py rename to townlight_core/llm/structured.py index 0dba6ff..433201d 100644 --- a/civiccore/llm/structured.py +++ b/townlight_core/llm/structured.py @@ -15,7 +15,7 @@ from pydantic import BaseModel, ValidationError -from civiccore.llm.providers.base import LLMProvider +from townlight_core.llm.providers.base import LLMProvider logger = logging.getLogger(__name__) diff --git a/civiccore/llm/templates/__init__.py b/townlight_core/llm/templates/__init__.py similarity index 59% rename from civiccore/llm/templates/__init__.py rename to townlight_core/llm/templates/__init__.py index e965241..c79a0fe 100644 --- a/civiccore/llm/templates/__init__.py +++ b/townlight_core/llm/templates/__init__.py @@ -5,26 +5,26 @@ """ from __future__ import annotations -# Side-effect import: ensure ModelRegistry is registered with civiccore.db.Base.metadata +# Side-effect import: ensure ModelRegistry is registered with townlight_core.db.Base.metadata # so SQLAlchemy can resolve PromptTemplate.model_id's FK("model_registry.id") at # mapper configuration time. Without this, querying PromptTemplate from a session -# where only civiccore.llm.templates was imported raises NoReferencedTableError. -from civiccore.llm.registry.models import ModelRegistry # noqa: F401 +# where only townlight_core.llm.templates was imported raises NoReferencedTableError. +from townlight_core.llm.registry.models import ModelRegistry # noqa: F401 -from civiccore.llm.templates.engine import RenderedPrompt, render_template -from civiccore.llm.templates.exceptions import ( +from townlight_core.llm.templates.engine import RenderedPrompt, render_template +from townlight_core.llm.templates.exceptions import ( PromptTemplateError, PromptTemplateNotFoundError, PromptTemplateRenderError, ) -from civiccore.llm.templates.models import PromptTemplate -from civiccore.llm.templates.overrides import ( +from townlight_core.llm.templates.models import PromptTemplate +from townlight_core.llm.templates.overrides import ( OVERRIDE_REGISTRY, register_template_override, unregister_template_override, ) -from civiccore.llm.templates.resolver import CIVICCORE_DEFAULT_APP, resolve_template -from civiccore.llm.templates.schemas import ( +from townlight_core.llm.templates.resolver import TOWNLIGHT_CORE_DEFAULT_APP, resolve_template +from townlight_core.llm.templates.schemas import ( PromptTemplateCreate, PromptTemplateRead, ) @@ -39,7 +39,7 @@ "RenderedPrompt", "render_template", "resolve_template", - "CIVICCORE_DEFAULT_APP", + "TOWNLIGHT_CORE_DEFAULT_APP", "PromptTemplateError", "PromptTemplateNotFoundError", "PromptTemplateRenderError", diff --git a/civiccore/llm/templates/engine.py b/townlight_core/llm/templates/engine.py similarity index 92% rename from civiccore/llm/templates/engine.py rename to townlight_core/llm/templates/engine.py index b4cc914..b90a902 100644 --- a/civiccore/llm/templates/engine.py +++ b/townlight_core/llm/templates/engine.py @@ -1,6 +1,6 @@ """Prompt template rendering using stdlib string.Template (PEP 292). -Per ADR-0004, civiccore uses string.Template (NOT Jinja2 or str.format) because: +Per ADR-0004, townlight_core uses string.Template (NOT Jinja2 or str.format) because: - $name / ${name} syntax does not collide with literal JSON braces in prompts that show JSON examples to the LLM. - Stdlib only — no dep cost. @@ -12,8 +12,8 @@ import string from dataclasses import dataclass -from civiccore.llm.templates.exceptions import PromptTemplateRenderError -from civiccore.llm.templates.models import PromptTemplate +from townlight_core.llm.templates.exceptions import PromptTemplateRenderError +from townlight_core.llm.templates.models import PromptTemplate @dataclass(frozen=True) diff --git a/civiccore/llm/templates/exceptions.py b/townlight_core/llm/templates/exceptions.py similarity index 92% rename from civiccore/llm/templates/exceptions.py rename to townlight_core/llm/templates/exceptions.py index b681ba1..61cc7b8 100644 --- a/civiccore/llm/templates/exceptions.py +++ b/townlight_core/llm/templates/exceptions.py @@ -11,7 +11,7 @@ class PromptTemplateNotFoundError(PromptTemplateError): The error message must direct the caller to either (a) seed the template in the prompt_templates table for the requesting consumer_app, or (b) - create a civiccore default. Both fields are exposed as attributes for + create a townlight_core default. Both fields are exposed as attributes for programmatic inspection. """ @@ -23,7 +23,7 @@ def __init__(self, *, template_name: str, consumer_app: str) -> None: f"template_name={template_name!r}, consumer_app={consumer_app!r}. " f"Insert an active row into prompt_templates with either " f"consumer_app={consumer_app!r} (app override, is_override=true) or " - f"consumer_app='civiccore' (civiccore default, is_override=false)." + f"consumer_app='townlight_core' (townlight_core default, is_override=false)." ) diff --git a/civiccore/llm/templates/models.py b/townlight_core/llm/templates/models.py similarity index 91% rename from civiccore/llm/templates/models.py rename to townlight_core/llm/templates/models.py index 08ac545..3dd45ec 100644 --- a/civiccore/llm/templates/models.py +++ b/townlight_core/llm/templates/models.py @@ -4,7 +4,7 @@ Maps exactly to the Phase 2 schema: - id UUID PK (Python-side default uuid4) - template_name VARCHAR(200) NOT NULL - - consumer_app VARCHAR(100) NOT NULL DEFAULT 'civiccore' + - consumer_app VARCHAR(100) NOT NULL DEFAULT 'townlight_core' - is_override BOOLEAN NOT NULL DEFAULT false - purpose VARCHAR(50) NOT NULL - system_prompt TEXT NOT NULL @@ -31,7 +31,7 @@ from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql import func -from civiccore.db import Base +from townlight_core.db import Base class PromptTemplate(Base): @@ -55,7 +55,7 @@ class PromptTemplate(Base): ) template_name: Mapped[str] = mapped_column(String(200), nullable=False) consumer_app: Mapped[str] = mapped_column( - String(100), nullable=False, server_default="civiccore" + String(100), nullable=False, server_default="townlight_core" ) is_override: Mapped[bool] = mapped_column( Boolean, nullable=False, server_default="false" @@ -77,8 +77,8 @@ class PromptTemplate(Base): ) # NOTE: DB-level FK to users(id) ON DELETE SET NULL is created by the # 0001 baseline migration. The ORM-level ForeignKey reference is omitted - # because civiccore has no User ORM model — users.id lives in records-ai - # and is not part of civiccore.db.Base.metadata. Including the ORM-level + # because townlight_core has no User ORM model — users.id lives in records-ai + # and is not part of townlight_core.db.Base.metadata. Including the ORM-level # ForeignKey here causes NoReferencedTableError at mapper config time. # The DB constraint is unaffected. created_by: Mapped[uuid.UUID | None] = mapped_column( diff --git a/civiccore/llm/templates/overrides.py b/townlight_core/llm/templates/overrides.py similarity index 79% rename from civiccore/llm/templates/overrides.py rename to townlight_core/llm/templates/overrides.py index 9ae71a5..c75f5ac 100644 --- a/civiccore/llm/templates/overrides.py +++ b/townlight_core/llm/templates/overrides.py @@ -1,19 +1,19 @@ """Code-level template overrides per ADR-0004 §7. -Consumer apps (records-ai, civicclerk) can register Python-shipped default +Consumer apps (records-ai, townlight_meetings) can register Python-shipped default overrides at module import time via @register_template_override. These take -precedence over civiccore defaults but are subordinate to operator-installed +precedence over townlight_core defaults but are subordinate to operator-installed DB overrides (so production hot-fixes still win). Resolution order (per ADR-0004 §7): 1. App DB override (consumer_app, is_override=true, is_active, highest version) 2. App code-level override (this module's OVERRIDE_REGISTRY) -3. Townlight Core DB default (consumer_app="civiccore", is_override=false, is_active, highest version) +3. Townlight Core DB default (consumer_app="townlight_core", is_override=false, is_active, highest version) 4. PromptTemplateNotFoundError """ from __future__ import annotations -from civiccore.llm.templates.models import PromptTemplate +from townlight_core.llm.templates.models import PromptTemplate # Keyed by (consumer_app, template_name); value is a fully-formed PromptTemplate # instance (not a Pydantic schema — the resolver returns ORM rows uniformly). @@ -35,8 +35,8 @@ def register_template_override( on re-import in tests). Args: - consumer_app: Namespace key (e.g., "civicrecords-ai", "civicclerk"). - Should not be "civiccore" — civiccore defaults belong in the DB. + consumer_app: Namespace key (e.g., "townlight_records", "townlight_meetings"). + Should not be "townlight_core" — townlight_core defaults belong in the DB. template_name: Logical template name (e.g., "exemption_review.system"). template: Fully-formed PromptTemplate instance. The caller is responsible for setting `template_name`, `consumer_app`, diff --git a/civiccore/llm/templates/resolver.py b/townlight_core/llm/templates/resolver.py similarity index 70% rename from civiccore/llm/templates/resolver.py rename to townlight_core/llm/templates/resolver.py index 0bd7fba..e0bdbdc 100644 --- a/civiccore/llm/templates/resolver.py +++ b/townlight_core/llm/templates/resolver.py @@ -9,17 +9,17 @@ Step 2 — App code-level override: Look up (consumer_app, template_name) in OVERRIDE_REGISTRY (in-memory map populated at import time via @register_template_override). Code overrides - beat civiccore defaults so that consumer apps can ship Python-level - defaults that supersede civiccore's defaults when no DB override exists. + beat townlight_core defaults so that consumer apps can ship Python-level + defaults that supersede townlight_core's defaults when no DB override exists. Step 3 — Townlight Core DB default: - Fall back to consumer_app='civiccore', template_name=, + Fall back to consumer_app='townlight_core', template_name=, is_override=false, is_active=true. Highest version wins. Step 4 — Missing: Raise PromptTemplateNotFoundError. No silent default. -When consumer_app == 'civiccore', steps 1 AND 2 are skipped — civiccore can't +When consumer_app == 'townlight_core', steps 1 AND 2 are skipped — townlight_core can't override its own template; it owns the default. """ from __future__ import annotations @@ -27,11 +27,11 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from civiccore.llm.templates.exceptions import PromptTemplateNotFoundError -from civiccore.llm.templates.models import PromptTemplate -from civiccore.llm.templates.overrides import OVERRIDE_REGISTRY +from townlight_core.llm.templates.exceptions import PromptTemplateNotFoundError +from townlight_core.llm.templates.models import PromptTemplate +from townlight_core.llm.templates.overrides import OVERRIDE_REGISTRY -CIVICCORE_DEFAULT_APP = "civiccore" +TOWNLIGHT_CORE_DEFAULT_APP = "townlight_core" async def resolve_template( @@ -45,19 +45,19 @@ async def resolve_template( Args: session: Active SQLAlchemy AsyncSession. template_name: Logical template name (e.g., "exemption_review.system"). - consumer_app: Requesting application namespace (e.g., "civicrecords-ai"). - When set to "civiccore", steps 1 and 2 are skipped (no self-override). + consumer_app: Requesting application namespace (e.g., "townlight_records"). + When set to "townlight_core", steps 1 and 2 are skipped (no self-override). Returns: The resolved PromptTemplate ORM row (or in-memory instance for code overrides). Raises: PromptTemplateNotFoundError: When no DB app override, code override, or - civiccore default is found. The error names both fields and tells + townlight_core default is found. The error names both fields and tells the caller how to add the missing template. """ - # Step 1: App-specific DB override (skip if requester is civiccore itself) - if consumer_app != CIVICCORE_DEFAULT_APP: + # Step 1: App-specific DB override (skip if requester is townlight_core itself) + if consumer_app != TOWNLIGHT_CORE_DEFAULT_APP: stmt = ( select(PromptTemplate) .where( @@ -75,16 +75,16 @@ async def resolve_template( return row # Step 2: App code-level override (in-memory registry). - # Skipped for consumer_app='civiccore' along with step 1. + # Skipped for consumer_app='townlight_core' along with step 1. code_override = OVERRIDE_REGISTRY.get((consumer_app, template_name)) if code_override is not None: return code_override - # Step 3: CivicCore default + # Step 3: TownlightCore default stmt = ( select(PromptTemplate) .where( - PromptTemplate.consumer_app == CIVICCORE_DEFAULT_APP, + PromptTemplate.consumer_app == TOWNLIGHT_CORE_DEFAULT_APP, PromptTemplate.template_name == template_name, PromptTemplate.is_override.is_(False), PromptTemplate.is_active.is_(True), @@ -104,4 +104,4 @@ async def resolve_template( ) -__all__ = ["resolve_template", "CIVICCORE_DEFAULT_APP"] +__all__ = ["resolve_template", "TOWNLIGHT_CORE_DEFAULT_APP"] diff --git a/civiccore/llm/templates/schemas.py b/townlight_core/llm/templates/schemas.py similarity index 97% rename from civiccore/llm/templates/schemas.py rename to townlight_core/llm/templates/schemas.py index 8c31f43..65d3da8 100644 --- a/civiccore/llm/templates/schemas.py +++ b/townlight_core/llm/templates/schemas.py @@ -20,7 +20,7 @@ class PromptTemplateCreate(BaseModel): user_prompt_template: str # Optional with defaults - consumer_app: str = "civiccore" + consumer_app: str = "townlight_core" is_override: bool = False token_budget: dict | None = None model_id: int | None = None diff --git a/townlight_core/migrations/__init__.py b/townlight_core/migrations/__init__.py new file mode 100644 index 0000000..06b4d72 --- /dev/null +++ b/townlight_core/migrations/__init__.py @@ -0,0 +1 @@ +"""TownlightCore: Alembic migrations for shared tables. Run by every consuming module's migration runner BEFORE that module's own migrations. See env.py for the migration-ordering contract from TownlightCore Extraction Spec section 14.""" diff --git a/townlight_core/migrations/alembic.ini b/townlight_core/migrations/alembic.ini new file mode 100644 index 0000000..c00aaa6 --- /dev/null +++ b/townlight_core/migrations/alembic.ini @@ -0,0 +1,3 @@ +[alembic] +script_location = %(here)s +version_table = alembic_version_townlight_core diff --git a/civiccore/migrations/env.py b/townlight_core/migrations/env.py similarity index 91% rename from civiccore/migrations/env.py rename to townlight_core/migrations/env.py index 5ca1415..d257887 100644 --- a/civiccore/migrations/env.py +++ b/townlight_core/migrations/env.py @@ -1,4 +1,4 @@ -"""Alembic env for civiccore. Reads the connection from Config.attributes['connection'] when invoked by runner.py (the normal path). Falls back to DATABASE_URL env var when invoked standalone.""" +"""Alembic env for townlight_core. Reads the connection from Config.attributes['connection'] when invoked by runner.py (the normal path). Falls back to DATABASE_URL env var when invoked standalone.""" from __future__ import annotations @@ -18,7 +18,7 @@ # No logging sections configured; skip Python logging setup. pass -VERSION_TABLE = "alembic_version_civiccore" +VERSION_TABLE = "alembic_version_townlight_core" target_metadata = None # v0.1 baseline is raw-SQL; no ORM metadata yet. diff --git a/civiccore/migrations/guards.py b/townlight_core/migrations/guards.py similarity index 93% rename from civiccore/migrations/guards.py rename to townlight_core/migrations/guards.py index f124de6..b74dfa7 100644 --- a/civiccore/migrations/guards.py +++ b/townlight_core/migrations/guards.py @@ -1,4 +1,4 @@ -"""Idempotent Alembic operation helpers. These wrap alembic.op.* calls with 'skip if already exists' semantics so civiccore's baseline migration and records' 14 guarded migrations can all be re-run against a database that already contains the shared schema.""" +"""Idempotent Alembic operation helpers. These wrap alembic.op.* calls with 'skip if already exists' semantics so townlight_core's baseline migration and records' 14 guarded migrations can all be re-run against a database that already contains the shared schema.""" from __future__ import annotations @@ -17,7 +17,7 @@ def _inspector() -> Inspector: def idempotent_create_table(name: str, *columns: Any, **kwargs: Any) -> None: """op.create_table that no-ops if the table already exists. - Used by civiccore's baseline migration and by guarded records migrations that + Used by townlight_core's baseline migration and by guarded records migrations that create shared tables (e.g. `users`, `data_sources`). If the table is already present in the database, the create is skipped; otherwise it proceeds normally. """ @@ -31,7 +31,7 @@ def idempotent_add_column(table: str, column: Any, **kwargs: Any) -> None: """op.add_column that no-ops if the column already exists. If the target table itself does not exist, returns silently — the upstream - migration (or civiccore baseline) is responsible for creating it. If the + migration (or townlight_core baseline) is responsible for creating it. If the table exists and the column is already present, skip. Otherwise add it. """ inspector = _inspector() @@ -109,7 +109,7 @@ def idempotent_create_index( """op.create_index that no-ops if an index with this name already exists on the table. Used by guarded records migrations whose ``op.create_index`` calls target shared - tables that civiccore's baseline migration already populated with indexes + tables that townlight_core's baseline migration already populated with indexes (per pg_dump-derived DDL). If the named index is already present, skip the create; otherwise create it normally. """ @@ -191,7 +191,7 @@ def idempotent_drop_constraint( delegates directly to op.drop_constraint — caller is responsible for guarding those cases. - Used by civiccore_0002_llm to idempotently drop the old + Used by townlight_core_0002_llm to idempotently drop the old prompt_templates_name_key UNIQUE constraint before adding the replacement composite unique constraint. """ diff --git a/civiccore/migrations/runner.py b/townlight_core/migrations/runner.py similarity index 71% rename from civiccore/migrations/runner.py rename to townlight_core/migrations/runner.py index b811a91..3dbf08e 100644 --- a/civiccore/migrations/runner.py +++ b/townlight_core/migrations/runner.py @@ -1,4 +1,4 @@ -"""Programmatic entry point for civiccore migrations. Consumed by records' env.py (Phase 1 Part B) so records' alembic upgrade automatically brings civiccore up to head first.""" +"""Programmatic entry point for townlight_core migrations. Consumed by records' env.py (Phase 1 Part B) so records' alembic upgrade automatically brings townlight_core up to head first.""" from __future__ import annotations @@ -17,7 +17,7 @@ def upgrade_to_head(connection: "Connection | None" = None) -> None: - """Upgrade civiccore's migration chain to head. + """Upgrade townlight_core's migration chain to head. **Always opens its own synchronous SQLAlchemy connection from the DATABASE_URL environment variable**, ignoring any ``connection`` passed @@ -27,18 +27,18 @@ def upgrade_to_head(connection: "Connection | None" = None) -> None: Why: ``alembic.command.upgrade`` installs a process-global context proxy via ``alembic.context._install_proxy``. When invoked from inside another - active env.py (e.g., civicrecords' env.py wiring), exiting civiccore's + active env.py (e.g., townlight_records' env.py wiring), exiting townlight_core's EnvironmentContext destroys the caller's proxy state, causing ``AttributeError: 'NoneType' object has no attribute 'configure'`` when the caller's env.py continues. Opening a separate connection keeps - civiccore's alembic invocation cleanly isolated. + townlight_core's alembic invocation cleanly isolated. - Trade-off: civiccore commits independently of the caller's transaction. + Trade-off: townlight_core commits independently of the caller's transaction. The baseline is idempotent, so a partial-state restart produces the same end-state — acceptable per ADR-0003 §"Three deployment scenarios". Requires ``DATABASE_URL`` env var to be set. The URL may use any psycopg2 - or asyncpg dialect; civiccore normalizes to ``postgresql+psycopg2`` for + or asyncpg dialect; townlight_core normalizes to ``postgresql+psycopg2`` for its own sync alembic invocation. """ import os @@ -47,12 +47,12 @@ def upgrade_to_head(connection: "Connection | None" = None) -> None: url = os.environ.get("DATABASE_URL") if url is None: raise RuntimeError( - "civiccore.migrations.runner.upgrade_to_head requires " - "DATABASE_URL to be set; civiccore opens its own connection " + "townlight_core.migrations.runner.upgrade_to_head requires " + "DATABASE_URL to be set; townlight_core opens its own connection " "to avoid nesting inside the caller's alembic context." ) - # Normalize to sync psycopg2 driver — civiccore alembic is sync-only + # Normalize to sync psycopg2 driver — townlight_core alembic is sync-only sync_url = ( url.replace("postgresql+asyncpg", "postgresql+psycopg2") .replace("postgres+asyncpg", "postgresql+psycopg2") @@ -73,13 +73,13 @@ def upgrade_to_head(connection: "Connection | None" = None) -> None: def current_revision(connection: "Connection") -> str | None: - """Return civiccore's current Alembic revision on this connection, or None if unstamped. + """Return townlight_core's current Alembic revision on this connection, or None if unstamped. - Reads from the `alembic_version_civiccore` version table so it does not + Reads from the `alembic_version_townlight_core` version table so it does not collide with records' own `alembic_version` table in the same database. """ ctx = MigrationContext.configure( connection, - opts={"version_table": "alembic_version_civiccore"}, + opts={"version_table": "alembic_version_townlight_core"}, ) return ctx.get_current_revision() diff --git a/civiccore/migrations/versions/.gitkeep b/townlight_core/migrations/versions/.gitkeep similarity index 100% rename from civiccore/migrations/versions/.gitkeep rename to townlight_core/migrations/versions/.gitkeep diff --git a/civiccore/migrations/versions/__init__.py b/townlight_core/migrations/versions/__init__.py similarity index 83% rename from civiccore/migrations/versions/__init__.py rename to townlight_core/migrations/versions/__init__.py index 42d0b6d..6b7905a 100644 --- a/civiccore/migrations/versions/__init__.py +++ b/townlight_core/migrations/versions/__init__.py @@ -1,4 +1,4 @@ -"""Alembic migration versions for civiccore. +"""Alembic migration versions for townlight_core. Alembic discovers migration files by scanning this directory — the __init__.py is present only so the test suite can import version-module diff --git a/civiccore/migrations/versions/civiccore_0001_baseline_v1.py b/townlight_core/migrations/versions/townlight_core_0001_baseline_v1.py similarity index 97% rename from civiccore/migrations/versions/civiccore_0001_baseline_v1.py rename to townlight_core/migrations/versions/townlight_core_0001_baseline_v1.py index 0a13349..8c7578f 100644 --- a/civiccore/migrations/versions/civiccore_0001_baseline_v1.py +++ b/townlight_core/migrations/versions/townlight_core_0001_baseline_v1.py @@ -1,14 +1,14 @@ -"""CivicCore baseline v1 — shared schema extracted from CivicRecords HEAD 019. +"""TownlightCore baseline v1 — shared schema extracted from TownlightRecords HEAD 019. -This baseline captures the 16 shared tables that constitute the CivicCore +This baseline captures the 16 shared tables that constitute the TownlightCore kernel. It is the single source of truth for kernel schema going forward; -downstream applications (e.g., CivicRecords) should rebase onto this baseline +downstream applications (e.g., TownlightRecords) should rebase onto this baseline and stop re-declaring shared tables in their own migrations. Provenance: - Dumped from CivicRecords alembic HEAD ``019_encrypt_connection_config`` + Dumped from TownlightRecords alembic HEAD ``019_encrypt_connection_config`` via ``pg_dump --schema-only --no-owner --no-privileges --no-comments`` - against ``civicrecords_test`` on PostgreSQL 17.9. + against ``townlight_records_test`` on PostgreSQL 17.9. Dependencies captured (SHARED -> SHARED only): users.department_id -> departments.id @@ -35,7 +35,7 @@ Downgrade: No-op by design. A baseline migration defines the floor of supported - schema; reversing it would drop tables that both civiccore and + schema; reversing it would drop tables that both townlight_core and downstream apps depend on. Use point-in-time restore or drop the database instead. """ @@ -44,12 +44,12 @@ from alembic import op -from civiccore.migrations.guards import has_table +from townlight_core.migrations.guards import has_table # Alembic identifiers -------------------------------------------------------- -revision = "civiccore_0001_baseline_v1" +revision = "townlight_core_0001" down_revision = None branch_labels = None depends_on = None @@ -88,7 +88,7 @@ # - CREATE INDEX # - ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY (only shared->shared) # -# Executed verbatim via ``op.execute`` so the DDL matches CivicRecords HEAD 019 +# Executed verbatim via ``op.execute`` so the DDL matches TownlightRecords HEAD 019 # byte-for-byte where practical. _TABLE_DDL: dict[str, str] = { @@ -543,7 +543,7 @@ def _split_statements(ddl: str) -> list[str]: def upgrade() -> None: - """Idempotently bring the database up to the civiccore baseline. + """Idempotently bring the database up to the townlight_core baseline. Runs in three phases: 1. Ensure required extensions exist (``vector`` for pgvector). diff --git a/civiccore/migrations/versions/civiccore_0002_llm.py b/townlight_core/migrations/versions/townlight_core_0002_llm.py similarity index 79% rename from civiccore/migrations/versions/civiccore_0002_llm.py rename to townlight_core/migrations/versions/townlight_core_0002_llm.py index 3cec5b2..e03aa8c 100644 --- a/civiccore/migrations/versions/civiccore_0002_llm.py +++ b/townlight_core/migrations/versions/townlight_core_0002_llm.py @@ -1,9 +1,9 @@ -"""CivicCore migration 0002 — Phase 2 LLM extraction: prompt_templates schema evolution. +"""TownlightCore migration 0002 — Phase 2 LLM extraction: prompt_templates schema evolution. Context — Phase 2 LLM extraction: - CivicCore v0.1.0 (baseline 0001) already contains both LLM-related tables: + TownlightCore v0.1.0 (baseline 0001) already contains both LLM-related tables: - * ``model_registry`` — fully Phase-2-ready as extracted from CivicRecords HEAD 019. + * ``model_registry`` — fully Phase-2-ready as extracted from TownlightRecords HEAD 019. No columns need to be added or altered; this migration leaves it untouched. * ``prompt_templates`` — present in the baseline but needs schema evolution to @@ -11,8 +11,8 @@ evolution in-place (ALTER, not CREATE). Why ALTER not CREATE: - Both tables were captured verbatim from CivicRecords HEAD 019 by the baseline - migration (civiccore_0001_baseline_v1). They therefore already exist in any + Both tables were captured verbatim from TownlightRecords HEAD 019 by the baseline + migration (townlight_core_0001_baseline_v1). They therefore already exist in any database that has run 0001. This migration extends ``prompt_templates``; it does not recreate it. Running against a fresh database after 0001 is the normal path; running against a database already at a partially-evolved state is also safe @@ -24,13 +24,13 @@ calls this ``template_name`` to distinguish it from other "name"-style columns in the database. - 2. Add ``consumer_app VARCHAR(100) NOT NULL DEFAULT 'civiccore'``. + 2. Add ``consumer_app VARCHAR(100) NOT NULL DEFAULT 'townlight_core'``. Identifies which consuming application owns a template row. Defaults to - 'civiccore' for the shared kernel. Records-AI side migration bacfills rows - that belong to 'civicrecords-ai' (Step 5 of the Phase 2 sprint). + 'townlight_core' for the shared kernel. Records-AI side migration bacfills rows + that belong to 'townlight_records' (Step 5 of the Phase 2 sprint). 3. Add ``is_override BOOLEAN NOT NULL DEFAULT false``. - Flag indicating whether a row is a consumer-app override of a civiccore + Flag indicating whether a row is a consumer-app override of a townlight_core canonical template rather than a canonical template itself. 4. Drop old unique constraint ``prompt_templates_name_key``. @@ -49,12 +49,12 @@ Data migration note: Existing ``prompt_templates`` rows will default ``consumer_app`` to - 'civiccore' and ``is_override`` to False. The CivicRecords-side migration - handles backfilling rows that logically belong to 'civicrecords-ai' + 'townlight_core' and ``is_override`` to False. The TownlightRecords-side migration + handles backfilling rows that logically belong to 'townlight_records' (Phase 2 sprint Step 5). No data migration is performed in this file. Idempotency guarantees: - Every step uses a guard helper from ``civiccore.migrations.guards``: + Every step uses a guard helper from ``townlight_core.migrations.guards``: * idempotent_alter_column — no-op if the old column name is absent * idempotent_add_column — no-op if the column already exists * idempotent_drop_constraint — no-op if the constraint is absent @@ -65,7 +65,7 @@ Downgrade: No-op by design — same reasoning as 0001. The renamed column and new - columns are already referenced by downstream civicrecords-ai migrations. + columns are already referenced by downstream townlight_records migrations. Use point-in-time restore or drop/recreate the database instead. """ @@ -73,7 +73,7 @@ import sqlalchemy as sa -from civiccore.migrations.guards import ( +from townlight_core.migrations.guards import ( idempotent_add_column, idempotent_alter_column, idempotent_create_unique_constraint, @@ -83,8 +83,8 @@ # Alembic identifiers -------------------------------------------------------- -revision = "civiccore_0002_llm" -down_revision = "civiccore_0001_baseline_v1" +revision = "townlight_core_0002" +down_revision = "townlight_core_0001" branch_labels = None depends_on = None @@ -110,10 +110,10 @@ def upgrade() -> None: existing_type=sa.String(200), ) - # 2. Add consumer_app VARCHAR(100) NOT NULL DEFAULT 'civiccore' + # 2. Add consumer_app VARCHAR(100) NOT NULL DEFAULT 'townlight_core' idempotent_add_column( "prompt_templates", - sa.Column("consumer_app", sa.String(100), nullable=False, server_default="civiccore"), + sa.Column("consumer_app", sa.String(100), nullable=False, server_default="townlight_core"), ) # 3. Add is_override BOOLEAN NOT NULL DEFAULT false @@ -141,7 +141,7 @@ def downgrade() -> None: """No-op. The renamed column (template_name) and new columns (consumer_app, - is_override) are already referenced by downstream civicrecords-ai + is_override) are already referenced by downstream townlight_records migrations. Reversing this migration would break those dependencies. Use database-level restore instead. """ diff --git a/civiccore/migrations/versions/civiccore_0003_local_task_queue.py b/townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py similarity index 68% rename from civiccore/migrations/versions/civiccore_0003_local_task_queue.py rename to townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py index fdec2b6..2cb377c 100644 --- a/civiccore/migrations/versions/civiccore_0003_local_task_queue.py +++ b/townlight_core/migrations/versions/townlight_core_0003_local_task_queue.py @@ -1,22 +1,22 @@ -"""CivicCore migration 0003 - local task queue.""" +"""TownlightCore migration 0003 - local task queue.""" from __future__ import annotations import sqlalchemy as sa from sqlalchemy.dialects import postgresql -from civiccore.migrations.guards import idempotent_create_index, idempotent_create_table +from townlight_core.migrations.guards import idempotent_create_index, idempotent_create_table -revision = "civiccore_0003_local_task_queue" -down_revision = "civiccore_0002_llm" +revision = "townlight_core_0003" +down_revision = "townlight_core_0002" branch_labels = None depends_on = None def upgrade() -> None: idempotent_create_table( - "civiccore_local_tasks", + "townlight_core_local_tasks", sa.Column("task_id", sa.String(128), primary_key=True), sa.Column("module_id", sa.String(64), nullable=False), sa.Column("task_type", sa.String(100), nullable=False), @@ -34,9 +34,9 @@ def upgrade() -> None: sa.Column("idempotency_key", sa.String(255), nullable=True, unique=True), sa.Column("audit_subject_id", sa.String(255), nullable=True), ) - idempotent_create_index("ix_civiccore_local_tasks_module", "civiccore_local_tasks", ["module_id"]) - idempotent_create_index("ix_civiccore_local_tasks_status", "civiccore_local_tasks", ["status"]) - idempotent_create_index("ix_civiccore_local_tasks_type", "civiccore_local_tasks", ["task_type"]) + idempotent_create_index("ix_townlight_core_local_tasks_module", "townlight_core_local_tasks", ["module_id"]) + idempotent_create_index("ix_townlight_core_local_tasks_status", "townlight_core_local_tasks", ["status"]) + idempotent_create_index("ix_townlight_core_local_tasks_type", "townlight_core_local_tasks", ["task_type"]) def downgrade() -> None: diff --git a/civiccore/migrations/versions/civiccore_0004_catalog.py b/townlight_core/migrations/versions/townlight_core_0004_catalog.py similarity index 78% rename from civiccore/migrations/versions/civiccore_0004_catalog.py rename to townlight_core/migrations/versions/townlight_core_0004_catalog.py index 5c00fa3..6449626 100644 --- a/civiccore/migrations/versions/civiccore_0004_catalog.py +++ b/townlight_core/migrations/versions/townlight_core_0004_catalog.py @@ -3,14 +3,14 @@ from alembic import op -revision = "civiccore_0004_catalog" -down_revision = "civiccore_0003_local_task_queue" +revision = "townlight_core_0004" +down_revision = "townlight_core_0003" branch_labels = None depends_on = None def upgrade(): - op.execute("""CREATE TABLE IF NOT EXISTS civiccore_catalog_imports ( + op.execute("""CREATE TABLE IF NOT EXISTS townlight_core_catalog_imports ( version varchar(20) PRIMARY KEY, source_sha256 varchar(64) NOT NULL, entry_count integer NOT NULL CHECK (entry_count >= 0), diff --git a/townlight_core/migrations/versions/townlight_core_0005_job_leases.py b/townlight_core/migrations/versions/townlight_core_0005_job_leases.py new file mode 100644 index 0000000..d0a6bb8 --- /dev/null +++ b/townlight_core/migrations/versions/townlight_core_0005_job_leases.py @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: AGPL-3.0-only +"""Fenced worker leases on the existing shared queue; no second job store.""" + +from alembic import op + +revision = "townlight_core_0005" +down_revision = "townlight_core_0004" +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute("ALTER TABLE townlight_core_local_tasks ADD COLUMN IF NOT EXISTS claim_token varchar(64)") + op.execute( + "ALTER TABLE townlight_core_local_tasks ADD COLUMN IF NOT EXISTS lease_expires_at timestamptz" + ) + op.execute( + "ALTER TABLE townlight_core_local_tasks ADD COLUMN IF NOT EXISTS cancelled_by varchar(128)" + ) + op.execute( + "CREATE INDEX IF NOT EXISTS ix_townlight_core_local_tasks_lease ON townlight_core_local_tasks (status,lease_expires_at)" + ) + + +def downgrade(): + pass # Preserve jobs and cancellation history; restore a coherent backup. diff --git a/civiccore/migrations/versions/civiccore_0006_rule_history.py b/townlight_core/migrations/versions/townlight_core_0006_rule_history.py similarity index 62% rename from civiccore/migrations/versions/civiccore_0006_rule_history.py rename to townlight_core/migrations/versions/townlight_core_0006_rule_history.py index c338470..9754721 100644 --- a/civiccore/migrations/versions/civiccore_0006_rule_history.py +++ b/townlight_core/migrations/versions/townlight_core_0006_rule_history.py @@ -10,15 +10,15 @@ from alembic import op -revision = "civiccore_0006_rule_history" -down_revision = "civiccore_0005_job_leases" +revision = "townlight_core_0006" +down_revision = "townlight_core_0005" branch_labels = None depends_on = None def upgrade() -> None: op.execute( - """CREATE TABLE IF NOT EXISTS civiccore_rule_versions ( + """CREATE TABLE IF NOT EXISTS townlight_core_rule_versions ( rule_id uuid NOT NULL, state_code varchar(2) NOT NULL, version integer NOT NULL CHECK (version >= 1), @@ -34,41 +34,41 @@ def upgrade() -> None: content_sha256 char(64) NOT NULL, recorded_by varchar(128) NOT NULL CHECK (length(btrim(recorded_by)) > 0), recorded_at timestamptz NOT NULL DEFAULT now(), - CONSTRAINT civiccore_rule_versions_pkey PRIMARY KEY (rule_id, version), - CONSTRAINT civiccore_rule_versions_jurisdiction_key UNIQUE (rule_id, state_code, version), - CONSTRAINT civiccore_rule_versions_state_code_ck + CONSTRAINT townlight_core_rule_versions_pkey PRIMARY KEY (rule_id, version), + CONSTRAINT townlight_core_rule_versions_jurisdiction_key UNIQUE (rule_id, state_code, version), + CONSTRAINT townlight_core_rule_versions_state_code_ck CHECK (state_code = upper(state_code) AND length(state_code) = 2) )""" ) # Deterministic current-version and per-jurisdiction listing. op.execute( - "CREATE INDEX IF NOT EXISTS ix_civiccore_rule_versions_state_category " - "ON civiccore_rule_versions (state_code, category, version DESC)" + "CREATE INDEX IF NOT EXISTS ix_townlight_core_rule_versions_state_category " + "ON townlight_core_rule_versions (state_code, category, version DESC)" ) op.execute( - """CREATE OR REPLACE FUNCTION civiccore_rule_versions_append_only() + """CREATE OR REPLACE FUNCTION townlight_core_rule_versions_append_only() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN - RAISE EXCEPTION 'civiccore rule version history is append-only' + RAISE EXCEPTION 'townlight_core rule version history is append-only' USING ERRCODE = 'restrict_violation'; END; $$""" ) op.execute( - "DROP TRIGGER IF EXISTS trg_civiccore_rule_versions_append_only ON civiccore_rule_versions" + "DROP TRIGGER IF EXISTS trg_townlight_core_rule_versions_append_only ON townlight_core_rule_versions" ) op.execute( - """CREATE TRIGGER trg_civiccore_rule_versions_append_only - BEFORE UPDATE OR DELETE ON civiccore_rule_versions - FOR EACH ROW EXECUTE FUNCTION civiccore_rule_versions_append_only()""" + """CREATE TRIGGER trg_townlight_core_rule_versions_append_only + BEFORE UPDATE OR DELETE ON townlight_core_rule_versions + FOR EACH ROW EXECUTE FUNCTION townlight_core_rule_versions_append_only()""" ) # A rule id belongs to exactly one jurisdiction; a later insert cannot migrate it. op.execute( - """CREATE OR REPLACE FUNCTION civiccore_rule_versions_single_jurisdiction() + """CREATE OR REPLACE FUNCTION townlight_core_rule_versions_single_jurisdiction() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF EXISTS ( - SELECT 1 FROM civiccore_rule_versions + SELECT 1 FROM townlight_core_rule_versions WHERE rule_id = NEW.rule_id AND state_code <> NEW.state_code ) THEN RAISE EXCEPTION 'rule % already belongs to another jurisdiction', NEW.rule_id @@ -79,13 +79,13 @@ def upgrade() -> None: $$""" ) op.execute( - "DROP TRIGGER IF EXISTS trg_civiccore_rule_versions_jurisdiction " - "ON civiccore_rule_versions" + "DROP TRIGGER IF EXISTS trg_townlight_core_rule_versions_jurisdiction " + "ON townlight_core_rule_versions" ) op.execute( - """CREATE TRIGGER trg_civiccore_rule_versions_jurisdiction - BEFORE INSERT ON civiccore_rule_versions - FOR EACH ROW EXECUTE FUNCTION civiccore_rule_versions_single_jurisdiction()""" + """CREATE TRIGGER trg_townlight_core_rule_versions_jurisdiction + BEFORE INSERT ON townlight_core_rule_versions + FOR EACH ROW EXECUTE FUNCTION townlight_core_rule_versions_single_jurisdiction()""" ) diff --git a/civiccore/migrations/versions/civiccore_0007_module_inventory.py b/townlight_core/migrations/versions/townlight_core_0007_module_inventory.py similarity index 68% rename from civiccore/migrations/versions/civiccore_0007_module_inventory.py rename to townlight_core/migrations/versions/townlight_core_0007_module_inventory.py index 4eeb22f..8943365 100644 --- a/civiccore/migrations/versions/civiccore_0007_module_inventory.py +++ b/townlight_core/migrations/versions/townlight_core_0007_module_inventory.py @@ -10,60 +10,60 @@ from alembic import op -revision = "civiccore_0007_module_inventory" -down_revision = "civiccore_0006_rule_history" +revision = "townlight_core_0007" +down_revision = "townlight_core_0006" branch_labels = None depends_on = None def upgrade() -> None: op.execute( - """CREATE TABLE IF NOT EXISTS civiccore_module_inventory ( + """CREATE TABLE IF NOT EXISTS townlight_core_module_inventory ( scope_id varchar(64) NOT NULL CHECK (length(btrim(scope_id)) > 0), revision integer NOT NULL CHECK (revision >= 1), profile varchar(20) NOT NULL CHECK (profile IN ('windows_local','server','developer')), - civiccore_version varchar(40) NOT NULL CHECK (length(btrim(civiccore_version)) > 0), + townlight_core_version varchar(40) NOT NULL CHECK (length(btrim(townlight_core_version)) > 0), content_sha256 char(64) NOT NULL, recorded_by varchar(128) NOT NULL CHECK (length(btrim(recorded_by)) > 0), recorded_at timestamptz NOT NULL DEFAULT now(), - CONSTRAINT civiccore_module_inventory_pkey PRIMARY KEY (scope_id, revision) + CONSTRAINT townlight_core_module_inventory_pkey PRIMARY KEY (scope_id, revision) )""" ) op.execute( - """CREATE TABLE IF NOT EXISTS civiccore_module_inventory_entries ( + """CREATE TABLE IF NOT EXISTS townlight_core_module_inventory_entries ( scope_id varchar(64) NOT NULL, revision integer NOT NULL CHECK (revision >= 1), module_id varchar(64) NOT NULL CHECK (length(btrim(module_id)) > 0), version varchar(40) NOT NULL CHECK (length(btrim(version)) > 0), enabled boolean NOT NULL, manifest jsonb NOT NULL, - CONSTRAINT civiccore_module_inventory_entries_pkey + CONSTRAINT townlight_core_module_inventory_entries_pkey PRIMARY KEY (scope_id, revision, module_id), - CONSTRAINT civiccore_module_inventory_entries_scope_fk + CONSTRAINT townlight_core_module_inventory_entries_scope_fk FOREIGN KEY (scope_id, revision) - REFERENCES civiccore_module_inventory (scope_id, revision) + REFERENCES townlight_core_module_inventory (scope_id, revision) )""" ) # Deterministic scope listing without a sequential scan of every revision. op.execute( - "CREATE INDEX IF NOT EXISTS ix_civiccore_module_inventory_scope " - "ON civiccore_module_inventory (scope_id, revision DESC)" + "CREATE INDEX IF NOT EXISTS ix_townlight_core_module_inventory_scope " + "ON townlight_core_module_inventory (scope_id, revision DESC)" ) op.execute( - """CREATE OR REPLACE FUNCTION civiccore_module_inventory_append_only() + """CREATE OR REPLACE FUNCTION townlight_core_module_inventory_append_only() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN - RAISE EXCEPTION 'civiccore module inventory is append-only' + RAISE EXCEPTION 'townlight_core module inventory is append-only' USING ERRCODE = 'restrict_violation'; END; $$""" ) - for table in ("civiccore_module_inventory", "civiccore_module_inventory_entries"): + for table in ("townlight_core_module_inventory", "townlight_core_module_inventory_entries"): op.execute(f"DROP TRIGGER IF EXISTS trg_{table}_append_only ON {table}") op.execute( f"""CREATE TRIGGER trg_{table}_append_only BEFORE UPDATE OR DELETE ON {table} - FOR EACH ROW EXECUTE FUNCTION civiccore_module_inventory_append_only()""" + FOR EACH ROW EXECUTE FUNCTION townlight_core_module_inventory_append_only()""" ) # Scope isolation comes from the composite primary key and the (scope_id, revision) # foreign key: a revision's entries cannot be read or joined across scopes, while the same diff --git a/civiccore/migrations/versions/civiccore_0008_department_authority.py b/townlight_core/migrations/versions/townlight_core_0008_department_authority.py similarity index 68% rename from civiccore/migrations/versions/civiccore_0008_department_authority.py rename to townlight_core/migrations/versions/townlight_core_0008_department_authority.py index bac2d54..28ca86e 100644 --- a/civiccore/migrations/versions/civiccore_0008_department_authority.py +++ b/townlight_core/migrations/versions/townlight_core_0008_department_authority.py @@ -11,15 +11,15 @@ from alembic import op -revision = "civiccore_0008_authority" -down_revision = "civiccore_0007_module_inventory" +revision = "townlight_core_0008" +down_revision = "townlight_core_0007" branch_labels = None depends_on = None def upgrade() -> None: op.execute( - """CREATE TABLE IF NOT EXISTS civiccore_department_grant_events ( + """CREATE TABLE IF NOT EXISTS townlight_core_department_grant_events ( scope_id varchar(64) NOT NULL CHECK (length(btrim(scope_id)) > 0), subject varchar(320) NOT NULL CHECK (length(btrim(subject)) > 0), department_id uuid NOT NULL, @@ -29,9 +29,9 @@ def upgrade() -> None: recorded_by varchar(128) NOT NULL CHECK (length(btrim(recorded_by)) > 0), recorded_at timestamptz NOT NULL DEFAULT now(), content_sha256 char(64) NOT NULL, - CONSTRAINT civiccore_department_grant_events_pkey + CONSTRAINT townlight_core_department_grant_events_pkey PRIMARY KEY (scope_id, subject, department_id, sequence), - CONSTRAINT civiccore_department_grant_roles_shape + CONSTRAINT townlight_core_department_grant_roles_shape CHECK ((action = 'grant' AND cardinality(roles) >= 1) OR (action = 'revoke' AND cardinality(roles) = 0)) )""" @@ -39,30 +39,30 @@ def upgrade() -> None: # The active-state read path is one DISTINCT ON per (scope, subject): this index serves it # without scanning every retained event of the whole ledger. op.execute( - "CREATE INDEX IF NOT EXISTS ix_civiccore_department_grant_active " - "ON civiccore_department_grant_events (scope_id, subject, department_id, sequence DESC)" + "CREATE INDEX IF NOT EXISTS ix_townlight_core_department_grant_active " + "ON townlight_core_department_grant_events (scope_id, subject, department_id, sequence DESC)" ) op.execute( - "CREATE INDEX IF NOT EXISTS ix_civiccore_department_grant_department " - "ON civiccore_department_grant_events (scope_id, department_id)" + "CREATE INDEX IF NOT EXISTS ix_townlight_core_department_grant_department " + "ON townlight_core_department_grant_events (scope_id, department_id)" ) op.execute( - """CREATE OR REPLACE FUNCTION civiccore_department_grant_append_only() + """CREATE OR REPLACE FUNCTION townlight_core_department_grant_append_only() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN - RAISE EXCEPTION 'civiccore department grants are append-only' + RAISE EXCEPTION 'townlight_core department grants are append-only' USING ERRCODE = 'restrict_violation'; END; $$""" ) op.execute( - "DROP TRIGGER IF EXISTS trg_civiccore_department_grant_append_only " - "ON civiccore_department_grant_events" + "DROP TRIGGER IF EXISTS trg_townlight_core_department_grant_append_only " + "ON townlight_core_department_grant_events" ) op.execute( - """CREATE TRIGGER trg_civiccore_department_grant_append_only - BEFORE UPDATE OR DELETE ON civiccore_department_grant_events - FOR EACH ROW EXECUTE FUNCTION civiccore_department_grant_append_only()""" + """CREATE TRIGGER trg_townlight_core_department_grant_append_only + BEFORE UPDATE OR DELETE ON townlight_core_department_grant_events + FOR EACH ROW EXECUTE FUNCTION townlight_core_department_grant_append_only()""" ) # Scope isolation is structural: every row carries its scope, and the composite primary key # makes a (scope, subject, department, sequence) identity unambiguous. A grant in one scope diff --git a/civiccore/migrations/versions/civiccore_0009_job_artifacts.py b/townlight_core/migrations/versions/townlight_core_0009_job_artifacts.py similarity index 73% rename from civiccore/migrations/versions/civiccore_0009_job_artifacts.py rename to townlight_core/migrations/versions/townlight_core_0009_job_artifacts.py index 874dd5f..8e7d2bb 100644 --- a/civiccore/migrations/versions/civiccore_0009_job_artifacts.py +++ b/townlight_core/migrations/versions/townlight_core_0009_job_artifacts.py @@ -11,15 +11,15 @@ from alembic import op -revision = "civiccore_0009_job_artifacts" -down_revision = "civiccore_0008_authority" +revision = "townlight_core_0009" +down_revision = "townlight_core_0008" branch_labels = None depends_on = None def upgrade() -> None: op.execute( - """CREATE TABLE IF NOT EXISTS civiccore_job_artifacts ( + """CREATE TABLE IF NOT EXISTS townlight_core_job_artifacts ( artifact_id varchar(64) PRIMARY KEY CHECK (length(artifact_id) = 32), task_id varchar(128) NOT NULL CHECK (length(btrim(task_id)) > 0), module_id varchar(64) NOT NULL CHECK (length(btrim(module_id)) > 0), @@ -36,32 +36,32 @@ def upgrade() -> None: source_label varchar(200) NOT NULL CHECK (length(btrim(source_label)) > 0), recorded_by varchar(128) NOT NULL CHECK (length(btrim(recorded_by)) > 0), recorded_at timestamptz NOT NULL DEFAULT now(), - CONSTRAINT civiccore_job_artifacts_task_name_unique UNIQUE (task_id, artifact_name) + CONSTRAINT townlight_core_job_artifacts_task_name_unique UNIQUE (task_id, artifact_name) )""" ) # One claimed job cannot record the same relative path twice, and the queue's job # identity stays the fast lookup for a consumer assembling a job's receipts. op.execute( - "CREATE INDEX IF NOT EXISTS ix_civiccore_job_artifacts_task " - "ON civiccore_job_artifacts (task_id, recorded_at)" + "CREATE INDEX IF NOT EXISTS ix_townlight_core_job_artifacts_task " + "ON townlight_core_job_artifacts (task_id, recorded_at)" ) op.execute( - """CREATE OR REPLACE FUNCTION civiccore_job_artifacts_append_only() + """CREATE OR REPLACE FUNCTION townlight_core_job_artifacts_append_only() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN - RAISE EXCEPTION 'civiccore job artifact receipts are append-only' + RAISE EXCEPTION 'townlight_core job artifact receipts are append-only' USING ERRCODE = 'restrict_violation'; END; $$""" ) op.execute( - "DROP TRIGGER IF EXISTS trg_civiccore_job_artifacts_append_only " - "ON civiccore_job_artifacts" + "DROP TRIGGER IF EXISTS trg_townlight_core_job_artifacts_append_only " + "ON townlight_core_job_artifacts" ) op.execute( - """CREATE TRIGGER trg_civiccore_job_artifacts_append_only - BEFORE UPDATE OR DELETE ON civiccore_job_artifacts - FOR EACH ROW EXECUTE FUNCTION civiccore_job_artifacts_append_only()""" + """CREATE TRIGGER trg_townlight_core_job_artifacts_append_only + BEFORE UPDATE OR DELETE ON townlight_core_job_artifacts + FOR EACH ROW EXECUTE FUNCTION townlight_core_job_artifacts_append_only()""" ) diff --git a/civiccore/models/__init__.py b/townlight_core/models/__init__.py similarity index 53% rename from civiccore/models/__init__.py rename to townlight_core/models/__init__.py index 22b46a5..d342508 100644 --- a/civiccore/models/__init__.py +++ b/townlight_core/models/__init__.py @@ -1,7 +1,7 @@ """Townlight Core shared SQLAlchemy ORM model exports.""" -from civiccore.ingest.models import DataSource, Document, DocumentChunk, IngestionStatus, SourceType -from civiccore.platform.task_queue import LocalTask +from townlight_core.ingest.models import DataSource, Document, DocumentChunk, IngestionStatus, SourceType +from townlight_core.platform.task_queue import LocalTask __all__ = [ "DataSource", diff --git a/civiccore/notifications/__init__.py b/townlight_core/notifications/__init__.py similarity index 89% rename from civiccore/notifications/__init__.py rename to townlight_core/notifications/__init__.py index eac4f12..a2fb75a 100644 --- a/civiccore/notifications/__init__.py +++ b/townlight_core/notifications/__init__.py @@ -1,6 +1,6 @@ """Shared notice and notification helpers for Townlight modules.""" -from civiccore.notifications.notice import ( +from townlight_core.notifications.notice import ( DeadlinePlan, NoticeComplianceResult, NoticeComplianceWarning, diff --git a/civiccore/notifications/notice.py b/townlight_core/notifications/notice.py similarity index 100% rename from civiccore/notifications/notice.py rename to townlight_core/notifications/notice.py diff --git a/civiccore/onboarding/__init__.py b/townlight_core/onboarding/__init__.py similarity index 90% rename from civiccore/onboarding/__init__.py rename to townlight_core/onboarding/__init__.py index f77831a..1c09abb 100644 --- a/civiccore/onboarding/__init__.py +++ b/townlight_core/onboarding/__init__.py @@ -1,6 +1,6 @@ """Shared onboarding interview/profile helpers for Townlight modules.""" -from civiccore.onboarding.profile import ( +from townlight_core.onboarding.profile import ( DEFAULT_PROFILE_FIELDS, OnboardingField, OnboardingProgress, diff --git a/civiccore/onboarding/profile.py b/townlight_core/onboarding/profile.py similarity index 100% rename from civiccore/onboarding/profile.py rename to townlight_core/onboarding/profile.py diff --git a/civiccore/platform/__init__.py b/townlight_core/platform/__init__.py similarity index 89% rename from civiccore/platform/__init__.py rename to townlight_core/platform/__init__.py index 164d3c1..21c358b 100644 --- a/civiccore/platform/__init__.py +++ b/townlight_core/platform/__init__.py @@ -2,7 +2,7 @@ from __future__ import annotations -from civiccore.platform.backup import ( +from townlight_core.platform.backup import ( BackupItem, BackupManifest, BackupRestoreAction, @@ -12,13 +12,13 @@ plan_restore, validate_backup_manifest, ) -from civiccore.platform.health import ( +from townlight_core.platform.health import ( PlatformHealthCheck, PlatformHealthStatus, PlatformHealthSummary, summarize_platform_health, ) -from civiccore.platform.inventory import ( +from townlight_core.platform.inventory import ( InventoryConflictError, InventoryOutcome, ModuleInventory, @@ -34,7 +34,7 @@ record_inventory, require_installed, ) -from civiccore.platform.modules import ( +from townlight_core.platform.modules import ( WINDOWS_LOCAL_BLOCKED_RUNTIME_KINDS, ModuleBackupHook, ModuleDependency, @@ -51,8 +51,8 @@ build_module_registry, validate_windows_local_manifest, ) -from civiccore.platform.runtime import LocalRuntimeProfile, RuntimeActionResult -from civiccore.platform.task_queue import ( +from townlight_core.platform.runtime import LocalRuntimeProfile, RuntimeActionResult +from townlight_core.platform.task_queue import ( LocalTask, TaskHandler, claim_next_local_task, @@ -65,7 +65,7 @@ run_one_local_task, task_row_to_envelope, ) -from civiccore.platform.tasks import ( +from townlight_core.platform.tasks import ( LocalTaskEnvelope, LocalTaskResult, TaskQueueSummary, diff --git a/civiccore/platform/backup.py b/townlight_core/platform/backup.py similarity index 96% rename from civiccore/platform/backup.py rename to townlight_core/platform/backup.py index 1ac9ab1..b3c2946 100644 --- a/civiccore/platform/backup.py +++ b/townlight_core/platform/backup.py @@ -17,7 +17,7 @@ class BackupItem(BaseModel): model_config = ConfigDict(extra="forbid") - module_id: str = Field(pattern=r"^[a-z][a-z0-9-]{1,63}$") + module_id: str = Field(pattern=r"^[a-z][a-z0-9_-]{1,63}$") relative_path: str = Field(min_length=1) size_bytes: int = Field(ge=0) sha256: str = Field(pattern=r"^[a-f0-9]{64}$") @@ -32,7 +32,7 @@ class BackupManifest(BaseModel): schema_version: str = "1.0" backup_id: str = Field(min_length=1) city_profile_id: str = Field(min_length=1) - civiccore_version: str = Field(min_length=1) + townlight_core_version: str = Field(min_length=1) created_at: datetime = Field(default_factory=lambda: datetime.now(UTC)) modules: list[str] = Field(default_factory=list) items: list[BackupItem] @@ -75,7 +75,7 @@ def build_backup_manifest( files: list[Path], backup_id: str, city_profile_id: str, - civiccore_version: str, + townlight_core_version: str, module_id: str, ) -> BackupManifest: """Build a checksum manifest for files under a local data root.""" @@ -100,7 +100,7 @@ def build_backup_manifest( return BackupManifest( backup_id=backup_id, city_profile_id=city_profile_id, - civiccore_version=civiccore_version, + townlight_core_version=townlight_core_version, modules=sorted({module_id for _item in items}), items=sorted(items, key=lambda item: item.relative_path), ) diff --git a/civiccore/platform/health.py b/townlight_core/platform/health.py similarity index 95% rename from civiccore/platform/health.py rename to townlight_core/platform/health.py index e36dc9d..e2fa0db 100644 --- a/civiccore/platform/health.py +++ b/townlight_core/platform/health.py @@ -56,8 +56,8 @@ def summarize_platform_health(checks: list[PlatformHealthCheck]) -> PlatformHeal return PlatformHealthSummary( status="needs_setup", checks=[], - next_action="Run first-run setup so CivicSuite can verify the local services.", - staff_message="CivicSuite has not completed setup yet.", + next_action="Run first-run setup so Townlight can verify the local services.", + staff_message="Townlight has not completed setup yet.", admin_message="No platform health checks have reported.", blocked_components=[], degraded_components=[], diff --git a/civiccore/platform/inventory.py b/townlight_core/platform/inventory.py similarity index 94% rename from civiccore/platform/inventory.py rename to townlight_core/platform/inventory.py index d7fd11b..abc9ae6 100644 --- a/civiccore/platform/inventory.py +++ b/townlight_core/platform/inventory.py @@ -10,14 +10,14 @@ Relationship to the existing contracts -------------------------------------- -There is exactly one module resolver: :func:`civiccore.platform.modules.build_module_registry`. -This module validates through the shipped :class:`~civiccore.platform.modules.ModuleManifest`, +There is exactly one module resolver: :func:`townlight_core.platform.modules.build_module_registry`. +This module validates through the shipped :class:`~townlight_core.platform.modules.ModuleManifest`, persists a declared inventory, and asks that resolver what the declared set actually admits. No second resolver, dependency walker or cycle detector exists here. Relationship to the shared municipal systems catalog ---------------------------------------------------- -``civiccore.catalog`` holds reference data about *vendor systems* (domains, vendors, protocol +``townlight_core.catalog`` holds reference data about *vendor systems* (domains, vendors, protocol templates). That is not this: an installed-module inventory lists *Townlight module packages* a scope declares installed. The two never share rows, and a catalog entry never implies a module installation, just as a module entry never implies a vendor connection. @@ -50,7 +50,7 @@ from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession -from civiccore.platform.modules import ( +from townlight_core.platform.modules import ( InstallProfile, ModuleManifest, ModuleRegistryState, @@ -76,8 +76,8 @@ "ENTRY_TABLE", ] -HEAD_TABLE = "civiccore_module_inventory" -ENTRY_TABLE = "civiccore_module_inventory_entries" +HEAD_TABLE = "townlight_core_module_inventory" +ENTRY_TABLE = "townlight_core_module_inventory_entries" SCOPE_PATTERN = re.compile(r"^[a-z][a-z0-9._-]{1,63}$") @@ -144,7 +144,7 @@ class ModuleInventory(BaseModel): scope_id: str = Field(min_length=2, max_length=64) revision: int = Field(ge=1) profile: InstallProfile = "windows_local" - civiccore_version: str = Field(min_length=1) + townlight_core_version: str = Field(min_length=1) entries: list[ModuleInventoryEntry] = Field(default_factory=list) @field_validator("scope_id") @@ -183,7 +183,7 @@ def fingerprint(self) -> str: { "scope_id": self.scope_id, "profile": self.profile, - "civiccore_version": self.civiccore_version, + "townlight_core_version": self.townlight_core_version, "entries": payload, }, sort_keys=True, @@ -211,7 +211,7 @@ class InventoryOutcome(BaseModel): fingerprint: str -_COLUMNS = "scope_id,revision,profile,civiccore_version,content_sha256" +_COLUMNS = "scope_id,revision,profile,townlight_core_version,content_sha256" def _entry_rows(entries: list[ModuleInventoryEntry]) -> list[dict[str, Any]]: @@ -276,7 +276,7 @@ async def _load( scope_id=header["scope_id"], revision=header["revision"], profile=header["profile"], - civiccore_version=header["civiccore_version"], + townlight_core_version=header["townlight_core_version"], entries=[ ModuleInventoryEntry( module_id=row["module_id"], @@ -315,7 +315,7 @@ async def record_inventory( # Serialize per scope so two writers cannot both believe they hold the next revision. await session.execute( text("SELECT pg_advisory_xact_lock(hashtextextended(:key, 0))"), - {"key": f"civiccore.module_inventory:{item.scope_id}"}, + {"key": f"townlight_core.module_inventory:{item.scope_id}"}, ) current = ( @@ -359,14 +359,14 @@ async def record_inventory( await session.execute( text( - f"INSERT INTO {HEAD_TABLE} (scope_id,revision,profile,civiccore_version," + f"INSERT INTO {HEAD_TABLE} (scope_id,revision,profile,townlight_core_version," "content_sha256,recorded_by) VALUES (:scope,:rev,:profile,:core,:digest,:actor)" ), { "scope": item.scope_id, "rev": item.revision, "profile": item.profile, - "core": item.civiccore_version, + "core": item.townlight_core_version, "digest": fingerprint, "actor": recorded_by.strip(), }, @@ -432,13 +432,13 @@ def _actions_for_reason(reason: str | None) -> RecommendationAction: def _registry( manifests: list[ModuleManifest], *, - civiccore_version: str, + townlight_core_version: str, selected: set[str], profile: InstallProfile, ) -> ModuleRegistryState: return build_module_registry( list(manifests), - civiccore_version=civiccore_version, + townlight_core_version=townlight_core_version, selected_module_ids=selected, profile=profile, ) @@ -476,7 +476,7 @@ def resolve(selected: set[str]) -> dict[str, object]: entry.module_id: entry for entry in _registry( manifests, - civiccore_version=inventory.civiccore_version, + townlight_core_version=inventory.townlight_core_version, selected=selected, profile=inventory.profile, ).entries @@ -548,7 +548,7 @@ def _operator_copy(name: str, action: RecommendationAction, reason: str) -> str: if action == "enable": return f"{name} is installed but switched off. Enabling it is optional: {reason}" if action == "upgrade-core": - return f"{name} needs a newer CivicCore before it can run: {reason}" + return f"{name} needs a newer TownlightCore before it can run: {reason}" if action == "not-supported": return f"{name} does not support this install profile: {reason}" return f"{name} cannot start with the modules declared here: {reason}" diff --git a/civiccore/platform/modules.py b/townlight_core/platform/modules.py similarity index 95% rename from civiccore/platform/modules.py rename to townlight_core/platform/modules.py index 349179e..dd6159c 100644 --- a/civiccore/platform/modules.py +++ b/townlight_core/platform/modules.py @@ -19,7 +19,7 @@ "background-worker", ] RuntimeRequirementKind = Literal[ - "civiccore", + "townlight_core", "postgres", "pgvector", "python", @@ -38,7 +38,7 @@ ] ModuleRegistryStatus = Literal["enabled", "disabled", "blocked"] -MODULE_ID_PATTERN = r"^[a-z][a-z0-9-]{1,63}$" +MODULE_ID_PATTERN = r"^[a-z][a-z0-9_-]{1,63}$" SLUG_PATTERN = r"^[a-z][a-z0-9_-]{1,63}$" WINDOWS_LOCAL_BLOCKED_RUNTIME_KINDS = frozenset({"docker", "wsl", "linux_shell", "terminal"}) @@ -169,7 +169,7 @@ class ModuleManifest(BaseModel): name: str = Field(min_length=1) version: str = Field(min_length=1) package_name: str = Field(min_length=1) - civiccore_min_version: str = Field(min_length=1) + townlight_core_min_version: str = Field(min_length=1) enabled_by_default: bool = True surfaces: list[ModuleSurface] = Field(default_factory=lambda: ["staff"]) install_profiles: list[InstallProfile] = Field(default_factory=lambda: ["windows_local"]) @@ -248,8 +248,8 @@ class ModuleRegistryState(BaseModel): model_config = ConfigDict(extra="forbid") profile: InstallProfile = "windows_local" - civiccore_version: str = Field(min_length=1) - civiccore_locked: bool = True + townlight_core_version: str = Field(min_length=1) + townlight_core_locked: bool = True entries: list[ModuleRegistryEntry] @property @@ -278,7 +278,7 @@ def validate_windows_local_manifest(manifest: ModuleManifest | dict[str, Any]) - def build_module_registry( manifests: list[ModuleManifest | dict[str, Any]], *, - civiccore_version: str, + townlight_core_version: str, selected_module_ids: set[str] | None = None, profile: InstallProfile = "windows_local", ) -> ModuleRegistryState: @@ -301,10 +301,10 @@ def build_module_registry( if unknown: raise ValueError(f"selected modules are not installed: {sorted(unknown)}") - core_version = Version(civiccore_version) + core_version = Version(townlight_core_version) for manifest in parsed: Version(manifest.version) - Version(manifest.civiccore_min_version) + Version(manifest.townlight_core_min_version) for dependency in manifest.dependencies: if dependency.min_version: Version(dependency.min_version) @@ -323,8 +323,8 @@ def resolve(module_id: str) -> ModuleRegistryEntry: status: ModuleRegistryStatus = "enabled" if enabled else "disabled" if profile not in manifest.install_profiles: reason = f"{manifest.name} is not available for the {profile} profile." - elif enabled and core_version < Version(manifest.civiccore_min_version): - reason = f"Requires Core {manifest.civiccore_min_version} or newer." + elif enabled and core_version < Version(manifest.townlight_core_min_version): + reason = f"Requires Core {manifest.townlight_core_min_version} or newer." elif enabled: visiting.add(module_id) try: @@ -365,8 +365,8 @@ def resolve(module_id: str) -> ModuleRegistryEntry: return ModuleRegistryState( profile=profile, - civiccore_version=civiccore_version, - civiccore_locked=True, + townlight_core_version=townlight_core_version, + townlight_core_locked=True, entries=sorted(entries, key=lambda entry: entry.module_id), ) diff --git a/civiccore/platform/runtime.py b/townlight_core/platform/runtime.py similarity index 96% rename from civiccore/platform/runtime.py rename to townlight_core/platform/runtime.py index 24d7dfd..705ac42 100644 --- a/civiccore/platform/runtime.py +++ b/townlight_core/platform/runtime.py @@ -8,7 +8,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator -from civiccore.platform.modules import ModuleRegistryState +from townlight_core.platform.modules import ModuleRegistryState RuntimeAction = Literal[ "install", diff --git a/civiccore/platform/task_queue.py b/townlight_core/platform/task_queue.py similarity index 98% rename from civiccore/platform/task_queue.py rename to townlight_core/platform/task_queue.py index 21b3141..2b659df 100644 --- a/civiccore/platform/task_queue.py +++ b/townlight_core/platform/task_queue.py @@ -14,8 +14,8 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import Mapped, mapped_column -from civiccore.db import Base -from civiccore.platform.tasks import ( +from townlight_core.db import Base +from townlight_core.platform.tasks import ( LocalTaskEnvelope, TaskRetryPolicy, record_task_attempt, @@ -27,7 +27,7 @@ class LocalTask(Base): """Durable local task row used by the Windows local runtime.""" - __tablename__ = "civiccore_local_tasks" + __tablename__ = "townlight_core_local_tasks" task_id: Mapped[str] = mapped_column(String(128), primary_key=True) module_id: Mapped[str] = mapped_column(String(64), index=True) diff --git a/civiccore/platform/tasks.py b/townlight_core/platform/tasks.py similarity index 98% rename from civiccore/platform/tasks.py rename to townlight_core/platform/tasks.py index d9d794f..b5d84b5 100644 --- a/civiccore/platform/tasks.py +++ b/townlight_core/platform/tasks.py @@ -27,7 +27,7 @@ class LocalTaskEnvelope(BaseModel): model_config = ConfigDict(extra="forbid") task_id: str = Field(min_length=1) - module_id: str = Field(pattern=r"^[a-z][a-z0-9-]{1,63}$") + module_id: str = Field(pattern=r"^[a-z][a-z0-9_-]{1,63}$") task_type: str = Field(min_length=1) status: TaskStatus = "queued" payload: dict[str, Any] = Field(default_factory=dict) diff --git a/civiccore/provenance/__init__.py b/townlight_core/provenance/__init__.py similarity index 100% rename from civiccore/provenance/__init__.py rename to townlight_core/provenance/__init__.py diff --git a/civiccore/provenance/contracts.py b/townlight_core/provenance/contracts.py similarity index 100% rename from civiccore/provenance/contracts.py rename to townlight_core/provenance/contracts.py diff --git a/civiccore/release_provenance.py b/townlight_core/release_provenance.py similarity index 99% rename from civiccore/release_provenance.py rename to townlight_core/release_provenance.py index 73e1736..db13139 100644 --- a/civiccore/release_provenance.py +++ b/townlight_core/release_provenance.py @@ -56,7 +56,7 @@ def _gh_api(self, path: str) -> dict[str, Any]: url = f"https://api.github.com/{path}" headers = { "Accept": "application/vnd.github+json", - "User-Agent": "civiccore-release-provenance", + "User-Agent": "townlight_core-release-provenance", "X-GitHub-Api-Version": "2022-11-28", } token = os.environ.get("GH_TOKEN") or os.environ.get("GITHUB_TOKEN") @@ -538,7 +538,7 @@ def main(argv: list[str] | None = None) -> int: parser.add_argument("tag_name", nargs="?", help="Release tag to verify, for example v0.22.0.") parser.add_argument( "--repo", - default="CivicSuite/civiccore", + default="Townlight/townlight_core", help="GitHub repository in OWNER/REPO form.", ) parser.add_argument( diff --git a/civiccore/scaffold/__init__.py b/townlight_core/scaffold/__init__.py similarity index 90% rename from civiccore/scaffold/__init__.py rename to townlight_core/scaffold/__init__.py index b805e91..da2e51f 100644 --- a/civiccore/scaffold/__init__.py +++ b/townlight_core/scaffold/__init__.py @@ -14,8 +14,8 @@ from __future__ import annotations -from civiccore.scaffold.cli import main as main -from civiccore.scaffold.project import ( +from townlight_core.scaffold.cli import main as main +from townlight_core.scaffold.project import ( GENERATOR_VERSION, GenerationResult, PlannedFile, @@ -23,7 +23,7 @@ generate_module_project, plan_module_project, ) -from civiccore.scaffold.spec import ( +from townlight_core.scaffold.spec import ( InvalidModuleSpecError, ModuleSpec, PathContainmentError, diff --git a/civiccore/scaffold/__main__.py b/townlight_core/scaffold/__main__.py similarity index 59% rename from civiccore/scaffold/__main__.py rename to townlight_core/scaffold/__main__.py index f019eaa..65a512a 100644 --- a/civiccore/scaffold/__main__.py +++ b/townlight_core/scaffold/__main__.py @@ -1,9 +1,9 @@ # SPDX-License-Identifier: AGPL-3.0-only -"""``python -m civiccore.scaffold`` → ``civiccore.scaffold.cli.main``.""" +"""``python -m townlight_core.scaffold`` → ``townlight_core.scaffold.cli.main``.""" from __future__ import annotations -from civiccore.scaffold.cli import main +from townlight_core.scaffold.cli import main if __name__ == "__main__": # pragma: no cover - exercised through subprocess smoke raise SystemExit(main()) diff --git a/civiccore/scaffold/cli.py b/townlight_core/scaffold/cli.py similarity index 91% rename from civiccore/scaffold/cli.py rename to townlight_core/scaffold/cli.py index 63254a1..122e5dd 100644 --- a/civiccore/scaffold/cli.py +++ b/townlight_core/scaffold/cli.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: AGPL-3.0-only """Command-line entry point for generating one Townlight module project. -``python -m civiccore.scaffold generate ...`` writes a complete module skeleton +``python -m townlight_core.scaffold generate ...`` writes a complete module skeleton (manifest, package, staff app, own migrations, contract tests, docs). It never overwrites, never installs, never runs a network call, and never emits a credential: the generated app fails closed until the operator sets its token map. @@ -17,12 +17,12 @@ from pydantic import ValidationError -from civiccore.scaffold.project import ( +from townlight_core.scaffold.project import ( ProjectPlan, generate_module_project, plan_module_project, ) -from civiccore.scaffold.spec import ( +from townlight_core.scaffold.spec import ( ModuleSpec, ScaffoldError, ScaffoldOptions, @@ -34,7 +34,7 @@ def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( - prog="python -m civiccore.scaffold", + prog="python -m townlight_core.scaffold", description="Generate one Townlight module project (no install, no network).", ) subcommands = parser.add_subparsers(dest="command", required=True) @@ -45,9 +45,9 @@ def build_parser() -> argparse.ArgumentParser: generate.add_argument("--description", required=True, help="One-line module description.") generate.add_argument("--version", default="0.1.0", help="Module version (PEP 440).") generate.add_argument( - "--civiccore-min-version", + "--townlight_core-min-version", default="1.3.0.dev1", - help="Minimum CivicCore version the module declares.", + help="Minimum TownlightCore version the module declares.", ) generate.add_argument("--permission-key", default=None, help="Permission key (slug).") generate.add_argument( @@ -71,7 +71,7 @@ def build_parser() -> argparse.ArgumentParser: plan.add_argument("--name", required=True) plan.add_argument("--description", required=True) plan.add_argument("--version", default="0.1.0") - plan.add_argument("--civiccore-min-version", default="1.3.0.dev1") + plan.add_argument("--townlight_core-min-version", default="1.3.0.dev1") plan.add_argument("--permission-key", default=None) plan.add_argument("--staff-role", action="append", default=None) plan.add_argument("--route-path", default=None) @@ -84,7 +84,7 @@ def _spec_from_args(args: argparse.Namespace) -> ModuleSpec: "name": args.name, "description": args.description, "version": args.version, - "civiccore_min_version": args.civiccore_min_version, + "townlight_core_min_version": args.townlight_core_min_version, } if args.permission_key: payload["permission_key"] = args.permission_key diff --git a/civiccore/scaffold/project.py b/townlight_core/scaffold/project.py similarity index 94% rename from civiccore/scaffold/project.py rename to townlight_core/scaffold/project.py index 87fbf22..da18a32 100644 --- a/civiccore/scaffold/project.py +++ b/townlight_core/scaffold/project.py @@ -16,7 +16,7 @@ from dataclasses import dataclass, field from pathlib import Path, PurePosixPath, PureWindowsPath -from civiccore.scaffold.spec import ( +from townlight_core.scaffold.spec import ( InvalidModuleSpecError, ModuleSpec, PathContainmentError, @@ -64,7 +64,7 @@ class GenerationResult: def _manifest_payload(spec: ModuleSpec) -> dict[str, object]: """The exact manifest the generated project ships as data. - Shaped to validate through the shipped ``civiccore.platform.ModuleManifest`` + Shaped to validate through the shipped ``townlight_core.platform.ModuleManifest`` and its Windows-local profile check; the generator asserts that before it returns a plan, so a template drift cannot silently produce an invalid module. @@ -75,11 +75,11 @@ def _manifest_payload(spec: ModuleSpec) -> dict[str, object]: "name": spec.name, "version": spec.version, "package_name": spec.package_name, - "civiccore_min_version": spec.civiccore_min_version, + "townlight_core_min_version": spec.townlight_core_min_version, "enabled_by_default": False, "surfaces": ["staff"], "install_profiles": ["windows_local", "developer"], - "dependencies": [{"module_id": "civiccore", "required": False}], + "dependencies": [{"module_id": "townlight_core", "required": False}], "routes": [ { "id": "home", @@ -113,7 +113,7 @@ def _manifest_payload(spec: ModuleSpec) -> dict[str, object]: "runtime_requirements": [], "settings_schema_version": None, "metadata": { - "generated_by": f"civiccore.scaffold {GENERATOR_VERSION}", + "generated_by": f"townlight_core.scaffold {GENERATOR_VERSION}", "license": "AGPL-3.0-only", }, } @@ -131,7 +131,7 @@ def _manifest_payload(spec: ModuleSpec) -> dict[str, object]: requires-python = ">=3.11" license = "AGPL-3.0-only" dependencies = [ - "civiccore>={civiccore_min_version}", + "townlight_core>={townlight_core_min_version}", ] [project.optional-dependencies] @@ -146,14 +146,14 @@ def _manifest_payload(spec: ModuleSpec) -> dict[str, object]: """ _INIT = '''{spdx} -"""{name} — a Townlight module generated by ``civiccore.scaffold``. +"""{name} — a Townlight module generated by ``townlight_core.scaffold``. The module owns its business permissions, tables and workflow. Core owns the shared platform contracts this module imports; the module does not reach into Core's internals, and Core does not know this module exists until its manifest is registered. -Generated from CivicCore {generator_version}. SPDX: AGPL-3.0-only. +Generated from TownlightCore {generator_version}. SPDX: AGPL-3.0-only. """ from __future__ import annotations @@ -172,7 +172,7 @@ def _manifest_payload(spec: ModuleSpec) -> dict[str, object]: import json from importlib import resources -from civiccore.platform.modules import ModuleManifest, validate_windows_local_manifest +from townlight_core.platform.modules import ModuleManifest, validate_windows_local_manifest MANIFEST_RESOURCE = "manifest.json" @@ -199,7 +199,7 @@ def load_manifest() -> ModuleManifest: from fastapi import Depends, FastAPI from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer -from civiccore.auth import AuthenticatedPrincipal, authorize_bearer_roles +from townlight_core.auth import AuthenticatedPrincipal, authorize_bearer_roles from {package_name}.manifest import load_manifest @@ -255,7 +255,7 @@ def home( """Alembic environment for the {name} module schema. The generated project deliberately does not own Core's migration chain: Core is -applied by ``civiccore.migrations.runner.upgrade_to_head`` as a separate, +applied by ``townlight_core.migrations.runner.upgrade_to_head`` as a separate, version-pinned step. This chain only creates the module's own schema, so a module migration cannot alter or drop Core tables. """ @@ -410,7 +410,7 @@ def test_staff_route_admits_configured_role(monkeypatch: pytest.MonkeyPatch) -> _DOCS = """ # {name} -Generated by `civiccore.scaffold` {generator_version} from CivicCore source. This is a +Generated by `townlight_core.scaffold` {generator_version} from TownlightCore source. This is a minimal working module, not a finished product. | Item | Value | @@ -443,21 +443,21 @@ def test_staff_route_admits_configured_role(monkeypatch: pytest.MonkeyPatch) -> ## Database -Run Core's migrations first (`civiccore.migrations.runner.upgrade_to_head`), then +Run Core's migrations first (`townlight_core.migrations.runner.upgrade_to_head`), then this module's own chain from `migrations/` with `DATABASE_URL` set. The module owns schema `{package_name}` only; Core tables are never touched. ## License -Source: AGPL-3.0-only. Documentation in this project: AGPL-3.0-only. CivicCore's -historical CC BY 4.0 documentation and third-party notices remain with CivicCore; +Source: AGPL-3.0-only. Documentation in this project: AGPL-3.0-only. TownlightCore's +historical CC BY 4.0 documentation and third-party notices remain with TownlightCore; nothing here relicenses them. """ _README = """ # {name} -A Townlight module skeleton generated by `civiccore.scaffold` {generator_version}. +A Townlight module skeleton generated by `townlight_core.scaffold` {generator_version}. See [docs/module.md](docs/module.md) for the contract, auth and migration rules. * License: AGPL-3.0-only. @@ -489,7 +489,7 @@ def plan_module_project(spec: ModuleSpec) -> ProjectPlan: "name": spec.name, "description": spec.description, "version": spec.version, - "civiccore_min_version": spec.civiccore_min_version, + "townlight_core_min_version": spec.townlight_core_min_version, "permission": spec.permission, "route": spec.route, "token_roles_env_var": spec.token_roles_env_var, @@ -547,7 +547,7 @@ def plan_module_project(spec: ModuleSpec) -> ProjectPlan: def _assert_manifest_valid(spec: ModuleSpec) -> None: - from civiccore.platform.modules import ModuleManifest, validate_windows_local_manifest + from townlight_core.platform.modules import ModuleManifest, validate_windows_local_manifest manifest = validate_windows_local_manifest(ModuleManifest.model_validate(_manifest_payload(spec))) if manifest.module_id != spec.module_id: # pragma: no cover - defensive diff --git a/civiccore/scaffold/spec.py b/townlight_core/scaffold/spec.py similarity index 95% rename from civiccore/scaffold/spec.py rename to townlight_core/scaffold/spec.py index 10d7128..b94d51d 100644 --- a/civiccore/scaffold/spec.py +++ b/townlight_core/scaffold/spec.py @@ -18,7 +18,7 @@ from packaging.version import InvalidVersion, Version from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator -from civiccore.platform.modules import MODULE_ID_PATTERN, SLUG_PATTERN +from townlight_core.platform.modules import MODULE_ID_PATTERN, SLUG_PATTERN ROUTE_PATH_PATTERN = r"^/[a-z0-9/_:-]*$" @@ -26,8 +26,8 @@ #: names, or with the reserved module ids Core already ships around. RESERVED_MODULE_IDS = frozenset( { - "civiccore", - "civicsuite", + "townlight_core", + "townlight", "tests", "test", "docs", @@ -76,7 +76,7 @@ class ModuleSpec(BaseModel): name: str = Field(min_length=1, max_length=120) description: str = Field(min_length=12, max_length=500) version: str = "0.1.0" - civiccore_min_version: str = "1.3.0.dev1" + townlight_core_min_version: str = "1.3.0.dev1" permission_key: str | None = Field(default=None, pattern=SLUG_PATTERN) staff_roles: tuple[str, ...] = ("staff",) route_path: str | None = Field(default=None, pattern=ROUTE_PATH_PATTERN) @@ -103,7 +103,7 @@ def validate_derived_identity(self) -> ModuleSpec: assert_admissible_module_id(self.module_id) for label, raw in ( ("version", self.version), - ("civiccore_min_version", self.civiccore_min_version), + ("townlight_core_min_version", self.townlight_core_min_version), ): try: Version(raw) @@ -150,7 +150,7 @@ def assert_admissible_module_id(module_id: str) -> str: ) package_name = module_id.replace("-", "_") if module_id in RESERVED_MODULE_IDS or package_name in RESERVED_MODULE_IDS: - raise InvalidModuleSpecError(f"module_id {module_id!r} is reserved by CivicCore") + raise InvalidModuleSpecError(f"module_id {module_id!r} is reserved by TownlightCore") if keyword.iskeyword(package_name): raise InvalidModuleSpecError(f"module_id {module_id!r} derives a Python keyword") if package_name in sys.stdlib_module_names: diff --git a/civiccore/scheduling/__init__.py b/townlight_core/scheduling/__init__.py similarity index 86% rename from civiccore/scheduling/__init__.py rename to townlight_core/scheduling/__init__.py index c921294..05d9dd7 100644 --- a/civiccore/scheduling/__init__.py +++ b/townlight_core/scheduling/__init__.py @@ -1,6 +1,6 @@ """Shared schedule validation helpers for Townlight background jobs.""" -from civiccore.scheduling.cron import ( +from townlight_core.scheduling.cron import ( UTC, compute_next_sync_at, min_interval_minutes, diff --git a/civiccore/scheduling/cron.py b/townlight_core/scheduling/cron.py similarity index 100% rename from civiccore/scheduling/cron.py rename to townlight_core/scheduling/cron.py diff --git a/civiccore/search/__init__.py b/townlight_core/search/__init__.py similarity index 100% rename from civiccore/search/__init__.py rename to townlight_core/search/__init__.py diff --git a/civiccore/security/__init__.py b/townlight_core/security/__init__.py similarity index 90% rename from civiccore/security/__init__.py rename to townlight_core/security/__init__.py index 6e5d83e..2d77777 100644 --- a/civiccore/security/__init__.py +++ b/townlight_core/security/__init__.py @@ -1,6 +1,6 @@ """Shared security primitives extracted for Townlight modules.""" -from civiccore.security.at_rest import ( +from townlight_core.security.at_rest import ( AtRestDecryptionError, ENVELOPE_VERSION, build_fernet, @@ -8,7 +8,7 @@ encrypt_json, is_encrypted, ) -from civiccore.security.host_validation import ( +from townlight_core.security.host_validation import ( BLOCK_REASON, BLOCKED_HOSTNAMES, BLOCKED_NETWORKS, @@ -21,7 +21,7 @@ validate_odbc_connection_string, validate_url_host, ) -from civiccore.security.config_validation import ( +from townlight_core.security.config_validation import ( ConfigValidationError, DEFAULT_INSECURE_FERNET_KEY_VALUES, DEFAULT_INSECURE_PASSWORD_VALUES, diff --git a/civiccore/security/at_rest.py b/townlight_core/security/at_rest.py similarity index 100% rename from civiccore/security/at_rest.py rename to townlight_core/security/at_rest.py diff --git a/civiccore/security/config_validation.py b/townlight_core/security/config_validation.py similarity index 100% rename from civiccore/security/config_validation.py rename to townlight_core/security/config_validation.py diff --git a/civiccore/security/host_validation.py b/townlight_core/security/host_validation.py similarity index 100% rename from civiccore/security/host_validation.py rename to townlight_core/security/host_validation.py diff --git a/civiccore/tasks/__init__.py b/townlight_core/tasks/__init__.py similarity index 84% rename from civiccore/tasks/__init__.py rename to townlight_core/tasks/__init__.py index 65e268a..bf5c11c 100644 --- a/civiccore/tasks/__init__.py +++ b/townlight_core/tasks/__init__.py @@ -2,7 +2,7 @@ from __future__ import annotations -from civiccore.tasks.artifacts import ( +from townlight_core.tasks.artifacts import ( ArtifactProposal, ArtifactRefused, ArtifactStore, @@ -16,7 +16,7 @@ resolve_inside_root, verify_artifact_file, ) -from civiccore.tasks.registry import get_task_handlers, register_task_handler +from townlight_core.tasks.registry import get_task_handlers, register_task_handler __all__ = [ "ArtifactProposal", diff --git a/civiccore/tasks/artifacts.py b/townlight_core/tasks/artifacts.py similarity index 97% rename from civiccore/tasks/artifacts.py rename to townlight_core/tasks/artifacts.py index 76ecf6d..7683748 100644 --- a/civiccore/tasks/artifacts.py +++ b/townlight_core/tasks/artifacts.py @@ -8,7 +8,7 @@ are copied from the *claimed envelope* the worker received, never from a request body, filename, environment variable or model output. * The claim must still be current when the acceptance record is written: the write path - calls :func:`civiccore.platform.task_queue.require_active_claim`, which locks the task + calls :func:`townlight_core.platform.task_queue.require_active_claim`, which locks the task row and refuses a cancelled, expired or superseded claim (``StaleTaskClaim``). A stale worker therefore cannot publish an artifact, and it cannot overwrite the new owner's state. @@ -24,8 +24,8 @@ refused. This module is an adapter, not a second job engine: it reuses the shipped -``civiccore_local_tasks`` claim/lease contract and adds exactly one append-only acceptance -table (``civiccore_job_artifacts``). It performs no transcription, OCR, transcoding, +``townlight_core_local_tasks`` claim/lease contract and adds exactly one append-only acceptance +table (``townlight_core_job_artifacts``). It performs no transcription, OCR, transcoding, embedding or provider call, and it claims none. A handler owns its own native subprocess containment; this adapter only refuses to make an unowned or unverified file durable. @@ -50,8 +50,8 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import Mapped, mapped_column -from civiccore.db import Base -from civiccore.platform.task_queue import LocalTaskEnvelope, require_active_claim +from townlight_core.db import Base +from townlight_core.platform.task_queue import LocalTaskEnvelope, require_active_claim #: Hard cap on one accepted artifact. Derivatives and documents only; a handler that needs #: to keep a larger original must record its own storage receipt instead of using this path. @@ -96,7 +96,7 @@ def __init__(self, reason: str, detail: str = "") -> None: class JobArtifact(Base): """Append-only acceptance record for one artifact produced by one claimed job.""" - __tablename__ = "civiccore_job_artifacts" + __tablename__ = "townlight_core_job_artifacts" artifact_id: Mapped[str] = mapped_column(String(64), primary_key=True) task_id: Mapped[str] = mapped_column(String(128), index=True) diff --git a/civiccore/tasks/leased.py b/townlight_core/tasks/leased.py similarity index 96% rename from civiccore/tasks/leased.py rename to townlight_core/tasks/leased.py index b1e5c93..45244af 100644 --- a/civiccore/tasks/leased.py +++ b/townlight_core/tasks/leased.py @@ -9,14 +9,14 @@ import asyncio import contextlib import inspect -from civiccore.platform.task_queue import ( +from townlight_core.platform.task_queue import ( claim_next_local_task, complete_local_task, fail_local_task, renew_local_task, StaleTaskClaim, ) -from civiccore.platform.tasks import TaskRetryPolicy +from townlight_core.platform.tasks import TaskRetryPolicy async def run_leased_task( diff --git a/civiccore/tasks/registry.py b/townlight_core/tasks/registry.py similarity index 92% rename from civiccore/tasks/registry.py rename to townlight_core/tasks/registry.py index 6b21b7f..d7ff91b 100644 --- a/civiccore/tasks/registry.py +++ b/townlight_core/tasks/registry.py @@ -4,7 +4,7 @@ from collections.abc import Callable -from civiccore.platform.task_queue import TaskHandler +from townlight_core.platform.task_queue import TaskHandler _HANDLERS: dict[str, TaskHandler] = {} diff --git a/civiccore/tasks/worker.py b/townlight_core/tasks/worker.py similarity index 88% rename from civiccore/tasks/worker.py rename to townlight_core/tasks/worker.py index 864a64b..05739a9 100644 --- a/civiccore/tasks/worker.py +++ b/townlight_core/tasks/worker.py @@ -10,9 +10,9 @@ from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine -from civiccore.tasks.leased import run_leased_task -from civiccore.platform.tasks import TaskRetryPolicy -from civiccore.tasks.registry import get_task_handlers +from townlight_core.tasks.leased import run_leased_task +from townlight_core.platform.tasks import TaskRetryPolicy +from townlight_core.tasks.registry import get_task_handlers def _async_database_url(url: str) -> str: @@ -33,8 +33,8 @@ def _load_handler_modules(raw_modules: str | None) -> None: async def _run_worker(args: argparse.Namespace) -> int: database_url = os.environ.get("DATABASE_URL") if not database_url: - raise RuntimeError("DATABASE_URL is required for civiccore.tasks.worker") - _load_handler_modules(os.environ.get("CIVICCORE_TASK_HANDLER_MODULES")) + raise RuntimeError("DATABASE_URL is required for townlight_core.tasks.worker") + _load_handler_modules(os.environ.get("TOWNLIGHT_CORE_TASK_HANDLER_MODULES")) handlers = get_task_handlers() engine = create_async_engine(_async_database_url(database_url)) diff --git a/civiccore/testing/__init__.py b/townlight_core/testing/__init__.py similarity index 97% rename from civiccore/testing/__init__.py rename to townlight_core/testing/__init__.py index 904db40..8c6c0c4 100644 --- a/civiccore/testing/__init__.py +++ b/townlight_core/testing/__init__.py @@ -1,6 +1,6 @@ """Reusable test contracts for Townlight modules.""" -from civiccore.testing.mock_city import ( +from townlight_core.testing.mock_city import ( DEMO_TOWN_CONTRACT_SCHEMA_VERSION, DEMO_TOWN_DEFAULT_SEED, DEMO_TOWN_FIXTURE_ID, diff --git a/civiccore/testing/mock_city.py b/townlight_core/testing/mock_city.py similarity index 98% rename from civiccore/testing/mock_city.py rename to townlight_core/testing/mock_city.py index 7ecfc71..f2d1b47 100644 --- a/civiccore/testing/mock_city.py +++ b/townlight_core/testing/mock_city.py @@ -13,8 +13,8 @@ import jwt from cryptography.hazmat.primitives.asymmetric import rsa -from civiccore.connectors.delta import plan_vendor_delta_request -from civiccore.connectors.imports import SUPPORTED_CONNECTORS, import_meeting_payload +from townlight_core.connectors.delta import plan_vendor_delta_request +from townlight_core.connectors.imports import SUPPORTED_CONNECTORS, import_meeting_payload MOCK_CITY_NAME = "City of Brookfield" MOCK_CITY_CHANGED_SINCE = datetime(2026, 5, 1, 12, 0, tzinfo=UTC) @@ -26,7 +26,7 @@ } DEMO_TOWN_CONTRACT_SCHEMA_VERSION = "1.0.0" -DEMO_TOWN_FIXTURE_VERSION = "1.0.0" +DEMO_TOWN_FIXTURE_VERSION = "1.0.1" DEMO_TOWN_FIXTURE_ID = "redstone-valley-records-demo" DEMO_TOWN_NAME = "Town of Redstone Valley (Fictional)" # The v1 generator is intentionally static, not pseudo-random. This value is a @@ -37,7 +37,7 @@ DEMO_TOWN_WATERMARK = "SYNTHETIC DEMONSTRATION DATA - NOT A REAL MUNICIPAL RECORD" DEMO_TOWN_PROVENANCE_MODES = ("fully-synthetic",) DEMO_TOWN_GENERATION_MODE = "static-canonical-v1" -DEMO_TOWN_FIXTURE_SHA256_V1 = "a9c242a3f2618a69d7effb1d0d17d2df06f6744c8c351bba4065d315c94575b4" +DEMO_TOWN_FIXTURE_SHA256_V1 = "d9aaa79403cfca2711e8031439fbab8bf9f70a20b8afc293faef8edd683ffbd6" DEMO_TOWN_WORKFLOW_STATUSES = ( "received", "assigned", @@ -282,7 +282,7 @@ def public_dict(self) -> dict[str, Any]: "deterministic_seed": self.deterministic_seed, "generation_mode": DEMO_TOWN_GENERATION_MODE, "generated_at": self.generated_at, - "generator": "civiccore.testing.mock_city", + "generator": "townlight_core.testing.mock_city", "municipality": dict(self.municipality), "synthetic": True, "watermark": DEMO_TOWN_WATERMARK, @@ -533,7 +533,7 @@ def validate_demo_town_fixture(fixture: dict[str, Any]) -> tuple[str, ...]: "deterministic_seed": DEMO_TOWN_DEFAULT_SEED, "generation_mode": DEMO_TOWN_GENERATION_MODE, "generated_at": DEMO_TOWN_GENERATED_AT, - "generator": "civiccore.testing.mock_city", + "generator": "townlight_core.testing.mock_city", "synthetic": True, "watermark": DEMO_TOWN_WATERMARK, "network_calls": False, @@ -910,7 +910,7 @@ def mock_city_vendor_contracts() -> list[MockCityVendorContract]: }, notes=( "Public marketing confirms Granicus meeting-management products, but customer API details are account-gated. " - "This fixture tests CivicSuite's normalized contract until city credentials provide a concrete endpoint." + "This fixture tests Townlight's normalized contract until city credentials provide a concrete endpoint." ), ), MockCityVendorContract( @@ -959,19 +959,19 @@ def mock_city_idp_contract() -> MockCityIdpContract: provider="Brookfield Entra ID", interface_status="mock-municipal-idp", issuer="https://login.mock-city.example.gov/brookfield/v2.0", - audience="api://civicsuite-staff", + audience="api://townlight-staff", authorization_url="https://login.mock-city.example.gov/brookfield/oauth2/v2.0/authorize", token_url="https://login.mock-city.example.gov/brookfield/oauth2/v2.0/token", jwks_path="/brookfield/discovery/v2.0/keys", role_claims=("roles", "groups"), algorithms=("RS256",), - client_id="civicsuite-staff-dashboard", + client_id="townlight-staff-dashboard", redirect_uri="https://module.mock-city.example.gov/staff/oidc/callback", staff_subject="brookfield-clerk-001", staff_email="clerk@brookfield.example.gov", staff_roles=("clerk_admin", "meeting_editor"), notes=( - "Models the authorization-code + PKCE and JWKS/token contract CivicSuite modules " + "Models the authorization-code + PKCE and JWKS/token contract Townlight modules " "must satisfy before replacing mock evidence with a real municipal tenant." ), ) @@ -1002,13 +1002,13 @@ def mock_city_backup_retention_contract() -> MockCityBackupRetentionContract: ), retention_years=7, restore_test_interval_days=30, - off_host_storage="mock://brookfield-secure-vault/civicsuite", + off_host_storage="mock://brookfield-secure-vault/townlight", encryption_at_rest_required=True, immutable_retention_required=True, legal_hold_supported=True, approval_artifact="mock-brookfield-backup-retention-policy-2026-05", notes=( - "Models the policy evidence CivicSuite modules must provide before replacing " + "Models the policy evidence Townlight modules must provide before replacing " "mock proof with a city-approved retention schedule and off-host storage runbook." ), ) diff --git a/civiccore/verification/__init__.py b/townlight_core/verification/__init__.py similarity index 86% rename from civiccore/verification/__init__.py rename to townlight_core/verification/__init__.py index 468f431..32ebb81 100644 --- a/civiccore/verification/__init__.py +++ b/townlight_core/verification/__init__.py @@ -1,6 +1,6 @@ """Verification helpers for Townlight release and runtime evidence.""" -from civiccore.verification.browser_evidence import ( +from townlight_core.verification.browser_evidence import ( DEFAULT_MIN_SCREENSHOT_BYTES, BrowserReleaseEvidenceResult, normalized_text_sha256, diff --git a/civiccore/verification/browser_evidence.py b/townlight_core/verification/browser_evidence.py similarity index 100% rename from civiccore/verification/browser_evidence.py rename to townlight_core/verification/browser_evidence.py