All versions since 0.53.0
0.53.0
Added
- The workspace counts the links between its members. The lock, the workspace index and
queries/links.rqcount the typed relations in one bundle whose target is a concept of another, by slot. - The workspace carries
graph.json, every bundle’s concepts and typed relations as cytoscape.js elements. Each node names its bundle, and the links between bundles are marked. - The MCP server loads a member’s graph when a walk first reaches it, as section 11.4 of the LOKF specification has members load, and a SPARQL query loads them all. The lock’s
graphs(format 4) says where each graph lies ingraph.nq, with its digest, the namespaces it names and the IRIs it shares with another graph. - The federation build has the
sensitivitygate of LOKF section 11.5. A member concept sayspublic,internalorconfidential: an internal member joins once a person confirmssensitivity: internalon the Domain concept, and only in a private or internal repository, a confidential one never, and the workflow keeps an internal workspace off the site. - A bundle that releases no zip joins by the
concepts.jsonldits site serves, pinned by that file’s checksum; the build writes the file out as the bundle. The members script asks for it with a conditional request and proposes a changed file, andmembers --add <address>drafts such a member. - A member whose file cannot be fetched is held at its last good state, as section 11.5 of the LOKF specification has it, from the previous release’s workspace that
--previousnames. A release zip with other bytes is held only at the release a build fetched before, a member never built is left out until it can be fetched, and a check holds nothing its pull request proposes. - The readers read a workspace where it lies: a folder, a
workspace-<tag>.zipin place, or the site that serves it, a graph at a time by range request.read_documentreads the workspace’s copy of a release, else itsconcepts.jsonld, else its source, as section 11.4 chains them. - A reader can be given some members alone.
--member <slug>onmcp,serveandqueryloads those bundles’ graphs and no other, and refuses the stored queries that read the lock graph. - A domain host’s release notes say what changed in its workspace.
knowledge-federate.py diffcompares two workspaces, and the federation workflow adds the members that joined, moved or left, and the links between them, to each release’s notes. - A domain host’s graph page draws the workspace. Its The workspace view draws every bundle the domain names, each in a colour and shape of its own, with the links between bundles dashed, from the
graph.jsonthe federation workflow serves.WORKSPACEinsite.config.mjsturns the view on or off, and it is on when the repository has the workflow.
Changed
docs/federation.mdholds the whole federation design, and states each rule once. Domains as manifests, LOKF section 11 and the release moved there fromdocs/context-layer.md, which keeps what a context layer is, the one-bundle table and what OKF leaves open.- The docs say the pen, its figure and the ingest’s guards once. The figure of who writes the bundle stays on
docs/architecture.md, anddocs/for-the-curious.md,docs/ingest.mdanddocs/three-lines.mdlink to the page that holds each detail instead of repeating it. docs/context-layer-technology.mdkeeps to what KTL needs from a product. The vendor tables of limits, plans and quotes are gone, and the page names the sidecar’s own workspace server and MCP server beside the stores’.docs/for-the-curious.mdsays how readers and verdicts steer the next run. It now holds what KTL took from the WikiSkill and SkillWiki papers, sodocs/wikiskill.mdanddocs/skillwiki.mdare gone. The bundle’s two concepts stay the record of each paper.- The federation build runs lokf in its own process. It exported and validated each bundle through a new lokf process, which imported lokf and LinkML again every time. A build of ktl-federation’s five members takes 4.5 seconds instead of 12, with the same output, and the federation tests run in half the time.
SECURITY.mdanddocs/threat-model.mdsay what holds after these fixes, with a section on the website, and no longer claim the most a hostile release could do before review was propose a change.
Fixed
- The sync script no longer fails after a complete sync that replaces it with a longer copy. Bash read on into the new copy and ran a line from its middle, so the run exited with an error and the sync workflow opened no pull request. The script now exits on the line that calls
main, a v0.52.0 copy also stops when it syncs to this release, andscripts/sync-sidecar.shruns each sibling’s script from a copy. - A confidential ingest entry is refused where git could commit its copy. The script checks that git ignores
.lokf/.cache/mirror/and tracks nothing there before it fetches the entry. - The sync keeps a host’s
.lokf/.gitignorecurrent. A host kept the copy ktl-sidecar Step 1 first wrote, so it could lack the template’s later lines, such as.cache/, where a confidential copy goes. - The scheduled librarian stops before any agent runs when git does not ignore
.agents/. It stopped only after the agent had run, at the write-scope check, with?? .agents/. - The federation gate refuses a link into a member’s namespace that names no concept of that member, as
--check-refsrefuses one inside a bundle, under the sameunowned_targetspolicy. It checked only that some member owned the namespace. - The federation gate reads a reified
relationsentry as it reads the slot that entry names, so a target no member owns there stops the build too.links.rqandunowned.rqcount such entries as well. - The members script moves the other members when it cannot check one, which the hand-off names. When the GitHub API refuses a release list as rate limited, gh asks again with the job’s token.
- The MCP server’s
federated_sparqlstops reading at its limit, 1000 rows or 2000 triples, and says when it cut an answer. It read a SELECT whole before cutting it, and returned a CONSTRUCT whole. - The workspace’s stored queries take their predicates from the toolkit.
unowned.rqnamedowl:sameAswhere lokf writesschema:sameAs, and left outmemberOfandholder. - The graph page’s details panel sets each label beside its value. Starlight’s spacing for page content put every label a line below it.
- A member whose index gives its licence as text, such as
MIT, no longer stops the domain build. The lock graph keeps such a value as a literal, and the index writes it as text. - The MCP server reads a concept whose
idlies outside its bundle’s namespace, which the registry routes through itsid_index. It cut the IRI by the wrong prefix. - A member whose namespace nests with another’s stops the build with a finding that names both, before anything is fetched. The registry refused it only after every download, with a Python traceback.
- A checksum must be
sha256:and 64 hex digits. Only its length was checked, so a path in it could reach outside the download cache and have the build delete a file there. - Every download stops at
--max-bytes, a member’s schema and workspace as well as its zip, where each was read whole before its checksum was compared. - A download is tried again after a server error or a dropped connection, and follows a redirect only within http and https, never from https to http and never from a public address to a private one.
- A zip of more than 100,000 entries, or one that matches its checksum but cannot be read, stops the build with a finding, where it filled the disk or ended in a traceback.
- A reader keeps no partial answer to a range request as the whole file, and
--previousrefuses a site address, from which no zip member could be held. - The federation workflow’s weekly schedule no longer takes the place of a release build that waits for its turn, and each job has a time limit.
- A domain host’s site serves each member’s release inside the workspace. The Pages upload left out the hidden
bundles/<slug>/.lokf/folders, so every member link in the served workspace index answered 404. - The contract records every sibling host’s links into this repository, among them ktl-federation’s into the federation page and the domain-bundle playbook. Its local cross-check reads all five hosts, and skips a domain host’s ignored
snapshot/, which holds a copy of this bundle. - The librarian keeps run accounts out of the source map. No rule asked for one, yet each refresh had added its account to
playbooks/knowledge-sources.md, 41 of them by 2026-10-19. The skill now says the map holds none. - An agent that applies its own patch no longer loses a scheduled run’s work. The wrapper sets
KNOWLEDGE_PEN_DRY_RUN_ONLYfor the agent, so the pen only checks the patch file there and leaves it for the wrapper to apply. The skill and the pen’s dry-run line no longer tell a scheduled agent to apply and validate.
Security
- A release can no longer write a host’s git configuration through the sync.
knowledge-sync.shrefuses a copy path inside a.gitfolder and clones the release without a checkout. - The branch the sync pushes carries no workflow a release wrote. A workflow on a pushed branch runs with the repository’s secrets, so
publishapplies the patch withknowledge-sync.sh --apply, keeps every workflow but for the pin, and holds the release’s workflow changes for a person, or for a reviewer of the EnvironmentKNOWLEDGE_SYNC_REVIEW_ENVIRONMENTnames. - The sync’s
publishrefuses a deletion, a link or an unusual mode, and leases its push to the commit it read. A branch holding a person’s commit is left alone with or without a pull request, and the report names a manifest rule the script does not know. - Each workflow reads its secrets from an Environment limited to the default branch:
knowledge-librarian,knowledge-syncandknowledge-ingest. Move every repository secret there on every host, as the sidecar’sreferences/automation.mdsays. - A federation build refuses a member zip holding a hidden file or a file a browser runs, and a distribution name that is not one plain file name. A
.gitfolder in a zip, or a name that climbs out of the workspace, could run code in the build; the health line now runs git on no member’s folder. - A federation build fetches members over http or https from public addresses only.
--allow-localallows local paths and private addresses, and a person’sprivate_addresses: allowon the Domain concept allows a forge on the host’s own network. - A member’s attestation must come from its own release workflow, or its federation workflow for a workspace, and a build without
ghstops unless given--no-attestation. - The federation workflow hands its token to
ghalone, and the website and federation builds run no npm install script. - The website copies only files inside the repository, and passes raw HTML as GitHub renders a README. A link out of the repository and an SVG holding a script are left out, other markup is shown as text, and Astro’s telemetry is off.
0.54.0
Changed
- The graph page keeps the graph at full height in full screen. Search and filters move into a side panel that scrolls, and switching between This bundle and The workspace draws the other graph in place, so full screen stays on.
- The graph’s filters read as controls. Larger rows, a count on each entry, All and None on each group, and an “N of M concepts shown” line whenever a filter is off; every filter still starts on.
0.55.0
Added
- The pen checks the schema before it writes.
knowledge-apply.shrunslokf validateon every concept a patch would write, with--dry-runtoo, when.lokf/.venvholds the toolkit. - The preflight warns about a python3 older than 3.9, about being run from ktl-sidecar’s own folder, and names KTL skills installed for one user.
- ktl-prose’s check reads a script’s comments. Given a shell, Python, YAML or TOML file or a justfile,
prose-check.pyholds each#comment block, and each Python docstring, to the rules a paragraph keeps.
Changed
- The check reports a paragraph of more than eight sentences, and lists “outright” and “at all” among the words to cut. The rules page gains a method for a paragraph with two topics, the rule before its exception, pointing words as names, and the quiet figures of motion.
Fixed
- The sidecar’s scripts run behind a package mirror. The pen, the conventions check and the ingest try
.lokf/.venvfirst anduv runafter it, becauseuv runfails behind a mirror that serves no upload times. No script picks a Python older than 3.9. - When its runner cannot start, the conventions check says so and exits 2, instead of reporting findings against the bundle.
- A freshly installed skeleton passes its own conventions: the dummy services’ descriptions match their index bullets.
- ktl-prose runs its check through
uv run, so an oldpython3never runs it. - ktl-sidecar’s Step 0 runs the preflight from the host repository’s root.
- The librarian’s audit lints the files it touched, not
.lokf/.venv/. - A release attaches a linkml-sidecar host’s schema. The
schema :=line may name any file in the repository, and the released copy imports LOKF core aslokf, so a domain can resolve that import. - ktl-prose’s check reads a comment’s layout. A table of options is read row by row, and a usage line or a command under a colon is not read, so neither is reported as one long sentence.
--againstcompares a script as its comments. - The check reports fewer false findings. A sentence may start with a lowercase name such as
ktl-docentor.lokf/, and a minus, a-- <args>marker, “at all of” and “at all times” are no longer reported.
0.55.1
As it stood at this release: the repository · the docs · the knowledge bundle · the release
Fixed
- A sync reaches a host with a website again. Since 0.53.0 it stopped at
src/pages/og/[...route].ts, because its website step refused square brackets in a path; it now allows the same characters as--apply. - ktl-prose reads every file in scope, the ones its script cleared too. Its rules now name the dead sentence, a quantity no source gives, and “either way” with no alternatives named.
- ktl-curator commits a verdict apart from the change it confirms, as conventions rule 14 checks.
- ktl-librarian’s domain-schema page brings a published vocabulary in with
lokf adapt. - The website template takes Astro 7.4.0 and the patch releases of its plugins.
0.55.2
As it stood at this release: the repository · the docs · the knowledge bundle · the release
Fixed
- The preflight asks the package index uv reads, a company mirror included, and prints only its host name. It warns when
.lokf/uv.lockwas made against another index, sinceuv sync --lockedthen fails anduv syncrewrites the lock. - The sidecar’s portability page says what a mirror does to the lock, and how a proxy that inspects TLS gets its certificate trusted by uv.
0.56.0
As it stood at this release: the repository · the docs · the knowledge bundle · the release
Added
- ktl-website keeps old addresses and leaves a folder out.
REDIRECTSredirects an old address, such as a retired mkdocs site’s/elements/<Term>/, to its page, andDOCS.excludekeeps a path such astemplates-linkml/off the site.
Fixed
- A link to a docs folder’s
index.mdreaches its page, which Starlight serves at the folder’s address, and that page comes first in the Guide, as its Overview.
0.56.1
As it stood at this release: the repository · the docs · the knowledge bundle · the release
Changed
docs/three-lines.mdholds the model’s critics.docs/three-lines-critics.mdis folded into it, and the docs pages’ titles are shorter.- The workflows run the
justthat.lokf/uv.lockpins, checked by hash. The sidecar’spyproject.tomlnamesrust-just==1.47.0. A host without it still gets that version by name, and the preflight says to runuv add rust-just==1.47.0in.lokf/.
Fixed
- ktl-website builds for an owner spelt with capitals.
SITE’s host is lowercased, as Astro writes it, so the link check no longer reports every social card broken. - ktl-website’s cards show a concept’s genre. The concept card and the link preview give the genre beside the type, the social card gives both, and search gains a Genre filter.
- ktl-website words a type as the bundle spells it. A word the bundle’s prose writes with capitals keeps them, so
SlsaSourceControlSystemreads “SLSA source control system” on every card and in relation names. - ktl-website’s card head names a field once. The genre stands after a lower-case “genre” key, and a genre that repeats the type is left off the card, the link preview and the social card.
- ktl-website’s card head reads the same on every concept. The genre stands beside the type as a plain tag, without the lower-case “genre” key, as the link preview and the social card give it.
- ktl-website reloads a page kept from before a deploy. A page whose stylesheet the deploy removed reloads once and shows styled, instead of unstyled for up to ten minutes.
- The federation build and the ingest check the address each connection opens. A name that answers a public address to the check and a private one to the connection (DNS rebinding) now reaches nothing, unless private addresses are allowed.
- CI lints the ingest workflow template. actionlint now names
knowledge-ingest.yamlwith the other templates.
0.56.2
As it stood at this release: the repository · the docs · the knowledge bundle · the release
Fixed
- The curator’s report ends with its stop. When the review session will not run, the report’s last line says so, gives the reason, and names what changes it. A harness line saying the person cannot answer no longer stops the session on its own: the curator says it and goes on only when the person replies, one item per turn.
- The federation’s members script moves the day of a pruned release. When the release list no longer holds a member’s old release, the day the text writes right after the old tag moves with the tag, and only there.
- The federation’s members script follows a member’s moved namespace. When a new release’s
index.md, or a served file’s@base, names anotherbase_iri, the patch sets it and the question says so. The build refused such a member before. A namespace the build would refuse leaves the member as it is. - The federation’s members script cuts a long hand-off line. The pen refuses a patch with a hand-off line over 300 characters, and the line for a failed attestation or a moved namespace could be that long.
- A federation build finds a waiting member by the namespace it builds. The lock’s waiting entry named the namespace a move proposes, so the entry of a member held or left out at its old namespace was not updated.
- The federation build and members script remove the files they download. Each zip, schema or served file fetched to check its digest and attestation is downloaded to a temporary folder, which is removed when the run ends, unless
--cachenames a folder to keep the files in.
0.57.0
As it stood at this release: the repository · the docs · the knowledge bundle · the release
Added
- A ktl-website home page offers a Schema button when the site shows a LinkML schema’s pages.
Fixed
- A
!after the type releases a major version..releaserc.jsonnames the Conventional Commits preset, so afeat!:commit no longer releases nothing, asdocs/releasing.mdalready said. - The preflight warns when git is too old for an ingest
gitentry, and names each entry a run would refuse. - Behind a proxy with no outside DNS, the ingest fetches a source whose name resolves only at the proxy, as the federation build does. A name that resolves locally is still checked, and without a proxy a name that does not resolve still fails.
- A
gitentry fetched through a proxy that resolves names needs no git 2.37, since curl sends the name to such a proxy and a pin to the checked address would change nothing. Git uses the proxy the ingest chose, or none, whatever its own configuration orno_proxysays. - The ingest passes
all_proxyto git and to acommandentry, as it passeshttps_proxy. - The ingest converts a page that leaves out
</head>, as HTML allows, where it mirrored an empty file. A line break in a page’s text is a space, so it starts no heading or code block. - The ingest refuses a manifest value of the wrong type, by name. A quoted
"false"counted as true, a string where a list belongs as a list of its characters, and a stringselectstopped the run with a traceback. - One page or file fails only itself. A page the converter cannot read is refused alone, and a charset that decodes to a lone surrogate no longer stops the run before the lock is written.
- A
gitfile whose mirror name is taken is skipped, and one whose name the workflow does not publish is spelled with plain characters and a digest of the name.notesbesidenotes.mdtook turns in one file,databeside a folderdata.mdstopped the run, and a space in a name blocked the whole pull request. - A file restored with unchanged bytes keeps its record and changes no line of the lock, so a checkout without the confidential cache opens no pull request. An entry that leaves the manifest frees its bytes on the run that removes it.
- A
gitentry’s relative local path is read against the repository root, and acommandwith changes not yet committed is refused, as the docs say. - The ingest starts no work after 25 minutes, inside the workflow job’s 30, and writes what it fetched. What it did not reach keeps its record for the next run, and
--time-limitsets the minutes. - A
gitentry downloads only the files that changed, where it downloaded every file at the commit. A binary file, or one refused for its size, keeps a record and is not downloaded again while it stays the same. - A new ETag for unchanged bytes is recorded by the next run that changes the lock, so later runs get 304 where they fetched the body each time. A server that gives a new one on every answer changes no line of the lock.
- A
commandentry’s timeout stops every process the command started, where one it left in the background kept running. A lock edited into another shape stops the run by name, not with a traceback. - The ingest and the pen run on Python 3.9, as their shell halves say, where both wrote files with an argument Python takes only from 3.10. Before 3.11 the ingest also kept a time with a fraction of a second in its own offset, not UTC.
Security
- The ingest holds a
gitentry that names a host to the addresses its check found, and follows no redirect for it, so DNS rebinding cannot reach a private address through git unless a proxy resolves the name. Withoutallow_private_addressessuch an entry needs git 2.37 or later, and a host name outside ASCII is refused: write itsxn--form. - The ingest and the federation build count every address that is not global as private. Python’s
is_privateleaves out the shared address space, 100.64.0.0/10, which holds Alibaba Cloud’s metadata service and Tailscale’s networks. - The ingest refuses a
gitentry whose address git’s own configuration rewrites withurl.<base>.insteadOf, since the address check and the credential cover only the address the manifest names. - The ingest refuses a
gitentry when git is older than 2.31. An older git ignores the protocol limits and the credential that the script sets in git’s environment. The preflight warns before a run. - The ingest’s git reads no
~/.netrc,~/.gitconfigor/etc/gitconfig. Through curl, git sent the credential of a.netrcdefault entry to any host that asked, and a git older than 2.32 read both configuration files. A file thatGIT_CONFIG_GLOBALnames is still read. - The ingest keeps a credential to its own origin, and git follows no redirect with one. A redirect to another port or scheme kept
Authorization, and one to another host kept aheadercredential, which curl keeps too. - No credential reaches the lock or the summary. A secret ending in a line break failed its request with an error that quoted the header, so the script trims that line break and refuses one inside a secret, by name.
- The ingest removes and writes files only inside the mirror, whatever path the lock names or symbolic link the repository holds. It deleted any file a lock named, inside the repository or outside it.
- An entry made
confidentialleaves the committed mirror on its next run, where its copies stayed under.lokf/mirror/. - The committed lock records no title, address or author of a confidential page. A confidential entry’s records move to the ignored
.lokf/.cache/ingest.lock.yamlon its next run, and the summary counts its items, names none, and cuts each address to its site.lock_details: trueon the entry keeps them in the committed lock. - The ingest pins pypdf 6.21.2. Version 6.1.1 has about 60 published advisories, almost all infinite loops or memory exhaustion on a crafted PDF, and a test now holds the pin to the version the tests install.
- One source can no longer hold the run or fill the disk. A body has a deadline of ten timeouts, a Confluence listing ends after a page for each result
max_itemsallows, lists and quotes nest at most eight deep, and the caps count the Markdown written. - The mirror keeps no
javascript:ordata:link, whatever the scheme’s letter case, and no character Unicode marks as invisible, variation selectors among them. Each title and each line of the summary is one line. - An
httpentry needsallow_private_addresses: truefor a plainhttp://address, as the manifest’s comment says. - The pen and the librarian’s pull request take out the characters the mirror takes out, variation selectors among them, and the ingest refuses a file name that holds one. They went by Unicode’s control and format categories alone.
0.58.0
As it stood at this release: the repository · the docs · the knowledge bundle · the release
Added
- Three conventions the gate checks, rules 15 to 17. Every concept names where it came from, as
resourceor asourcesentry. A footnote joins a claim to asourcesentry by itsid, one id names one resource across the bundle, and each Added and Deprecation bullet a run logs names a concept the bundle holds. - The librarian gives a source an
idand cites it with a footnote wherever a claim rests on a number, a name or a qualifier;references/golden-rules.mdsays how. - A docent holdout, and an eval that runs it.
tests/docent-holdout.yamlpairs the eight captured questions with the concept each answer should rest on, and a test fails when one of those concepts moves.just docent-evalruns ktl-docent on them throughclaude plugin eval, anddocent-eval.ymlruns it weekly under a cost ceiling, never on a pull request (the docent eval). - The curator’s report lists each retired concept whose successor no person has confirmed. An agent may propose a retirement, but the retired concept governs until a person confirms the successor.
- A curation policy may carry
Automation re-check: <n>. The curator’s report then lists n concepts checked by automation only, picked by the same hash rule asIndependent re-check:, for a person to check against their sources.
Changed
- ktl-sidecar installs the ingest’s example manifest as
.lokf/ingest.yaml.sample, for a host to copy to.lokf/ingest.yaml.
Fixed
- The sidecar’s two example concepts carry a
resource, the placeholder endpoint they already name, so the skeleton keeps rule 15 before anyone edits it. - A review date is read by its day.
knowledge-report.shcomparedstale_afterwith today as whole strings, so a datetime, the type LOKF 0.9.0 gives the field, could read as not yet due on its own day, or as no date at all. - The pen, the conventions check and the ingest run behind a package mirror with no upload times. They lift
exclude-neweronly for a pinned package that uv reports without an upload date, and the ingest pins typing-extensions too. - A uv that cannot install a script’s packages no longer reads as findings. The conventions check exits 2, the pen falls back to python3 or exits 2, and the ingest falls back to a
.venvwithout pypdf.
0.59.0
As it stood at this release: the repository · the docs · the knowledge bundle · the release
Added
- A host’s composite domain schema is released as one file. A schema that imports
lokf adaptcopies besidelokf.yamlis attached with each copy merged in, keeping every IRI and setting, and a name two files define differently stops the release. - The sidecar reads lokf 0.9.0’s
exclusions. Coverage and--whycount an excluded file apart and never as a source, and conventions rule 18 fails a blank reason or a material listed both ways.
Changed
- The sidecar requires lokf 0.9.0. A host raises the floor in
.lokf/pyproject.tomlby hand, refreshes any.lokf/lokf.yaml, runsuv lockand renames eachsupporting_textkey toexcerpt. The sync leavespyproject.tomlalone. - The skills describe
revision,excerptandlokf adaptas released, and the audit fallback linkslokf.yamlat the v0.9.0 commit. - The librarian’s domain-schema page says how to import a published vocabulary through its
lokf adaptcopy, with lmodel/slsa’s release as the tested case. - A domain build still indexes a member’s explicit ids outside its namespace. lokf 0.9.0 refuses them unless the registrant allows them. A person’s confirmation admits each member, so the build allows them, and lokf still refuses one in another member’s namespace.
- The reliance count and the docent follow
isReplacedBy, the relation slot lokf 0.9.0 adds.
Fixed
- A release that changes only the domain schema attaches it. The compare step looked at the bundle’s tree alone, so such a release uploaded nothing. It now compares the
schema :=line, the schema and the local files the schema imports too.
0.60.0 Latest
Added
just lokf-check-refsruns lokf’s--check-excerpts. The gate fails asources[].excerptthat its local file no longer holds. The recipes need lokf 0.9.0, so a host raises its floor before it takes this release.
Changed
lokf-convert,lokf-serveand the website’slokf exportpass the domain schema too, so the graph names its classes and slots under their own IRIs. No recipe changes into the schema’s folder any more.- The preflight warns on a
lokffloor below 0.9.0, and when[tool.lokf] schemanames another file than the justfile’sschema :=line. - A member’s distribution names its checksum as LOKF core’s
Checksum, withalgorithm: sha256and achecksum_value. The domain schema’ssha256:<hex>slot clashed with lokf 0.9.0’s and brokelokf export --schemaon a domain host, so the host rewrites its member concepts when it takes this release. - The federation docs say the workspace exports every bundle under LOKF core, so the named graphs share one vocabulary. The workspace index says each bundle’s fit is checked against the schema released with it.
Fixed
automation.mdgives the real reason the librarian’s variables are repository variables. Only the federation’snudgejob reads one in a job’sif:. The librarian reads them in steps, and they stay together so every switch sits in one place.- The librarian’s Snyk W012 note names the lokf 0.9.0 wheel, whose schema matches the commit its URL names.
- The preflight warns when
.lokf/lokf.yamlis from another lokf release than the oneuv.lockpins. A domain schema imports that copy, and lokf 0.9.0 reads a bare-datestale_afteras a datetime, which a 0.8.0 copy rejects. - The federation check runs on a pull request that changes
.lokf/lokf.yamlor.lokf/justfile. The check validates the domain bundle against the schema the justfile names, which imports that copy of LOKF core.