# The forbidden-words lint's allowlist. Read by tools/docs_audit/lint.py.
#
#   exclude <glob>            the lint does not read files matching the glob
#   allow <glob> <regex>      a line matching the regex, in a file matching the glob, is
#                             permitted whatever words it contains
#
# Every entry carries its reason. An `allow` line is for a sentence that uses a forbidden
# word to say what CTRLRun is *not* — a negation — and never for a sentence that makes the
# claim. The regex is deliberately narrow: it names the negating phrase, not the word.
#
# Two documents are exempt by the rule itself and are not listed here:
# docs/OWASP-AGENTIC-TOP10.md and docs/THREAT_MODEL.md, which exist to list what is not
# covered. The lint hard-codes them (EXEMPT_BY_RULE) so that this file cannot un-exempt them
# by accident or exempt a third by analogy.

# --- files the lint does not read ---------------------------------------------------------

# The specifications are the historical record of each version and are not rewritten for the
# docs site. They name sector packs as out of scope, standards as things not claimed, and
# `transaction` in its database sense; a reader is sent to them from Architecture only.
exclude docs/SPEC-*.md

# The roadmap says what later versions may add, including a version line for sector packs
# that does not exist yet. A roadmap that could not name future work would not be one.
#
# **Re-decided in session 6, because the fact under it changed.** `ROADMAP.md` is now a page on
# the public site, not only a repository file, so a stranger can land on it from search and read
# `EU AI Act Art. 12`, `SOC 2 CC6/CC7`, `PCI DSS`, `HIPAA` and an H2 headed *Sector packs*. The
# exclusion stands, and the reason it stands is in the document rather than in this file: every
# one of those names is future work, the standards line says it is written *"only when a design
# partner asks"*, and the packs section says in its own words that **no pack describes itself as
# compliant with any regulation**. If a line there ever asserts support rather than naming an
# intention, the answer is to fix the line, not to widen this.
exclude docs/ROADMAP.md

# The style sheet and the information architecture name the forbidden words in order to
# forbid them, and name the sections (Compare) whose titles carry a competitor's phrase.
exclude docs/STYLE.md
exclude docs/IA.md

# --- sentences that negate a claim ---------------------------------------------------------

# README and docs/CLAIMS.md: the verify badge's meaning is stated by listing the words it
# does not mean.
allow * does not mean secure, safe, compliant, certified or audited

# docs/verify.md says the same thing as a rule about which words never appear.
allow docs/verify.md do not appear as

# "It is not a guardrail library, an IAM system, a workflow engine, or a compliance product."
allow * It is not a .* compliance product

# Adapter READMEs and docs/adapters.md: the conformance kit is named and then denied as a claim.
allow * not a compliance claim
allow * not\*\* a certification
allow * no adapter describes itself as "conformant"

# docs/CLAIMS.md: the list of claims the README deliberately does not make.
allow docs/CLAIMS.md Nothing about compliance, conformance or alignment

# docs/ACS.md reads somebody else's standard. "A conformant Guardian" is the standard's own
# term for one of its roles, and the second line says what a mapping would be if it claimed
# more than it can show.
allow docs/ACS.md A conformant Guardian
allow docs/ACS.md a compliance claim with nothing behind it

# The Compare pages name the other thing they are compared with, in the heading of the section
# that says what it is good at. That is the page's whole job, and the fixed copy permits a
# category name where it is accurate; what it still forbids is CTRLRun describing *itself* that
# way, which the body of each page does the opposite of.
allow docs/compare/guardrail-libraries.mdx guardrail
allow docs/compare/governance-toolkits.mdx oversight toolkits

# The readiness block's "Not yet" list names sector packs in order to say there are none. It is
# generated by tools/docs_audit/render_readiness.py, so the sentence appears in six files: the
# three renders under docs/generated/ and the three pages that embed one. NOT_YET is where the
# sentence lives, and removing it is a pull request with the CLAIMS.md row that makes the new
# sentence true.
#
# **Named files rather than `*`, and the difference matters twice.** A `*` would grant the
# exemption to every file in the repository, present and future, so a page nobody reviewed
# could carry the sentence. And `permits` matches an allow regex against the line **and its two
# neighbours**, so under `*` a real sector-pack claim written directly above or below it would
# be permitted anywhere. An independent review found the wider glob.
allow README.md No sector packs\. \(the policy templates are starting points
allow docs/index.mdx No sector packs\. \(the policy templates are starting points
allow docs/production/index.mdx No sector packs\. \(the policy templates are starting points
allow docs/generated/readiness.* No sector packs\. \(the policy templates are starting points
allow docs/CLAIMS.md no external security audit, no third-party review of the kernel, no sector packs
