Findings from the review of #114 that are not covered by #118-#122. All verified against the branch.
These are five unrelated findings that happen to share an issue. They are separately assignable and do not have to land together. The ordering they fit into is #129.
Four are done and the fifth is in review. Item 5 turned out to be smaller than written.
Items
1. Parity is measured but cannot fail
.github/workflows/main.yml:80 ran the parity tests with continue-on-error: true, so a parity regression was reported and never failed the build.
Done. The parity step no longer carries continue-on-error. Gating was deliberately left until the meta-source swap rather than done first, because gating while verdicts were still moving would have blocked the changes that moved them.
2. The CLI and the MCP server disagree on filtering
cli.py:246-251 and mcp_server.py:292-296 applied the area and unchecked filters in opposite orders.
Done. select_rules now lives in check_registry.py:1210 and both front ends are formatting only. It was not only duplication: oold rules list --area RT --unchecked returned 15 rules across five areas, because the unchecked branch rebuilt the list and discarded --area. It returns 4 now.
3. A corrupt rules schema disables catalogue validation silently
meta_store.py. _read_rules separated absent from corrupt; _read_rules_schema returned None for both, so _catalog_problems returned [] and a corrupt oold-rules.schema.json meant the catalogue went unvalidated with nothing reported.
Done. The corrupt case is reported the way _read_rules does.
4. _MUST_LEVELS duplicates the level vocabulary
check_registry.py:104. The split into failure and advice was a hardcoded frozenset, and an unrecognised level silently became WARN.
Done. severity() raises on a level it does not classify, and a test ties both sets to the level enum of every tracked version. This was not hypothetical: NOT RECOMMENDED entered the vocabulary in OO-LD/oold-schema#136 and shipped in rc.3, and the old "anything not a MUST is advice" reading would have absorbed it silently.
5. Validation fetches by default
Half of this was never a gap. make validate has passed --offline since 80ee29a, the commit that added the validator, so there is nothing to change in the Makefile.
What remains is the asymmetry itself, and it is a documentation change. The library's offline parameter defaults to False, which is what enables cross-directory @context resolution, so it is the point rather than an oversight. But it sits oddly beside the vendored meta-schemas, whose stated purpose is that a released version cannot change meaning between runs. Context resolution has no equivalent guarantee, so two runs of one document can disagree if a remote context moves.
- state the asymmetry where the offline flag is documented: the meta-schemas are pinned, the contexts a document reaches for are not
Findings from the review of #114 that are not covered by #118-#122. All verified against the branch.
These are five unrelated findings that happen to share an issue. They are separately assignable and do not have to land together. The ordering they fit into is #129.
Four are done and the fifth is in review. Item 5 turned out to be smaller than written.
Items
fdb9007(ci: gate the parity check against the reference #133).65d2ce3, shipped with Native OO-LD validator driven by the specification rule catalogue #114.65d2ce3, shipped with Native OO-LD validator driven by the specification rule catalogue #114._MUST_LEVELSduplicates the level vocabulary - done inbe47619(fix(validation): classify every level, and cite the coverage rule #131).1. Parity is measured but cannot fail
.github/workflows/main.yml:80ran the parity tests withcontinue-on-error: true, so a parity regression was reported and never failed the build.Done. The parity step no longer carries
continue-on-error. Gating was deliberately left until the meta-source swap rather than done first, because gating while verdicts were still moving would have blocked the changes that moved them.2. The CLI and the MCP server disagree on filtering
cli.py:246-251andmcp_server.py:292-296applied theareaanduncheckedfilters in opposite orders.Done.
select_rulesnow lives incheck_registry.py:1210and both front ends are formatting only. It was not only duplication:oold rules list --area RT --uncheckedreturned 15 rules across five areas, because the unchecked branch rebuilt the list and discarded--area. It returns 4 now.3. A corrupt rules schema disables catalogue validation silently
meta_store.py._read_rulesseparated absent from corrupt;_read_rules_schemareturnedNonefor both, so_catalog_problemsreturned[]and a corruptoold-rules.schema.jsonmeant the catalogue went unvalidated with nothing reported.Done. The corrupt case is reported the way
_read_rulesdoes.4.
_MUST_LEVELSduplicates the level vocabularycheck_registry.py:104. The split into failure and advice was a hardcoded frozenset, and an unrecognised level silently becameWARN.Done.
severity()raises on a level it does not classify, and a test ties both sets to thelevelenum of every tracked version. This was not hypothetical:NOT RECOMMENDEDentered the vocabulary in OO-LD/oold-schema#136 and shipped in rc.3, and the old "anything not a MUST is advice" reading would have absorbed it silently.5. Validation fetches by default
Half of this was never a gap.
make validatehas passed--offlinesince80ee29a, the commit that added the validator, so there is nothing to change in theMakefile.What remains is the asymmetry itself, and it is a documentation change. The library's
offlineparameter defaults toFalse, which is what enables cross-directory@contextresolution, so it is the point rather than an oversight. But it sits oddly beside the vendored meta-schemas, whose stated purpose is that a released version cannot change meaning between runs. Context resolution has no equivalent guarantee, so two runs of one document can disagree if a remote context moves.