Lint
Completeness linting — make undeclared data visible, never guessed at.
effaced cannot find data you never declared; what it can do is point at every place such data could hide. Findings are questions for a human (“is this personal data?”), not determinations — annotate the column or exempt it consciously, in reviewable code.
Adapters provide the linters (see
effaced.adapters.sqlalchemy.lint_completeness); this package holds
the storage-agnostic finding model they emit.
CompletenessFinding
Section titled “CompletenessFinding”class CompletenessFinding(BaseModel): column: str | None = Field(default=None, min_length=1) message: str table: str = Field(min_length=1)One place where the data map may be silently incomplete.
Emitted by completeness linters such as
effaced.adapters.sqlalchemy.lint_completeness. A finding is a
question, not a verdict: it marks data the manifest does not cover so a
human can either annotate it or consciously exempt it. effaced never
decides on your behalf that data is not personal.
Fields:
- column (
str | None): The unannotated field, orNonewhen the whole store carries no effaced annotations at all. - message (
str): A human-readable one-liner, written for CI logs. - table (
str): Name of the store the finding points at.
ReachabilityFinding
Section titled “ReachabilityFinding”class ReachabilityFinding(BaseModel): message: str reason: str = Field(min_length=1) table: str | None = Field(default=None, min_length=1)One place the erasure planner could not route back to a subject.
Emitted by effaced.adapters.sqlalchemy.lint_reachability. A table
can be fully annotated yet have no subject-link path the planner
(resolve_subject_graph) can walk back
to a subject anchor — its data would then be silently never erased. Like a
CompletenessFinding, a finding is a question, not a
verdict: it names a gap so a human can fix the annotation or the path.
effaced never decides on your behalf that data is unreachable on purpose.
Fields:
- message (
str): A human-readable one-liner, written for CI logs. - reason (
str): Why the planner could not reach the subject from this table, phrased as the resolver’s own diagnostic message. - table (
str | None): Name of the store the finding points at, orNonewhen the finding is graph-level (no subject anchor, or a foreign-key cycle that has no single table to attribute it to) — mirroringcolumnbeingNonefor a whole-table finding.