CodeEraser 1.7.0
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), andce checksends 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 ‰,modMassFloor4 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, andimpl 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, wiresimilar/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).--widenadds 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 toolsimilar_units, and the GUI's
eleventh screen — one document,ce.similar-report/0.1.0. The Stop audit
writes asimilarobject into the feed only when a unit added in the session
has a same-role top-1 twin; it never blocks.ce similaralways exits 0,
ce checknever 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_REV1). Floors: 60 % / 40 %, never lowered. - Cost on this repository:
ce similar0.71–0.76 s,--widen1.78–1.88 s;
coldce dedup5.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/1pair rows senddupSpans=[[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 6public_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
carriesrecovered: n. - A tests-submodule leg holds the PreToolUse hard budget and
ce scanto 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 plusSHA256SUMS, 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 aceon
PATH there. ce setupwires Claude Code (marketplaceskymanbp/CodeEraser@release,
plugin install, a marker so--unwireonly 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
releasebranch, 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-codeeraserand 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.CodeEraseronce 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 ownSHA256SUMSby a program, not copied.
Smaller changes
ce erase --log, the MCP toolerase_logand the GUI erase screen read the
erase trail asce.erase-trail-report/0.1.0; erase suggestions name the
family command (ce.erase-plan/0.3.0, additivefamilies).[ui] langince.toml(--lang>CE_LANG> file); console faces only,
not part ofknobs_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_tiersstaysfalse; the changeset-level ledger for moves and
stacking holds 821 events with zero intercepts and one missed copy positive,
recorded as it is.min_distinctcalibration is frozen; the guard FPR replay
is a permanent--ignoredleg. - Dependencies: getrandom 0.4, sha2 0.11, rusqlite 0.40.2, toml 1.1.5,
tree-sitter 0.27.0.TOKENIZER_REV2 → 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.