From 753a95ee77b87a0720f8d9e1f2a7129cec873796 Mon Sep 17 00:00:00 2001 From: emnl51 Date: Fri, 4 Sep 2026 21:25:52 +0200 Subject: [PATCH 1/5] Bake release version independently of runtime env --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1c6a9eb..8010409 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ ARG APP_VERSION ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ - APP_VERSION=${APP_VERSION} + BERT_BUILD_VERSION=${APP_VERSION} WORKDIR /app COPY requirements.txt . From 98376fa4a58b3f8971cc599c326a81ee2c484e3d Mon Sep 17 00:00:00 2001 From: emnl51 Date: Fri, 4 Sep 2026 21:25:54 +0200 Subject: [PATCH 2/5] Prefer the baked container release version --- app/version.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/version.py b/app/version.py index 2779f2c..33aad4c 100644 --- a/app/version.py +++ b/app/version.py @@ -2,4 +2,6 @@ DEFAULT_VERSION = "17.2.2" -VERSION = (os.getenv("APP_VERSION") or DEFAULT_VERSION).removeprefix("v") +VERSION = ( + os.getenv("BERT_BUILD_VERSION") or os.getenv("APP_VERSION") or DEFAULT_VERSION +).removeprefix("v") From ef013d1a6e2c424ada820c6ba9ac45b11d79c5ef Mon Sep 17 00:00:00 2001 From: emnl51 Date: Fri, 4 Sep 2026 21:25:55 +0200 Subject: [PATCH 3/5] Cover stale runtime version overrides --- tests/test_release_container.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_release_container.py b/tests/test_release_container.py index 45d1b37..b1fbd48 100644 --- a/tests/test_release_container.py +++ b/tests/test_release_container.py @@ -26,7 +26,7 @@ def test_release_workflow_uses_release_tag_as_application_version(): def test_container_exposes_release_version_to_application(): dockerfile = Path("Dockerfile").read_text(encoding="utf-8") assert "ARG APP_VERSION" in dockerfile - assert "APP_VERSION=${APP_VERSION}" in dockerfile + assert "BERT_BUILD_VERSION=${APP_VERSION}" in dockerfile def test_application_version_uses_release_build_version(monkeypatch): @@ -36,9 +36,18 @@ def test_application_version_uses_release_build_version(monkeypatch): assert runpy.run_path("app/version.py")["VERSION"] == "23.4.5" +def test_baked_release_version_wins_over_stale_runtime_override(monkeypatch): + import runpy + + monkeypatch.setenv("BERT_BUILD_VERSION", "v24.0.0") + monkeypatch.setenv("APP_VERSION", "v19.1.3") + assert runpy.run_path("app/version.py")["VERSION"] == "24.0.0" + + def test_application_version_keeps_source_fallback(monkeypatch): import runpy + monkeypatch.delenv("BERT_BUILD_VERSION", raising=False) monkeypatch.delenv("APP_VERSION", raising=False) assert runpy.run_path("app/version.py")["VERSION"] == "17.2.2" From d9145e0241434541f6a3ac1b90ffe9c4528be26d Mon Sep 17 00:00:00 2001 From: emnl51 Date: Fri, 4 Sep 2026 21:25:56 +0200 Subject: [PATCH 4/5] Document release version ownership --- README.md | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index a568629..6ac1ab5 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,10 @@ ADMIN_PASSWORD=replace-with-a-long-unique-password APP_SECRET_KEY=replace-with-the-generated-secret ``` +Do not set `APP_VERSION` in `.env`. Release versions are embedded into the +container image at build time; a runtime override can otherwise make the UI +report a stale version. + Start Bert: ```bash @@ -152,24 +156,6 @@ After signing in as the administrator: 4. Configure personal Telegram or email notifications in the user workspace. 5. Configure account-activation email under **Administration → System Email**. -The Search Profile editor keeps the everyday choices in **Profile essentials**: target role level, role families, -working arrangements, German and English ability, preferred weekly hours, availability, and provider-query -languages. Saving automatically adds generated bilingual suggestions while preserving existing custom terms. -Raw thresholds, exact query lists, allowlists, blocklists, and scoring JSON remain available under the collapsed -**Advanced matching settings** section. - -Role level is an eligibility boundary rather than a score boost. A technician profile rejects engineering, -management, and student-only titles; an engineering profile rejects technician-only and student titles; a working- -student profile requires an explicit student-role signal. Weekly hours and availability act as labeled preferences -for Search Jobs in preference mode and as exclusions in strict working-time mode. - -Part-time and working-student profiles always require a confirmed work type after Bert inspects the job title, -available description, hours/workload text, and provider metadata. A vacancy that still shows **Work time unknown** is -excluded from review and notifications even when its Search Job uses preference mode. - -Profiles referenced by Search Jobs cannot be deleted. Bert reports the linked Search Job names so they can be -reassigned or removed first; profile-specific scores are deleted only after those references are resolved. - System email and job-notification email are separate. System email settings can be managed in the admin UI; the `SYSTEM_SMTP_*` values in `.env` remain available as fallback defaults. ## Candidate Profiles and CV Match From a72494201c2d848106222d9fe1e3613eee194f4a Mon Sep 17 00:00:00 2001 From: emnl51 Date: Fri, 4 Sep 2026 21:26:47 +0200 Subject: [PATCH 5/5] Preserve current deployment documentation --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 6ac1ab5..faaa6ed 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,24 @@ After signing in as the administrator: 4. Configure personal Telegram or email notifications in the user workspace. 5. Configure account-activation email under **Administration → System Email**. +The Search Profile editor keeps the everyday choices in **Profile essentials**: target role level, role families, +working arrangements, German and English ability, preferred weekly hours, availability, and provider-query +languages. Saving automatically adds generated bilingual suggestions while preserving existing custom terms. +Raw thresholds, exact query lists, allowlists, blocklists, and scoring JSON remain available under the collapsed +**Advanced matching settings** section. + +Role level is an eligibility boundary rather than a score boost. A technician profile rejects engineering, +management, and student-only titles; an engineering profile rejects technician-only and student titles; a working- +student profile requires an explicit student-role signal. Weekly hours and availability act as labeled preferences +for Search Jobs in preference mode and as exclusions in strict working-time mode. + +Part-time and working-student profiles always require a confirmed work type after Bert inspects the job title, +available description, hours/workload text, and provider metadata. A vacancy that still shows **Work time unknown** is +excluded from review and notifications even when its Search Job uses preference mode. + +Profiles referenced by Search Jobs cannot be deleted. Bert reports the linked Search Job names so they can be +reassigned or removed first; profile-specific scores are deleted only after those references are resolved. + System email and job-notification email are separate. System email settings can be managed in the admin UI; the `SYSTEM_SMTP_*` values in `.env` remain available as fallback defaults. ## Candidate Profiles and CV Match