Closes Fase 17 (v1.0 · 1/4). Bumps package.json `version` to `1.0.0-rc.0` — picked up by apps/web/vite.config.ts's `__APP_VERSION__` define, so the next built bundle reads it. The plain `1.0.0` tag is reserved for the close of Fase 20 (Euskera locale) per the v1.0 plan. Updates CLAUDE.md to mark the v1.0 cycle as in-progress (1/4 ✅) and adds the per-fase history docs (Fase 13–17) to the documentation map. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
7.1 KiB
Fase 17 — Versioning + CHANGELOG + about modal (v1.0 · 1/4)
Status: ✅ Shipped 2026-05-19.
First fase of the v1.0 cycle. Lands the version-tracking infrastructure that every later v1.0 fase will register entries against. No DB migration, no new RPCs — pure tooling + UI plus the BETA backfill.
Plan: plan/fase-17-versioning-changelog.md.
What changed
17.1 — CHANGELOG.md + Keep-a-Changelog linter
- New
CHANGELOG.mdat the repo root. Keep-a-Changelog header +[Unreleased]placeholder + one big[v0.0.0-beta] — 2026-05-19 — MVP + MVP2 (Fases 0–16)section. 58 bullets grouped by area: auth + identity, shopping lists + items, tasks + notes, search, mobile UX + a11y, PWA + offline, collective management, server admin, i18n, infra + deploy. Each bullet prefixed[new] / [fix] / [tweak]. Slightly over the 30–50 target range because 17 fases of feature surface is a lot to compress without losing signal. - New
scripts/check-changelog.mjsvalidates (a) the Keep-a-Changelog header line, (b) every release heading matches## [vX.Y.Z] — YYYY-MM-DD(semver-with-optional-prerelease), (c) every bullet starts with[new] / [fix] / [tweak]. Lines that end in:are exempt — they're the area sub-titles, intentionally prefix-less. - Wired into
just check. Exit code 2 on validation failure, 1 on missing file. No pre-commit hook — the plan's "warn-only" stance.
17.2 — ChangelogModal.svelte + /settings integration
- New
apps/web/src/lib/components/ChangelogModal.svelte. CHANGELOG is bundled at build time via Vite's?rawquery — the import path is'../../../../../CHANGELOG.md?raw'(5 levels up:components → lib → src → web → apps → repo-root). The plan estimated 3; the off-by-two is documented in the component's leading comment for anyone moving the file later. - Inline markdown parser handles
#/##/###headers,-/*bullets,**bold**. HTML-escapes every input line before re-wrapping with our own tags — the input is static repo content, so this is defence-in-depth rather than a sanitisation barrier. - Layout reuses the
CreateCollectiveModaloverlay pattern:fixed inset-0 z-50overlay withbg-black/40, panelmax-w-2xlcentred, scrollable bodymax-h-[70vh]. Close via overlay-click or Escape. - Three new Paraglide messages (en + es):
settings_about_view_changelog,changelog_modal_title,changelog_modal_close. /settings› About section gains a discreet underlined text-button "Ver historial" beneath the existing version chip. Click setsshowChangelog = true; the modal mounts at the bottom of the template so it stacks above the delete-account / leave-collective modals.
17.3 — deploy + rollback tag handling
infra/scripts/deploy-erosi.shnow runsgit describe --exact-match --tags HEADbefore rsync. When HEAD is between tags, prints a yellowWARNINGand sleeps 5s — operator can Ctrl-C, tag, and re-run. When a tag is present, the banner readscommit <sha>, tag <tag>.- The success-log line in
.deploys.loggains a 4th tab-separated column: the tag (empty when absent). Compat with pre-Fase-17 3-column rows is preserved — the rollback script'scut -f1..3keeps reading the older rows, andcut -f4returns empty. infra/scripts/rollback-erosi.sh:--listreformats each row via awk so the tag is visible (placeholder(no tag)for pre-Fase-17 rows). Falls back to the raw log if awk isn't on PATH.- The target-row banner shows
git tag: <tag>when present.
17.4 — Tests
- Unit (
apps/web/src/lib/components/ChangelogModal.test.ts):- CHM-U-01
open={false}renders nothing. - CHM-U-02
open={true}renders the CHANGELOG<h1 class="...">Changelog</h1>. - CHM-U-03 overlay click fires
onClose. - CHM-U-04 Escape fires
onClose. NeedsflushSync()fromsvelteaftermount()because$effectruns in a microtask — without flushing, the keydown listener isn't attached when the test dispatches Escape.
- CHM-U-01
- Playwright (
apps/web/tests/e2e/changelog.test.ts):- CL-01 Ana opens
/settings, clicks "Ver historial", asserts the modal +<h1>Changelog</h1>+ a/v0\.0\.0-beta/match in the body. - CL-02 Esc closes the modal.
- CL-01 Ana opens
- Linter test is the script itself — runs at
just checktime.
17.Z — Version + tag
package.jsonversionbumped to1.0.0-rc.0. This is the start of the v1.0 cycle; the1.0.0(no suffix) tag is reserved for the close of Fase 20 (Euskera locale) per the plan.- Local tag
v1.0.0-rc.0created on HEAD viagit tag -a. NOT pushed to the remote — that's a manual step the operator decides on.
Test deltas (Fase 17 only)
| Suite | Before | After | Δ |
|---|---|---|---|
pgTAP (just test-db) |
177 | 177 | 0 |
Vitest integration (just test-integration) |
179 + 3 skipped | 179 + 3 skipped | 0 |
Vitest unit (just test-unit) |
52 | 56 | +4 (CHM-U-01..04) |
Playwright e2e (just test-e2e) |
96 | 98 | +2 (CL-01, CL-02) |
| Gated rate-limit | 1 | 1 | 0 |
Files added
CHANGELOG.mdscripts/check-changelog.mjsapps/web/src/lib/components/ChangelogModal.svelteapps/web/src/lib/components/ChangelogModal.test.tsapps/web/tests/e2e/changelog.test.tsdocs/history/fase-17-versioning-changelog.md(this file)
Files modified
Justfile—checkrecipe runs the linter beforepnpm turbo run check.apps/web/messages/en.json,apps/web/messages/es.json— 3 new keys.apps/web/src/routes/(app)/settings/+page.svelte— About section trigger + modal mount.infra/scripts/deploy-erosi.sh— tag check + tag column in.deploys.log.infra/scripts/rollback-erosi.sh—--listshows tag, target banner shows tag.package.json— version1.0.0-rc.0.
Decisions documented
-
Bundle CHANGELOG via
?raw, not fetch. Avoids a runtime round-trip, dodges the SW precache miss, and works under adapter-node SSR without filesystem reads. Bundle size cost ~6 KB today. Revisit (dynamic import, marked, etc.) when it grows past ~30 KB or starts using non-trivial markdown (tables, code blocks). -
Tag check is warn + sleep, not abort. Hotfix deploys must still be possible from untagged commits. The 5-second window is enough to Ctrl-C, tag, and retry without being annoying on regular tagged deploys.
-
.deploys.log4th column instead of a new file. Backwards-compatible — older rows stay readable, the rollback script's existingcut -f1..3works, andcut -f4returns empty for pre-Fase-17 rows (the right "no tag" sentinel). -
No GitHub Releases sync, no push of tags from the deploy script. Both are explicit non-goals in the plan §"Scope explícito fuera". Operator pushes tags manually if/when they want a public release page.
-
Markdown parser inline, not
marked. Keep-a-Changelog only uses headers, lists, and bold — 30 lines ofString.replacecover that. If a future entry needs tables / code blocks / links, swap tomarked(~30 KB minified) at that point. -
5-levels-up
?rawpath, not 3. The plan estimated 3; the actual depth fromapps/web/src/lib/components/to the repo root is 5. The component comment documents the path explicitly so the next person who moves the file isn't surprised.