Releases: ashlrai/ashlr-plugin
v1.33 — Audit-driven polish + multi-host portability
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 accounting —
orchestration_usagetable + 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 practiceaudit-first-touch-ux.md— 5 minutes not habit-forming; value emerges Day 3-5competitive-landscape.md— positioning + RooCode shutdown opportunitygroundbreaking-bets.md— 5 post-northstar bets; Code Sandbox is the most ambitious
Internal
v1.32 — Northstar Q1-Q4 shipped (33-agent, 17-PR build cycle)
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
- Set 4 secrets per issue #85 to activate the WAD-D pipeline.
- Trigger the cron once with `dry_run=true` to validate end-to-end.
- Visit `/admin/wad-d` after Vercel redeploys.
- 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
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)
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
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 incommands/_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 runbookserver/docs/cloud-smoke-tests.md— 5-path manual checklistscripts/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-rewrapto help - New
Session+Delegationcategories - Site docs
Legacy (deprecated)section restructure
Genome quick wins
genome-auto-propose.tspre-filter: rejects raw stdout dumps,node_modules/dist/buildpaths, last-5 dedup hitsservers/_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-searchintoefficiency-server.tsashlrGrep - #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
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.tsbut 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-compacthad nothing to read, and the
multi_turn_stale_estimatetelemetry produced no data. Adds a
PostToolUse entry matchingRead|Grep|ashlr__read|ashlr__grep. - Server
/v1/eventsnow acceptsmulti_turn_stale_estimate.
v1.25.0's server-sideKIND_VALUESallowlist 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 fromhooks/hooks.jsonunder
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 persistsmulti_turn_stale_estimatewith the documented
payload shape (sessionTurnCount,staleBytes,staleResults).
Test hardening (Windows-only)
__tests__/sql-server.test.ts— wrapsrmin 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 hitbun: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
"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/summarizetyped error codes. 429s now carrycode: "rate_limit" | "daily_cap". New 402 (Payment Required) for cost-cap suspension with
code: "cost_cap". Newmonthly_usage(user_id, month)table with
atomicbumpMonthlyCostupsert;LLM_COST_CAP_USDenv 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 onstats_uploads, backfills existing rows to
'legacy'(so pre-migration installs count as 1 collective machine).
aggregateUploads()returnsmachine_count = COUNT(DISTINCT machine_id).
Status-line☁ N machinesbadge now shows real values.- Team-genome v2 X25519 envelope pull.
scripts/genome-cloud-pull.ts
branches on.cloud-idpresence — team flow usesGET /genome/:id/key-envelope→unwrapDek()→parseBlob+decryptSection
from_genome-crypto.ts(the personal flow's legacycreateDecipheriv
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
inlineTODO(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 viaadditionalContext. 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
"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/eventsroute on the existingashlr-apiFly app
(server/src/routes/telemetry.ts). Server-sidelooksLikePath()
defense-in-depth re-runs the v1.23 client guard. SessionId
SHA-256-folded before storage. 10 req/min/session rate limit. telemetry_eventsSQLite 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.mdcovers DNS
(telemetry.ashlr.aiCNAME →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.tswith
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 viaGET /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 viaBun.servestub./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 machinesbadge. 29 tests.
Sprint 3 wave-1 — v1.24 Foundation
- Track B: Router consolidation.
servers/_router.tsfinished —
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.tsdocs/router-migration.mdfor 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-lineapplyRangeEditsLocalhelper in
cross-file-rename.ts to avoid a circular dep. - Track E: Eager corpus warm-start. Three-tier embedding cache mode
(cold0-9 docs /warm10-49 /hot50+) with smooth threshold
gradientmax(0.68, 0.80 - (n - 10) * 0.003)in
servers/_embed-calibration.ts. Background indexing fires via
setImmediateafter grep returns — small projects get RAG benefits
without manual/ashlr-genome-init. Newtiertelemetry tag for
v1.25 to validate the curve. 29 new tests + 60 existing pass.
Backend TODOs surfaced (server-side, not blocking this release)
/llm/summarizeshould return machine-readablecodefield on 429s
("rate_limit"vs"daily_cap"vs"cost_cap") and402vs429
for cost-cap suspension./stats/aggregateshould includemachine_countfield.- 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
"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.tsis no longer a stub. Full seq2seq
inference: BPE tokenizer (loaded fromtokenizer.json), encoder
session, decoder greedy loop with KV-cache viadecoder_model_merged.- Model is ~300MB (not the 25MB the v1.22 plan estimated), so still
not bundled inbun install. Users opt in:bun add onnxruntime-node && bun run install-onnx-model. /ashlr-doctorreports 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.refrevSHA + LICENSE notice. scripts/benchmark-refs.tsruns across all 3, aggregates into
docs/benchmarks-v2.jsonwithbyRepo/byLanguage/
crossLanguageMeansections.- README headline now
−57% overall(read −74.7%) — replaces
the plugin-self number that was suppressed byhero.mp4etc. - New
.github/workflows/bench.ymlruns on push/release; uploads
JSON artifact, never fails CI.
Track CC — Race-fix + embed tuner
recordBlock()now usesappendFileSync(POSIX-atomic for
small writes); truncation moved toreadRecentBlockslazy rewrite
at >1.5× cap. Eliminates the read-modify-write race the v1.22
reviewer flagged.- New
scripts/embed-tune.tsreads~/.ashlr/embed-calibration.jsonl,
sweeps thresholds, recommends optimal F-beta.--applypersists 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-regexglob × 2 — addedmatchesGlobs()JS-side
post-filter viaminimatch(rg--globkept as perf pre-filter)ashlr-sql× 4 (file-based, in-memory, schema, EXPLAIN) — bumped
test deadlines to 20s for Bun cold-start on Windows runnersonboarding-wizard× 3 —which→whereon Windows + 5s
spawn timeouts onwhich/gh auth statusprobes
- 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(defaulthttps://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=onor
~/.ashlr/config.json::telemetry:"opt-in"./ashlr-statusshows
current mode + opt-out instructions. docs/telemetry.mddocuments contract + privacy promises.
Track FF — Hero/delight moments
- Streaks:
~/.ashlr/streaks.jsontracks 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, printsLast week: 6.0M tokens saved · ~$37.00. That's like 7 sandwiches, or 3 Spotify months.Comparison bank
scales to dollar amount; opt-out viaASHLR_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.tsfires
additionalContextwhen 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 withset-hook-mode.ts redirectinstruction. - Throttle: 1 nudge per minute max.
/ashlr-savingsopportunity hints — top 1-2 actionable
suggestions (genome-init, LLM provider, hook-mode upgrade).- New
scripts/set-hook-mode.tsflips~/.ashlr/config.jsonatomically. - 33 new tests.
Track HH — Genome continuous refresh
- New PostToolUse hook
posttooluse-genome-refresh.tsappends
edited file paths to~/.ashlr/pending-genome-refresh.txt
(deduped, sub-ms hot path). scripts/genome-refresh-worker.tsruns at SessionEnd: reads
pending list, debounces (mtime ≥ 2s), invalidates affected sections.
--fullflag for explicit rebuild.- Stale-detection: when
ashlr__grepfalls 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.tssurface
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.mdFree/Pro/Team matrix with honest scope:
Pro is~/.ashlr/pro-tokenfile 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.mdextended. /ashlr-savingsPro 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.tsGG vs JJ). readRecentBlocksalways 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 inserver/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
"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__editmicro-edit penalty fixed (was −150% at p90). New
ASHLR_EDIT_MIN_CHARS(default 80) — sub-threshold edits pass through
to native, emittingtool_skip_micro_edit.ashlr__multi_editbaseline 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_noopmislabeling fixed across 9 servers — content-shipped
paths use newtool_low_confidence_shippedevent 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 toashlr__edit,
new-file emits compact ack — content never echoed). - 21 new tests + 2 notebook fixtures.
Track D — LLM hybrid (Anthropic + ONNX + local)
_summarize.tsrefactored intoservers/_llm-providers/facade.- Default
auto: anthropic → onnx → local → snipCompact. Existing
ASHLR_LLM_URLusers 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
buildToolRedirectBlockemits full canonical MCP name + prefilled
argsJSON +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.jsonafter consent).
ASHLR_PERMISSIONS_CONSENT=skipopt-out. - Banner state machine: first run →
/ashlr-startCTA; 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, plustool_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-statusextended with LLM/embed/genome/funnel reporting.- 58 new tests.
Track H — Bench recalibration
docs/benchmarks-v2.jsonregenerated: −74% overall (read
−82.1%, grep −92.8%) — replaces v1.21 numbers that predated the
multi-edit baseline fix.- New
docs/benchmarks.mdmethodology 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
buildToolRedirectBlockmet G'srecordBlock). _events.tsdeduplicated; per-track sectioning.session-greet.ts::BLENDED_USD_PER_MTOK(last drifted local pricing
constant) replaced withcostFor()from_pricing.ts.plugin.jsondescription: tool count + hybrid LLM + funnel telemetry.