All versions since 0.57.0
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.