Docs: Bump constitution to v1.3.0 — require PostgreSQL for integration tests

§2.5: Remove the planned PostgreSQL→SQLite refactor note; prohibit
alternative database engines in integration tests.
§5.2: Explicitly require a real PostgreSQL instance for integration
tests; ban SQLite — a GROUP BY/HAVING production bug was masked by
SQLite's permissive dialect in feature 007.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-06 18:47:57 +00:00
parent 265b967f6b
commit 354c85292d

View File

@@ -1,8 +1,8 @@
<!-- <!--
SYNC IMPACT REPORT SYNC IMPACT REPORT
================== ==================
Version change: 1.1.1 → 1.2.0 Version change: 1.2.0 → 1.3.0
Ratified: 2026-05-01 | Last amended: 2026-05-03 Ratified: 2026-05-01 | Last amended: 2026-05-06
Principles introduced (first population from docs/CONSTITUTION.md): Principles introduced (first population from docs/CONSTITUTION.md):
- §2 Architecture Principles (6 sub-principles) - §2 Architecture Principles (6 sub-principles)
@@ -94,10 +94,11 @@ The constitution acknowledges all three; the spec governs which is built.
### 2.5 Database abstraction ### 2.5 Database abstraction
PostgreSQL is the Phase 1 database. All DB access MUST go through a repository PostgreSQL is the database. All DB access MUST go through a repository layer
layer (one repository class per domain aggregate). Raw SQL or an ORM is (one repository class per domain aggregate). Raw SQL or an ORM is acceptable,
acceptable, but no query logic MAY live outside a repository. This makes the but no query logic MAY live outside a repository. No alternative database
planned PostgreSQL → SQLite refactor a repository-layer change only. engine (SQLite, DuckDB, in-memory substitutes) MAY be used in integration
tests — dialect differences mask production bugs.
### 2.6 No speculative abstraction ### 2.6 No speculative abstraction
@@ -179,8 +180,11 @@ before any implementation step.
### 5.2 Test pyramid ### 5.2 Test pyramid
- **Unit tests** — pure logic, repository mocks, no I/O - **Unit tests** — pure logic, repository mocks, no I/O
- **Integration tests** — API routes tested against a real (test) database - **Integration tests** — API routes tested against a real PostgreSQL instance
and a real (test) S3-compatible bucket (e.g. MinIO in Docker) and a real S3-compatible bucket (e.g. MinIO in Docker). SQLite and other
in-memory database substitutes are **prohibited** — PostgreSQL-specific
behaviour (GROUP BY enforcement, JSON operators, constraint handling) MUST
be exercised by the test suite.
- **E2E tests** — Angular + API, minimal set covering the core happy paths - **E2E tests** — Angular + API, minimal set covering the core happy paths
Unit and integration tests are required. E2E tests are best-effort in v1. Unit and integration tests are required. E2E tests are best-effort in v1.
@@ -284,7 +288,8 @@ Phase 1 design is complete.
| 1.1.0 | 2026-05-02 | Adopted into Spec Kit memory; fixed duplicate §4.3 → §4.4; strengthened "should" language to MUST/MUST NOT; added §9 Governance | | 1.1.0 | 2026-05-02 | Adopted into Spec Kit memory; fixed duplicate §4.3 → §4.4; strengthened "should" language to MUST/MUST NOT; added §9 Governance |
| 1.1.1 | 2026-05-03 | Clarify that the only acceptable form of image transformation or editing is thumbnail generation | | 1.1.1 | 2026-05-03 | Clarify that the only acceptable form of image transformation or editing is thumbnail generation |
| 1.2.0 | 2026-05-03 | §2.4: Mark Phase 2 (JWT bearer auth) complete, reword phase status; §6: Add PyJWT to tech stack table; §8: Remove username/password auth from out-of-scope (now shipped) | | 1.2.0 | 2026-05-03 | §2.4: Mark Phase 2 (JWT bearer auth) complete, reword phase status; §6: Add PyJWT to tech stack table; §8: Remove username/password auth from out-of-scope (now shipped) |
| 1.3.0 | 2026-05-06 | §2.5: Remove planned PostgreSQL → SQLite refactor note; prohibit alternative database engines in integration tests. §5.2: Explicitly require PostgreSQL for integration tests; prohibit SQLite — a production HAVING/GROUP BY bug was masked by SQLite's permissive dialect. |
--- ---
**Version**: 1.2.0 | **Ratified**: 2026-05-01 | **Last Amended**: 2026-05-03 **Version**: 1.3.0 | **Ratified**: 2026-05-01 | **Last Amended**: 2026-05-06