Skip to main content

The Sovereignty Oath: Zero Residue

"Zenzic is a sentinel in your pipeline, not a chain. The ability to remove it is not a failure mode — it is a design requirement."


The Oath

Zenzic makes one unconditional promise: it will never hold your codebase hostage.

To ensure the integrity of the Safe Harbor, Zenzic's audit core is strictly read-only. We believe that a linter should never be a source of unintended mutations. Any future remediation features will be implemented as explicit, interactive utilities (e.g. zenzic fix), keeping the analysis phase 100% mutation-free.

This document is the formal proof of that promise.


1. Zero Residue Guarantee

When you remove Zenzic, what remains?

ComponentResidue After Removal
Your source filesUnchanged — Zenzic never writes or modifies content
Your application codeUnchanged — Zenzic is never imported at runtime
Your Python typesUnchanged — Zenzic uses typing.Protocol, not inheritance
Your config formatStandard [tool.zenzic] PEP convention — remove the section, done
Your CI pipelineOne workflow step — delete it
Your pre-commit hooksOne hook entry — remove it

Total removal time: 30 seconds.

No migration scripts. No data format to convert. No architecture to unwind.


2. Why typing.Protocol Matters

Zenzic's adapter system uses typing.Protocol — the Python standard library's structural subtyping mechanism.

This is a deliberate architectural choice:

# Zenzic adapter contract — structural subtyping only
class AdapterProtocol(Protocol):
def get_docs_root(self) -> Path: ...
def get_nav_paths(self) -> frozenset[str]: ...
def get_metadata_files(self) -> frozenset[str]: ...

What this means for you:

  • You do not need to subclass a Zenzic base class.

  • Your code does not carry a Zenzic inheritance chain.

  • If you remove Zenzic, your Python classes remain unchanged — no base class to strip

    out, no method overrides to remove, no MRO to audit.

The adapter is a structural contract. If your object has the right methods, Zenzic accepts it. If Zenzic is removed, your object still works — it simply has no auditor.


3. PEP-Compliant Configuration

Zenzic configuration lives in the [tool.zenzic] section of pyproject.toml — the standard PEP 518 location for tool config:

pyproject.toml
[tool.zenzic]
docs_dir = "docs"
engine = "mkdocs"

Or in a standalone zenzic.toml at the repository root.

Removal procedure:

pyproject.toml (after)
# [tool.zenzic] section deleted — no other changes needed

Or:

rm zenzic.toml

The [tool.zenzic] section is an isolated namespace. Removing it does not affect any other tool configuration. No cascading effects. No shared state.


4. The 30-Second Decommission

Step 1 — Remove from CI (15 seconds)

.github/workflows/docs.yml
# Delete this block

- uses: PythonWoods/zenzic-action@v1

with:
version: "0.7.0"
format: sarif
upload-sarif: "true"

Or, if running directly:

.github/workflows/docs.yml
# Delete this block

- name: Zenzic Sentinel

run: uvx zenzic check all

Step 2 — Remove Configuration (15 seconds)

rm zenzic.toml
# OR edit pyproject.toml: remove the [tool.zenzic] section

Done. Your pipeline runs without the documentation integrity gate. Your codebase is identical to its state before Zenzic was adopted.


5. Why We Document the Exit

Trust is built on the ability to leave, not the requirement to stay.

A tool that makes departure difficult is not confident in its value — it is protecting its own presence. The Zenzic trust model is Zero-Trust: including toward Zenzic itself.

The sentinel exists to protect your documentation. Not to protect itself.

Saga VI: The Governance of Quartz — read the chronicle