Ctx.failErr (internal/control/control.go) returns exit 2 (usage) for any error that is neither store.ErrNotFound nor internal. A duplicate milestone title took that path until #203 moved milestone create and org milestone create to exit 1 explicitly. Other callers of failErr still turn genuine failures ("already exists", refusals) into usage exits.
Audit the callers and either give failErr a failure default with an explicit usage path, or replace the calls that pass non-usage errors.
Found during the #203 review.
closed by commit b347d6c8c4 by cmc: control, e2e, wiki: failErr is a failure by default, failInput is usage
2026-09-11 23:42 UTC