Bundle root folders: a vault can hold several independent bundles as sibling project folders instead of one bundle per vault; a misconfigured root is reported rather than silently producing an empty “clean” bundle.
Scaffold command targets the active note’s bundle, asking when several are configured and none is open.
Settings shortcut to install OKF Enforcer from the community-plugin browser.
Unit tests for bundle-resolution logic, extracted into plain Obsidian-free functions.
Golden-fixture bundle checks in npm run smoke-test against a frozen scaffolding template and this repo’s own .lokf/knowledge/.
This repo’s .lokf/knowledge/ bundle is now maintained by lokf-agent-skills installed at run time rather than committed.
Type-vocabulary lookups are cached instead of rebuilt per note.
Renamed knowledge-validate.yaml to knowledge-registrar.yaml, matching upstream lokf-agent-skills v0.12.0; cross-references updated across docs.
SECURITY.md now inventories every workflow and the librarian’s privilege split.
.markdownlint-cli2.jsonc disables MD060 (padded-header/bare-separator tables used throughout this repo).
Fixed
An unreadable note was silently dropped mid-scan yet still counted as “scanned”; now gets its own report row and separate count.
An unreadable root index.md no longer aborts an entire scan; scaffold command refuses to write when it can’t read the file first.
The knowledge-librarian’s prompt-building script executed part of its own prompt as shell commands due to an unescaped heredoc; re-scaffolded.
.lokf/knowledge/ drift: two concepts described a nonexistent command, one misattributed scan batching to the wrong file.
A stale, frontmatter-free planning doc under .lokf/knowledge/ crashed lokf validate for the whole bundle; removed.
LOFK -> LOKF transposition fixed in manifest.json, package.json, and community-plugin-entry.json.
A folder in Excluded folders written with a trailing/leading slash, whitespace, or ./ prefix silently excluded nothing; now normalized like Bundle root folders.
Base_iri authority check compared URL.host (includes :port) against the denylist, so a ported hostname bypassed it; now compares hostname.
A relation field written as a bare scalar instead of a list passed validation clean even though the schema requires an array; now warned.
type set to a number, boolean, list, or mapping produced no finding at all; a list/mapping now gets its own shape warning.
Validate active note went completely silent when run on an excluded or out-of-bundle note; now always produces a Notice.
The report panel’s “N clean” count undercounted by subtracting bundle-level findings that were never scanned files to begin with.
Various markdownlint fixes (MD060 tables, MD001 heading skip, MD032 spaced-dash-as-list-item).
Security
release.yml passes the pushed tag through the environment instead of interpolating it into a shell command, closing a script-injection path.
knowledge-librarian.yaml no longer runs a repository variable’s content as a shell command; runs a pinned wrapper script and fails if the agent writes outside .lokf/knowledge/.
knowledge-librarian.yaml split into two jobs so the agent and the write-scoped token never meet: refresh (read-only, third-party code) hands a patch artifact to publish (no agent code, holds write access). Ported from lokf-agent-skills v0.11.0.
knowledge-librarian.sh parses AGENT_CLI into a quoted argv array instead of expanding it unquoted, closing a shell-injection path (SC2086).
The scheduled librarian run is armed by a dedicated KNOWLEDGE_LIBRARIAN_ENABLED repository variable rather than inferred from AGENT_CLI being set.