Repository navigation
Releases
OpenMOCA 0.6.0
Hardening from the 10 November 2026 specification review. 0.5.0 was a soft
launch; 0.6.0 is the first release published to npm, NuGet and PyPI.
Added (Sigstore conformance cases)
-
Attestations §6: a Reader may verify Sigstore offline only, against
trustedRootalone; hosts refresh it themselves. The Python and .NET
Readers now verify Sigstore this way, so all three pass thesigstore-*
cases. -
Seven
sigstore-*cases: signed, reviewed, an identity that is not listed,
the wrong role, tampered content, a transparency-log entry that does not
match, and an untrusted CA. The bundles are made against a self-made test
Sigstore with INSECURE keys (scripts/sigstore-fixtures.py), verified
offline with the trusted root in each fixture trust root, and checked with
both sigstore-js and sigstore-python. Nothing is written to a public log. -
A Sigstore smoke test against the public instance, ready for after the move
to openmoca:sigstore-smoke/,scripts/sigstore-smoke.mjsand a
hand-run workflow that signs only in the openmoca organisation. It is not a
corpus case. -
Cases can name the optional features they need (
requires), and the
runner skips them with--without <feature>for a Reader that names the
feature as not implemented (Reader contract §14).
Changed (Ed25519 and Sigstore trust material)
- Strict Ed25519 (attestations §5): A and R must be canonical points of prime
order, and S < L, checked before any library verifies. Before, the three
reference Readers' libraries disagreed on 4 of the 12 ed25519-speccheck
vectors, and Python accepted a signature from a small-order key for any
message. New casessignature-small-order-keyand
signature-mixed-order-key. - Sigstore trust material (attestations §6): a trust root may carry
sigstore.trustedRoot; with it, Sigstore bundles are verified against it
alone, offline. Issuer matching names the Fulcio extension OIDs; there are
no patterns. An unusable trusted root isA003.
Changed (wording and structure)
- Requirements that were written as description now use MUST or MUST NOT,
and "throw" is replaced by a testable rule (contract §5). The terms table
in package spec §2 adds digest, attestation, trust root, sidecar, overlay,
backend, citation record and the gate, and states how codes are cited. - One name for each idea ("locale representation", "package source"),
"Reader" capitalised, UK spellings, no hyperbole or informal wording. - The AG-UI document has the same header as the others and is no longer
marked Draft. The sidecar table listsindexVersionandcreatedBy, and
modelis a MUST with its code. Package spec §13.1 points at the limits,
and §1.1 at the ADRs for rationale.
Changed (small specification gaps)
- The frontmatter block's grammar (package spec §5.1): BOM, the
---lines,
LF and CRLF only, and...never ends it. New cases
frontmatter-close-after-crandfrontmatter-close-line-separator. - Strict mode's effect on validity; the record's
profilesfield; evidence
source extensions compared in ASCII (Reader contract §7, §11). - Sidecars:
indexTypeislexical,denseorhybrid(sparseis gone);
inlinevectoris accepted until 1.0. - AG-UI: an optional
computedAtsays when the trust flags were true. - Attestations §3 says the package predicate may give way to OpenSSF Model
Signing. ADR-0009 notes that HTML and WebVTT are now normalised.
composedandlocalizedare explained.
Changed (characters, names and edge cases)
- Package spec §2 says what digits, letters, white space, case-insensitive
comparison, string order and the end of a string mean, everywhere in the
set. Each Reader now follows it: Python and .NET regular expressions and
trims had other meanings (non-ASCII digits in dates, a trailing newline in
vendor keys, U+FEFF intype, a dotless ı inindex.md). - M007 uses a snapshot of the IANA URN registry
(data/urn-namespaces.json) and accepts
informal namespaces. - A package
idnever contains#; the node reference's parsing rule is
stated.relation.versionmust be a semantic version. Atypeof only
white space fails the node schema too. Language tags are those that start
with a language subtag. - Stored (uncompressed) archive entries are checked for size and CRC-32 like
deflated ones. Thex-key grammar, reserved-name matching, the evidence
limit per representation, a BOM in evidence sources, Markdown marker
indentation, an empty media start, hybrid weights and ties with no span are
specified. - New cases
archive-stored-size,date-non-ascii-digits,
vendor-key-trailing-newline,reserved-name-ascii-only,
type-white-space,manifest-id-fragmentand
relation-version-not-semver.
Changed (decisions on folding, digests and applications)
- Path collisions use simple lowercase mapping, not Unicode case folding
(package spec §6.3). - Digest strings keep their form;
mocaVersionsays which algorithm applies
(ADR-0021). - Rules for applications and hosts are advice (SHOULD); the AG-UI client
rules stay MUSTs (ADR-0022).
Changed (the document set, model handoff, privacy, traceability)
- The document set (package spec §1.1): the status of each document, what it
binds, and one order of precedence. Rules duplicated across documents now
link to one home. What an implementation leaves out are "optional
features", not "capabilities", and the Reader interface's "every case"
matches the contract. - Handing content to a model (Reader contract §12): "package-supplied text"
is every string from a package. It goes to a model inside an escaped
envelope (JSON recommended). Applications link onlyhttpandhttps, and
never load remote resources that package text names. An AG-UI service cites
only records its Reader returned during the run. - Personal data (package spec §13.6): which fields can hold it, that a
published version cannot be redacted, and pseudonymous identifiers. - Traceability (
conformance/README.md): a table from each group of
requirements to its cases, a list of rules the corpus cannot test, and
scripts/check-traceability.mjsinnpm run validate. New corpus options
strictandexpect.contested; new casesstrict-promotes-warnings,
strict-other-families,search-relation-conflict,
search-relation-conflict-unauthorised,search-dense-version-mismatch
andsearch-dense-dimension-mismatch.
Changed (versioning and schema patterns)
- Versioning (package spec §14): the document set is versioned as one
release, which is "the contract version".mocaVersionis compared
numerically; M008 applies only below0.4; a newermocaVersionis read
on a best-effort basis with the newM009_MOCA_VERSION_NEWER(warning). A
table says whenschemas/v1, the predicate types,indexVersion, the
AG-UIversionand the digest algorithm change. - Schema patterns mean the same in every regular-expression engine:
[0-9]
for\d, ECMAScript's white-space list for\s, and(?![\s\S])for a
final$(package spec §2). Before, a trailing newline passed in Python and
.NET, and non-ASCII digits passed in Python. New cases
moca-version-newer,moca-version-leading-zeros,
moca-version-trailing-newline,moca-version-non-ascii-digitsand
manifest-id-unicode-space.
Changed (structure, composition and retirement)
- Composition (package spec §7.1.1): resolution order, the cycle rule behind
R003(keyed onid@version, checked before the resolver is called),
member identity, trust and capabilities, and how a library adds members.
New limitsmaxMemberDepth(8) andmaxMembers(256): a member past
either is not resolved (R001). - Retirement signals (package spec §5.5,
ADR-0020): one table of
what each signal sets and whether it is left out by default. Structure
never hides content.supersedesmeans the whole target package. - Structure (Reader contract §10): the shape of the
concept()result,
traversal over cycles (each concept once, never the start), and overlays
never change a package's capabilities, validity or diagnostics. Overlays
add concepts and relations; "vocabulary" is dropped. New case
structure-op-requires-cycle.
Removed
structure.json(ADR-0019):
structure.ttlis the only structure file. Astructure.jsonis an
ordinary package file that no Reader checks.O004_STRUCTURE_VIEW_MISMATCH
is retired. The corpus casestructure-view-mismatchbecomes
structure-json-ordinary-file, andexamples/service-catalogueno longer
ships the file.structure.schema.jsonstays, as the shape of the view
moca-lint structureprints.
Added (decision records)
- ADR-0015 to ADR-0020 record the 0.6 decisions on relations, audience,
reviews, ranking,structure.jsonand retirement signals.
Added
- Conformance cases for unsafe and malformed paths (
unsafe-path-absolute,
resource-bad-escape), a trust root with emptyroles, a 30,000-concept
requireschain, unparseable dates and actorless entries, alog.mdheading
in a code block,moca.jsonthat is not UTF-8, a top-level file named
attestations, a package composing another version of itself, and the first
T001,T002andT003cases (a missing target, a target with no
moca.json, and archive entry and byte limits). - Attestation cases, one fault each: wrong payload type, a payload that is not
JSON, a payload that is not an in-toto Statement, no signatures, a signature
with nokeyid, a statement naming another version, an untrusted and a
trusted signature together (valid), base64url (valid), an unknown predicate
type (ignore...