Yieldpoint

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.