Repository navigation
Lore CLI 0.9.0
The headline is LCLI-565: committed schemas now say which lore profile generated them, and
lore check gains a seventh exit code, 7 (indeterminate), for a schema it cannot attribute.
Before this release, lore check could not tell an orphaned schema it had written itself from one
it had never seen, so it advised the same prune for both. That advice is destructive, and
LCLI-546 came one git add -A away from committing its result. This release makes the difference
decidable, and it never advises deleting a file it cannot attribute.
The version is 0.9.0 rather than a patch because exit 7 is a breaking CLI-contract change under
ADR-0005. It is not chosen to match quest's number. Whether this lore and any quest release
form a qualified pair is for opum-cli-e2e to measure, and nothing here claims one. Detect a
capability by presence, never by comparing versions.
Rollout — read this before bumping your lore pin (LCLI-565)
- Exit
7/error_typeindeterminateis a newlore checkoutcome, and it is a breaking
CLI-contract change. A consumer that freezes the exit-code taxonomy (023456),
or that branches only on6, will misread it. Exit7means "cannot judge this from here":
do not auto-repair it, and do not runlore schema exportorlore syncas a fix. Read
git logon the named file. A run with both6-class and7-class findings exits7
(OPAG-373). The capability manifest's error taxonomy gainsindeterminate: 7(nine keys), and
ADR-0005 and the CLI contract carry a dated amendment. - The first stamping release makes EVERY committed schema STALE (exit
6), NOT
unattributable. No committed schema in any repository carries the stamp yet. An unstamped
schema whose type still exists is reportedstale, and onelore schema exportre-stamps all
of them. Only an unstamped schema that is also an orphan (no type owns it) reports exit7.
The Story -> Arc rename below addsarc.schema.json, which a pre-0.9.0 bundle lacks and which
reportsmissing(exit6). The same export writes it. - Fleet consumers skip 0.8.0. Move the lore pin to
0.9.0AND runlore schema exportin the
SAME pull request. A pin-only PR goes red on the docs gate, because the new binary finds every
committed schema stale. Commit the regenerated.lore/schemas/*.schema.jsonwith the pin change
(opum-agent OPAG-326). - After a legitimate type removal, the removed type's schema reports unattributable (exit
7)
until a human deletes it. Removing a type changes the profile digest, so the leftover file
carries a stamp the running binary does not recognise.lore schema exportwill no longer
prune it. It is kept and reported instead. A legitimate removal now costs one deliberaterm.
That is the design: a leftover file needing a deliberatermis a much cheaper failure than
deleting a file the tool could not attribute. - A future lore release that changes the digest projection or the reserved coupling fields
moves every repository at once. The digest covers each type's name, slug, aliases, and
declared fields with their requiredness, reserved coupling fields included. It covers no lore
version, so an ordinary release does not move it. A release that adds or removes a type, alias,
or field, or changes the projection itself (lore-profile-digest/1), takes every committed
schema in every consuming repository stale at once. Such a release will ship its own rollout
note. The stability contract is stated besideprofileDigestinsrc/core/schema.ts. lore schema export --jsongainskeptUnattributable. It lists the orphans that were kept
because their stamp is absent or foreign.removednow lists only orphans whose stamp matches
the running binary's own profile. Outside--json, a stderr warning names each kept file.
Provenance — read this before checking the packument
- LCLI-482 is still open. OIDC trusted publishing still cannot authenticate for this
repository. If 0.9.0 goes out through the manualscripts/publish-release.shpath, as 0.8.0,
0.7.0, 0.6.2 and 0.6.1 did, it carries no provenance attestation. That is expected and is not
evidence of tampering.
Added
- Committed-schema generator stamp (LCLI-565, spec LCLI-563).
lore schema export, and
lore initthrough the same emitter, writesx-lore-generator.profileDigestinto every emitted
schema, alias files included. The value issha256over a documented, versioned projection of
the compiled profile's type definitions. Editors and validators treat the key as an inert unknown
keyword. lore checkexit7, ruleschema-unattributable(LCLI-565). An orphaned schema with a
matching stamp is stillorphaned(exit6, prune advised). An orphan with a differing or absent
stamp isunattributable(exit7), and no prune is advised. Every schema finding now carries a
schemaClass(missing/stale/orphaned/unattributable). The schema pass runs first,
so a later validation throw cannot hide an unattributable schema: that throw is escalated to
indeterminate, and the original message anderror_typeare kept.- Deprecated type aliases in profiles (LCLI-553). A
[[types]]table may declarealiases. An
alias resolves to its canonical type everywhere a type name or slug is read, andlore schema exportemits a byte-identical schema file for each alias spelling. Name and slug collisions are
rejected.
Changed
- The built-in
Storytype is nowArc, andStorystays as a deprecated alias until 1.0.0
(LCLI-554, OPAG-255). Existingtype: Storydocuments keep working.lore new Storywrites
type: Arc, and both spellings scaffold intodocs/arcs/.lore query --type Storymatches
documents of either spelling, and required-section enforcement applies to aliased documents.
Consumers gainarc.schema.jsonbeside a byte-identicalstory.schema.json.
Fixed
lore schema exportno longer deletes a case-variant schema on a case-insensitive filesystem
(LCLI-565). This defect predates this release. It was reproduced on APFS, and NTFS has the same
case-insensitivity. A committedADR.schema.jsonand theadr.schema.jsonthat export writes
are one directory entry there. Export's prune then read back the bytes it had just written,
found them owned, and deleted the onlyadrschema. Prune decisions now come from a snapshot of
the directory taken before any write. An entry whose case- and normalization-folded name matches
a written name is never deleted.lore checkhad the same defect on the reporting side. It
called the owned schema missing and advised pruning its variant. A stamped variant now stands in
for the owned schema when the exact name is absent, and an unstamped or foreign one reports
unattributable.- The generated type schema accepts alias spellings (LCLI-558). Alias resolution shipped
without alias acceptance: atype: Storydocument resolved toArcand was then rejected by
the schema's single-valuetypeliteral, solore linkstill refused it.typenow accepts the
canonical name and every alias. An aliasless type keeps itsconstform byte-for-byte.
Internal
- The Windows launcher-qualification test no longer flakes on
EBUSY(LCLI-564). Every
assertion passed. The scratch-tree removal threw because Windows briefly holds a handle after
the launcher exits. It now uses the bounded retrying remover the same file already tests. - Documentation: the 0.8.0 retained-snapshot upgrade note (LCLI-561), and the schema-drift
remedy named in it (LCLI-545). See the 0.8.0 entry's "Known incompatibility" section.