Which fields does this suite actually defend?
Every persisted field on IssueRow, IssueClosure and IssueRemediationStep, mapped to the worklists that would surface a problem with it. A field with zero defenders is a blind spot — a column we write but never sample. Together with tile catalogue this is the structural counterpart to the regulator-sample test.
2 fields cite a route that isn't registered:
Closure.closedAt→/closure-same-day/closure-pre-targetClosure.note→/closure-note-fuzzy
status5 defendersLifecycle state (open / in_progress / blocked / resolved).
rootCause3 defendersRecorded root-cause string, free-text.
targetCloseAt5 defendersCommitted close-by date on the issue itself.
createdAt4 defendersWhen the issue was raised.
findingSummary1 defenderHeadline of the originating finding.
Rationale: Free-text — surfaced everywhere as a label; not a defensibility field on its own.
findingSeverity5 defenderslow / moderate / high / critical.
isOverdue4 defendersComputed: past targetCloseAt and not resolved.
daysToDue2 defendersComputed days until target close.
escalatedAt4 defendersWhen the issue was escalated.
escalatedToUserId1 defenderWho the issue was escalated to.
priority2 defendersComposite priority score used for ranking.
origin2 defendersWhere the finding came from (regulator / audit / self / etc.).
originAuthority3 defendersSpecific authority (JFSC, internal audit, …).
originLink1 defenderURL or record-id linking back to source evidence.
originImpactClass2 defendersAuto-classified impact band (significant / material / minor / informational).
originClassifierModelwaivedModel version that produced originImpactClass.
Rationale: Provenance for the classifier itself — surfaced inline on detail pages, not a worklist axis.
auditEntryCount4 defendersHash-chained audit entries on the issue.
findingId2 defendersFK to the source finding record.
waiverRatifiedAt3 defendersWhen the underlying waiver decision was ratified.
jurisdictionCodes3 defendersJurisdictions rolled up from the obligation chain.
idwaivedPrimary key.
Rationale: Plumbing — every page renders it as a link; not a content field.
remediationSteps4 defendersEmbedded plan array (composed of Step rows).
closure3 defendersEmbedded closure object (composed of Closure rows).
mode4 defendersevidence | waiver — the regulatory category of close.
closedAt7 defendersWhen the close was recorded.
evidenceId3 defendersReference to the evidence record (evidence-mode).
decisionId3 defendersReference to the waiver decision record (waiver-mode).
note2 defendersRationale text accompanying the close.
action3 defendersWhat the step does, in words.
ownerUserId6 defendersNamed owner of the individual step.
dueAt5 defendersPer-step due date.
evidenceId2 defendersPer-step evidence reference.
status4 defendersPer-step lifecycle (todo / in_progress / blocked / done).
idwaivedStable client-generated step identifier.
Rationale: Plumbing — referenced internally by reorder/edit; not a defensibility surface.
completedAt3 defendersWhen the step was marked done.
nwaivedOptional ordinal for legacy step ordering.
Rationale: Legacy ordinal — no current worklist depends on it.
ownerwaivedFree-text owner label (legacy; prefer ownerUserId).
Rationale: Legacy free-text — owner-gap worklists key on ownerUserId.
duewaivedFree-text due label (legacy; prefer dueAt).
Rationale: Legacy free-text — deadline worklists key on dueAt.
donewaivedLegacy boolean (superseded by status === 'done').
Rationale: Legacy — back-compat only; status is the defended field.