diff --git a/changelog.d/billing-spend.added.md b/changelog.d/billing-spend.added.md new file mode 100644 index 0000000..02e81a0 --- /dev/null +++ b/changelog.d/billing-spend.added.md @@ -0,0 +1 @@ +`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). diff --git a/changelog.d/dead-surface.changed.md b/changelog.d/dead-surface.changed.md new file mode 100644 index 0000000..efa3915 --- /dev/null +++ b/changelog.d/dead-surface.changed.md @@ -0,0 +1 @@ +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. diff --git a/changelog.d/deinline-rest.changed.md b/changelog.d/deinline-rest.changed.md new file mode 100644 index 0000000..0b72ff7 --- /dev/null +++ b/changelog.d/deinline-rest.changed.md @@ -0,0 +1 @@ +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. diff --git a/changelog.d/devcontainer.added.md b/changelog.d/devcontainer.added.md new file mode 100644 index 0000000..217ec1b --- /dev/null +++ b/changelog.d/devcontainer.added.md @@ -0,0 +1 @@ +`.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. diff --git a/changelog.d/e2e-openapi.added.md b/changelog.d/e2e-openapi.added.md new file mode 100644 index 0000000..64de2aa --- /dev/null +++ b/changelog.d/e2e-openapi.added.md @@ -0,0 +1 @@ +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. diff --git a/changelog.d/fuzzing.added.md b/changelog.d/fuzzing.added.md new file mode 100644 index 0000000..3e2069c --- /dev/null +++ b/changelog.d/fuzzing.added.md @@ -0,0 +1 @@ +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. diff --git a/changelog.d/init-options.added.md b/changelog.d/init-options.added.md new file mode 100644 index 0000000..b74cfa9 --- /dev/null +++ b/changelog.d/init-options.added.md @@ -0,0 +1 @@ +`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). diff --git a/changelog.d/outbox.added.md b/changelog.d/outbox.added.md new file mode 100644 index 0000000..3ed8969 --- /dev/null +++ b/changelog.d/outbox.added.md @@ -0,0 +1 @@ +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. diff --git a/changelog.d/sanitizers-integration.changed.md b/changelog.d/sanitizers-integration.changed.md new file mode 100644 index 0000000..3fc126c --- /dev/null +++ b/changelog.d/sanitizers-integration.changed.md @@ -0,0 +1 @@ +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). diff --git a/changelog.d/supply-chain.added.md b/changelog.d/supply-chain.added.md new file mode 100644 index 0000000..e5bcc4a --- /dev/null +++ b/changelog.d/supply-chain.added.md @@ -0,0 +1 @@ +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. diff --git a/changelog.d/sync-upstream.added.md b/changelog.d/sync-upstream.added.md new file mode 100644 index 0000000..eaa1b58 --- /dev/null +++ b/changelog.d/sync-upstream.added.md @@ -0,0 +1 @@ +`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).