Reviews 893 and 894 on #518. 894-1 and 894-2 - a -FC request named a format catalog, and the mock answered it with the sibling dataset. Stripping the suffix for validation made the name canonical but also changed which object was resolved, so LIBREF.NAME-FC returned NAME's rows for a name that is not a catalog at all. Now the MPE_TABLES registration decides: if it carries a row for NAME-FC the member is a catalog and is streamed as LIBREF.NAME.ext; if it does not, the request is not a catalog and the estate's own answer is reproduced - syscc=1012 from %mp_cntlout, recorded as public/getrawdata/catalog_suffix_on_dataset. The catalog the fixture does hold, MPE_X_CATALOG, has no format entries, so its listing is empty; that is recorded in the parity README beside the other fixture divergences rather than left as an unexplained empty body. The test that pinned the object swap now asserts both halves. 894-3 - getcolvals answered a well-formed libref it does not have with "Invalid libds", and a malformed one with "Target table not found": the two rules were the wrong way round. getcolvals.sas validates the SHAPE first with %mpe_validatecol(...,LIBDS,...) and that is the only "Invalid libds"; the table is then left to %mp_derivedvars, which aborts "Target table not found: <LIBDS>" with its own MAC. Both are now recorded: public/getcolvals/wrong_libref uses a valid-length NOLIB and pins the resolution abort, and the new public/getcolvals/malformed_libds pins the shape abort with an 11-character libref. fault-paths.test.js went with them. 893-2 - loadTableFrom duplicated loadTableData, so the two could drift: one loadTableFile(libref, tableName) now serves both, with the control library as the default. 893-3 - an unreadable or malformed table file was swallowed into null and surfaced as "Target table not found". It now throws naming the file, because a broken fixture should not send the next reader looking for a missing table; an absent member still returns null and keeps the recorded abort. Tests: 149 pass. Each of the three behaviour changes was run against the previous code first and fails there - swallowing parse errors, answering the catalog with the dataset, and restoring the inverted getcolvals rule. parity/check.js ok on all 25 scenarios.