feat: sample sensitive columns progressively

This commit is contained in:
Codex
2026-09-03 10:25:05 +02:00
parent f114d0065a
commit 8e778b9edb
24 changed files with 1001 additions and 581 deletions
@@ -167,7 +167,7 @@ function makeSensitivityAnalysisRun(
databaseId: "11111111-1111-4111-8111-111111111111",
engine: "local",
modelId: null,
policyVersion: "sensitivity-v1",
policyVersion: "sensitivity-v2",
scope: "selected_columns",
status: "completed",
total: 2,
@@ -2081,6 +2081,7 @@ test("requests database-level sensitivity analysis for the only selected databas
assessment: "sensitive",
evidence: [{ kind: "content", ruleId: "pii.email" }],
observedValues: 1,
coverage: "sampled",
}],
});
}),
@@ -2162,6 +2163,7 @@ test("requests sensitivity analysis only for selected tables", async () => {
assessment: "sensitive",
evidence: [{ kind: "metadata", ruleId: "metadata.health" }],
observedValues: 0,
coverage: "metadata",
}],
});
}),
@@ -2236,6 +2238,7 @@ test("allows a human downgrade and saves only explicit sensitivity changes", asy
assessment: "sensitive",
evidence: [{ kind: "content", ruleId: "pii.email" }],
observedValues: 1,
coverage: "sampled",
},
{
columnId: nameColumn.id,
@@ -2246,8 +2249,9 @@ test("allows a human downgrade and saves only explicit sensitivity changes", asy
currentSensitive: true,
sensitive: false,
assessment: "non_sensitive",
evidence: [],
evidence: [{ kind: "coverage", ruleId: "coverage.complete" }],
observedValues: 2,
coverage: "complete",
},
],
});
@@ -21,6 +21,7 @@ const suggestions: SensitivityReviewItem[] = [
assessment: "sensitive",
evidence: [{ kind: "content", ruleId: "pii.email" }],
observedValues: 1,
coverage: "sampled",
},
{
columnId: "22222222-2222-4222-8222-222222222222",
@@ -33,6 +34,7 @@ const suggestions: SensitivityReviewItem[] = [
assessment: "sensitive",
evidence: [{ kind: "metadata", ruleId: "metadata.health" }],
observedValues: 0,
coverage: "metadata",
},
];
@@ -183,7 +183,7 @@ export function SensitiveDataReviewDrawer({
? suggestion.evidence.map((item) => item.label
? `${item.ruleId} (${item.label}${item.confidence === undefined ? "" : ` ${Math.round(item.confidence * 100)}%`})`
: item.ruleId).join(", ")
: "no sensitive match"}. Observed values: {suggestion.observedValues}.
: "no sensitive match"}. Coverage: {suggestion.coverage.replace("_", " ")}. Observed values: {suggestion.observedValues}.
</p>
</div>
<span className={`rounded px-2 py-0.5 text-[11px] font-semibold ${changedFromCurrent ? "bg-amber-500/12 text-amber-800 dark:text-amber-300" : "bg-muted text-muted-foreground"}`}>
@@ -145,7 +145,7 @@ export function SensitivityAnalysisHistoryDrawer({
["total", "Total columns"],
["suggestedSensitive", "Sensitive"],
["suggestedNonSensitive", "Not sensitive"],
["unknown", "Unknown"],
["unknown", "Unprocessed"],
] as const;
return (
<FleetLedgerDrawer