This release rebuilds how openMINDS_MATLAB reads metadata and resolves links, opens the store and resolver interfaces to external code, and fixes a long tail of collection and store bugs. A few behaviours change; see Removed and Deprecated before upgrading.
Added
- A JSON-LD deserializer that mirrors the serializer, so reading and writing follow the same rules. Nodes that cannot be read are reported once, by identifier, rather than failing one at a time (#110).
- Documents written for any known openMINDS namespace are read, regardless of the active model version (#112).
- Public extension interfaces:
openminds.interface.MetadataStoreandopenminds.interface.LinkResolvermoved out of the internal namespace (#116), and a registered link resolver can be replaced (#117). They are exercised by a mock external backend with its own serializer, deserializer, store and resolver (#118). IsReference=truecreates a reference explicitly:Type("id", iri, "IsReference", true)(#133).- Interoperability tests against the Python reference implementation (#129), and schema-driven round-trip and golden-fixture tests (#102).
Changed
- Serialization and link resolution run on a shared graph-traversal core (#108, #111). Resolution terminates on cyclic graphs, respects the link budget whatever order nodes are reached in, unifies references that share an identifier, and keeps the reference identifier when a resolver replaces a node.
- A folder store saves every node reachable from what it is given, one file each, so the references in the saved files can be followed on load (#131).
- A reference is never turned into a node. It is not counted by a
Collection, gets no file of its own, and stays a reference in every document that links to it across a save and load.isReferenceis the public query for this (#133). - Dates are written as ISO 8601 and read with a UTC offset, and files are read and written as UTF-8 explicitly (#127).
- The node order in a collection document is deterministic across MATLAB releases (#113).
Deprecated
isUnresolvedin favour ofisReference. It still works and warns once per session (#133).
Removed
FolderMetadataStoreno longer takesRecursionDepthorIncludeIdentifier. It always writes every linked node and always writes identifiers (#131).- Creating an instance with only an
https://id no longer makes it a reference. UseIsReference=true; an id alone makes a node (#133). - The unused resolver option of
Collection.save(#115).
Fixed
Collection.saveuses the store passed to it (#115).- A collection can be built from several files, an empty collection saves, and a vocabulary IRI inside a string value survives decoding (#127).
- Controlled-term values are preserved when deserializing (#107), and every element is kept when constructing controlled terms from a struct array (#109).
- Array handling in
Schema.resolve(#106). - Property introspection in
meta.Type(#103).
Internal
These do not affect v0.9.8 users. Two fix defects introduced earlier in this cycle: the seven findings of the traversal and deserialization review (#130) and decoding controlled instance files through the shared JSON-LD path (#119). The rest is CI: the MATLAB versions tested (#101) and a release step that updates codemeta.json (#85).
All merged pull requests
What's Changed
- Update MATLAB versions in CI workflow by @ehennestad in #101
- fix: make collection document node order deterministic by @ehennestad in #113
- test: add schema-driven round-trip and fixture tests by @ehennestad in #102
- fix: correct property introspection in meta.Type by @ehennestad in #103
- fix: correct array handling in Schema.resolve by @ehennestad in #106
- fix: preserve controlled term values when deserializing by @ehennestad in #107
- refactor: add graph traversal core and move resolution onto it by @ehennestad in #108
- fix: keep every element when constructing controlled terms from a struct array by @ehennestad in #109
- refactor: add a JSON-LD deserializer symmetric with the serializer by @ehennestad in #110
- refactor: move serialization onto the shared traversal core by @ehennestad in #111
- feat: read documents written for any known openMINDS namespace by @ehennestad in #112
- fix: use the store passed to Collection.save and drop the dead resolver option by @ehennestad in #115
- refactor: promote the extension interfaces out of the internal namespace by @ehennestad in #116
- feat: allow replacing a registered link resolver by @ehennestad in #117
- test: exercise the extension points with a mock external backend by @ehennestad in #118
- fix: decode controlled instance files through the shared JSON-LD path by @ehennestad in #119
- fix: collection, store, encoding and date regressions by @ehennestad in #127
- test: interoperability with the Python reference implementation by @ehennestad in #129
- fix: resolve the seven open defects from the traversal and deserialization review by @ehennestad in #130
- fix: save every linked node from a folder store, one file each by @ehennestad in #131
- fix: keep references as references, and create them explicitly by @ehennestad in #133
- Add codemeta.json update step to prepare-release workflow by @ehennestad with @Copilot in #85
Contributors
@ehennestad, with Claude (Anthropic) as co-author on most of the commits in this release, working through Claude Code. Review, design decisions and merges were human.
Full Changelog: v0.9.8...v0.10.0