fix(schedule): call dated overrides schedule exceptions #175

Merged
gabogg merged 4 commits from chore/schedule-exception-naming into master 2026-09-28 17:20:40 +00:00
Owner

Summary

Implements #108: call dated schedule overrides Schedule Exceptions in the admin UI and documentation, with English and Spanish wording for holiday hours, special hours, and exceptional closures. The existing /api/occupancy/holidays route and storage names remain compatible.

This is a prerequisite of #170 (historical-flow curation, #163). #161's draft builds on this branch and handles holiday identity, events, and analytics separately.

Architectural impact

  • Updated admin calendar, neighboring settings labels, status messages, and live occupancy wording in English and Spanish. Renamed frontend translation keys to match the schedule-exception term and kept uppercase control styling.
  • Defined Schedule Exception and Holiday separately in CONTEXT.md. Updated Swagger summaries, descriptions, and schema field descriptions while preserving the legacy API names.
  • No route, payload shape, storage, or analytics behavior changes.

Verification

  • English/Spanish translation coverage and admin static-asset bindings updated.
  • Ruff lint and format checks passed.
  • python3 scripts/check_docs.py passed (38 Markdown files, 76 HTTP operations).
  • Full pytest -q passed: 452 tests after first-pass fixes.
  • Commit-time pre-commit hooks passed on all commits, including the first-pass fix commit (fdfad26).

Review status

  • First pass: addressed all Standards and Spec findings in fdfad26; details in the follow-up comment.
  • Second review pass requested on the updated branch.

Checklist

  • Implement #108 (5322763), resolve the master conflict (4034c42), and push both commits.
  • Review passes per docs/standards/git-and-workflow.md.

Issues closed on merge

Closes #108

## Summary Implements #108: call dated schedule overrides **Schedule Exceptions** in the admin UI and documentation, with English and Spanish wording for holiday hours, special hours, and exceptional closures. The existing `/api/occupancy/holidays` route and storage names remain compatible. This is a prerequisite of #170 (historical-flow curation, #163). #161's draft builds on this branch and handles holiday identity, events, and analytics separately. ## Architectural impact - Updated admin calendar, neighboring settings labels, status messages, and live occupancy wording in English and Spanish. Renamed frontend translation keys to match the schedule-exception term and kept uppercase control styling. - Defined Schedule Exception and Holiday separately in `CONTEXT.md`. Updated Swagger summaries, descriptions, and schema field descriptions while preserving the legacy API names. - No route, payload shape, storage, or analytics behavior changes. ## Verification - [x] English/Spanish translation coverage and admin static-asset bindings updated. - [x] Ruff lint and format checks passed. - [x] `python3 scripts/check_docs.py` passed (38 Markdown files, 76 HTTP operations). - [x] Full `pytest -q` passed: 452 tests after first-pass fixes. - [x] Commit-time pre-commit hooks passed on all commits, including the first-pass fix commit (`fdfad26`). ## Review status - [x] First pass: addressed all Standards and Spec findings in `fdfad26`; details in the follow-up comment. - [x] Second review pass requested on the updated branch. ## Checklist - [x] Implement #108 (`5322763`), resolve the `master` conflict (`4034c42`), and push both commits. - [ ] Review passes per `docs/standards/git-and-workflow.md`. ## Issues closed on merge Closes #108
chore: open draft for #108 (call dated overrides schedule exceptions)
All checks were successful
CI / lint-and-test (pull_request) Successful in 2m11s
8537247eae
Placeholder commit so the draft PR exists before implementation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chore(schedule): label dated overrides as schedule exceptions
All checks were successful
CI / lint-and-test (pull_request) Successful in 2m15s
5322763cf6
gabogg changed title from WIP: chore(schedule): call dated overrides schedule exceptions to chore(schedule): call dated overrides schedule exceptions 2026-09-28 13:58:55 +00:00
Merge remote-tracking branch 'origin/master' into chore/schedule-exception-naming
All checks were successful
CI / lint-and-test (pull_request) Successful in 2m26s
4034c4216e
# Conflicts:
#	docs/api/README.md
Author
Owner

Review pass 1: Standards + Spec

Diff reviewed: origin/master...HEAD (base fb89880). The spec is #108, specifically its Confirmed triage resolution — 2026-09-27. The main findings were checked against the code. Under the first-pass policy, every item below should be fixed in this PR.

Standards

Hard violations

  1. The new tab and button labels lose their uppercase styling. docs/standards/ui-design-guidelines.md §3.2 says labels and states use standard uppercase.
    • When translations are applied (app/static/js/i18n.js:2289), el.textContent = t(key) replaces the uppercase fallback in the HTML with a mixed-case string. The parent .multiplier-step-btn sets no text-transform.
    • app/static/index.html:758 renders as [ Schedule Exceptions ] / [ Excepciones de Horario ], next to the hardcoded [ SCHEDULES ] and [ CAMERAS ].
    • app/static/index.html:812 renders as [ + Add Exception ] / Agregar Excepción.
    • Lines 723 and 727 are fine (they have the uppercase class), and line 689 is fine (the strings are already all caps).
    • Fix: add uppercase to these spans or buttons, or make the strings all caps.
  2. Wrong branch and commit type. docs/standards/git-and-workflow.md §1 limits chore/ to dependency updates, CI workflows and tool configs. This PR changes user-visible UI text and the glossary, so fix/ or refactor/ fits better. This is minor; at least use the right type in the merge title.

Judgement calls (code smells)

  • Unclear names: several frontend i18n keys keep "holiday" names but now hold "exception" text: occupancy.subtabHolidays, addHolidayBtn, holidaysCountBadge, scheduledHolidaysTitle, defaultHolidayHoursTitle. common.holiday now means "Schedule Exception" (i18n.js:583/1675), and app.js:1867 reads it. The routes and holiday_* fields have a compatibility reason to keep their names. These keys are internal to the frontend and don't, and docs/agents/domain.md asks code to use the glossary's terms.
  • Inconsistent naming: the new key exceptionMinEntriesLabel (i18n.js:127/1218) uses the new term, while its siblings holidayOpenLabel/holidayCloseLabel keep the old one.
  • Partial localization: only one of the three subtab buttons, and only one of the eight trust-config labels (index.html:681-700), are translated. The panel is now partly English and partly Spanish when switched to Spanish.

Bugs and nits

  • EN/ES mismatch: English scheduledHolidaysTitle: "Scheduled Exceptions" (i18n.js:1249) drops "Schedule", while Spanish says "Excepciones de Horario Programadas". The Spanish matches the glossary term.
  • API docs table header: in docs/api/README.md, only the Occupancy table's header changes from "OpenAPI summary" to "Description". The other tables (:19, :102, …) keep "OpenAPI summary". See Spec (a)1.
  • Test gap: tests/test_i18n.py doesn't check that the translated labels still render uppercase, which is why finding 1 wasn't caught.
  • Placeholder casing: index.html:804 shows [ NAME ] until translations load, then mixed case. This existed before this PR.

Spec

Nothing blocks the spec.

  • The admin UI, the EN/ES strings and CONTEXT.md now use "Schedule exceptions".
  • Routes, the table, fields and IDs are unchanged, as the spec requires ("Preserve existing API routes and storage names for compatibility").
  • The two new glossary entries (CONTEXT.md:116-121) match the resolution.

(a) Missing or partial

The spec line is: "Rename admin UI wording and documentation to Schedule exceptions".

  1. Swagger/OpenAPI documentation still says "holiday".
    • /docs builds its operation summaries from the function names: "Get Holidays Calendar", "Add Or Update Holiday", "Delete Holiday" (app/controllers/occupancy_controller.py:199-245).
    • The docstrings still say "List all registered holidays and special event dates" (:204), "add or update an upcoming holiday" (:226) and "delete a registered holiday" (:245).
    • The schema descriptions still say "Description/name of the holiday" and "Default holiday opening/closing time" (app/schemas/occupancy_models.py:327, 337, 340).
    • Setting summary=/description= and updating the docstrings changes no route. The docs/api/README.md Occupancy header can then go back to "OpenAPI summary".
  2. The live card label still uses holiday framing. It shows the schedule_label built in app/services/occupancy_service.py:298 as f"🎉 {h_name} (Cerrado)", with the default name "Feriado" (:289; also app/db/occupancy_repository.py:775). A renovation or emergency closure still gets a party emoji, even though this PR removed the emoji from the card title and badge. At minimum drop the emoji and use a neutral default name. The Spanish-only backend label overlaps with #73; defer that part to #73 if needed.

(b) Scope creep

  • Removing 🎉 from app.js:1867 and from the carousel.holidayOpen/holidayClosed strings follows from the rename, so it is in scope.
  • tests/test_i18n.py asserts statisticsDeck...legend.holiday === 'FERIADO'. This locks in a marker that #161 owns. It is harmless, but #161 may need to relax it.

(c) Implemented but questionable

  • The glossary contradicts the code. CONTEXT.md:113 (Usual Weekday Baseline) still says a day counts only if it "is not a holiday or Closed Day". The code excludes every dated exception (is_holiday=True on every row, occupancy_service.py:302). Under the new definitions a holiday and a schedule exception are different things, so the sentence no longer describes the code. Change it to "schedule exception", or keep it and add a pointer to #161, which owns baseline eligibility.
  • Edits with no visible effect: five edited i18n keys are never referenced in index.html or app.js: generalParamsAndHolidaysTitle, defaultHolidayHoursTitle, schedulesHolidaysAndCamerasTitle, scheduledHolidaysTitle, workingHoursTitle. The edits are consistent but change nothing on screen. Wire them up or leave them, but don't count them as coverage.

Summary:

  • Standards: 2 hard violations, 3 judgement calls, 4 nits. The worst is that the translated labels lose the required uppercase styling.
  • Spec: 2 missing or partial items, 2 questionable ones. The worst is that Swagger text and the backend 🎉 … (Cerrado) label still present exceptions as holidays.

🤖 Generated with Claude Code

## Review pass 1: Standards + Spec Diff reviewed: `origin/master...HEAD` (base `fb89880`). The spec is #108, specifically its *Confirmed triage resolution — 2026-09-27*. The main findings were checked against the code. Under the first-pass policy, every item below should be fixed in this PR. ## Standards ### Hard violations 1. **The new tab and button labels lose their uppercase styling.** `docs/standards/ui-design-guidelines.md` §3.2 says labels and states use standard uppercase. - When translations are applied (`app/static/js/i18n.js:2289`), `el.textContent = t(key)` replaces the uppercase fallback in the HTML with a mixed-case string. The parent `.multiplier-step-btn` sets no `text-transform`. - `app/static/index.html:758` renders as `[ Schedule Exceptions ]` / `[ Excepciones de Horario ]`, next to the hardcoded `[ SCHEDULES ]` and `[ CAMERAS ]`. - `app/static/index.html:812` renders as `[ + Add Exception ]` / `Agregar Excepción`. - Lines 723 and 727 are fine (they have the `uppercase` class), and line 689 is fine (the strings are already all caps). - **Fix:** add `uppercase` to these spans or buttons, or make the strings all caps. 2. **Wrong branch and commit type.** `docs/standards/git-and-workflow.md` §1 limits `chore/` to dependency updates, CI workflows and tool configs. This PR changes user-visible UI text and the glossary, so `fix/` or `refactor/` fits better. This is minor; at least use the right type in the merge title. ### Judgement calls (code smells) - **Unclear names:** several frontend i18n keys keep "holiday" names but now hold "exception" text: `occupancy.subtabHolidays`, `addHolidayBtn`, `holidaysCountBadge`, `scheduledHolidaysTitle`, `defaultHolidayHoursTitle`. `common.holiday` now means "Schedule Exception" (`i18n.js:583/1675`), and `app.js:1867` reads it. The routes and `holiday_*` fields have a compatibility reason to keep their names. These keys are internal to the frontend and don't, and `docs/agents/domain.md` asks code to use the glossary's terms. - **Inconsistent naming:** the new key `exceptionMinEntriesLabel` (`i18n.js:127/1218`) uses the new term, while its siblings `holidayOpenLabel`/`holidayCloseLabel` keep the old one. - **Partial localization:** only one of the three subtab buttons, and only one of the eight trust-config labels (`index.html:681-700`), are translated. The panel is now partly English and partly Spanish when switched to Spanish. ### Bugs and nits - **EN/ES mismatch:** English `scheduledHolidaysTitle: "Scheduled Exceptions"` (`i18n.js:1249`) drops "Schedule", while Spanish says "Excepciones de Horario Programadas". The Spanish matches the glossary term. - **API docs table header:** in `docs/api/README.md`, only the Occupancy table's header changes from "OpenAPI summary" to "Description". The other tables (:19, :102, …) keep "OpenAPI summary". See Spec (a)1. - **Test gap:** `tests/test_i18n.py` doesn't check that the translated labels still render uppercase, which is why finding 1 wasn't caught. - **Placeholder casing:** `index.html:804` shows `[ NAME ]` until translations load, then mixed case. This existed before this PR. ## Spec Nothing blocks the spec. - The admin UI, the EN/ES strings and CONTEXT.md now use "Schedule exceptions". - Routes, the table, fields and IDs are unchanged, as the spec requires ("Preserve existing API routes and storage names for compatibility"). - The two new glossary entries (`CONTEXT.md:116-121`) match the resolution. ### (a) Missing or partial The spec line is: *"Rename admin UI wording and documentation to **Schedule exceptions**"*. 1. **Swagger/OpenAPI documentation still says "holiday".** - `/docs` builds its operation summaries from the function names: "Get Holidays Calendar", "Add Or Update Holiday", "Delete Holiday" (`app/controllers/occupancy_controller.py:199-245`). - The docstrings still say "List all registered holidays and special event dates" (:204), "add or update an upcoming holiday" (:226) and "delete a registered holiday" (:245). - The schema descriptions still say "Description/name of the holiday" and "Default holiday opening/closing time" (`app/schemas/occupancy_models.py:327, 337, 340`). - Setting `summary=`/`description=` and updating the docstrings changes no route. The `docs/api/README.md` Occupancy header can then go back to "OpenAPI summary". 2. **The live card label still uses holiday framing.** It shows the `schedule_label` built in `app/services/occupancy_service.py:298` as `f"🎉 {h_name} (Cerrado)"`, with the default name `"Feriado"` (:289; also `app/db/occupancy_repository.py:775`). A renovation or emergency closure still gets a party emoji, even though this PR removed the emoji from the card title and badge. At minimum drop the emoji and use a neutral default name. The Spanish-only backend label overlaps with #73; defer that part to #73 if needed. ### (b) Scope creep - Removing 🎉 from `app.js:1867` and from the `carousel.holidayOpen`/`holidayClosed` strings follows from the rename, so it is in scope. - `tests/test_i18n.py` asserts `statisticsDeck...legend.holiday === 'FERIADO'`. This locks in a marker that #161 owns. It is harmless, but #161 may need to relax it. ### (c) Implemented but questionable - **The glossary contradicts the code.** `CONTEXT.md:113` (Usual Weekday Baseline) still says a day counts only if it "is not a holiday or Closed Day". The code excludes every dated exception (`is_holiday=True` on every row, `occupancy_service.py:302`). Under the new definitions a holiday and a schedule exception are different things, so the sentence no longer describes the code. Change it to "schedule exception", or keep it and add a pointer to #161, which owns baseline eligibility. - **Edits with no visible effect:** five edited i18n keys are never referenced in `index.html` or `app.js`: `generalParamsAndHolidaysTitle`, `defaultHolidayHoursTitle`, `schedulesHolidaysAndCamerasTitle`, `scheduledHolidaysTitle`, `workingHoursTitle`. The edits are consistent but change nothing on screen. Wire them up or leave them, but don't count them as coverage. --- **Summary:** - **Standards:** 2 hard violations, 3 judgement calls, 4 nits. The worst is that the translated labels lose the required uppercase styling. - **Spec:** 2 missing or partial items, 2 questionable ones. The worst is that Swagger text and the backend `🎉 … (Cerrado)` label still present exceptions as holidays. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(schedule): address first-pass exception naming review
All checks were successful
CI / lint-and-test (pull_request) Successful in 2m30s
fdfad26430
gabogg changed title from chore(schedule): call dated overrides schedule exceptions to fix(schedule): call dated overrides schedule exceptions 2026-09-28 15:37:47 +00:00
Author
Owner

First-pass findings addressed — fdfad26

Standards

  • Kept the schedule tab and add button uppercase after translation, including after tab switches. Added a regression check for those bindings and their uppercase class.
  • Changed the PR title to fix(schedule): ... so the merge title uses the correct change type. The existing chore/ branch remains because #161's stacked draft uses it as its base.
  • Renamed frontend i18n keys that now represent schedule exceptions; retained legacy API, payload, and DOM names for compatibility. Removed the unused translated headings that had no visible effect.
  • Localized all three schedule subtabs, all trust-threshold labels, the schedule table headings, and adjacent controls. Matched the placeholder casing and removed the unused EN/ES “Scheduled Exceptions” mismatch.

Spec

  • Added schedule-exception summaries and descriptions to the three existing /holidays OpenAPI operations and their relevant schema fields. The API guide again uses the “OpenAPI summary” header and matches those summaries.
  • Removed the party emoji from both open and closed live schedule labels. The service and repository now use a neutral default name when a dated exception has no name.
  • Corrected the Usual Weekday Baseline glossary entry to describe the current rule: every dated schedule exception is excluded. Removed the prior test assertion that locked in a statistics holiday marker owned by #161.

Verification: Ruff lint and format checks, docs check (38 Markdown files / 76 HTTP operations), focused tests (24 passed), full pytest (452 passed), and commit-time hooks all passed. The branch is pushed and ready for review pass 2.

## First-pass findings addressed — `fdfad26` **Standards** - Kept the schedule tab and add button uppercase after translation, including after tab switches. Added a regression check for those bindings and their uppercase class. - Changed the PR title to `fix(schedule): ...` so the merge title uses the correct change type. The existing `chore/` branch remains because #161's stacked draft uses it as its base. - Renamed frontend i18n keys that now represent schedule exceptions; retained legacy API, payload, and DOM names for compatibility. Removed the unused translated headings that had no visible effect. - Localized all three schedule subtabs, all trust-threshold labels, the schedule table headings, and adjacent controls. Matched the placeholder casing and removed the unused EN/ES “Scheduled Exceptions” mismatch. **Spec** - Added schedule-exception summaries and descriptions to the three existing `/holidays` OpenAPI operations and their relevant schema fields. The API guide again uses the “OpenAPI summary” header and matches those summaries. - Removed the party emoji from both open and closed live schedule labels. The service and repository now use a neutral default name when a dated exception has no name. - Corrected the Usual Weekday Baseline glossary entry to describe the current rule: every dated schedule exception is excluded. Removed the prior test assertion that locked in a statistics holiday marker owned by #161. **Verification:** Ruff lint and format checks, docs check (38 Markdown files / 76 HTTP operations), focused tests (24 passed), full pytest (452 passed), and commit-time hooks all passed. The branch is pushed and ready for review pass 2.
Author
Owner

Code review, pass 2 (origin/master...fdfad26)

Result: no P1 or P2 findings. Both axes confirm every first-pass finding is fixed. Of the 8 P3s (5 Standards, 3 Spec), 7 are deferred to #184, following docs/standards/git-and-workflow.md ("Second pass, ordinary PR"). The harmless scope-creep note is not tracked.

Verification on master (fb89880) merged with this PR: 451 pytest passed, 1 skipped. The skip is the tailwind binary, which is untracked in a clean checkout. 242 frontend tests passed and ruff check is clean. CI on the branch is green.

Standards

First-pass findings

  • Uppercase on translated tab and button labels: fixed. The buttons carry uppercase (index.html:754-761,794,810), and switchAdminOccSubtab adds it back after a tab switch (app.js:2319,2321).
  • Branch type: accepted. The PR title is now fix(schedule). The chore/ branch stays because the stacked #161 draft uses it as its base.
  • i18n keys still named "holiday": fixed. Nothing references the old keys, and EN and ES are both complete.
  • exceptionMinEntriesLabel vs holidayOpenLabel: fixed. They are now exceptionOpenLabel and exceptionCloseLabel.
  • Partial localization: mostly fixed. Two labels that predate this PR remain (#184, item 1).
  • EN/ES mismatch on scheduledHolidaysTitle: fixed. The key was unused and is deleted.
  • API docs table header: fixed.
  • No uppercase test: fixed, but the new test is brittle (#184, item 2).

New findings (all P3, judgement calls, all in #184)

  1. Two labels are not localized: "CALIBRATION AND TRUST THRESHOLDS" and "BASELINE OFFSET" (index.html:672,678).
  2. The uppercase test checks for the exact attribute string class="uppercase" data-i18n=…. It also forces a redundant uppercase onto inner <span>s.
  3. exceptionMinEntriesLabel does not match the trust*Label prefix of its neighbours.
  4. The fallback string "Excepción de horario" is duplicated in the repository and the service.
  5. The Holiday marker FERIADO now has only an indirect guard (test_statistics_deck_day.test.js:235).

Spec

First-pass findings

  • (a1) Swagger wording: fixed, and a test guards it. docs/api/README.md:82-84 matches the OpenAPI summaries.
  • (a2) Emoji and "Feriado" on the live card: fixed. The neutral default name is tested (test_occupancy.py:139-156).
  • (c1) Baseline wording in CONTEXT.md: fixed.
  • (c2) Unused i18n keys: removed.
  • Statistics deck FERIADO assertion: removed. The deck strings are untouched, which fits the spec line "keep this issue naming-only and non-blocking for the statistics deck".

No route, field, table or ID was renamed, which satisfies "Preserve existing API routes and storage names for compatibility." Nothing is missing.

P3 findings (in #184)

  • Scope creep (not tracked): the trust-threshold labels and weekly table headers were newly wired to i18n. This is harmless.
  • Scope creep, small behaviour change: name: "" is now stored as the default name, while the POST response still echoes "" (occupancy_repository.py:775, occupancy_controller.py:241).
  • Questionable against the spec's "coordinating with #73": the backend stores the Spanish fallback name and appends "(Cerrado)". The English UI then shows Spanish text. The old "Feriado" default had the same problem.

Summary

  • Standards: all first-pass findings fixed, 5 new P3s. The worst is the duplicated Spanish fallback string.
  • Spec: all first-pass findings fixed, no missing requirements, 3 P3s. The worst is the Spanish fallback conflicting with #73.

Merging.

🤖 Generated with Claude Code

## Code review, pass 2 (`origin/master...fdfad26`) Result: **no P1 or P2 findings.** Both axes confirm every first-pass finding is fixed. Of the 8 P3s (5 Standards, 3 Spec), 7 are deferred to **#184**, following docs/standards/git-and-workflow.md ("Second pass, ordinary PR"). The harmless scope-creep note is not tracked. **Verification on master (fb89880) merged with this PR:** 451 pytest passed, 1 skipped. The skip is the tailwind binary, which is untracked in a clean checkout. 242 frontend tests passed and `ruff check` is clean. CI on the branch is green. ## Standards **First-pass findings** - **Uppercase on translated tab and button labels:** fixed. The buttons carry `uppercase` (`index.html:754-761,794,810`), and `switchAdminOccSubtab` adds it back after a tab switch (`app.js:2319,2321`). - **Branch type:** accepted. The PR title is now `fix(schedule)`. The `chore/` branch stays because the stacked #161 draft uses it as its base. - **i18n keys still named "holiday":** fixed. Nothing references the old keys, and EN and ES are both complete. - **`exceptionMinEntriesLabel` vs `holidayOpenLabel`:** fixed. They are now `exceptionOpenLabel` and `exceptionCloseLabel`. - **Partial localization:** mostly fixed. Two labels that predate this PR remain (#184, item 1). - **EN/ES mismatch on `scheduledHolidaysTitle`:** fixed. The key was unused and is deleted. - **API docs table header:** fixed. - **No uppercase test:** fixed, but the new test is brittle (#184, item 2). **New findings (all P3, judgement calls, all in #184)** 1. Two labels are not localized: "CALIBRATION AND TRUST THRESHOLDS" and "BASELINE OFFSET" (`index.html:672,678`). 2. The uppercase test checks for the exact attribute string `class="uppercase" data-i18n=…`. It also forces a redundant `uppercase` onto inner `<span>`s. 3. `exceptionMinEntriesLabel` does not match the `trust*Label` prefix of its neighbours. 4. The fallback string `"Excepción de horario"` is duplicated in the repository and the service. 5. The Holiday marker `FERIADO` now has only an indirect guard (`test_statistics_deck_day.test.js:235`). ## Spec **First-pass findings** - **(a1) Swagger wording:** fixed, and a test guards it. `docs/api/README.md:82-84` matches the OpenAPI summaries. - **(a2) Emoji and "Feriado" on the live card:** fixed. The neutral default name is tested (`test_occupancy.py:139-156`). - **(c1) Baseline wording in CONTEXT.md:** fixed. - **(c2) Unused i18n keys:** removed. - **Statistics deck `FERIADO` assertion:** removed. The deck strings are untouched, which fits the spec line "keep this issue naming-only and non-blocking for the statistics deck". No route, field, table or ID was renamed, which satisfies "Preserve existing API routes and storage names for compatibility." Nothing is missing. **P3 findings (in #184)** - **Scope creep (not tracked):** the trust-threshold labels and weekly table headers were newly wired to i18n. This is harmless. - **Scope creep, small behaviour change:** `name: ""` is now stored as the default name, while the POST response still echoes `""` (`occupancy_repository.py:775`, `occupancy_controller.py:241`). - **Questionable against the spec's "coordinating with #73":** the backend stores the Spanish fallback name and appends "(Cerrado)". The English UI then shows Spanish text. The old "Feriado" default had the same problem. **Summary** - **Standards:** all first-pass findings fixed, 5 new P3s. The worst is the duplicated Spanish fallback string. - **Spec:** all first-pass findings fixed, no missing requirements, 3 P3s. The worst is the Spanish fallback conflicting with #73. Merging. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gabogg merged commit 4029c7955a into master 2026-09-28 17:20:40 +00:00
gabogg deleted branch chore/schedule-exception-naming 2026-09-28 17:20:41 +00:00
Sign in to join this conversation.
No reviewers
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
gabogg/hikcentral!175
No description provided.