nx_hold_lib.nx
buildroot/runtime/nx_hold_lib.nx
about
nx_hold_lib.nx -- LEGAL HOLD / PRESERVATION (the EDRM LEFT SIDE) + the FRCP 37(e) sanction ladder.
nx_ediscovery screens what goes OUT (production is an allow-list). This is the other half, and it is
the half that ends cases: evidence destroyed before review ever happens. You cannot screen a document
you already deleted.
THE DUTY (Zubulake / FRCP 37(e)): the obligation to preserve attaches when litigation is REASONABLY
ANTICIPATED -- not when a complaint is filed, not when counsel is retained. Anticipation is normally
the EARLIER date, so the duty runs from the MINIMUM of the two triggers. Anchoring preservation to
the filing date is the most common preservation error and it silently discards months of evidence.
THE TOOTH THAT MATTERS MOST: issuing a hold notice is NOT preservation. Three things are separate and
all three are required -- the NOTICE went out, every custodian ACKNOWLEDGED it, and automated
DELETION was actually SUSPENDED on every system. A notice sent while the email retention policy keeps
purging on schedule is a hold that exists only on paper. Systems conflate the notice with the
suspension constantly, so they are counted independently and defensibility never rests on the notice.
THE SAFE HARBOUR, ENCODED EXACTLY: FRCP 37(e) does NOT punish lost ESI as such. Sanctions require ALL
of -- ESI was lost, REASONABLE STEPS were not taken, and it cannot be restored or replaced. If
reasonable steps WERE taken the answer is no sanctions even though data is gone. Severe measures
(adverse-inference, dismissal) require an additional finding of INTENT TO DEPRIVE; negligence,
however gross, tops out at curative. Collapsing those tiers turns a discovery dispute into a lost case.
STRUCTURE: a PURE DECISION CORE (rules, no I/O) plus REGISTRY ADAPTERS. The rules gate with zero
writes so a storage stall cannot make them unverifiable (debt 1785519597), and each rule exists once.
SCALE ENVELOPE (declared): the matter record is ONE packed canonical record; one record per custodian.
DRY: composes nx_matter_lib. license_tier: ORIGINAL LIB.
dependencies 1 imports · 2 importers
imports: nx_matter_lib.nx
imported by: nx_hold_pure_gate.nxnx_legal_svc.nx
structs
| none |
consts
| 30 | const HD_UNSET: i64 = 0 - 2000000002 |
| 32 | const HD_NO_SANCTION: i64 = 0 |
| 33 | const HD_CURATIVE: i64 = 1 |
| 34 | const HD_SEVERE: i64 = 2 |
| 36 | const HD_RECBUF: i64 = 1024 |
| 37 | const HD_IDBUF: i64 = 256 |
functions
| 43 | func hd_is1(v: i64) -> i64 |
| 49 | func hd_duty_pure(anticipated: i64, filed: i64) -> i64 |
| 56 | func hd_duty_attached_pure(duty: i64, asof: i64) -> i64 |
| 65 | func hd_unsuspended_pure(total: i64, suspended: i64) -> i64 |
| 73 | func hd_exposure_pure(unacked: i64, unsuspended: i64) -> i64 |
| 79 | func hd_defensible_pure(duty_attached: i64, notice_issued: i64, unacked: i64, unsuspended: i64) -> i64 |
| 88 | func hd_release_premature_pure(released: i64, duty: i64) -> i64 |
| 96 | func hd_sanction_tier(lost: i64, reasonable_steps: i64, restorable: i64, intent: i64) -> i64 |
| 104 | func hd_sanction_label(t: i64, out: *u8) -> i64 |
| 116 | func hd_atoi(s: *u8) -> i64 called by 1: hd_field |
| 135 | func hd_itoa(v: i64, out: *u8) -> i64 |
| 146 | func hd_put(prefix: *u8, matter: *u8, anticipated: i64, filed: i64, notice: i64, released: i64, sys_total: i64, sys_susp: i64) -> i64 |
| 178 | func hd_field(prefix: *u8, matter: *u8, field: *u8, flen: i64) -> i64 |
| 187 | func hd_duty_day(prefix: *u8, matter: *u8) -> i64 |
| 191 | func hd_duty_attached(prefix: *u8, matter: *u8, asof: i64) -> i64 |
| 195 | func hd_notice_issued(prefix: *u8, matter: *u8) -> i64 |
| 200 | func hd_notice_lag(prefix: *u8, matter: *u8) -> i64 |
| 208 | func hd_systems_unsuspended(prefix: *u8, matter: *u8) -> i64 |
| 212 | func hd_cust_key(matter: *u8, cid: *u8, out: *u8) -> i64 |
| 221 | func hd_cust_put(prefix: *u8, matter: *u8, cid: *u8, notified: *u8, acknowledged: *u8) -> i64 |
| 237 | func hd_cust_acked(prefix: *u8, matter: *u8, cid: *u8) -> i64 |
| 249 | func hd_cust_unacked(prefix: *u8, matter: *u8, cids: *i64, n: i64) -> i64 |
| 259 | func hd_exposure(prefix: *u8, matter: *u8, cids: *i64, n: i64) -> i64 |
| 263 | func hd_defensible(prefix: *u8, matter: *u8, cids: *i64, n: i64, asof: i64) -> i64 |
| 267 | func hd_released(prefix: *u8, matter: *u8) -> i64 calls 1: hd_field |
| 272 | func hd_release_premature(prefix: *u8, matter: *u8) -> i64 |