a1b997beb9
Follow-up to the two salvaged commits (#111419 @Ckarey007, #111521 @wangtaotaotao95), which both edit `_stage_candidate_venv` and were merged keep-both: - `_record_runtime_repair` (new topical helper next to `_run_runtime_repair`): a `failed`/`safe`/`repaired` repair is one `sqlite_runtime_repair` step; a `skipped`/`not-applicable` repair is one skip WITH its reason instead of a red step plus a skip. Every pip/non-venv install runs the hook and would otherwise carry a failed-looking step in every receipt. - The sync rejection's reason now travels into `RuntimeRepairResult.detail`, which `_report_runtime_repair_failure` prints and the receipt records, so the extra console print in `_stage_candidate_venv` is dropped (it duplicated the ℹ line). - Tests trimmed to invariants: the child-reason test asserts the reason on the rejection the repair returns (the exception carries it now); the receipt test covers failed step / repaired step / skipped skip and the no-receipt no-op. Dropped: the 4-case stage-rejection walk (the same chain is covered by the existing `_repair_under_lock` tests whose rejection now carries the reason).