Skip to content

Releases: luminik-io/alfred

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 10 Jul 13:46
v0.6.0
8acebbe
  • 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, or test-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 batteries command, 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

Choose a tag to compare

@github-actions github-actions released this 24 Jun 15:18
v0.5.3
0764559
  • 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

Choose a tag to compare

@github-actions github-actions released this 17 Jun 16:10
v0.5.1
39207f3
  • 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 serve now 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

Choose a tag to compare

@github-actions github-actions released this 17 Jun 14:19
5b2ca17
  • 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

Choose a tag to compare

@github-actions github-actions released this 24 May 19:08
v0.4.0
76598dc

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.py decomposed from a single monolith into a 10-file lib/agent_runner/ package: preflight, lock, spend, engines, gh, slack, event-log, commit-trailer, transcripts, dedup. Public import surface preserved. 50 new unit tests under tests/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_DIR only.
  • alfred logs (bin/alfred-logs.py): tail and filter per-firing stream-JSON transcripts. --last N, --firing-id ID, --show-tool-calls, --json. See docs/CLI.md.
  • lib/transcripts.py and lib/metrics.py: TranscriptReader and MetricsAggregator protocols + filesystem-backed implementations, used by the two new CLIs and exposed for downstream code.

State machine and multi-repo

  • lib/labels.py: LabelClient protocol + GhCliLabelClient implementation. Atomic transitions across the issue-claim state machine (agent:queued to agent:implement to agent:in-flight to agent:pr-open to agent: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 in docs/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, files agent: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.py from 505 to 1383 lines; bin/batman.py from 261 to 472 lines). Once a Damian-style plan is approved (Slack reaction, label transition, or BATMAN_AUTO_EXECUTE=1), Batman drives the fan-out implementation across the listed repos. Previously Batman halted at plan-only. The BATMAN_AUTO_EXECUTE env contract: 0 = always ask, approval-gate = read approval signals, 1 = always execute. See docs/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. ApprovalGate is a typing.Protocol so 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; see examples/slop-rules.json and docs/SLOP_DETECTOR.md.

Memory

  • lib/fleet_brain/: v1 SQLite-backed memory store. Per-codename and per-repo recall / 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) in docs/FLEET_BRAIN.md. CLIs: bin/alfred-brain.py, bin/fleet-ingest.py.
  • lib/memory/: MemoryProvider Protocol + FleetBrainProvider, ChainedMemoryProvider, and NullMemoryProvider implementations. Optional read-only gbrain subprocess shim for operators with a personal knowledge base. Chain order is env-driven: ALFRED_MEMORY_PROVIDERS=fleet,gbrain; default is fleet-brain only; null disables memory. See docs/MEMORY_PROVIDERS.md.

Connectors

  • lib/connectors/: Connector Protocol + reference Linear and Sentry implementations. Pull-mode adapters from non-GitHub sources into the engineering fleet's agent:implement queue. 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. See docs/CONNECTORS.md, bin/connector-sync.py, examples/connectors.yaml.

Dashboards and proof

  • alfred serve v1 (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 as typing.Protocol. New [serve] optional dependency group for fastapi, uvicorn, jinja2. See docs/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 a weekly.json operators can publish on their own site. See docs/SHIPPED_EMITTER.md.

Infrastructure for unattended operation

  • lib/claude_proxy/ and bin/claude-proxy.py: localhost unix-socket daemon that brokers claude -p invocations on behalf of launchd-spawned agent processes. Solves the macOS Keychain ACL issue that returns 401 on every claude call from a non-Aqua launchd session. NDJSON wire protocol with invoke, health, and probe requests; stdlib-only; opt-in via ALFRED_CLAUDE_PROXY_SOCKET with transparent fallback to direct subprocess. See docs/CLAUDE_PROXY.md and docs/MACOS_KEYCHAIN.md.
  • examples/launchd/luminik.claude-proxy.plist.example: sample launchd unit with LimitLoadToSessionType=Aqua and 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_streaming routes 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_PATHS env var: sweep operator-managed worktree pools outside $ALFRED_HOME/worktrees.
  • Status-cache TTL stops stale reads when alfred status is invoked in quick succession.
  • ALFRED_PREFLIGHT_SLACK_MIN_MINUTES throttles repeated preflight Slack alerts.
  • fleet-doctor distinct 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) and site/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.27 and boto3>=1.34 moved from optional [slack] and [aws] extras into the base dependencies list. Slack and AWS are integral enough that the optional-extras split was adding install friction for new operators with no payoff.
  • pyproject.toml adds the new [serve] optional-dependency group (FastAPI + uvicorn + Jinja2).
  • .gitignore adds .claude/ and screenshots/ so per-agent worktrees, launch configs, and local verification screenshots stay out of the public repo.
  • .gitallowed added so git secrets pre-commit hooks understand that bin/scrub-check.sh and CI workflows reference secret-pattern regexes by design.

Fixed

  • lib/labels.py: added PLAN_PENDING_APPROVAL constant (agent:plan-pending-approval) plus a backward-compat LABEL_AGENT_PLAN_PENDING_APPROVAL alias for code that imports the long-form name. Required by lib/slack_approval.py and lib/batman.py.
  • tests/unit/__init__.py and tests/unit/agent_runner/__init__.py: promote the agent-runner unit test directory to a package so pytest can disambiguate tests/test_transcripts.py from tests/unit/agent_runner/test_transcripts.py.
  • docs/BATMAN.md: replaced operator-specific channel literal with #your-fleet-channel placeholder per the private-to-public boundary policy.

Verification

  • 689 tests pass on Python 3.11.
  • bash bin/scrub-check.sh returns scrub-check: clean.
  • cd site && npm run build builds 45 pages with 0 errors and 0 content warnings.

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 21 May 13:31
v0.3.0
6c2ab8a

Added

  • --dry-run / ALFRED_DRY_RUN mode: 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 through lib/agent_runner.py behind a single is_dry_run() seam; supported by examples/bin/hello.py, examples/bin/echo_summarise.py, and bin/lucius.py. See docs/DRY_RUN.md.
  • Linux support via systemd --user timers. install.sh now has a Debian/Ubuntu apt lane alongside the macOS Homebrew lane, deploy.sh renders and installs systemd units on Linux hosts, and a new systemd/ directory holds _template.service, _template.timer, and render.sh (same agents.conf schema as the launchd renderer).
  • alfred pause / alfred resume / alfred run operator verbs, backed by a host-scheduler abstraction (lib/scheduler.py) that drives launchd on macOS and systemd --user on Linux.
  • alfred agents now shows a real scheduler-load column (launchd or systemd), distinct from the configured on/off column.
  • bin/doctor.sh --dev flag: dev-install mode treats host-config preflight gaps as non-fatal while still failing hard on code defects. install.sh passes --dev on Linux.
  • Publishing guide for GitHub Pages workflow mode, release-site verification, and optional custom-domain setup.
  • alfred claude probe for a first-class Claude Code auth smoke test.
  • alfred codex status/probe and alfred auth status/probe for first-class
    Codex CLI and combined provider-auth diagnostics.
  • alfred-init.py --repos, --slack-webhook, and --skip-label-setup for AI-driven setup against one repo without guessing through the interactive wizard.
  • Batman is now visible in the alfred-init catalog as an opt-in, plan-only cross-repo coordinator.
  • docs/CODEX_PROVIDER.md for Codex engine modes, runtime contract, and billing posture.

Changed

  • alfred-init.py now 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.py seeds prompt templates into ~/.alfred/prompts/<codename>.md, creates standard GitHub labels on selected repos, and refuses multi-repo non-interactive setup unless --repos is explicit.
  • Robin is correctly described and wired as bug triage in the installer catalog.
  • alfred-status and bin/doctor.sh now read the systemd --user timer roster on Linux, falling back to the same agent-discovery logic the launchd path uses.
  • docs/LINUX.md rewritten: 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 / ~/.alfred across 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 status now returns nonzero when the Codex CLI status path fails, so scheduled-agent preflight catches missing Codex installs.

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 12 May 16:39

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.md and 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-os positioning, squash-only PR merges, auto-update branches, and Dependabot security updates.

v0.2.0

Choose a tag to compare

@prasadus92 prasadus92 released this 12 May 15:50

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.conf gets a 6th tab-separated column carrying a one-line operational descriptor; render.sh emits ALFRED_<CODENAME>_ROLE env 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.txt plus is_agent_enabled / enable_agent / disable_agent helpers. 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. New bin/alfred CLI ships alfred enable / disable / agents / enabled-agents.
  • Slack threading + Block Kit + severity colour stripes. New lib/slack_format.py with bot-token-aware firing_thread_root / firing_thread_reply / firing_thread_close. Attachment duplicate-render guard baked in from day one. Honours BATMAN_APPROVAL_CHANNEL for routing.
  • Bundle-label model + Batman skeleton. New lib/batman.py with Bundle dataclass, all-or-nothing claim_bundle, best-effort release_bundle, loose-markdown parse_plan_from_issue / parse_plan_from_bundle. Scope-widening guard included. New bin/batman.py skeleton 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_worktree so partial work survives across firings of the same issue.
  • STANDARD_LABELS bootstrap. batman-pr-open and agent:large-feature ship by default; gh_pr_create auto-creates ad-hoc labels and surfaces gh stderr on failure.
  • Fleet doctor. New bin/fleet-doctor.py ships 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 /tmp sweeping 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 .git directory 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:implement issue, claims it via the state machine, opens a worktree, runs claude -p with the issue body, pushes a PR labelled agent:authored.
  • drake (planner): files new agent:implement issues 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:authored PRs.
  • 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 main HEAD diff + top-N Sentry issues. Quiet on healthy days.
  • automerge: squash-merges clean agent:authored PRs (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-flight claims via force_release_stale_claim). Dirty or unknown worktrees are skipped and reported.
  • code-map-refresh: cross-repo contract scan. Writes ${HERMES_HOME}/state/code-map.json for 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 labels agent:in-flight / agent:pr-open / agent:done plus operator-override do-not-pickup. Full doc at docs/STATE_MACHINE.md (with Mermaid stateDiagram).
  • Slack severity routing: slack_post(text, severity="info" | "warn" | "alert"). info is back-compat default; warn prefixes ⚠️; alert prefixes 🚨 + appends <!here>.
  • claude_invoke_streaming() + transcript_path(): streaming-API-compatible signatures (currently delegate to plain claude_invoke; the per-firing JSONL transcript writer ships in a future release).
  • TRANSCRIPTS_ROOT + PROMPTS_ROOT module 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 from gh repo list; per-agent special prompts (Huntress staging URL, Gordon ECS cluster); generates agents.conf + ~/.alfredrc with banner-marked block; runs deploy.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 by ALFRED_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/pennyworthluminik-io/alfred-os. GitHub redirects in place. All env vars PENNYWORTH_*ALFRED_* / ALFRED_OS_*. Operator config file ~/.pennyworthrc~/.alfredrc. Operator commands pennyworth-*alfred-*.
  • STANDARD_LABELS includes the lifecycle labels; consumers no longer need to extend it for the state machine to work.
  • Per-repo configuration loaded from ~/.alfredrc.d/<codename>.toml via stdlib tomllib (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.sh now reports all-passing on a fresh install before the operator runs alfred-init.
  • bin/doctor.sh now falls back to the in-repo bin/ and lib/ 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.md operator-brief file (now lives in PR descriptions / chat, not the tree).
  • uv.lock from version control (auto-generated; consumers run their own uv sync against pyproject.toml).
  • sso-check-10 / sso-check-22 from the default agents.conf. Operator-convenience reminders, not engineering. Mentioned in docs/AWS_SETUP.md for operators who use AWS ...
Read more