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?
| Component | Residue After Removal |
|---|---|
| Your source files | Unchanged — Zenzic never writes or modifies content |
| Your application code | Unchanged — Zenzic is never imported at runtime |
| Your Python types | Unchanged — Zenzic uses typing.Protocol, not inheritance |
| Your config format | Standard [tool.zenzic] PEP convention — remove the section, done |
| Your CI pipeline | One workflow step — delete it |
| Your pre-commit hooks | One 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:
[tool.zenzic]
docs_dir = "docs"
engine = "mkdocs"
Or in a standalone zenzic.toml at the repository root.
Removal procedure:
# [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)
# Delete this block
- uses: PythonWoods/zenzic-action@v1
with:
version: "0.7.0"
format: sarif
upload-sarif: "true"
Or, if running directly:
# 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