diff --git a/docs/architecture.md b/docs/architecture.md index e7c2656..6a4bd5e 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -102,7 +102,7 @@ Recovery is layered above `Drive::read`, not inside it. Layer 1 Layer 3 (`DiscStream::fill_extents` adaptive batch sizer) handles in-loop request-size adaptation. Inline recovery (gentle retry → SCSI reset → retry) was removed in 0.13.6 — see [`rip-recovery.md`](rip-recovery.md) and -`freemkv-private/postmortems/2026-04-25-stop-wedge-and-zero-kbs.md`. +the stop-wedge postmortem (2026-04-25). --- diff --git a/docs/drive-access.md b/docs/drive-access.md index be9a9b2..a929cd6 100644 --- a/docs/drive-access.md +++ b/docs/drive-access.md @@ -67,7 +67,7 @@ Recovery is layered above `Drive::read`: streak. Inline recovery (5× gentle retry → close + reset + reopen → 5× more) was -removed in 0.13.6. See `freemkv-private/postmortems/2026-04-25-stop-wedge-and-zero-kbs.md` +removed in 0.13.6. See the stop-wedge postmortem (2026-04-25) for rationale: the inline reset wedged drive firmware on the LG BU40N (Initio USB-SATA bridge) without ever recovering a sector. See [`rip-recovery.md`](rip-recovery.md) for the full three-layer model. diff --git a/docs/rip-recovery.md b/docs/rip-recovery.md index 2554593..4ec6ee6 100644 --- a/docs/rip-recovery.md +++ b/docs/rip-recovery.md @@ -133,8 +133,8 @@ implement retry logic. no eject cycle. The `recovery` flag controls only the per-CDB timeout (1.5 s vs. 30 s); on any failure it returns `Err(DiscRead)` immediately. Inline recovery (5× gentle retry → close + SCSI reset + reopen → 5× more) -was removed in 0.13.6. See `freemkv-private/postmortems/2026-04-25-stop-wedge-and-zero-kbs.md` -for rationale: the inline reset on the LG BU40N (Initio USB-SATA bridge) +was removed in 0.13.6. See the stop-wedge postmortem (2026-04-25) for rationale: +the inline reset on the LG BU40N (Initio USB-SATA bridge) wedged drive firmware below the bridge without ever recovering a sector, and the gentle-retry phase produced long stretches of 0 KB/s with no recoveries to show for it. Recovery responsibility is now layered: layer 1 diff --git a/src/drive/mod.rs b/src/drive/mod.rs index 53ebd7f..9f90ee4 100644 --- a/src/drive/mod.rs +++ b/src/drive/mod.rs @@ -433,7 +433,7 @@ impl Drive { /// /// Inline retry phases (5× gentle + reset+reopen + 5× more) were /// removed in 0.13.6. Per - /// `freemkv-private/postmortems/2026-04-25-stop-wedge-and-zero-kbs.md`, + /// the stop-wedge postmortem (2026-04-25), /// the inline reset on the LG BU40N (Initio bridge) wedged drive /// firmware without ever recovering a sector. The remaining recovery /// layers (Disc::patch multi-pass, DiscStream batch halving) do not diff --git a/src/scsi/linux.rs b/src/scsi/linux.rs index 72f5c5f..539343d 100644 --- a/src/scsi/linux.rs +++ b/src/scsi/linux.rs @@ -11,8 +11,8 @@ //! This matches what every reference project does: MakeMKV (8 s sync //! ioctl), sg_dd (60 s sync ioctl), the kernel default for SCSI block //! devices (30 s `/sys/.../timeout`). See -//! `freemkv-private/docs/audits/2026-04-26-scsi-architecture-research.md` -//! for the full primary-source audit. +//! the SCSI architecture audit (2026-04-26) for the full primary-source +//! references. //! //! Pre-0.13.20 we ran an async `write() + poll(1.5s) + close-on-timeout + //! bg reopen` pattern. That abandoned slow-but-alive commands faster than @@ -106,7 +106,7 @@ impl SgIoTransport { /// STOP+START UNIT. Both escalations were tried in 0.13.0–0.13.5 /// against the LG BU40N (Initio USB-SATA bridge); both failed to /// recover wedged drives and made the wedge worse — see - /// `freemkv-private/postmortems/2026-04-25-bu40n-wedge-recovery.md`. + /// the BU40N wedge recovery postmortem (2026-04-25). fn open_error(device: &Path) -> Result { let err = std::io::Error::last_os_error(); Err(if err.kind() == std::io::ErrorKind::PermissionDenied { diff --git a/src/scsi/macos.rs b/src/scsi/macos.rs index 1490f3c..a786360 100644 --- a/src/scsi/macos.rs +++ b/src/scsi/macos.rs @@ -268,7 +268,7 @@ impl MacScsiTransport { // `reset()` removed in 0.13.6 — see scsi/mod.rs for rationale. // `try_recover()` removed in 0.13.20 — userspace handle-recovery on // task failure was the same anti-pattern stripped from Linux SG_IO - // (see freemkv-private/docs/audits/2026-04-26-scsi-architecture-research.md). + // (see internal architecture audit, 2026-04-26). // Errors bubble up; caller decides whether to reopen the Drive. } diff --git a/src/scsi/mod.rs b/src/scsi/mod.rs index 1b2f645..d0c3e4e 100644 --- a/src/scsi/mod.rs +++ b/src/scsi/mod.rs @@ -56,9 +56,8 @@ pub(crate) const TUR_TIMEOUT_MS: u32 = 5_000; /// /// 10 s catches every legitimate slow read with comfortable margin and /// short-circuits truly bad sectors at ~10 s rather than letting the -/// kernel mid-layer escalate for 30 s+. See run log in -/// `freemkv-private/docs/TEST_PLAN.md` and the audit at -/// `freemkv-private/docs/audits/2026-04-26-scsi-architecture-research.md`. +/// kernel mid-layer escalate for 30 s+. See the SCSI architecture audit +/// (2026-04-26) for primary-source references. /// /// Pre-0.13.21 this was 1.5 s, which forced the kernel mid-layer to /// time out *normal* reads (cold-start often takes ~1.5 s) and run its