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/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Security reports
url: https://github.com/CivicSuite/civiczone/security/policy
url: https://github.com/Townlight/townlight_zoning/security/policy
about: Report vulnerabilities privately.
14 changes: 8 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@ jobs:
python-version: "3.11"
cache: pip

- name: Install CivicCore release wheel
run: python -m pip install https://github.com/CivicSuite/civiccore/releases/download/v1.1.0/civiccore-1.1.0-py3-none-any.whl
- name: Build and install exact candidate Core
run: |
python -m pip install build
python scripts/install-core-candidate.py

- name: Install package and test dependencies
run: python -m pip install -e ".[dev]"
Expand All @@ -32,11 +34,11 @@ jobs:
- name: Create release notes
run: |
cat > release-notes.md <<EOF
CivicZone ${{ github.ref_name }} release.
TownlightZoning ${{ github.ref_name }} release.

Artifacts:
- civiczone wheel
- civiczone source distribution
- townlight_zoning wheel
- townlight_zoning source distribution
- SHA256SUMS.txt

Verify locally with:
Expand All @@ -55,5 +57,5 @@ jobs:
gh release create "${{ github.ref_name }}" \
dist/* \
--repo "$GH_REPO" \
--title "civiczone ${{ github.ref_name }}" \
--title "townlight_zoning ${{ github.ref_name }}" \
--notes-file release-notes.md
29 changes: 16 additions & 13 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,36 +52,39 @@ jobs:
- uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Install CivicCore release wheel
run: python -m pip install "https://github.com/townlight/core/releases/download/v1.2.1/civiccore-1.2.1-py3-none-any.whl#sha256=8dde29408e206048bde63ec14156a8e6329382af4d16b12710d12aa5c27f3f59"
cache: pip
- name: Build and install exact candidate Core
run: |
python -m pip install build
python scripts/install-core-candidate.py
- name: Install package
run: python -m pip install -e ".[dev]"
- name: Start PostGIS test database
run: |
docker run -d --name civiczone-ci \
docker run -d --name townlight_zoning-ci \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=civiczone_test \
-e POSTGRES_DB=townlight_zoning_test \
-p 127.0.0.1::5432 \
pgvector/pgvector:pg17
docker exec civiczone-ci apt-get update
docker exec civiczone-ci apt-get install -y postgresql-17-postgis-3
docker exec townlight_zoning-ci apt-get update
docker exec townlight_zoning-ci apt-get install -y postgresql-17-postgis-3
for i in $(seq 1 30); do
if docker exec civiczone-ci pg_isready -h 127.0.0.1 -U postgres -d civiczone_test; then
if docker exec townlight_zoning-ci pg_isready -h 127.0.0.1 -U postgres -d townlight_zoning_test; then
break
fi
sleep 1
done
docker exec civiczone-ci pg_isready -h 127.0.0.1 -U postgres -d civiczone_test
PORT="$(docker port civiczone-ci 5432/tcp | awk -F: '{print $NF}')"
docker exec townlight_zoning-ci pg_isready -h 127.0.0.1 -U postgres -d townlight_zoning_test
PORT="$(docker port townlight_zoning-ci 5432/tcp | awk -F: '{print $NF}')"
test -n "$PORT"
URL="postgresql+psycopg2://postgres:postgres@127.0.0.1:${PORT}/civiczone_test"
URL="postgresql+psycopg2://postgres:postgres@127.0.0.1:${PORT}/townlight_zoning_test"
echo "DATABASE_URL=$URL" >> "$GITHUB_ENV"
echo "CIVICZONE_TEST_DATABASE_URL=$URL" >> "$GITHUB_ENV"
echo "TOWNLIGHT_ZONING_TEST_DATABASE_URL=$URL" >> "$GITHUB_ENV"
- name: Apply database migrations
run: DATABASE_URL="$CIVICZONE_TEST_DATABASE_URL" alembic -c civiczone/migrations/alembic.ini upgrade head
run: DATABASE_URL="$TOWNLIGHT_ZONING_TEST_DATABASE_URL" alembic -c townlight_zoning/migrations/alembic.ini upgrade head
- name: Run release gate
run: bash scripts/verify-release.sh
- name: Remove PostGIS test database
if: always()
run: docker rm -f civiczone-ci || true
run: docker rm -f townlight_zoning-ci || true
42 changes: 35 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,33 @@
<a id="civiczone-agent-contract"></a>
<a id="townlight_zoning-agent-contract"></a>

# Townlight Zoning Agent Contract

## Governing contract and candidate identity

Scott's bounded completion contract governs. Legacy skills, automatic delegation,
milestone/review loops and generic extra gates require explicit invocation.
Preserve actual product requirements, required CI/release checks, security/data
safeguards and installed acceptance. Reuse unaffected evidence with its limits.

Current distribution: `townlight-zoning` 0.2.3; principal import:
`townlight_zoning`. Shared dependency: `townlight-core==1.3.0.dev2`. Use the exact
coordinated source pins and local candidate wheels in the README; never fabricate
renamed historical release URLs. Source tests do not establish installed acceptance
or publication. The original [agent contract](docs/history/pre-naming-2026-11/AGENTS.md)
is retained as history, not current session authorization.

The candidate supports fresh branded databases and fresh profiles only. Preserve
existing data and refuse unmarked legacy initialization; no in-place upgrade or
old import shim is provided. The sole approved old active identifier is
`%LOCALAPPDATA%\CivicSuite` for that profile path only. Other retained old active
identifiers require Scott's approval in the single exception registry. Preserve
historical identities, third-party attribution and standalone CivicCast.

## Source Of Truth

- Upstream suite spec: `townlight/townlight/docs/CivicSuiteUnifiedSpec.md`, especially section 10.
- Upstream suite spec: `townlight/townlight/docs/TownlightUnifiedSpec.md`, especially section 10.
- Suite ADRs: `townlight/townlight/docs/architecture/`.
- Townlight Code v0.1.0 release contract is required context for zoning-code citations.
- The pinned Townlight Code candidate contract and source provenance govern zoning-code citations.

## Non-Negotiables

Expand All @@ -18,10 +39,17 @@
- Townlight Zoning depends on Townlight Core and Townlight Code; Townlight Core must never depend on Townlight Zoning.
- Code is AGPL-3.0-only, with no additional permission for this candidate (historical grants under docs/licensing/history/). Docs are CC BY 4.0.

## Placeholder Package Warning
## Core dependency boundary

Do not import from Townlight Core placeholder packages until Townlight Core ships real implementations for them: `audit`, `catalog`, `connectors`, `exemptions`, `ingest`, `notifications`, `onboarding`, `scaffold`, `search`, `verification`. Townlight Core `auth` is no longer treated as a placeholder for Townlight Zoning v1.0.0 because the current release uses its trusted-header helpers for staff access validation.
Core auth, audit, catalog, connector, ingestion, exemption, search, scaffold and
verification contracts must be assessed against the pinned implementation.
Historical placeholder ADRs do not establish current absence. Keep the owning
product's dependency-boundary checks; this correction does not add consumers or
authorize importing an unused capability.

## Milestone Rule
## Verification

Work one milestone at a time. When a milestone is done, report what changed, audit it once, fix findings once, re-audit once, then continue immediately unless there is a true blocker.
Run meaningful affected checks and the repository-required release checks.
Report database, Docker and installed-workflow evidence separately; never turn
skips or historical results into current acceptance. Follow the bounded contract
for completion and continuation rather than an automatic audit/re-audit loop.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## [0.2.3] - Unreleased naming candidate

- Rename the principal distribution/import to the Townlight Zoning identities and pair with Townlight Core 1.3.0.dev2.
- Update renamed cross-product consumers and fresh-install schema identities.
- Fresh-install candidate only; no legacy database upgrade or import shim. Existing data and historical release identities are preserved.
- Signed Windows installer acceptance and publication remain pending; source implementation is not installed verification.


## Unreleased — Townlight Zoning Z3

- Persist explicit permitted Meetings source links as append-only question events.
Expand Down
Loading
Loading