Skip to content

release: promote beta to main#1392

Merged
steilerDev merged 12 commits intomainfrom
beta
May 3, 2026
Merged

release: promote beta to main#1392
steilerDev merged 12 commits intomainfrom
beta

Conversation

@steilerDev
Copy link
Copy Markdown
Owner

Release Summary

Budget data integrity, UX cleanup, and a new backup feature guide. This release tightens VAT semantics in the budget engine, removes the redundant Budget Health hero card, fixes printed Budget Overview output, and ships user documentation for the built-in backup feature.

Changes

Features

Fixes

Docs

  • Backup guide (docs: add backup guide and configuration reference #1386): new user guide covering the built-in backup feature — what gets archived, Docker volume mount setup, scheduled backups via BACKUP_CADENCE, retention policy, and restore steps. BACKUP_* env vars added to the configuration reference.

Chores / Refactoring

  • Migration 0031 backfills NULL includes_vat -> true, recreates the budget tables with NOT NULL and the original CHECK(planned_amount >= 0) and CHECK(confidence IN (...)) constraints, and uses explicit column lists in INSERT...SELECT for safety.

Change Inventory

Backend (server/, shared/)

  • server/src/db/migrations/0031_includes_vat_not_null.sql — new migration
  • server/src/db/schema.tsincludesVat.notNull().default(true) on both budget tables
  • server/src/routes/workItemBudgets.ts, householdItemBudgets.ts — JSON schema updates
  • server/src/services/budgetOverviewService.ts, householdItemBudgetService.ts, workItemBudgetService.ts, shared/budgetServiceFactory.ts — service converter updates (?? true fallback) and aligned VAT multiplier for direct pricing
  • shared/src/types/budget.tsincludesVat is now boolean (not boolean | null)
  • Test fixtures and unit tests updated across budget services and routes

Frontend (client/)

  • client/src/pages/BudgetOverviewPage/ — hero card removed; page, tests, and CSS pruned
  • client/src/components/CostBreakdownTable/CostBreakdownTable.module.css — print-mode rules for source badge label/dot
  • client/src/components/budget/BudgetSection.tsx, useBudgetSection.ts — VAT default state changes
  • client/src/i18n/{en,de}/budget.json — removed hero-card-only keys
  • Frontend tests updated to reflect hero card removal and VAT defaults

E2E Tests (e2e/)

  • e2e/tests/budget/budget-overview-no-hero-card.spec.ts — new smoke test for hero card removal and printout source badge presence
  • e2e/tests/budget/budget-overview.spec.ts, budget-overview-print.spec.ts, budget-source-filter.spec.ts — hero card assertions removed
  • e2e/pages/BudgetOverviewPage.tswaitForLoaded() now races on costBreakdownCard

Docs / Config

  • docs/src/guides/backup/index.md — new backup guide
  • docs/src/getting-started/configuration.mdBACKUP_* env vars added
  • docs/src/guides/budget/budget-overview.md — broken links fixed
  • docs/docusaurus.config.js, docs/sidebars.js — sidebar updates for the new guide

Manual Validation Checklist

  • Budget Overview page — open /budget. Confirm there is no hero card / metrics row / stacked bar at the top; the page jumps directly into the Cost Breakdown Table (or empty state if no data).
  • Printed Budget Overview — open /budget, expand at least one work item to a budget-line level, then File -> Print (or Cmd/Ctrl-P). In the print preview, confirm the source-badge label is clearly visible next to each budget line that has a source (no invisible colored dots).
  • Direct pricing VAT — create a new budget line in Direct pricing mode with VAT enabled (Includes VAT = true) and a known net amount. Save and verify the stored / displayed gross amount equals net × 1.19.
  • Direct pricing without VAT — create a budget line in Direct pricing mode with Includes VAT = false. Verify the stored amount equals the entered amount (no multiplier applied).
  • Migration — bring up an instance with an existing database and confirm migration 0031 runs cleanly: existing rows with NULL includes_vat are backfilled to true, and inserting a new budget line without specifying includes_vat defaults to true.
  • Backup guide — open the docs site, navigate to Guides -> Backup. Confirm the page renders end-to-end (what's archived, Docker volume mount, scheduled backups, retention, restore). Verify BACKUP_DIR, BACKUP_CADENCE, BACKUP_RETENTION are present in the configuration reference.
  • Budget Overview related links — on the Budget Overview docs page, click the Work Items and Household Items related links. Confirm both navigate to valid index pages (no 404s).

Testing

  • DockerHub beta image: `docker pull steilerdev/cornerstone:beta`
  • PR-specific image: will be tagged after CI completes as `docker pull steilerdev/cornerstone:pr-`

steilerDev and others added 7 commits April 29, 2026 09:05
The work-items and household-items links need to point to the index
pages, not a non-existent /overview sub-path.

Co-authored-by: Frank Steiler <frank@steiler.de>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…s pricing modes (#1385)

* feat(budget): enforce includes_vat NOT NULL, align VAT behavior across pricing modes

- Add migration 0031 to backfill NULL includes_vat → true and enforce NOT NULL at DB level
- Update Drizzle schema: includesVat is now .notNull().default(true) on both budget tables
- Change shared types: BaseBudgetLine.includesVat is now boolean (not boolean | null)
- Update JSON schemas in workItemBudgets and householdItemBudgets routes
- Fix service converters to use ?? true fallback instead of ?? null
- Align direct pricing mode with unit pricing: both modes now apply the VAT multiplier
  (1 or 1.19) before storing plannedAmount, so the stored value is always gross (VAT-inclusive)
- Default includesVat form state to true in both WorkItemDetailPage and HouseholdItemDetailPage
- Update all test fixtures to use includesVat: true (was null)

Fixes: direct pricing VAT behavior was inconsistent with unit pricing mode.

Co-Authored-By: Claude backend-developer (claude-haiku-4-5-20251001) <noreply@anthropic.com>
Co-Authored-By: Claude frontend-developer (claude-haiku-4-5-20251001) <noreply@anthropic.com>
Co-Authored-By: Claude qa-integration-tester (claude-sonnet-4-6) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(budget): restore CHECK constraints in migration 0031 table recreation

Migration 0031 recreated work_item_budgets and household_item_budgets without
the original CHECK(planned_amount >= 0) and CHECK(confidence IN (...)) constraints,
causing tests that expect these constraints to be enforced to fail. Also switch
to explicit column lists in INSERT...SELECT to be safe for existing databases
where column order differs from the new table definition.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Frank Steiler <frank@steiler.de>
Co-authored-by: Claude backend-developer (claude-haiku-4-5-20251001) <noreply@anthropic.com>
Documents the built-in backup feature: what gets archived, Docker
volume mount setup, scheduled backups via BACKUP_CADENCE, retention
policy, and restore steps. Also adds BACKUP_* env vars to the
configuration reference with a cross-link to the new guide.

Co-authored-by: Frank Steiler <frank@steiler.de>
Co-authored-by: Claude <docs-writer> <noreply@anthropic.com>
…1390) (#1391)

* test(e2e): add smoke tests for budget overview cleanup (#1389/#1390)

Add budget-overview-no-hero-card.spec.ts verifying that the hero card
(<section aria-label="Budget overview">) and its CSS class are absent
after removal in #1389, the Add button and Cost Breakdown Table are
still rendered, and the source-badge label is present in the DOM for
budget lines with a source assignment (#1390).

Update BudgetOverviewPage POM's waitForLoaded() to race on
costBreakdownCard instead of heroCard, which no longer exists. Remove
heroCard assertions from budget-overview.spec.ts, budget-overview-
print.spec.ts, and budget-source-filter.spec.ts that would fail after
the hero card removal.

Fixes #1389
Fixes #1390

Co-Authored-By: Claude e2e-test-engineer (Sonnet 4.6) <noreply@anthropic.com>

* test(budget): prune hero-card tests and add print-badge DOM test (#1389/#1390)

Remove 27 test cases that covered the removed hero card section
(BudgetBar, key metrics row, remaining detail panel, currency formatting,
Expected Payback metric, payback-adjusted remaining, subsidy payback detail
panel, mobile bar detail, and hero card footer cleanup describe blocks).
Keep the one hero-card it case in the empty state block.

Add describe('source badge print visibility (#1390)') to
CostBreakdownTable.test.tsx: expands a work item to budget-line level
and asserts both .sourceBadgeDot (aria-hidden="true") and .sourceBadgeLabel
(containing a child with aria-label) are present in the DOM — the exact
structure that the new @media print CSS rules in
CostBreakdownTable.module.css depend on.

Fixes #1389
Fixes #1390

Co-Authored-By: Claude qa-integration-tester (Sonnet 4.5) <noreply@anthropic.com>

* fix(budget): remove hero card and fix printout source badge (#1389/#1390)

Remove the Budget Health hero card from the Budget Overview page,
including all helpers, state, computed values, CSS classes, unused
imports, and i18n keys that were exclusively used by it. The page now
goes from PageLayout straight into the empty-state and Cost Breakdown
Table without the metrics row, stacked bar, hover tooltip, and remaining
detail panel.

Fix the Budget Overview printout: print viewports map to ~600-720px,
which triggers the mobile breakpoint and hides the source badge label
in CostBreakdownTable, leaving only an invisible colored dot. Add
print-mode rules that force the source-badge label visible and the dot
hidden, with a border-based legibility treatment so the label prints
without depending on background colors.

Fixes #1389
Fixes #1390

Co-Authored-By: Claude dev-team-lead (Sonnet 4.6) <noreply@anthropic.com>
Co-Authored-By: Claude frontend-developer (Haiku 4.5) <noreply@anthropic.com>
Co-Authored-By: Claude translator (Sonnet 4.6) <noreply@anthropic.com>
Co-Authored-By: Claude e2e-test-engineer (Sonnet 4.6) <noreply@anthropic.com>

---------

Co-authored-by: Frank Steiler <frank@steiler.de>
Co-authored-by: Claude e2e-test-engineer (Sonnet 4.6) <noreply@anthropic.com>
@steilerDev steilerDev closed this May 2, 2026
@steilerDev steilerDev reopened this May 2, 2026
@steilerDev steilerDev enabled auto-merge May 3, 2026 09:28
@steilerDev steilerDev disabled auto-merge May 3, 2026 09:28
steilerDev and others added 2 commits May 3, 2026 11:49
* chore: retrigger promotion CI

The auto-fix bot's [skip ci] commit on top of beta blocked all
pull_request workflows for promotion PR #1392. This empty no-op
commit advances the beta head SHA so Quality Gates and E2E Gates
can run on the promotion PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: append newline to test pull_request event trigger

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Frank Steiler <frank@steiler.de>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add a trailing newline to README to advance the beta SHA via a clean
synchronize event. The previous trigger commit accidentally included
the directive that suppresses CI in its body, which suppressed all
workflow runs for the squash-merged commit on beta.

Co-authored-by: Frank Steiler <frank@steiler.de>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 3, 2026

🎉 This PR is included in version 2.5.0-beta.5 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Append a trailing newline to docs/src/intro.md to advance the beta
SHA via a clean synchronize event for the promotion PR. The docs
directory is ignored by Prettier and ESLint, so the auto-fix bot
will not produce a follow-up commit on top.

Co-authored-by: Frank Steiler <frank@steiler.de>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 3, 2026

🎉 This PR is included in version 2.5.0-beta.6 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sync the docs site, README, and release summary with what's actually
shipping on beta.

- Rewrite Budget Overview guide to match the post-hero-card layout: the
  page now goes straight from the title bar into the Cost Breakdown
  Table. Removes the stale Summary Tiles and Remaining Budget
  Perspectives sections; the Min / Avg / Max perspective toggle and
  Available Funds row are now described in their actual location
  (inside the breakdown table). Add a print-mode note about the
  source-name border treatment landing on printouts.
- Add a VAT Handling section to Work Item Budgets covering the
  always-gross-stored semantics and the unified behavior across direct
  and unit pricing modes.
- Add the missing PAPERLESS_FILTER_TAG row to the Configuration
  reference table.
- Update README Quick Start to mount a backup volume and point at the
  new Backups guide.
- Replace RELEASE_SUMMARY.md with v2.5.0 content covering Backup &
  Restore (#1386), VAT alignment (#1385), the Budget Overview hero
  removal (#1389), the printout source-name fix (#1390), and the
  related-pages link fix (#1384).

Co-authored-by: Frank Steiler <frank@steiler.de>
Co-authored-by: Claude <docs-writer> <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 3, 2026

🎉 This PR is included in version 2.5.0-beta.7 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@steilerDev steilerDev temporarily deployed to dockerhub-beta May 3, 2026 11:18 — with GitHub Actions Inactive
@steilerDev steilerDev merged commit a3c7d84 into main May 3, 2026
43 checks passed
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 3, 2026

🎉 This PR is included in version 2.5.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant