Skip to content

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.

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, or None when 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.
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, or None when the finding is graph-level (no subject anchor, or a foreign-key cycle that has no single table to attribute it to) — mirroring column being None for a whole-table finding.