ochakai 0.11.0
The filename becomes the name (design doc 0022, #95): title drops to optional, the id joins search, and byte-compared keys normalize to NFC. Design doc 0017 made the path the address; this release finishes the thought — the last segment of an address is, in most cases, simply the name. Plus directory index pages in the Web UI (#94).
The filename is the name (design doc 0022)
Since 0019 relaxed the character rules, insights/サンプル has been a legal id — but writing knowledge that way still didn't work. Three reasons, all now addressed.
title is optional. The server no longer requires it. The display name is the title when present and the id's last segment otherwise (domain.DisplayTitle), applied uniformly across the Web UI, CLI, and export. Title becomes what it should have been all along: an override for when the filename won't do — a descriptive heading longer than 42 characters, one containing /, or one a foreign bundle brings with it. This also brings ochakai closer to OKF SPEC, which only ever required type in frontmatter; rejecting title-less documents with a 400 was narrower than the spec.
The id is searchable. k.id joins the lexical haystack and the ILIKE substring floor, so 用語/売上 is findable by 「売上」. The id also prefixes the embedding text — paths carry the domain hierarchy, so this adds context even for entries that do have a title.
Byte-compared keys normalize to NFC. macOS filesystems hand back decomposed (NFD) path names, so unpacking a bundle on a Mac and re-tarring it could silently split one entry into two identical-looking ids. domain.Normalize now applies at every boundary where a byte-compared string enters: all service entry points taking an id, link targets, attachment ids and names, bundle import paths, and search queries. Content columns — body, title, description — stay exactly as written. Normalizing keys, not prose.
Folder + name is a client concern. The server's address stays a single id with no derivation (the 0017/0019 "don't guess" line). The Web UI's new-entry form splits into Folder and File name fields instead, and the + on a tree directory prefills the folder.
Directory index pages (#94)
Clicking a directory in the sidebar now renders the equivalent of the index.md that OKF export generates at each level: subdirectories with counts, and the entries at that level with title and description. The progressive disclosure that previously existed only in exports is now in the Web UI. Breadcrumbs in the detail view became per-segment links up to each ancestor's index, and the browse API projection gained description to make those pages worth more than the tree.
Breaking changes
Mostly this release widens what is accepted, but note:
titleleavesrequiredin the openapi and MCP schemas. Clients assuming a non-empty title should handle an absent one or fall back to the last segment themselves.- Empty titles vanish from the wire.
titleisomitempty— an empty title is a missing key, not"title": "". - NFD spellings no longer round-trip. Ids, attachment names, and link targets are normalized on write; the visual result is identical, but the exact NFD bytes are not preserved.
- Export drops the
title:line for title-less entries. No real diff today, since empty titles could not previously exist.
Migration 0013
Applied automatically at startup. It rewrites stored ids, link targets, revision-snapshot ids, event/usage keys, attachment names and paths, and embedding-table keys to NFC — making the invariant true for data written during the window since 0019 accepted non-ASCII ids without prescribing a Unicode form. On real-world data this is a no-op scan, since ASCII is unchanged by NFC. A normalization collision (two ids becoming one) fails the migration loudly rather than silently merging, leaving it for a human to resolve.
As with 0020, existing entries keep their previously stored vectors until they are written again — the id prefix reaches the embedding only on the next real content update. There is no reindex mechanism, by the same write-time-only posture.
Container image
docker pull ghcr.io/na0fu3y/ochakai:0.11.0
gh attestation verify oci://ghcr.io/na0fu3y/ochakai:0.11.0 -R na0fu3y/ochakai