The ROADMAP #694 local pre-push gate should catch stale Rust build breakage without polluting stdout that callers may reserve for structured output. Route the roadmap ID pre-check through stderr like the build gate messages.
Constraint: ROADMAP #693-#695 verification already covers typed analog phase errors, the cargo build gate, and startup preflight warnings; this change only fixes the failing pre-push hook contract found during G013 validation.
Rejected: Reworking hook installation or branch-protection policy | outside the local repository change surface available from this worktree.
Confidence: high
Scope-risk: narrow
Directive: Keep pre-push status/progress output on stderr so stdout stays available for machine callers.
Tested: python3 -m pytest tests/test_pre_push_hook_contract.py -q; cargo test --manifest-path rust/Cargo.toml -p claw-analog rag_response -- --nocapture; cargo test --manifest-path rust/Cargo.toml -p runtime startup_preflight -- --nocapture; python3 scripts/validate_cc2_board.py --board .omx/cc2/board.json; cargo fmt --manifest-path rust/Cargo.toml --all -- --check; cargo build --manifest-path rust/Cargo.toml --workspace --locked
Not-tested: full cargo test --workspace
Add a lightweight ROADMAP duplicate-id guard and wire it into the low-risk docs/pre-push paths so optimistic append collisions introduced after the next-id helper are caught before merge.
Constraint: Current ROADMAP contains legacy numbered lists and pre-helper duplicate low ids, so the default guard checks helper-era ids >=723 while preserving --min-id 1 for a future strict audit.
Rejected: Fail CI on every numeric duplicate in the whole historical ROADMAP | current main would fail before this PR because old prose/list numbering is already duplicated.
Confidence: high
Scope-risk: narrow
Directive: Keep roadmap-next-id.sh paired with roadmap-check-ids.sh when changing ROADMAP append workflows.
Tested: bash -n scripts/roadmap-check-ids.sh scripts/roadmap-next-id.sh .github/hooks/pre-push; scripts/roadmap-check-ids.sh; temp ROADMAP copy with duplicate 723 failed nonzero and listed id 723; SKIP_CLAW_PRE_PUSH_BUILD=1 .github/hooks/pre-push; git diff --check; python3 .github/scripts/check_doc_source_of_truth.py; python3 .github/scripts/check_release_readiness.py
Not-tested: full cargo workspace build/test because this is docs/scripts-only and the local pre-push cargo build was smoke-tested with its documented skip path.