Files
narl-workspace/PLAN.md
T
nvrl 71f90a75d9 plan: the findings are fixed
Each finding from the docs pass now names the commit that fixed it. The two
limits of search that stay — ranks from two indexes, no PDF text — say why
they stay.
2026-10-21 12:54:45 +02:00

70 lines
4.1 KiB
Markdown

# Findings, possible bugs, and what comes next
Written on 2026-10-21, after the seven slices of the feature plan had landed
(trash `8ffad63`, revisions `fc2be66`, links `a42f907`, capture tokens
`f629f5a`, diary `824f2bb`, recurring cards `6673298`, search in files
`909abf5`). That plan has fully landed, and git keeps it.
These came out of writing the wiki, taking the screenshots against a fresh
workspace, and probing the API on a throwaway server. All of them are fixed
now, except two limits of search noted at the end of the list.
## Fixed
| | finding | fix |
| --- | --- | --- |
| 1 | A rename sent the whole node without the version it had seen, so it could write a stale draft over a save made elsewhere. | `3a6ad94`: a rename sends the name alone, with the tile's `updated_at` when the document is open, and is refused like `:w` when it was saved since. |
| 2 | `PUT /api/nodes/{id}` without `body` emptied the document. | `3a6ad94`: every field changes only when it is sent. |
| 3 | A search of only punctuation answered with the list of spaces. | `a1f6f60`: it finds nothing. |
| 4 | The agenda grouped cards and opened itself by the browser's day, not `WORKSPACE_TIMEZONE`, and took a day to be 24 hours. | `0e0d215`: the agenda answer carries `today` with its bounds, from the same `day_bounds` the mails use. |
| 5 | Two spaces could share a name. | `a1f6f60`: refused, in any case or by slug, for a new space, a rename, and `mkdir` at the root of the mount. |
| 6 | Names had no length limit. | `a1f6f60`: at most 200 characters. |
| 7 | A hard-wrapped paragraph rendered with a break in every line. | `767dd07`: a paragraph that looks wrapped at a width has its soft breaks read as spaces; hand-broken lines and explicit breaks stay. |
| 8 | A fresh clone did not compile before the frontend was built. | `a59ba4a`: `allow_missing` on the embed. |
| 9 | Indexing a file walked every file node on each write, and the excerpt did not mark the match. | `c72b65f`: a write reads only the folder it wrote into, and the matched words are lit. |
### Still open, on purpose
- Results from documents and from files are ranked by two separate BM25
indexes, so their order relative to each other is approximate. A shared
rank would mean one index for both, which costs more than it gives for a
list this short.
- PDFs and office documents are not read for search. That needs a parser
crate, and waits until it is missed.
## Docs and tooling, done in this pass
- An icon, `~/` and a block cursor, as the favicon, the touch icon, and the
mark in the bar, the login and the share page.
- A README that opens with the banner, the badges, screenshots and the
features grouped by what they are for.
- A wiki in `docs/wiki`: a getting-started page, a guide that walks through a
day, a page per part of the app, and three reference pages generated from the
code (`scripts/wiki.ts`).
- Screenshots in `docs/images`, taken by `scripts/screenshots.ts` against a
throwaway workspace, so they can be taken again when the UI changes.
- CI: `.github/workflows/ci.yml` runs the Rust checks, svelte-check and the
wiki check on every push. `.github/workflows/wiki.yml` publishes the wiki on
every push to `main`.
**Before the first wiki publish:** GitHub creates a wiki's repository only
when its first page is saved, so save any page once in the repository's Wiki
tab. The workflow replaces it on its first run.
## Next, unplanned
Carried over from the last plan, still not started:
- Install the app on a phone (a PWA: manifest plus a service worker for the
app shell, CSP `worker-src 'self'`), with a share target that posts into
capture. The new icon is ready for the manifest.
- Task lists: toggle `- [ ]` in the reader, and `:tasks` gathers the open ones
in a space.
- A daily review in the agenda: yesterday's entry, what was finished this week,
and cards in `doing` for more than 14 days.
- Marks: `ma` … `mz` per document, `'a` to jump. This clashes with `m` for
picking nodes up, so choose the keys first.
- Mail-in capture: IMAP polling of a plus-address into the inbox.
Suggested next: the PWA, which the new icon makes cheap.