<feed xmlns='http://www.w3.org/2005/Atom'>
<title>home-sveltekit/src/lib/server, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://git.kagamino.dev/home-sveltekit/atom?h=main</id>
<link rel='self' href='https://git.kagamino.dev/home-sveltekit/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/'/>
<updated>2026-10-05T22:46:53Z</updated>
<entry>
<title>fix: make grocery and reference ordering deterministic</title>
<updated>2026-10-05T22:46:53Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-10-05T22:46:53Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=c915f91fbe8d97201d813c792f4e1fe8c4401e15'/>
<id>urn:sha1:c915f91fbe8d97201d813c792f4e1fe8c4401e15</id>
<content type='text'>
Every list query lacked a tiebreak, so rows sharing a sort key (same-ms
createdAt inserts, tied or NULL quality scores) came back in unspecified
order and bestRef flipped between loads. Add explicit tiebreaks: items
createdAt desc, id desc (newest first); references qualityScore desc,
id asc (first inserted wins ties). Categories were already total
(order, name unique).

Pin the rules with service tests.
</content>
</entry>
<entry>
<title>Allow granular routine frequencies like 5/2w</title>
<updated>2026-09-30T20:13:07Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-30T20:13:07Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=a725d4c7d28fee701b6997cc46cffddefbcd26bf'/>
<id>urn:sha1:a725d4c7d28fee701b6997cc46cffddefbcd26bf</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Allow backdating a routine completion</title>
<updated>2026-09-26T07:03:12Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-26T07:03:12Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=f07c98fb888a5b56ba15d307a3afbdaf4209eaa3'/>
<id>urn:sha1:f07c98fb888a5b56ba15d307a3afbdaf4209eaa3</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Compress comments to terse single lines within line width</title>
<updated>2026-09-25T07:10:31Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-25T07:10:31Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=760a61001edafb462ca9c7f5bc8013f31fb15a5c'/>
<id>urn:sha1:760a61001edafb462ca9c7f5bc8013f31fb15a5c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Migrate date handling from Date to Temporal API</title>
<updated>2026-09-08T15:06:51Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-08T15:06:51Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=bd2f982c489b15ce1165c051fdedf35af979f784'/>
<id>urn:sha1:bd2f982c489b15ce1165c051fdedf35af979f784</id>
<content type='text'>
Routine scheduling, health series, service stamps, session expiry, and
date formatting move to native Temporal (Instant / ZonedDateTime in
UTC), with ISO strings kept at DB and chart boundaries. Ambient types
in src/temporal-ambient.d.ts cover the native runtime; no polyfill.
Observable behavior and stored formats are unchanged.
</content>
</entry>
<entry>
<title>Late only after a full missed period</title>
<updated>2026-09-08T13:53:07Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-08T13:53:07Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=6d69c7b1e6a8051338e052cc9d1836f4f1a20f51'/>
<id>urn:sha1:6d69c7b1e6a8051338e052cc9d1836f4f1a20f51</id>
<content type='text'>
Status buckets shift a full period out: due until an occurrence is
skipped entirely, late after one, very late after two. Health decay
halves (100 - ratio*50) so 50 marks late and 0 marks veryLate.
</content>
</entry>
<entry>
<title>Project health chart on LayerChart</title>
<updated>2026-09-08T11:44:59Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-08T11:44:59Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=212c3adc8a584e6517a2816fc6683688d5ac5d7a'/>
<id>urn:sha1:212c3adc8a584e6517a2816fc6683688d5ac5d7a</id>
<content type='text'>
Project page gets a Sante chart: daily mean of per-routine health
via computeProjectHealthSeries, ending at the current health score.
Both charts share a HealthChart component built on LayerChart's
AreaChart (time x-axis, fixed 0-100 y-axis, completion dots).
</content>
</entry>
<entry>
<title>Share grocery row component and list-page form actions</title>
<updated>2026-09-08T07:25:03Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-08T07:25:03Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=3148742b323ab71f1ef768a2f4dc353c00944034'/>
<id>urn:sha1:3148742b323ab71f1ef768a2f4dc353c00944034</id>
<content type='text'>
- GroceryRow.svelte renders the toggle row (checkbox, name, best ref,
  arrow link) for both the list and catalog pages
- grocery-actions.ts grows full form actions: addCategoryAction,
  addGroceryAction, addGroceryAndEditAction, deleteByIdAction; the
  categories/groceries route servers become thin wrappers
</content>
</entry>
<entry>
<title>Consolidate duplicated page CSS into app.css, share TestDb type</title>
<updated>2026-09-08T07:12:25Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-08T07:12:25Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=7d85a18867ca0fe2310218c63cfc696c0f916171'/>
<id>urn:sha1:7d85a18867ca0fe2310218c63cfc696c0f916171</id>
<content type='text'>
- Move .page-header/.back-link/.input-invalid/.save-status/.btn-done
  (plus hover/variant rules) into app.css as shared route scaffolding;
  delete per-page scoped copies
- Unify drifted values: page-header padding 1rem -&gt; 1.25rem (routine
  page), empty-state spacing 0.75/1.5rem -&gt; 1/2rem (grocery detail),
  save-status margin -0.25rem applied on both pages, back-link margin
  1.5rem -&gt; 1rem (grocery detail); routine page's large Fait button is
  kept via a .btn-done-lg modifier
- Export TestDb from test-helper and use it in the five db/service
  test files to shrink duplicated fixture scaffolding
</content>
</entry>
<entry>
<title>Deduplicate routine actions and badges across project routes</title>
<updated>2026-09-08T06:57:08Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-08T06:57:08Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/home-sveltekit/commit/?id=4b2b964283075712de98743720ff3e31370ddc8e'/>
<id>urn:sha1:4b2b964283075712de98743720ff3e31370ddc8e</id>
<content type='text'>
- Share edit/complete/archive form actions in routine-actions.ts; route
  servers become thin wrappers (strictest guard semantics in one place)
- Move parseFrequencyDays into validation.ts
- Extract ScoreBadge/StatusBadge components; use on project pages and
  the home page instead of duplicated scoreClass/statusClass helpers
- Fix archiveProject calling the routine archive with the project id
</content>
</entry>
</feed>
