Content rules
Both stages run a content-quality linter after their structural gates pass.
These linters are advisory: they print findings and exit 0, so nothing
here blocks a pipeline run. Pass --strict to exit non-zero on an
error-severity finding — no rule in either table below declares one today,
so --strict currently changes nothing for either linter — and --json for
machine-readable output.
The tables below are generated from the linters’ own rule registries. They cannot describe a rule that does not exist, or miss one that does.
Design rules
Run by lint_design_content.py over .sdlc/design.
| Rule | Severity | Applies to | Fields | What it catches |
|---|---|---|---|---|
vague-responsibility | warn / info | component | responsibility | A component responsibility uses a vague qualifier with no concrete metric. Demoted to info when the sentence carries a number. |
god-component | warn | component | responsibility | Two actions joined by a conjunction in one responsibility — the component is doing two jobs. |
error-modes-handwaved | warn | interface | error_modes | An error mode gestures at failure rather than naming one. |
orphan-interface | warn | interface | id | The contract is provided but consumed by no component. Set-level check: not decidable from a single file. |
adr-consequences-one-sided | warn | adr | consequences | Consequences list only upsides; no cost is recorded. A decision with no downside was not a decision. |
adr-vague-driver | warn / info | adr | decision_drivers | A decision driver names no threshold the chosen option can be checked against. Demoted to info when the line carries a number. |
adr-option-unexamined | info | adr | considered_options | An option listed in frontmatter never appears under the 'Considered Options' heading, so it was named but not weighed. |
dependency-cycle | warn | component | depends_on | A cycle in the component graph where every individual edge resolves. Set-level check: invisible one file at a time. |
Requirements rules
Run by lint_requirements_content.py over .sdlc/requirements.
| Rule | Severity | Applies to | Fields | What it catches |
|---|---|---|---|---|
vague-qualifier | warn / info | requirement | description / title | A vague qualifier with no concrete metric. Demoted to info when the sentence carries a number. |
compound | warn | requirement | description | Multiple actions joined by a conjunction in one requirement, which cannot be verified or traced as a single unit. |
ears-conformance | warn | requirement | description | The description does not match the shape of the EARS pattern the requirement declares. |
passive-nameless | warn | requirement | description | Passive voice hides the responsible actor. |
impl-bias | info | requirement | description / title | An implementation detail appears in a requirement whose tier should stay solution-free. |
glossary-unused | warn | requirement | terms | A glossary term no requirement uses. Set-level check: not decidable from a single file. |
Reading a severity
A rule listed as warn / info demotes itself to info when the text it
flagged carries a number — a vague word next to a concrete threshold is
usually prose, not a missing measurement.