Skip to content

CodeEraser 1.7.0

Choose a tag to compare

@github-actions github-actions released this 06 Sep 22:14
· 0 commits to 6cc66f850100d84a7b8fb95971252071a8bc9f44 since this release

CodeEraser 1.7.0

The same-role advisor lands on all three faces, sparse retrieval moves into the
index, and thirty-five revival items from the 2026-09-05 frontier ship with it.
ce check scores and ce structure scores are not comparable with 1.6.0
(the reasons are below); ce docdup rows are comparable with 1.6.0. The index
schema moves 15 → 16 (one full rebuild on first run), the wire moves
6.6.0 → 7.1.0 — one major break at 7.0.0 (fourclass/1 pair rows carry
dupSpans) between two additive minors (6.7.0 similar/1; 7.1.0 dirEdges,
declRem / declAdd) — the baseline file moves to ce.baseline/2 (a /1
file is refused by name; CE_ACCEPT_BASELINE=1 ce baseline . re-establishes it
once), the daemon protocol stays at 2.1.0, and the observe feed grows
additively to ce.observe/0.10.0. A release now builds for five targets,
sixteen assets
.

Why the scores moved

  • ce check: axes 2 (clone) and 3 (docdup) now score the distinct files a
    judged pair touches, over each axis's own universe (code files for clones,
    document files for docdup), and ce check sends the docdup pairs for the
    first time — that axis had been zero in the product. This repository
    949 → 943 (CI floor 946 → 939); the tests submodule 985 → 983 (983 → 979).
    No default guard tier moved.
  • ce structure: an eighth axis, modularity — a directory's normalised Newman
    contribution against a floor, judged as one integer inequality (modFloor
    1 ‰, modMassFloor 4 edges; a directory below the mass floor or without a
    complement is not judged). This repository 820 → 831; the same tree under the
    old seven-axis table reads 819, so 819 → 831 is the axis itself. Structure
    stays report-only.
  • Baseline membership is a container-chain anchor (fnv1a(outer unit keys) +
    the position among same-key units in that chain) instead of the nth same-key
    unit in the file: deleting an earlier sibling no longer moves a survivor's
    identity, and impl A { fn add } / impl B { fn add } are two members. The
    ledger legs hold the old → new map (45 pairs here, 37 in the tests submodule).

Same-role advisor, zero models

  • Every unit gets a term bag from six channels (name, shape, callee, doc,
    structure, literal) with Porter stemming; ranking is integer BM25 (k1 = 6/5,
    b = 3/4) over an inverted index in .ce/index.db; the same-role bit is a
    conjunction judged in the core — name, callee and shape channels must agree
    (CE.Similar, wire similar/1: a query bag plus nine integers per candidate,
    the core answers the order as exact rationals, the role bits and the counts;
    more than 65536 rows degrades by name). --widen adds in-repo PPMI
    association, opt-in; the co-occurrence pairs are derived at query time from
    the index rather than stored (a pair table measured 688k rows, 10.7 → 58 MB
    and a 5 → 35–50 s cold index, and was refused).
  • Three faces: ce similar --at <file:line> | --unit <key> | --text <words> [--widen] [--format json], the MCP tool similar_units, and the GUI's
    eleventh screen — one document, ce.similar-report/0.1.0. The Stop audit
    writes a similar object into the feed only when a unit added in the session
    has a same-role top-1 twin; it never blocks. ce similar always exits 0,
    ce check never reads this family.
  • Precision was measured before anything shipped, on two arbitrated oracles:
    generation 1 (118 queries) top-1 same-role 67/118, role = 1 subset 39/59;
    the held-out generation 2 (115 queries, no overlap) 46/115, 30/56 = 53.6 %,
    hit@5 60.0 %. 84 scoring configurations and 16 role predicates were re-ranked
    on the frozen pools; none cleared the pre-registered line, so the spec's
    form ships unchanged (SIMILAR_REV 1). Floors: 60 % / 40 %, never lowered.
  • Cost on this repository: ce similar 0.71–0.76 s, --widen 1.78–1.88 s;
    cold ce dedup 5.1–5.3 → 8.0–8.7 s for the bag tables (warm unchanged),
    index 10.7 → 18.0 MB.

Judgment correctness (revival batch A)

  • Stacking: fourclass/1 pair rows send dupSpans=[[hash,start,end]] and the
    core counts only novel lines that fall inside a new duplicate unit's span
    (the 7.0.0 major).
  • Erase: the class-2 death fact is a verdict code 0..4; codes 2 and 4 are
    refused with reason 6 public_surface, so RG10 finally reaches the twin
    path, and whole-file targets are chosen by licence.
  • Daemon: the core chain backs off exponentially (1 s · 2^(n−1), cap 60 s)
    instead of closing after three failures; the first report after recovery
    carries recovered: n.
  • A tests-submodule leg holds the PreToolUse hard budget and ce scan to the
    same verdict on the same bytes.

Declaration-level moves (7.1.0, additive)

fourclass/2 requests carry declRem / declAdd[keyHash, kind, start, end] for every (key, kind) that appears exactly once on each side — and the
core answers unitEdges (same name and kind, one destination, shared content
inside both spans; more than 65536 pairs drops the table by name). Report
information only: no score, line class or guard verdict changes. Edge coverage
on the frozen instruments: this repository 31/37 → 36/37, requests 1/1,
ripgrep 22/22.

Distribution

  • Five targets — x86_64-windows, x86_64-linux, aarch64-macos,
    x86_64-macos, aarch64-linux — spelled once (update::version::TARGETS),
    fifteen binaries plus SHA256SUMS, each target through one reusable
    workflow. The plugin manifest pins all fifteen; manifests before 1.7.0 carry
    empty pins for the two new targets and the starter falls back to a ce on
    PATH there.
  • ce setup wires Claude Code (marketplace skymanbp/CodeEraser@release,
    plugin install, a marker so --unwire only undoes what it did); exit codes
    0 wired / 5 kept / 10 no Claude Code / 11 add failed / 12 install failed /
    13 elevated account differs from the logged-on user (touches nothing). The
    Windows installer's hooks call it. The marketplace entry follows the
    release branch, fast-forwarded by the publish job.
  • The Homebrew formula and the winget manifests are projections of the pin
    manifest. Three optional tag legs publish to crates.io, the tap
    skymanbp/homebrew-codeeraser and a pull request to microsoft/winget-pkgs
    when the repository secrets are set, and skip by name otherwise.
    brew install skymanbp/codeeraser/codeeraser; winget install skymanbp.CodeEraser once the pull request is merged. The npm pointer package
    lives in-tree (npm/).
  • Trust chain: the draft is created on its build commit and the publish job
    compares twelve source paths between that commit and the tag commit; release
    notes must be written before the tag (the placeholder is refused); the pins
    are read from the draft's own SHA256SUMS by a program, not copied.

Smaller changes

  • ce erase --log, the MCP tool erase_log and the GUI erase screen read the
    erase trail as ce.erase-trail-report/0.1.0; erase suggestions name the
    family command (ce.erase-plan/0.3.0, additive families).
  • [ui] lang in ce.toml (--lang > CE_LANG > file); console faces only,
    not part of knobs_digest.
  • GUI tab bar: the breakpoint is measured (1150 px English, 844 px Chinese);
    eleven tabs fit the 860 px minimum window.
  • Evidence ledgers: the zone-tier false-positive rate is measured on history
    (this repository 28/5196 = 0.54 %, requests tail 11/448 = 2.46 %) and
    [guard] zone_tiers stays false; the changeset-level ledger for moves and
    stacking holds 821 events with zero intercepts and one missed copy positive,
    recorded as it is. min_distinct calibration is frozen; the guard FPR replay
    is a permanent --ignored leg.
  • Dependencies: getrandom 0.4, sha2 0.11, rusqlite 0.40.2, toml 1.1.5,
    tree-sitter 0.27.0. TOKENIZER_REV 2 → 3 with a second invalidation layer:
    a parser-revision mismatch clears the thirteen parse-derived tables and keeps
    trend. Shown invariant on one tree with both binaries — sixteen report
    families byte for byte, twelve index tables row for row.
  • Documentation: methodology booklet 15 (the advisor); generated Chinese
    surfaces render the frozen evaluation points from templates over the
    ledger's numbers; hand-written facts (the 750-line hard line, sixteen assets,
    130 golden requests) are chips with executors.
  • Bench: the one-date rule is retired (ruling 2026-09-06). Every row names the
    day it was measured; rows of one date are a series, rows of different dates
    only a bound. v1.6.0 and v1.7.0 were measured after this tag, one tag at a
    time on 2026-09-06, and the 2026-09-03 rows stand.

Latency

Same-day rows (2026-09-06, this machine, p50 — docs/BENCH.md), 1.6.0 → 1.7.0:
ce check warm 1352 → 2387 ms (the docdup pairs now travel with ce check;
that axis was zero in the product before); cold ce dedup 5327 → 10293 ms (the
bag tables of the retrieval index are built on the cold path), warm ce dedup
430 → 495 ms; ce docdup warm 1196 → 1408 ms; ce deadcode warm 1066 → 1166 ms;
ce scan 616 → 683 ms; the PreToolUse hook probe 47 → 48 ms. The 1.5.1 rows
were measured on 2026-09-03 and read against these only as a bound.

Unsigned, as before

Binaries are unsigned; the SHA256SUMS asset and the plugin manifest's pins
are the trust anchor (ADR-007). ce update on a 1.6.0 install reads this tag
and the pins committed on it.