Releases: luminik-io/alfred
Release list
v0.6.0
- You can now assemble and set up your team by chatting. Alfred asks setup questions, proposes fixed, allowlisted actions, previews team names, and routes every write through the same approval gates as the form-based setup. You can also build a full roster theme just by describing the team you want.
- Agents have a stable identity that themes sit on top of. Every runner is now addressed by a fixed role such as
architect,senior-dev,reviewer, ortest-engineer, and the Batman cast (Batman, Lucius, Ra's al Ghul, Bane) is the default display theme layered over those roles. Renaming your team never changes how the runtime, scheduler, or GitHub labels work. - Alfred remembers what your repositories have taught it, with nothing extra to run. The default memory store is now a single embedded SQLite file that gives semantic-quality recall using only the Python standard library. There is no Redis, no separate embedder, and no daemon to keep alive for the common case. Redis Agent Memory stays fully supported for operators who already use it.
- The fleet spends fewer tokens on the same work. Verbose tool output is compacted before it reaches the model, large source files are read as a structure-first skeleton with targeted follow-up reads, and only the lessons that matter to the current task are injected, ranked and trimmed to a budget. None of this changes the result of a run.
- Optional "batteries" are now a first-class, opt-in idea. A shared manifest, an
alfred batteriescommand, and a picker in the desktop onboarding let you turn extras such as Redis memory, a stronger compression engine, the code-structure memory server, dense embeddings, and a Postgres scale tier on or off. Alfred runs fully with zero batteries; the built-ins are always on. - The public story is rewritten for a non-technical reader. The README, the landing hero, and the docs now lead with plain-language positioning: a local coding-agent team that plans, builds, reviews, and ships, and remembers what it learns.
Full changelog: CHANGELOG.md
v0.5.3
- Alfred can now keep the most useful lessons on its own. A second model reads each candidate lesson, and when it is confident the lesson is sound and worth keeping, the lesson is saved into recall without waiting for you. Anything it is unsure about still waits in the review queue, and every automatic save can be undone.
- The lessons that change how Alfred works are the ones it now saves for itself. When a lesson would actually change how the agents behave next time, and the reviewer is confident it is safe, Alfred saves it straight away rather than letting it sit unreviewed. Weak or one-off lessons are still held back.
- The memory server is more reliable. Alfred now uses the local memory server purely to store and look up lessons, and no longer lets the small on-device model rewrite or merge them. The lessons you and the fleet trust are kept exactly as written.
- A full disk no longer wedges the fleet. When space runs critically low, the emergency cleanup now also clears regenerable build and download caches across the machine, so the agents can keep working instead of getting stuck.
Full changelog: CHANGELOG.md
v0.5.1
- Alfred's signed desktop app is now easy to find from the public site. The new download page links to stable latest-release asset names for macOS and Linux, and the homepage points users there directly.
- The native client and
alfred servenow agree on port 7010 by default, avoiding macOS Control Center's use of port 7000 while still migrating stale saved 7000 URLs safely. - The public docs and site now match the shipped native-client status: signed and notarized macOS artifacts, Linux AppImage/deb artifacts, and current Inbox / Ask / Work / Agents / Setup navigation.
Full changelog: CHANGELOG.md
v0.5.0
- Alfred now has a signed native desktop app for Mac and Linux. Download it, open it, and you get a real window into your agents (Home, Compose, Plans, Memory, Fleet, Logs, and Setup) instead of a browser tab. (You can still run everything from the command line and Slack.)
- The app shows your live Claude and Codex subscription usage. It reads the usage left in your rolling 5-hour and weekly limit windows straight from each tool's own local state, so there are no surprise pay-per-token API bills and nothing made up: a window it cannot confirm reads "not synced" rather than a fake number.
- Single-repo work now waits for your go-ahead. When Alfred plans a change to one repo, the issue is held with an approval label and nobody picks it up until you approve it, the same human gate that already protected multi-repo work.
- A disk guardian keeps your agents from crash-looping when the disk fills up. If free space drops below a safe floor, Alfred cleans up its own leftover files first, and if space is still tight it skips that run cleanly (no crash) and sends you one quiet heads-up.
- An approved Slack plan can become real work in one step. In a planning thread, a trusted teammate's explicit approval turns the draft into a labeled GitHub issue your agents then pick up. It is off by default, needs both a trusted person and a clear approval word, and only files an issue: it never runs code on its own.
- Your agents remember what they learn, with you in the loop. Lessons from real runs are saved as review-first suggestions you can approve or reject from Slack or the app before they shape future work, plus an optional connection to a Redis memory server if you already run one.
- Smaller setup, fewer snags: one command sets up a long-lived sign-in token so scheduled agents stay logged in, and the website gained search-engine basics and privacy-respecting analytics that stay off until a visitor agrees.
Full changelog: CHANGELOG.md
v0.4.0
Substrate, observability, planning, approval, memory, and connector primitives. The largest single release since 0.1.0; lays down building blocks the next two quarters of roadmap items will compose.
Added
Runner and observability
lib/agent_runner.pydecomposed from a single monolith into a 10-filelib/agent_runner/package: preflight, lock, spend, engines, gh, slack, event-log, commit-trailer, transcripts, dedup. Public import surface preserved. 50 new unit tests undertests/unit/agent_runner/cover the split modules; full suite grew from 689 to 749.alfred metrics(bin/alfred-metrics.py): per-agent rollup of firings, cost, turns, tool-use, and Codex tokens.--since 7d,--codename,--by-day,--json. Reads$ALFRED_STATE_DIRonly.alfred logs(bin/alfred-logs.py): tail and filter per-firing stream-JSON transcripts.--last N,--firing-id ID,--show-tool-calls,--json. Seedocs/CLI.md.lib/transcripts.pyandlib/metrics.py:TranscriptReaderandMetricsAggregatorprotocols + filesystem-backed implementations, used by the two new CLIs and exposed for downstream code.
State machine and multi-repo
lib/labels.py:LabelClientprotocol +GhCliLabelClientimplementation. Atomic transitions across the issue-claim state machine (agent:queuedtoagent:implementtoagent:in-flighttoagent:pr-opentoagent:done), with race resolution and conflict detection.lib/cross_repo_pr.py: cross-repo PR coordinator. Opens stacked PRs across multiple repos with a shared spec id, links them via PR-body cross-references, marks the spec done only when all PRs merge.lib/multi_worktree.py: managed pool of git worktrees under$ALFRED_HOME/wt. Per-firing reservation, completion cleanup, crash recovery.bin/alfred-label-state: operator-facing CLI for the issue-claim state machine.claim,release,dedup-check,status-issue,repo pause/resume/list,sweep-claims. Pre-push hook recipe indocs/STATE_MACHINE.md.
Planning and execution
- Damian spec-bundle planner (
lib/damian_planner.py+bin/damian.py): walks a spec directory, identifies multi-repo features, filesagent:bundle:<slug>siblings across the affected repos. All-or-nothing per bundle. Caps at 3 bundles per firing. Single-repo work is left to drake. - Batman now executes approved plans (
lib/batman.pyfrom 505 to 1383 lines;bin/batman.pyfrom 261 to 472 lines). Once a Damian-style plan is approved (Slack reaction, label transition, orBATMAN_AUTO_EXECUTE=1), Batman drives the fan-out implementation across the listed repos. Previously Batman halted at plan-only. TheBATMAN_AUTO_EXECUTEenv contract:0= always ask,approval-gate= read approval signals,1= always execute. Seedocs/BATMAN.md.
Approvals
lib/slack_approval.py+docs/SLACK_APPROVAL.md: reaction-based approval gate. An agent posts a proposal, the operator reacts with the configured emoji, the agent proceeds.ApprovalGateis atyping.Protocolso the same call site can swap Slack for any other channel. New env vars:ALFRED_OPERATOR_SLACK_USER_ID,ALFRED_APPROVAL_EMOJI(defaults to:white_check_mark:).
Quality gates
lib/slop_detector.py+bin/slop-detector.py+bin/curator.py: PR-time linter for AI-authored prose patterns. 21 default rules covering banned vocabulary (seamless, unlock, leverage, transform), em-dashes, hedged numbers, marketing fluff. Rules are JSON-configurable; seeexamples/slop-rules.jsonanddocs/SLOP_DETECTOR.md.
Memory
lib/fleet_brain/: v1 SQLite-backed memory store. Per-codename and per-reporecall/reflect, atomic writes, ULID ids via the standard library, zero external dependencies. 948 lines of package code, 33 tests. Architecture and the v2 path (PGLite + Apache AGE + pgvector) indocs/FLEET_BRAIN.md. CLIs:bin/alfred-brain.py,bin/fleet-ingest.py.lib/memory/:MemoryProviderProtocol +FleetBrainProvider,ChainedMemoryProvider, andNullMemoryProviderimplementations. Optional read-onlygbrainsubprocess shim for operators with a personal knowledge base. Chain order is env-driven:ALFRED_MEMORY_PROVIDERS=fleet,gbrain; default is fleet-brain only;nulldisables memory. Seedocs/MEMORY_PROVIDERS.md.
Connectors
lib/connectors/:ConnectorProtocol + reference Linear and Sentry implementations. Pull-mode adapters from non-GitHub sources into the engineering fleet'sagent:implementqueue. Linear uses a stdlib GraphQL POST; Sentry uses a stdlib REST GET; both rely on env-only credentials (LINEAR_API_KEY,SENTRY_AUTH_TOKEN). One bad connector cannot break the sync. Seedocs/CONNECTORS.md,bin/connector-sync.py,examples/connectors.yaml.
Dashboards and proof
alfred servev1 (bin/alfred-serve.py+lib/server/): localhost-only, read-only FastAPI dashboard over$ALFRED_HOME/state. Three views: fleet status with HTMX auto-refresh, recent firings, single-firing detail. Reader injected astyping.Protocol. New[serve]optional dependency group forfastapi,uvicorn,jinja2. Seedocs/SERVE.md.bin/alfred-shipped-public.py: self-host emitter that reads$ALFRED_HOME/state, applies a public field allowlist + partner-name redaction table, and writes aweekly.jsonoperators can publish on their own site. Seedocs/SHIPPED_EMITTER.md.
Infrastructure for unattended operation
lib/claude_proxy/andbin/claude-proxy.py: localhost unix-socket daemon that brokersclaude -pinvocations on behalf of launchd-spawned agent processes. Solves the macOS Keychain ACL issue that returns 401 on everyclaudecall from a non-Aqua launchd session. NDJSON wire protocol withinvoke,health, andproberequests; stdlib-only; opt-in viaALFRED_CLAUDE_PROXY_SOCKETwith transparent fallback to direct subprocess. Seedocs/CLAUDE_PROXY.mdanddocs/MACOS_KEYCHAIN.md.examples/launchd/luminik.claude-proxy.plist.example: sample launchd unit withLimitLoadToSessionType=Aquaand inline install / verify recipe. Operators must edit the placeholder paths before bootstrapping. (Brand-neutral filename rename tracked for the v0.4.1 docs PR.)lib/agent_runner.process.claude_invoke_streamingroutes through the proxy when the env var is set, falls back to direct subprocess otherwise.
Fleet diagnostic + cleanup hardening
- Pause-marker honoring under launchd via
$ALFRED_HOME/state/_paused/<codename>(paused agents stay paused across firings, not just at boot). - Fail-streak / pause-marker sync at every self-pause site (lucius, drake, batman, rasalghul, nightwing).
ALFRED_CLEANUP_EXTRA_PATHSenv var: sweep operator-managed worktree pools outside$ALFRED_HOME/worktrees.- Status-cache TTL stops stale reads when
alfred statusis invoked in quick succession. ALFRED_PREFLIGHT_SLACK_MIN_MINUTESthrottles repeated preflight Slack alerts.fleet-doctordistinct alert for concurrent engine-auth failures (separates "claude not logged in" from generic firing errors).
Documentation
- Three new concept pages: state and memory, engine routing, operating the fleet. Mirrored across
docs/(GitHub-rendered) andsite/src/content/docs/(Starlight). Linked into the sidebar under Concepts and Getting Started. - ROADMAP rewritten into a four-tier model: Shipped, In flight, Next, Horizon. Mirrored in
site/src/content/docs/about/roadmap.md.
Changed
- Core dependencies:
slack-sdk>=3.27andboto3>=1.34moved from optional[slack]and[aws]extras into the basedependencieslist. Slack and AWS are integral enough that the optional-extras split was adding install friction for new operators with no payoff. pyproject.tomladds the new[serve]optional-dependency group (FastAPI + uvicorn + Jinja2)..gitignoreadds.claude/andscreenshots/so per-agent worktrees, launch configs, and local verification screenshots stay out of the public repo..gitallowedadded sogit secretspre-commit hooks understand thatbin/scrub-check.shand CI workflows reference secret-pattern regexes by design.
Fixed
lib/labels.py: addedPLAN_PENDING_APPROVALconstant (agent:plan-pending-approval) plus a backward-compatLABEL_AGENT_PLAN_PENDING_APPROVALalias for code that imports the long-form name. Required bylib/slack_approval.pyandlib/batman.py.tests/unit/__init__.pyandtests/unit/agent_runner/__init__.py: promote the agent-runner unit test directory to a package so pytest can disambiguatetests/test_transcripts.pyfromtests/unit/agent_runner/test_transcripts.py.docs/BATMAN.md: replaced operator-specific channel literal with#your-fleet-channelplaceholder per the private-to-public boundary policy.
Verification
- 689 tests pass on Python 3.11.
bash bin/scrub-check.shreturnsscrub-check: clean.cd site && npm run buildbuilds 45 pages with 0 errors and 0 content warnings.
v0.3.0
Added
--dry-run/ALFRED_DRY_RUNmode: run a full agent firing lifecycle (pick, claim, worktree, invoke, act, release, report) with every side-effecting boundary stubbed. No LLM call, no spend, no Slack post, no GitHub or git mutation. Works with zero host config so a developer can watch an agent fire end-to-end before configuring anything. Threaded throughlib/agent_runner.pybehind a singleis_dry_run()seam; supported byexamples/bin/hello.py,examples/bin/echo_summarise.py, andbin/lucius.py. Seedocs/DRY_RUN.md.- Linux support via
systemd --usertimers.install.shnow has a Debian/Ubuntu apt lane alongside the macOS Homebrew lane,deploy.shrenders and installs systemd units on Linux hosts, and a newsystemd/directory holds_template.service,_template.timer, andrender.sh(sameagents.confschema as the launchd renderer). alfred pause/alfred resume/alfred runoperator verbs, backed by a host-scheduler abstraction (lib/scheduler.py) that drives launchd on macOS andsystemd --useron Linux.alfred agentsnow shows a real scheduler-load column (launchd or systemd), distinct from the configured on/off column.bin/doctor.sh --devflag: dev-install mode treats host-config preflight gaps as non-fatal while still failing hard on code defects.install.shpasses--devon Linux.- Publishing guide for GitHub Pages workflow mode, release-site verification, and optional custom-domain setup.
alfred claude probefor a first-class Claude Code auth smoke test.alfred codex status/probeandalfred auth status/probefor first-class
Codex CLI and combined provider-auth diagnostics.alfred-init.py --repos,--slack-webhook, and--skip-label-setupfor AI-driven setup against one repo without guessing through the interactive wizard.- Batman is now visible in the
alfred-initcatalog as an opt-in, plan-only cross-repo coordinator. docs/CODEX_PROVIDER.mdfor Codex engine modes, runtime contract, and billing posture.
Changed
alfred-init.pynow defaults to the recommended starter fleet (Drake, Lucius, Ras al Ghul, agent-cleanup) instead of enabling every discovered agent on Enter or in non-interactive mode.alfred-init.pyseeds prompt templates into~/.alfred/prompts/<codename>.md, creates standard GitHub labels on selected repos, and refuses multi-repo non-interactive setup unless--reposis explicit.- Robin is correctly described and wired as bug triage in the installer catalog.
alfred-statusandbin/doctor.shnow read thesystemd --usertimer roster on Linux, falling back to the same agent-discovery logic the launchd path uses.docs/LINUX.mdrewritten: Linux is now a supported host, not a set of interim workarounds.- Documentation now consistently distinguishes host scheduling, Claude account
routing, and Claude/Codex engine routing. - Refreshed README, roadmap, docs site status, and release checklist for the public docs launch.
- Switched the public docs URL to
https://alfred.luminik.io/and made docs-site links root-relative for the custom domain. - Moved Claude account routing fully into
alfred claude; the standalone helper is no longer shipped. - Standardized the public runtime root on
ALFRED_HOME/~/.alfredacross code, examples, tests, docs, and the docs site.
Fixed
- Batman bundle scans now stay inside the selected repository scope instead of broadening across every configured repo.
alfred auth statusnow returns nonzero when the Codex CLI status path fails, so scheduled-agent preflight catches missing Codex installs.
v0.2.1
Patch release for the first public launch cleanup pass.
Added
- Checked-in CodeQL workflow for GitHub Actions, Python, Ruby, and JavaScript/TypeScript, with PR, push, scheduled, and manual dispatch triggers.
- Optional Hermes integration guide in
docs/HERMES.mdand the docs site.
Fixed
- Stopped Lucius from logging GitHub issue-author trust details to stdout or Slack, resolving the CodeQL clear-text logging alerts on
bin/lucius.py. - Fixed GitHub Pages manual dispatch so the site can be republished without a code change.
Changed
- Public repository metadata now uses the sharper
alfred-ospositioning, squash-only PR merges, auto-update branches, and Dependabot security updates.
v0.2.0
Pivot from "extracted framework substrate" to "complete engineering agent fleet". The default install now ships 12 working agents the operator configures via an interactive alfred-init wizard.
Added
2026-05-09 public fleet release
- Role field on every agent.
agents.confgets a 6th tab-separated column carrying a one-line operational descriptor;render.shemitsALFRED_<CODENAME>_ROLEenv vars;agent_role()/codename_with_role()surface the role in CLI + Slack post prefixes. - Runner-level fleet gate file. New
$HERMES_HOME/state/fleet/enabled.txtplusis_agent_enabled/enable_agent/disable_agenthelpers. Listed codenames are enabled; missing codenames fall back to each runner's default so opt-in agents can be gated without making normal launchd agents look disabled. Newbin/alfredCLI shipsalfred enable / disable / agents / enabled-agents. - Slack threading + Block Kit + severity colour stripes. New
lib/slack_format.pywith bot-token-awarefiring_thread_root/firing_thread_reply/firing_thread_close. Attachment duplicate-render guard baked in from day one. HonoursBATMAN_APPROVAL_CHANNELfor routing. - Bundle-label model + Batman skeleton. New
lib/batman.pywithBundledataclass, all-or-nothingclaim_bundle, best-effortrelease_bundle, loose-markdownparse_plan_from_issue/parse_plan_from_bundle. Scope-widening guard included. Newbin/batman.pyskeleton runner posts plan summaries; full execution chain deferred. - Runner-side dedup.
find_open_authored_pr_for_issue(with substring-false-positive guard) +reuse_or_make_worktreeso partial work survives across firings of the same issue. - STANDARD_LABELS bootstrap.
batman-pr-openandagent:large-featureship by default;gh_pr_createauto-creates ad-hoc labels and surfaces gh stderr on failure. - Fleet doctor. New
bin/fleet-doctor.pyships four read-only health checks (paused repos, global block, stale worktrees, fleet enable list) → single severity-stripe Slack thread. - Runner safety hardening. Batman and fleet-doctor now acquire the shared lock helper correctly; cleanup scopes
/tmpsweeping to agent-owned prefixes instead of broad wildcard matches. - Release-readiness hardening. Lucius wraps GitHub issue content as untrusted input, checks issue author association before autonomous code execution, grants Codex the source
.gitdirectory for worktree commits, and opens salvaged WIP PRs as real GitHub drafts. Drake's daily cap guard now scales its GitHub search limit above the configured cap. Lock-owner checks now validate the recorded agent name when the caller knows it.
Engineering agents (bin/)
- lucius (feature dev): picks the oldest open
agent:implementissue, claims it via the state machine, opens a worktree, runsclaude -pwith the issue body, pushes a PR labelledagent:authored. - drake (planner): files new
agent:implementissues from specs / roadmap / code-reality grep. Caps per-firing + rolling-24h. - bane (test coverage): picks the lowest-coverage actively-changed file, writes tests, opens a PR.
- rasalghul (PR review): multi-axis review on every fresh PR. Posts as comment.
- nightwing (review-fix): lands fixes for P0 / P1 reviewer comments on
agent:authoredPRs. - robin (bug triage): classifies severity, asks for repro info, hands off to lucius. Local touched-issues ledger prevents re-triage.
- huntress (post-deploy smoke): runs Playwright tests against
ALFRED_HUNTRESS_TARGET_URL. Optional ECS staging-readiness pre-check + S3 screenshot upload. - gordon (deploy health): daily ECS task-def vs
mainHEAD diff + top-N Sentry issues. Quiet on healthy days. - automerge: squash-merges clean
agent:authoredPRs (CI green, no unresolved P0 reviewer comments, latest review ends "Ship-ready: yes"). - agent-cleanup: daily housekeeping (clean stale worktrees, stuck locks, stale
agent:in-flightclaims viaforce_release_stale_claim). Dirty or unknown worktrees are skipped and reported. - code-map-refresh: cross-repo contract scan. Writes
${HERMES_HOME}/state/code-map.jsonfor other agents. - agent-morning-brief: daily Slack post — yesterday's PRs, in-flight work, doctor status.
- fleet-recap.sh: 07:30 + 22:00 Slack digest (per-agent firings / cost / success rate).
Every codename is operator-customisable at install time. Default Batman names; runtime codename via AGENT_CODENAME env (set by the launchd plist). Repo lists, AWS profiles, ECS clusters, Sentry orgs all env-driven.
Engineering-agent prompts (prompts/)
9 role-based prompt templates compatible with agent_runner.load_prompt() and ${VAR} substitution: feature-dev.md, planner.md, test-coverage.md, code-review.md, review-fix.md, bug-triage.md, ecs-monitor.md, post-deploy-smoke.md, cross-repo-coordinator.md. Cross-codename refs use ${FEATURE_DEV_CODENAME} / ${CODE_REVIEW_CODENAME} etc. so renaming any agent can stay consistent end-to-end.
Substrate (lib/agent_runner.py)
- Issue claim state machine:
claim_issue/release_issue/find_stale_claims/force_release_stale_claim/is_repo_paused/set_repo_paused/list_paused_repos/issue_dedup_check. Lifecycle labelsagent:in-flight/agent:pr-open/agent:doneplus operator-overridedo-not-pickup. Full doc atdocs/STATE_MACHINE.md(with Mermaid stateDiagram). - Slack severity routing:
slack_post(text, severity="info" | "warn" | "alert").infois back-compat default;warnprefixes⚠️ ;alertprefixes 🚨 + appends<!here>. claude_invoke_streaming()+transcript_path(): streaming-API-compatible signatures (currently delegate to plainclaude_invoke; the per-firing JSONL transcript writer ships in a future release).TRANSCRIPTS_ROOT+PROMPTS_ROOTmodule constants.
Operator surface
alfred-init(bin/alfred-init.py): interactive 13-step wizard. Walks Slack-app creation with real test-post; AWS / env-var storage choice; multi-select agent enable; per-role codename prompt with Batman defaults; per-agent repo selection fromgh repo list; per-agent special prompts (Huntress staging URL, Gordon ECS cluster); generatesagents.conf+~/.alfredrcwith banner-marked block; runsdeploy.sh+bin/doctor.sh; smoke-test post. 27 tests covering helpers + doctor sentinel + non-interactive mode.examples/bin/label_state.py(operator CLI example):claim/release/dedup-check/status-issue/repo {pause,resume,list}/sweep-claims.examples/git-hooks/pre-push: refuses pushes that race in-flight agents.install.sh: idempotent fresh-machine bootstrap (brew + npm + dirs + shell rc).
Documentation
INSTALL.md(TL;DR + step-by-step) +BOOTSTRAP.md(deeper operations guide).docs/AGENTS.md: codename topology with Batman defaults, customisation story, fleet-map Mermaid diagram, codename-wiring Mermaid diagram, anti-patterns, "adding a new codename" walkthrough.docs/STATE_MACHINE.md: lifecycle Mermaid stateDiagram + race-resolution + stale-sweep + operator overrides.ARCHITECTURE.md: per-firing flow Mermaid sequenceDiagram + design rationale.docs/SLACK_SETUP.md,docs/AWS_SETUP.md,docs/CLAUDE_CODE.md,docs/SKILLS.md,docs/LINUX.md,docs/TUTORIAL.md.- Astro Starlight site at
site/: 16 pages (getting-started / concepts / guides / reference / about), with GitHub Pages publishing gated byALFRED_OS_PUBLISH_PAGES. URL env-overridable.
Project hygiene
- CI:
pytest(3.11 / 3.12 / 3.13) +ruff check+ruff format --check+mypy lib/+shellcheck+python-syntax+scrub-check(refuses known-private patterns). bin/scrub-check.sh: reusable local + CI scrub scan for host-private paths, fleet identifiers, Slack tokens/webhooks, and AWS access key IDs.docs/RELEASE_CHECKLIST.md: public release checklist with pre-tag gates, scrub requirements, and GitHub Release flow.- Release automation: tag → GitHub release with auto-extracted changelog notes + brew-formula sha256 echoed to logs.
Formula/alfred-os.rb: HEAD-only Homebrew formula until the first public release tarball has a checksum.CODE_OF_CONDUCT.md,SECURITY.md,SUPPORT.md, issue templates, PR template,dependabot.yml,pyproject.toml(ruff + mypy),.pre-commit-config.yaml.
Changed
- Repository renamed
luminik-io/pennyworth→luminik-io/alfred-os. GitHub redirects in place. All env varsPENNYWORTH_*→ALFRED_*/ALFRED_OS_*. Operator config file~/.pennyworthrc→~/.alfredrc. Operator commandspennyworth-*→alfred-*. STANDARD_LABELSincludes the lifecycle labels; consumers no longer need to extend it for the state machine to work.- Per-repo configuration loaded from
~/.alfredrc.d/<codename>.tomlvia stdlibtomllib(was PyYAML; PyYAML is not stdlib and shouldn't be required for a fresh install). - Doctor mode runs before env-config IDLE checks across all 12 agents —
bash bin/doctor.shnow reports all-passing on a fresh install before the operator runsalfred-init. bin/doctor.shnow falls back to the in-repobin/andlib/paths before deploy, so a clean checkout can self-check without a pre-existing$HERMES_HOME.- All docs voice-swept: removed audience-marketing intros, outcome-fantasy framing, hire/replace framing, LLM filler vocab, marketing emoji, sign-offs, vanity stats, em-dashes. ~210 lines of marketing prose deleted across 39 files; technical content preserved.
Removed
MORNING.mdoperator-brief file (now lives in PR descriptions / chat, not the tree).uv.lockfrom version control (auto-generated; consumers run their ownuv syncagainstpyproject.toml).sso-check-10/sso-check-22from the defaultagents.conf. Operator-convenience reminders, not engineering. Mentioned indocs/AWS_SETUP.mdfor operators who use AWS ...