chaffchaff

Rule catalog

Generated at build time from the committed rule registry (packages/chaff/src/core/rules/registry.ts). A page here cannot claim something the registry does not contain. 17 rules total: 0 measured, 6 structural, 8 heuristic, 3 planned-measured (not yet run).

Structural (6): enforced, no eval needed

Deterministic facts about the artifact. They assert nothing about model behavior, so they need no eval to be trusted.

  • import.broken-targetenforcedstructuralhigh

    An @-import names a target file that does not exist, so content the author expects to be resident never loads.

  • import.cycleenforcedstructuralmedium

    An @-import chain returns to a file already on the chain; the loader breaks the cycle at first repeat, so the second visit is a no-op the author probably did not intend.

  • import.depth-exceededenforcedstructuralhigh

    An @-import sits more than four hops from the declared file, past the documented maximum. Its content silently never loads.

  • memory.index-over-read-limitenforcedstructuralmedium

    MEMORY.md content past the first 200 lines or 25 KB (whichever comes first, measured after frontmatter and HTML comments are stripped) is dropped on load and never reaches the model.

  • tool.schema-description-driftenforcedstructuralmedium

    A tool description documents a parameter that its inputSchema does not declare, or a required schema parameter is missing from a description that documents its peers.

  • budget.resident-exceededenforcedstructuralhigh

    The set's resident total exceeds its declared resident-token budget.

Heuristic (8): never fails a build by default

Behavioral claims we believe and have not measured. Labeled unmeasured in every reporter line, excluded from the chaff score.

  • duplication.cross-fileheuristicunmeasuredmedium

    Two co-loading resident files contain near-duplicate sections (normalized 5-gram shingle similarity ≥ 0.8): the same instruction paid for twice on every turn.

  • duplication.within-fileheuristicunmeasuredlow

    One file restates the same section twice (normalized 5-gram shingle similarity ≥ 0.8).

  • stale.date-referenceheuristicunmeasuredlow

    A dated claim in resident prose is older than 180 days (relative to --today). It reads as current but probably is not.

  • stale.version-pinheuristicunmeasuredlow

    A pinned build/version string sits in resident prose. Version pins go stale silently and then mislead.

  • count.enumeration-mismatchheuristicunmeasuredmedium

    Prose announces a count ("three worlds") that contradicts the list that follows it.

  • cache.volatile-before-staticheuristicunmeasuredmedium

    A volatile block (dates, version pins) sits ahead of the static bulk of a resident file, so every edit to it invalidates the prefix cache for everything below.

  • skill.description-not-routing-shapedheuristicunmeasuredmedium

    A skill/subagent description states no trigger condition (none of: use / when / whenever / before / after / trigger / invoke / load), and the description is the only resident part of the skill.

  • structure.narrative-sectionheuristicunmeasuredlow

    A resident section (3+ sentences, 40+ words) contains zero imperative sentences: narrative that costs tokens without directing behavior.

Planned measured (3): specified, not yet run

These are today’s heuristic placeholders for the SPEC §8 admission pipeline. Each reports nothing and gates nothing until its committed eval passes the recomputed admission test. That requires James’s API key and spend approval and is explicitly out of scope for this build. The tier flips only when the evidence lands.

  • A superseded instruction stays resident alongside its correction; with two contradictory rules loaded, the model may pick either.

  • resident.on-demand-knowledgeheuristicunmeasuredhigh

    Reference knowledge (archaeology, mechanisms, postmortems) rides resident when its operational residue is one line plus an on-demand file.

  • tool.description-collisionheuristicunmeasuredmedium

    Two tools in one set describe themselves so similarly the model cannot reliably choose between them.

Graveyard

Empty. Nothing here yet. When a planned-measured rule’s eval fails the SPEC §8 admission test, the rule and its failing run land here, dated, instead of being quietly dropped. “Rules we believed and could not measure” is the single most credible page a static-analysis tool can publish, and it costs nothing to keep honest.