Codex production audit findings, all 7 fixed:
1. Exit code consistency: 7 commands that emitted error JSON but exited 0
now return Err(NotFound(...)) for proper non-zero exit codes.
Files: schedule, report, suggest, track, bookmarks, engage_recommend
2. web-login JSON framing: extracted set_silent() so web_login emits a
single clean JSON envelope instead of three concatenated objects.
3. update --check panic: wrapped self_update blocking I/O in
tokio::task::spawn_blocking to prevent Tokio runtime-drop panic (exit 101).
4. track status DB schema: posted_at column read now handles both INTEGER
(current schema) and TEXT (old DBs created by earlier versions).
5. Schema normalisation: #[serde(rename)] on all output structs to enforce
canonical JSON field names — tweet_id→id, created_at→date,
author_username→author, tweet_ids→ids across all commands.
6. Tracing subscriber: added tracing_subscriber::fmt() init with EnvFilter
in main.rs. Default level warn, configurable via RUST_LOG env var.
7. Removed expect() panics: AppContext::new() and build_oauth2_client()
now return Result with proper error propagation.
Bonus: all 16 clippy warnings fixed (cargo clippy --all-targets -- -D warnings clean).