From 16fcc74cdd0c844dfad475414e08c8f08ee9039c Mon Sep 17 00:00:00 2001 From: Scott Converse <1474146+scottconverse@users.noreply.github.com> Date: Fri, 24 Apr 2026 23:19:28 -0600 Subject: [PATCH] release: v1.3.0 (Phase 1 CivicCore extraction) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mechanics-only release. No API or UI changes. Bumps version across all source surfaces and adds the [1.3.0] CHANGELOG section per the release- hardening directive. ## What's in v1.3.0 Phase 1 CivicCore extraction landed: civiccore v0.1.0 is now consumed as a release-wheel dependency. Two-layer Alembic migration order (civiccore first via subprocess, then records-side). Migration idempotency guards on 14 records-side migrations. CI merge bar hardened with 3 ADR-0003 migration gate tests. scripts/verify-release.sh 6-step gate. .dockerignore build hardening (frontend build context -99.6%, api -49%; frontend now builds on clean clones). Full bullet list: CHANGELOG.md [1.3.0] section. ## Files changed (3a — version bumps, 3b — CHANGELOG) 20 files touched. Canonical version of record: - backend/pyproject.toml: version = "1.2.0" -> "1.3.0" Mirrors (each one matches the canonical): - backend/app/config.py APP_VERSION - frontend/package.json - docs/openapi.json - docs/UNIFIED-SPEC.md (current-release header + version-lockstep block) - docs/SUPERVISOR.md (operator lockstep instruction) - docs/index.html, docs/architecture/*.html, docs/admin-manual-it.html, docs/user-manual-staff.html, docs/civicrecords-ai-manual.html (titles, badges, footers) - docs/generate_pdfs.py (current-release prose constant) - docs/generate_docx.py (Status section body_para — adds v1.3.0 entry above v1.2.0) - frontend/src/components/app-shell.tsx (footer) - frontend/src/pages/Dashboard.test.tsx, Settings.test.tsx (mock /admin/status payloads + assertion strings) - README.md, README.txt (Status section: new v1.3.0 entry above v1.2.0; Current build pointer bumped) - CHANGELOG.md ([1.3.0] - 2026-04-25 section added above [1.2.0]; [Unreleased] reset to empty Keep-a-Changelog template) ## Files NOT changed (intentionally — historical, fixture, deprecated) - CHANGELOG.md [1.2.0] section (history) - backend/tests/test_civiccore_migration_gates.py (Gate 2 tests upgrade FROM v1.2.0 — that's the contract, not the current version) - backend/tests/fixtures/schema_v1_2_0.sql (v1.2.0 baseline fixture; never rename) - HTML manuals' "v1.2.0 UPDATE NOTICE" historical change-blocks - docs/UNIFIED-SPEC.md "[NEW in v1.2.0]" legend / "As of v1.2.0..." feature-set narrative - docs/SUPERVISOR.md "post-v1.2.0 on master" line (will become post-v1.3.0 after this tag ships, per directive's "After v1.3.0 ships" section) - docs/github-discussions-seed.md (v1.2.0 launch-event prose) - All deprecated/RETRACTED docs and CHANGE-CONTROL.md history ## Civiccore wheel pin — confirmed unchanged backend/pyproject.toml stays exactly: civiccore @ https://github.com/CivicSuite/civiccore/releases/download/v0.1.0/civiccore-0.1.0-py3-none-any.whl Image-build git requirement: confirmed already removed (was needed for git+https; the wheel URL removed it at PR #26). ## Binary doc artifacts — deferred to follow-up #31 The committed binary artifacts (README.docx/.pdf, README-FULL.pdf, USER-MANUAL.docx/.pdf, docs/civicrecords-ai-manual.docx/.pdf, docs/UNIFIED-SPEC.docx, etc.) are content-stale relative to this source bump. Per Path B ruling (2026-04-25), source-only ship + tracked follow-up issue (#31). Hard Rule 0's "all four in sync" obligation is tracked there, not skipped. ## Refs - Dev directive: dev_directive_civicsuite_step2b_step3_2026-04-24.md - Canonical sequence: project_civicsuite_release_hardening.md - Phase 1 merge (PR #24): 0cd5a7a - civiccore wheel pin (PR #26): ca11d08 - Step 2b real fixture (PR #28): 3825cc4 - .dockerignore (PR #29): fe5d7e3 - Binary-regen follow-up: #31 Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 28 ++++++++++++++++++---- README.md | 4 +++- README.txt | 4 +++- backend/app/config.py | 2 +- backend/pyproject.toml | 2 +- docs/SUPERVISOR.md | 2 +- docs/UNIFIED-SPEC.md | 12 +++++----- docs/admin-manual-it.html | 12 +++++----- docs/architecture/decomposition.html | 2 +- docs/architecture/system-architecture.html | 6 ++--- docs/civicrecords-ai-manual.html | 6 ++--- docs/generate_docx.py | 5 ++++ docs/generate_pdfs.py | 2 +- docs/index.html | 14 +++++------ docs/openapi.json | 2 +- docs/user-manual-staff.html | 8 +++---- frontend/package.json | 2 +- frontend/src/components/app-shell.tsx | 2 +- frontend/src/pages/Dashboard.test.tsx | 4 ++-- frontend/src/pages/Settings.test.tsx | 6 ++--- 20 files changed, 76 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 016853e..8600b53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,17 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -Post-v1.2.0 commits on `master`. No version bump yet. +No commits beyond v1.3.0 yet. ### Added -- New external dependency on `civiccore`, now pinned to the versioned `v0.1.0` GitHub release wheel rather than a Git SHA. -- Backend migrations now run the `civiccore` shared-schema baseline before records' own chain via `backend/alembic/env.py`. See [ADR-0003](https://github.com/CivicSuite/civicsuite/blob/main/docs/architecture/ADR-0003-civiccore-alembic-baseline-strategy.md) for the rationale and gate contract. -- 3 migration gate tests at `backend/tests/test_civiccore_migration_gates.py` covering fresh-install, v1.2.x upgrade, and reapplication idempotency scenarios. + +### Changed + +### Deprecated + +### Removed + +### Fixed + +### Security + +## [1.3.0] - 2026-04-25 + +Phase 1 CivicCore extraction release. Records now consumes `civiccore` v0.1.0 as a versioned dependency, two-layer Alembic migration order is in place, and the release-gate scaffolding (verify-release.sh, ADR-0003 migration gates, .dockerignore build hardening) is wired into CI. + +### Added +- Phase 1 CivicCore extraction landed: `civiccore` v0.1.0 is now a declared dependency (release wheel, not source). Shared models (User, Role, Department, audit_log) and migrations now live in civiccore and are consumed via the shim layer. +- Two-layer migration order: civiccore migrations run first via `civiccore.migrations.runner.upgrade_to_head()`, then records-side migrations run as before. Fresh installs and upgrades both tested. +- Migration idempotency guards: 14 records-side migrations carry guards for shared-table ops (create_table, add_column, alter_column, create_index, create_foreign_key, create_unique_constraint, create_check_constraint) so they no-op when civiccore has already created the objects. +- CI merge bar hardened: 3 ADR-0003 migration gate tests (fresh install, v1.2.x upgrade, civiccore-first install) are standing required-pass checks on every PR. +- `scripts/verify-release.sh` added: 6-step release gate (pytest, ruff, version lockstep, doc presence, build, fresh-virtualenv wheel install). +- Build context hardening: `.dockerignore` added at the repo root. Frontend build context dropped from 241.93 MB to 0.88 MB (-99.6%) and now completes on a clean clone (was failing on transient `node_modules/.bin/.` symlinks). Api build context dropped from 2.41 MB to 1.22 MB (-49%). `backend/tests/fixtures/` is intentionally NOT excluded — the v1.2.0 schema fixture lives there and must remain in the api build context. (PR #29, master `fe5d7e3`.) ### Changed - `Dockerfile.backend` no longer installs `git`; the backend now resolves `civiccore` from a versioned wheel URL and no longer needs Git at image-build time. - 14 records migrations updated to use `civiccore.migrations.guards.idempotent_*` helpers, making them safe to re-apply on databases where the civiccore baseline has already created the shared tables (users, service_accounts, audit_log, data_sources, documents, document_chunks, model_registry, exemption_rules, connector_templates, departments, system_catalog, city_profile, notification_templates, prompt_templates, sync_run_log, sync_failures). -- Build performance: added `.dockerignore` at repo root to exclude `.git`, `node_modules`, `__pycache__`, virtualenvs, and other dev artifacts from docker build context. Image build size and time reduced — see PR description for exact delta. Frontend build also fixed: without `.dockerignore`, transient npm `.bin/.` symlinks in `node_modules` could fail the BuildKit "load build context" step with `invalid file request`. ## [1.2.0] - 2026-04-23 diff --git a/README.md b/README.md index f1b90fd..c66337d 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,8 @@ Service accounts with hashed API keys enable instance-to-instance federation acc ## Status +**v1.3.0** — 2026-04-25 release. Phase 1 CivicCore extraction landed: `civiccore` v0.1.0 is now consumed as a release-wheel dependency. Two-layer migration order — civiccore migrations run first via subprocess, then records-side. No API or UI changes (infrastructure only). See [CHANGELOG](CHANGELOG.md) and the v1.3.0 release notes for operator upgrade guidance. + **v1.2.0** — 2026-04-23 release. Tier 5 (installer + onboarding + seeding + model picker + portal mode) and Tier 6 (at-rest encryption, ENG-001 closed) ship together. CI green on `d556904` (run 24853147133). Backend 617/617 pytest, frontend 36/36 vitest, unsigned Windows installer produced on tag push. **v1.1.0** — Phase 2 release with department access controls, 50-state exemption rules, and compliance templates. @@ -241,4 +243,4 @@ Service accounts with hashed API keys enable instance-to-instance federation acc | **Phase 3** | Public portal | Public homepage, search, guided request wizard, request tracker, help pages | Partial — T5D minimal surface shipped (landing + resident-registration + authenticated submission); published-records search, resident dashboard, and track-my-request remain Planned | | **Phase 4** | Transparency layer | Open records library, reporting dashboards, public archive, federation | Planned (v2.0) | -*Note: Version numbers (semver) track release history. Phase numbers track design completeness per the canonical spec. They are separate systems. Current build (v1.2.0) includes backend work from Phases 0-2 and partial Phase 3 (T5D minimal public portal surface), but has not completed the full scope of any phase. See [canonical spec](docs/UNIFIED-SPEC.md) for complete requirements and [reconciliation](docs/RECONCILIATION-2026-04-13.md) for current gap analysis.* +*Note: Version numbers (semver) track release history. Phase numbers track design completeness per the canonical spec. They are separate systems. Current build (v1.3.0) includes backend work from Phases 0-2 and partial Phase 3 (T5D minimal public portal surface), but has not completed the full scope of any phase. See [canonical spec](docs/UNIFIED-SPEC.md) for complete requirements and [reconciliation](docs/RECONCILIATION-2026-04-13.md) for current gap analysis.* diff --git a/README.txt b/README.txt index 020d3e5..f7d1aa4 100644 --- a/README.txt +++ b/README.txt @@ -181,6 +181,8 @@ Service accounts with hashed API keys enable instance-to-instance federation acc ## Status +**v1.3.0** — 2026-04-25 release. Phase 1 CivicCore extraction landed: `civiccore` v0.1.0 is now consumed as a release-wheel dependency. Two-layer migration order — civiccore migrations run first via subprocess, then records-side. No API or UI changes (infrastructure only). See [CHANGELOG](CHANGELOG.md) and the v1.3.0 release notes for operator upgrade guidance. + **v1.2.0** — 2026-04-23 release. Tier 5 (installer + onboarding + seeding + model picker + portal mode) and Tier 6 (at-rest encryption, ENG-001 closed) ship together. CI green on `d556904` (run 24853147133). Backend 617/617 pytest, frontend 36/36 vitest, unsigned Windows installer produced on tag push. **v1.1.0** — Phase 2 release with department access controls, 50-state exemption rules, and compliance templates. @@ -235,4 +237,4 @@ Service accounts with hashed API keys enable instance-to-instance federation acc | **Phase 3** | Public portal | Public homepage, search, guided request wizard, request tracker, help pages | Partial — T5D minimal surface shipped (landing + resident-registration + authenticated submission); published-records search, resident dashboard, and track-my-request remain Planned | | **Phase 4** | Transparency layer | Open records library, reporting dashboards, public archive, federation | Planned (v2.0) | -*Note: Version numbers (semver) track release history. Phase numbers track design completeness per the canonical spec. They are separate systems. Current build (v1.2.0) includes backend work from Phases 0-2 and partial Phase 3 (T5D minimal public portal surface), but has not completed the full scope of any phase. See [canonical spec](docs/UNIFIED-SPEC.md) for complete requirements and [reconciliation](docs/RECONCILIATION-2026-04-13.md) for current gap analysis.* +*Note: Version numbers (semver) track release history. Phase numbers track design completeness per the canonical spec. They are separate systems. Current build (v1.3.0) includes backend work from Phases 0-2 and partial Phase 3 (T5D minimal public portal surface), but has not completed the full scope of any phase. See [canonical spec](docs/UNIFIED-SPEC.md) for complete requirements and [reconciliation](docs/RECONCILIATION-2026-04-13.md) for current gap analysis.* diff --git a/backend/app/config.py b/backend/app/config.py index 3d6f609..b30aadc 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -3,7 +3,7 @@ from pydantic import field_validator, model_validator from pydantic_settings import BaseSettings -APP_VERSION = "1.2.0" +APP_VERSION = "1.3.0" _INSECURE_SECRETS = {"CHANGE-ME", "CHANGE-ME-generate-with-openssl-rand-hex-32", ""} diff --git a/backend/pyproject.toml b/backend/pyproject.toml index cecd4bd..595b70c 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "civicrecords-ai" -version = "1.2.0" +version = "1.3.0" description = "Open-source AI-powered open records support for American cities" requires-python = ">=3.12" license = "Apache-2.0" diff --git a/docs/SUPERVISOR.md b/docs/SUPERVISOR.md index edf278b..e451cb8 100644 --- a/docs/SUPERVISOR.md +++ b/docs/SUPERVISOR.md @@ -24,7 +24,7 @@ Red flag if any of these disagree with each other. Ask Claude to reconcile befor 2. **Run the sovereignty check yourself before a push.** `bash scripts/verify-sovereignty.sh`. No `verify-release.sh` exists in this repo — do not accept a claim that one was run. 3. **Check lint + types on touched code.** `cd backend && ruff check app tests`. `cd frontend && npx tsc --noEmit`. `cd frontend && npm run build` is the integrated check. 4. **Watch OpenAPI drift.** If backend schemas changed, `docs/openapi.json` must be regenerated and `frontend/src/generated/api.ts` refreshed via `npm run generate:types`. Zero-diff regen is the Tier-6 standard. -5. **Verify version lockstep before any push.** `backend/pyproject.toml` `version = "1.2.0"` must equal `frontend/package.json` `"version": "1.2.0"` must equal the top `[x.y.z]` entry in `CHANGELOG.md` must equal the "Current release" line in `docs/UNIFIED-SPEC.md`. A mismatch is a dealbreaker — no push. +5. **Verify version lockstep before any push.** `backend/pyproject.toml` `version = "1.3.0"` must equal `frontend/package.json` `"version": "1.3.0"` must equal the top `[x.y.z]` entry in `CHANGELOG.md` must equal the "Current release" line in `docs/UNIFIED-SPEC.md`. A mismatch is a dealbreaker — no push. --- diff --git a/docs/UNIFIED-SPEC.md b/docs/UNIFIED-SPEC.md index 598a91f..de6e555 100644 --- a/docs/UNIFIED-SPEC.md +++ b/docs/UNIFIED-SPEC.md @@ -8,7 +8,7 @@ April 13, 2026 | Status | Canonical — verified against repository at commit head | | Supersedes | All prior spec versions (v2.0, v2.2, v3.0, v3.0.1) | | Repository | github.com/scottconverse/civicrecords-ai | -| Current release | v1.2.0 (April 23, 2026) — versions aligned across all files | +| Current release | v1.3.0 (April 24, 2026) — versions aligned across all files | | Test suite | 617 automated backend tests + 36 frontend tests — all passing; GitHub Actions CI-verified (run 24853147133 on commit `d556904`) | | Method | GitHub API crawl of repo structure, README, CHANGELOG, config files, module directories, and in-repo RECONCILIATION doc | @@ -19,11 +19,11 @@ This is the single source of truth for CivicRecords AI. It merges comprehensive When narrative claims and repository evidence disagree, repository evidence wins. This document replaces all prior spec versions. ### 1.1 Version Alignment (Resolved) -As of v1.2.0, version numbers are aligned across all four authoritative files: -backend/app/config.py: APP_VERSION = "1.2.0" -backend/pyproject.toml: version = "1.2.0" -frontend/package.json: version = "1.2.0" -CHANGELOG.md: [1.2.0] - 2026-04-23 +As of v1.3.0, version numbers are aligned across all four authoritative files: +backend/app/config.py: APP_VERSION = "1.3.0" +backend/pyproject.toml: version = "1.3.0" +frontend/package.json: version = "1.3.0" +CHANGELOG.md: [1.3.0] - 2026-04-24 The version drift documented in prior spec versions has been resolved and remains resolved. The CHANGELOG now covers four releases: 0.1.0 (foundation), 1.0.0 (design system + core features), 1.1.0 (department scoping, compliance, and feature sprint), and 1.2.0 (Tier 5 installer/onboarding/seeding/model-picker/portal-mode + Tier 6 at-rest encryption ENG-001 closure). ## 2. Product Summary diff --git a/docs/admin-manual-it.html b/docs/admin-manual-it.html index be12f8e..37abc55 100644 --- a/docs/admin-manual-it.html +++ b/docs/admin-manual-it.html @@ -3,11 +3,11 @@ -CivicRecords AI — IT Administrator Manual v1.2.0 +CivicRecords AI — IT Administrator Manual v1.3.0