Bump to 0.2.7 on the sigil 0.18 toolchain, add a changelog
Patch, not minor: the pre-1.0 convention reserves a minor bump for genuinely-breaking API changes. A new tool is additive, and stable ids are a fix to behaviour callers already had to work around. Substance is carried by the changelog and the tag message.
sigil ^0.18, sigil-run ^0.18.0, sigil-http ^0.18.0, sigil-sxml ^0.15.0, plus the patch bumps sigil deps update found. Runtime core resolves to 0.18.1. sigil-test stays at ^0.17 with a comment explaining why, so the next reader does not "fix" the pin and hit the install abort.
First changelog for this repo; format follows sigil-http, the only sibling with one. It has a Known issues section recording that multi-line inbox captures are STILL buried, because a user reading a release note needs to know what is not fixed at least as much as what is.
README documents the bulk tools -- none of them were listed, not even the pre-existing task-complete-batch, task-sweep and inbox-sweep -- and carries the same one-line-capture warning.
CHANGELOG.md | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
README.md | 37 +++++++++++++++++++++++++++++++++++++
package.sgl | 16 +++++++++++-----
sigil.lock | 61 ++++++++++++++++++++++++++++---------------------------------
4 files changed, 145 insertions(+), 38 deletions(-)CHANGELOG.mdadded
# ChangelogAll notable changes to **folio** are documented in this file.The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).## [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-move` → `task-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.README.mdmodified
| `folio/task-update` | Update task metadata (priority, due, tags, waiting) || `folio/task-move` | Move a task between projects or to inbox |A task's id is stable: moving it between the inbox and a project, or betweenprojects, preserves the id it already had.### Bulk operationsTriaging a full inbox one call at a time is slow enough that nobody does itroutinely, which is how an inbox goes months without being triaged.| Tool | Description ||------|-------------|| `folio/task-move-batch` | Move many tasks at once, with a result line per id || `folio/task-complete-batch` | Mark many tasks done by id list || `folio/task-sweep` | Remove completed tasks from projects || `folio/inbox-sweep` | Remove completed items from the inbox |`folio/task-move-batch` takes either one shared target or per-id targets, so asingle call can fan out across many projects:```json{"ids": ["t-a3f2", "t-b1c4"], "project": "bureau-v2"}{"moves": [{"id": "t-a3f2", "project": "bureau-v2"}, {"id": "t-b1c4", "project": "sigil-gc"}, {"id": "t-c5d6"}]}```An entry with no `project` moves that task to the inbox. Every id gets its ownresult line, so a partial failure is visible rather than swallowed.### Inbox| Tool | Description || `folio/inbox-add` | Add an item to the inbox || `folio/inbox-triage` | Move an inbox item to a project |> **Keep inbox captures to a single line.** An item whose text contains> newlines is currently written in a shape folio cannot read back: the> `{id: ...}` metadata lands on the item's last line, the parser sees only the> first, and the item becomes invisible to every tool while a phantom> one-line duplicate takes its place. For anything longer, create a note and> reference it from a one-line inbox item. See the Known issues section of> CHANGELOG.md.### Projects| Tool | Description |package.sglmodified
(package name: "folio" version: "0.2.6" sigil: "^0.17" version: "0.2.7" sigil: "^0.18" description: "Markdown-native knowledge and project management via MCP" url: "https://codeberg.org/sigil/folio" license: "BSD-3-Clause" bundle?: #t)) dependencies: (list (from-git url: "codeberg:sigil/sigil" package: "sigil-run" version: "^0.17.0") (from-git url: "codeberg:sigil/sigil" package: "sigil-run" version: "^0.18.0") (from-git url: "codeberg:sigil/sigil-json" version: "^0.16.0") (from-git url: "codeberg:sigil/sigil-log" version: "^0.16.0") (from-git url: "codeberg:sigil/sigil-mcp" version: "^0.16.0") (from-git url: "codeberg:sigil/sigil-http" version: "^0.16.0") (from-git url: "codeberg:sigil/sigil-http" version: "^0.18.0") (from-git url: "codeberg:sigil/sigil-sqlite" version: "^0.16.0") (from-git url: "codeberg:sigil/sigil-yaml" version: "^0.9.1") (from-git url: "codeberg:sigil/sigil-sxml" version: "^0.14.0") (from-git url: "codeberg:sigil/sigil-sxml" version: "^0.15.0") (from-git url: "codeberg:sigil/sigil-markdown" version: "^0.9.1") (from-git url: "codeberg:sigil/sigil-web-styles" version: "^0.2.0")) ;; sigil-test is deliberately held at ^0.17 while the runtime is on ^0.18. ;; Bumping it to ^0.18 ABORTS `sigil deps install` with a version conflict: ;; 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 ;; whole graph. Test harness only -- the shipped runtime is unaffected. ;; Raise this once those four repos move their dev-dep. See t-9484. dev-dependencies: (list (from-git url: "codeberg:sigil/sigil" package: "sigil-test" version: "^0.17") (from-git url: "codeberg:sigil/sigil" package: "sigil-test-runner" version: "^0.17"))sigil.lockmodified
(lock (package name: "sigil-stdlib" url: "codeberg:sigil/sigil" ref: "^0.17" sha: "8e694ed5cde7d6a9f1c935ee21ab8a3a9bb92f4f" ref: "^0.18" sha: "4a5d7262191ecbbd8e2124284b3ef988c1b58aad" package-selector: "sigil-stdlib" version: "0.17.16") version: "0.18.1") (package name: "sigil-run" url: "codeberg:sigil/sigil" ref: "^0.17.0" sha: "8e694ed5cde7d6a9f1c935ee21ab8a3a9bb92f4f" ref: "^0.18.0" sha: "4a5d7262191ecbbd8e2124284b3ef988c1b58aad" package-selector: "sigil-run" version: "0.17.16") version: "0.18.1") (package name: "sigil-lib" url: "codeberg:sigil/sigil" ref: "^0.17" sha: "8e694ed5cde7d6a9f1c935ee21ab8a3a9bb92f4f" sha: "4a5d7262191ecbbd8e2124284b3ef988c1b58aad" package-selector: "sigil-lib" version: "0.17.16") version: "0.18.1") (package name: "sigil-json" url: "codeberg:sigil/sigil-json" ref: "^0.16.0" (package name: "sigil-mcp" url: "codeberg:sigil/sigil-mcp" ref: "^0.16.0" sha: "1a0175939d7841686cad8793ed5faa1d10602351" version: "0.16.4") sha: "4809a63545d6540ddb7abf437a63d1c9f49fbed9" version: "0.16.5") (package name: "sigil-http" url: "codeberg:sigil/sigil-http" ref: "^0.16.0" sha: "c24a14cabdb5ceed6273d7a6c1004baee07d69a0" version: "0.16.7") ref: "^0.18.0" sha: "1ad4063a9540ca91fbb15fc7d32936e232eb621c" version: "0.18.2") (package name: "sigil-sqlite" url: "codeberg:sigil/sigil-sqlite" ref: "^0.16.0" (package name: "sigil-yaml" url: "codeberg:sigil/sigil-yaml" ref: "^0.9.1" sha: "38e96aa33d83e7881dc9860995883fdd6ee05593" version: "0.9.1") sha: "3f8955b867950cc8a9da717b8918b802c57d021f" version: "0.9.2") (package name: "sigil-sxml" url: "codeberg:sigil/sigil-sxml" ref: "^0.14.0" sha: "a33eb522bfd485dcc490c8db5ea599d7215027ff" version: "0.14.0") ref: "^0.15.0" sha: "5a4f043247600f58bdabae19de55664d759a30c9" version: "0.15.0") (package name: "sigil-markdown" url: "codeberg:sigil/sigil-markdown" ref: "^0.9.1" sha: "20e0de7bae49cda15e4b147f87968b0442caa75c" version: "0.9.1") sha: "181ef01a3b711eae2c5ffffa76938a9dff18fab8" version: "0.9.5") (package name: "sigil-web-styles" url: "codeberg:sigil/sigil-web-styles" ref: "^0.2.0" (package name: "sigil-test" url: "codeberg:sigil/sigil" ref: "^0.17" sha: "8e694ed5cde7d6a9f1c935ee21ab8a3a9bb92f4f" sha: "070f133a3524142b4febfd7c287385186b616252" package-selector: "sigil-test" version: "0.17.16") version: "0.17.20") (package name: "sigil-test-runner" url: "codeberg:sigil/sigil" ref: "^0.17" sha: "8e694ed5cde7d6a9f1c935ee21ab8a3a9bb92f4f" sha: "070f133a3524142b4febfd7c287385186b616252" package-selector: "sigil-test-runner" version: "0.17.16") version: "0.17.20") (package name: "sigil-nrepl" url: "codeberg:sigil/sigil-nrepl" ref: "^0.16" (package name: "sigil-tls" url: "codeberg:sigil/sigil-tls" ref: "^0.16.0" sha: "30e8c2a84345dc4d484f5c085daa5bd16fc60fe1" version: "0.16.3") (package name: "sigil-peg" url: "codeberg:sigil/sigil-peg" ref: "^0.9.0" sha: "2a0adbd32b13fb835cf021a8e279341161a77436" version: "0.9.1") sha: "baf05e45ed4090406c2990debadabfcd8253d834" version: "0.16.4") (package name: "sigil-css" url: "codeberg:sigil/sigil-css" ref: "^0.9.1" (package name: "sigil-crypto" url: "codeberg:sigil/sigil-crypto" ref: "^0.16" sha: "a391c4ed73891ac5dc8a6da98b80a340c03f801f" version: "0.16.3") sha: "964eec2fad375834e2b49da454209fabc059ca30" version: "0.16.4") (package name: "sigil-hooks" url: "codeberg:sigil/sigil-hooks" ref: "^0.16.0"