Record that downloads fill the Cache and ship the built app.

A failed open can repair the shell, and the installed PWA matches Ziele, Einstellungen, and the view download.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-09 08:55:43 +02:00
co-authored by Cursor
parent 2f1fab202e
commit 3a49d52681
36 changed files with 1801 additions and 24 deletions
+1 -1
View File
@@ -4,6 +4,6 @@ status: accepted
# Offline PWA with prepared raster tiles
The Karte is an installable app for phone and tablet, with no app store and no live map server. The Mac turns the DTK25 Blätter into Kacheln once. A Kachel reaches the device because the user downloads a Gebiet, or because the open Karte needs it and the device is online. The open Karte reads only the Kacheln inside the current view. The furthest zoom-out is a ground span shipped in the app configuration, 36 km by 36 km unless that file is changed. The prepared Kacheln cover every scale from that span down to the native sheet pixel. Downloading a Gebiet fetches all of those scales, the current view first. Downloads run only while that app is open and the device is online; leaving the app pauses them, and opening it again continues them. Which of those Kacheln a delete keeps is [ADR 0002](0002-cached-tiles-follow-downloaded-gebiete.md).
The Karte is an installable app for phone and tablet, with no app store and no live map server. The Mac turns the DTK25 Blätter into Kacheln once. A Kachel reaches the device because the user fetches it into the Cache, or because the open Karte needs it and the device is online. The open Karte reads only the Kacheln inside the current view. The furthest zoom-out is a ground span shipped in the app configuration, 36 km by 36 km unless that file is changed. The prepared Kacheln cover every scale from that span down to the native sheet pixel. Fetching Hessen, or fetching the Kacheln that intersect the current view, covers every one of those scales, the Kacheln of the current scale first. Fetches run only while that app is open and the device is online. Leaving the app stops them, and opening it again does not continue them. While the app stays open, losing the network pauses a fetch and regaining it continues that fetch. Looking around fetches only the current view at the current scale. Kacheln leave the device only when the whole Cache is deleted. Why a download does not mark a Gebiet is [ADR 0003](0003-downloads-fill-the-cache.md).
A macOS desktop app was rejected. Serving the original GeoTIFFs from the Mac while the phone is on the same network was rejected, because the Karte has to work after the download, with that computer left behind.
@@ -1,5 +1,5 @@
---
status: accepted
status: superseded by ADR-0003
---
# Cached Kacheln follow the Gebiete still marked downloaded
+11
View File
@@ -0,0 +1,11 @@
---
status: accepted
---
# Downloads fill the Cache
A download writes missing Kacheln into the Cache and does not mark a Gebiet. Hessen means every Kachel of that Gebiet. The current view means every Kachel that intersects the view at the moment of the request, at every prepared scale. Closing the app stops that fetch, and opening the app does not continue it; the same request fetches what is still missing. While the app stays open, losing the network pauses the fetch and regaining it continues it. Hessen is complete when every one of its Kacheln is in the Cache. Kacheln leave the device only when the whole Cache is deleted.
Remembering which Gebiet a download had claimed was rejected. That mark existed so removing one Gebiet could spare a Kachel still claimed by another, and so a download could resume when the app opened. Selective removal and resume-on-open are both dropped.
Supersedes [ADR 0002](0002-cached-tiles-follow-downloaded-gebiete.md) and the resume-on-open and delete-retention sentences of [ADR 0001](0001-offline-pwa-prepared-tiles.md).
+7 -7
View File
@@ -4,15 +4,15 @@ Issues and specs for this repo live as markdown files in `.scratch/`.
## Conventions
- One feature per directory: `.scratch/<feature-slug>/`
- The spec is `.scratch/<feature-slug>/spec.md`
- Implementation issues are one file per ticket at `.scratch/<feature-slug>/issues/<NN>-<slug>.md`, numbered from `01`, never a single combined tickets file
- One feature per directory, named with the local date and time when it is created: `.scratch/<YYYY-MM-DD>_<HH-mm>-<feature-slug>/`. Example: `.scratch/2026-10-09_07-31-einstellungen-und-ziele/`. The clock is 24-hour local time. Every new directory directly under `.scratch/` starts with that prefix, including wayfinding efforts.
- The spec is `.scratch/<YYYY-MM-DD>_<HH-mm>-<feature-slug>/spec.md`
- Implementation issues are one file per ticket at `.scratch/<YYYY-MM-DD>_<HH-mm>-<feature-slug>/issues/<NN>-<slug>.md`, numbered from `01`, never a single combined tickets file
- Triage state is recorded as a `Status:` line near the top of each issue file (see `triage-labels.md` for the role strings)
- Comments and conversation history append to the bottom of the file under a `## Comments` heading
## When a skill says "publish to the issue tracker"
Create a new file under `.scratch/<feature-slug>/` (creating the directory if needed).
Create a new file under `.scratch/<YYYY-MM-DD>_<HH-mm>-<feature-slug>/` (creating the directory if needed). Take the date and time at the moment the directory is created. Do not invent a second prefix for files added later inside that directory.
## When a skill says "fetch the relevant ticket"
@@ -22,9 +22,9 @@ Read the file at the referenced path. The user will normally pass the path or th
Used by `/wayfinder`. The **map** is a file with one **child** file per ticket.
- **Map**: `.scratch/<effort>/map.md` (the Notes / Decisions-so-far / Fog body).
- **Child ticket**: `.scratch/<effort>/issues/NN-<slug>.md`, numbered from `01`, with the question in the body. A `Type:` line records the ticket type (`research`/`prototype`/`grilling`/`task`); a `Status:` line records `claimed`/`resolved`.
- **Map**: `.scratch/<YYYY-MM-DD>_<HH-mm>-<effort>/map.md` (the Notes / Decisions-so-far / Fog body).
- **Child ticket**: `.scratch/<YYYY-MM-DD>_<HH-mm>-<effort>/issues/NN-<slug>.md`, numbered from `01`, with the question in the body. A `Type:` line records the ticket type (`research`/`prototype`/`grilling`/`task`); a `Status:` line records `claimed`/`resolved`.
- **Blocking**: a `Blocked by: NN, NN` line near the top. A ticket is unblocked when every file it lists is `resolved`.
- **Frontier**: scan `.scratch/<effort>/issues/` for files that are open, unblocked, and unclaimed; first by number wins.
- **Frontier**: scan `.scratch/<YYYY-MM-DD>_<HH-mm>-<effort>/issues/` for files that are open, unblocked, and unclaimed; first by number wins.
- **Claim**: set `Status: claimed` and save before any work.
- **Resolve**: append the answer under an `## Answer` heading, set `Status: resolved`, then append a context pointer (gist + link) to the map's Decisions-so-far in `map.md`.