Skip to content

Releases: ashlrai/ashlr-plugin

v1.33 — Audit-driven polish + multi-host portability

26 May 04:30
8568c84

Choose a tag to compare

18 PRs since v1.32 (#88-#105). A strategic audit pass identified 3 fatal first-touch UX cliffs + 1 underexploited competitive opportunity (multi-host MCP post-RooCode shutdown). All 4 shipped + Q1'27 wk 7-12 orchestration work landed.

UX cliffs closed

  • #102 first-call savings projection — see your extrapolated annual savings on your very first ashlr call. Closes the audit's "$0.001 saved → user closes terminal" cliff.
  • #104 Bun ≥ 1.3 prereq — bold callout above the install line. Closes the silent-install-failure cliff.
  • #105 wizard restart enforcement — loud RESTART REQUIRED block + SessionStart hook detects missed restarts and warns. Closes the "wizard finished but plugin appears broken" cliff.

Multi-host portability

  • #103 multi-host MCP — ASHLR_MCP_HOST env var gates Claude-Code-specific paths. Server now runs cleanly in Cline, Claude Desktop, OpenAI Codex CLI. Setup snippets at docs/multi-host-mcp.md. Captures the post-RooCode-shutdown OSS replacement window.

Q1'27 wk 7-12 orchestration

  • #83 cross-session discovery propagation aggregator — surfaces compounding knowledge across runs
  • #78 multiplayer WAD-D breakdown — per-segment + top-mover indicators
  • #81 WAD-D historical drilldown — date-range picker + sparkline grid
  • #82 session replay UI v0 at /admin/sessions
  • #94 orchestration telemetry table + dashboard panel
  • #97 orchestrator overhead bench — measured ~5-30ms/node, 2.8× parallel speedup
  • #98 /ashlr-orchestrate-status — inspect past runs
  • #99 central token quota accountingorchestration_usage table + admin endpoint
  • #101 retry-with-backoff + handoff context budget — 3 attempts, exponential backoff, 8KB handoff cap

Fixes

  • #96 pre-existing tsc errors + permanent dashboard projection date-drift fix via clock injection
  • Discovery propagation aggregator wired into the daily WAD-D cron

Strategic artifacts

Four strategic audit docs filed at ~/.claude/plans/:

  • audit-code-quality.md — production-ready; 3 critical findings mitigated in practice
  • audit-first-touch-ux.md — 5 minutes not habit-forming; value emerges Day 3-5
  • competitive-landscape.md — positioning + RooCode shutdown opportunity
  • groundbreaking-bets.md — 5 post-northstar bets; Code Sandbox is the most ambitious

Internal

  • 36 PRs merged across the v1.31 → v1.33 arc (#66-#105)
  • ~720 new tests
  • 2 release tags (v1.31.0 + v1.32.0 + v1.33.0)
  • 4 issues filed + closed (#69 + #84 + #85 + #86)
  • WAD-D + orchestration ingest both live in production

v1.32 — Northstar Q1-Q4 shipped (33-agent, 17-PR build cycle)

23 May 04:00
56410cb

Choose a tag to compare

The largest single release in the plugin's history. Implements the entire 12-month northstar plan from Phase 0 through Q4 — plus a design doc for Q1 2027 distributed orchestration.

TL;DR

  • 33 agents spawned across 6 waves
  • 17 PRs merged (#66#83)
  • ~430 new tests added, 0 known regressions
  • All production deploys green (Vercel site + Railway server)
  • Northstar 5/5 quarters have at least an MVP shipped

Phase 0 (v1.31)

  • #66 $0 savings fix + SessionEnd hook-health + status-line discovery + onboarding hero + telemetry opt-in + manifest-staleness check
  • #68 Stripe billing test mock — unblock Railway deploy (pre-existing block)

Q1 — Genome 2.0 MVP + WAD-D foundation

  • #67 Manifest v2 schema (additive) + git post-commit hook → commit sections. WAD-D heartbeat + identity-hash + ingest endpoint + cron skeleton.
  • #70 WAD-D cron workflow (`schedule: '0 2 * * *'` + workflow_dispatch).
  • #73 Bearer-gated admin trigger endpoint (Railway-side cron run).
  • #74 Founder dashboard v0 (read endpoint + Next.js admin page).

Q2 — Cloud sync + AI synthesis + lead indicators

  • #71 Freshness badges in `ashlr__grep` output ([fresh: 2h] / [stale: 12d]).
  • #72 AI-Native Synthesis MVP — `discovery` section type generated from commits + statics, tier-gated (Pro=weekly, Team=continuous, Free=none).
  • #75 Cloud delta sync — webhook → genome_deltas table → plugin SessionStart puller.
  • #76 Real lead indicators replace stubbed-0 values (onboarding rate, status-line opt-in, first-savings-within-30min, streak, weekly invocations, nudge accept rate).

Q3 — Retrieval expansion + predictive prefetch

  • #77 Predictive prefetch MVP — fire-and-forget warm cache on ashlr__read (Pro=top-3, Team=top-10 neighbors, 1.5s budget, ASHLR_PREFETCH=off kill switch).
  • #80 PR + issue retrieval in `ashlr__grep` with `--include-prs / --include-issues / --since-days` query DSL flags.

Q4 — Multiplayer DNA + session graph

  • #78 Per-segment WAD-D breakdown (logged-in vs anonymous) + top lead-indicator movers panel.
  • #79 Session graph capture — anonymized SessionEnd events to `/v1/session-events` (foundation for replay).
  • #81 Historical drilldown — date-range picker + 6-indicator sparkline grid in the founder dashboard.
  • #82 Session replay UI v0 — list + per-session detail pages at `/admin/sessions`.
  • #83 Cross-session discovery propagation aggregator — surfaces compounding knowledge across sessions.

Q1 2027 (design only)

  • Design doc filed at `~/.claude/plans/distributed-orchestration-design.md` (4,487 words, 3 design tradeoffs, 2 open questions tracked in #84).

Operational

  • Runbook in `docs/operations.md` (extended with v1.32 surfaces).
  • Tracking issues: #84 (Q1'27 open questions), #85 (secrets to set), #86 (release tracking).

Action items before declaring v1.32 GA

  1. Set 4 secrets per issue #85 to activate the WAD-D pipeline.
  2. Trigger the cron once with `dry_run=true` to validate end-to-end.
  3. Visit `/admin/wad-d` after Vercel redeploys.
  4. Optional: run `/ultrareview` for an independent audit before tagging GA.

Privacy posture

  • Every new data path uses `sha256(machine_id + quarterly_salt)` identity hashes — never raw machine IDs, GitHub logins, or session IDs.
  • WAD-D dashboards show hash prefixes only (8 chars), never full hashes.
  • Founder-only surfaces (no per-user visibility) via bearer-gated server-side fetch.
  • Quarterly salt rotation makes hashes change every 3 months (re-anonymization built in).

v1.31.0

23 May 00:34
1d3add5

Choose a tag to compare

v1.31 — Trust, Health, Hero

- $0 savings display fix (costForSummarizer fallback to main-model price)
- ASHLR_PRO_ASSUME offline grace override
- TaskGet/TaskList clean redirect
- SessionEnd hook-health + status-line discovery nudges
- Genome aha + explicit telemetry opt-in in onboarding
- Doctor manifest-staleness check
- Cross-language bench: -57.1% (TS -61.3%, py -63.1%, rs -46.8%)

v1.27.1 — patch (genome-grep wire-in + 6 .skip removals)

04 May 05:09
a50d428

Choose a tag to compare

Patch on top of v1.27.0. Closes the two largest deferred items immediately rather than waiting for v1.28.

Closes #60_genome-search index now active in ashlrGrep

The 431-LOC inverted-index module shipped in v1.27.0 was never wired in. Now ashlrGrep consults the index between the embedding-cache check and ripgrep:

  • ≥3 token hits → skip ripgrep, return formatted genome results with from genome: <section> attribution
  • 0 hits → fall through to ripgrep
  • 1-2 hits → ripgrep with hybrid merge deferred to v1.28

New telemetry events: genome_search_hit, genome_search_miss. Try/catch wraps the index call so any failure degrades silently.

Closes #61 — un-skip 6 bash-summarizer edge case tests

Three minimal patches: find always emits by-type note, install regex matches npm ERR!, ci-matrix length floor 200→100. __tests__/bash-summarizers-expansion.test.ts is now 33/33 passing (was 27 active + 6 skipped).

Other

package.json version bumped 1.21.0 → 1.27.1 (was lagging the tag).

Tests

2680 pass / 3 skip / 0 fail — 6 fewer skips than v1.27.0.

🤖 Generated with Claude Code

v1.27.0 — Delegate Hard, Save Harder

04 May 04:42
40942bc

Choose a tag to compare

v1.27.0 — Delegate Hard, Save Harder

Makes Claude Code's biggest single token-saver — model tiering + parallel sub-agents — one slash command away. Quietly captures another 15-25% savings on long sessions. Preps the cloud backend for production traffic.

Headline: /ashlr-spawn family — delegation scaffolding

  • /ashlr-spawn <pattern> — 5 named patterns (triage-issues, refactor-files, codebase-explain, pr-review-sweep, parallel-test-fix) defined in commands/_spawn-patterns.json
  • /ashlr-parallelize <task> <files...> — fans out N agents in parallel, merges results
  • /ashlr-tier <task> — three-phase: explore (Haiku) → code (Sonnet) → plan (Opus)
  • /ashlr-budget $X | tokens=N | status | off — hard cap with PreToolUse guard (warn 80% / 95% / block 100%)
  • /ashlr-eco-mode on|off|status — auto-compact every 15 calls, force genome-grep, lower LLM threshold, smart Task routing

Multi-turn savings

  • hooks/posttooluse-dedupe-output.ts — Read/Grep result hashing, cite-by-reference if same content seen in last 8 turns
  • Pre-compaction nudge — fires once at ~65K estimated tokens
  • 4 new bash summarizers (find/grep/install/ci-matrix), no LLM calls

Cloud go-live readiness

  • server/docs/railway-deployment.md — full step-by-step go-live runbook
  • server/docs/cloud-smoke-tests.md — 5-path manual checklist
  • scripts/cloud-smoke-test.ts — automated smoke runner
  • /ashlr-doctor — new cloud reachability check section

Surface contraction

  • 4 deprecated commands (/ashlr-recall, /ashlr-usage, /ashlr-context-status, /ashlr-errors) hidden from /ashlr-help (still ship as redirect stubs)
  • Added /ashlr-resume, /ashlr-compact, /ashlr-genome-rewrap to help
  • New Session + Delegation categories
  • Site docs Legacy (deprecated) section restructure

Genome quick wins

  • genome-auto-propose.ts pre-filter: rejects raw stdout dumps, node_modules/dist/build paths, last-5 dedup hits
  • servers/_genome-search.ts (NEW, 431 LOC) — inverted-index module, mtime-fingerprinted cache at ~/.ashlr/genome-index-<repoSha>.cache

Tests

2672 pass / 9 skip / 0 fail (+304 net new tests over v1.26's 2368 baseline)

Deferred to v1.28

  • #60 — wire _genome-search into efficiency-server.ts ashlrGrep
  • #61 — resolve 6 .skip'd bash-summarizer edge case tests
  • Track A — telemetry-driven adaptive thresholds (needs ~1 week of cloud production data)

Cloud go-live (~15 min user-side ops)

See server/docs/railway-deployment.md. Steps: Railway secrets, Postgres service, DNS CNAMEs for api.ashlr.ai + telemetry.ashlr.ai, Stripe webhook registration, bun run scripts/cloud-smoke-test.ts to verify.

🤖 Generated with Claude Code

v1.25.1

29 Apr 18:55
57f7545

Choose a tag to compare

Hotfix — wires up multi-turn-stale tracking that v1.25.0 shipped as
dead code, plus three Windows test flakes hardened.

Fixed

  • Multi-turn-stale hook now actually fires. v1.25.0 added
    hooks/posttooluse-stale-result.ts but never registered it in
    hooks/hooks.json, so Claude Code never invoked it. Result: the
    per-session history JSONL was never written, the 50 KB stale-byte
    nudge never emitted, /ashlr-compact had nothing to read, and the
    multi_turn_stale_estimate telemetry produced no data. Adds a
    PostToolUse entry matching Read|Grep|ashlr__read|ashlr__grep.
  • Server /v1/events now accepts multi_turn_stale_estimate.
    v1.25.0's server-side KIND_VALUES allowlist did not include the new
    kind, so even if the client tried to emit, Zod rejected the event at
    ingest. Adds the new kind to the enum.

Added (regression coverage)

  • __tests__/hooks-json-registration.test.ts — guardrail asserting
    every critical hook script is referenced from hooks/hooks.json under
    the right event + matcher. Catches the exact class of bug that hid
    the original miss.
  • server/tests/telemetry.test.ts — new case asserting the server
    accepts and persists multi_turn_stale_estimate with the documented
    payload shape (sessionTurnCount, staleBytes, staleResults).

Test hardening (Windows-only)

  • __tests__/sql-server.test.ts — wraps rm in an EBUSY/EPERM
    retry (8 attempts, 50–400 ms backoff) so afterEach cleanup is reliable
    on hosted Windows runners that briefly hold sqlite file handles after
    subprocess exit.
  • __tests__/bash-server.test.ts, tree-server.test.ts,
    quality/grep-confidence.test.ts — explicit 30 s per-test timeouts
    for three subprocess-heavy cases that hit bun:test's 5 s default on
    slow Windows CI.
  • scripts/smoke-realtime.ts — Phase 1 visibility deadline 500 ms →
    2000 ms on Windows + final post-deadline re-check before failing.

Final state: 2690 plugin tests / 0 fail · 308 server tests / 0 fail.

v1.25.0

29 Apr 18:55
57bfe86

Choose a tag to compare

"Multi-Turn + Closing Loops" — closes the v1.24 backend follow-ups
(machine-readable LLM error codes, machine_count on stats aggregate,
team-genome v2 X25519 envelope pull) plus the v1.24 marketing prep that
deferred, plus the first half of "the Multi-Turn ceiling-breaker" with a
clear answer about what's possible as a pure plugin.

Final state: 2368 plugin tests / 0 fail · 307 server tests / 0 fail.

Backend follow-ups (closes v1.24 TODOs)

  • /llm/summarize typed error codes. 429s now carry code: "rate_limit" | "daily_cap". New 402 (Payment Required) for cost-cap suspension with
    code: "cost_cap". New monthly_usage(user_id, month) table with
    atomic bumpMonthlyCost upsert; LLM_COST_CAP_USD env override
    (default $5/user/month). Order: cost-cap (402) → daily-cap (429) →
    rate-limit (429). 9 new tests across server + client.
  • /stats/aggregate.machine_count. addMachineIdColumnIfMissing()
    idempotent migration on stats_uploads, backfills existing rows to
    'legacy' (so pre-migration installs count as 1 collective machine).
    aggregateUploads() returns machine_count = COUNT(DISTINCT machine_id).
    Status-line ☁ N machines badge now shows real values.
  • Team-genome v2 X25519 envelope pull. scripts/genome-cloud-pull.ts
    branches on .cloud-id presence — team flow uses GET /genome/:id/key-envelopeunwrapDek()parseBlob + decryptSection
    from _genome-crypto.ts (the personal flow's legacy createDecipheriv
    decoder is wrong format for v2 sections — caught + fixed). Edge cases:
    404 (no envelope), 403 (revoked), missing local keypair, DEK-unwrap
    failure, per-section decrypt failure (skip+warn). New
    __tests__/genome-cloud-team-pull.test.ts.

v1.24 Track F — Marketing prep (deferred from v1.24)

  • site/components/hero.tsx + site/app/pricing/page.tsx
    refresh: 19/35 MCP → 40, "SSO (coming soon)" → "SSO + SCIM",
    v1.24 cloud features marked shipped.
  • docs/pricing.md — Free/Pro/Team matrix updated for v1.24:
    warm-start RAG + router consolidation in Free; cloud summarizer
    • cross-machine stats sync marked "Shipped in v1.24" on Pro.
  • RELEASE_NOTES_v1.24.md (NEW) — user-facing "what you'll feel":
    cloud-synced stats, hosted summarization, warm-start RAG, offline
    token validation, v1.25 tease.
  • marketplace-listing-v1.24.md + launch-tweet-thread.md
    (NEW) — drafts for the maintainer to copy-paste post-deploy. 5
    inline TODO(screenshot) markers for assets requiring live deploy.

v1.25 — The Multi-Turn investigation + Phase 2 implementation

Phase 1 (investigation, definitive). Claude Code exposes only 4 hook
events: SessionStart, PreToolUse, PostToolUse, SessionEnd. There
is NO PreModel hook, no conversation-history access surface, no
prompts/list of prior turns. The only write surface is
additionalContext (appended; never replaces history). The 20-40%
ceiling-breaker estimate REQUIRES Anthropic to ship a PreModel hook
that exposes and allows mutation of the messages array. Documented
in docs/multi-turn-architecture.md with a precise harness gap +
spec for what would make Phase 3 possible.

Phase 2 (the achievable subset, shipped):

  • servers/_history-tracker.ts — per-session JSONL at
    ~/.ashlr/session-history/<sessionId>.jsonl. Records every Read/Grep
    result with { turn, tool, sizeBytes, contentSha8 }. Freshness
    decay: 1.0 → 0.5 (turn 5) → 0.2 (turn 15).
  • hooks/posttooluse-stale-result.ts — wires Read/Grep matchers,
    records each result, fires once-per-session adaptive nudge when
    cumulative stale-result content exceeds 50 KB threshold.
  • /ashlr-compact (NEW slash command) — reads session log, groups
    stale results by tool, prints top 5 by size, computes savings
    estimate, injects recompression hint via additionalContext. Manual
    user-driven recompression in the absence of the harness hook.
  • Telemetry: multi_turn_stale_estimate { sessionTurnCount, staleBytes, staleResults } event so v1.26 can tune the freshness
    curve from real data.

v1.26 will: validate the 5/15-turn freshness thresholds against
real multi_turn_stale_estimate data (lower if 90%+ of stale reads
are never re-referenced after turn 3); implement Phase 3 actual
history rewrite IF Anthropic ships the PreModel hook by then.

v1.24.0

29 Apr 01:57
279ae0d

Choose a tag to compare

"Foundation" — three-sprint roadmap landing in one release. Per the
post-v1.23 strategy: telemetry endpoint stand-up (Sprint 1) → Pro backend
client wiring (Sprint 2) → v1.24 engineering foundation (Sprint 3 wave-1).
Track A (adaptive thresholds tuned from real telemetry data) and Track F
(marketing moment) deferred — Track A needs real data flow first;
Track F is editorial work to fold in once the engineering settles.

Final state: 2313 plugin tests / 0 fail · 304 server tests / 0 fail.
Typecheck clean (3 pre-existing serve.ts errors carry over from main).

Sprint 1 — Telemetry endpoint server-side

  • New POST /v1/events route on the existing ashlr-api Fly app
    (server/src/routes/telemetry.ts). Server-side looksLikePath()
    defense-in-depth re-runs the v1.23 client guard. SessionId
    SHA-256-folded before storage. 10 req/min/session rate limit.
  • telemetry_events SQLite table + 3 indexes (auto-migrated via
    addTelemetryEventsTableIfMissing() in connection.ts).
  • New Prometheus counters: ashlr_telemetry_events_accepted_total{kind}
    • ashlr_telemetry_events_dropped_total{reason}.
  • 16 tests (schema, privacy regression with POSIX/Windows/UNC paths,
    rate-limit, session-mismatch defense).
  • Deploy doc: server/docs/telemetry-deployment.md covers DNS
    (telemetry.ashlr.ai CNAME → ashlr-api.fly.dev) + verification
    curls + the SQL the v1.25 adaptive-thresholds work will run.

Sprint 2 — Pro backend client wiring

  • P1: Pro token validation. servers/_pro.ts with
    validateProToken() — replaces 3 duplicate file-presence checks with
    a real backend round-trip + 24h cache + 7-day offline grace +
    background refresh via setImmediate. Token shape demystified: it's a
    permanent API token (not JWT), validated via GET /user/me. 13 tests.
  • P2: Cloud genome client. Found + fixed 4 silent bugs in
    scripts/genome-cloud-pull.ts (snake_case vs camelCase mismatches
    that were breaking encryption + a runtime crash). 10 round-trip
    encryption tests via Bun.serve stub. /ashlr-genome-rewrap
    verified working.
  • P3: Cloud LLM provider. New servers/_llm-providers/cloud.ts
    Pro-gated, 5s timeout, falls through to onnx/local/snipCompact on
    429/413/5xx. selectProvider() order: anthropic-direct (own key)
    → cloud (Pro) → onnx → local → snipCompact.
  • P4: Cross-machine stats sync. scripts/stats-cloud-sync.ts
    (delta push, cursor-based) + scripts/stats-cloud-pull.ts (1h cache).
    SessionEnd push, SessionStart pull — both Pro-gated + best-effort.
    Dashboard "lifetime across N machines" box + status-line
    ☁ N machines badge. 29 tests.

Sprint 3 wave-1 — v1.24 Foundation

  • Track B: Router consolidation. servers/_router.ts finished —
    one MCP process hosts all 40 ashlr tools instead of N child
    processes. Per-server stdio entrypoints preserved behind
    if (import.meta.main) for backwards compat. New
    scripts/measure-cold-start.ts + __tests__/router-cold-start.test.ts
    • docs/router-migration.md for users on legacy multi-MCP configs.
  • Track C: db.ts decomposition. 2509 LOC → 2-line facade +
    server/src/db/{connection,schema,users,stats,billing,genome,admin,index}.ts.
    5 incremental commits, each green. 288 server tests pass throughout.
  • Track D: _ast-refactor.ts decomposition. 1219 LOC → facade +
    _ast-refactor/{_shared,file-local-rename,cross-file-rename,extract-function}.ts.
    4 incremental commits. 50/50 ast tests pass. One intentional
    duplicated 12-line applyRangeEditsLocal helper in
    cross-file-rename.ts to avoid a circular dep.
  • Track E: Eager corpus warm-start. Three-tier embedding cache mode
    (cold 0-9 docs / warm 10-49 / hot 50+) with smooth threshold
    gradient max(0.68, 0.80 - (n - 10) * 0.003) in
    servers/_embed-calibration.ts. Background indexing fires via
    setImmediate after grep returns — small projects get RAG benefits
    without manual /ashlr-genome-init. New tier telemetry tag for
    v1.25 to validate the curve. 29 new tests + 60 existing pass.

Backend TODOs surfaced (server-side, not blocking this release)

  • /llm/summarize should return machine-readable code field on 429s
    ("rate_limit" vs "daily_cap" vs "cost_cap") and 402 vs 429
    for cost-cap suspension.
  • /stats/aggregate should include machine_count field.
  • Team-genome pull should use v2 X25519 envelopes (currently legacy
    symmetric path only).

Deferred to v1.25

  • Track A: Adaptive thresholds tuned from telemetry data. Needs at
    least a week of real opt-in data flowing post-Sprint-1 deploy.
  • Track F: Marketing moment (landing page refresh + marketplace
    push). Editorial work that should fold in once telemetry confirms
    the v1.24 changes deliver the expected lift.

v1.23.0

26 Apr 05:48
aeed797

Choose a tag to compare

"Fully Functional + Great" — 10-track parallel sprint addressing every
table-stakes gap and differentiator surfaced in the v1.22 post-mortem.
Branched from v1.22.0; agents in isolated worktrees + integration pass.
Final state: 2211 pass / 3 skip / 0-1 fail (race test is concurrency-
timing-sensitive but converges at 0). Track KK (db/ast-refactor
decomposition) deferred to v1.23.1 — agent exhausted budget.

Track AA — ONNX provider implementation

  • servers/_llm-providers/onnx.ts is no longer a stub. Full seq2seq
    inference: BPE tokenizer (loaded from tokenizer.json), encoder
    session, decoder greedy loop with KV-cache via decoder_model_merged.
  • Model is ~300MB (not the 25MB the v1.22 plan estimated), so still
    not bundled in bun install. Users opt in: bun add onnxruntime-node && bun run install-onnx-model.
  • /ashlr-doctor reports model presence + size.

Track BB — Multi-repo benchmark

  • Curated subsets: bench/refs/{node-sdk,python-lib,rust-project}/
    from vercel/ai (32 TS files), pandas (30 Py), tokio (31 Rs). Each
    pinned via .refrev SHA + LICENSE notice.
  • scripts/benchmark-refs.ts runs across all 3, aggregates into
    docs/benchmarks-v2.json with byRepo / byLanguage /
    crossLanguageMean sections.
  • README headline now −57% overall (read −74.7%) — replaces
    the plugin-self number that was suppressed by hero.mp4 etc.
  • New .github/workflows/bench.yml runs on push/release; uploads
    JSON artifact, never fails CI.

Track CC — Race-fix + embed tuner

  • recordBlock() now uses appendFileSync (POSIX-atomic for
    small writes); truncation moved to readRecentBlocks lazy rewrite
    at >1.5× cap. Eliminates the read-modify-write race the v1.22
    reviewer flagged.
  • New scripts/embed-tune.ts reads ~/.ashlr/embed-calibration.jsonl,
    sweeps thresholds, recommends optimal F-beta. --apply persists to
    ~/.ashlr/config.json::embedThreshold.
  • 26 new tests including N=20 concurrency stress.

Track DD — Windows skip elimination

  • 4 of 5 documented Windows skips removed:
    • search-replace-regex glob × 2 — added matchesGlobs() JS-side
      post-filter via minimatch (rg --glob kept as perf pre-filter)
    • ashlr-sql × 4 (file-based, in-memory, schema, EXPLAIN) — bumped
      test deadlines to 20s for Bun cold-start on Windows runners
    • onboarding-wizard × 3 — whichwhere on Windows + 5s
      spawn timeouts on which/gh auth status probes
  • 5th skip kept: ashlr-sql LLM-summarization — genuine Bun-on-Windows
    IPC + bun:sqlite + listening HTTP-server interaction (18-22s
    measured); reason rewritten to name the specific bottleneck.

Track EE — Opt-in telemetry pipeline (default OFF)

  • servers/_telemetry.ts — synchronous append-only buffer
    (~/.ashlr/telemetry-buffer.jsonl, capped at 5000) with
    looksLikePath() defense-in-depth that drops any string looking
    like a filesystem path. No paths, no patterns, no content.
  • scripts/telemetry-flush.ts — POSTs {sessionId, events} to
    ASHLR_TELEMETRY_URL (default https://telemetry.ashlr.ai/v1/events,
    endpoint not yet stood up — maintainer TODO).
  • Triggers: SessionEnd hook + on-demand. Failure-tolerant: network
    errors silently retry next cycle.
  • Opt-in via ASHLR_TELEMETRY=on or
    ~/.ashlr/config.json::telemetry:"opt-in". /ashlr-status shows
    current mode + opt-out instructions.
  • docs/telemetry.md documents contract + privacy promises.

Track FF — Hero/delight moments

  • Streaks: ~/.ashlr/streaks.json tracks consecutive saving
    days. Surfaced in status-line (* 5d streak), dashboard
    (5-day streak (best: 12 days)), and savings report.
  • Weekly digest: once per ISO week on the first Monday session
    with savings > $0, prints Last week: 6.0M tokens saved · ~$37.00. That's like 7 sandwiches, or 3 Spotify months. Comparison bank
    scales to dollar amount; opt-out via ASHLR_DISABLE_DIGEST=1.
  • Live "last save" segment in status-line: last: ashlr__read +5.0K [2s ago], fades after 60s.

Track GG — Proactive in-chat nudges

  • New PostToolUse hook posttooluse-native-nudge.ts fires
    additionalContext when Claude calls native Read/Grep/Edit on a
    file that COULD have been redirected (in nudge mode only).
  • Repeat-offender detection: 3 native calls in 10 minutes →
    escalated message with set-hook-mode.ts redirect instruction.
  • Throttle: 1 nudge per minute max.
  • /ashlr-savings opportunity hints — top 1-2 actionable
    suggestions (genome-init, LLM provider, hook-mode upgrade).
  • New scripts/set-hook-mode.ts flips ~/.ashlr/config.json atomically.
  • 33 new tests.

Track HH — Genome continuous refresh

  • New PostToolUse hook posttooluse-genome-refresh.ts appends
    edited file paths to ~/.ashlr/pending-genome-refresh.txt
    (deduped, sub-ms hot path).
  • scripts/genome-refresh-worker.ts runs at SessionEnd: reads
    pending list, debounces (mtime ≥ 2s), invalidates affected sections.
    --full flag for explicit rebuild.
  • Stale-detection: when ashlr__grep falls through to ripgrep with
    a present genome, increments counter; after 3 fallbacks, emits a
    one-time nudge in grep result.
  • 48 new tests.

Track II — /ashlr-resume slash command

  • commands/ashlr-resume.md + scripts/session-resume.ts surface
    prior-session work using the existing session log: top
    directories, top tools, total saved, branch (probabilistic via git
    log timestamps), suggested next steps.
  • /ashlr-resume <branch> filters to a specific branch's last session.
  • Schema v1 limitation: session-log doesn't capture argument payloads
    (intentional — args may contain secrets), so granularity is at
    directory/tool-class level, not per-file or per-command.
  • 17 new tests.

Track JJ — Pro tier value docs

  • docs/pricing.md Free/Pro/Team matrix with honest scope:
    Pro is ~/.ashlr/pro-token file presence today; cloud features
    (hosted summarizer, cross-machine sync, leaderboard) are documented
    intent but not yet wired to backend endpoints.
  • README "Free vs Pro" teaser; commands/ashlr-upgrade.md extended.
  • /ashlr-savings Pro upsell hint at $20+ lifetime saved
    (~8M tokens at sonnet-4.6 rates) when not already Pro.

Integration & wiring closures

  • 2 cross-track conflicts resolved (servers/_savings-render.ts
    GG vs FF; scripts/savings-report-extras.ts GG vs JJ).
  • readRecentBlocks always slices to MAX_ENTRIES on read so Track
    G's existing public-contract test holds with Track CC's lazy-rewrite
    optimization intact.

Deferred to v1.23.1 / v1.24

  • Track KK — db.ts + _ast-refactor.ts decomposition. Agent
    exhausted budget after partial work in server/src/db/. Pure tech
    debt, zero behavior change, safe to defer.
  • Telemetry endpoint deployment (telemetry.ashlr.ai/v1/events).
  • Pro feature backend wiring — cloud summarizer, hosted
    retrieval, cross-machine sync are doc'd-intent until the client
    actually calls cloud endpoints. Keep "v1.23+ roadmap" caveat in
    PRO_TIER.md until wired.

v1.22.0

26 Apr 04:06
fa901b8

Choose a tag to compare

"Consistency" — 8-track parallel sprint that closes the systemic gaps
between ashlr's headline claims and what users actually feel. Branched from
v1.21.1; agents in isolated worktrees + integration pass + bench refresh.
Final state: 1955 pass / 3 skip / 7 fail (the 7 are pre-existing
pollution flakes that pass in isolation). 40 MCP tools (+5 from v1.21).

Track A — Tier 0 trust pass (savings math)

  • ashlr__edit micro-edit penalty fixed (was −150% at p90). New
    ASHLR_EDIT_MIN_CHARS (default 80) — sub-threshold edits pass through
    to native, emitting tool_skip_micro_edit.
  • ashlr__multi_edit baseline aligned with single-edit (was inflated
    5-10× on small-hunk-into-large-file refactors).
  • Pricing: added sonnet-4.6 ($2.50/$12.50, new default), opus-4.7
    ($18/$90 — Opus users were under-priced ~2×). Auto-detect from
    CLAUDE_CODE_MODEL.
  • tool_noop mislabeling fixed across 9 servers — content-shipped
    paths use new tool_low_confidence_shipped event kind.
  • New __tests__/lifetime-counter.test.ts.

Track B — WebSearch + Task tool coverage

  • New ashlr__websearch (dedupe by domain, rank, LLM-summarize top-N).
  • New ashlr__task_list + ashlr__task_get (filter, compact column
    view, snipCompact long descriptions).
  • 27 new tests + bench fixtures.

Track C — NotebookEdit + Write coverage

  • New ashlr__notebook_edit (3-cell window response, elide unchanged
    cells — 52-cell notebook → <2KB).
  • New ashlr__write (existing-file delegates to ashlr__edit,
    new-file emits compact ack — content never echoed).
  • 21 new tests + 2 notebook fixtures.

Track D — LLM hybrid (Anthropic + ONNX + local)

  • _summarize.ts refactored into servers/_llm-providers/ facade.
  • Default auto: anthropic → onnx → local → snipCompact. Existing
    ASHLR_LLM_URL users keep local on upgrade.
  • Anthropic Haiku 4.5 (~$0.001/summarization). ONNX optional dep
    (no install bloat). Local LM Studio path preserved.
  • costForLLM() exported. docs/llm-providers.md. 26 tests.

Track E — Adoption: redirect blocks + WHEN-to-use descriptions

  • buildToolRedirectBlock emits full canonical MCP name + prefilled
    args JSON + Why: rationale. Bypass instruction in first 60 chars
    (preserves v1.21 invariant).
  • All tool descriptions rewritten to WHEN-to-use template. Edit family
    embeds decision-tree cross-references.
  • 17 new tests.

Track F — Adoption: onboarding + permissions

  • First-run auto-permission consent flow (writes
    mcp__plugin_ashlr_* to ~/.claude/settings.json after consent).
    ASHLR_PERMISSIONS_CONSENT=skip opt-out.
  • Banner state machine: first run → /ashlr-start CTA; in-progress →
    "finish setup"; done → silent.
  • New tools surfaced in wizard + /ashlr-help. 35 new tests.

Track G — Visibility: telemetry events + dashboard

  • New event kinds: tool_called_after_block, genome_route_taken,
    embed_cache_hit/miss, plus tool_low_confidence_shipped (A) and
    llm_summarize_provider_used (D).
  • PostToolUse correlate hook + ~/.ashlr/recent-blocks.jsonl.
  • Dashboard: "Where savings come from" (per-mechanism breakdown) +
    "Adoption funnel" (blocks emitted vs converted, 7-day rolling).
  • /ashlr-status extended with LLM/embed/genome/funnel reporting.
  • 58 new tests.

Track H — Bench recalibration

  • docs/benchmarks-v2.json regenerated: −74% overall (read
    −82.1%, grep −92.8%) — replaces v1.21 numbers that predated the
    multi-edit baseline fix.
  • New docs/benchmarks.md methodology doc (per-repo / per-tool-mix /
    per-workload, reproducibility, why telemetry beats bench for
    week-to-week).
  • README: headline −79.5%−74% overall (read −82%, grep −93%).
  • Multi-repo curated reference set deferred to v1.23.

Integration & wiring closures

  • 3 cross-track merge conflicts resolved (_router-handlers.ts,
    pretooluse-notebookedit.ts, three hooks where E's
    buildToolRedirectBlock met G's recordBlock).
  • _events.ts deduplicated; per-track sectioning.
  • session-greet.ts::BLENDED_USD_PER_MTOK (last drifted local pricing
    constant) replaced with costFor() from _pricing.ts.
  • plugin.json description: tool count + hybrid LLM + funnel telemetry.