Skip to content

Commit a173c65

Browse files
Release v0.4.0
1 parent f4c1df2 commit a173c65

6 files changed

Lines changed: 49 additions & 21 deletions

File tree

.claude/commands/release.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,24 @@ description: Prepare and tag a new release for this project. Both apps (proxy an
1212

1313
### 2. Draft changelog entries
1414

15-
Analyse the commits from step 1 and draft changelog entries grouped by:
15+
Draft entries **solely from the commit messages** gathered in step 1. Do not use the existing `## [Unreleased]` section in `CHANGELOG.md` as a source — it may contain entries for features that were planned but never implemented. The commits are the ground truth.
16+
17+
Group entries by:
1618

1719
- **Added** — new features
1820
- **Changed** — changes to existing behaviour
1921
- **Fixed** — bug fixes
2022
- **Infrastructure** — CI, build, tooling changes (omit if trivial)
2123

22-
Do not include merge commits, formatting-only commits, or version bump commits.
24+
Format each entry as a bolded feature name with a short summary, followed by detail sub-bullets where useful:
25+
```
26+
- **Feature name** — one-line summary
27+
- detail point
28+
- detail point
29+
```
30+
Do not mix flat one-liners with wall-of-text entries. Keep the top-level line scannable; put specifics in sub-bullets.
31+
32+
Do not include merge commits, formatting-only commits, or version bump commits. Do not classify a commit as **Fixed** if it fixes a bug in code that was not yet released — those are part of the new feature and belong under **Added** or **Changed**. **Fixed** is only for regressions or bugs in previously released behavior.
2333

2434
Show the draft to the user and ask them to confirm or edit it before proceeding. Also ask for the new version number (suggest one based on the changes: patch for fixes only, minor for new features, major for breaking changes).
2535

CHANGELOG.md

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,45 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.4.0] - 2026-03-08
11+
1012
### Added
1113
- **Policy system** — configurable row filtering, column masking, and column access control via named policies assigned to datasources and users
1214
- `policy`, `policy_version`, `policy_obligation`, `policy_assignment`, `query_audit_log` database tables (migration 007)
13-
- `PolicyHook` replaces hardcoded `RLSHook`; supports `row_filter`, `column_mask`, and `column_access` obligation types
15+
- `PolicyHook` replaces `RLSHook`; supports `row_filter`, `column_mask`, and `column_access` obligation types
1416
- Template variables (`{user.tenant}`, `{user.username}`, `{user.id}`) with parse-then-substitute injection safety
1517
- Wildcard matching (`schema: "*"`, `table: "*"`) in obligation definitions
16-
- `access_mode` field on datasources: `"policy_required"` (default) or `"open"` (no policy = full access)
17-
- Optimistic concurrency on policy updates via `version` field (409 Conflict on mismatch)
18-
- Immutable `policy_version` snapshots on every policy mutation for audit traceability
18+
- `access_mode` on datasources: `"policy_required"` (default) or `"open"`
19+
- Optimistic concurrency via `version` field (409 Conflict on mismatch)
20+
- Immutable `policy_version` snapshots on every mutation for audit traceability
1921
- Deny policies short-circuit with error before plan execution
20-
- 60-second per-session policy cache with `invalidate_datasource` / `invalidate_user` hooks
21-
- **Policy CRUD API**`GET/POST /policies`, `GET/PUT/DELETE /policies/{id}` (admin-only)
22-
- **Policy assignment API**`GET/POST /datasources/{id}/policies`, `DELETE /datasources/{id}/policies/{assignment_id}`
23-
- **YAML import/export**`GET /policies/export`, `POST /policies/import` (with `?dry_run=true`)
24-
- **Query audit log** — async logging of every proxied query; `GET /audit/queries` with pagination and filtering by user, datasource, date range
25-
- **Admin UI — Policies** — list, create, and edit policies with an obligation builder (row_filter, column_mask, column_access); inline enable/disable toggle
26-
- **Admin UI — Policy Assignments**`PolicyAssignmentPanel` on datasource edit page; assign/remove policies with optional user scope and priority
27-
- **Admin UI — Query Audit** — paginated log with expandable rows showing original query, rewritten query, and applied policy snapshots
28-
- **Demo e-commerce schema**`scripts/demo_ecommerce/` with schema, seed script, and example `policies.yaml` covering all P0 stories
22+
- 60-second per-session cache with `invalidate_datasource` / `invalidate_user` hooks
23+
- **Policy API** — admin-only CRUD and assignment endpoints
24+
- `GET/POST /policies`, `GET/PUT/DELETE /policies/{id}`
25+
- `GET/POST /datasources/{id}/policies`, `DELETE /datasources/{id}/policies/{assignment_id}`
26+
- **Query audit log** — async logging of every proxied query
27+
- `GET /audit/queries` with pagination and filtering by user, datasource, date range
28+
- **Visibility-follows-access** — per-connection, per-user filtered `SessionContext`
29+
- Users only see tables and columns their policies permit
30+
- Policy changes take effect immediately without reconnect
31+
- **JSON/JSONB support**`json` and `jsonb` columns via DataFusion v52 and `datafusion-functions-json`
32+
- `->` / `->>` operators and JSON UDFs available in queries
33+
- Filter pushdown to upstream PostgreSQL for supported operators
34+
- **EXPLAIN support**`EXPLAIN <query>` returns a PostgreSQL-compatible single-column `QUERY PLAN` response
35+
- **Admin UI — Policies** — list, create, and edit policies with an obligation builder; inline enable/disable toggle
36+
- **Admin UI — Policy Assignments** — assign/remove policies per datasource with optional user scope and priority
37+
- **Admin UI — Query Audit** — paginated audit log with original query, rewritten query, and applied policy snapshots
38+
- **Demo e-commerce schema**`scripts/demo_ecommerce/` with schema, seed script, and example policies
2939
- **Docs**`docs/permission-system.md` (user guide) and `docs/permission-security-tests.md` (security test plan)
3040

41+
### Changed
42+
- **Arrow encoding** — migrated to `arrow-pg`; handler simplified; removed `arrow_conversion` and `sql_rewrite` modules
43+
44+
### Infrastructure
45+
- **CI/CD** — split into CI (tests on every push to `main`) and CD (publish + deploy on `v*` tag only)
46+
- Docker images tagged `X.Y.Z` and `X.Y`; deploy uses explicit version tag for prod traceability
47+
- `workflow_dispatch` added for manual redeployment of an existing version
48+
3149
## [0.3.0] - 2026-03-04
3250

3351
### Added

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

admin-ui/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "admin-ui",
33
"private": true,
4-
"version": "0.3.0",
4+
"version": "0.4.0",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",

migration/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "migration"
3-
version = "0.3.0"
4-
edition = "2021"
3+
version = "0.4.0"
4+
edition = "2024"
55

66
[dependencies]
77
sea-orm-migration = { version = "1", features = ["sqlx-sqlite", "sqlx-postgres", "runtime-tokio-rustls"] }

proxy/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "proxy"
3-
version = "0.3.0"
3+
version = "0.4.0"
44
edition = "2024"
55

66
[dependencies]

0 commit comments

Comments
 (0)