crimes 0.28.0
Reliable context, quieter defaults, and an evaluation that checks completed edits. This release implements the accepted September product review.
Upgrading
Section titled “Upgrading”JSON schema remains 0.8.0. No finding identity format changes in this release. Optional context status/coverage and scan ranking-policy fields are documented in JSON schema.
Four detector ids move off by default: boolean_naming_drift,
boolean_naming_drift.py, accessible_interaction_risk and
design_token_escape. Enable them explicitly when useful; adding only
optional ids retains other defaults. parallel_destination stays optional.
Optional defaults are reported through coverage instead of repeated stderr
messages. Findings and gates can change because defaults and hotpath
calibration changed; review the new results before updating CI decisions.
For pins orphaned by earlier claim/discriminator changes, preview
crimes migrate-pins --format json, review the proposed destinations and
apply the reviewed file with --apply. Reasons, owners, dates, dispositions
and feedback expiry are preserved. Missing or ambiguous subjects are not
silently deleted or re-decided. Migration guide.
Context agrees with scan
Section titled “Context agrees with scan”context now uses the same repository analysis as scan, including
correctness/authority, manifests, agent configuration, asset detectors,
claim disables and score inputs. It includes findings anchored elsewhere
that explicitly name the target in related_files. Resolved importing
tests and incoming/outgoing imports lead context discovery; filename and
source-text matching remain fallback hints.
analysis_status and coverage diagnostics distinguish completed, partial
and unanalysed briefings. An empty list is not evidence of safety. Use the
same explicit --root ., configuration and clock for comparable reports.
Full corpus analysis precedes working-set selection, so scoping output does
not promise a cheaper analysis. Regression tests cover every authority and
agent-hygiene finding on risky-service, claim disables, alias-importing
tests, excluded targets and incomplete parsing.
A more useful default report
Section titled “A more useful default report”Human file ranking uses the strongest finding plus diminishing support
from distinct (type, claim) pairs, replacing an unbounded sum. Thirty
instances of one mild claim no longer win through count alone. Scores are
computed in core; --no-recency is respected by human file grouping too.
Individual observations remain available in JSON and --all.
JS synchronous I/O requires request/render evidence; Python also accepts
an async function where event-loop blocking is evidenced. An ordinary
domain function is insufficient. swallowed_error remains visible while
prioritizing sensitive consequences over documented/generic fallback.
Tests retain deliberate fallback observations and distinguish them from
failed writes. Scoring gives the actual formula and limits.
The stable type design_token_escape now has the honest charge Raw Style
Concentration. It does not claim to have found a token system. Naming and
accessibility checks remain available for explicit reviews.
Evidence of improvement, and its limits
Section titled “Evidence of improvement, and its limits”| Measurement | 0.27 build | 0.28 build |
|---|---|---|
| Mean ranking nDCG, all 57 scored scenarios | 0.4573 | 0.4770 |
| Mean ranking nDCG, same 32 deep scenarios | 0.3682 | 0.3895 |
| Paired edit acceptance, three tasks per arm | Without crimes: 3/3 | With crimes: 3/3 |
| Paired runs with unrelated edits | 0 | 0 |
Ranking comparisons use the same revised scenarios, fixture sources and reference clock. Six scenarios now label exact claims/subjects; two obsolete default scenarios are retired and the frontend task is narrowed. Those are measurement changes, not passes. Most remaining labels are still type-only; the deep aggregate is dominated by the messy-app fixture and one fixture sits close to its depth threshold. Lower finding counts partly reflect intentional default removals and do not alone prove better precision.
The actual-edit trial uses isolated source copies, alternating arms and acceptance tests installed after editing. The tasks reject unedited source. The result is a tie, from one run per pair on simple tasks using the installed Codex CLI’s default model. It does not demonstrate a general agent-performance gain. More representative tasks, repetitions and a pinned model are needed. Methods and committed results.
Documentation and packaging
Section titled “Documentation and packaging”README and agent instructions focus on the current workflow; release
history lives in release notes. Current command/default/schema facts and
landing output examples are generated from the built CLI and a source-only
fixture (independent of clone depth), then checked by
pnpm verify. The scoring guide documents actual fallback and blast-radius
math. Strategy and roadmap now distinguish current implementation from
unmet historical plans and unproven adoption goals.
init installs aligned skills and stops creating the inert Codex hook
settings placeholder. Existing local files are untouched. The pack smoke
handles npm’s array and keyed-object pack --json formats and exercises
the new migration command as well as the packaged Python WASM path.
Remaining work
Section titled “Remaining work”Context still analyzes the repository for each call. A single timing pair
on crimes itself (context packages/core/src/scan.ts --root .) took 3.52s
on 0.27 versus 8.99s on 0.28. The complete briefing has a real latency cost;
this is an observation, not a controlled performance estimate. Caching and
shared parsed-input reuse need separate design and measurement. Import/test discovery is
not behavioral coverage. Homebrew, standalone binaries, crimes ask and
further weak-test granularity remain deferred. Recency remains enabled with
an explicit opt-out, not a claim of proven causal value.
Verification
Section titled “Verification”pnpm verifyon Node 26.7.0: format, lint, build, generated docs, typecheck and 2,458 tests pass.- Website builds 77 documentation pages; release metadata, schema, language/family claims and required pages pass the build verifier.
- Clean-tree package smoke passes on Node 26.7.0: npm pack, temporary install, command execution and the packaged Python WASM/import-graph path.
- All 60 current scenarios reconcile against 16 fixture scans.
- Historical replay re-scores 98 responses. Four responses to the two retired scenarios are explicitly skipped; its percentage is not directly comparable to the prior population.
- The self-scan introduces no new high-severity findings compared with the pre-edit scan. 54 triage fingerprints are migrated; metadata is verified unchanged. Ten unreported pins are retained rather than declared fixed.