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 .template-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.5.5
1.6.0
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Versioning: [SemVer](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [1.6.0] — 2026-08-23

### Changed
- `app_core` is now a STATIC library (was INTERFACE) and the billing module
is de-inlined into it — non-template bodies of `billing/Wallet`,
Expand Down Expand Up @@ -66,6 +68,9 @@ Versioning: [SemVer](https://semver.org/spec/v2.0.0.html).
shared helpers, dead includes dropped, hot-path copies removed (JWT claims
moved not copied, request bodies handled as views). 49 files, behavior
bit-for-bit.
- Dead template surface resolved: undocumented unused Auth/Messaging helpers removed; `CrudBase` owned-templates, `Database::execute_transaction`/`execute_write_idempotent` and friends are now instantiated by tests (which immediately exposed that the owned-templates required the templated `from_row` convention); `Validation::uuid` reuses the single UUID implementation.
- The app_core de-inline is complete: 22 more header/body pairs (all controllers, email, security, storage, observability, cache, Migrations), headers down 62%; the email↔jobs include cycle is gone from the header plane.
- CI sanitizers (ASan+UBSan and TSan) now cover the integration+api buckets against real Postgres/Redis, not just unit — the first instrumented run caught and fixed a latent heap-use-after-free (range-for over a temporary json).

### Added
- Billing SPA pages — `/billing` (wallet, packages, top-up), `/billing/return`,
Expand Down Expand Up @@ -108,6 +113,21 @@ Versioning: [SemVer](https://semver.org/spec/v2.0.0.html).
adjustment notice) routed through the generic `email.send` job —
delivery can never affect the money path. Full OpenAPI coverage and
api/integration test suites included.
- `Billing::spend` — idempotent credit spending with a partial unique reference index (migration 009) and typed `InsufficientCredits`; the wallet test suite gains a randomized 300-op invariant check (`SUM(ledger) == cached balance` after every step).
- Changelog fragments: a PR now records its changelog entry as its own file
`changelog.d/<topic>.<type>.md` (type ∈ added|changed|fixed|removed|security,
format: `changelog.d/README.md`) instead of competing for the same
`[Unreleased]` lines — `scripts/release.sh` folds the fragments in and
retitles `[Unreleased]` itself, `./scripts/assemble-changelog.sh --check`
gates fragment format in CI (fragments stay optional, direct `[Unreleased]`
edits remain legal), and the gate selftest grows to 20 planted breakages.
- `.devcontainer` runs on the prebuilt `builder:cache` image — the native `make test-local` inner loop works minutes after opening (warm re-run ~7 s). `Makefile` build jobs are now RAM-capped (`JOBS`), fixing OOM kills on 8 GiB Docker VMs.
- The e2e suite validates every real JSON response against the OpenAPI schemas (dependency-free subset validator + committed spec JSON with a freshness hash); the first pass fixed the spec's missing `status` field, three long-standing YAML flow-map errors, four undocumented statuses and the absent `Post` schema.
- Nightly libFuzzer runs over the four byte-facing parsers (traceparent, decimal-cents, config placeholder expansion, path matching) with round-trip oracles and a growing cached corpus; harnesses are std-only by design — no vcpkg needed.
- `init-project.sh --with-orgs` (installs the multi-tenancy kit post-rename) and `--minimal` (strips the content module via `remove-content-module.sh` with the full gate battery green on the cut tree); self-verification fixed on pristine trees (#57).
- Opt-in transactional outbox (`Outbox::enqueue` in the caller's transaction + `SKIP LOCKED` drain into the jobs queue, migration 010, `outbox.drain_interval_sec` default off) for events whose loss after commit is unacceptable; decision guide in CONVENTIONS gotcha 20.
- Releases ship SPDX SBOMs and cosign keyless signatures/attestations for all three images; a nightly guard re-hashes the pinned Swagger UI assets against the CDN, and Renovate watches the pin without automerging it.
- `scripts/sync-upstream.sh` + a `.template-version` stamp: degit forks with no shared git history can pull template releases as three-way patches with honest conflict markers (`.template-sync-ignore` excludes renamed paths).

## [1.5.5] — 2026-08-21

Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.21)
project(cpp_api_template VERSION 1.5.5 LANGUAGES CXX)
project(cpp_api_template VERSION 1.6.0 LANGUAGES CXX)

# Release builds stamp the git tag in instead of the baked value above:
# docker/Dockerfile declares ARG APP_VERSION and forwards it as
Expand Down
1 change: 0 additions & 1 deletion changelog.d/billing-spend.added.md

This file was deleted.

7 changes: 0 additions & 7 deletions changelog.d/changelog-fragments.added.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/dead-surface.changed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/deinline-rest.changed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/devcontainer.added.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/e2e-openapi.added.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/fuzzing.added.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/init-options.added.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/outbox.added.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/sanitizers-integration.changed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/supply-chain.added.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/sync-upstream.added.md

This file was deleted.

2 changes: 1 addition & 1 deletion helm/cpp-api/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ name: cpp-api
description: A Helm chart for deploying the C++ REST API application
type: application
version: 0.1.0
appVersion: "1.5.5"
appVersion: "1.6.0"
maintainers:
- name: cpp-api-team
2 changes: 1 addition & 1 deletion helm/cpp-env/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description: >-
and Jaeger — auto-configured, with *.<env>.example.com ingress.
type: application
version: 0.1.0
appVersion: "1.5.5"
appVersion: "1.6.0"
maintainers:
- name: cpp-api-team
# Subcharts are wired entirely from this chart's values (fixed in-namespace
Expand Down
6 changes: 3 additions & 3 deletions helm/cpp-env/values-demo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ demoReset:

cpp-api:
image:
tag: "1.5.5" # pinned known-good amd64 build (unprefixed — release.yml strips the v); bump when a newer one ships
tag: "1.6.0" # pinned known-good amd64 build (unprefixed — release.yml strips the v); bump when a newer one ships
externalKafka:
enabled: false
externalDatabase:
Expand Down Expand Up @@ -114,7 +114,7 @@ cpp-api:

cpp-worker:
image:
tag: "1.5.5"
tag: "1.6.0"
externalDatabase:
host: postgresql-rw.db.svc.cluster.local
name: cpp-api-demo
Expand Down Expand Up @@ -143,7 +143,7 @@ cpp-worker:

cpp-frontend:
image:
tag: "1.5.5"
tag: "1.6.0"
# Admin "Open trace" deep-links into the cluster Grafana (Tempo datasource
# uid `tempo`) — traces are owner-visible behind Grafana auth, not public.
traceUi: "https://grafana.tarassov.me/explore?schemaVersion=1&panes=%7B%22a%22%3A%7B%22datasource%22%3A%22tempo%22%2C%22queries%22%3A%5B%7B%22refId%22%3A%22A%22%2C%22query%22%3A%22{traceId}%22%2C%22queryType%22%3A%22traceql%22%7D%5D%7D%7D&orgId=1"
6 changes: 3 additions & 3 deletions helm/cpp-env/values-stage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ baseDomain: tarassov.me

cpp-api:
image:
tag: "1.5.5"
tag: "1.6.0"

cpp-frontend:
image:
tag: "1.5.5"
tag: "1.6.0"

cpp-worker:
image:
tag: "1.5.5"
tag: "1.6.0"
app:
baseUrl: https://app.stage.tarassov.me
worker:
Expand Down
6 changes: 3 additions & 3 deletions helm/cpp-env/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ cpp-api:
# NOTE: release.yml strips the tag's leading v — GHCR carries 1.5.3, not
# v1.5.3. A v-prefixed pin here pulls a tag that does not exist
# (downstream bump: cyber-accountant 80996a7).
tag: "1.5.5"
tag: "1.6.0"
pullPolicy: Always
nodeSelector:
kubernetes.io/arch: amd64
Expand Down Expand Up @@ -162,7 +162,7 @@ cpp-worker:
replicaCount: 1
image:
repository: ghcr.io/moveeeax/cpp-rapid-rest-template-worker
tag: "1.5.5" # unprefixed — see the cpp-api image note
tag: "1.6.0" # unprefixed — see the cpp-api image note
pullPolicy: Always
nodeSelector:
kubernetes.io/arch: amd64
Expand Down Expand Up @@ -217,7 +217,7 @@ cpp-frontend:
replicaCount: 1
image:
repository: ghcr.io/moveeeax/cpp-rapid-rest-template-frontend
tag: "1.5.5" # unprefixed — see the cpp-api image note
tag: "1.6.0" # unprefixed — see the cpp-api image note
pullPolicy: Always
nodeSelector:
kubernetes.io/arch: amd64
Expand Down
2 changes: 1 addition & 1 deletion helm/cpp-frontend/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ name: cpp-frontend
description: A Helm chart for the C++ REST template React SPA (nginx + /api proxy)
type: application
version: 0.1.0
appVersion: "1.5.5"
appVersion: "1.6.0"
maintainers:
- name: cpp-api-team
2 changes: 1 addition & 1 deletion helm/cpp-worker/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ name: cpp-worker
description: A Helm chart for deploying the C++ background job worker
type: application
version: 0.1.0
appVersion: "1.5.5"
appVersion: "1.6.0"
maintainers:
- name: cpp-api-team
Loading