v0.2.81 — 2026-04-24
tools — failure-mode + when-to-use hints on three tool descriptions
Third pass on AT (prompt + tool descriptions audit vs Hermes). Three targeted additions; most other tools already had "Use when / Not for / failure modes" from the earlier ff6bb21 pass and need no change.
browser.py— added a line on what to do whenclick/typecan't find an element: re-check the latest snapshot for the real role + accessible name, don't guess selectors blindly. Stops the common loop where the model keeps retrying the same wrong label.search.py— added a regex gotcha note. The pattern is a regex in content mode; literal{ } ( ) | . * +must be escaped. If a content search returns nothing when hits are expected, metachars are usually the cause.stt.py— added a "Use when" preamble so gateway voice-note messages reliably trigger transcription before the reply.
Skipped the Hermes audit's recommendations that didn't match reality post-ff6bb21: delegate, send_message, and research already carry explicit "Use when" + "Not for" sections, and the memory "facts vs directives" rule lives in the memory tool description with an explicit pointer from system_prompt.md. Duplicating would be token tax without signal. Model-specific execution guidance (BD) stays parked until there's an A/B measurement on agent.log.
v0.2.80 — 2026-04-24
site — header/nav unified, docs index redesigned, SEO at 100%
Second pass on the static site under site/.
- Single shared nav component (
renderNav()inbuild.mjs) used by landing,/docs/, and/docs/*. Same HTML, same CSS, same shell width (1240px +clamp(24px, 5vw, 64px)horizontal padding), varying only in the breadcrumb tail: landing has no tail,/docs/showsDOCS, doc pages showDOCS / {slug}. Fixed a nasty nested<a>bug (crumbs inside the brand link) that was breaking the flex layout on/docs/*. - Combined
alpi-logo.svg(alpaca + wordmark, 94×42) in the header;alpi-alpaca.svgas the favicon + mask-icon. Assets reduced to three: logo, alpaca, brand social card (alpi-brand.png, 1200×800). - Burger menu on mobile (< 760px) with slide-down drawer — JS under 20 lines, inline in the landing, zero dependencies.
/docs/rebuilt with the same.docs > .doccard grid as the landing docs section, sourced from the singleDOCSarray; title is nowDOCSat H1 scale (72px / 600 / -.035em) to match the individual doc pages.- SEO pass across every page: unique
<title>and<meta name="description">, canonical URL,robots,theme-color, Open Graph (type/site_name/title/description/url/ locale + image w/h/alt), Twitter Cardsummary_large_imagewith@soyjavias creator/site, JSON-LD structured data (WebSite + SoftwareApplication + Organization on landing, CollectionPage on/docs/, TechArticle on doc pages).sitemap.xml(16 URLs withlastmod+ priority tiers) androbots.txtare emitted on every build. Deploy URL is configurable viaSITE_URLenv var, default placeholderhttps://alpi.satoshi-ltd.com. - Alignment fixes along the way: breadcrumbs baseline-match the
"alpi" wordmark inside the logo (
margin-top:4pxon.bp-tail),.shellno longer shadowed by.rowshorthand padding,.docarticle no longer zeroes horizontal padding.
v0.2.79 — 2026-04-24
site — static marketing + docs scaffold under site/
Landed the first cut of alpi.site as a zero-dependency static site: vanilla HTML/CSS/JS plus a single Node build script (site/scripts/build.mjs) that reads README.md, QUICKSTART.md, CHANGELOG.md, LICENSE, and docs/*.md at HEAD and bakes site/dist/ — landing page at /, doc index at /docs/, and one pre-rendered HTML per doc. Versions and copy are derived from pyproject.toml so a rebuild keeps the site in sync with the shipped release; no runtime fetch from GitHub, no CORS, no API rate limits. Ships with a tiny zero-dep Markdown renderer (site/scripts/markdown.mjs) covering the subset used in the repo (headings, fenced code, lists, tables, blockquotes, inline code, bold/italic, links). Based on a mockup generated by claude design; the mockup folder was removed after migration. Cloudflare Pages wiring: build command node site/scripts/build.mjs, output site/dist.
v0.2.78 — 2026-04-24
skills — auto-validate on every mutation
Every mutating action on a user skill (create, edit, patch, add_file, remove_file) now runs the script validator (_skill_validate.validate_skill — py_compile, missing imports, OAuth race pattern, port coherence) and surfaces findings in the tool output. The LLM sees issues immediately and can iterate in the same turn without having to call skill(action="validate") separately. 6 new regression tests in tests/test_skill_auto_validate.py.
alpi/prompts/create_skill_guide.md extended with a Scripts section (prefer stdlib, include a dry-run / smoke-test path, explicit exit codes) and a note about the automatic validation — so the LLM authors scripts knowing it will get feedback.
skills — AO position clarified, no bundled skill shipped yet
Reverted the @alpi/plan experiment. It restyled output without adding real capability and imposed a path convention users may not want. The honest conclusion: don't ship bundled skills from a hermes-style catalog just because BE's infrastructure is ready. docs/ROADMAP.md → AO and docs/SKILLS.md updated to reflect the new position: the @alpi/* namespace is reserved and live, but nothing ships by default. Bundled skills land when concrete recurring patterns justify one — not from a catalog import.
v0.2.77 — 2026-04-24
skills — bundled infrastructure (BE closed)
Adds a read-only namespace for skills that ship with the alpi package. No content bundled yet — this is infrastructure only.
@alpi/namespace. Bundled skills are addressed as@alpi/<name>. The@sigil is not a legal category name on disk, so bundled and user skills cannot collide by construction.- Loader.
_bundled_root()resolves againstimportlib.resources.files("alpi.skills");_bundled_skill(name)returns the package resource for a@alpi/*name, orNone._find_skilltries bundled first, then falls through to{home}/skills/. - Discovery.
skills_index_block()(injected into the system prompt every turn) now lists user skills first, then a separate@alpi/ [bundled]:block with the marker visible.skill listmirrors the same ordering. - Write guards.
create/edit/patch/add_file/remove_file/deleteon a@alpi/*name is rejected with a message pointing at the variant pattern (create your own under a non-@category). - Defense in depth.
all_skillsskips any category under{home}/skills/whose name starts with@, so a rogue direct write cannot shadow a bundled skill.
pyproject.toml package-data extended to ship skills/**/*; the alpi/skills/ package directory is empty except for __init__.py. When we land the first real bundled skill, no loader changes are needed — drop the SKILL.md in place and it shows up.
14 new regression tests in tests/test_bundled_skills.py; 692 green.
Docs: docs/SKILLS.md gains a "Bundled vs user skills" section with the namespace, variant pattern, and discovery ordering. docs/ARCHITECTURE.md package tree + runtime note updated.
v0.2.76 — 2026-04-24
tui — markdown link styling + memory panel rewrite (BB closed)
BB — shared link renderer. Textual 8.2.3 exposes only @click meta on markdown link spans, no visual style — so links rendered as plain prose in the chat. New alpi/tui/_links.py monkey-patches MarkdownBlock._token_to_content at import time: every span carrying @click meta gets bold + underline appended. Idempotent install, applied globally — works across AssistantMessage streaming output AND every floating panel that uses Markdown (same patch, one pipeline).
Per-link hover styling is not addressed — Textual renders link spans as Rich Text inside a single widget, not as per-link widgets. A hover state would require widget-per-link rewriting of the Markdown internals, out of scope. Deferred.
tui — /memory panel rewrite
Old /memory wrapped each file's content in a markdown code block so everything rendered with the .code_inline accent color. Inconsistent and the code-block hid real markdown structure.
New layout: three stacked sections, each with a Static accent-colored header + Markdown widgets for the content. USER.md and MEMORY.md are split on § and rendered as N separate Markdown widgets so entries appear visually separated (the § character no longer leaks into the render). AGENT.md renders as one unit since it's already markdown.
New .memory-section CSS class; all FloatingPanel Markdown widgets share transparent background + tight margins so panels stay compact.
prompts / template
alpi/prompts/default_agent.md — # Identity / # Voice / # Defaults headers downgraded to ##. Textual renders h1 centered (it reads as "document title" styling); h2 is left-aligned which is the right look for in-document sections. Applied to the template that seeds fresh profiles.
memory tool / description
§ entry delimiter guidance tightened (English only, terse). New fuzzy_find_unique_entry error now appends a "note: § is the entry delimiter, not content — strip it from your match string" hint when the match string contains §. Catches the common LLM mis-construction observed on long-running profiles with many entries.
tui — streaming input lag
Fixed: typing in the TUI lagged while the assistant streamed output. Cause: AssistantMessage.append(delta) spawned one asyncio.create_task per delta (~60/s from the LLM), each re-parsing markdown — saturating the event loop so key events queued behind paint work. Fix: deltas now accumulate in a buffer and a single timer flushes them at 12.5 Hz (_FLUSH_INTERVAL = 0.08). One coalesced write per tick instead of dozens. Input stays responsive mid-stream.
docs
docs/ROADMAP.md — BF (drop § delimiter) removed. Pre-existing profiles handle it fine with the new description guidance; refactoring the on-disk format isn't worth the migration surface right now.
v0.2.75 — 2026-04-24
wizard / cli — profile lifecycle + polish
- New setup entry
alpi -p <name> setup → Delete profile(non-default profiles only). One-shot teardown: summary → warn about installed services → typed-name confirmation → uninstall gateway / schedule / alp services →rmtreethe profile home → exit. Collapses what used to be "uninstall each service manually, then runalpi profile remove X" into a single guided action. alpi profile remove <name>CLI now redirects to the wizard when services are installed, instead of listing per-service uninstall hints. CLI remains for the happy path (empty profiles, scripting).- "Did you mean…?" suggestions in CLI when the target id doesn't
exist:
alpi profile remove(closest profile name),alpi peers remove/alpi peers ping(closest peer id),alpi schedule fire(closest job id). Shared_suggest()helper usingdifflib. - Fixed the misleading "→ Gateway service" hint in
profile removeerror — it now names the actually-installed service(s) and points at the wizard. - Dropped
.githooks/(pre-push CHANGELOG regen). We've been runningalpi release notesmanually at release time; the hook was opt-in and unused.
docs
docs/PROFILES.md— documents the wizard-redirect flow.docs/ARCHITECTURE.md— setup menu outline lists "delete profile".
v0.2.74 — 2026-04-24
schedule — ad-hoc job fire (BA closed)
Closes the tightest feedback loop in the schedule lifecycle: add a cron, verify it works, without waiting for the cron window.
alpi/scheduler/run.py::fire_by_id(home, job_id)— loadsjobs.json, looks up the id, runs the job through the same path the daemon tick uses (run_job— threat scan +alpi chat --oncesubprocess + delivery). Updateslast_run_at; does not consumeoncejobs (ad-hoc fire is deliberate testing, not the natural trigger).- CLI:
alpi schedule fire <job_id>. Exit code 1 on failure. - Tool:
schedule(action="fire", id=...)so the LLM can self-test a job right after adding it. - Description updated to list the new action + caveat about once-jobs not being consumed.
5 new regression tests in tests/test_schedule.py; 675 green.
v0.2.73 — 2026-04-24
skills / memory / docs — stop shipping what we don't use
- Deleted the
alpi/skills/package directory. The only blueprint there (meta/consolidate-memory/SKILL.md) never reached profiles — theskilltool only searches{home}/skills/and nothing seeds the bundle. Keeping dead literature shipped with the binary violated the "ship what you use" posture. Runtime skills system is untouched —~/.alpi/skills/<category>/<name>/still works, theskilltool still creates / edits / runs user skills, and the/skillsTUI panel still lists them. pyproject.tomlpackage-data no longer includesskills/**/*.md.alpi/tools/memory.py— the ≥80% hint now says "consider consolidating old entries before adding more" (generic, actionable) instead of pointing at a skill that doesn't exist.alpi/prompts/system_prompt.md— same substitution: at ≥80%, preferreplace/removeoveradd.alpi/prompts/create_skill_guide.md— drops the "search the bundledalpi/skills/" step, since there's nothing to search.docs/ARCHITECTURE.md— package tree no longer listsskills/underalpi/. Added a bridge paragraph pointing at the Profile home layout where runtime skills / sessions / memories / logs / ALP state actually live. Skills core-systems section unchanged.docs/ROADMAP.md— BE reframed as "bundled skills infrastructure (loader; no content yet)" rather than a loader pinned to a specific blueprint. AO no longer claims consolidate-memory is bundled.- Two regression tests in
tests/test_memory_tool_v2.pynow assert the new generic "consolidating" wording.
v0.2.72 — 2026-04-24
memory — v2 rules (AI partial)
Renames PERSONALITY.md → AGENT.md across the codebase, prompts, tests, and docs. The user/agent pair (USER.md vs AGENT.md) is now symmetric and readable. The memory tool enum, template file (alpi/prompts/default_agent.md), home helper, and tool descriptions that list memory files are all updated. File migration on existing profiles is manual — no auto-migration per project policy.
- A — AGENT.md now uses paragraph-level fold + Jaccard dedup
(
is_duplicate_stanzainalpi/memory.py) instead of raw substring match. Paraphrased voice blocks no longer accumulate. Error text nudges towardreplacewhen the user is refining an existing rule. - B —
alpi/prompts/default_agent.md"Edit me" footer rewritten to teach the correctreplacevsaddpattern (append new sections; replace existing lines; never replace unrelated rules to "make room"). - C — cross-file duplicate check:
addto USER.md (or MEMORY.md) rejects when the content is already in the other file, pointing the caller at the correct target. Prevents the common failure where a fact (e.g. vehicle list) lands in both files. - E — operational-state warning:
addreturns a ⚠ line in the tool output when the entry matches a session/chat/interaction log pattern (chat_id,session_id,first interaction, 5+-digit id combined with a date). Non-blocking — the LLM sees the hint; it decides whether to honour the user's explicit target. - F — memory char limits bumped:
USER.md1375 → 3000,MEMORY.md2200 → 5000. When either target reaches ≥ 80% usage, the tool response carries a— run the consolidate-memory skillhint so the model can escalate to consolidation before adding more.
D deferred — the "≤1-token entry dedup" idea (lower Jaccard guard from 2 → 1) produced false positives on entries that shared one generic content token (Dato A vs Dato B both reduced to {dato}). Kept the guard at 2.
G deferred — periodic self-consolidation trigger stays out: explicit over-engineering per the "no fails, no over-engineering" directive. The user or the model can run the consolidate-memory skill on demand.
11 new regression tests in tests/test_memory_tool_v2.py.
v0.2.71 — 2026-04-24
engine / prompts (AT partial — 4 of 5 candidate edits applied)
- new per-surface platform hint in the system prompt:
_platform_hint()inalpi/engine.pyreadsALPI_PLATFORMenv and injects a matching block (cron,telegram,email,gmail). Gateway (alpi/gateway/run.py) sets it tomsg.platformon every spawn; scheduler (alpi/scheduler/run.py) sets it tocron. TUI gets no hint (baseline). Concrete wins: cron jobs stop asking phantom users for clarification; Telegram replies arrive Markdown-aware; email replies arrive plain-text-only. 6 regression tests. memorytool description now enforces declarative phrasing with ✓/✗ examples ("User prefers concise replies" ✓ — "Always reply concisely" ✗). Imperative memory entries were being re-read as directives across sessions.skilltool description leads with "use when" purpose instead of directory layout.emailtool description leads with "Read, search, send, or move email. Use when…" instead of "Manage the mailbox".alpi/prompts/system_prompt.md— dropped the "Past conversations" section;session_searchtool description already carries the same rule. Net: ~10 fewer tokens injected on every turn.
roadmap
- new BD item added for v0.3: model-aware tool-use-enforcement guidance (Claude/MiMo brevity, GPT/Codex/Gemini full block) — requires an A/B measurement on
agent.logbefore applying.
docs
docs/ARCHITECTURE.md— system-prompt assembly section now documents theALPI_PLATFORMcontract between callers (gateway, scheduler) and the engine.
v0.2.70 — 2026-04-23
license
- repo re-licensed under Business Source Licence 1.1 (
LICENSE). Licensor: Satoshi Ltd. Change Date 2030-04-23 → Apache 2.0. Additional Use Grant lets individuals run alpi freely on machines they control for personal / research / non-commercial purposes; commercial production deployment by a legal entity requires a licence frominfo@satoshi-ltd.com.pyproject.tomllicense field updated toBUSL-1.1; README License section rewritten to explain the split.
docs
- repo rooted in Satoshi Ltd.'s six operating principles (Privacy by Design, User Sovereignty, Security First, Open Source, Zero Knowledge, Digital Sovereignty) across
README.md,docs/ARCHITECTURE.md,docs/SECURITY.md,docs/ALP.md. Each doc now explicitly maps its content to the principle it expresses. - new
QUICKSTART.mdat repo root — first-day walkthrough: install → model → workspace → first chat → resume → gateway → second profile → ALP → doctor. - new
docs/PROFILES.md— canonical reference for alpi's core isolation primitive (home resolution, what's isolated per profile, identity in ALP, creation patterns, cost). - new
docs/DEPLOYMENTS.md— six topologies from laptop-only to enterprise "army of alpis", each with ASCII diagram, trade-offs, and BSL licence boundary. - new
docs/OPERATIONS.md— runbook: the five logs, service lifecycle, upgrades, backup + restore, ALP identity rotation, monitoring, disaster recovery, common failure modes. docs/ROADMAP.mdsanitised — 64 shipped-item rows + the "Done — v0.1 + shipped v0.2 items" commit table dropped (they duplicated CHANGELOG which already reconstructs them fromgit log). New top table lists only open items with target version + status.
v0.2.69 — 2026-04-23
models
docs/MODELS.mdrebuilt around a neutral 3-tier recommendation sourced from a standalone deep-research pass (Tier 1 quality, Tier 2 cost/service, Tier 3 Ollama) with production-setup suggestions. Personal-usage section and deliberately-left-out list dropped to keep the doc unbiased.- fresh profile scaffold (
config.seed_defaults) no longer pins a default model —config.yamlships withmodel: ""so the setup wizard is the canonical picker. docs/CONFIG.mdupdated to reflect the empty default.
v0.2.68 — 2026-04-23
alp (Alpi Link Protocol — ALP.1 closed)
- new
alpi/alp/package: Ed25519 identity, signed JSON-RPC envelope with replay cache, fail-closed peer list, Unix-socket server + client.link.ping,link.ask(reject-fast reentrancy),link.cancel(idempotent interrupt). peertool for LLM-driven cross-profile calls. TUI@peer rest…gesture with strict leading-@rule and/peerspanel. Telegram / email / webhook gateway inbound interception hits the same code path without firing the local LLM.alpi alp start|stop|restart+ service install viaalpi setup → ALP service(launchd / systemd). Doctor granular sub-checks: Identity (key loadable), Socket (listening), Peers (reachable).alpi setup → Peerswizard: identity page with clipboard copy, probe-based ●/○/? status list, add/remove/inspect flows.alpi peers key|list|add|remove|pingCLI group for scripting.- docs:
docs/ALP.mdspec v1 (envelope, verbs, errors, security),docs/ROADMAP.mdALP.1 shipped / ALP.2 + ALP.3 both v0.4,docs/ARCHITECTURE.mdlayout + commands.
setup
- health-check row no longer blocks menu render on 5–10s of live network probes — status reads "open to run checks", actual checks run on-demand when the user opens the page.
v0.2.54 — 2026-04-23
gateway
- per-chat session threading (AN closed) + AU backlog entry (
e0f093d)
v0.2.53 — 2026-04-23
config
- drop .env.example scaffold (AP closed) (
e707983)
v0.2.52 — 2026-04-23
skill
- tighten
tools:field description + document scheduler TZ (27765b0)
v0.2.51 — 2026-04-23
tui
- unified list row shape for selectable panels + /help palette (AH closed) (
f0f9052)
v0.2.50 — 2026-04-23
config
- tui.auto_resume flag for bare alpi (AL closed) (
8404526)
v0.2.49 — 2026-04-23
roadmap
- expand v0.3 backlog (AH–AT) + pre-push CHANGELOG hook (
543834d)
v0.2.47 — 2026-04-23
setup
- first-time help text in gateway/MCP wizards (AG closed) (
88e4086)
v0.2.46 — 2026-04-23
cli
- shrink surface, unify logs, add live doctor (AD/AE/AF) (
b110569)
v0.2.41 — 2026-04-23
setup
- normalise wizard UX across the board (
b46929f)
v0.2.40 — 2026-04-23
gateway
- service install/uninstall wizard (AB closed) (
f372ec0)
v0.2.39 — 2026-04-22
cleanup
alpi setup → Cleanupwizard (AA closed) (5825e87)
v0.2.38 — 2026-04-22
approval
- panel styled like /model, YOLO removed (
6be95ca)
v0.2.37 — 2026-04-22
approval
- three-severity command gate for terminal (W closed) (
2064d10)
v0.2.36 — 2026-04-22
browser
- humanised typing, dismiss camoufox (
a54425f)
v0.2.35 — 2026-04-22
tidy
- move PERSONALITY.md under memories/, gmail_token under secrets/ (
2914fe0)
v0.2.34 — 2026-04-22
gateway
- persist telegram offset, log backlog catch-up (
418d2fb)
v0.2.33 — 2026-04-22
misc
- profile list: accent diamond + model + size + abbreviated path (
4a832b6)
v0.2.32 — 2026-04-22
setup
- reorder Model wizard — Ollama first, cloud second (
1e4b119)
v0.2.31 — 2026-04-22
tui
- profile disk size in top bar + document TUI features (
416f203)
v0.2.30 — 2026-04-22
sandbox
- allow_network=off now blocks Python-native network tools (
83f9d00)
v0.2.29 — 2026-04-22
tos
- remove C (Codex OAuth) and V (Anthropic OAuth) from backlog (
5e77f17)
v0.2.28 — 2026-04-22
misc
- tts + send_message: autoplay off on gateway, terse outputs (
5e80755)
v0.2.27 — 2026-04-22
brand
- nickname → alpi across ~130 files (
00722a9)
v0.2.26 — 2026-04-22
misc
- mcp + providers: OpenAI-compat tool names, curated lists, ctx window (
6ddf316)
v0.2.25 — 2026-04-22
voice
- tts + stt + telegram voice inbound/outbound (M closed) (
1af86d6)
v0.2.23 — 2026-04-22
gmail
- OAuth2 gateway + mail tool dispatch (T closed) (
d8b644e)
v0.2.22 — 2026-04-22
refactor
- email → mail/imap rename for upcoming Gmail backend (T commit 1/3) (
d9cd7de)
v0.2.21 — 2026-04-22
read_image
- auto-resize oversized images before vision (S closed) (
2823b4b)
v0.2.20 — 2026-04-22
misc
- security pack: tool budget + OSV malware + schedule threat-scan (
8d79faf)
v0.2.19 — 2026-04-22
roadmap
- extend backlog with TTS/STT, Gmail/Signal, approval, OSV (
2e504f3)
v0.2.18 — 2026-04-22
research/delegate
- batch parallel tasks (R.3 closed) (
5eec824)
v0.2.17 — 2026-04-22
skill
- add validate action for correctness checks (Q closed) (
88e2721)
v0.2.16 — 2026-04-22
browser
- Playwright tool with stealth-by-default and optional vision (
9710574)
v0.2.15 — 2026-04-21
ollama
- first-class provider + kill the generic custom slot (
9a3b4e1)
todo
- add in_progress status to match the prompt promise (
664e184)
v0.2.14 — 2026-04-21
tui
- /tools skips MCP-registered tools (
836f28a)
v0.2.13 — 2026-04-21
misc
- remove the config tool — config is user-owned (
ba7ce49)
v0.2.12 — 2026-04-21
rename
- alf → alpi across the entire codebase (
85384c3)
v0.2.11 — 2026-04-21
misc
- sandbox polish: promote from "experimental" to per-profile opt-in (
679fca8)
v0.2.10 — 2026-04-21
ui
- drop questionary, build menu()+text() directly on prompt_toolkit (
1063bf2)
v0.2.9 — 2026-04-21
tui
- AlfTopBar drops labels in narrow mode (
a5fd740)
v0.2.8 — 2026-04-21
tui
- AlfHeader adapts to available width (
c065e14)
v0.2.7 — 2026-04-21
tui
- panel header elevation flips in light mode (
6c02eeb)
v0.2.6 — 2026-04-21
tui
- /mcps panel listing running MCP servers (
b13ed62)
v0.2.5 — 2026-04-21
tui+setup
- /model as panel, user-driven openrouter, live anthropic/openai fetch (
f64bebf)
v0.2.4 — 2026-04-21
read_image
- vision tool with URL, SVG, and model-override (D) (
b71ce2f)
v0.2.3 — 2026-04-21
delegate
- write-capable sub-agent with file/terminal/web toolsets (R.2) (
fdf999a)
v0.2.2 — 2026-04-21
research
- prefix inner emit_state with step counter (R.1) (
1722fab)
v0.2.1 — 2026-04-21
tui
- theme system + floating panels + scaffold polish (
9ed4139)
v0.2.0 — 2026-04-21
docs
- add MODELS.md — tiered model recommendations for agent use (
df29cfc) - record identity-wizard decision as rejected (
60122b7) - split CONTEXT into ARCHITECTURE + ROADMAP, position alf as lighter Hermes, bump to v0.2.0 (
6b946e4)
fix
- propagate active profile to tool context + sharpen memory prompt (
1470bdb)
gateway
- stream tool traces + typing indicator; simplify allowlist (
fe3a3d4)
gateway/schedule
- fail fast if the profile has no usable workspace (
04bdaba)
schedule
- fix immediate-fire, UTC vs local tz, duplicate delivery (
3dd4522) - kind=once and LLM time grounding (
1fc3610)
skills
- unified tool, subdir contract, live-by-default, path guards (
2e67830) - auto-inject index into system prompt + render skill name in tool cards (
4035327)
tooling
- level-2 comment cleanup across alf/ (
a07e40a)
tools
- rename delegate → research, depth tiers driven by config (
d2ceb74)
tui
- surface inter-tool prose + reasoning tokens in live indicator (
62f7fa7) - reasoning persists across sessions, show_reasoning toggle, tighter layout (
fd1fec4)
web_search
- dedup by domain + lean description (
b04b394)
misc
- remove stray test artifacts and fix layout in README (
56d1711) - send_message tool + delivery refactor (
6e31ace) - schedule daemon: tool + CLI + rename from cron (
2245e42) - install/uninstall for gateway + schedule (launchd + systemd) (
cd62da0) - profile CLI + drop all migration/legacy code (
630f97c) - email subsystem + alf setup UX polish (
c67e618) - email gateway channel + per-platform config namespace (
4691df8) - mcp client — user-configured MCP servers as alf tools (
0d376ac) - setup UX: shared ui primitives, profile-scoped status, CLI polish (
7a81770) - memory tool: compress description to Hermes-style, keep all invariants (
b214ce6) - tool descriptions: compress terminal/email/schedule/send_message/session_search (
19f1287) - config polish: minimal seed, config tool, /new session, accent spinners (
2dadc09) - tool descriptions: restore CALL directives + English-only language rule (
6be1685) - security phase 1: terminal denylist, SSRF block, tool-output injection scan (
a54d99d) - security phase 2: opt-in OS sandbox (sandbox-exec / bubblewrap) (
e78b428) - merge glob + grep into search; fix relative-path resolution (
2b73091) - file tools: drop workspace wall, match terminal's denylist posture (
3e2dc29) - skill tool: patch/view actions, state/ subdir, scanner beef-up (
211c022)
v0.1.0 — 2026-04-19
misc
- initial commit — alf v0.1 (
a0c7630)