Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## [0.2.2] - 2026-05-23

- Narrow truth-repair release. No functional upgrade.
- Exists solely to supersede the false v1.0.0 release from 2026-05-21 in
GitHub's Latest impression.
- CivicCore pin unchanged.

## [0.2.0] - 2026-05-10

- Demoted the false v1.0.0 release label after the external CivicSuite audit found this module is a recovery/foundation module, not a canonical spec-complete v1 product.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

CivicZone is CivicSuite's parcel-aware zoning and land-use Q&A module.

Current state: **v0.2.1 corrective demotion state - scaffold with partial persistence/workflow plumbing; no real AI layer, full frontend, real municipal data/search, or public-use gate. The previous v1.0.0 release was published in error and is superseded by this honest sub-1.0.0 label.**. This repo contains a FastAPI service, health/root endpoints, documentation gates, canonical zoning schema models, Alembic migrations, deterministic parcel/zone lookup, cited use-rule lookup, cited dimensional-rule prechecks, resident Q&A with refusal and escalation rules, optional database-backed parcel/rule, resident-question ledger, and staff-workflow records through `CIVICZONE_PARCEL_RULE_DB_URL`, staff-only precedent protection, a browser-usable resident UI at `/civiczone`, a staff workflow shell at `/civiczone/staff`, adversarial local integration mocks, trusted-proxy staff access validation, and CivicCore v1.1.0 release-wheel dependency alignment. See [docs/release-recovery-status.md](docs/release-recovery-status.md) for historical recovery context and current release evidence.
Current state: **v0.2.2 corrective demotion state - scaffold with partial persistence/workflow plumbing; no real AI layer, full frontend, real municipal data/search, or public-use gate. This narrow truth-repair release is no functional upgrade; it exists solely to supersede the false v1.0.0 release from 2026-05-21 in GitHub's Latest impression. The CivicCore pin is unchanged.**. This repo contains a FastAPI service, health/root endpoints, documentation gates, canonical zoning schema models, Alembic migrations, deterministic parcel/zone lookup, cited use-rule lookup, cited dimensional-rule prechecks, resident Q&A with refusal and escalation rules, optional database-backed parcel/rule, resident-question ledger, and staff-workflow records through `CIVICZONE_PARCEL_RULE_DB_URL`, staff-only precedent protection, a browser-usable resident UI at `/civiczone`, a staff workflow shell at `/civiczone/staff`, adversarial local integration mocks, trusted-proxy staff access validation, and CivicCore v1.1.0 release-wheel dependency alignment. See [docs/release-recovery-status.md](docs/release-recovery-status.md) for historical recovery context and current release evidence.

## Product Boundaries

Expand Down
2 changes: 1 addition & 1 deletion README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ CivicZone

CivicZone is CivicSuite's parcel-aware zoning and land-use Q&A module.

Current state: CivicZone v0.2.1 corrective demotion state. This repo contains a FastAPI service, health/root endpoints, documentation gates, canonical zoning schema models, Alembic migrations, deterministic parcel/zone lookup, cited use-rule lookup, cited dimensional-rule prechecks, resident Q&A with refusal and escalation rules, optional database-backed parcel/rule, resident-question ledger, and staff-workflow records through CIVICZONE_PARCEL_RULE_DB_URL, staff-only precedent protection, a browser-usable resident UI at /civiczone, a staff workflow shell at /civiczone/staff, adversarial local integration mocks, trusted-proxy staff access validation, and CivicCore v1.1.0 release-wheel dependency alignment. See docs/release-recovery-status.md for historical recovery context and current release evidence.
Current state: CivicZone v0.2.2 corrective demotion state. This narrow truth-repair release is no functional upgrade; it exists solely to supersede the false v1.0.0 release from 2026-05-21 in GitHub's Latest impression, with the CivicCore pin unchanged. This repo contains a FastAPI service, health/root endpoints, documentation gates, canonical zoning schema models, Alembic migrations, deterministic parcel/zone lookup, cited use-rule lookup, cited dimensional-rule prechecks, resident Q&A with refusal and escalation rules, optional database-backed parcel/rule, resident-question ledger, and staff-workflow records through CIVICZONE_PARCEL_RULE_DB_URL, staff-only precedent protection, a browser-usable resident UI at /civiczone, a staff workflow shell at /civiczone/staff, adversarial local integration mocks, trusted-proxy staff access validation, and CivicCore v1.1.0 release-wheel dependency alignment. See docs/release-recovery-status.md for historical recovery context and current release evidence.

Product boundaries:

Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Security

CivicZone Current version: 0.2.1. The previous v1.0.0 release was published in error and does not prove public-use readiness. Deploy it only for local scaffold evaluation behind the city's trusted access layer, set `CIVICZONE_STAFF_TRUSTED_PROXY_CIDRS` for the reverse proxy allowed to inject staff headers, review local parcel/rule data with planning staff, and route official zoning determinations to municipal staff.
CivicZone Current version: 0.2.2. This is a narrow truth-repair release with no functional upgrade. The previous v1.0.0 release was published in error and does not prove public-use readiness. Deploy it only for local scaffold evaluation behind the city's trusted access layer, set `CIVICZONE_STAFF_TRUSTED_PROXY_CIDRS` for the reverse proxy allowed to inject staff headers, review local parcel/rule data with planning staff, and route official zoning determinations to municipal staff.

Report suspected vulnerabilities privately to the project maintainer. Do not open public issues containing exploit details, secrets, or sensitive municipal data.
4 changes: 2 additions & 2 deletions USER-MANUAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

CivicZone answers routine parcel-aware zoning questions with citations. It is not a zoning determination tool, not legal advice, and not a replacement for planner review.

Current state: CivicZone v0.2.1 corrective demotion state. The package, health endpoints, canonical zoning schema, Alembic migrations, parcel/zone lookup API, use and dimensional rule APIs, optional database-backed parcel/rule lookup records, resident question ledger records, staff workflow records, citation-grounded resident Q&A, staff-only precedent protection, local adversarial integration mocks, a browser-usable resident UI at `/civiczone`, a staff workflow shell at `/civiczone/staff`, trusted-proxy staff access validation, and CivicCore v1.1.0 release-wheel dependency alignment exist. CivicZone does not call live external systems by default, does not provide legal advice, and does not make official zoning determinations. See `docs/release-recovery-status.md` for historical recovery context and current release evidence.
Current state: CivicZone v0.2.2 corrective demotion state. This narrow truth-repair release is no functional upgrade; it exists solely to supersede the false v1.0.0 release from 2026-05-21 in GitHub's Latest impression, with the CivicCore pin unchanged. The package, health endpoints, canonical zoning schema, Alembic migrations, parcel/zone lookup API, use and dimensional rule APIs, optional database-backed parcel/rule lookup records, resident question ledger records, staff workflow records, citation-grounded resident Q&A, staff-only precedent protection, local adversarial integration mocks, a browser-usable resident UI at `/civiczone`, a staff workflow shell at `/civiczone/staff`, trusted-proxy staff access validation, and CivicCore v1.1.0 release-wheel dependency alignment exist. CivicZone does not call live external systems by default, does not provide legal advice, and does not make official zoning determinations. See `docs/release-recovery-status.md` for historical recovery context and current release evidence.

The resident UI shows a pre-filled parcel lookup for `123 Main St`, zone context, use and dimensional-rule cards, citation-grounded Q&A, visible loading/success/empty/error/partial state guidance, and planner-escalation guidance. It is informational only: it is not legal advice, not a zoning determination, and not a replacement for municipal planning staff.

Expand Down Expand Up @@ -55,7 +55,7 @@ bash scripts/verify-release.sh
flowchart LR
Resident["Resident or planner"] --> CivicZone["CivicZone"]
CivicZone --> CivicCore["CivicCore v1.1.0"]
CivicZone --> CivicCode["CivicCode v1.0.0+"]
CivicZone --> CivicCode["CivicCode released context"]
CivicZone --> LocalMocks["Adversarial local integration mocks"]
CivicZone -. configured .-> GIS["Local GIS / assessor datasets"]
```
Expand Down
4 changes: 2 additions & 2 deletions USER-MANUAL.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

CivicZone answers routine parcel-aware zoning questions with citations. It is not a zoning determination tool, not legal advice, and not a replacement for planner review.

Current state: CivicZone v0.2.1 corrective demotion state. The package, health endpoints, canonical zoning schema, Alembic migrations, parcel/zone lookup API, use and dimensional rule APIs, optional database-backed parcel/rule lookup records, resident question ledger records, staff workflow records, citation-grounded resident Q&A, staff-only precedent protection, local adversarial integration mocks, a browser-usable resident UI at /civiczone, a staff workflow shell at /civiczone/staff, trusted-proxy staff access validation, and CivicCore v1.1.0 release-wheel dependency alignment exist. CivicZone does not call live external systems by default, does not provide legal advice, and does not make official zoning determinations. See docs/release-recovery-status.md for historical recovery context and current release evidence.
Current state: CivicZone v0.2.2 corrective demotion state. This narrow truth-repair release is no functional upgrade; it exists solely to supersede the false v1.0.0 release from 2026-05-21 in GitHub's Latest impression, with the CivicCore pin unchanged. The package, health endpoints, canonical zoning schema, Alembic migrations, parcel/zone lookup API, use and dimensional rule APIs, optional database-backed parcel/rule lookup records, resident question ledger records, staff workflow records, citation-grounded resident Q&A, staff-only precedent protection, local adversarial integration mocks, a browser-usable resident UI at /civiczone, a staff workflow shell at /civiczone/staff, trusted-proxy staff access validation, and CivicCore v1.1.0 release-wheel dependency alignment exist. CivicZone does not call live external systems by default, does not provide legal advice, and does not make official zoning determinations. See docs/release-recovery-status.md for historical recovery context and current release evidence.

The resident UI shows a pre-filled parcel lookup for `123 Main St`, zone context, use and dimensional-rule cards, citation-grounded Q&A, visible loading/success/empty/error/partial state guidance, and planner-escalation guidance. It is informational only: it is not legal advice, not a zoning determination, and not a replacement for municipal planning staff.

Expand Down Expand Up @@ -55,7 +55,7 @@ bash scripts/verify-release.sh
flowchart LR
Resident["Resident or planner"] --> CivicZone["CivicZone"]
CivicZone --> CivicCore["CivicCore v1.1.0"]
CivicZone --> CivicCode["CivicCode v1.0.0+"]
CivicZone --> CivicCode["CivicCode released context"]
CivicZone --> LocalMocks["Adversarial local integration mocks"]
CivicZone -. configured .-> GIS["Local GIS / assessor datasets"]
```
Expand Down
2 changes: 1 addition & 1 deletion civiczone/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""CivicZone package."""

__version__ = "0.2.1"
__version__ = "0.2.2"
2 changes: 1 addition & 1 deletion civiczone/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def root() -> dict[str, str]:
"version": __version__,
"status": "v1 parcel-aware zoning Q&A runtime",
"message": (
"CivicZone v0.2.1 provides deterministic parcel lookup, cited use-rule lookup, cited dimensional prechecks, "
"CivicZone v0.2.2 provides deterministic parcel lookup, cited use-rule lookup, cited dimensional prechecks, "
"resident zoning Q&A with refusal and escalation rules, staff workflow APIs, optional database-backed parcel/rule and question-ledger records, "
"canonical zoning schema migrations, adversarial local integration mocks, an accessible resident UI, and a staff workflow UI shell. "
"It does not make zoning determinations, give legal advice, replace planner review, or call live external systems by default."
Expand Down
2 changes: 1 addition & 1 deletion civiczone/public_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ def render_public_lookup_page() -> str:
<h1>CivicZone resident lookup</h1>
<p class="lede">Parcel zoning context, cited use rules, dimensional standards, and escalation paths for residents. CivicZone provides information only; planning staff make official determinations.</p>
</div>
<span class="badge">v0.2.1 corrective demotion state</span>
<span class="badge">v0.2.2 corrective demotion state</span>
</header>
<main id="main" tabindex="-1">
<section class="panel workspace" aria-labelledby="lookup-title">
Expand Down
4 changes: 2 additions & 2 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ <h1>Zoning answers with citations, not guesses.</h1>
<p class="lede">CivicZone is the parcel-aware zoning and land-use module for CivicSuite. It helps residents and planners find routine zoning information while escalating actual determinations to staff.</p>

<section class="panel">
<span class="badge">v0.2.1 corrective demotion state</span>
<span class="badge">v0.2.2 corrective demotion state</span>
<h2>Current State</h2>
<p>CivicZone v0.2.1 includes the FastAPI service, root endpoint, health endpoint, documentation gates, canonical zoning schema, Alembic migrations, parcel/zone lookup API, use and dimensional rule APIs, optional database-backed parcel/rule lookup records, resident question ledger, staff workflow records via <code>CIVICZONE_PARCEL_RULE_DB_URL</code>, citation-grounded resident Q&amp;A, staff-only precedent protection, local adversarial integration mocks, browser-usable resident UI, staff workflow shell, trusted-proxy staff access validation, and CivicCore v1.1.0 dependency alignment. CivicZone does not make official zoning determinations, provide legal advice, or call live external vendor systems by default.</p>
<p>CivicZone v0.2.2 is a narrow truth-repair release with no functional upgrade. It exists solely to supersede the false v1.0.0 release from 2026-05-21 in GitHub's Latest impression; the CivicCore pin is unchanged. CivicZone includes the FastAPI service, root endpoint, health endpoint, documentation gates, canonical zoning schema, Alembic migrations, parcel/zone lookup API, use and dimensional rule APIs, optional database-backed parcel/rule lookup records, resident question ledger, staff workflow records via <code>CIVICZONE_PARCEL_RULE_DB_URL</code>, citation-grounded resident Q&amp;A, staff-only precedent protection, local adversarial integration mocks, browser-usable resident UI, staff workflow shell, trusted-proxy staff access validation, and CivicCore v1.1.0 dependency alignment. CivicZone does not make official zoning determinations, provide legal advice, or call live external vendor systems by default.</p>
</section>

<section class="panel">
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "civiczone"
version = "0.2.1"
version = "0.2.2"
description = "CivicZone runtime foundation for parcel-aware zoning and land-use Q&A."
readme = "README.md"
requires-python = ">=3.11"
Expand Down
10 changes: 5 additions & 5 deletions scripts/verify-release.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail

VERSION="0.2.1"
VERSION="0.2.2"

find_python() {
local candidates=()
Expand Down Expand Up @@ -40,7 +40,7 @@ ${PYTHON_BIN} - <<'PY'
from pathlib import Path
import tomllib

version = "0.2.1"
version = "0.2.2"
root = Path(".")
pyproject = tomllib.loads((root / "pyproject.toml").read_text(encoding="utf-8"))
assert pyproject["project"]["version"] == version, pyproject["project"]["version"]
Expand All @@ -56,7 +56,7 @@ for path in [
"SECURITY.md",
]:
text = (root / path).read_text(encoding="utf-8")
assert "0.2.1" in text, f"missing release version in {path}"
assert "0.2.2" in text, f"missing release version in {path}"
assert "0.1.0.dev0" not in text, f"stale dev version in {path}"
print("PASS: version surfaces synchronized")
PY
Expand All @@ -81,8 +81,8 @@ from pathlib import Path
import hashlib

dist = Path("dist")
wheel = dist / "civiczone-0.2.1-py3-none-any.whl"
sdist = dist / "civiczone-0.2.1.tar.gz"
wheel = dist / "civiczone-0.2.2-py3-none-any.whl"
sdist = dist / "civiczone-0.2.2.tar.gz"
assert wheel.exists(), f"missing {wheel}"
assert sdist.exists(), f"missing {sdist}"
lines = []
Expand Down
2 changes: 1 addition & 1 deletion tests/test_milestone_7_public_ui_accessibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def test_public_ui_route_returns_accessible_html() -> None:
assert '<a class="skip-link" href="#main">Skip to main content</a>' in text
assert '<main id="main" tabindex="-1">' in text
assert "aria-live=\"polite\"" in text
assert "v0.2.1 corrective demotion state" in text
assert "v0.2.2 corrective demotion state" in text
assert '<button id="run" type="submit">Run lookup</button>' in text


Expand Down
8 changes: 4 additions & 4 deletions tests/test_runtime_foundation.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@


def test_package_version_is_100() -> None:
assert civiczone.__version__ == "0.2.1"
assert civiczone.__version__ == "0.2.2"


def test_pyproject_uses_published_civiccore_release_wheel() -> None:
Expand All @@ -33,7 +33,7 @@ def test_root_endpoint_states_runtime_boundary() -> None:
payload = response.json()

assert payload["name"] == "CivicZone"
assert payload["version"] == "0.2.1"
assert payload["version"] == "0.2.2"
assert payload["status"] == "v1 parcel-aware zoning Q&A runtime"
assert "optional database-backed parcel/rule" in payload["message"]
assert "staff workflow APIs" in payload["message"]
Expand All @@ -49,7 +49,7 @@ def test_health_endpoint_reports_versions() -> None:

assert payload["status"] == "ok"
assert payload["service"] == "civiczone"
assert payload["version"] == "0.2.1"
assert payload["version"] == "0.2.2"
assert payload["civiccore_version"] == "1.1.0"


Expand Down Expand Up @@ -82,5 +82,5 @@ def test_current_docs_mark_v1_label_as_recovered_without_product_release_overcla

for path, text in docs.items():
lowered = text.lower()
assert "0.2.1" in lowered, path
assert "0.2.2" in lowered, path
assert "provisional" not in lowered, path