AtlatestRenderedmarkdown
Readme

Changelog

All notable changes to folio are documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.2.7] - 2026-08-02

Fixed

  • Moving a task no longer renumbers it. Ids are preserved in every direction — inbox → project, project → inbox, project → project, and folio/inbox-triage. An id you hold before a move is still valid after it, so task-movetask-update <same-id> chains correctly and a triage plan built from an inbox dump keeps working once the items are routed.

This was never a design constraint. Ids are globally unique random hex with no per-project id space, so nothing required a new one on move. project-add-task! simply called generate-task-id unconditionally and ignored any id handed to it, while move-task-in-store! stripped the id out on the way in. The asymmetry gave it away as an oversight: project → inbox passed metadata through untouched, and only inbox → project destroyed the id.

  • A task can no longer end up carrying two id entries. Moving a task from a project back to the inbox prepended a fresh id without removing the existing one, leaving both on the line; lookups silently resolved the first.

Added

  • folio/task-move-batch — move many tasks in one call, either {ids: [...], project: "x"} for a shared target or {moves: [{id, project}, ...]} to fan a single call out across many projects. An entry with no project moves that task to the inbox.

Returns a result line per id so partial failures are visible rather than swallowed, and the header counts successes rather than attempts. Because ids are now stable, the reported id is the one the task landed under.

Triaging 227 inbox items on 2026-08-02 cost 226 individual round-trips, which is a large part of why that inbox went untriaged for four months.

Changed

  • Toolchain moved to sigil 0.18 (sigil ^0.18, sigil-run ^0.18.0, sigil-http ^0.18.0, sigil-sxml ^0.15.0), with runtime core resolving to 0.18.1. sigil-test / sigil-test-runner remain pinned at ^0.17 (0.17.16): bumping them aborts the install because sigil-http, sigil-tls, sigil-crypto and sigil-web-styles each declare a dev-dependency on sigil-test ^0.17 and the resolver unifies across the graph. That affects the test harness only, not the shipped runtime, and clears once those four repos move their dev-dep.

Known issues

  • A capture containing newlines is still stored in a shape folio cannot read back. folio/inbox-add accepts multi-line text, but the {id: ...} metadata is appended to the END of the text, so on a multi-line capture it lands on the item's last line. The parser sees only the first line, which has no id, and backfill-ids! then mints a fresh id onto it — the real item and its metadata become unreachable and a phantom one-line duplicate appears in its place. Six items were hidden this way between April and August 2026.

This is not fixed in 0.2.7. A block-parsing fix was written and withdrawn: it cured the burial but introduced worse defects, because it inferred where an item ends and then let destructive operations act on that inference. The redesign makes an item's extent syntactic rather than inferred.

Until it lands, capture multi-line content as a note and reference it from a single-line inbox item, rather than putting the body in the item itself.