v0.2.11
folio 0.2.11 — an unknown argument is refused, not ignored
folio --typo used to start the MCP server and exit 0. A mistyped flag was indistinguishable from a successful run, which is the same silent-success shape this project spent the week removing from its data path. Unknown arguments now exit 1 with a usage message naming what is valid, and --help works with no environment configured.
Three defects found by reviewing the fix itself, all worth naming:
--version and --help bypassed validation, because they were scanned for across the whole argument list before validation ran. So folio migrate-buried --version exited 0 — the silent success this release exists to kill, reachable through the fix for it. A guard is not a property of its body; it is a property of what can reach it.
The validator disagreed with the code that reads the arguments. folio --log --web was blessed as "--log with the value --web", after which the port finder started an HTTP server nobody asked for and the logger wrote a file named --web, at exit 0. A validator that certifies an invocation the program reads differently is worse than none.
--web-port raised at runtime on every invocation: the port check called exact?, which is unbound in sigil. It compiled cleanly. It was caught only because one test arm runs the real deployment command instead of a synthetic one.
--log-level=trace is refused with a correction rather than accepted, because the consumers match flag names exactly and never split on =; accepting the joined spelling would start folio and silently ignore the flag. serve stays accepted — it was never a subcommand, there was no dispatch, and it has always worked because unrecognised arguments were ignored.
Verified before tagging, against this binary rather than a version string: a planted burial is found (with a known-blind binary as the negative control, which reports zero on the same fixture), and the 23-arm CLI contract suite passes.
e5b7a9ab49e0a710be0c256ab66c936412b74723
This commit is older than the 20 that keep a page here, so it has none. It is in the clone.