Skip to content

CodeEraser 1.5.0

Choose a tag to compare

@github-actions github-actions released this 01 Sep 20:48
· 59 commits to main since this release

CodeEraser 1.5.0

The complexity axis gets the one thing it never had: an absolute line — opt-in,
off by default, and deliberately so. Scores are fully comparable with 1.4.x by
construction
: the new knob never reaches the score, no judged axis moved, no
default guard tier changed, the wire stays at 6.5.0 and the index schema at 15.

[thresholds] cognitive_fail

Until now no complexity refusal existed anywhere in the product. The scan grade
table's fail column is literally 0 for every complexity metric, the PreToolUse
hook judges no complexity at all (write-time checks are AST-free by design), and
the ADR-006 ratchet only stops growth — a brand-new function bootstraps at
whatever value it is born with, by documented design. A tangled function warned,
and nothing more, ever.

cognitive_fail completes the fail tier. Declared, it arms ce scan's exit
code (named condition: hard_line, incoherent ladders refused at load) and the
per-class channel — [[rules.class]] knobs.cognitive_fail, so one tree can hold
two different walls and only the classed path answers to the stricter one.

The default is 0 — the published "no hard line" — and that is a stance, not a
caution. The plan's own evidence row records that cognitive complexity has no
support on the correctness axis (r = −0.13, CI crossing zero); a metric this
project declines to over-claim does not get a wall nobody asked for. Arming one
is a declaration, fenced by the knob digest like every other declaration.

What it deliberately is not: a curve. Applying the size axis's graded-zone
pricing to cognitive complexity was measured before being declined — it charges
0‰ on this repository, because 2732 of 3900 measured functions sit at complexity
0 and the opportunity count dilutes everything; the shape of the numerator was
never the problem, and a curve would have cost a score migration for nothing.

Nothing else moves. The grade rows always carried [code, warn, fail] and the
core always judged a nonzero fail line generically, so the Haskell core is
unchanged
— every golden fixture byte-identical — and the knob fingerprint of
every repository that does not declare the key, classed or not, is untouched by
the canonical rules that drop default-valued and undeclared leaves.

The maintenance underneath

  • An observation had been written as an invariant. The soft-line exponent's
    comment (and its methodology booklet) claimed k=2 lands S "within ±6% of the
    historical 300". That was a three-tree calibration note from v0.6; measured
    today this repository's S is 372 — +24% — and the citation gate re-signs
    anchors without reading truth. Both sentences now say what they were.
  • The hard-line chips had no executor. The docs-constants gate matches chip
    display names against source constant names, so sizeHard H, seamHard H
    and file_lines_fail H — labels carrying the role letter the docs use —
    could never resolve and sat on the allowlist: 750 printed on four surfaces,
    checked by nothing. The gate now maps labels to the constants they name,
    checks both halves of a pair chip ([softMin, softMax]), and harvests
    impl Default field values, where every ce.toml threshold default actually
    lives. Eight negative probes verified one by one that moving any bound
    constant reddens the gate. The allowlist shrank from 30 entries to 22, each
    annotated with the property that keeps it unbindable.
  • The moving soft line joins the comparability list. S is repo-relative and
    re-derived at a named re-establish; this repository's walked from 304
    (v0.7.3) to 372 (v1.4.1) — three points apart replayed on the same tree —
    and no document had ever named that as a comparability cause. Both READMEs
    now do, and the Limits paragraph states that the complexity axis ships with
    no hard line, so the absence reads as the stance it is.
  • One audit claim was refuted and is recorded as such: ce join does not
    price the size axis under different rules — it does not price it at all (its
    fact tables ride empty and are ignored; the join consumes verdicts alone).

Benchmarks

1.5.0 changes cli/src, so it earns a row; per the series' own rule the whole
latency table is replayed in one sitting after the tag, and the row lands with
the replay. Until then every version-bearing surface says exactly that.

Full details in the CHANGELOG. Channels: GitHub Release (ten pinned assets),
crates.io, npm, https://codeeraser.dev.