Releases
1.1.0
Fixed
- The curation policy’s own table was only half readable.
policies/knowledge-curation.mdnames classes in prose (“Glossary terms”, “people”) but the parser matched literally, soGlossaryTerm,AttestedComputation,PolicyandPersonnever bound - unnoticed while their intervals matched the defaults. The parse now ignores spaces and plural forms. - Deleting a concept’s
## Open questionssection left two blank lines behind when content followed it, failing markdownlint’s MD012. One blank line now.
Added
- Known LOKF types (Settings → Type vocabulary): the classes a concept’s
typemay name, defaulting to the pinned schema’s fifteen and refreshed on upgrade while untouched, as in KTL Registrar’s setting of the same name. A bundle validated against a domain schema (lokf validate --schema <file>) lists that schema’s classes here, since the schema sits outside the vault: they stop counting against the report’s Vocabulary fit line, andpolicies/knowledge-curation.mdcan set a review interval for them. src/settings-model.ts: the settings shape, defaults and saved-data merge rule, moved out of the Obsidian-boundmain.tsso the rule is a pure function the smoke test covers. A drift guard catches a settings control naming a setting that does not exist.- Smoke-test coverage of the write paths and the two record templates. Both templates are asserted to produce records this project’s own tooling accepts, and the policy template is parsed back with the plugin’s own parser, which is what surfaced the table bug above.
Changed
- README rewritten around how to use the plugin, as an extension of the
lokf-agent-skills: an early notice that it works on the exhibition, never the workshop vault you already keep; Where it works, with the bundle as its own vault first; a four-step Quick start; Using it with the verb table; the command table; Which folder is the bundle; Install; Settings. Shared material - the role table, the library metaphor, the trust labels - now lives in the skills’ README and is linked once, and host-by-host layouts move todocs/for-the-curious.md; no plugin change. - This repository’s own sidecar follows the current
ktl-sidecartemplates:just lokf-linkcreates theknowledge_bundledoorway link, now committed at the root, and the wrapper and both workflows describe the bundle’s second name as the templates do..lokf/.gitignorekeeps Obsidian’s workspace state out of git, and markdownlint and lychee skip the link’s duplicate path; no plugin change. CONTRIBUTING.mdis a checklist again, with the release pipeline and the signing guide documented once in the skills repository’sdocs/and linked from here.npm run checkruns build, lint and smoke test together, the settings-tab andcreateEllint rules are errors rather than warnings, and CI fails an action not pinned to a commit; no plugin change.- The README says which line of defence this plugin’s work is, and points readers who work under that model at the skills’ page on the rest; no plugin change.
- The registrar gate checks what
lokf validatecannot:.lokf/scripts/knowledge-conventions.shfrom the sidecar templates (one ISO-date log heading per day, quoted timestamps,verifiedas a list, open questions in the curator’s shape) and the justfile’slokf-check-refs, on every.lokf/**pull request; no plugin change. SECURITY.mdis a policy, not a threat model: a surface table that links to the skills repository’sdocs/threat-model.mdinstead of restating it, held to a word budget bynpm run check; no plugin change.
1.0.0
Changed
- A vault with no bundle is left alone. With nothing configured, a root
index.mdcarrying a LOKF header makes the whole vault the bundle and a top-levelknowledge_bundle/makes that the bundle, as before; a vault with neither now has no bundle - no report, no queue, nothing written, status bar Curate: no bundle, the panel says why - rather than being read as one whole-vault bundle. Mirrors KTL Registrar. The workshop is never mistaken for the exhibition. - README trimmed: the For the curious section is now
docs/for-the-curious.md.
Added
- Treat the vault root as the bundle (Scope, off by default): the break-glass switch that restores the old whole-vault reading for a vault whose root
index.mdcarries no LOKF header.
Fixed
npm run lintfailed on.github/scripts/changelog-release.mjs(outside ESLint’s project); it now passes.
0.3.0
Added
- Bundle detection for the sidecar convention. A top-level
knowledge_bundle/with its ownindex.md, in a vault whose rootindex.mdcarries no LOKF header, becomes the bundle root with nothing configured - the health line and queue then cover only the bundle. Kept identical to KTL Registrar. - Semantic release. The version is computed from Conventional Commits on
main, andCHANGELOG.md’s## [Unreleased]section is promoted into a dated heading and used as the release notes;manifest.json,package.jsonandversions.jsonbump as they always did. The resulting tag runs the same build, attestation and draft release as before, and a hand-pushed tag still does too. See CONTRIBUTING.md.
Changed
- A dot-folder bundle root is accepted, not refused - a community plugin can expose one to Obsidian’s index. The report checks the live index first and explains an absent root instead of assuming.
- “How this fits” rewritten around one desk that is always the person’s: this plugin is the curator’s assistant, KTL Registrar the registrar beside it. It covers both ways of reaching a bundle - the doorway opened as its own vault, or a real
knowledge_bundle/folder inside your own vault - and names the vault the workshop, the bundle the exhibition: what a person confirms goes on exhibit.
0.2.0
Added
- Look up a LOKF field (command): a searchable reference of the LOKF frontmatter fields and what each expects - so a curator unsure what a property means can look it up in the editor (Obsidian’s Properties widget has no per-property description API). Descriptions come straight from the schema’s own slot definitions via a pinned vocabulary manifest (
src/lokf-vocab.json, filled byscripts/build-vocab.mjsfromlokf vocab --all --jsonorlokf.yaml);src/fields.tsonly chooses which fields to surface and in what order, so the wording never forks from the schema. A smoke test asserts every surfaced field is a real schema slot and that each description stays modal-sized. Ported from KTL Registrar to keep the two plugins in step; import-free (of Obsidian), Node-testedsrc/fields.ts. - Shared trust-tier label (
src/trust-label.ts): one import-free vocabulary - Confirmed / Automation / Unchecked / Draft / Retired - shared by the status bar, inline marker, and review card. The status bar now shows the active note’s tier beside the confirmed count (e.g.Draft · 3/12). - Inline trust marker (Settings → In-editor): a CodeMirror 6 badge on a concept’s frontmatter showing its tier as you edit, derived live from the note’s text (Source mode only).
@codemirror/*added as types-only devDependencies (external at runtime). - Handoff hint (§5): one phrase for where a concept sits in the librarian → curator → docent loop - Drafted by the librarian, Has open questions, Edited since confirmed, Past its review date, Confirmed by
<id>on<date>, or Not yet checked - on the queue’s “why” line and the marker tooltip (handoffLabel);TrustRecordgains the confirming actor/date andgenerated.by. - Frontmatter value autocomplete (Settings → In-editor): an
EditorSuggestfor hand-typed values - thehuman:<curatorId>actor, the lifecyclestatus, and dates forat/stale_after- never key names (import-freesrc/suggest-context.ts). - Review commands + keyboard access: “Review the next concept in the queue” and “Review the active note” open the review card (never a blind verdict); queue cards are keyboard-operable (
role="button", Enter/Space, focus ring). - Recognizes the KTL Registrar-generated
diataxis.mdmap as a reserved bundle file, so it never appears in the trust report or review queue as an unchecked concept.
Fixed
- The concept-type vocabulary now tracks the pinned schema.
src/bundle.tsderives its known LOKF classes from the schema manifest (src/lokf-vocab.json) rather than a hard-coded list, soRole- a valid concept type the list had omitted - is no longer wrongly flagged as “doesn’t fit the built-in vocabulary”, matching KTL Registrar; the curation-policy-table parser reads the same list. (Thektl-curatorskill’s “14 classes” wording lives upstream in lokf-agent-skills and should be refreshed there.)
0.1.0
Added
- Initial
ktl-curator, a fresh identity forked from KTL Registrar release/0.3.0 (manifest, package, and plugin id all its own): a read-only trust report (health line, ranked “worth ten minutes today” queue, open questions) and a one-concept-at-a-time review session writing Confirm / Send back / I corrected it / Retire / Later into frontmatter andlog.md, per the skill’strust-fields.md/review-session.md. Adds theCreate curation policyandRecord something missingcommands and multi-bundle-root scope (from KTL Registrar’sbundle.ts). npm run smoke-test: runsbundle.ts/trust.ts/edits.tsunder plain Node against a fixture bundle covering every trust-label state, including the guardrail that each verb touches only its own keys.
Fixed
Pre-release, from reviewing the first implementation against the plan:
- Verdicts silently no-op’d for any concept outside the top-
queueSizequeue (the card looked its record up in the queue, not among all scanned concepts). - The Due soon window setting was ignored (30-day window hardcoded); reliance counting ran per-bundle so cross-bundle citations counted for nobody (now one IRI-keyed id map across every bundle); a cached
base_iriwas never invalidated after a rootindex.mdedit. - The day’s
**Curation**tally resumed from an earlier day’s line; ahttps://source was mangled on resolve (the:read as a line separator); “N more not yet checked” over-counted; body edits used read-then-write instead of atomicvault.process.
Changed
- Verbs refuse to write to
index.md/log.mdand say why; “Wrong - I corrected it” asks “the note hasn’t changed - did you mean Confirm?” instead of staying disabled; the review card shows every recorded source,fields/distributioncounts for tables, and a collapsible open-questions list; the feedback line reports how many entries wait, or “not reachable from this vault”.