## [2026-05-31T17:27:18.460Z]
Moved the shared command-layer support helpers — the graph-load-or-abort wrapper and the unexpected-error funnel — out of the formatters layer and into the command layer. These helpers must reach both the engine (to load the graph) and the formatters (to build the uniform what/why/next message), and only the command layer may legally depend on both; keeping them in the formatters layer was an upward dependency on the engine that the layering rules forbid. The helpers register no command of their own, so they live under a dedicated command-support classification rather than as a command handler. Command handlers now import them from their new command-layer location.
## [2026-05-31T21:13:17.658Z]
Added OutdatedSchemaVersionError handling to loadGraphOrAbort. When the loader detects an on-disk graph version older than the CLI supports (introduced by the new lower-bound gate in graph-loader), preamble now catches this specific error type and renders a clean what/why/next message — what: the graph is at version X, older than this CLI; why: the CLI reads only the current on-disk format, not legacy ones; next: run yg init --upgrade to migrate, then re-run. This keeps the CLI's error surface consistent: every user-visible failure from graph loading is a structured three-part message, not a raw exception stack trace. The symmetric pattern mirrors the existing UnsupportedSchemaVersionError handler for the upper-bound case.
## [2026-05-31T21:41:47.529Z]
Updated reference from OutdatedSchemaVersionError.cliVersion to minSupportedVersion following the field rename in that error class. The field holds a minimum supported schema version bound, not a CLI release version, so this brings the reference into alignment with the corrected naming.
## [2026-06-01T09:41:50.140Z]
Failures the command layer cannot otherwise classify are reported to the operator as an unexpected internal defect with a request to file a bug report. A drift-state baseline that is malformed or written for a superseded on-disk format does not belong in that category: it is an expected, recoverable state condition that already carries concrete remediation steps in its own message. Such errors are therefore recognized at the catch-all boundary and their attached remediation is shown directly — still fail-closed with a non-zero exit, but without the file-a-bug framing — so the operator is guided to repair or migrate the baseline instead of reporting a defect. This makes the catch-all consistent with how superseded graph-version errors are already surfaced cleanly elsewhere.
