7accb2aad6
* feat: add package amount persistence and backend route support * test: align backend test schemas with medication metadata fields * fix(backend): restore intake usage normalizer for planner endpoint * fix(backend): keep export typing compatible before liquid-unit stack step
54 KiB
54 KiB
Agent Memory Notes
Purpose: persistent agent work memory to survive context loss.
Usage Rules
- Update this file during and after meaningful work.
- Record decisions, touched files, constraints, and unresolved follow-ups.
- Keep entries concise and chronological.
How to maintain (1-minute template)
Use this block for each meaningful task:
### YYYY-MM-DD
- 🧩 Task:
- ✅ Decisions:
- 📁 Files touched:
- 🔜 Follow-up/open points:
Entries
2026-02-28 (CI triage: Backend Tests failure on PR #356)
- 🧩 Task: Reproduce and fix
Backend TestsCI failure onfeat/package-amount-backend. - ✅ Decisions:
- Reproduced local backend failure (
15failing tests) with500responses fromPOST /medications/usage. - Identified root cause:
backend/src/routes/medications.tscallednormalizeIntakeUsageForStock(...)but helper export was missing frombackend/src/utils/scheduler-utils.ts. - Added minimal helper implementation that normalizes finite positive usage values and keeps stock usage semantics centralized.
- Re-ran targeted failing suites, then full backend suite; all passed.
- Reproduced local backend failure (
- 📁 Files touched:
backend/src/utils/scheduler-utils.tsdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- None for backend test check; release handoff can proceed without push from this agent.
2026-02-28 (stacked branch validation: package amount + liquid units + topical no-depletion)
- 🧩 Task: Validate stacked branch readiness and make tests compatible with new medication/package semantics.
- ✅ Decisions:
- Confirmed stack order on
feat/topical-no-depletion-planner:7ebd253->3954ed2->e689720->f9deb1b. - Fixed backend in-memory test schemas (integration/planner/e2e-routes) to include new medication columns so route tests stop failing with fixture-level
500errors. - Updated focused E2E selectors/assertions for schedule usage labels and planner stock wording after liquid/topical/package updates.
- Stabilized medication lifecycle E2E edit flow by cleaning per-test medication state and using current edit-form labels.
- Confirmed stack order on
- 📁 Files touched:
backend/src/test/integration.test.tsbackend/src/test/planner.test.tsbackend/src/test/e2e-routes.test.tsfrontend/e2e/medication-edit.spec.tsfrontend/e2e/medication-lifecycle.spec.tsfrontend/e2e/planner-data.spec.tsdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Frontend lint still reports 12 pre-existing
noNestedTernarywarnings inMedicationsPage.tsxandReportModal.tsx(outside this compatibility-fix scope).
- Frontend lint still reports 12 pre-existing
2026-02-28 (package amount UX: numeric input only for tube and liquid)
- 🧩 Task: Remove
+/-steppers for non-tablet package amount fields. - ✅ Decisions:
- Replaced
FormNumberStepperwith a plain numeric text input for:tube->Amount per tubeliquid_container->Package amount
- Kept unit selectors read-only and fixed per domain rule:
tubeunit fixed togliquid_containerunit fixed toml
- Added component regression tests in mobile modal suite to validate the new input style and fixed units.
- Replaced
- 📁 Files touched:
frontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxfrontend/src/test/components/MobileEditModal.test.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Existing unrelated
noNestedTernarylint warnings remain inMedicationsPage.tsx(pre-existing scope).
- Existing unrelated
2026-02-28 (test update: tube grams + liquid ml regression coverage)
- 🧩 Task: Review and update tests for the new package-unit behavior rules.
- ✅ Decisions:
- Extended existing
useMedicationFormtests to assertpackageAmountUnit="ml"forliquid_containerdefaults/locks. - Added regression test that
tubeenforces/keepspackageAmountUnit="g"even if UI attempts to setml. - Added regression test that legacy
tuberecords withpackageAmountUnit="ml"are normalized togduringstartEdit. - Refactored touched code paths to satisfy
noNestedTernarylint in changed files.
- Extended existing
- 📁 Files touched:
frontend/src/test/hooks/useMedicationForm.test.tsfrontend/src/hooks/useMedicationForm.tsfrontend/src/components/MobileEditModal.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Optional backend route-level validation for
tube+mlremains open if full server-side enforcement is desired.
- Optional backend route-level validation for
2026-02-28 (tube unit correction: no ml for tubes)
- 🧩 Task: Enforce domain rule from user feedback: tubes use
g, notml. - ✅ Decisions:
- Removed
mlchoice from tube amount input in desktop and mobile edit forms (unit is fixed tog). - Added hard normalization so tube edit state and save payload always persist
packageAmountUnit="g". - Added payload guard so
liquid_containeris normalized topackageAmountUnit="ml".
- Removed
- 📁 Files touched:
frontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxfrontend/src/hooks/useMedicationForm.tsdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Optional backend validation hardening can be added later to reject historic
tube+mlpayloads server-side.
- Optional backend validation hardening can be added later to reject historic
2026-02-28 (tube package UX simplification: 1 tube x 150 g)
- 🧩 Task: Make
tubepackage fields intuitive and remove conflicting stock inputs. - ✅ Decisions:
- Reworked stock UI for
packageType=tubein desktop and mobile to show onlyTubes+Amount per tube+ computed total amount. - Removed
total/current amountsteppers for tube to avoid contradictory input combinations. - Save payload now normalizes tube values to a consistent amount model (
totalPillsandlooseTabletsderived frompackCount * packageAmountValue). - Added i18n keys for tube-specific labels (
form.tubes,form.packageAmountPerTube) in EN/DE.
- Reworked stock UI for
- 📁 Files touched:
frontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxfrontend/src/i18n/en.jsonfrontend/src/i18n/de.jsondoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- If needed, align planner/report wording to explicitly display tube multiplication format (
NxY unit) everywhere.
- If needed, align planner/report wording to explicitly display tube multiplication format (
2026-02-28 (start date optional placeholder consistency)
- 🧩 Task: Make start-date hint consistent with other optional date fields.
- ✅ Decisions:
- Added
common.optionalplaceholder toMedication Start Datein desktop and mobile edit forms. - Kept validation behavior unchanged (start date remains optional).
- Added
- 📁 Files touched:
frontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- None.
2026-02-28 (full implementation: liquid units + topical stock behavior + package amount metadata)
- 🧩 Task: Implement the approved suggestions end-to-end: liquid intake unit conversion, topical non-depleting stock logic, and package amount metadata.
- ✅ Decisions:
- Added persisted medication metadata fields
packageAmountValue+packageAmountUnit(ml|g) in DB schema/migration and API/export/import mappings. - Extended intake model with
intakeUnit(ml|tsp|tbsp) and conversion logic (tsp=5 ml,tbsp=15 ml) for stock calculations. - Enforced topical stock behavior as metadata-only depletion path in planner/reminder/frontend coverage calculations (
topical/tubedoes not reduce stock in V1.1 behavior). - Added desktop+mobile parity UI for liquid intake-unit selection and package-amount metadata inputs.
- Added EN/DE i18n keys for new fields and bumped export format to
1.3.
- Added persisted medication metadata fields
- 📁 Files touched:
backend/src/routes/medications.tsbackend/src/services/reminder-scheduler.tsbackend/src/routes/export.tsfrontend/src/types/index.tsfrontend/src/hooks/useMedicationForm.tsfrontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxfrontend/src/utils/schedule.tsfrontend/src/components/SharedSchedule.tsxfrontend/src/i18n/en.jsonfrontend/src/i18n/de.jsondoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Testing execution remains delegated to
@testing-managerper governance.
- Testing execution remains delegated to
2026-02-28 (topical non-measurable vs liquid measurable + tbsp conversion)
- 🧩 Task: Clarify that topical content should not affect stock math while liquid should, and define tablespoon conversion.
- ✅ Decisions:
- Updated
doku/package_types.mdsotopicalpackage amount is metadata-only (no depletion effect) in V1/V1.1. - Kept
liquidas measurable stock with canonicalmldeduction. - Added liquid intake conversion rules:
1 tsp = 5 ml,1 tbsp = 15 ml. - Locked MedAssist conversion to medical metric convention (
tbsp=15 ml), excluding regional culinary variants.
- Updated
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- If approved for implementation: add intake-unit enum (
ml|tsp|tbsp) and conversion logic in frontend/backend.
- If approved for implementation: add intake-unit enum (
2026-02-28 (packaging quantity unit decision for liquids/topicals)
- 🧩 Task: Clarify how package amount should be measured for liquid and topical medications.
- ✅ Decisions:
- Added explicit recommendation in
doku/package_types.mdto introduce package quantity fields:packageAmountValue+packageAmountUnit(ml|g). - Documented default mapping:
liquid_container -> ml,tube(topical) -> g, with manual override tomlfor topical liquids. - Clarified separation between
doseUnit,packageAmountUnit, andstrengthUnit.
- Added explicit recommendation in
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- If approved, implement DB/API/frontend fields and migrations in a dedicated PR.
2026-02-28 (liquid_container regression tests implemented)
- 🧩 Task: Convert the checklist handoff into executable regression coverage for
liquid_containerand run targeted validation. - ✅ Decisions:
- Added backend real-route regression tests in
e2e-routes.test.tsfor create/share semantics and invalid liquid/package combination rejection. - Added frontend hook regression tests in
useMedicationForm.test.tsforliquid_containerform derivation (medicationForm=liquid,doseUnit=ml) and lock behavior. - Fixed outdated in-memory test schema in
e2e-routes.test.tsby adding missing medication columns (medication_form,pill_form,lifecycle_category,medication_end_date,auto_mark_obsolete_after_end_date) so current route inserts can be tested reliably. - Executed only targeted test names to isolate new behavior from unrelated legacy failures in the larger file.
- Added backend real-route regression tests in
- 📁 Files touched:
backend/src/test/e2e-routes.test.tsfrontend/src/test/hooks/useMedicationForm.test.tsdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Optional next step: expand backend package/form matrix coverage beyond these focused regressions.
2026-02-28 (testing-manager handoff checklist for liquid_container)
- 🧩 Task: Create a concrete test handoff checklist after user confirmation.
- ✅ Decisions:
- Added a dedicated
@testing-managersection todoku/package_types.mdwith backend validation cases, frontend desktop/mobile parity checks, data exchange checks, and E2E minimum scenarios. - Kept checklist scoped to the
liquid_containerrollout and package/form invariants.
- Added a dedicated
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Execute the checklist via
@testing-managerownership path.
- Execute the checklist via
2026-02-28 (liquid_container rollout)
- 🧩 Task: Implement dedicated liquid package type end-to-end (
liquid_container) after user decision. - ✅ Decisions:
- Added
liquid_containerto backend and frontend package type contracts. - Enforced compatibility:
liquid -> liquid_container,topical -> tube,capsule/tablet -> not tube/not liquid_container. - Updated desktop/mobile medication forms with explicit
liquid_containeroption and fixed unit/label behavior (ml) in planner/schedule/dashboard/detail/report flows. - Updated backend planner/reminder/export/refill/share logic to treat
liquid_containeras container stock semantics where applicable. - Updated
doku/package_types.mdconstraints to reflect new canonical mapping.
- Added
- 📁 Files touched:
backend/src/routes/medications.tsbackend/src/routes/export.tsbackend/src/routes/refills.tsbackend/src/routes/share.tsbackend/src/routes/planner.tsbackend/src/services/reminder-scheduler.tsfrontend/src/types/index.tsfrontend/src/hooks/useMedicationForm.tsfrontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxfrontend/src/pages/PlannerPage.tsxfrontend/src/pages/SchedulePage.tsxfrontend/src/pages/DashboardPage.tsxfrontend/src/components/MedDetailModal.tsxfrontend/src/components/ReportModal.tsxfrontend/src/i18n/en.jsonfrontend/src/i18n/de.jsondoku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Run full regression via
@testing-manager(ownership rule).
- Run full regression via
2026-02-28 (logic correction: liquid cannot be in tube)
- 🧩 Task: Fix package-type logic after user report that
liquidintubeis invalid. - ✅ Decisions:
- Backend validation changed to
topical -> tubeandliquid != tube. - UI for
packageType=tubenow only allowstopical; theliquidoption was removed in desktop and mobile edit flows. - Form defaults/derivations for
tubenow forcemedicationForm=topicalwithdoseUnit=units. - Updated source-of-truth plan wording in
doku/package_types.mdto match corrected logic.
- Backend validation changed to
- 📁 Files touched:
backend/src/routes/medications.tsfrontend/src/hooks/useMedicationForm.tsfrontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxdoku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Re-check if a dedicated
liquidpackage path should be modeled explicitly in a future master-plan phase.
- Re-check if a dedicated
2026-02-28 (package-type hardening pass implemented)
- 🧩 Task: Implement as much of the package-type remediation as possible before the master-plan rollout.
- ✅ Decisions:
- Hardened backend API validation in
medications.tsby adding inverse compatibility rule (capsule/tabletcannot usetube). - Updated frontend planner and schedule views to stop pill-only wording for
tubemedications and to render form-aware units. - Updated backend planner/reminder notification wording to avoid pill assumptions for
tubeand use form-aware/generic unit terms. - Extended backend translation common keys with unit terms required for the updated notification wording.
- Hardened backend API validation in
- 📁 Files touched:
backend/src/routes/medications.tsfrontend/src/pages/PlannerPage.tsxfrontend/src/pages/SchedulePage.tsxbackend/src/routes/planner.tsbackend/src/services/reminder-scheduler.tsbackend/src/i18n/translations.tsdoku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Test ownership remains with
@testing-manager; full four-form regression coverage still pending.
- Test ownership remains with
2026-02-28 (package_types full-plan refresh to current implementation status)
- 🧩 Task: Review the full
doku/package_types.mdand bring it to the latest code-aligned state. - ✅ Decisions:
- Added a dated status snapshot (
2026-02-28) with explicit split between implemented and still-open items. - Removed scope ambiguity by changing V1 section into
already implementedbaseline plusremaining work. - Added explicit note that persisted lifecycle values are currently limited to
refill_when_empty|treatment_period, whileongoingis runtime-derived. - Added progress interpretation to the 1:1 remediation section (verify-and-align for completed parts, prioritize known open gaps).
- Added a dated status snapshot (
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Next implementation focus remains planner/schedule/reminder wording normalization and full four-form regression coverage.
2026-02-28 (package_types plan: added 1:1 remediation execution order)
- 🧩 Task: Write the full executable remediation order directly into
doku/package_types.md. - ✅ Decisions:
- Added a mandatory file-by-file sequence with explicit
file -> change -> acceptancestructure. - Included all previously identified impacted backend, frontend, i18n, test, e2e, and documentation files.
- Added an execution gate: skipped files require explicit technical rationale, otherwise rollout is incomplete.
- Added a mandatory file-by-file sequence with explicit
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Execute the remediation in code in exactly this order and track skipped items with rationale.
2026-02-28 (package_types plan made coherent + full impact inventory)
- 🧩 Task: Adjust
doku/package_types.mdso the plan is coherent and explicitly lists all affected code/test/doc areas. - ✅ Decisions:
- Fixed top-level contradiction by documenting current container reality as
blister|bottle|tube. - Added a mandatory explicit affected-file inventory across backend routes/services/schema, frontend runtime surfaces, i18n, backend tests, frontend tests, and e2e specs.
- Kept the no-partial-rollout enforcement and linked it to concrete file groups for execution control.
- Fixed top-level contradiction by documenting current container reality as
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Implement remediation in code according to the newly enumerated file inventory (starting with planner/schedule wording and corresponding tests).
2026-02-28 (package type plan hardening against partial implementation)
- 🧩 Task: Strengthen
doku/package_types.mdso package/form changes cannot be considered done when only partial surfaces are updated. - ✅ Decisions:
- Added a mandatory cross-layer implementation coverage section (backend validation, backend logic, desktop+mobile parity, read views, i18n, import/export/share, tests).
- Added explicit definition of done: all checklist areas must be updated or explicitly marked not impacted with rationale.
- Grounded follow-up review findings with concrete gap examples still visible in code (notably planner/schedule pill-only wording paths).
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Execute a dedicated cleanup pass for planner/schedule/backend planner notification wording and corresponding tests.
2026-02-28 (release-manager doc cleanup: remove app-feature example)
- 🧩 Task: Remove product-feature-specific text from
.github/agents/release-manager.agent.mdand keep it process-focused. - ✅ Decisions:
- Replaced concrete app feature example under release notes guidance with a neutral, reusable template using placeholders.
- Kept release process rules intact; only example content was generalized.
- 📁 Files touched:
.github/agents/release-manager.agent.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Optionally align the Breaking Changes heading example with the no-emoji rule in a separate doc cleanup pass.
2026-02-27 (dashboard overview tube unit fix)
- 🧩 Task: Fix dashboard medication overview showing
pillfortubemedications. - ✅ Decisions:
- Replaced pill-based stock label in dashboard overview with tube-aware amount labels.
- Added local dashboard helpers to render
tubevalues asml(liquid) orapplications(topical). - Updated timeline dose/total tags in dashboard day blocks to use tube-aware units and suppress pill-weight mg details for tube.
- 📁 Files touched:
frontend/src/pages/DashboardPage.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- None.
2026-02-27 (date input placeholder casing fix)
- 🧩 Task: Keep
optionalplaceholder text lowercase in date inputs instead of inherited uppercase styling. - ✅ Decisions:
- Root cause is inherited
text-transform: uppercasefrom.form-grid label. - Applied local override on
.date-input-display(text-transform: none,letter-spacing: normal) to preserve calm, readable lowercase placeholder text.
- Root cause is inherited
- 📁 Files touched:
frontend/src/styles/schedule-mobile-edit.cssdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- None.
2026-02-27 (tube wording consistency in report exports)
- 🧩 Task: Complete tube-specific wording consistency in medication report exports (text + print/PDF).
- ✅ Decisions:
- Added helper functions in
ReportModalto centralize tube unit/label logic (mlvsapplications). - Replaced pill-centric wording with amount-based wording for
tubein current stock, total capacity label, intake schedule entries, and refill history entries. - Hid
Dose per pillrow fortubein both text and print report outputs.
- Added helper functions in
- 📁 Files touched:
frontend/src/components/ReportModal.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Dashboard/Planner wording parity should be rechecked in a dedicated pass if product wants full app-wide amount terminology normalization for tube.
2026-02-27 (holistic package-specific UI behavior for tube)
- 🧩 Task: Make package tab behavior fully package-specific so
tubedoes not show pill/mg-oriented fields. - ✅ Decisions:
- For
tube, relabeled stock fields from pill terminology to amount terminology. - Hid the pill-specific strength field (
Dose per pill) fortubein desktop and mobile package tabs. - Adjusted total display text for
tubeto avoidpill/pillswording. - Added tube-form default unit behavior:
liquid -> ml,topical -> units. - Added EN/DE i18n keys for amount-based labels.
- For
- 📁 Files touched:
frontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxfrontend/src/hooks/useMedicationForm.tsfrontend/src/i18n/en.jsonfrontend/src/i18n/de.jsondoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Optional backend extension: distinguish volume-based depletion for liquid vs application-based depletion for topical in planner/reminder calculations.
2026-02-27 (align package_types doc with implemented tube/liquid/topical behavior)
- 🧩 Task: Resolve contradiction between implementation and
doku/package_types.mdtechnical constraints. - ✅ Decisions:
- Updated constraints to reflect actual support for
packageType=blister|bottle|tube. - Documented current UX split:
blister/bottleusepillForm.tubeusesmedicationForm(liquid/topical).
- Removed stale claim that only
blister|bottleare supported end-to-end.
- Updated constraints to reflect actual support for
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Keep docs in lockstep with model/UI changes to avoid product-level confusion.
2026-02-27 (restore liquid vs topical distinction for tube)
- 🧩 Task: Reintroduce meaningful liquid/topical distinction after pillForm-first simplification removed explicit tube subform choice.
- ✅ Decisions:
- Keep
pillFormas primary for non-tube packages. - For
packageType=tube, showmedicationFormselector with onlyliquidandtopicaloptions. - Tube intake behavior now respects selected tube subform:
liquid-> fractional intake allowed,usageMllabel.topical-> integer/application-style intake,usageApplicationlabel.
- Default when switching to tube is now
liquidunless an existing tube subform already exists.
- Keep
- 📁 Files touched:
frontend/src/hooks/useMedicationForm.tsfrontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- If stock math for liquid should be volume-precise vs application-based, add explicit unit/policy handling in backend planner/reminder calculations.
2026-02-27 (pillForm-first UX: removed medicationForm selector)
- 🧩 Task: Remove semantically redundant
medicationFormvspillFormuser choice and makepillFormthe primary user-facing control. - ✅ Decisions:
- Removed
medicationFormselector from desktop and mobile forms. - Kept
pillFormas the user-facing form mechanic for non-tube package types. - Kept
packageTypeexplicit (blister,bottle,tube) and derivemedicationForminternally on save for backend compatibility. - Intake behavior now keys off
packageType/pillFormin UI logic (fraction rule + usage labels).
- Removed
- 📁 Files touched:
frontend/src/hooks/useMedicationForm.tsfrontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- If liquid vs topical needs separate user-facing control later, add it only with concrete behavior differences.
2026-02-27 (remove non-functional lifecycle selector from UI)
- 🧩 Task: Ensure users only see options with concrete app impact.
- ✅ Decisions:
- Removed
lifecycleCategoryselector from desktop and mobile medication edit forms because both options currently have no distinct runtime behavior. - Kept persistence/internal field compatibility untouched to avoid DB/API churn in the same scope.
- Documented that lifecycle selector remains hidden until it drives differentiated planner/reminder/stock behavior.
- Removed
- 📁 Files touched:
frontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxdoku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- If lifecycle should return as a visible control, implement real behavior differences first and then re-enable UI.
2026-02-27 (package type pivot: liquid/topical use tube, not bottle)
- 🧩 Task: Complete cross-layer pivot after user correction that liquid/topical must not use pill-bottle semantics.
- ✅ Decisions:
- Introduced/propagated dedicated
tubepackage type in backend validation/export and frontend domain/UI types. - Enforced medication-form mapping: liquid/topical ->
tube; capsule/tablet keep blister/bottle options. - Standardized stock logic so container semantics (
bottleandtube) use direct loose/total capacity handling across planner/dashboard/detail/refill/report/scheduler. - Added missing i18n keys for tube labels in form/report contexts (EN/DE).
- Introduced/propagated dedicated
- 📁 Files touched:
backend/src/routes/medications.tsbackend/src/routes/export.tsbackend/src/routes/refills.tsbackend/src/routes/planner.tsbackend/src/routes/share.tsbackend/src/services/reminder-scheduler.tsfrontend/src/types/index.tsfrontend/src/hooks/useMedicationForm.tsfrontend/src/hooks/useRefill.tsfrontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxfrontend/src/pages/DashboardPage.tsxfrontend/src/pages/PlannerPage.tsxfrontend/src/components/MedDetailModal.tsxfrontend/src/components/ReportModal.tsxfrontend/src/utils/stock.tsfrontend/src/i18n/en.jsonfrontend/src/i18n/de.jsondoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Tests are owned by
@testing-manager; no test execution was performed in this step.
- Tests are owned by
2026-02-27 (rest_api_med_overview plan improved)
- 🧩 Task: Improve
doku/feat/rest_api_med_overview.mdbased on review findings. - ✅ Decisions:
- Added missing mandatory test workstream (backend, frontend, e2e).
- Corrected rate-limit implementation target to existing architecture (
share.ts+ plugin inbackend/src/index.ts). - Clarified response contract details: token format validation,
Cache-Control: no-store, date format (YYYY-MM-DD),shareStockStatus=falsenulling behavior. - Clarified image strategy for v1: reuse existing image filename +
/api/images/...flow (no new share image proxy endpoint in this phase). - Updated effort estimate and explicitly recommended PR split due to scope size.
- 📁 Files touched:
doku/feat/rest_api_med_overview.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- If strict 500-line PR target must be enforced, execute as 3 linked PRs.
2026-02-27 (review of shared overview API plan completeness)
- 🧩 Task: Review
doku/feat/rest_api_med_overview.mdfor quality and completeness. - ✅ Decisions:
- Plan is directionally good, but not complete for implementation-readiness.
- Critical gaps identified: missing explicit test workstream, incorrect/unclear target file for rate-limit wiring (
backend/src/app.tsdoes not exist), and unresolved image-delivery contract for share overview payload. - Confirmed project uses
backend/src/index.tsfor Fastify plugin registration and already has@fastify/rate-limitregistered globally. - Confirmed share tokens are generated via
randomBytes(8).toString("hex")(16 hex chars), so token-format checklist is consistent with current implementation.
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Plan should be revised to include concrete backend/frontend/e2e tests and exact implementation locations before execution.
2026-02-27 (auth loading/error screen follows light/dark theme)
- 🧩 Task: Ensure the loading/connection screens shown before main app mount respect the selected theme.
- ✅ Decisions:
- Implemented theme resolution directly in
App.tsxfor pre-auth screens (loading,authError,!authState). - Read
localStorage.themeand supportlight,dark, andsystem(matchMedia fallback). - Applied resolved theme via
data-themeon the auth container so CSS variables immediately match the chosen theme.
- Implemented theme resolution directly in
- 📁 Files touched:
frontend/src/App.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- None.
2026-02-27 (testing handoff + auth/registration env dependency clarification)
- 🧩 Task: User requested broad Playwright improvements (auth setup fallback, planner logic assertions, lifecycle integration, retry robustness, performance timeline tests) and asked whether login/registration behavior depends on env flags.
- ✅ Decisions:
- Applied governance rule from
.github/skills/medassist-testing-handoff/SKILL.md: test planning/writing/execution must be delegated to@testing-manager. - Confirmed env dependency chain:
- Backend source of truth:
getAuthState()inbackend/src/plugins/auth.ts. authEnabledcomes fromAUTH_ENABLED.registrationEnabledisREGISTRATION_ENABLED || !hasUsers.formLoginEnabledisneedsSetup || (AUTH_ENABLED && FORM_LOGIN_ENABLED).- OIDC visibility/flow depends on
OIDC_ENABLED(+ OIDC config vars).
- Backend source of truth:
- Identified why current E2E auth setup can fail in SSO-only mode:
frontend/e2e/auth.setup.tsassumes#username/#passwordare always present.
- Applied governance rule from
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Hand off requested Playwright implementation scope to
@testing-managerwith concrete file-level guidance.
- Hand off requested Playwright implementation scope to
2026-02-27 (intake reminder fallback removal)
- 🧩 Task: Make intake reminders strictly per-intake and remove medication-level fallback override.
- ✅ Decisions:
- In
backend/src/services/intake-reminder-scheduler.ts, removed effective reminder conditionintake.intakeRemindersEnabled || med.intakeRemindersEnabled. - Reminder eligibility is now strictly
intake.intakeRemindersEnabled. - Removed medication-level fallback argument when parsing intakes for reminder checks (
parseIntakesJson(..., false)). - Medication prefilter now checks whether any intake has
intakeRemindersEnabled=true.
- In
- 📁 Files touched:
backend/src/services/intake-reminder-scheduler.tsdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Legacy medications that relied only on medication-level reminder flag will no longer trigger reminders until intake-level flags are enabled.
2026-02-27 (remove legacy medassist.db leftovers)
- 🧩 Task: Investigate why
backend/data/medassist.dbanddata/medassist.dbexisted and remove old-path remnants. - ✅ Decisions:
- Verified runtime DB path is
medassist-ng.dbviagetDbPaths()inbackend/src/db/db-utils.ts; no production code referencesmedassist.db. - Found remaining string references only in
backend/src/test/db-client.test.tsmocks/assertions. - Updated those test references to
medassist-ng.dband removed legacy filesbackend/data/medassist.dbanddata/medassist.dbfrom disk.
- Verified runtime DB path is
- 📁 Files touched:
backend/src/test/db-client.test.tsbackend/data/medassist.db(removed)data/medassist.db(removed)doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- None; global search shows no remaining
medassist.dbcode references.
- None; global search shows no remaining
2026-02-27 (split-and-ship all pending local changes)
- 🧩 Task: Split one large local working tree into coherent PRs and merge all to
mainend-to-end. - ✅ Decisions:
- Created and merged 4 PRs to keep scopes reviewable while ensuring all pending changes were shipped.
- PR mapping:
- #334
feat/form-login-enabled(Issue #309) - #336
chore/improve-logging(Issue #335) - #339
fix/typescript-strictness-react19(Issue #337) - #341
chore/dependabot-agent-governance(Issue #340)
- #334
- For PR #341, required checks were initially skipped by path filtering; added minimal no-op backend/frontend comment touches so required checks executed and merge satisfied ruleset.
- Verified linked project items for issues
#309,#335,#337,#340areDone.
- 📁 Files touched:
- All changed files were fully distributed across PRs and merged.
- Mandatory reporting updated:
doku/memory_notes.md,doku/report.md.
- 🔜 Follow-up/open points:
- None pending from this split/merge task.
2026-02-27 (pre-PR gate validation for chore/dependabot-agent-governance)
- 🧩 Task: Validate minimal relevant local non-interactive checks for governance/config/docs changes.
- ✅ Decisions:
- Confirmed changed scope with
git status --shortand validated only listed files. - Ran repo-defined lint gate (
npm run lint) to satisfy local pre-PR lint requirement. - Ran parser-level YAML/frontmatter checks for changed
.ymland agent markdown files. - Ran a targeted
markdownlint-cli2check; it reported many style errors, but this linter is not part of this repository's configured gate.
- Confirmed changed scope with
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Local pre-PR gate for this scope is satisfied by configured checks (lint + syntax validation); optional markdown style cleanup can be handled in a separate docs-formatting pass.
2026-02-27 (PR3 local gate rerun after MedDetailModal test fix)
- 🧩 Task: Re-run PR3 local gate on
fix/typescript-strictness-react19afterMedDetailModalassertion fix. - ✅ Decisions:
- Re-ran
frontend checkviaCI=true npm --prefix /Users/danielvolz/git/medassist/frontend run check. - Re-ran the same focused Vitest subset from prior gate run (12 files including
MedDetailModal.test.tsx). - Treated React
act(...)warnings and JSDOMscrollTo()notices as non-blocking because all tests passed.
- Re-ran
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Pre-PR local gate for the requested frontend scope is now satisfied.
2026-02-27 (pre-PR gate validation for fix/typescript-strictness-react19)
- 🧩 Task: Validate minimal relevant local non-interactive frontend lint/tests for React 19 + TS strictness scope.
- ✅ Decisions:
- Ran only frontend checks relevant to the changed scope:
check(Biome +tsc --noEmit) and targeted Vitest on changed test files. - Treated React
act(...)warnings and JSDOMscrollTonotices as non-blocking because they did not fail tests.
- Ran only frontend checks relevant to the changed scope:
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Gate is blocked by one failing test assertion in
src/test/components/MedDetailModal.test.tsxexpectingundefinedwhere implementation currently passesfalseas second arg toonSubmitRefill.
- Gate is blocked by one failing test assertion in
2026-02-27
- 🧩 Task: Implement Issue #309 — Optionally disable form login when OIDC enabled
- ✅ Decisions:
- Env var:
FORM_LOGIN_ENABLED(notLOCAL_AUTH_ENABLED— "local" is ambiguous, "form login" matches the UI element) - Renamed internal field
localAuthEnabled→formLoginEnabledthroughout for consistency - Default
truefor backward compat - First-user override: form login forced on when no users exist (needsSetup)
- Lockout guard: startup error when no login method available
- Mismatch warning: log when REGISTRATION_ENABLED=true but form login off
- No DB changes, no i18n changes, no README update
- Env var:
- 📁 Files touched:
backend/src/plugins/env.ts— added FORM_LOGIN_ENABLED + validationbackend/src/plugins/auth.ts— renamed field + wired to env var + first-user overridebackend/src/routes/auth.ts— renamed guard references + error codefrontend/src/components/Auth.tsx— renamed interface + conditionalsfrontend/src/test/components/Auth.test.tsx— renamed in mocksfrontend/src/test/components/AppHeader.test.tsx— renamed in mocksbackend/src/test/auth.test.ts— renamed env mock + assertion.env.example— documented new var
- 🔜 Follow-up: E2E tests for OIDC-only mode (delegate to @testing-manager)
2026-02-27 (pre-PR gate validation for chore/improve-logging)
- 🧩 Task: Validate local lint/tests for branch
chore/improve-loggingon changed logging/nginx/backend-route files. - ✅ Decisions:
- Ran minimal relevant non-interactive checks only: backend lint, frontend lint, and targeted backend route test file (
e2e-routes.test.ts). - No additional broad suites were executed to keep scope minimal.
- Ran minimal relevant non-interactive checks only: backend lint, frontend lint, and targeted backend route test file (
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Frontend lint still reports one warning in
frontend/src/components/MedicationAvatar.tsx(useExhaustiveDependencies, extra dependencyimageUrl). - Pre-PR gate is not clean until this lint warning is resolved.
- Frontend lint still reports one warning in
2026-02-26
- Added mandatory memory/report persistence rules to
.github/copilot-instructions.mdandAGENTS.md. - Removed obsolete mandatory persistence rule for
doku/APP_BEHAVIOR.mdfromAGENTS.md. - Created
doku/memory_notes.mdanddoku/report.mdas the new required persistence/reporting files.
2026-02-26 — Logging Implementation Plan
- 🧩 Task: Create implementation plan to fix noisy logging (nginx 5s polling spam, missing timestamps, unfilterable levels).
- ✅ Decisions:
- Use Fastify per-route
logLeveloption (notdisableRequestLogging) to suppress health/polling request logs. - Suppress
GET /doses/takenandGET /healthatinfolevel (visible atdebug). - Add separate nginx location blocks for polling paths with
access_log offatinfolevel. - Add ISO timestamps to startup logger (
backend/src/utils/logger.ts). - Add
pino-prettyas devDependency for human-readable dev logs. - Use nginx
log_format timedwith$time_iso8601.
- Use Fastify per-route
- 📁 Files touched:
plan/feature-structured-logging-1.md(created). - 🔜 Follow-up: Implement the plan (5 phases, 18 tasks).
2026-02-26 — Logging Plan Implementation (complete)
- 🧩 Task: Implement all 5 phases of the structured logging plan.
- ✅ Decisions:
- Phase 1: Added
logLevel: 'warn'toGET /health,logLevel: 'debug'toGET /doses/takenandGET /share/:token/doses— suppresses Pino automatic request logs atinfolevel. - Phase 2: Updated startup logger (
backend/src/utils/logger.ts) to prepend[ISO timestamp] [LEVEL]prefix. Addedpino-prettydevDependency with transport config active only whenNODE_ENV !== 'production' && !== 'test'. - Phase 3+4: nginx.conf now has dedicated location blocks for polling endpoints using
${NGINX_POLLING_LOG}variable.nginx-entrypoint.shdifferentiatesdebug(all logs) /info(polling suppressed) /warn+(all suppressed). Addedlog_format timedwith ISO timestamps. - Phase 5: Updated
.env.exampleandREADME.mdwith detailed LOG_LEVEL behavior descriptions.
- Phase 1: Added
- 📁 Files touched:
backend/src/routes/health.ts— logLevel: 'warn'backend/src/routes/doses.ts— logLevel: 'debug' on GET /doses/taken and GET /share/:token/dosesbackend/src/utils/logger.ts— ISO timestamps on all startup log messagesbackend/src/index.ts— pino-pretty transport for dev modebackend/package.json— added pino-pretty devDependencyfrontend/nginx.conf— polling location blocks, log_format timedfrontend/nginx-entrypoint.sh— 3-tier LOG_LEVEL logic (debug/info/warn+).env.example— expanded LOG_LEVEL docsREADME.md— expanded LOG_LEVEL description
- 🔜 Follow-up: Docker build + manual verification (TEST-004 through TEST-008). Hand off to @testing-manager for any automated test coverage.
2026-02-26 (follow-up)
- Added a short "How to maintain" template section to this file and to
doku/report.md. - Updated report entry so this follow-up is documented for user review.
2026-02-26 (emoji template follow-up)
- Added emoji-based label conventions for faster scanning in this file template.
- Updated
doku/report.mdtemplate to match the same emoji convention.
2026-02-26 (testing-manager instruction hardening)
- 🧩 Task: Strengthen
testing-manageragent instructions for lint gates, real/reliable tests, and current test setup commands. - ✅ Decisions:
- Added hard lint gate: all errors and simple/fixable warnings must be resolved before PR-ready handoff.
- Added explicit anti-fake-test rules and validity checklist to enforce real functional verification and regression safety.
- Updated backend/frontend Vitest commands to non-watch CI-safe
test:runusage and aligned Playwright examples.
- 📁 Files touched:
.github/agents/testing-manager.agent.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Keep this instruction set mirrored if additional testing policy docs are introduced later.
2026-02-26 (pre-PR local quality gate clarification)
- 🧩 Task: Clarify that PRs must not be created before local lint/tests are green.
- ✅ Decisions:
- Added explicit rule: before PR creation, all lint errors and relevant tests must pass locally.
- Added explicit rule: no CI-first failures; broken behavior must reproduce and be fixed locally before handoff.
- 📁 Files touched:
.github/agents/testing-manager.agent.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Apply same wording to other governance docs only if requested.
2026-02-26 (release-manager local gate alignment)
- 🧩 Task: Apply the same pre-PR local lint/test gate policy to
release-managerinstructions. - ✅ Decisions:
- Added explicit pre-PR local quality gate requirement to
release-managercritical rules. - Added explicit no CI-first-failure policy for release orchestration.
- Updated PR workflow steps to require local gate confirmation before push/PR creation.
- Added explicit pre-PR local quality gate requirement to
- 📁 Files touched:
.github/agents/release-manager.agent.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Keep both manager agents (
testing-manager,release-manager) aligned on this gate language.
- Keep both manager agents (
2026-02-26 (React 19 upgrade best-practice clarification)
- 🧩 Task: Validate and refine the React 19 upgrade plan with official guidance.
- ✅ Decisions:
- Keep
@types/reactand@types/react-dom, but bump both to^19.xduring the React upgrade. - Do not force
useContexttouse()migration in the upgrade PR; only fix what is required for compatibility. - Keep strict scope boundary: version upgrade only; adopt new React 19 features in separate follow-up PRs.
- Keep
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- When implementation starts, apply the same scope boundary in commit and PR structure.
2026-02-26 (React 19 implementation)
- 🧩 Task: Implement the scoped React 19 dependency upgrade.
- ✅ Decisions:
- Upgraded
react/react-domto^19.2.0. - Kept
@types/reactand@types/react-domand upgraded both to^19.2.2. - Did not include optional API migrations (
useContexttouse(), Actions APIs, RSC changes).
- Upgraded
- 📁 Files touched:
frontend/package.jsonfrontend/package-lock.jsondoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Run local install/lint/check in a dedicated testing handoff to validate full dependency tree behavior.
2026-02-26 (testing handoff run for React 19 upgrade)
- 🧩 Task: Execute frontend lint/check/relevant tests and apply only mandatory compatibility fixes.
- ✅ Decisions:
- Fixed only strict compatibility/type issues in touched tests (
ics,schedule,MobileEditModal) without feature migration. - Did not expand scope into broad unrelated test refactors.
- Fixed only strict compatibility/type issues in touched tests (
- 📁 Files touched:
frontend/src/test/utils/ics.test.tsfrontend/src/test/utils/schedule.test.tsfrontend/src/test/components/MobileEditModal.test.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
frontend checkstill blocked by unrelatedMedDetailModal.test.tsxprop-shape mismatches (usePrescriptionRefill,onUsePrescriptionRefillChange, andRefillEntryfield changes).- Existing lint warning remains in
frontend/src/components/MedicationAvatar.tsx(useExhaustiveDependencies).
2026-02-26 (blocker follow-up: lint fix + testing-manager handoff)
- 🧩 Task: Remove remaining lint warning and prepare formal handoff for out-of-scope MedDetailModal test drift.
- ✅ Decisions:
- Fixed
MedicationAvatarwarning by tracking previousimageUrlvia ref in effect logic. - Kept
MedDetailModal.test.tsxchanges out of this implementation due testing ownership boundary and prepared explicit handoff content instead.
- Fixed
- 📁 Files touched:
frontend/src/components/MedicationAvatar.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
@testing-managershould alignMedDetailModaltests with currentMedDetailModalProps(usePrescriptionRefill,onUsePrescriptionRefillChange) andRefillEntryshape (refillDate,loosePillsAdded).
2026-02-26 (automatic delegation preference applied)
- 🧩 Task: Apply user preference to delegate testing work automatically without additional confirmation prompts.
- ✅ Decisions:
- Hand off residual test/type drift work to
@testing-managerimmediately when detected. - Do not pause for approval before delegation unless there is a blocking ambiguity.
- Hand off residual test/type drift work to
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Keep this delegation style for future testing ownership boundaries.
2026-02-26 (continued type-fix sweep to green frontend check)
- 🧩 Task: Continue and clear remaining
frontend checkblockers after delegated MedDetailModal fixes. - ✅ Decisions:
- Applied minimal compatibility fixes in production files only where type/lint failed (
MobileEditModal,SharedSchedule,AppContext,dashboard-helpers,DashboardPage,stock.ts). - Applied fixture-only updates in tests for new required
Medication/StockThresholdsshapes and minor mock typing issues. - Kept scope to type/lint compatibility; no feature behavior migration.
- Applied minimal compatibility fixes in production files only where type/lint failed (
- 📁 Files touched:
frontend/src/components/MobileEditModal.tsxfrontend/src/components/SharedSchedule.tsxfrontend/src/context/AppContext.tsxfrontend/src/pages/dashboard-helpers.tsfrontend/src/pages/DashboardPage.tsxfrontend/src/utils/stock.tsfrontend/src/test/setup.tsfrontend/src/test/components/Lightbox.test.tsxfrontend/src/test/components/UserFilterModal.test.tsxfrontend/src/test/context/AppContext.test.tsxfrontend/src/test/hooks/useMedications.test.tsfrontend/src/test/hooks/useRefill.test.tsfrontend/src/test/hooks/useSettings.test.tsfrontend/src/test/hooks/useShare.test.tsfrontend/src/test/utils/formatters.test.tsfrontend/src/test/utils/schedule.test.tsdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
frontend checkis now green.- Focused tests pass; remaining broader suite execution can be done as separate validation step if requested.
2026-02-26 (npm EINTEGRITY fix)
- 🧩 Task: Resolve npm tarball corruption/integrity install failure after React 19 lockfile update.
- ✅ Decisions:
- Verified official registry integrity values with
npm viewand corrected lockfile hashes. - Did not change versions; only fixed integrity metadata for
@types/react@19.2.2and@types/react-dom@19.2.2.
- Verified official registry integrity values with
2026-02-26 (dependency update automation)
- 🧩 Task: Implement automatic dependency update flow with safe merge policy.
- ✅ Decisions:
- Extended existing
.github/dependabot.ymlinstead of replacing it. - Added grouped minor/patch updates for root npm and GitHub Actions, plus scoped labels (
frontend,backend,root). - Added
.github/workflows/dependabot-automerge.ymlto enable auto-merge only for Dependabot npm/GitHub Actions patch+minor updates. - Kept major updates manual by design.
- Synced docs in
README.mdand updated React badge to 19.
- Extended existing
- 📁 Files touched:
.github/dependabot.yml.github/workflows/dependabot-automerge.ymlREADME.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- If branch protection requires specific checks, ensure required status checks are set so auto-merge waits correctly.
- 📁 Files touched:
frontend/package-lock.jsondoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
npm cinow succeeds cleanly.
2026-02-26 (npm deprecation warnings assessment)
- 🧩 Task: Assess reported npm deprecation warnings and identify real source/package owners.
- ✅ Decisions:
- Warnings are not from
frontend; they originate inbackendtransitive dependencies. @esbuild-kit/*comes fromdrizzle-kit@0.31.9(currently latest).node-domexceptioncomes via@libsql/client -> node-fetch -> fetch-blob(currently latest published chain).- Treat as non-blocking upstream warnings for now (no local secure/functional regression).
- Warnings are not from
- 📁 Files touched:
doku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Re-check on future dependency releases; warnings can be removed once upstream chains migrate.
2026-02-26 (MedDetailModal test type drift fix)
- 🧩 Task: Unblock the targeted
MedDetailModaltest type drift after React 19 changes. - ✅ Decisions:
- Kept scope minimal and test-only: updated
frontend/src/test/components/MedDetailModal.test.tsxonly. - Added missing required props in
defaultProps:usePrescriptionRefill,onUsePrescriptionRefillChange. - Updated
RefillEntryfixtures to current shape by replacing legacy fields withrefillDateandloosePillsAdded. - Did not run the targeted test command because the requested precondition (
npm run checkpassing) is not met.
- Kept scope minimal and test-only: updated
- 📁 Files touched:
frontend/src/test/components/MedDetailModal.test.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
frontend checkremains blocked by unrelated TypeScript errors in other files (outside MedDetailModal test scope).
2026-02-27 (package types plan decision lock)
- 🧩 Task: Capture user-approved decisions for lifecycle derivation and V1 scope in package type planning.
- ✅ Decisions:
ongoingis derived fromendDate == nulland should not be stored as an explicit lifecycle value.- V1 form scope remains exactly 4 forms (
Capsule,Tablet,Liquid,Topical) without subforms. autoMarkObsoleteAfterEndDatedefault istrue.- Updated wording to remove ambiguous
restorelabel in lifecycle section.
- 📁 Files touched:
doku/package_types.mddoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Reflect these locked decisions in implementation tickets before coding starts.
2026-02-27 (implemented V1 medication form model in web app)
- 🧩 Task: Implement the approved V1 medication-form concept end-to-end on website (desktop + mobile) with persistence.
- ✅ Decisions:
- Added persisted fields:
medicationForm,pillForm,lifecycleCategory,medicationEndDate,autoMarkObsoleteAfterEndDate. - Kept
ongoingderived only: no explicit storedongoingvalue introduced. - Enforced validation rules:
pillFormrequired for capsule/tablet medication forms.- fractional intake forbidden for capsule.
- liquid/topical restricted to bottle container.
- Implemented automatic obsolete marking during medication fetch when end date has passed and auto-mark toggle is enabled.
- Preserved desktop/mobile parity by adding identical form controls to
MedicationsPageandMobileEditModal. - Updated export/import format to include new metadata (
EXPORT_VERSIONbumped to1.2).
- Added persisted fields:
- 📁 Files touched:
backend/src/db/schema.tsbackend/src/db/db-utils.tsbackend/src/routes/medications.tsbackend/src/routes/export.tsbackend/drizzle/0011_stiff_randall_flagg.sqlbackend/drizzle/meta/_journal.jsonbackend/drizzle/meta/0011_snapshot.jsonfrontend/src/types/index.tsfrontend/src/hooks/useMedicationForm.tsfrontend/src/pages/MedicationsPage.tsxfrontend/src/components/MobileEditModal.tsxfrontend/src/i18n/en.jsonfrontend/src/i18n/de.jsonfrontend/src/test/components/MobileEditModal.test.tsxdoku/memory_notes.mddoku/report.md
- 🔜 Follow-up/open points:
- Full repo-wide frontend
npm run checkstill reports unrelated pre-existing e2e formatting issues outside this scope.
- Full repo-wide frontend