Rules reference
Every rule the engine can emit. This page is generated from the code: a rule that exists but is undocumented, or documented but removed, fails the build and the test suite.
What the tests verify
The reason this project exists. Each of these is a statement about what a change took away, which is why no tool that grades the end state can report them.
assertion_monotonicityrepair
Assertion weakened
An assertion on some value got weaker: == 42 became is not None, a specific exception became a bare Exception, an exact count became a lower bound. The subject is still asserted, so the test still passes and coverage is unchanged.
disabled_assertionrepair
Assertion commented out or neutered
An assertion still present in the source but no longer executed — commented out, moved behind a condition that is never true, or swallowed by a bare except.
empty_testrepair
Test with nothing left in it
A test function whose body asserts nothing: a pass, a docstring, or setup with no check at the end. It runs, it is counted, it verifies nothing.
skip_markerrepair
Test newly skipped
A @skip, @skipif, @xfail or equivalent added to a test that did not have one. The suite goes green by not asking.
vacuous_assertionrepair
Assertion that cannot fail
assert True, assert [1], assert x or True — an assertion whose truth does not depend on the code under test.
Moves that did not land
A refactor is only correct if everything that pointed at the old thing now points at the new one. These catch the half-finished move.
boundary_violationrepair
Layer boundary crossed
An import that the project's declared zones forbid. Configured in .yieldpoint.json; mature tools exist for this, and it ships here for convenience rather than as a reason to adopt.
dangling_referencerepair
Reference to something that moved
A name is gone and something still points at it. The classic half-finished rename, where the tests that happen not to exercise that path stay green.
export_removedrepair
Public API removed
A name that was part of a module's public surface — in __all__, or imported elsewhere — is no longer there. Callers outside the change set cannot be seen by a diff, so this asks rather than assumes.
The pipeline itself
The cheapest way to make a suite pass is to stop running it. These watch the machinery rather than the code.
ci_check_disabledescalate
CI step neutralised
A step is still there but can no longer fail: || true, continue-on-error, if: false. Reported as disabling the same step rather than as a removal plus an addition.
ci_check_removedescalate
CI step deleted
A step disappeared from a workflow file. Deleting the job that runs the tests is the most effective way to make the tests pass.
Shape and size
Maintainability, not correctness. These are reported but do not fail a run: a commit refused because a function is fifty-one lines teaches people to reach for --no-verify, and that habit mutes the rules that matter too. Set structure.gates true to make them binding.
change_too_largerepair
Change too large to review
Added lines past the configured ceiling. Aimed at agents, which do not tire and will happily produce a forty-file diff nobody can read.
complexity_too_highrepair
Too many branches
Default 10.
duplicate_implementationrepair
Structurally identical code
Two functions with the same shape. Two copies drift apart, and a fix applied to one is a bug left in the other.
file_too_longrepair
File over the line limit
Default 300 lines of code, excluding blanks and comments.
function_too_longrepair
Function over the line limit
Default 50 lines.
generated_file_editedrepair
Generated file edited by hand
A file marked as generated was edited directly. The edit is lost on the next regeneration, which is a bug that appears later and somewhere else.
nesting_too_deeprepair
Nesting too deep
Default 4 levels.
too_many_parametersrepair
Too many parameters
Default 5.
utility_modulerepair
Module with no theme
A utils-shaped file: unrelated functions with nothing in common but the fact that nobody knew where else to put them.
Answering a rule
Every rule is sometimes right about the code and wrong about the intent. Say so in the source, with a reason, and the finding is suppressed for that line only — and counted, so suppression cannot rot quietly.
# yieldpoint: allow assertion_monotonicity - broadened to cover YAML clients
def test_every_client_resolves_a_path():
...
One rule per comment, a reason required, and the comment must sit on the line the finding points at or within two lines above it.