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
2 changes: 1 addition & 1 deletion .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: {python-version: "3.11"}
- run: python -m pip install https://github.com/CivicSuite/civiccore/releases/download/v0.2.0/civiccore-0.2.0-py3-none-any.whl
- run: python -m pip install https://github.com/CivicSuite/civiccore/releases/download/v0.3.0/civiccore-0.3.0-py3-none-any.whl
- run: python -m pip install -e ".[dev]"
- run: bash scripts/verify-release.sh
6 changes: 3 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CivicParks Agent Notes

- CivicParks v0.1.0 is a deterministic runtime foundation, not a production registration or work-order system.
- Keep `civiccore==0.2.0` pinned until a suite compatibility update says otherwise.
- CivicParks v0.1.1 is a deterministic runtime foundation, not a production registration or work-order system.
- Keep `civiccore==0.3.0` pinned until a suite compatibility update says otherwise.
- Do not import CivicCore placeholder packages.
- Do not claim payment processing, participant-record management, registration writes, facility reservation writes, crew dispatch, live LLM calls, or connector runtime ships in v0.1.0.
- Do not claim payment processing, participant-record management, registration writes, facility reservation writes, crew dispatch, live LLM calls, or connector runtime ships in v0.1.1.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## [0.1.1] - 2026-04-28

### Changed

- Dependency-alignment release: moved CivicParks to `civiccore==0.3.0` while preserving the existing v0.1.0 runtime foundation behavior.
- Updated CI, verification gates, package metadata, docs, runtime tests, landing page, and public UI labels for the v0.1.1 release.

## [0.1.0] - 2026-04-27

### Added
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CivicParks

CivicParks v0.1.0 ships the municipal parks and recreation support foundation for CivicSuite: cited parks policy Q&A, program and facility Q&A, registration assistance that links to existing systems, maintenance request triage for Civic311-style handoff, FastAPI runtime, public sample UI, docs, tests, browser QA, and release gates.
CivicParks v0.1.1 ships the municipal parks and recreation support foundation for CivicSuite: cited parks policy Q&A, program and facility Q&A, registration assistance that links to existing systems, maintenance request triage for Civic311-style handoff, FastAPI runtime, public sample UI, docs, tests, browser QA, and release gates.

It is not a registration system, payment processor, reservation system, participant-record store, work-order system, live LLM runtime, or parks connector.

Expand All @@ -11,6 +11,6 @@ python -m pip install -e ".[dev]"
python -m uvicorn civicparks.main:app --host 127.0.0.1 --port 8143
```

CivicParks v0.1.0 is pinned to `civiccore==0.2.0`.
CivicParks v0.1.1 is pinned to `civiccore==0.3.0`.

Apache 2.0 code. CC BY 4.0 docs.
4 changes: 2 additions & 2 deletions README.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
CivicParks

CivicParks v0.1.0 ships municipal parks and recreation support foundations: cited parks policy Q&A, program and facility Q&A, registration assistance that links to existing systems, maintenance request triage for Civic311-style handoff, FastAPI runtime, public sample UI, docs, tests, browser QA, and release gates.
CivicParks v0.1.1 ships municipal parks and recreation support foundations: cited parks policy Q&A, program and facility Q&A, registration assistance that links to existing systems, maintenance request triage for Civic311-style handoff, FastAPI runtime, public sample UI, docs, tests, browser QA, and release gates.

It is not a registration system, payment processor, reservation system, participant-record store, work-order system, live LLM runtime, or parks connector.

Install with:
python -m pip install -e ".[dev]"
python -m uvicorn civicparks.main:app --host 127.0.0.1 --port 8143

CivicParks v0.1.0 is pinned to civiccore==0.2.0.
CivicParks v0.1.1 is pinned to civiccore==0.3.0.

Apache 2.0 code. CC BY 4.0 docs.
4 changes: 2 additions & 2 deletions USER-MANUAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ python -m pip install -e ".[dev]"
python -m uvicorn civicparks.main:app --host 127.0.0.1 --port 8143
```

Runtime dependency: `civiccore==0.2.0`.
Runtime dependency: `civiccore==0.3.0`.

Primary endpoints:

Expand All @@ -30,4 +30,4 @@ Primary endpoints:

![CivicParks architecture](docs/architecture-civicparks.svg)

CivicParks is a module on top of CivicCore. v0.1.0 is deterministic and local: no payments, registration writes, participant records, reservation writes, work-order creation, crew dispatch, live LLM calls, or connector runtime is shipped.
CivicParks is a module on top of CivicCore. v0.1.1 is deterministic and local: no payments, registration writes, participant records, reservation writes, work-order creation, crew dispatch, live LLM calls, or connector runtime is shipped.
2 changes: 1 addition & 1 deletion USER-MANUAL.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ For staff: use CivicParks to draft cited parks policy answers, answer program an

Boundaries: CivicParks does not process payments, enroll participants, manage participant records, reserve facilities, dispatch crews, replace Civic311, or replace recreation registration systems.

For IT: install with python -m pip install -e ".[dev]" and run with python -m uvicorn civicparks.main:app --host 127.0.0.1 --port 8143. Depends on civiccore==0.2.0.
For IT: install with python -m pip install -e ".[dev]" and run with python -m uvicorn civicparks.main:app --host 127.0.0.1 --port 8143. Depends on civiccore==0.3.0.
4 changes: 2 additions & 2 deletions civicparks/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""CivicParks v0.1.0 public package."""
"""CivicParks v0.1.1 public package."""

__version__ = "0.1.0"
__version__ = "0.1.1"
10 changes: 8 additions & 2 deletions civicparks/main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""FastAPI runtime foundation for CivicParks."""

from civiccore import __version__ as CIVICCORE_VERSION
from fastapi import FastAPI
from fastapi import FastAPI, Response
from fastapi.responses import HTMLResponse
from pydantic import BaseModel

Expand All @@ -18,6 +18,12 @@
description="Parks and recreation policy, program, registration-link, and maintenance-triage foundation.",
)

@app.get("/favicon.ico", include_in_schema=False)
def favicon() -> Response:
"""Return an empty favicon response so browser QA has a clean console."""

return Response(status_code=204)

POLICY_SOURCES = [
ParksPolicySource(
"policy-1",
Expand Down Expand Up @@ -58,7 +64,7 @@ def root() -> dict[str, str]:
"registrations, participant records, reservation writes, crew dispatch, "
"live LLM calls, and connector runtime are not implemented yet."
),
"next_step": "Post-v0.1.0 roadmap: registration-system and Civic311 handoff adapter design",
"next_step": "Post-v0.1.1 roadmap: registration-system and Civic311 handoff adapter design",
}


Expand Down
2 changes: 1 addition & 1 deletion civicparks/maintenance.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,6 @@ def triage_maintenance_request(issue: str, location: str) -> MaintenanceTriage:
staff_review_required=True,
boundary=(
"Draft triage only. CivicParks does not dispatch crews, create work orders, "
"or write into Civic311 in v0.1.0."
"or write into Civic311 in v0.1.1."
),
)
11 changes: 6 additions & 5 deletions civicparks/public_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ def render_public_lookup_page() -> str:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CivicParks v0.1.0</title>
<link rel="icon" href="data:,">
<title>CivicParks v0.1.1</title>
<style>
:root{--ink:#162415;--muted:#536b51;--line:#c8dfc0;--paper:#f8fff4;--card:#ffffff;--accent:#397046;--sun:#d9972b}
*{box-sizing:border-box}body{margin:0;font-family:Georgia,'Times New Roman',serif;background:radial-gradient(circle at top right,#fff1bf,transparent 32rem),linear-gradient(135deg,#f8fff4,#edf8ff);color:var(--ink)}
Expand All @@ -25,10 +26,10 @@ def render_public_lookup_page() -> str:
<div>
<p class="eyebrow">CivicSuite / CivicParks</p>
<h1>Parks and recreation answers without replacing registration systems.</h1>
<p>CivicParks v0.1.0 helps staff answer facility, program, rental, league, and park-rule questions while keeping payments, registration records, and work orders in existing systems.</p>
<p>CivicParks v0.1.1 helps staff answer facility, program, rental, league, and park-rule questions while keeping payments, registration records, and work orders in existing systems.</p>
</div>
<div class="panel">
<h2>v0.1.0 boundary</h2>
<h2>v0.1.1 boundary</h2>
<p class="boundary">No payments, no registrations, no participant records, no reservation writes, no crew dispatch, no live LLM calls, and no connector runtime ship in this release.</p>
</div>
</section>
Expand All @@ -39,8 +40,8 @@ def render_public_lookup_page() -> str:
</section>
<section class="panel">
<h2>Architecture</h2>
<p><strong>Resident or staff question</strong> -> CivicParks deterministic API -> CivicCore foundation. Registration and Civic311 adapters are future read-only or handoff designs, not v0.1.0 write paths.</p>
<p>Dependency: <code>civiccore==0.2.0</code>. Repo: <a href="https://github.com/CivicSuite/civicparks">CivicSuite/civicparks</a>.</p>
<p><strong>Resident or staff question</strong> -> CivicParks deterministic API -> CivicCore foundation. Registration and Civic311 adapters are future read-only or handoff designs, not v0.1.1 write paths.</p>
<p>Dependency: <code>civiccore==0.3.0</code>. Repo: <a href="https://github.com/CivicSuite/civicparks">CivicSuite/civicparks</a>.</p>
</section>
</main>
</body>
Expand Down
49 changes: 49 additions & 0 deletions docs/browser-qa-civicparks-v0.1.1-alignment-summary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# civicparks v0.1.1 Browser QA

Date: 2026-04-28

Routes checked:
- docs landing: file:///C:/Users/scott/OneDrive/Desktop/Claude/civicparks/docs/index.html
- public UI: http://127.0.0.1:8160/civicparks

Result: PASS

## desktop - file:///C:/Users/scott/OneDrive/Desktop/Claude/civicparks/docs/index.html
- screenshot: browser-qa-civicparks-v0.1.1-docs-desktop.png
- title: CivicParks v0.1.1
- scrollWidth: 1366
- innerWidth: 1366
- horizontal overflow: false
- contains 0.1.1: true
- contains 0.3.0: true
- console errors/warnings: 0

## mobile - file:///C:/Users/scott/OneDrive/Desktop/Claude/civicparks/docs/index.html
- screenshot: browser-qa-civicparks-v0.1.1-docs-mobile.png
- title: CivicParks v0.1.1
- scrollWidth: 390
- innerWidth: 390
- horizontal overflow: false
- contains 0.1.1: true
- contains 0.3.0: true
- console errors/warnings: 0

## desktop - http://127.0.0.1:8160/civicparks
- screenshot: browser-qa-civicparks-v0.1.1-public-desktop.png
- title: CivicParks v0.1.1
- scrollWidth: 1366
- innerWidth: 1366
- horizontal overflow: false
- contains 0.1.1: true
- contains 0.3.0: true
- console errors/warnings: 0

## mobile - http://127.0.0.1:8160/civicparks
- screenshot: browser-qa-civicparks-v0.1.1-public-mobile.png
- title: CivicParks v0.1.1
- scrollWidth: 390
- innerWidth: 390
- horizontal overflow: false
- contains 0.1.1: true
- contains 0.3.0: true
- console errors/warnings: 0
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions docs/browser-qa-civicparks-v0.1.1-server.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
INFO: Started server process [14060]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8160 (Press CTRL+C to quit)
INFO: 127.0.0.1:53447 - "GET /health HTTP/1.1" 200 OK
INFO: 127.0.0.1:57114 - "GET /civicparks HTTP/1.1" 200 OK
INFO: 127.0.0.1:57114 - "GET /civicparks HTTP/1.1" 200 OK
8 changes: 4 additions & 4 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CivicParks v0.1.0</title>
<title>CivicParks v0.1.1</title>
<style>
:root{--ink:#162415;--accent:#397046;--line:#c8dfc0;--card:#fbfff8}
body{margin:0;font-family:Aptos,Segoe UI,sans-serif;background:linear-gradient(135deg,#f7fff2,#fff7df);color:var(--ink)}
Expand All @@ -18,12 +18,12 @@
</head>
<body>
<main>
<span class="badge">Shipping v0.1.0</span>
<span class="badge">Shipping v0.1.1</span>
<h1>Parks help that keeps registration systems authoritative.</h1>
<p>CivicParks helps staff draft cited park-rule answers, explain programs and facilities, link residents to existing registration systems, and triage maintenance requests for staff review.</p>
<section class="grid">
<article class="card"><h2>For Staff</h2><p>Draft policy answers, program replies, registration guidance, and maintenance categories that staff verify before use.</p></article>
<article class="card"><h2>For IT</h2><p>FastAPI runtime pinned to <code>civiccore==0.2.0</code>, deterministic tests, and no registration-system writes.</p></article>
<article class="card"><h2>For IT</h2><p>FastAPI runtime pinned to <code>civiccore==0.3.0</code>, deterministic tests, and no registration-system writes.</p></article>
<article class="card"><h2>Boundary</h2><p>No payments, registrations, participant records, reservation writes, crew dispatch, live LLM calls, or connector runtime.</p></article>
</section>
<section class="card" style="margin-top:24px">
Expand All @@ -32,7 +32,7 @@ <h2>Architecture</h2>
</section>
<section class="card" style="margin-top:24px">
<h2>Boundaries</h2>
<p>CivicParks v0.1.0 does not process payments, enroll participants, manage participant records, reserve facilities, dispatch crews, replace Civic311, call live LLMs, or ship parks connector runtime.</p>
<p>CivicParks v0.1.1 does not process payments, enroll participants, manage participant records, reserve facilities, dispatch crews, replace Civic311, call live LLMs, or ship parks connector runtime.</p>
</section>
<p>Repository: <a href="https://github.com/CivicSuite/civicparks">github.com/CivicSuite/civicparks</a></p>
</main>
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ build-backend = "hatchling.build"

[project]
name = "civicparks"
version = "0.1.0"
version = "0.1.1"
description = "CivicParks foundation for parks policy, program, registration-link, and maintenance-triage support."
readme = "README.md"
requires-python = ">=3.11"
license = { text = "Apache-2.0" }
authors = [{ name = "CivicSuite contributors" }]
dependencies = ["civiccore==0.2.0", "fastapi>=0.115.0,<1.0.0", "uvicorn[standard]>=0.30.0,<1.0.0"]
dependencies = ["civiccore==0.3.0", "fastapi>=0.115.0,<1.0.0", "uvicorn[standard]>=0.30.0,<1.0.0"]

[project.optional-dependencies]
dev = ["build>=1.2.0,<2.0.0", "httpx>=0.27.0,<1.0.0", "pytest>=8.0.0,<9.0.0", "ruff>=0.11.0"]
Expand Down
2 changes: 1 addition & 1 deletion scripts/check-civiccore-placeholder-imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def main() -> int:
name = module.split(".")[1]
if name in PLACEHOLDERS:
failures.append(
f"{path}: civiccore.{name} is a placeholder package in v0.2.0. "
f"{path}: civiccore.{name} is a placeholder package in v0.3.0. "
"Do not import from it."
)
if failures:
Expand Down
2 changes: 1 addition & 1 deletion scripts/verify-docs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ for file in README.md README.txt USER-MANUAL.md USER-MANUAL.txt CHANGELOG.md CON
test -f "$file" || { echo "VERIFY-DOCS: missing $file"; exit 1; }
done

for pattern in CivicUtility civicutility CivicElections civicelections CivicCourt civiccourt CivicSafety civicsafety CivicLibrary civiclibrary "0.1.0.dev0" "~=0.2" MIT; do
for pattern in CivicUtility civicutility CivicElections civicelections CivicCourt civiccourt CivicSafety civicsafety CivicLibrary civiclibrary "0.1.1.dev0" "~=0.2" MIT; do
if grep -Fq "$pattern" README.md README.txt USER-MANUAL.md USER-MANUAL.txt docs/index.html CHANGELOG.md; then
echo "VERIFY-DOCS: stale marker found: $pattern"
exit 1
Expand Down
12 changes: 6 additions & 6 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

echo "VERIFY-RELEASE: CivicParks v0.1.0"
echo "VERIFY-RELEASE: CivicParks v0.1.1"
if [ -n "${CIVICPARKS_RELEASE_PYTHON:-}" ]; then
PYTHON_BIN="$CIVICPARKS_RELEASE_PYTHON"
else
Expand All @@ -26,18 +26,18 @@ $PYTHON_BIN -m ruff check .
rm -rf dist
$PYTHON_BIN -m build

test -f dist/civicparks-0.1.0-py3-none-any.whl || { echo "missing wheel"; exit 1; }
test -f dist/civicparks-0.1.0.tar.gz || { echo "missing sdist"; exit 1; }
test -f dist/civicparks-0.1.1-py3-none-any.whl || { echo "missing wheel"; exit 1; }
test -f dist/civicparks-0.1.1.tar.gz || { echo "missing sdist"; exit 1; }
(
cd dist
sha256sum civicparks-0.1.0-py3-none-any.whl civicparks-0.1.0.tar.gz > SHA256SUMS.txt
sha256sum civicparks-0.1.1-py3-none-any.whl civicparks-0.1.1.tar.gz > SHA256SUMS.txt
)
echo "[PASS] build artifacts and SHA256SUMS"

$PYTHON_BIN - <<'PY'
import civicparks
assert civicparks.__version__ == "0.1.0", civicparks.__version__
print("[PASS] package version 0.1.0")
assert civicparks.__version__ == "0.1.1", civicparks.__version__
print("[PASS] package version 0.1.1")
PY

echo "VERIFY-RELEASE: PASSED"
2 changes: 1 addition & 1 deletion tests/test_civicparks_foundation.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@


def test_version_is_release_version():
assert __version__ == "0.1.0"
assert __version__ == "0.1.1"


def test_policy_answer_is_cited_and_reviewed():
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 @@ -18,16 +18,16 @@ def test_health_reports_civiccore_pin():
assert client.get("/health").json() == {
"status": "ok",
"service": "civicparks",
"version": "0.1.0",
"civiccore_version": "0.2.0",
"version": "0.1.1",
"civiccore_version": "0.3.0",
}


def test_public_ui_contains_version_boundaries_and_dependency():
text = client.get("/civicparks").text
assert "CivicParks v0.1.0" in text
assert "CivicParks v0.1.1" in text
assert "No payments" in text
assert "civiccore==0.2.0" in text
assert "civiccore==0.3.0" in text


def test_api_endpoints_return_deterministic_payloads():
Expand Down
Loading