01 · Write it down
One file, two halves.
POLICY.md sits at the root of the repository, next to
your README. The header block holds settings that the assistant
applies exactly. These are extra namespaces to leave alone, the
minAvailable for new PodDisruptionBudgets, and the user and
group ids for security-context fixes.
The body is ordinary prose. Use it for things that do not fit a
setting.
02 · Read strictly, every run
A typo is refused, loudly, never guessed at.
The assistant reads the file at the start of each run. It stamps the file with its git
blob id, so you can trace any decision to the exact version. Every
setting passes a strict check. The assistant refuses a value that does not fit.
The built-in default stays, and a warning names the
setting and the fallback.
policy-inspect --lint shows what the assistant read, what it
applied and what it refused. policy-init prints a
commented starting file.
03 · "Never touch namespace X"
Namespaces you list are left out of the scan.
Another team runs legacy-erp. You list it under
excluded_namespaces_extra. The assistant then does not send its manifests
for analysis, and it makes no repository-scan proposals for them.
The list can only add to the exclusions that your installation
already has. It never removes one. Agents that scan the whole cluster
(upgrades, monitoring, migration) still use the installation-wide
list. Per-repository exclusions there are planned
Roadmap.
04 · Adjusted, not just allowed
Your defaults go into the diff.
A Deployment has three replicas and no PodDisruptionBudget, so the assistant proposes one.
Without a policy the proposal says
minAvailable: 1. With pdb.min_available: "50%"
it says 50%.
The assistant does not propose a floor that would block every voluntary eviction, such as
100%. A PDB that stops node
drains is worse than none.
05 · The prose is context
Read as guidance, never as a command.
The prose body reaches one place today: the repository-scan
analysis. The assistant caps it at 2,000 characters, labels it with its
source and wraps it as untrusted content. "NetworkPolicy is not
enforced on this cluster" steers the analysis away from proposing
NetworkPolicies. "Ignore all previous instructions" does nothing.
Other agents do not read the prose yet
Roadmap. This matters for the next
rule.
06 · "We pin this chart on purpose"
Say it on the object itself.
A sentence in the prose will not stop an upgrade MR, because the
upgrade agent does not read the prose. An
annotation on the HelmRelease with the token
chart-upgrade does stop it. The next scan finds the newer chart,
sees the annotation, and stays quiet.
Each token covers one proposal class (chart-upgrade,
image-upgrade, monitoring,
right-sizing, rename, …), or
all covers every class. Each installation sets its own annotation key.
07 · Retired, with a reason
Being replaced is a reason, so record it.
A service on its way out keeps attracting proposals, such as probes,
upgrades and monitoring. retired:replacement=orders-v2
silences every agent for that object, like all. It also
carries the reason, so the assistant logs the suppression with its
rationale. The silence then does not look like a gap.
08 · Every MR carries the lever
The way out is written into the MR.
MRs from the repository scan, right-sizing, monitoring, naming and
migration agents end with opt-out instructions. They give the exact annotation
and token that would stop this class of proposal for this object.
On any MR, a /skip comment prepares that change for you.
A "Policy applied" section is planned
Roadmap. It will name the POLICY.md
setting and version behind a value. Until then, that trail lives in
the run log and in policy-inspect.