diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5ced777..a720571 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,15 @@ The format follows Keep a Changelog, and this project follows Semantic Versionin
## [Unreleased]
+## [0.2.1] - 2026-05-21
+
+### Corrected
+
+- Corrected the false v1.0.0 release label after the independent CivicSuite release-integrity audit found CivicZone does not meet the Section 2 FINISHED and SHIPPING bar.
+- Set the honest current label to v0.2.1 and superseded the mistaken v1.0.0 posture without deleting the historical record.
+- Current classification: scaffold with partial persistence/workflow plumbing; no real AI layer, full frontend, real municipal data/search, or public-use gate.
+- CivicZone must not be described as finished, shipping, city-ready, product-ready, or public-use ready until a future independent audit signs off against the full Section 2 gate.
+
## [1.0.0] - 2026-05-21
### Release note
diff --git a/README.md b/README.md
index 782d9db..603e77a 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
CivicZone is CivicSuite's parcel-aware zoning and land-use Q&A module.
-Current state: **CivicZone v1.0.0 public-use module release**. 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.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.
## Product Boundaries
diff --git a/README.txt b/README.txt
index 21d9470..7fc89e2 100644
--- a/README.txt
+++ b/README.txt
@@ -3,7 +3,7 @@ CivicZone
CivicZone is CivicSuite's parcel-aware zoning and land-use Q&A module.
-Current state: CivicZone v1.0.0 public-use module release. 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.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.
Product boundaries:
diff --git a/SECURITY.md b/SECURITY.md
index 8108f2a..eebefeb 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,5 +1,5 @@
# Security
-CivicZone Current version: 1.0.0. Deploy it 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.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.
Report suspected vulnerabilities privately to the project maintainer. Do not open public issues containing exploit details, secrets, or sensitive municipal data.
diff --git a/USER-MANUAL.md b/USER-MANUAL.md
index 0def740..da12529 100644
--- a/USER-MANUAL.md
+++ b/USER-MANUAL.md
@@ -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 v1.0.0 public-use module release. 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.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.
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.
diff --git a/USER-MANUAL.txt b/USER-MANUAL.txt
index e410c11..261bd5d 100644
--- a/USER-MANUAL.txt
+++ b/USER-MANUAL.txt
@@ -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 v1.0.0 public-use module release. 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.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.
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.
diff --git a/civiczone/__init__.py b/civiczone/__init__.py
index 4f14a57..48fa1e9 100644
--- a/civiczone/__init__.py
+++ b/civiczone/__init__.py
@@ -1,3 +1,3 @@
"""CivicZone package."""
-__version__ = "1.0.0"
+__version__ = "0.2.1"
diff --git a/civiczone/main.py b/civiczone/main.py
index c2e0f7a..99da827 100644
--- a/civiczone/main.py
+++ b/civiczone/main.py
@@ -73,7 +73,7 @@ def root() -> dict[str, str]:
"version": __version__,
"status": "v1 parcel-aware zoning Q&A runtime",
"message": (
- "CivicZone v1.0.0 provides deterministic parcel lookup, cited use-rule lookup, cited dimensional prechecks, "
+ "CivicZone v0.2.1 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."
diff --git a/civiczone/public_ui.py b/civiczone/public_ui.py
index 4a22f42..696d166 100644
--- a/civiczone/public_ui.py
+++ b/civiczone/public_ui.py
@@ -208,7 +208,7 @@ def render_public_lookup_page() -> str:
CivicZone resident lookup
Parcel zoning context, cited use rules, dimensional standards, and escalation paths for residents. CivicZone provides information only; planning staff make official determinations.
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.
- v1.0.0 public-use module release
+ v0.2.1 corrective demotion state
Current State
-
CivicZone v1.0.0 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 CIVICZONE_PARCEL_RULE_DB_URL, citation-grounded resident Q&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.
+
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 CIVICZONE_PARCEL_RULE_DB_URL, citation-grounded resident Q&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.
diff --git a/docs/release-integrity-correction-2026-05-21.md b/docs/release-integrity-correction-2026-05-21.md
new file mode 100644
index 0000000..25b79d6
--- /dev/null
+++ b/docs/release-integrity-correction-2026-05-21.md
@@ -0,0 +1,18 @@
+# CivicZone Release Integrity Correction - 2026-05-21
+
+## Verdict
+
+CivicZone is demoted to v0.2.1 after the independent CivicSuite release-integrity audit found the 2026-05-21 v1.0.0 release did not meet the FINISHED and SHIPPING bar.
+
+## Current Honest State
+
+- Version: 0.2.1
+- Classification: scaffold with partial persistence/workflow plumbing; no real AI layer, full frontend, real municipal data/search, or public-use gate.
+
+## Retraction
+
+The previous v1.0.0 release was published in error. It did not prove the full CivicSuite Section 2 product-substance and public-use readiness requirements. The historical tag/release is retained for audit integrity and is superseded by this corrective demotion.
+
+## Release Boundary
+
+Do not describe CivicZone as finished, shipping, city-ready, product-ready, public-use ready, or v1.0.0 until a future independent audit of the actual code signs off against the full Section 2 gate.
diff --git a/docs/release-recovery-status.md b/docs/release-recovery-status.md
index 699f328..f4229d6 100644
--- a/docs/release-recovery-status.md
+++ b/docs/release-recovery-status.md
@@ -6,7 +6,7 @@ Repo: `CivicSuite/civiczone`
## Current Verdict
CivicZone has moved from the demoted `0.2.0` recovery posture to the active
-`1.0.0` public-use module release path. The prior recovery pass remains
+`1.0.0` corrective demotion state path. The prior recovery pass remains
historical context; current release evidence is recorded in the v1 release
evidence and browser QA files generated by the active run.
@@ -39,6 +39,6 @@ evidence and browser QA files generated by the active run.
## Sign-Off Boundary
This file is retained as the recovery-history pointer. Current `1.0.0` release
-evidence must come from the active CivicZone v1.0.0 run, current release gate,
+evidence must come from the active CivicZone v0.2.1 run, current release gate,
browser QA, GitHub CI, release artifacts, and suite installer/module-selection
truth.
diff --git a/pyproject.toml b/pyproject.toml
index 038fd5e..a9cdc6a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "civiczone"
-version = "1.0.0"
+version = "0.2.1"
description = "CivicZone runtime foundation for parcel-aware zoning and land-use Q&A."
readme = "README.md"
requires-python = ">=3.11"
diff --git a/scripts/verify-release.sh b/scripts/verify-release.sh
index 684aa29..c6c9c52 100755
--- a/scripts/verify-release.sh
+++ b/scripts/verify-release.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail
-VERSION="1.0.0"
+VERSION="0.2.1"
find_python() {
local candidates=()
@@ -40,7 +40,7 @@ ${PYTHON_BIN} - <<'PY'
from pathlib import Path
import tomllib
-version = "1.0.0"
+version = "0.2.1"
root = Path(".")
pyproject = tomllib.loads((root / "pyproject.toml").read_text(encoding="utf-8"))
assert pyproject["project"]["version"] == version, pyproject["project"]["version"]
@@ -56,7 +56,7 @@ for path in [
"SECURITY.md",
]:
text = (root / path).read_text(encoding="utf-8")
- assert "1.0.0" in text, f"missing release version in {path}"
+ assert "0.2.1" 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
@@ -81,8 +81,8 @@ from pathlib import Path
import hashlib
dist = Path("dist")
-wheel = dist / "civiczone-1.0.0-py3-none-any.whl"
-sdist = dist / "civiczone-1.0.0.tar.gz"
+wheel = dist / "civiczone-0.2.1-py3-none-any.whl"
+sdist = dist / "civiczone-0.2.1.tar.gz"
assert wheel.exists(), f"missing {wheel}"
assert sdist.exists(), f"missing {sdist}"
lines = []
diff --git a/tests/test_milestone_7_public_ui_accessibility.py b/tests/test_milestone_7_public_ui_accessibility.py
index 93ce9b2..723fb44 100644
--- a/tests/test_milestone_7_public_ui_accessibility.py
+++ b/tests/test_milestone_7_public_ui_accessibility.py
@@ -17,7 +17,7 @@ def test_public_ui_route_returns_accessible_html() -> None:
assert 'Skip to main content' in text
assert '' in text
assert "aria-live=\"polite\"" in text
- assert "v1.0.0 public-use module" in text
+ assert "v0.2.1 corrective demotion state" in text
assert '' in text
diff --git a/tests/test_runtime_foundation.py b/tests/test_runtime_foundation.py
index f11629e..577b2e9 100644
--- a/tests/test_runtime_foundation.py
+++ b/tests/test_runtime_foundation.py
@@ -12,7 +12,7 @@
def test_package_version_is_100() -> None:
- assert civiczone.__version__ == "1.0.0"
+ assert civiczone.__version__ == "0.2.1"
def test_pyproject_uses_published_civiccore_release_wheel() -> None:
@@ -33,7 +33,7 @@ def test_root_endpoint_states_runtime_boundary() -> None:
payload = response.json()
assert payload["name"] == "CivicZone"
- assert payload["version"] == "1.0.0"
+ assert payload["version"] == "0.2.1"
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"]
@@ -49,7 +49,7 @@ def test_health_endpoint_reports_versions() -> None:
assert payload["status"] == "ok"
assert payload["service"] == "civiczone"
- assert payload["version"] == "1.0.0"
+ assert payload["version"] == "0.2.1"
assert payload["civiccore_version"] == "1.1.0"
@@ -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 "1.0.0" in lowered, path
+ assert "0.2.1" in lowered, path
assert "provisional" not in lowered, path